1 /* tc-tilegx.c -- Assemble for a Tile-Gx chip.
2 Copyright (C) 2011-2015 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
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.
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.
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. */
22 #include "struc-symbol.h"
25 #include "elf/tilegx.h"
26 #include "opcode/tilegx.h"
28 #include "dwarf2dbg.h"
29 #include "dw2gencfi.h"
31 #include "safe-ctype.h"
34 /* Special registers. */
44 /* Generic assembler global variables which must be defined by all
47 /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
48 int tilegx_cie_data_alignment
;
50 /* Characters which always start a comment. */
51 const char comment_chars
[] = "#";
53 /* Characters which start a comment at the beginning of a line. */
54 const char line_comment_chars
[] = "#";
56 /* Characters which may be used to separate multiple commands on a
58 const char line_separator_chars
[] = ";";
60 /* Characters which are used to indicate an exponent in a floating
62 const char EXP_CHARS
[] = "eE";
64 /* Characters which mean that a number is a floating point constant,
66 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
68 /* Either 32 or 64. */
69 static int tilegx_arch_size
= 64;
73 tilegx_target_format (void)
75 if (target_big_endian
) {
76 return tilegx_arch_size
== 64 ? "elf64-tilegx-be" : "elf32-tilegx-be";
78 return tilegx_arch_size
== 64 ? "elf64-tilegx-le" : "elf32-tilegx-le";
83 #define OPTION_32 (OPTION_MD_BASE + 0)
84 #define OPTION_64 (OPTION_MD_BASE + 1)
85 #define OPTION_EB (OPTION_MD_BASE + 2)
86 #define OPTION_EL (OPTION_MD_BASE + 3)
88 const char *md_shortopts
= "VQ:";
90 struct option md_longopts
[] =
92 {"32", no_argument
, NULL
, OPTION_32
},
93 {"64", no_argument
, NULL
, OPTION_64
},
94 {"EB", no_argument
, NULL
, OPTION_EB
},
95 {"EL", no_argument
, NULL
, OPTION_EL
},
96 {NULL
, no_argument
, NULL
, 0}
99 size_t md_longopts_size
= sizeof (md_longopts
);
102 md_parse_option (int c
, char *arg ATTRIBUTE_UNUSED
)
106 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
107 should be emitted or not. FIXME: Not implemented. */
111 /* -V: SVR4 argument to print version ID. */
117 tilegx_arch_size
= 32;
121 tilegx_arch_size
= 64;
125 target_big_endian
= 1;
129 target_big_endian
= 0;
140 md_show_usage (FILE *stream
)
142 fprintf (stream
, _("\
144 -V print assembler version number\n\
145 -EB/-EL generate big-endian/little-endian code\n\
146 --32/--64 generate 32bit/64bit code\n"));
150 /* Extra expression types. */
156 #define O_hw0_last O_md5
157 #define O_hw1_last O_md6
158 #define O_hw2_last O_md7
159 #define O_hw0_got O_md8
160 #define O_hw0_last_got O_md9
161 #define O_hw1_last_got O_md10
163 #define O_hw0_tls_gd O_md12
164 #define O_hw0_last_tls_gd O_md13
165 #define O_hw1_last_tls_gd O_md14
166 #define O_hw0_tls_ie O_md15
167 #define O_hw0_last_tls_ie O_md16
168 #define O_hw1_last_tls_ie O_md17
169 #define O_hw0_tls_le O_md18
170 #define O_hw0_last_tls_le O_md19
171 #define O_hw1_last_tls_le O_md20
172 #define O_tls_gd_call O_md21
173 #define O_tls_gd_add O_md22
174 #define O_tls_ie_load O_md23
175 #define O_tls_add O_md24
176 #define O_hw0_plt O_md25
177 #define O_hw1_plt O_md26
178 #define O_hw1_last_plt O_md27
179 #define O_hw2_last_plt O_md28
181 static struct hash_control
*special_operator_hash
;
183 /* Hash tables for instruction mnemonic lookup. */
184 static struct hash_control
*op_hash
;
186 /* Hash table for spr lookup. */
187 static struct hash_control
*spr_hash
;
189 /* True temporarily while parsing an SPR expression. This changes the
190 * namespace to include SPR names. */
191 static int parsing_spr
;
193 /* Are we currently inside `{ ... }'? */
194 static int inside_bundle
;
196 struct tilegx_instruction
198 const struct tilegx_opcode
*opcode
;
199 tilegx_pipeline pipe
;
200 expressionS operand_values
[TILEGX_MAX_OPERANDS
];
203 /* This keeps track of the current bundle being built up. */
204 static struct tilegx_instruction current_bundle
[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE
];
206 /* Index in current_bundle for the next instruction to parse. */
207 static int current_bundle_index
;
209 /* Allow 'r63' in addition to 'zero', etc. Normally we disallow this as
210 'zero' is not a real register, so using it accidentally would be a
211 nasty bug. For other registers, such as 'sp', code using multiple names
212 for the same physical register is excessively confusing.
214 The '.require_canonical_reg_names' pseudo-op turns this error on,
215 and the '.no_require_canonical_reg_names' pseudo-op turns this off.
216 By default the error is on. */
217 static int require_canonical_reg_names
;
219 /* Allow bundles that do undefined or suspicious things like write
220 two different values to the same register at the same time.
222 The '.no_allow_suspicious_bundles' pseudo-op turns this error on,
223 and the '.allow_suspicious_bundles' pseudo-op turns this off. */
224 static int allow_suspicious_bundles
;
227 /* A hash table of main processor registers, mapping each register name
230 Furthermore, if the register number is greater than the number
231 of registers for that processor, the user used an illegal alias
232 for that register (e.g. r63 instead of zero), so we should generate
233 a warning. The attempted register number can be found by clearing
234 NONCANONICAL_REG_NAME_FLAG. */
235 static struct hash_control
*main_reg_hash
;
238 /* We cannot unambiguously store a 0 in a hash table and look it up,
239 so we OR in this flag to every canonical register. */
240 #define CANONICAL_REG_NAME_FLAG 0x1000
242 /* By default we disallow register aliases like r63, but we record
243 them in the hash table in case the .no_require_canonical_reg_names
244 directive is used. Noncanonical names have this value added to them. */
245 #define NONCANONICAL_REG_NAME_FLAG 0x2000
247 /* Discards flags for register hash table entries and returns the
249 #define EXTRACT_REGNO(p) ((p) & 63)
251 /* This function is called once, at assembler startup time. It should
252 set up all the tables, etc., that the MD part of the assembler will
258 const struct tilegx_opcode
*op
;
260 int mach
= (tilegx_arch_size
== 64) ? bfd_mach_tilegx
: bfd_mach_tilegx32
;
262 if (! bfd_set_arch_mach (stdoutput
, bfd_arch_tilegx
, mach
))
263 as_warn (_("Could not set architecture and machine"));
265 /* Guarantee text section is aligned. */
266 bfd_set_section_alignment (stdoutput
, text_section
,
267 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
);
269 require_canonical_reg_names
= 1;
270 allow_suspicious_bundles
= 0;
271 current_bundle_index
= 0;
274 tilegx_cie_data_alignment
= (tilegx_arch_size
== 64 ? -8 : -4);
276 /* Initialize special operator hash table. */
277 special_operator_hash
= hash_new ();
278 #define INSERT_SPECIAL_OP(name) \
279 hash_insert (special_operator_hash, #name, (void *)O_##name)
281 INSERT_SPECIAL_OP (hw0
);
282 INSERT_SPECIAL_OP (hw1
);
283 INSERT_SPECIAL_OP (hw2
);
284 INSERT_SPECIAL_OP (hw3
);
285 INSERT_SPECIAL_OP (hw0_last
);
286 INSERT_SPECIAL_OP (hw1_last
);
287 INSERT_SPECIAL_OP (hw2_last
);
288 /* hw3_last is a convenience alias for the equivalent hw3. */
289 hash_insert (special_operator_hash
, "hw3_last", (void*)O_hw3
);
290 INSERT_SPECIAL_OP (hw0_got
);
291 INSERT_SPECIAL_OP (hw0_last_got
);
292 INSERT_SPECIAL_OP (hw1_last_got
);
293 INSERT_SPECIAL_OP(plt
);
294 INSERT_SPECIAL_OP (hw0_tls_gd
);
295 INSERT_SPECIAL_OP (hw0_last_tls_gd
);
296 INSERT_SPECIAL_OP (hw1_last_tls_gd
);
297 INSERT_SPECIAL_OP (hw0_tls_ie
);
298 INSERT_SPECIAL_OP (hw0_last_tls_ie
);
299 INSERT_SPECIAL_OP (hw1_last_tls_ie
);
300 INSERT_SPECIAL_OP (hw0_tls_le
);
301 INSERT_SPECIAL_OP (hw0_last_tls_le
);
302 INSERT_SPECIAL_OP (hw1_last_tls_le
);
303 INSERT_SPECIAL_OP (tls_gd_call
);
304 INSERT_SPECIAL_OP (tls_gd_add
);
305 INSERT_SPECIAL_OP (tls_ie_load
);
306 INSERT_SPECIAL_OP (tls_add
);
307 INSERT_SPECIAL_OP (hw0_plt
);
308 INSERT_SPECIAL_OP (hw1_plt
);
309 INSERT_SPECIAL_OP (hw1_last_plt
);
310 INSERT_SPECIAL_OP (hw2_last_plt
);
311 #undef INSERT_SPECIAL_OP
313 /* Initialize op_hash hash table. */
314 op_hash
= hash_new ();
315 for (op
= &tilegx_opcodes
[0]; op
->name
!= NULL
; op
++)
317 const char *hash_err
= hash_insert (op_hash
, op
->name
, (void *)op
);
318 if (hash_err
!= NULL
)
319 as_fatal (_("Internal Error: Can't hash %s: %s"), op
->name
, hash_err
);
322 /* Initialize the spr hash table. */
324 spr_hash
= hash_new ();
325 for (i
= 0; i
< tilegx_num_sprs
; i
++)
326 hash_insert (spr_hash
, tilegx_sprs
[i
].name
,
327 (void *) &tilegx_sprs
[i
]);
329 /* Set up the main_reg_hash table. We use this instead of
330 creating a symbol in the register section to avoid ambiguities
331 with labels that have the same names as registers. */
332 main_reg_hash
= hash_new ();
333 for (i
= 0; i
< TILEGX_NUM_REGISTERS
; i
++)
337 hash_insert (main_reg_hash
, tilegx_register_names
[i
],
338 (void *) (long) (i
| CANONICAL_REG_NAME_FLAG
));
340 /* See if we should insert a noncanonical alias, like r63. */
341 sprintf (buf
, "r%d", i
);
342 if (strcmp (buf
, tilegx_register_names
[i
]) != 0)
343 hash_insert (main_reg_hash
, xstrdup (buf
),
344 (void *) (long) (i
| NONCANONICAL_REG_NAME_FLAG
));
348 #define BUNDLE_TEMPLATE_MASK(p0, p1, p2) \
349 ((p0) | ((p1) << 8) | ((p2) << 16))
350 #define BUNDLE_TEMPLATE(p0, p1, p2) \
351 { { (p0), (p1), (p2) }, \
352 BUNDLE_TEMPLATE_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \
355 #define NO_PIPELINE TILEGX_NUM_PIPELINE_ENCODINGS
357 struct bundle_template
359 tilegx_pipeline pipe
[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE
];
360 unsigned int pipe_mask
;
363 static const struct bundle_template bundle_templates
[] =
365 /* In Y format we must always have something in Y2, since it has
366 no fnop, so this conveys that Y2 must always be used. */
367 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0
, TILEGX_PIPELINE_Y2
, NO_PIPELINE
),
368 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1
, TILEGX_PIPELINE_Y2
, NO_PIPELINE
),
369 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2
, TILEGX_PIPELINE_Y0
, NO_PIPELINE
),
370 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2
, TILEGX_PIPELINE_Y1
, NO_PIPELINE
),
372 /* Y format has three instructions. */
373 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0
,TILEGX_PIPELINE_Y1
,TILEGX_PIPELINE_Y2
),
374 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0
,TILEGX_PIPELINE_Y2
,TILEGX_PIPELINE_Y1
),
375 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1
,TILEGX_PIPELINE_Y0
,TILEGX_PIPELINE_Y2
),
376 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1
,TILEGX_PIPELINE_Y2
,TILEGX_PIPELINE_Y0
),
377 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2
,TILEGX_PIPELINE_Y0
,TILEGX_PIPELINE_Y1
),
378 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2
,TILEGX_PIPELINE_Y1
,TILEGX_PIPELINE_Y0
),
380 /* X format has only two instructions. */
381 BUNDLE_TEMPLATE(TILEGX_PIPELINE_X0
, TILEGX_PIPELINE_X1
, NO_PIPELINE
),
382 BUNDLE_TEMPLATE(TILEGX_PIPELINE_X1
, TILEGX_PIPELINE_X0
, NO_PIPELINE
)
387 prepend_nop_to_bundle (tilegx_mnemonic mnemonic
)
389 memmove (¤t_bundle
[1], ¤t_bundle
[0],
390 current_bundle_index
* sizeof current_bundle
[0]);
391 current_bundle
[0].opcode
= &tilegx_opcodes
[mnemonic
];
392 ++current_bundle_index
;
395 static tilegx_bundle_bits
396 insert_operand (tilegx_bundle_bits bits
,
397 const struct tilegx_operand
*operand
,
402 /* Range-check the immediate. */
403 int num_bits
= operand
->num_bits
;
405 operand_value
>>= operand
->rightshift
;
407 if (bfd_check_overflow (operand
->is_signed
408 ? complain_overflow_signed
409 : complain_overflow_unsigned
,
412 bfd_arch_bits_per_address (stdoutput
),
417 if (operand
->is_signed
)
419 min
= -(1 << (num_bits
- 1));
420 max
= (1 << (num_bits
- 1)) - 1;
425 max
= (1 << num_bits
) - 1;
427 as_bad_value_out_of_range (_("operand"), operand_value
, min
, max
,
431 /* Write out the bits for the immediate. */
432 return bits
| operand
->insert (operand_value
);
437 apply_special_operator (operatorT op
, offsetT num
, char *file
, unsigned lineno
)
440 int check_shift
= -1;
448 ret
= (signed short)num
;
455 ret
= (signed short)(num
>> 16);
462 ret
= (signed short)(num
>> 32);
466 ret
= (signed short)(num
>> 48);
474 if (check_shift
>= 0 && ret
!= (num
>> check_shift
))
476 as_bad_value_out_of_range (_("operand"), num
,
477 ~0ULL << (check_shift
+ 16 - 1),
478 ~0ULL >> (64 - (check_shift
+ 16 - 1)),
485 static tilegx_bundle_bits
486 emit_tilegx_instruction (tilegx_bundle_bits bits
,
488 const unsigned char *operands
,
489 expressionS
*operand_values
,
494 for (i
= 0; i
< num_operands
; i
++)
496 const struct tilegx_operand
*operand
=
497 &tilegx_operands
[operands
[i
]];
498 expressionS
*operand_exp
= &operand_values
[i
];
499 int is_pc_relative
= operand
->is_pc_relative
;
501 if (operand_exp
->X_op
== O_register
502 || (operand_exp
->X_op
== O_constant
&& !is_pc_relative
))
504 /* We know what the bits are right now, so insert them. */
505 bits
= insert_operand (bits
, operand
, operand_exp
->X_add_number
,
510 bfd_reloc_code_real_type reloc
= operand
->default_reloc
;
512 int die
= 0, use_subexp
= 0, require_symbol
= 0;
515 /* Take an expression like hw0(x) and turn it into x with
516 a different reloc type. */
517 switch (operand_exp
->X_op
)
519 #define HANDLE_OP16(suffix) \
522 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST: \
523 reloc = BFD_RELOC_TILEGX_IMM16_X0_##suffix; \
525 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST: \
526 reloc = BFD_RELOC_TILEGX_IMM16_X1_##suffix; \
551 HANDLE_OP16 (HW0_LAST
);
555 HANDLE_OP16 (HW1_LAST
);
559 HANDLE_OP16 (HW2_LAST
);
563 HANDLE_OP16 (HW0_GOT
);
568 HANDLE_OP16 (HW0_LAST_GOT
);
573 HANDLE_OP16 (HW1_LAST_GOT
);
578 HANDLE_OP16 (HW0_TLS_GD
);
582 case O_hw0_last_tls_gd
:
583 HANDLE_OP16 (HW0_LAST_TLS_GD
);
587 case O_hw1_last_tls_gd
:
588 HANDLE_OP16 (HW1_LAST_TLS_GD
);
593 HANDLE_OP16 (HW0_TLS_IE
);
597 case O_hw0_last_tls_ie
:
598 HANDLE_OP16 (HW0_LAST_TLS_IE
);
602 case O_hw1_last_tls_ie
:
603 HANDLE_OP16 (HW1_LAST_TLS_IE
);
608 HANDLE_OP16 (HW0_TLS_LE
);
612 case O_hw0_last_tls_le
:
613 HANDLE_OP16 (HW0_LAST_TLS_LE
);
617 case O_hw1_last_tls_le
:
618 HANDLE_OP16 (HW1_LAST_TLS_LE
);
623 HANDLE_OP16 (HW0_PLT_PCREL
);
627 HANDLE_OP16 (HW1_PLT_PCREL
);
631 HANDLE_OP16 (HW1_LAST_PLT_PCREL
);
635 HANDLE_OP16 (HW2_LAST_PLT_PCREL
);
643 case BFD_RELOC_TILEGX_JUMPOFF_X1
:
644 reloc
= BFD_RELOC_TILEGX_JUMPOFF_X1_PLT
;
657 case BFD_RELOC_TILEGX_JUMPOFF_X1
:
658 reloc
= BFD_RELOC_TILEGX_TLS_GD_CALL
;
671 case BFD_RELOC_TILEGX_IMM8_X0
:
672 reloc
= BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD
;
674 case BFD_RELOC_TILEGX_IMM8_X1
:
675 reloc
= BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD
;
677 case BFD_RELOC_TILEGX_IMM8_Y0
:
678 reloc
= BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD
;
680 case BFD_RELOC_TILEGX_IMM8_Y1
:
681 reloc
= BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD
;
694 case BFD_RELOC_TILEGX_IMM8_X1
:
695 reloc
= BFD_RELOC_TILEGX_TLS_IE_LOAD
;
708 case BFD_RELOC_TILEGX_IMM8_X0
:
709 reloc
= BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD
;
711 case BFD_RELOC_TILEGX_IMM8_X1
:
712 reloc
= BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD
;
714 case BFD_RELOC_TILEGX_IMM8_Y0
:
715 reloc
= BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD
;
717 case BFD_RELOC_TILEGX_IMM8_Y1
:
718 reloc
= BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD
;
735 as_bad (_("Invalid operator for operand."));
739 /* Now that we've changed the reloc, change ha16(x) into x,
742 if (!operand_exp
->X_add_symbol
->sy_flags
.sy_local_symbol
743 && operand_exp
->X_add_symbol
->sy_value
.X_md
)
745 /* HACK: We used X_md to mark this symbol as a fake wrapper
746 around a real expression. To unwrap it, we just grab its
748 operand_exp
= &operand_exp
->X_add_symbol
->sy_value
;
752 /* Look at the expression, and reject it if it's not a
754 if (operand_exp
->X_op
!= O_symbol
755 || operand_exp
->X_add_number
!= 0)
756 as_bad (_("Operator may only be applied to symbols."));
761 /* The value of this expression is an actual symbol, so
762 turn that into an expression. */
763 memset (&subexp
, 0, sizeof subexp
);
764 subexp
.X_op
= O_symbol
;
765 subexp
.X_add_symbol
= operand_exp
->X_add_symbol
;
766 operand_exp
= &subexp
;
770 /* Create a fixup to handle this later. */
771 fixP
= fix_new_exp (frag_now
,
772 bundle_start
- frag_now
->fr_literal
,
773 (operand
->num_bits
+ 7) >> 3,
777 fixP
->tc_fix_data
= operand
;
779 /* Don't do overflow checking if we are applying a function like
781 fixP
->fx_no_overflow
|= use_subexp
;
788 /* Detects and complains if two instructions in current_bundle write
789 to the same register, either implicitly or explicitly, or if a
790 read-only register is written. */
792 check_illegal_reg_writes (void)
794 BFD_HOST_U_64_BIT all_regs_written
= 0;
797 for (j
= 0; j
< current_bundle_index
; j
++)
799 const struct tilegx_instruction
*instr
= ¤t_bundle
[j
];
801 BFD_HOST_U_64_BIT regs
=
802 ((BFD_HOST_U_64_BIT
)1) << instr
->opcode
->implicitly_written_register
;
803 BFD_HOST_U_64_BIT conflict
;
805 for (k
= 0; k
< instr
->opcode
->num_operands
; k
++)
807 const struct tilegx_operand
*operand
=
808 &tilegx_operands
[instr
->opcode
->operands
[instr
->pipe
][k
]];
810 if (operand
->is_dest_reg
)
812 int regno
= instr
->operand_values
[k
].X_add_number
;
813 BFD_HOST_U_64_BIT mask
= ((BFD_HOST_U_64_BIT
)1) << regno
;
815 if ((mask
& ( (((BFD_HOST_U_64_BIT
)1) << TREG_IDN1
)
816 | (((BFD_HOST_U_64_BIT
)1) << TREG_UDN1
)
817 | (((BFD_HOST_U_64_BIT
)1) << TREG_UDN2
)
818 | (((BFD_HOST_U_64_BIT
)1) << TREG_UDN3
))) != 0
819 && !allow_suspicious_bundles
)
821 as_bad (_("Writes to register '%s' are not allowed."),
822 tilegx_register_names
[regno
]);
829 /* Writing to the zero register doesn't count. */
830 regs
&= ~(((BFD_HOST_U_64_BIT
)1) << TREG_ZERO
);
832 conflict
= all_regs_written
& regs
;
833 if (conflict
!= 0 && !allow_suspicious_bundles
)
835 /* Find which register caused the conflict. */
836 const char *conflicting_reg_name
= "???";
839 for (i
= 0; i
< TILEGX_NUM_REGISTERS
; i
++)
841 if (((conflict
>> i
) & 1) != 0)
843 conflicting_reg_name
= tilegx_register_names
[i
];
848 as_bad (_("Two instructions in the same bundle both write "
849 "to register %s, which is not allowed."),
850 conflicting_reg_name
);
853 all_regs_written
|= regs
;
859 tilegx_flush_bundle (void)
864 unsigned compatible_pipes
;
865 const struct bundle_template
*match
;
870 switch (current_bundle_index
)
873 /* No instructions. */
876 if (current_bundle
[0].opcode
->can_bundle
)
878 /* Simplify later logic by adding an explicit fnop. */
879 prepend_nop_to_bundle (TILEGX_OPC_FNOP
);
883 /* This instruction cannot be bundled with anything else.
884 Prepend an explicit 'nop', rather than an 'fnop', because
885 fnops can be replaced by later binary-processing tools while
887 prepend_nop_to_bundle (TILEGX_OPC_NOP
);
891 if (!allow_suspicious_bundles
)
893 /* Make sure all instructions can be bundled with other
895 const struct tilegx_opcode
*cannot_bundle
= NULL
;
896 bfd_boolean seen_non_nop
= FALSE
;
898 for (j
= 0; j
< current_bundle_index
; j
++)
900 const struct tilegx_opcode
*op
= current_bundle
[j
].opcode
;
902 if (!op
->can_bundle
&& cannot_bundle
== NULL
)
904 else if (op
->mnemonic
!= TILEGX_OPC_NOP
905 && op
->mnemonic
!= TILEGX_OPC_INFO
906 && op
->mnemonic
!= TILEGX_OPC_INFOL
)
910 if (cannot_bundle
!= NULL
&& seen_non_nop
)
912 current_bundle_index
= 0;
913 as_bad (_("'%s' may not be bundled with other instructions."),
914 cannot_bundle
->name
);
922 BUNDLE_TEMPLATE_MASK(current_bundle
[0].opcode
->pipes
,
923 current_bundle
[1].opcode
->pipes
,
924 (current_bundle_index
== 3
925 ? current_bundle
[2].opcode
->pipes
926 : (1 << NO_PIPELINE
)));
928 /* Find a template that works, if any. */
930 for (i
= 0; i
< sizeof bundle_templates
/ sizeof bundle_templates
[0]; i
++)
932 const struct bundle_template
*b
= &bundle_templates
[i
];
933 if ((b
->pipe_mask
& compatible_pipes
) == b
->pipe_mask
)
942 current_bundle_index
= 0;
943 as_bad (_("Invalid combination of instructions for bundle."));
947 /* If the section seems to have no alignment set yet, go ahead and
948 make it large enough to hold code. */
949 if (bfd_get_section_alignment (stdoutput
, now_seg
) == 0)
950 bfd_set_section_alignment (stdoutput
, now_seg
,
951 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
);
953 for (j
= 0; j
< current_bundle_index
; j
++)
954 current_bundle
[j
].pipe
= match
->pipe
[j
];
956 if (current_bundle_index
== 2 && !tilegx_is_x_pipeline (match
->pipe
[0]))
958 /* We are in Y mode with only two instructions, so add an FNOP. */
959 prepend_nop_to_bundle (TILEGX_OPC_FNOP
);
961 /* Figure out what pipe the fnop must be in via arithmetic.
962 * p0 + p1 + p2 must sum to the sum of TILEGX_PIPELINE_Y[012]. */
963 current_bundle
[0].pipe
=
964 (tilegx_pipeline
)((TILEGX_PIPELINE_Y0
966 + TILEGX_PIPELINE_Y2
) -
967 (current_bundle
[1].pipe
+ current_bundle
[2].pipe
));
970 check_illegal_reg_writes ();
972 f
= frag_more (TILEGX_BUNDLE_SIZE_IN_BYTES
);
974 /* Check to see if this bundle is at an offset that is a multiple of 8-bytes
975 from the start of the frag. */
976 addr_mod
= frag_now_fix () & (TILEGX_BUNDLE_ALIGNMENT_IN_BYTES
- 1);
977 if (frag_now
->has_code
&& frag_now
->insn_addr
!= addr_mod
)
978 as_bad (_("instruction address is not a multiple of 8"));
979 frag_now
->insn_addr
= addr_mod
;
980 frag_now
->has_code
= 1;
982 tilegx_bundle_bits bits
= 0;
983 for (j
= 0; j
< current_bundle_index
; j
++)
985 struct tilegx_instruction
*instr
= ¤t_bundle
[j
];
986 tilegx_pipeline pipeline
= instr
->pipe
;
987 const struct tilegx_opcode
*opcode
= instr
->opcode
;
989 bits
|= emit_tilegx_instruction (opcode
->fixed_bit_values
[pipeline
],
990 opcode
->num_operands
,
991 &opcode
->operands
[pipeline
][0],
992 instr
->operand_values
,
996 number_to_chars_littleendian (f
, bits
, 8);
997 current_bundle_index
= 0;
999 /* Emit DWARF2 debugging information. */
1000 dwarf2_emit_insn (TILEGX_BUNDLE_SIZE_IN_BYTES
);
1004 /* Extend the expression parser to handle hw0(label), etc.
1005 as well as SPR names when in the context of parsing an SPR. */
1008 tilegx_parse_name (char *name
, expressionS
*e
, char *nextcharP
)
1010 operatorT op
= O_illegal
;
1014 void* val
= hash_find (spr_hash
, name
);
1018 memset (e
, 0, sizeof *e
);
1019 e
->X_op
= O_constant
;
1020 e
->X_add_number
= ((const struct tilegx_spr
*)val
)->number
;
1024 if (*nextcharP
!= '(')
1026 /* hw0, etc. not followed by a paren is just a label with that name. */
1031 /* Look up the operator in our table. */
1032 void* val
= hash_find (special_operator_hash
, name
);
1035 op
= (operatorT
)(long)val
;
1038 /* Restore old '(' and skip it. */
1039 *input_line_pointer
= '(';
1040 ++input_line_pointer
;
1044 if (*input_line_pointer
!= ')')
1046 as_bad (_("Missing ')'"));
1047 *nextcharP
= *input_line_pointer
;
1051 ++input_line_pointer
;
1053 if (e
->X_op
== O_register
|| e
->X_op
== O_absent
)
1055 as_bad (_("Invalid expression."));
1056 e
->X_op
= O_constant
;
1057 e
->X_add_number
= 0;
1061 /* Wrap subexpression with a unary operator. */
1062 symbolS
*sym
= make_expr_symbol (e
);
1064 if (sym
!= e
->X_add_symbol
)
1066 /* HACK: mark this symbol as a temporary wrapper around a proper
1067 expression, so we can unwrap it later once we have communicated
1068 the relocation type. */
1069 sym
->sy_value
.X_md
= 1;
1072 memset (e
, 0, sizeof *e
);
1074 e
->X_add_symbol
= sym
;
1075 e
->X_add_number
= 0;
1078 *nextcharP
= *input_line_pointer
;
1083 /* Parses an expression which must be a register name. */
1086 parse_reg_expression (expressionS
* expression
)
1088 /* Zero everything to make sure we don't miss any flags. */
1089 memset (expression
, 0, sizeof *expression
);
1091 char* regname
= input_line_pointer
;
1092 char terminating_char
= get_symbol_end ();
1094 void* pval
= hash_find (main_reg_hash
, regname
);
1098 as_bad (_("Expected register, got '%s'."), regname
);
1101 int regno_and_flags
= (int)(size_t)pval
;
1102 int regno
= EXTRACT_REGNO(regno_and_flags
);
1104 if ((regno_and_flags
& NONCANONICAL_REG_NAME_FLAG
)
1105 && require_canonical_reg_names
)
1107 as_warn (_("Found use of non-canonical register name %s; "
1110 tilegx_register_names
[regno
]);
1113 /* Restore the old character following the register name. */
1114 *input_line_pointer
= terminating_char
;
1116 /* Fill in the expression fields to indicate it's a register. */
1117 expression
->X_op
= O_register
;
1118 expression
->X_add_number
= regno
;
1122 /* Parses and type-checks comma-separated operands in input_line_pointer. */
1125 parse_operands (const char *opcode_name
,
1126 const unsigned char *operands
,
1128 expressionS
*operand_values
)
1132 memset (operand_values
, 0, num_operands
* sizeof operand_values
[0]);
1135 for (i
= 0; i
< num_operands
; i
++)
1137 tilegx_operand_type type
= tilegx_operands
[operands
[i
]].type
;
1141 if (type
== TILEGX_OP_TYPE_REGISTER
)
1143 parse_reg_expression (&operand_values
[i
]);
1145 else if (*input_line_pointer
== '}')
1147 operand_values
[i
].X_op
= O_absent
;
1149 else if (type
== TILEGX_OP_TYPE_SPR
)
1151 /* Modify the expression parser to add SPRs to the namespace. */
1153 expression (&operand_values
[i
]);
1158 expression (&operand_values
[i
]);
1163 if (i
+ 1 < num_operands
)
1165 int separator
= (unsigned char)*input_line_pointer
++;
1167 if (is_end_of_line
[separator
] || (separator
== '}'))
1169 as_bad (_("Too few operands to '%s'."), opcode_name
);
1172 else if (separator
!= ',')
1174 as_bad (_("Unexpected character '%c' after operand %d to %s."),
1175 (char)separator
, i
+ 1, opcode_name
);
1180 /* Arbitrarily use the first valid pipe to get the operand type,
1181 since they are all the same. */
1182 switch (tilegx_operands
[operands
[i
]].type
)
1184 case TILEGX_OP_TYPE_REGISTER
:
1185 /* Handled in parse_reg_expression already. */
1187 case TILEGX_OP_TYPE_SPR
:
1189 case TILEGX_OP_TYPE_IMMEDIATE
:
1191 case TILEGX_OP_TYPE_ADDRESS
:
1192 if ( operand_values
[i
].X_op
== O_register
1193 || operand_values
[i
].X_op
== O_illegal
1194 || operand_values
[i
].X_op
== O_absent
)
1195 as_bad (_("Expected immediate expression"));
1202 if (!is_end_of_line
[(unsigned char)*input_line_pointer
])
1204 switch (*input_line_pointer
)
1208 as_bad (_("Found '}' when not bundling."));
1209 ++input_line_pointer
;
1211 demand_empty_rest_of_line ();
1215 as_bad (_("Too many operands"));
1219 /* Use default error for unrecognized garbage. */
1220 demand_empty_rest_of_line ();
1227 /* This is the guts of the machine-dependent assembler. STR points to a
1228 machine dependent instruction. This function is supposed to emit the
1229 frags/bytes it assembles to. */
1232 md_assemble (char *str
)
1236 char *old_input_line_pointer
;
1237 const struct tilegx_opcode
*op
;
1240 /* Split off the opcode and look it up. */
1241 opname_len
= strcspn (str
, " {}");
1242 old_char
= str
[opname_len
];
1243 str
[opname_len
] = '\0';
1245 op
= hash_find(op_hash
, str
);
1246 str
[opname_len
] = old_char
;
1249 as_bad (_("Unknown opcode `%.*s'."), (int)opname_len
, str
);
1253 /* Prepare to parse the operands. */
1254 old_input_line_pointer
= input_line_pointer
;
1255 input_line_pointer
= str
+ opname_len
;
1258 if (current_bundle_index
== TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE
)
1260 as_bad (_("Too many instructions for bundle."));
1261 tilegx_flush_bundle ();
1264 /* Make sure we have room for the upcoming bundle before we
1265 create any fixups. Otherwise if we have to switch to a new
1266 frag the fixup dot_value fields will be wrong. */
1267 frag_grow (TILEGX_BUNDLE_SIZE_IN_BYTES
);
1269 /* Find a valid pipe for this opcode. */
1270 for (first_pipe
= 0; (op
->pipes
& (1 << first_pipe
)) == 0; first_pipe
++)
1273 /* Call the function that assembles this instruction. */
1274 current_bundle
[current_bundle_index
].opcode
= op
;
1275 parse_operands (op
->name
,
1276 &op
->operands
[first_pipe
][0],
1278 current_bundle
[current_bundle_index
].operand_values
);
1279 ++current_bundle_index
;
1281 /* Restore the saved value of input_line_pointer. */
1282 input_line_pointer
= old_input_line_pointer
;
1284 /* If we weren't inside curly braces, go ahead and emit
1285 this lone instruction as a bundle right now. */
1287 tilegx_flush_bundle ();
1292 s_require_canonical_reg_names (int require
)
1294 demand_empty_rest_of_line ();
1295 require_canonical_reg_names
= require
;
1299 s_allow_suspicious_bundles (int allow
)
1301 demand_empty_rest_of_line ();
1302 allow_suspicious_bundles
= allow
;
1305 const pseudo_typeS md_pseudo_table
[] =
1307 {"align", s_align_bytes
, 0}, /* Defaulting is invalid (0). */
1309 {"require_canonical_reg_names", s_require_canonical_reg_names
, 1 },
1310 {"no_require_canonical_reg_names", s_require_canonical_reg_names
, 0 },
1311 {"allow_suspicious_bundles", s_allow_suspicious_bundles
, 1 },
1312 {"no_allow_suspicious_bundles", s_allow_suspicious_bundles
, 0 },
1316 /* Equal to MAX_PRECISION in atof-ieee.c */
1317 #define MAX_LITTLENUMS 6
1320 md_number_to_chars (char * buf
, valueT val
, int n
)
1322 if (target_big_endian
)
1323 number_to_chars_bigendian (buf
, val
, n
);
1325 number_to_chars_littleendian (buf
, val
, n
);
1328 /* Turn the string pointed to by litP into a floating point constant
1329 of type TYPE, and emit the appropriate bytes. The number of
1330 LITTLENUMS emitted is stored in *SIZEP. An error message is
1331 returned, or NULL on OK. */
1334 md_atof (int type
, char *litP
, int *sizeP
)
1337 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
1338 LITTLENUM_TYPE
*wordP
;
1355 return _("Bad call to md_atof ()");
1357 t
= atof_ieee (input_line_pointer
, type
, words
);
1359 input_line_pointer
= t
;
1361 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
1362 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
1363 the bigendian 386. */
1364 for (wordP
= words
+ prec
- 1; prec
--;)
1366 md_number_to_chars (litP
, (valueT
) (*wordP
--), sizeof (LITTLENUM_TYPE
));
1367 litP
+= sizeof (LITTLENUM_TYPE
);
1373 /* We have no need to default values of symbols. */
1376 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1383 tilegx_cons_fix_new (fragS
*frag
,
1389 bfd_reloc_code_real_type reloc
= BFD_RELOC_NONE
;
1390 int no_overflow
= 0;
1393 /* See if it's one of our special functions. */
1397 reloc
= BFD_RELOC_TILEGX_HW0
;
1401 reloc
= BFD_RELOC_TILEGX_HW1
;
1405 reloc
= BFD_RELOC_TILEGX_HW2
;
1409 reloc
= BFD_RELOC_TILEGX_HW3
;
1413 reloc
= BFD_RELOC_TILEGX_HW0_LAST
;
1416 reloc
= BFD_RELOC_TILEGX_HW1_LAST
;
1419 reloc
= BFD_RELOC_TILEGX_HW2_LAST
;
1427 if (reloc
!= BFD_RELOC_NONE
)
1431 as_bad (_("This operator only produces two byte values."));
1435 memset (&subexp
, 0, sizeof subexp
);
1436 subexp
.X_op
= O_symbol
;
1437 subexp
.X_add_symbol
= exp
->X_add_symbol
;
1445 reloc
= BFD_RELOC_8
;
1448 reloc
= BFD_RELOC_16
;
1451 reloc
= BFD_RELOC_32
;
1454 reloc
= BFD_RELOC_64
;
1457 as_bad (_("unsupported BFD relocation size %d"), nbytes
);
1458 reloc
= BFD_RELOC_64
;
1463 fixP
= fix_new_exp (frag
, where
, nbytes
, exp
, 0, reloc
);
1464 fixP
->tc_fix_data
= NULL
;
1465 fixP
->fx_no_overflow
|= no_overflow
;
1470 md_apply_fix (fixS
*fixP
, valueT
* valP
, segT seg ATTRIBUTE_UNUSED
)
1472 const struct tilegx_operand
*operand
;
1473 valueT value
= *valP
;
1477 /* Leave these for the linker. */
1478 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1479 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1482 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
1484 /* We can't actually support subtracting a symbol. */
1485 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
1488 /* Correct relocation types for pc-relativeness. */
1489 switch (fixP
->fx_r_type
)
1491 #define FIX_PCREL(rtype) \
1493 if (fixP->fx_pcrel) \
1494 fixP->fx_r_type = rtype##_PCREL; \
1497 case rtype##_PCREL: \
1498 if (!fixP->fx_pcrel) \
1499 fixP->fx_r_type = rtype; \
1502 #define FIX_PLT_PCREL(rtype) \
1503 case rtype##_PLT_PCREL: \
1504 if (!fixP->fx_pcrel) \
1505 fixP->fx_r_type = rtype; \
1509 FIX_PCREL (BFD_RELOC_8
);
1510 FIX_PCREL (BFD_RELOC_16
);
1511 FIX_PCREL (BFD_RELOC_32
);
1512 FIX_PCREL (BFD_RELOC_64
);
1513 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0
);
1514 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0
);
1515 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1
);
1516 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1
);
1517 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2
);
1518 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2
);
1519 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW3
);
1520 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW3
);
1521 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST
);
1522 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST
);
1523 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST
);
1524 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST
);
1525 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST
);
1526 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST
);
1527 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0
);
1528 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0
);
1529 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1
);
1530 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1
);
1531 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST
);
1532 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST
);
1533 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST
);
1534 FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST
);
1543 if (fixP
->fx_addsy
!= NULL
)
1546 switch (fixP
->fx_r_type
)
1548 case BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD
:
1549 case BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD
:
1550 case BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD
:
1551 case BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD
:
1552 case BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD
:
1553 case BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD
:
1554 case BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD
:
1555 case BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD
:
1556 case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD
:
1557 case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD
:
1558 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
:
1559 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
:
1560 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
:
1561 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
:
1562 case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE
:
1563 case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE
:
1564 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
:
1565 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
:
1566 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
:
1567 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
:
1568 case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE
:
1569 case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE
:
1570 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
:
1571 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
:
1572 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
:
1573 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
:
1574 case BFD_RELOC_TILEGX_TLS_GD_CALL
:
1575 case BFD_RELOC_TILEGX_TLS_IE_LOAD
:
1576 case BFD_RELOC_TILEGX_TLS_DTPMOD64
:
1577 case BFD_RELOC_TILEGX_TLS_DTPOFF64
:
1578 case BFD_RELOC_TILEGX_TLS_TPOFF64
:
1579 case BFD_RELOC_TILEGX_TLS_DTPMOD32
:
1580 case BFD_RELOC_TILEGX_TLS_DTPOFF32
:
1581 case BFD_RELOC_TILEGX_TLS_TPOFF32
:
1582 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
1593 /* Apply hw0, etc. */
1594 special
= O_illegal
;
1595 switch (fixP
->fx_r_type
)
1597 case BFD_RELOC_TILEGX_HW0
:
1598 case BFD_RELOC_TILEGX_IMM16_X0_HW0
:
1599 case BFD_RELOC_TILEGX_IMM16_X1_HW0
:
1600 case BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL
:
1601 case BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL
:
1602 case BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL
:
1603 case BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL
:
1607 case BFD_RELOC_TILEGX_HW0_LAST
:
1608 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST
:
1609 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST
:
1610 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL
:
1611 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL
:
1612 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
:
1613 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
:
1614 special
= O_hw0_last
;
1617 case BFD_RELOC_TILEGX_HW1
:
1618 case BFD_RELOC_TILEGX_IMM16_X0_HW1
:
1619 case BFD_RELOC_TILEGX_IMM16_X1_HW1
:
1620 case BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL
:
1621 case BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL
:
1622 case BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL
:
1623 case BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL
:
1627 case BFD_RELOC_TILEGX_HW1_LAST
:
1628 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST
:
1629 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST
:
1630 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL
:
1631 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL
:
1632 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
:
1633 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
:
1634 special
= O_hw1_last
;
1637 case BFD_RELOC_TILEGX_HW2
:
1638 case BFD_RELOC_TILEGX_IMM16_X0_HW2
:
1639 case BFD_RELOC_TILEGX_IMM16_X1_HW2
:
1640 case BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL
:
1641 case BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL
:
1642 case BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL
:
1643 case BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL
:
1647 case BFD_RELOC_TILEGX_HW2_LAST
:
1648 case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST
:
1649 case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST
:
1650 case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL
:
1651 case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL
:
1652 case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
:
1653 case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
:
1654 special
= O_hw2_last
;
1657 case BFD_RELOC_TILEGX_HW3
:
1658 case BFD_RELOC_TILEGX_IMM16_X0_HW3
:
1659 case BFD_RELOC_TILEGX_IMM16_X1_HW3
:
1660 case BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL
:
1661 case BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL
:
1662 case BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL
:
1663 case BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL
:
1672 if (special
!= O_illegal
)
1674 *valP
= value
= apply_special_operator (special
, value
,
1675 fixP
->fx_file
, fixP
->fx_line
);
1678 p
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1680 operand
= fixP
->tc_fix_data
;
1681 if (operand
!= NULL
)
1683 /* It's an instruction operand. */
1684 tilegx_bundle_bits bits
=
1685 insert_operand (0, operand
, value
, fixP
->fx_file
, fixP
->fx_line
);
1687 /* Note that we might either be writing out bits for a bundle
1688 or a static network instruction, which are different sizes, so it's
1689 important to stop touching memory once we run out of bits.
1690 ORing in values is OK since we know the existing bits for
1691 this operand are zero. */
1692 for (; bits
!= 0; bits
>>= 8)
1697 /* Some other kind of relocation. */
1698 switch (fixP
->fx_r_type
)
1701 case BFD_RELOC_8_PCREL
:
1702 md_number_to_chars (p
, value
, 1);
1706 case BFD_RELOC_16_PCREL
:
1707 md_number_to_chars (p
, value
, 2);
1711 case BFD_RELOC_32_PCREL
:
1712 md_number_to_chars (p
, value
, 4);
1716 case BFD_RELOC_64_PCREL
:
1717 md_number_to_chars (p
, value
, 8);
1721 /* Leave it for the linker. */
1730 /* Generate the BFD reloc to be stuck in the object file from the
1731 fixup used internally in the assembler. */
1734 tc_gen_reloc (asection
*sec ATTRIBUTE_UNUSED
, fixS
*fixp
)
1738 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1739 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1740 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1741 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1743 /* Make sure none of our internal relocations make it this far.
1744 They'd better have been fully resolved by this point. */
1745 gas_assert ((int) fixp
->fx_r_type
> 0);
1747 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1748 if (reloc
->howto
== NULL
)
1750 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1751 _("cannot represent `%s' relocation in object file"),
1752 bfd_get_reloc_code_name (fixp
->fx_r_type
));
1756 if (!fixp
->fx_pcrel
!= !reloc
->howto
->pc_relative
)
1758 as_fatal (_("internal error? cannot generate `%s' relocation (%d, %d)"),
1759 bfd_get_reloc_code_name (fixp
->fx_r_type
),
1760 fixp
->fx_pcrel
, reloc
->howto
->pc_relative
);
1762 gas_assert (!fixp
->fx_pcrel
== !reloc
->howto
->pc_relative
);
1764 reloc
->addend
= fixp
->fx_offset
;
1770 /* The location from which a PC relative jump should be calculated,
1771 given a PC relative reloc. */
1774 md_pcrel_from (fixS
*fixP
)
1776 return fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
1780 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
1781 a section symbol plus some offset. */
1783 tilegx_fix_adjustable (fixS
*fix
)
1785 /* Prevent all adjustments to global symbols */
1786 if (S_IS_EXTERNAL (fix
->fx_addsy
) || S_IS_WEAK (fix
->fx_addsy
))
1794 tilegx_unrecognized_line (int ch
)
1801 as_bad (_("Found '{' when already bundling."));
1806 current_bundle_index
= 0;
1813 as_bad (_("Found '}' when not bundling."));
1817 tilegx_flush_bundle ();
1820 /* Allow '{' to follow on the same line. We also allow ";;", but that
1821 happens automatically because ';' is an end of line marker. */
1823 if (input_line_pointer
[0] == '{')
1825 input_line_pointer
++;
1826 return tilegx_unrecognized_line ('{');
1829 demand_empty_rest_of_line ();
1836 /* Not a valid line. */
1841 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
1842 of an rs_align_code fragment. */
1845 tilegx_handle_align (fragS
*fragp
)
1847 addressT bytes
, fix
;
1850 if (fragp
->fr_type
!= rs_align_code
)
1853 bytes
= fragp
->fr_next
->fr_address
- fragp
->fr_address
- fragp
->fr_fix
;
1854 p
= fragp
->fr_literal
+ fragp
->fr_fix
;
1857 /* Determine the bits for NOP. */
1858 const struct tilegx_opcode
*nop_opcode
=
1859 &tilegx_opcodes
[TILEGX_OPC_NOP
];
1860 tilegx_bundle_bits nop
=
1861 ( nop_opcode
->fixed_bit_values
[TILEGX_PIPELINE_X0
]
1862 | nop_opcode
->fixed_bit_values
[TILEGX_PIPELINE_X1
]);
1864 if ((bytes
& (TILEGX_BUNDLE_SIZE_IN_BYTES
- 1)) != 0)
1866 fix
= bytes
& (TILEGX_BUNDLE_SIZE_IN_BYTES
- 1);
1872 number_to_chars_littleendian (p
, nop
, 8);
1873 fragp
->fr_fix
+= fix
;
1874 fragp
->fr_var
= TILEGX_BUNDLE_SIZE_IN_BYTES
;
1877 /* Standard calling conventions leave the CFA at SP on entry. */
1879 tilegx_cfi_frame_initial_instructions (void)
1881 cfi_add_CFA_def_cfa_register (54);
1885 tc_tilegx_regname_to_dw2regnum (char *regname
)
1888 for (i
= 0; i
< TILEGX_NUM_REGISTERS
; i
++)
1890 if (!strcmp (regname
, tilegx_register_names
[i
]))