Deletes some dead code in the TILE-Gx/TILEPro ports of gas.
[deliverable/binutils-gdb.git] / gas / config / tc-tilepro.c
CommitLineData
aa137e4d
NC
1/* tc-tilepro.c -- Assemble for a TILEPro chip.
2 Copyright 2011 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21#include "as.h"
22#include "struc-symbol.h"
23#include "subsegs.h"
24
25#include "elf/tilepro.h"
26#include "opcode/tilepro.h"
27
28#include "dwarf2dbg.h"
29#include "dw2gencfi.h"
30
31#include "safe-ctype.h"
32
33
34/* Special registers. */
35#define TREG_IDN0 57
36#define TREG_IDN1 58
37#define TREG_UDN0 59
38#define TREG_UDN1 60
39#define TREG_UDN2 61
40#define TREG_UDN3 62
41#define TREG_ZERO 63
42
43
44/* Generic assembler global variables which must be defined by all
45 targets. */
46
47/* Characters which always start a comment. */
48const char comment_chars[] = "#";
49
50/* Characters which start a comment at the beginning of a line. */
51const char line_comment_chars[] = "#";
52
53/* Characters which may be used to separate multiple commands on a
54 single line. */
55const char line_separator_chars[] = ";";
56
57/* Characters which are used to indicate an exponent in a floating
58 point number. */
59const char EXP_CHARS[] = "eE";
60
61/* Characters which mean that a number is a floating point constant,
62 as in 0d1.0. */
63const char FLT_CHARS[] = "rRsSfFdDxXpP";
64
65const char *md_shortopts = "VQ:";
66
67struct option md_longopts[] =
68{
69 {NULL, no_argument, NULL, 0}
70};
71
72size_t md_longopts_size = sizeof (md_longopts);
73
74int
75md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
76{
77 switch (c)
78 {
79 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
80 should be emitted or not. FIXME: Not implemented. */
81 case 'Q':
82 break;
83
84 /* -V: SVR4 argument to print version ID. */
85 case 'V':
86 print_version_id ();
87 break;
88
89 default:
90 return 0;
91 }
92
93 return 1;
94}
95
96void
97md_show_usage (FILE *stream)
98{
99 fprintf (stream, _("\
100 -Q ignored\n\
101 -V print assembler version number\n"));
102}
103
104/* Extra expression types. */
105
106#define O_lo16 O_md1
107#define O_hi16 O_md2
108#define O_ha16 O_md3
109#define O_got O_md4
110#define O_got_lo16 O_md5
111#define O_got_hi16 O_md6
112#define O_got_ha16 O_md7
113#define O_plt O_md8
114#define O_tls_gd O_md9
115#define O_tls_gd_lo16 O_md10
116#define O_tls_gd_hi16 O_md11
117#define O_tls_gd_ha16 O_md12
118#define O_tls_ie O_md13
119#define O_tls_ie_lo16 O_md14
120#define O_tls_ie_hi16 O_md15
121#define O_tls_ie_ha16 O_md16
122
123static struct hash_control *special_operator_hash;
124
125/* Hash tables for instruction mnemonic lookup. */
126static struct hash_control *op_hash;
127
128/* Hash table for spr lookup. */
129static struct hash_control *spr_hash;
130
131/* True temporarily while parsing an SPR expression. This changes the
132 * namespace to include SPR names. */
133static int parsing_spr;
134
135/* Are we currently inside `{ ... }'? */
136static int inside_bundle;
137
138struct tilepro_instruction
139{
140 const struct tilepro_opcode *opcode;
141 tilepro_pipeline pipe;
142 expressionS operand_values[TILEPRO_MAX_OPERANDS];
143};
144
145/* This keeps track of the current bundle being built up. */
146static struct tilepro_instruction
147current_bundle[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE];
148
149/* Index in current_bundle for the next instruction to parse. */
150static int current_bundle_index;
151
152/* Allow 'r63' in addition to 'zero', etc. Normally we disallow this as
153 'zero' is not a real register, so using it accidentally would be a
154 nasty bug. For other registers, such as 'sp', code using multiple names
155 for the same physical register is excessively confusing.
156
157 The '.require_canonical_reg_names' pseudo-op turns this error on,
158 and the '.no_require_canonical_reg_names' pseudo-op turns this off.
159 By default the error is on. */
160static int require_canonical_reg_names;
161
162/* Allow bundles that do undefined or suspicious things like write
163 two different values to the same register at the same time.
164
165 The '.no_allow_suspicious_bundles' pseudo-op turns this error on,
166 and the '.allow_suspicious_bundles' pseudo-op turns this off. */
167static int allow_suspicious_bundles;
168
169
170/* A hash table of main processor registers, mapping each register name
171 to its index.
172
173 Furthermore, if the register number is greater than the number
174 of registers for that processor, the user used an illegal alias
175 for that register (e.g. r63 instead of zero), so we should generate
176 a warning. The attempted register number can be found by clearing
177 NONCANONICAL_REG_NAME_FLAG. */
178static struct hash_control *main_reg_hash;
179
180
181/* We cannot unambiguously store a 0 in a hash table and look it up,
182 so we OR in this flag to every canonical register. */
183#define CANONICAL_REG_NAME_FLAG 0x1000
184
185/* By default we disallow register aliases like r63, but we record
186 them in the hash table in case the .no_require_canonical_reg_names
187 directive is used. Noncanonical names have this value added to them. */
188#define NONCANONICAL_REG_NAME_FLAG 0x2000
189
190/* Discards flags for register hash table entries and returns the
191 reg number. */
192#define EXTRACT_REGNO(p) ((p) & 63)
193
194/* This function is called once, at assembler startup time. It should
195 set up all the tables, etc., that the MD part of the assembler will
196 need. */
197void
198md_begin (void)
199{
200 const struct tilepro_opcode *op;
201 int i;
202
203 /* Guarantee text section is aligned. */
204 bfd_set_section_alignment (stdoutput, text_section,
205 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
206
207 require_canonical_reg_names = 1;
208 allow_suspicious_bundles = 0;
209 current_bundle_index = 0;
210 inside_bundle = 0;
211
212 /* Initialize special operator hash table. */
213 special_operator_hash = hash_new ();
214#define INSERT_SPECIAL_OP(name) \
215 hash_insert (special_operator_hash, #name, (void *)O_##name)
216
217 INSERT_SPECIAL_OP(lo16);
218 INSERT_SPECIAL_OP(hi16);
219 INSERT_SPECIAL_OP(ha16);
220 INSERT_SPECIAL_OP(got);
221 INSERT_SPECIAL_OP(got_lo16);
222 INSERT_SPECIAL_OP(got_hi16);
223 INSERT_SPECIAL_OP(got_ha16);
224 INSERT_SPECIAL_OP(plt);
225 INSERT_SPECIAL_OP(tls_gd);
226 INSERT_SPECIAL_OP(tls_gd_lo16);
227 INSERT_SPECIAL_OP(tls_gd_hi16);
228 INSERT_SPECIAL_OP(tls_gd_ha16);
229 INSERT_SPECIAL_OP(tls_ie);
230 INSERT_SPECIAL_OP(tls_ie_lo16);
231 INSERT_SPECIAL_OP(tls_ie_hi16);
232 INSERT_SPECIAL_OP(tls_ie_ha16);
233#undef INSERT_SPECIAL_OP
234
235 /* Initialize op_hash hash table. */
236 op_hash = hash_new ();
237 for (op = &tilepro_opcodes[0]; op->name != NULL; op++)
238 {
239 const char *hash_err = hash_insert (op_hash, op->name, (void *)op);
240 if (hash_err != NULL)
241 {
242 as_fatal (_("Internal Error: Can't hash %s: %s"),
243 op->name, hash_err);
244 }
245 }
246
247 /* Initialize the spr hash table. */
248 parsing_spr = 0;
249 spr_hash = hash_new ();
250 for (i = 0; i < tilepro_num_sprs; i++)
251 hash_insert (spr_hash, tilepro_sprs[i].name,
252 (void *) &tilepro_sprs[i]);
253
254 /* Set up the main_reg_hash table. We use this instead of
255 * creating a symbol in the register section to avoid ambiguities
256 * with labels that have the same names as registers. */
257 main_reg_hash = hash_new ();
258 for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
259 {
260 char buf[64];
261
262 hash_insert (main_reg_hash, tilepro_register_names[i],
263 (void *) (long)(i | CANONICAL_REG_NAME_FLAG));
264
265 /* See if we should insert a noncanonical alias, like r63. */
266 sprintf (buf, "r%d", i);
267 if (strcmp (buf, tilepro_register_names[i]) != 0)
268 hash_insert (main_reg_hash, xstrdup (buf),
269 (void *) (long)(i | NONCANONICAL_REG_NAME_FLAG));
270 }
271
272 /* Insert obsolete backwards-compatibility register names. */
273 hash_insert (main_reg_hash, "io0",
274 (void *) (long) (TREG_IDN0 | CANONICAL_REG_NAME_FLAG));
275 hash_insert (main_reg_hash, "io1",
276 (void *) (long) (TREG_IDN1 | CANONICAL_REG_NAME_FLAG));
277 hash_insert (main_reg_hash, "us0",
278 (void *) (long) (TREG_UDN0 | CANONICAL_REG_NAME_FLAG));
279 hash_insert (main_reg_hash, "us1",
280 (void *) (long) (TREG_UDN1 | CANONICAL_REG_NAME_FLAG));
281 hash_insert (main_reg_hash, "us2",
282 (void *) (long) (TREG_UDN2 | CANONICAL_REG_NAME_FLAG));
283 hash_insert (main_reg_hash, "us3",
284 (void *) (long) (TREG_UDN3 | CANONICAL_REG_NAME_FLAG));
285
286}
287
288
289#define BUNDLE_TEMPLATE_MASK(p0, p1, p2) \
290 ((p0) | ((p1) << 8) | ((p2) << 16))
291#define BUNDLE_TEMPLATE(p0, p1, p2) \
292 { { (p0), (p1), (p2) }, \
293 BUNDLE_TEMPLATE_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \
294 }
295
296#define NO_PIPELINE TILEPRO_NUM_PIPELINE_ENCODINGS
297
298struct bundle_template
299{
300 tilepro_pipeline pipe[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE];
301 unsigned int pipe_mask;
302};
303
304static const struct bundle_template bundle_templates[] =
305{
306 /* In Y format we must always have something in Y2, since it has
307 * no fnop, so this conveys that Y2 must always be used. */
308 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2, NO_PIPELINE),
309 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2, NO_PIPELINE),
310 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0, NO_PIPELINE),
311 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1, NO_PIPELINE),
312
313 /* Y format has three instructions. */
314 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2),
315 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1),
316 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2),
317 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0),
318 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y1),
319 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y0),
320
321 /* X format has only two instructions. */
322 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_X0, TILEPRO_PIPELINE_X1, NO_PIPELINE),
323 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_X1, TILEPRO_PIPELINE_X0, NO_PIPELINE)
324};
325
326
327static void
328prepend_nop_to_bundle (tilepro_mnemonic mnemonic)
329{
330 memmove (&current_bundle[1], &current_bundle[0],
331 current_bundle_index * sizeof current_bundle[0]);
332 current_bundle[0].opcode = &tilepro_opcodes[mnemonic];
333 ++current_bundle_index;
334}
335
336
337static tilepro_bundle_bits
338insert_operand (tilepro_bundle_bits bits,
339 const struct tilepro_operand *operand,
340 int operand_value,
341 char *file,
342 unsigned lineno)
343{
344 /* Range-check the immediate. */
345 int num_bits = operand->num_bits;
346
347 operand_value >>= operand->rightshift;
348
349 if (bfd_check_overflow (operand->is_signed
350 ? complain_overflow_signed
351 : complain_overflow_unsigned,
352 num_bits,
353 0,
354 bfd_arch_bits_per_address (stdoutput),
355 operand_value)
356 != bfd_reloc_ok)
357 {
358 offsetT min, max;
359 if (operand->is_signed)
360 {
361 min = -(1 << (num_bits - 1));
362 max = (1 << (num_bits - 1)) - 1;
363 }
364 else
365 {
366 min = 0;
367 max = (1 << num_bits) - 1;
368 }
369 as_bad_value_out_of_range (_("operand"), operand_value, min, max,
370 file, lineno);
371 }
372
373 /* Write out the bits for the immediate. */
374 return bits | operand->insert (operand_value);
375}
376
377
378static int
379apply_special_operator (operatorT op, int num)
380{
381 switch (op)
382 {
383 case O_lo16:
aa137e4d
NC
384 return (signed short)num;
385
386 case O_hi16:
aa137e4d
NC
387 return (signed short)(num >> 16);
388
389 case O_ha16:
aa137e4d
NC
390 return (signed short)((num + 0x8000) >> 16);
391
392 default:
393 abort ();
394 }
395}
396
397
398static tilepro_bundle_bits
399emit_tilepro_instruction (tilepro_bundle_bits bits,
400 int num_operands,
401 const unsigned char *operands,
402 expressionS *operand_values,
403 char *bundle_start)
404{
405 int i;
406
407 for (i = 0; i < num_operands; i++)
408 {
409 const struct tilepro_operand *operand =
410 &tilepro_operands[operands[i]];
411 expressionS *operand_exp = &operand_values[i];
412 int is_pc_relative = operand->is_pc_relative;
413
414 if (operand_exp->X_op == O_register
415 || (operand_exp->X_op == O_constant && !is_pc_relative))
416 {
417 /* We know what the bits are right now, so insert them. */
418 bits = insert_operand (bits, operand, operand_exp->X_add_number,
419 NULL, 0);
420 }
421 else
422 {
423 bfd_reloc_code_real_type reloc = operand->default_reloc;
424 expressionS subexp;
425 int die = 0, use_subexp = 0, require_symbol = 0;
426 fixS *fixP;
427
428 /* Take an expression like hi16(x) and turn it into x with
429 a different reloc type. */
430 switch (operand_exp->X_op)
431 {
432#define HANDLE_OP16(suffix) \
433 switch (reloc) \
434 { \
435 case BFD_RELOC_TILEPRO_IMM16_X0: \
436 reloc = BFD_RELOC_TILEPRO_IMM16_X0_##suffix; \
437 break; \
438 case BFD_RELOC_TILEPRO_IMM16_X1: \
439 reloc = BFD_RELOC_TILEPRO_IMM16_X1_##suffix; \
440 break; \
441 default: \
442 die = 1; \
443 break; \
444 } \
445 use_subexp = 1
446
447 case O_lo16:
448 HANDLE_OP16 (LO);
449 break;
450
451 case O_hi16:
452 HANDLE_OP16 (HI);
453 break;
454
455 case O_ha16:
456 HANDLE_OP16 (HA);
457 break;
458
459 case O_got:
460 HANDLE_OP16 (GOT);
461 require_symbol = 1;
462 break;
463
464 case O_got_lo16:
465 HANDLE_OP16 (GOT_LO);
466 require_symbol = 1;
467 break;
468
469 case O_got_hi16:
470 HANDLE_OP16 (GOT_HI);
471 require_symbol = 1;
472 break;
473
474 case O_got_ha16:
475 HANDLE_OP16 (GOT_HA);
476 require_symbol = 1;
477 break;
478
479 case O_tls_gd:
480 HANDLE_OP16 (TLS_GD);
481 require_symbol = 1;
482 break;
483
484 case O_tls_gd_lo16:
485 HANDLE_OP16 (TLS_GD_LO);
486 require_symbol = 1;
487 break;
488
489 case O_tls_gd_hi16:
490 HANDLE_OP16 (TLS_GD_HI);
491 require_symbol = 1;
492 break;
493
494 case O_tls_gd_ha16:
495 HANDLE_OP16 (TLS_GD_HA);
496 require_symbol = 1;
497 break;
498
499 case O_tls_ie:
500 HANDLE_OP16 (TLS_IE);
501 require_symbol = 1;
502 break;
503
504 case O_tls_ie_lo16:
505 HANDLE_OP16 (TLS_IE_LO);
506 require_symbol = 1;
507 break;
508
509 case O_tls_ie_hi16:
510 HANDLE_OP16 (TLS_IE_HI);
511 require_symbol = 1;
512 break;
513
514 case O_tls_ie_ha16:
515 HANDLE_OP16 (TLS_IE_HA);
516 require_symbol = 1;
517 break;
518
519#undef HANDLE_OP16
520
521 case O_plt:
522 switch (reloc)
523 {
524 case BFD_RELOC_TILEPRO_JOFFLONG_X1:
525 reloc = BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT;
526 break;
527 default:
528 die = 1;
529 break;
530 }
531 use_subexp = 1;
532 require_symbol = 1;
533 break;
534
535 default:
536 /* Do nothing. */
537 break;
538 }
539
540 if (die)
541 {
542 as_bad (_("Invalid operator for operand."));
543 }
544 else if (use_subexp)
545 {
546 /* Now that we've changed the reloc, change ha16(x) into x,
547 etc. */
548
549 if (operand_exp->X_add_symbol->sy_value.X_md)
550 {
aa137e4d
NC
551 /* HACK: We used X_md to mark this symbol as a fake wrapper
552 around a real expression. To unwrap it, we just grab its
553 value here. */
554 operand_exp = &operand_exp->X_add_symbol->sy_value;
e8b9f508
WL
555
556 if (require_symbol)
557 {
558 /* Look at the expression, and reject it if it's not a
559 plain symbol. */
560 if (operand_exp->X_op != O_symbol
561 || operand_exp->X_add_number != 0)
562 as_bad (_("Operator may only be applied to symbols."));
563 }
aa137e4d
NC
564 }
565 else
566 {
567 /* The value of this expression is an actual symbol, so
568 turn that into an expression. */
569 memset (&subexp, 0, sizeof subexp);
570 subexp.X_op = O_symbol;
571 subexp.X_add_symbol = operand_exp->X_add_symbol;
572 operand_exp = &subexp;
573 }
574 }
575
576 /* Create a fixup to handle this later. */
577 fixP = fix_new_exp (frag_now,
578 bundle_start - frag_now->fr_literal,
579 (operand->num_bits + 7) >> 3,
580 operand_exp,
581 is_pc_relative,
582 reloc);
583 fixP->tc_fix_data = operand;
584
585 /* Don't do overflow checking if we are applying a function like
586 ha16. */
587 fixP->fx_no_overflow |= use_subexp;
588 }
589 }
590 return bits;
591}
592
593
594/* Detects and complains if two instructions in current_bundle write
595 to the same register, either implicitly or explicitly, or if a
596 read-only register is written. */
597static void
598check_illegal_reg_writes (void)
599{
600 BFD_HOST_U_64_BIT all_regs_written = 0;
601 int j;
602
603 for (j = 0; j < current_bundle_index; j++)
604 {
605 const struct tilepro_instruction *instr = &current_bundle[j];
606 int k;
607 BFD_HOST_U_64_BIT regs =
608 ((BFD_HOST_U_64_BIT)1) << instr->opcode->implicitly_written_register;
609 BFD_HOST_U_64_BIT conflict;
610
611 for (k = 0; k < instr->opcode->num_operands; k++)
612 {
613 const struct tilepro_operand *operand =
614 &tilepro_operands[instr->opcode->operands[instr->pipe][k]];
615
616 if (operand->is_dest_reg)
617 {
618 int regno = instr->operand_values[k].X_add_number;
619 BFD_HOST_U_64_BIT mask = ((BFD_HOST_U_64_BIT)1) << regno;
620
621 if ((mask & ( (((BFD_HOST_U_64_BIT)1) << TREG_IDN1)
622 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN1)
623 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN2)
624 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN3))) != 0
625 && !allow_suspicious_bundles)
626 {
627 as_bad (_("Writes to register '%s' are not allowed."),
628 tilepro_register_names[regno]);
629 }
630
631 regs |= mask;
632 }
633 }
634
635 /* Writing to the zero register doesn't count. */
636 regs &= ~(((BFD_HOST_U_64_BIT)1) << TREG_ZERO);
637
638 conflict = all_regs_written & regs;
639 if (conflict != 0 && !allow_suspicious_bundles)
640 {
641 /* Find which register caused the conflict. */
642 const char *conflicting_reg_name = "???";
643 int i;
644
645 for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
646 {
647 if (((conflict >> i) & 1) != 0)
648 {
649 conflicting_reg_name = tilepro_register_names[i];
650 break;
651 }
652 }
653
654 as_bad (_("Two instructions in the same bundle both write "
655 "to register %s, which is not allowed."),
656 conflicting_reg_name);
657 }
658
659 all_regs_written |= regs;
660 }
661}
662
663
664static void
665tilepro_flush_bundle (void)
666{
667 unsigned i;
668 int j, addr_mod;
669 unsigned compatible_pipes;
670 const struct bundle_template *match;
671 char *f;
672
673 inside_bundle = 0;
674
675 switch (current_bundle_index)
676 {
677 case 0:
678 /* No instructions. */
679 return;
680 case 1:
681 if (current_bundle[0].opcode->can_bundle)
682 {
683 /* Simplify later logic by adding an explicit fnop. */
684 prepend_nop_to_bundle (TILEPRO_OPC_FNOP);
685 }
686 else
687 {
688 /* This instruction cannot be bundled with anything else.
689 Prepend an explicit 'nop', rather than an 'fnop', because
690 fnops can be replaced by later binary-processing tools
691 while nops cannot. */
692 prepend_nop_to_bundle (TILEPRO_OPC_NOP);
693 }
694 break;
695 default:
696 if (!allow_suspicious_bundles)
697 {
698 /* Make sure all instructions can be bundled with other
699 instructions. */
700 const struct tilepro_opcode *cannot_bundle = NULL;
701 bfd_boolean seen_non_nop = FALSE;
702
703 for (j = 0; j < current_bundle_index; j++)
704 {
705 const struct tilepro_opcode *op = current_bundle[j].opcode;
706
707 if (!op->can_bundle && cannot_bundle == NULL)
708 cannot_bundle = op;
709 else if (op->mnemonic != TILEPRO_OPC_NOP
710 && op->mnemonic != TILEPRO_OPC_INFO
711 && op->mnemonic != TILEPRO_OPC_INFOL)
712 seen_non_nop = TRUE;
713 }
714
715 if (cannot_bundle != NULL && seen_non_nop)
716 {
717 current_bundle_index = 0;
718 as_bad (_("'%s' may not be bundled with other instructions."),
719 cannot_bundle->name);
720 return;
721 }
722 }
723 break;
724 }
725
726 compatible_pipes =
727 BUNDLE_TEMPLATE_MASK(current_bundle[0].opcode->pipes,
728 current_bundle[1].opcode->pipes,
729 (current_bundle_index == 3
730 ? current_bundle[2].opcode->pipes
731 : (1 << NO_PIPELINE)));
732
733 /* Find a template that works, if any. */
734 match = NULL;
735 for (i = 0; i < sizeof bundle_templates / sizeof bundle_templates[0]; i++)
736 {
737 const struct bundle_template *b = &bundle_templates[i];
738 if ((b->pipe_mask & compatible_pipes) == b->pipe_mask)
739 {
740 match = b;
741 break;
742 }
743 }
744
745 if (match == NULL)
746 {
747 current_bundle_index = 0;
748 as_bad (_("Invalid combination of instructions for bundle."));
749 return;
750 }
751
752 /* If the section seems to have no alignment set yet, go ahead and
753 make it large enough to hold code. */
754 if (bfd_get_section_alignment (stdoutput, now_seg) == 0)
755 bfd_set_section_alignment (stdoutput, now_seg,
756 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
757
758 for (j = 0; j < current_bundle_index; j++)
759 current_bundle[j].pipe = match->pipe[j];
760
761 if (current_bundle_index == 2 && !tilepro_is_x_pipeline(match->pipe[0]))
762 {
763 /* We are in Y mode with only two instructions, so add an FNOP. */
764 prepend_nop_to_bundle (TILEPRO_OPC_FNOP);
765
766 /* Figure out what pipe the fnop must be in via arithmetic.
767 * p0 + p1 + p2 must sum to the sum of TILEPRO_PIPELINE_Y[012]. */
768 current_bundle[0].pipe =
769 (tilepro_pipeline)((TILEPRO_PIPELINE_Y0
770 + TILEPRO_PIPELINE_Y1
771 + TILEPRO_PIPELINE_Y2) -
772 (current_bundle[1].pipe + current_bundle[2].pipe));
773 }
774
775 check_illegal_reg_writes ();
776
777 f = frag_more (TILEPRO_BUNDLE_SIZE_IN_BYTES);
778
779 /* Check to see if this bundle is at an offset that is a multiple of 8-bytes
780 from the start of the frag. */
781 addr_mod = frag_now_fix () & (TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES - 1);
782 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
783 as_bad (_("instruction address is not a multiple of 8"));
784 frag_now->insn_addr = addr_mod;
785 frag_now->has_code = 1;
786
787 tilepro_bundle_bits bits = 0;
788 for (j = 0; j < current_bundle_index; j++)
789 {
790 struct tilepro_instruction *instr = &current_bundle[j];
791 tilepro_pipeline pipeline = instr->pipe;
792 const struct tilepro_opcode *opcode = instr->opcode;
793
794 bits |= emit_tilepro_instruction (opcode->fixed_bit_values[pipeline],
795 opcode->num_operands,
796 &opcode->operands[pipeline][0],
797 instr->operand_values,
798 f);
799 }
800
801 number_to_chars_littleendian (f, (unsigned int)bits, 4);
802 number_to_chars_littleendian (f + 4, (unsigned int)(bits >> 32), 4);
803 current_bundle_index = 0;
804
805 /* Emit DWARF2 debugging information. */
806 dwarf2_emit_insn (TILEPRO_BUNDLE_SIZE_IN_BYTES);
807}
808
809
810/* Extend the expression parser to handle hi16(label), etc.
811 as well as SPR names when in the context of parsing an SPR. */
812int
813tilepro_parse_name (char *name, expressionS *e, char *nextcharP)
814{
815 operatorT op = O_illegal;
816
817 if (parsing_spr)
818 {
819 void *val = hash_find (spr_hash, name);
820 if (val == NULL)
821 return 0;
822
823 memset (e, 0, sizeof *e);
824 e->X_op = O_constant;
825 e->X_add_number = ((const struct tilepro_spr *)val)->number;
826 return 1;
827 }
828
829 if (*nextcharP != '(')
830 {
831 /* hi16, etc. not followed by a paren is just a label with that
832 name. */
833 return 0;
834 }
835 else
836 {
837 /* Look up the operator in our table. */
838 void *val = hash_find (special_operator_hash, name);
839 if (val == 0)
840 return 0;
841 op = (operatorT)(long)val;
842 }
843
844 /* Restore old '(' and skip it. */
845 *input_line_pointer = '(';
846 ++input_line_pointer;
847
848 expression (e);
849
850 if (*input_line_pointer != ')')
851 {
852 as_bad (_("Missing ')'"));
853 *nextcharP = *input_line_pointer;
854 return 0;
855 }
856 /* Skip ')'. */
857 ++input_line_pointer;
858
859 if (e->X_op == O_register || e->X_op == O_absent)
860 {
861 as_bad (_("Invalid expression."));
862 e->X_op = O_constant;
863 e->X_add_number = 0;
864 }
865 else
866 {
867 /* Wrap subexpression with a unary operator. */
868 symbolS *sym = make_expr_symbol (e);
869
870 if (sym != e->X_add_symbol)
871 {
872 /* HACK: mark this symbol as a temporary wrapper around a proper
873 expression, so we can unwrap it later once we have communicated
874 the relocation type. */
875 sym->sy_value.X_md = 1;
876 }
877
878 memset (e, 0, sizeof *e);
879 e->X_op = op;
880 e->X_add_symbol = sym;
881 e->X_add_number = 0;
882 }
883
884 *nextcharP = *input_line_pointer;
885 return 1;
886}
887
888
889/* Parses an expression which must be a register name. */
890
891static void
892parse_reg_expression (expressionS* expression)
893{
894 /* Zero everything to make sure we don't miss any flags. */
895 memset (expression, 0, sizeof *expression);
896
897 char* regname = input_line_pointer;
898 char terminating_char = get_symbol_end ();
899
900 void* pval = hash_find (main_reg_hash, regname);
901
902 if (pval == NULL)
903 as_bad (_("Expected register, got '%s'."), regname);
904
905 int regno_and_flags = (int)(size_t)pval;
906 int regno = EXTRACT_REGNO(regno_and_flags);
907
908 if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
909 && require_canonical_reg_names)
910 as_warn (_("Found use of non-canonical register name %s; "
911 "use %s instead."),
912 regname, tilepro_register_names[regno]);
913
914 /* Restore the old character following the register name. */
915 *input_line_pointer = terminating_char;
916
917 /* Fill in the expression fields to indicate it's a register. */
918 expression->X_op = O_register;
919 expression->X_add_number = regno;
920}
921
922
923/* Parses and type-checks comma-separated operands in input_line_pointer. */
924static void
925parse_operands (const char *opcode_name,
926 const unsigned char *operands,
927 int num_operands,
928 expressionS *operand_values)
929{
930 int i;
931
932 memset (operand_values, 0, num_operands * sizeof operand_values[0]);
933
934 SKIP_WHITESPACE ();
935 for (i = 0; i < num_operands; i++)
936 {
937 tilepro_operand_type type = tilepro_operands[operands[i]].type;
938
939 SKIP_WHITESPACE ();
940
941 if (type == TILEPRO_OP_TYPE_REGISTER)
942 {
943 parse_reg_expression (&operand_values[i]);
944 }
945 else if (*input_line_pointer == '}')
946 {
947 operand_values[i].X_op = O_absent;
948 }
949 else if (type == TILEPRO_OP_TYPE_SPR)
950 {
951 /* Modify the expression parser to add SPRs to the namespace. */
952 parsing_spr = 1;
953 expression (&operand_values[i]);
954 parsing_spr = 0;
955 }
956 else
957 {
958 expression (&operand_values[i]);
959 }
960
961 SKIP_WHITESPACE ();
962
963 if (i + 1 < num_operands)
964 {
965 int separator = (unsigned char)*input_line_pointer++;
966
967 if (is_end_of_line[separator] || (separator == '}'))
968 {
969 as_bad (_("Too few operands to '%s'."), opcode_name);
970 return;
971 }
972 else if (separator != ',')
973 {
974 as_bad (_("Unexpected character '%c' after operand %d to %s."),
975 (char)separator, i + 1, opcode_name);
976 return;
977 }
978 }
979
980 /* Arbitrarily use the first valid pipe to get the operand type,
981 since they are all the same. */
982 switch (tilepro_operands[operands[i]].type)
983 {
984 case TILEPRO_OP_TYPE_REGISTER:
985 /* Handled in parse_reg_expression already. */
986 break;
987 case TILEPRO_OP_TYPE_SPR:
988 /* Fall through */
989 case TILEPRO_OP_TYPE_IMMEDIATE:
990 /* Fall through */
991 case TILEPRO_OP_TYPE_ADDRESS:
992 if ( operand_values[i].X_op == O_register
993 || operand_values[i].X_op == O_illegal
994 || operand_values[i].X_op == O_absent)
995 as_bad (_("Expected immediate expression"));
996 break;
997 default:
998 abort ();
999 }
1000 }
1001
1002 if (!is_end_of_line[(unsigned char)*input_line_pointer])
1003 {
1004 switch (*input_line_pointer)
1005 {
1006 case '}':
1007 if (!inside_bundle)
1008 as_bad (_("Found '}' when not bundling."));
1009 ++input_line_pointer;
1010 inside_bundle = 0;
1011 demand_empty_rest_of_line ();
1012 break;
1013
1014 case ',':
1015 as_bad (_("Too many operands"));
1016 break;
1017
1018 default:
1019 /* Use default error for unrecognized garbage. */
1020 demand_empty_rest_of_line ();
1021 break;
1022 }
1023 }
1024}
1025
1026
1027/* This is the guts of the machine-dependent assembler. STR points to a
1028 machine dependent instruction. This function is supposed to emit
1029 the frags/bytes it assembles to. */
1030void
1031md_assemble (char *str)
1032{
1033 char old_char;
1034 size_t opname_len;
1035 char *old_input_line_pointer;
1036 const struct tilepro_opcode *op;
1037 int first_pipe;
1038
1039 /* Split off the opcode and look it up. */
1040 opname_len = strcspn (str, " {}");
1041 old_char = str[opname_len];
1042 str[opname_len] = '\0';
1043
1044 op = hash_find(op_hash, str);
1045 str[opname_len] = old_char;
1046 if (op == NULL)
1047 {
1048 as_bad (_("Unknown opcode `%.*s'."), (int)opname_len, str);
1049 return;
1050 }
1051
1052 /* Prepare to parse the operands. */
1053 old_input_line_pointer = input_line_pointer;
1054 input_line_pointer = str + opname_len;
1055 SKIP_WHITESPACE ();
1056
1057 if (current_bundle_index == TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE)
1058 {
1059 as_bad (_("Too many instructions for bundle."));
1060 tilepro_flush_bundle ();
1061 }
1062
1063 /* Make sure we have room for the upcoming bundle before we
1064 create any fixups. Otherwise if we have to switch to a new
1065 frag the fixup dot_value fields will be wrong. */
1066 frag_grow (TILEPRO_BUNDLE_SIZE_IN_BYTES);
1067
1068 /* Find a valid pipe for this opcode. */
1069 for (first_pipe = 0; (op->pipes & (1 << first_pipe)) == 0; first_pipe++)
1070 ;
1071
1072 /* Call the function that assembles this instruction. */
1073 current_bundle[current_bundle_index].opcode = op;
1074 parse_operands (op->name,
1075 &op->operands[first_pipe][0],
1076 op->num_operands,
1077 current_bundle[current_bundle_index].operand_values);
1078 ++current_bundle_index;
1079
1080 /* Restore the saved value of input_line_pointer. */
1081 input_line_pointer = old_input_line_pointer;
1082
1083 /* If we weren't inside curly braces, go ahead and emit
1084 this lone instruction as a bundle right now. */
1085 if (!inside_bundle)
1086 tilepro_flush_bundle ();
1087}
1088
1089static void
1090s_require_canonical_reg_names (int require)
1091{
1092 demand_empty_rest_of_line ();
1093 require_canonical_reg_names = require;
1094}
1095
1096static void
1097s_allow_suspicious_bundles (int allow)
1098{
1099 demand_empty_rest_of_line ();
1100 allow_suspicious_bundles = allow;
1101}
1102
1103const pseudo_typeS md_pseudo_table[] =
1104{
1105 {"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */
1106 {"word", cons, 4},
1107 {"require_canonical_reg_names", s_require_canonical_reg_names, 1 },
1108 {"no_require_canonical_reg_names", s_require_canonical_reg_names, 0 },
1109 {"allow_suspicious_bundles", s_allow_suspicious_bundles, 1 },
1110 {"no_allow_suspicious_bundles", s_allow_suspicious_bundles, 0 },
1111 { NULL, 0, 0 }
1112};
1113
1114/* Equal to MAX_PRECISION in atof-ieee.c */
1115#define MAX_LITTLENUMS 6
1116
1117/* Turn the string pointed to by litP into a floating point constant
1118 of type TYPE, and emit the appropriate bytes. The number of
1119 LITTLENUMS emitted is stored in *SIZEP. An error message is
1120 returned, or NULL on OK. */
1121
1122char *
1123md_atof (int type, char *litP, int *sizeP)
1124{
1125 int prec;
1126 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1127 LITTLENUM_TYPE *wordP;
1128 char *t;
1129
1130 switch (type)
1131 {
1132 case 'f':
1133 case 'F':
1134 prec = 2;
1135 break;
1136
1137 case 'd':
1138 case 'D':
1139 prec = 4;
1140 break;
1141
1142 default:
1143 *sizeP = 0;
1144 return _("Bad call to md_atof ()");
1145 }
1146 t = atof_ieee (input_line_pointer, type, words);
1147 if (t)
1148 input_line_pointer = t;
1149
1150 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1151 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
1152 the bigendian 386. */
1153 for (wordP = words + prec - 1; prec--;)
1154 {
1155 md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
1156 litP += sizeof (LITTLENUM_TYPE);
1157 }
1158 return 0;
1159}
1160
1161
1162/* We have no need to default values of symbols. */
1163
1164symbolS *
1165md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1166{
1167 return NULL;
1168}
1169
1170
1171void
1172tilepro_cons_fix_new (fragS *frag,
1173 int where,
1174 int nbytes,
1175 expressionS *exp)
1176{
1177 expressionS subexp;
1178 bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
1179 int no_overflow = 0;
1180 fixS *fixP;
1181
1182 /* See if it's one of our special functions. */
1183 switch (exp->X_op)
1184 {
1185 case O_lo16:
1186 reloc = BFD_RELOC_LO16;
1187 no_overflow = 1;
1188 break;
1189 case O_hi16:
1190 reloc = BFD_RELOC_HI16;
1191 no_overflow = 1;
1192 break;
1193 case O_ha16:
1194 reloc = BFD_RELOC_HI16_S;
1195 no_overflow = 1;
1196 break;
1197
1198 default:
1199 /* Do nothing. */
1200 break;
1201 }
1202
1203 if (reloc != BFD_RELOC_NONE)
1204 {
1205 if (nbytes != 2)
1206 {
1207 as_bad (_("This operator only produces two byte values."));
1208 nbytes = 2;
1209 }
1210
1211 memset (&subexp, 0, sizeof subexp);
1212 subexp.X_op = O_symbol;
1213 subexp.X_add_symbol = exp->X_add_symbol;
1214 exp = &subexp;
1215 }
1216 else
1217 {
1218 switch (nbytes)
1219 {
1220 case 1:
1221 reloc = BFD_RELOC_8;
1222 break;
1223 case 2:
1224 reloc = BFD_RELOC_16;
1225 break;
1226 case 4:
1227 reloc = BFD_RELOC_32;
1228 break;
1229 case 8:
1230 reloc = BFD_RELOC_64;
1231 break;
1232 default:
1233 as_bad (_("unsupported BFD relocation size %d"), nbytes);
1234 reloc = BFD_RELOC_32;
1235 break;
1236 }
1237 }
1238
1239 fixP = fix_new_exp (frag, where, nbytes, exp, 0, reloc);
1240 fixP->tc_fix_data = NULL;
1241 fixP->fx_no_overflow |= no_overflow;
1242}
1243
1244
1245void
1246md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
1247{
1248 const struct tilepro_operand *operand;
1249 valueT value = *valP;
1250 char *p;
1251
1252 /* Leave these for the linker. */
1253 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1254 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1255 return;
1256
1257 if (fixP->fx_subsy != (symbolS *) NULL)
1258 {
1259 /* We can't actually support subtracting a symbol. */
1260 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1261 }
1262
1263 /* Correct relocation types for pc-relativeness. */
1264 switch (fixP->fx_r_type)
1265 {
1266#define FIX_PCREL(rtype) \
1267 case rtype: \
1268 if (fixP->fx_pcrel) \
1269 fixP->fx_r_type = rtype##_PCREL; \
1270 break; \
1271 \
1272 case rtype##_PCREL: \
1273 if (!fixP->fx_pcrel) \
1274 fixP->fx_r_type = rtype; \
1275 break
1276
1277 FIX_PCREL (BFD_RELOC_8);
1278 FIX_PCREL (BFD_RELOC_16);
1279 FIX_PCREL (BFD_RELOC_32);
1280 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0);
1281 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1);
1282 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_LO);
1283 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_LO);
1284 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_HI);
1285 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_HI);
1286 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_HA);
1287 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_HA);
1288
1289#undef FIX_PCREL
1290
1291 default:
1292 /* Do nothing */
1293 break;
1294 }
1295
1296 if (fixP->fx_addsy != NULL)
1297 {
1298#ifdef OBJ_ELF
1299 switch (fixP->fx_r_type)
1300 {
1301 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD:
1302 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD:
1303 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE:
1304 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE:
1305 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO:
1306 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO:
1307 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO:
1308 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO:
1309 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI:
1310 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI:
1311 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI:
1312 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI:
1313 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA:
1314 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA:
1315 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA:
1316 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA:
1317 case BFD_RELOC_TILEPRO_TLS_DTPMOD32:
1318 case BFD_RELOC_TILEPRO_TLS_DTPOFF32:
1319 case BFD_RELOC_TILEPRO_TLS_TPOFF32:
1320 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1321 break;
1322
1323 default:
1324 /* Do nothing */
1325 break;
1326 }
1327#endif
1328 return;
1329 }
1330
1331 /* Apply lo16, hi16, ha16, etc. munging. */
1332 switch (fixP->fx_r_type)
1333 {
aa137e4d
NC
1334 case BFD_RELOC_LO16:
1335 case BFD_RELOC_TILEPRO_IMM16_X0_LO:
1336 case BFD_RELOC_TILEPRO_IMM16_X1_LO:
1337 case BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL:
1338 case BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL:
1339 *valP = value = apply_special_operator (O_lo16, value);
1340 break;
1341
aa137e4d
NC
1342 case BFD_RELOC_HI16:
1343 case BFD_RELOC_TILEPRO_IMM16_X0_HI:
1344 case BFD_RELOC_TILEPRO_IMM16_X1_HI:
1345 case BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL:
1346 case BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL:
1347 *valP = value = apply_special_operator (O_hi16, value);
1348 break;
1349
aa137e4d
NC
1350 case BFD_RELOC_HI16_S:
1351 case BFD_RELOC_TILEPRO_IMM16_X0_HA:
1352 case BFD_RELOC_TILEPRO_IMM16_X1_HA:
1353 case BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL:
1354 case BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL:
1355 *valP = value = apply_special_operator (O_ha16, value);
1356 break;
1357
aa137e4d
NC
1358 default:
1359 /* Do nothing */
1360 break;
1361 }
1362
1363 p = fixP->fx_frag->fr_literal + fixP->fx_where;
1364
1365 operand = fixP->tc_fix_data;
1366 if (operand != NULL)
1367 {
1368 /* It's an instruction operand. */
1369 tilepro_bundle_bits bits =
1370 insert_operand (0, operand, value, fixP->fx_file, fixP->fx_line);
1371
1372 /* Note that we might either be writing out bits for a bundle or a
1373 static network instruction, which are different sizes, so it's
1374 important to stop touching memory once we run out of bits. ORing in
1375 values is OK since we know the existing bits for this operand are
1376 zero. */
1377 for (; bits != 0; bits >>= 8)
1378 *p++ |= (char)bits;
1379 }
1380 else
1381 {
1382 /* Some other kind of relocation. */
1383 switch (fixP->fx_r_type)
1384 {
1385 case BFD_RELOC_8:
1386 case BFD_RELOC_8_PCREL:
1387 md_number_to_chars (p, value, 1);
1388 break;
1389
1390 case BFD_RELOC_16:
1391 case BFD_RELOC_16_PCREL:
1392 md_number_to_chars (p, value, 2);
1393 break;
1394
1395 case BFD_RELOC_32:
1396 case BFD_RELOC_32_PCREL:
1397 md_number_to_chars (p, value, 4);
1398 break;
1399
1400 default:
1401 /* Leave it for the linker. */
1402 return;
1403 }
1404 }
1405
1406 fixP->fx_done = 1;
1407}
1408
1409
1410/* Generate the BFD reloc to be stuck in the object file from the
1411 fixup used internally in the assembler. */
1412
1413arelent *
1414tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp)
1415{
1416 arelent *reloc;
1417
1418 reloc = (arelent *) xmalloc (sizeof (arelent));
1419 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1420 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1421 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1422
1423 /* Make sure none of our internal relocations make it this far.
1424 They'd better have been fully resolved by this point. */
1425 gas_assert ((int) fixp->fx_r_type > 0);
1426
1427 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1428 if (reloc->howto == NULL)
1429 {
1430 as_bad_where (fixp->fx_file, fixp->fx_line,
1431 _("cannot represent `%s' relocation in object file"),
1432 bfd_get_reloc_code_name (fixp->fx_r_type));
1433 return NULL;
1434 }
1435
1436 if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
1437 {
1438 as_fatal (_("internal error? cannot generate `%s' relocation (%d, %d)"),
1439 bfd_get_reloc_code_name (fixp->fx_r_type),
1440 fixp->fx_pcrel, reloc->howto->pc_relative);
1441 }
1442 gas_assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
1443
1444 reloc->addend = fixp->fx_offset;
1445
1446 return reloc;
1447}
1448
1449
1450/* The location from which a PC relative jump should be calculated,
1451 given a PC relative reloc. */
1452
1453long
1454md_pcrel_from (fixS *fixP)
1455{
1456 return fixP->fx_frag->fr_address + fixP->fx_where;
1457}
1458
1459
1460/* Return 1 if it's OK to adjust a reloc by replacing the symbol with
1461 a section symbol plus some offset. */
1462int
1463tilepro_fix_adjustable (fixS *fix)
1464{
1465 /* Prevent all adjustments to global symbols */
1466 if (S_IS_EXTERNAL (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
1467 return 0;
1468
1469 return 1;
1470}
1471
1472
1473int
1474tilepro_unrecognized_line (int ch)
1475{
1476 switch (ch)
1477 {
1478 case '{':
1479 if (inside_bundle)
1480 {
1481 as_bad (_("Found '{' when already bundling."));
1482 }
1483 else
1484 {
1485 inside_bundle = 1;
1486 current_bundle_index = 0;
1487 }
1488 return 1;
1489
1490 case '}':
1491 if (!inside_bundle)
1492 {
1493 as_bad (_("Found '}' when not bundling."));
1494 }
1495 else
1496 {
1497 tilepro_flush_bundle ();
1498 }
1499
1500 /* Allow '{' to follow on the same line. We also allow ";;", but that
1501 happens automatically because ';' is an end of line marker. */
1502 SKIP_WHITESPACE ();
1503 if (input_line_pointer[0] == '{')
1504 {
1505 input_line_pointer++;
1506 return tilepro_unrecognized_line ('{');
1507 }
1508
1509 demand_empty_rest_of_line ();
1510 return 1;
1511
1512 default:
1513 break;
1514 }
1515
1516 /* Not a valid line. */
1517 return 0;
1518}
1519
1520
1521/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
1522 of an rs_align_code fragment. */
1523
1524void
1525tilepro_handle_align (fragS *fragp)
1526{
1527 int bytes, fix;
1528 char *p;
1529
1530 if (fragp->fr_type != rs_align_code)
1531 return;
1532
1533 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
1534 p = fragp->fr_literal + fragp->fr_fix;
1535 fix = 0;
1536
1537 /* Determine the bits for NOP. */
1538 const struct tilepro_opcode *nop_opcode =
1539 &tilepro_opcodes[TILEPRO_OPC_NOP];
1540 tilepro_bundle_bits nop =
1541 ( nop_opcode->fixed_bit_values[TILEPRO_PIPELINE_X0]
1542 | nop_opcode->fixed_bit_values[TILEPRO_PIPELINE_X1]);
1543
1544 if ((bytes & (TILEPRO_BUNDLE_SIZE_IN_BYTES - 1)) != 0)
1545 {
1546 fix = bytes & (TILEPRO_BUNDLE_SIZE_IN_BYTES - 1);
1547 memset (p, 0, fix);
1548 p += fix;
1549 bytes -= fix;
1550 }
1551
1552 number_to_chars_littleendian (p, (unsigned int)nop, 4);
1553 number_to_chars_littleendian (p + 4, (unsigned int)(nop >> 32), 4);
1554 fragp->fr_fix += fix;
1555 fragp->fr_var = TILEPRO_BUNDLE_SIZE_IN_BYTES;
1556}
1557
1558/* Standard calling conventions leave the CFA at SP on entry. */
1559void
1560tilepro_cfi_frame_initial_instructions (void)
1561{
1562 cfi_add_CFA_def_cfa_register (54);
1563}
1564
1565int
1566tc_tilepro_regname_to_dw2regnum (char *regname)
1567{
1568 int i;
1569
1570 for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
1571 {
1572 if (!strcmp (regname, tilepro_register_names[i]))
1573 return i;
1574 }
1575
1576 return -1;
1577}
This page took 0.103466 seconds and 4 git commands to generate.