Improve TLS support on TILE-Gx/TILEPro:
[binutils.git] / gas / config / tc-tilepro.c
blob0b378c2f197543dae7c5a57ec61117e2a3053d80
1 /* tc-tilepro.c -- Assemble for a TILEPro chip.
2 Copyright 2011 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. */
21 #include "as.h"
22 #include "struc-symbol.h"
23 #include "subsegs.h"
25 #include "elf/tilepro.h"
26 #include "opcode/tilepro.h"
28 #include "dwarf2dbg.h"
29 #include "dw2gencfi.h"
31 #include "safe-ctype.h"
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
44 /* Generic assembler global variables which must be defined by all
45 targets. */
47 /* Characters which always start a comment. */
48 const char comment_chars[] = "#";
50 /* Characters which start a comment at the beginning of a line. */
51 const char line_comment_chars[] = "#";
53 /* Characters which may be used to separate multiple commands on a
54 single line. */
55 const char line_separator_chars[] = ";";
57 /* Characters which are used to indicate an exponent in a floating
58 point number. */
59 const char EXP_CHARS[] = "eE";
61 /* Characters which mean that a number is a floating point constant,
62 as in 0d1.0. */
63 const char FLT_CHARS[] = "rRsSfFdDxXpP";
65 const char *md_shortopts = "VQ:";
67 struct option md_longopts[] =
69 {NULL, no_argument, NULL, 0}
72 size_t md_longopts_size = sizeof (md_longopts);
74 int
75 md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
77 switch (c)
79 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
80 should be emitted or not. FIXME: Not implemented. */
81 case 'Q':
82 break;
84 /* -V: SVR4 argument to print version ID. */
85 case 'V':
86 print_version_id ();
87 break;
89 default:
90 return 0;
93 return 1;
96 void
97 md_show_usage (FILE *stream)
99 fprintf (stream, _("\
100 -Q ignored\n\
101 -V print assembler version number\n"));
104 /* Extra expression types. */
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 #define O_tls_le O_md17
123 #define O_tls_le_lo16 O_md18
124 #define O_tls_le_hi16 O_md19
125 #define O_tls_le_ha16 O_md20
126 #define O_tls_gd_call O_md21
127 #define O_tls_gd_add O_md22
128 #define O_tls_ie_load O_md23
130 static struct hash_control *special_operator_hash;
132 /* Hash tables for instruction mnemonic lookup. */
133 static struct hash_control *op_hash;
135 /* Hash table for spr lookup. */
136 static struct hash_control *spr_hash;
138 /* True temporarily while parsing an SPR expression. This changes the
139 * namespace to include SPR names. */
140 static int parsing_spr;
142 /* Are we currently inside `{ ... }'? */
143 static int inside_bundle;
145 struct tilepro_instruction
147 const struct tilepro_opcode *opcode;
148 tilepro_pipeline pipe;
149 expressionS operand_values[TILEPRO_MAX_OPERANDS];
152 /* This keeps track of the current bundle being built up. */
153 static struct tilepro_instruction
154 current_bundle[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE];
156 /* Index in current_bundle for the next instruction to parse. */
157 static int current_bundle_index;
159 /* Allow 'r63' in addition to 'zero', etc. Normally we disallow this as
160 'zero' is not a real register, so using it accidentally would be a
161 nasty bug. For other registers, such as 'sp', code using multiple names
162 for the same physical register is excessively confusing.
164 The '.require_canonical_reg_names' pseudo-op turns this error on,
165 and the '.no_require_canonical_reg_names' pseudo-op turns this off.
166 By default the error is on. */
167 static int require_canonical_reg_names;
169 /* Allow bundles that do undefined or suspicious things like write
170 two different values to the same register at the same time.
172 The '.no_allow_suspicious_bundles' pseudo-op turns this error on,
173 and the '.allow_suspicious_bundles' pseudo-op turns this off. */
174 static int allow_suspicious_bundles;
177 /* A hash table of main processor registers, mapping each register name
178 to its index.
180 Furthermore, if the register number is greater than the number
181 of registers for that processor, the user used an illegal alias
182 for that register (e.g. r63 instead of zero), so we should generate
183 a warning. The attempted register number can be found by clearing
184 NONCANONICAL_REG_NAME_FLAG. */
185 static struct hash_control *main_reg_hash;
188 /* We cannot unambiguously store a 0 in a hash table and look it up,
189 so we OR in this flag to every canonical register. */
190 #define CANONICAL_REG_NAME_FLAG 0x1000
192 /* By default we disallow register aliases like r63, but we record
193 them in the hash table in case the .no_require_canonical_reg_names
194 directive is used. Noncanonical names have this value added to them. */
195 #define NONCANONICAL_REG_NAME_FLAG 0x2000
197 /* Discards flags for register hash table entries and returns the
198 reg number. */
199 #define EXTRACT_REGNO(p) ((p) & 63)
201 /* This function is called once, at assembler startup time. It should
202 set up all the tables, etc., that the MD part of the assembler will
203 need. */
204 void
205 md_begin (void)
207 const struct tilepro_opcode *op;
208 int i;
210 /* Guarantee text section is aligned. */
211 bfd_set_section_alignment (stdoutput, text_section,
212 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
214 require_canonical_reg_names = 1;
215 allow_suspicious_bundles = 0;
216 current_bundle_index = 0;
217 inside_bundle = 0;
219 /* Initialize special operator hash table. */
220 special_operator_hash = hash_new ();
221 #define INSERT_SPECIAL_OP(name) \
222 hash_insert (special_operator_hash, #name, (void *)O_##name)
224 INSERT_SPECIAL_OP(lo16);
225 INSERT_SPECIAL_OP(hi16);
226 INSERT_SPECIAL_OP(ha16);
227 INSERT_SPECIAL_OP(got);
228 INSERT_SPECIAL_OP(got_lo16);
229 INSERT_SPECIAL_OP(got_hi16);
230 INSERT_SPECIAL_OP(got_ha16);
231 INSERT_SPECIAL_OP(plt);
232 INSERT_SPECIAL_OP(tls_gd);
233 INSERT_SPECIAL_OP(tls_gd_lo16);
234 INSERT_SPECIAL_OP(tls_gd_hi16);
235 INSERT_SPECIAL_OP(tls_gd_ha16);
236 INSERT_SPECIAL_OP(tls_ie);
237 INSERT_SPECIAL_OP(tls_ie_lo16);
238 INSERT_SPECIAL_OP(tls_ie_hi16);
239 INSERT_SPECIAL_OP(tls_ie_ha16);
240 INSERT_SPECIAL_OP(tls_le);
241 INSERT_SPECIAL_OP(tls_le_lo16);
242 INSERT_SPECIAL_OP(tls_le_hi16);
243 INSERT_SPECIAL_OP(tls_le_ha16);
244 INSERT_SPECIAL_OP(tls_gd_call);
245 INSERT_SPECIAL_OP(tls_gd_add);
246 INSERT_SPECIAL_OP(tls_ie_load);
247 #undef INSERT_SPECIAL_OP
249 /* Initialize op_hash hash table. */
250 op_hash = hash_new ();
251 for (op = &tilepro_opcodes[0]; op->name != NULL; op++)
253 const char *hash_err = hash_insert (op_hash, op->name, (void *)op);
254 if (hash_err != NULL)
256 as_fatal (_("Internal Error: Can't hash %s: %s"),
257 op->name, hash_err);
261 /* Initialize the spr hash table. */
262 parsing_spr = 0;
263 spr_hash = hash_new ();
264 for (i = 0; i < tilepro_num_sprs; i++)
265 hash_insert (spr_hash, tilepro_sprs[i].name,
266 (void *) &tilepro_sprs[i]);
268 /* Set up the main_reg_hash table. We use this instead of
269 * creating a symbol in the register section to avoid ambiguities
270 * with labels that have the same names as registers. */
271 main_reg_hash = hash_new ();
272 for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
274 char buf[64];
276 hash_insert (main_reg_hash, tilepro_register_names[i],
277 (void *) (long)(i | CANONICAL_REG_NAME_FLAG));
279 /* See if we should insert a noncanonical alias, like r63. */
280 sprintf (buf, "r%d", i);
281 if (strcmp (buf, tilepro_register_names[i]) != 0)
282 hash_insert (main_reg_hash, xstrdup (buf),
283 (void *) (long)(i | NONCANONICAL_REG_NAME_FLAG));
286 /* Insert obsolete backwards-compatibility register names. */
287 hash_insert (main_reg_hash, "io0",
288 (void *) (long) (TREG_IDN0 | CANONICAL_REG_NAME_FLAG));
289 hash_insert (main_reg_hash, "io1",
290 (void *) (long) (TREG_IDN1 | CANONICAL_REG_NAME_FLAG));
291 hash_insert (main_reg_hash, "us0",
292 (void *) (long) (TREG_UDN0 | CANONICAL_REG_NAME_FLAG));
293 hash_insert (main_reg_hash, "us1",
294 (void *) (long) (TREG_UDN1 | CANONICAL_REG_NAME_FLAG));
295 hash_insert (main_reg_hash, "us2",
296 (void *) (long) (TREG_UDN2 | CANONICAL_REG_NAME_FLAG));
297 hash_insert (main_reg_hash, "us3",
298 (void *) (long) (TREG_UDN3 | CANONICAL_REG_NAME_FLAG));
303 #define BUNDLE_TEMPLATE_MASK(p0, p1, p2) \
304 ((p0) | ((p1) << 8) | ((p2) << 16))
305 #define BUNDLE_TEMPLATE(p0, p1, p2) \
306 { { (p0), (p1), (p2) }, \
307 BUNDLE_TEMPLATE_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \
310 #define NO_PIPELINE TILEPRO_NUM_PIPELINE_ENCODINGS
312 struct bundle_template
314 tilepro_pipeline pipe[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE];
315 unsigned int pipe_mask;
318 static const struct bundle_template bundle_templates[] =
320 /* In Y format we must always have something in Y2, since it has
321 * no fnop, so this conveys that Y2 must always be used. */
322 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2, NO_PIPELINE),
323 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2, NO_PIPELINE),
324 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0, NO_PIPELINE),
325 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1, NO_PIPELINE),
327 /* Y format has three instructions. */
328 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2),
329 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1),
330 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2),
331 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0),
332 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y1),
333 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y0),
335 /* X format has only two instructions. */
336 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_X0, TILEPRO_PIPELINE_X1, NO_PIPELINE),
337 BUNDLE_TEMPLATE(TILEPRO_PIPELINE_X1, TILEPRO_PIPELINE_X0, NO_PIPELINE)
341 static void
342 prepend_nop_to_bundle (tilepro_mnemonic mnemonic)
344 memmove (&current_bundle[1], &current_bundle[0],
345 current_bundle_index * sizeof current_bundle[0]);
346 current_bundle[0].opcode = &tilepro_opcodes[mnemonic];
347 ++current_bundle_index;
351 static tilepro_bundle_bits
352 insert_operand (tilepro_bundle_bits bits,
353 const struct tilepro_operand *operand,
354 int operand_value,
355 char *file,
356 unsigned lineno)
358 /* Range-check the immediate. */
359 int num_bits = operand->num_bits;
361 operand_value >>= operand->rightshift;
363 if (bfd_check_overflow (operand->is_signed
364 ? complain_overflow_signed
365 : complain_overflow_unsigned,
366 num_bits,
368 bfd_arch_bits_per_address (stdoutput),
369 operand_value)
370 != bfd_reloc_ok)
372 offsetT min, max;
373 if (operand->is_signed)
375 min = -(1 << (num_bits - 1));
376 max = (1 << (num_bits - 1)) - 1;
378 else
380 min = 0;
381 max = (1 << num_bits) - 1;
383 as_bad_value_out_of_range (_("operand"), operand_value, min, max,
384 file, lineno);
387 /* Write out the bits for the immediate. */
388 return bits | operand->insert (operand_value);
392 static int
393 apply_special_operator (operatorT op, int num)
395 switch (op)
397 case O_lo16:
398 return (signed short)num;
400 case O_hi16:
401 return (signed short)(num >> 16);
403 case O_ha16:
404 return (signed short)((num + 0x8000) >> 16);
406 default:
407 abort ();
412 static tilepro_bundle_bits
413 emit_tilepro_instruction (tilepro_bundle_bits bits,
414 int num_operands,
415 const unsigned char *operands,
416 expressionS *operand_values,
417 char *bundle_start)
419 int i;
421 for (i = 0; i < num_operands; i++)
423 const struct tilepro_operand *operand =
424 &tilepro_operands[operands[i]];
425 expressionS *operand_exp = &operand_values[i];
426 int is_pc_relative = operand->is_pc_relative;
428 if (operand_exp->X_op == O_register
429 || (operand_exp->X_op == O_constant && !is_pc_relative))
431 /* We know what the bits are right now, so insert them. */
432 bits = insert_operand (bits, operand, operand_exp->X_add_number,
433 NULL, 0);
435 else
437 bfd_reloc_code_real_type reloc = operand->default_reloc;
438 expressionS subexp;
439 int die = 0, use_subexp = 0, require_symbol = 0;
440 fixS *fixP;
442 /* Take an expression like hi16(x) and turn it into x with
443 a different reloc type. */
444 switch (operand_exp->X_op)
446 #define HANDLE_OP16(suffix) \
447 switch (reloc) \
449 case BFD_RELOC_TILEPRO_IMM16_X0: \
450 reloc = BFD_RELOC_TILEPRO_IMM16_X0_##suffix; \
451 break; \
452 case BFD_RELOC_TILEPRO_IMM16_X1: \
453 reloc = BFD_RELOC_TILEPRO_IMM16_X1_##suffix; \
454 break; \
455 default: \
456 die = 1; \
457 break; \
459 use_subexp = 1
461 case O_lo16:
462 HANDLE_OP16 (LO);
463 break;
465 case O_hi16:
466 HANDLE_OP16 (HI);
467 break;
469 case O_ha16:
470 HANDLE_OP16 (HA);
471 break;
473 case O_got:
474 HANDLE_OP16 (GOT);
475 require_symbol = 1;
476 break;
478 case O_got_lo16:
479 HANDLE_OP16 (GOT_LO);
480 require_symbol = 1;
481 break;
483 case O_got_hi16:
484 HANDLE_OP16 (GOT_HI);
485 require_symbol = 1;
486 break;
488 case O_got_ha16:
489 HANDLE_OP16 (GOT_HA);
490 require_symbol = 1;
491 break;
493 case O_tls_gd:
494 HANDLE_OP16 (TLS_GD);
495 require_symbol = 1;
496 break;
498 case O_tls_gd_lo16:
499 HANDLE_OP16 (TLS_GD_LO);
500 require_symbol = 1;
501 break;
503 case O_tls_gd_hi16:
504 HANDLE_OP16 (TLS_GD_HI);
505 require_symbol = 1;
506 break;
508 case O_tls_gd_ha16:
509 HANDLE_OP16 (TLS_GD_HA);
510 require_symbol = 1;
511 break;
513 case O_tls_ie:
514 HANDLE_OP16 (TLS_IE);
515 require_symbol = 1;
516 break;
518 case O_tls_ie_lo16:
519 HANDLE_OP16 (TLS_IE_LO);
520 require_symbol = 1;
521 break;
523 case O_tls_ie_hi16:
524 HANDLE_OP16 (TLS_IE_HI);
525 require_symbol = 1;
526 break;
528 case O_tls_ie_ha16:
529 HANDLE_OP16 (TLS_IE_HA);
530 require_symbol = 1;
531 break;
533 case O_tls_le:
534 HANDLE_OP16 (TLS_LE);
535 require_symbol = 1;
536 break;
538 case O_tls_le_lo16:
539 HANDLE_OP16 (TLS_LE_LO);
540 require_symbol = 1;
541 break;
543 case O_tls_le_hi16:
544 HANDLE_OP16 (TLS_LE_HI);
545 require_symbol = 1;
546 break;
548 case O_tls_le_ha16:
549 HANDLE_OP16 (TLS_LE_HA);
550 require_symbol = 1;
551 break;
553 #undef HANDLE_OP16
555 case O_plt:
556 switch (reloc)
558 case BFD_RELOC_TILEPRO_JOFFLONG_X1:
559 reloc = BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT;
560 break;
561 default:
562 die = 1;
563 break;
565 use_subexp = 1;
566 require_symbol = 1;
567 break;
569 case O_tls_gd_call:
570 switch (reloc)
572 case BFD_RELOC_TILEPRO_JOFFLONG_X1:
573 reloc = BFD_RELOC_TILEPRO_TLS_GD_CALL;
574 break;
575 default:
576 die = 1;
577 break;
579 use_subexp = 1;
580 require_symbol = 1;
581 break;
583 case O_tls_gd_add:
584 switch (reloc)
586 case BFD_RELOC_TILEPRO_IMM8_X0:
587 reloc = BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD;
588 break;
589 case BFD_RELOC_TILEPRO_IMM8_X1:
590 reloc = BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD;
591 break;
592 case BFD_RELOC_TILEPRO_IMM8_Y0:
593 reloc = BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD;
594 break;
595 case BFD_RELOC_TILEPRO_IMM8_Y1:
596 reloc = BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD;
597 break;
598 default:
599 die = 1;
600 break;
602 use_subexp = 1;
603 require_symbol = 1;
604 break;
606 case O_tls_ie_load:
607 switch (reloc)
609 case BFD_RELOC_TILEPRO_IMM8_X1:
610 reloc = BFD_RELOC_TILEPRO_TLS_IE_LOAD;
611 break;
612 default:
613 die = 1;
614 break;
616 use_subexp = 1;
617 require_symbol = 1;
618 break;
620 default:
621 /* Do nothing. */
622 break;
625 if (die)
627 as_bad (_("Invalid operator for operand."));
629 else if (use_subexp)
631 /* Now that we've changed the reloc, change ha16(x) into x,
632 etc. */
634 if (operand_exp->X_add_symbol->sy_value.X_md)
636 /* HACK: We used X_md to mark this symbol as a fake wrapper
637 around a real expression. To unwrap it, we just grab its
638 value here. */
639 operand_exp = &operand_exp->X_add_symbol->sy_value;
641 if (require_symbol)
643 /* Look at the expression, and reject it if it's not a
644 plain symbol. */
645 if (operand_exp->X_op != O_symbol
646 || operand_exp->X_add_number != 0)
647 as_bad (_("Operator may only be applied to symbols."));
650 else
652 /* The value of this expression is an actual symbol, so
653 turn that into an expression. */
654 memset (&subexp, 0, sizeof subexp);
655 subexp.X_op = O_symbol;
656 subexp.X_add_symbol = operand_exp->X_add_symbol;
657 operand_exp = &subexp;
661 /* Create a fixup to handle this later. */
662 fixP = fix_new_exp (frag_now,
663 bundle_start - frag_now->fr_literal,
664 (operand->num_bits + 7) >> 3,
665 operand_exp,
666 is_pc_relative,
667 reloc);
668 fixP->tc_fix_data = operand;
670 /* Don't do overflow checking if we are applying a function like
671 ha16. */
672 fixP->fx_no_overflow |= use_subexp;
675 return bits;
679 /* Detects and complains if two instructions in current_bundle write
680 to the same register, either implicitly or explicitly, or if a
681 read-only register is written. */
682 static void
683 check_illegal_reg_writes (void)
685 BFD_HOST_U_64_BIT all_regs_written = 0;
686 int j;
688 for (j = 0; j < current_bundle_index; j++)
690 const struct tilepro_instruction *instr = &current_bundle[j];
691 int k;
692 BFD_HOST_U_64_BIT regs =
693 ((BFD_HOST_U_64_BIT)1) << instr->opcode->implicitly_written_register;
694 BFD_HOST_U_64_BIT conflict;
696 for (k = 0; k < instr->opcode->num_operands; k++)
698 const struct tilepro_operand *operand =
699 &tilepro_operands[instr->opcode->operands[instr->pipe][k]];
701 if (operand->is_dest_reg)
703 int regno = instr->operand_values[k].X_add_number;
704 BFD_HOST_U_64_BIT mask = ((BFD_HOST_U_64_BIT)1) << regno;
706 if ((mask & ( (((BFD_HOST_U_64_BIT)1) << TREG_IDN1)
707 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN1)
708 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN2)
709 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN3))) != 0
710 && !allow_suspicious_bundles)
712 as_bad (_("Writes to register '%s' are not allowed."),
713 tilepro_register_names[regno]);
716 regs |= mask;
720 /* Writing to the zero register doesn't count. */
721 regs &= ~(((BFD_HOST_U_64_BIT)1) << TREG_ZERO);
723 conflict = all_regs_written & regs;
724 if (conflict != 0 && !allow_suspicious_bundles)
726 /* Find which register caused the conflict. */
727 const char *conflicting_reg_name = "???";
728 int i;
730 for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
732 if (((conflict >> i) & 1) != 0)
734 conflicting_reg_name = tilepro_register_names[i];
735 break;
739 as_bad (_("Two instructions in the same bundle both write "
740 "to register %s, which is not allowed."),
741 conflicting_reg_name);
744 all_regs_written |= regs;
749 static void
750 tilepro_flush_bundle (void)
752 unsigned i;
753 int j, addr_mod;
754 unsigned compatible_pipes;
755 const struct bundle_template *match;
756 char *f;
758 inside_bundle = 0;
760 switch (current_bundle_index)
762 case 0:
763 /* No instructions. */
764 return;
765 case 1:
766 if (current_bundle[0].opcode->can_bundle)
768 /* Simplify later logic by adding an explicit fnop. */
769 prepend_nop_to_bundle (TILEPRO_OPC_FNOP);
771 else
773 /* This instruction cannot be bundled with anything else.
774 Prepend an explicit 'nop', rather than an 'fnop', because
775 fnops can be replaced by later binary-processing tools
776 while nops cannot. */
777 prepend_nop_to_bundle (TILEPRO_OPC_NOP);
779 break;
780 default:
781 if (!allow_suspicious_bundles)
783 /* Make sure all instructions can be bundled with other
784 instructions. */
785 const struct tilepro_opcode *cannot_bundle = NULL;
786 bfd_boolean seen_non_nop = FALSE;
788 for (j = 0; j < current_bundle_index; j++)
790 const struct tilepro_opcode *op = current_bundle[j].opcode;
792 if (!op->can_bundle && cannot_bundle == NULL)
793 cannot_bundle = op;
794 else if (op->mnemonic != TILEPRO_OPC_NOP
795 && op->mnemonic != TILEPRO_OPC_INFO
796 && op->mnemonic != TILEPRO_OPC_INFOL)
797 seen_non_nop = TRUE;
800 if (cannot_bundle != NULL && seen_non_nop)
802 current_bundle_index = 0;
803 as_bad (_("'%s' may not be bundled with other instructions."),
804 cannot_bundle->name);
805 return;
808 break;
811 compatible_pipes =
812 BUNDLE_TEMPLATE_MASK(current_bundle[0].opcode->pipes,
813 current_bundle[1].opcode->pipes,
814 (current_bundle_index == 3
815 ? current_bundle[2].opcode->pipes
816 : (1 << NO_PIPELINE)));
818 /* Find a template that works, if any. */
819 match = NULL;
820 for (i = 0; i < sizeof bundle_templates / sizeof bundle_templates[0]; i++)
822 const struct bundle_template *b = &bundle_templates[i];
823 if ((b->pipe_mask & compatible_pipes) == b->pipe_mask)
825 match = b;
826 break;
830 if (match == NULL)
832 current_bundle_index = 0;
833 as_bad (_("Invalid combination of instructions for bundle."));
834 return;
837 /* If the section seems to have no alignment set yet, go ahead and
838 make it large enough to hold code. */
839 if (bfd_get_section_alignment (stdoutput, now_seg) == 0)
840 bfd_set_section_alignment (stdoutput, now_seg,
841 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
843 for (j = 0; j < current_bundle_index; j++)
844 current_bundle[j].pipe = match->pipe[j];
846 if (current_bundle_index == 2 && !tilepro_is_x_pipeline(match->pipe[0]))
848 /* We are in Y mode with only two instructions, so add an FNOP. */
849 prepend_nop_to_bundle (TILEPRO_OPC_FNOP);
851 /* Figure out what pipe the fnop must be in via arithmetic.
852 * p0 + p1 + p2 must sum to the sum of TILEPRO_PIPELINE_Y[012]. */
853 current_bundle[0].pipe =
854 (tilepro_pipeline)((TILEPRO_PIPELINE_Y0
855 + TILEPRO_PIPELINE_Y1
856 + TILEPRO_PIPELINE_Y2) -
857 (current_bundle[1].pipe + current_bundle[2].pipe));
860 check_illegal_reg_writes ();
862 f = frag_more (TILEPRO_BUNDLE_SIZE_IN_BYTES);
864 /* Check to see if this bundle is at an offset that is a multiple of 8-bytes
865 from the start of the frag. */
866 addr_mod = frag_now_fix () & (TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES - 1);
867 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
868 as_bad (_("instruction address is not a multiple of 8"));
869 frag_now->insn_addr = addr_mod;
870 frag_now->has_code = 1;
872 tilepro_bundle_bits bits = 0;
873 for (j = 0; j < current_bundle_index; j++)
875 struct tilepro_instruction *instr = &current_bundle[j];
876 tilepro_pipeline pipeline = instr->pipe;
877 const struct tilepro_opcode *opcode = instr->opcode;
879 bits |= emit_tilepro_instruction (opcode->fixed_bit_values[pipeline],
880 opcode->num_operands,
881 &opcode->operands[pipeline][0],
882 instr->operand_values,
886 number_to_chars_littleendian (f, (unsigned int)bits, 4);
887 number_to_chars_littleendian (f + 4, (unsigned int)(bits >> 32), 4);
888 current_bundle_index = 0;
890 /* Emit DWARF2 debugging information. */
891 dwarf2_emit_insn (TILEPRO_BUNDLE_SIZE_IN_BYTES);
895 /* Extend the expression parser to handle hi16(label), etc.
896 as well as SPR names when in the context of parsing an SPR. */
898 tilepro_parse_name (char *name, expressionS *e, char *nextcharP)
900 operatorT op = O_illegal;
902 if (parsing_spr)
904 void *val = hash_find (spr_hash, name);
905 if (val == NULL)
906 return 0;
908 memset (e, 0, sizeof *e);
909 e->X_op = O_constant;
910 e->X_add_number = ((const struct tilepro_spr *)val)->number;
911 return 1;
914 if (*nextcharP != '(')
916 /* hi16, etc. not followed by a paren is just a label with that
917 name. */
918 return 0;
920 else
922 /* Look up the operator in our table. */
923 void *val = hash_find (special_operator_hash, name);
924 if (val == 0)
925 return 0;
926 op = (operatorT)(long)val;
929 /* Restore old '(' and skip it. */
930 *input_line_pointer = '(';
931 ++input_line_pointer;
933 expression (e);
935 if (*input_line_pointer != ')')
937 as_bad (_("Missing ')'"));
938 *nextcharP = *input_line_pointer;
939 return 0;
941 /* Skip ')'. */
942 ++input_line_pointer;
944 if (e->X_op == O_register || e->X_op == O_absent)
946 as_bad (_("Invalid expression."));
947 e->X_op = O_constant;
948 e->X_add_number = 0;
950 else
952 /* Wrap subexpression with a unary operator. */
953 symbolS *sym = make_expr_symbol (e);
955 if (sym != e->X_add_symbol)
957 /* HACK: mark this symbol as a temporary wrapper around a proper
958 expression, so we can unwrap it later once we have communicated
959 the relocation type. */
960 sym->sy_value.X_md = 1;
963 memset (e, 0, sizeof *e);
964 e->X_op = op;
965 e->X_add_symbol = sym;
966 e->X_add_number = 0;
969 *nextcharP = *input_line_pointer;
970 return 1;
974 /* Parses an expression which must be a register name. */
976 static void
977 parse_reg_expression (expressionS* expression)
979 /* Zero everything to make sure we don't miss any flags. */
980 memset (expression, 0, sizeof *expression);
982 char* regname = input_line_pointer;
983 char terminating_char = get_symbol_end ();
985 void* pval = hash_find (main_reg_hash, regname);
987 if (pval == NULL)
988 as_bad (_("Expected register, got '%s'."), regname);
990 int regno_and_flags = (int)(size_t)pval;
991 int regno = EXTRACT_REGNO(regno_and_flags);
993 if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
994 && require_canonical_reg_names)
995 as_warn (_("Found use of non-canonical register name %s; "
996 "use %s instead."),
997 regname, tilepro_register_names[regno]);
999 /* Restore the old character following the register name. */
1000 *input_line_pointer = terminating_char;
1002 /* Fill in the expression fields to indicate it's a register. */
1003 expression->X_op = O_register;
1004 expression->X_add_number = regno;
1008 /* Parses and type-checks comma-separated operands in input_line_pointer. */
1009 static void
1010 parse_operands (const char *opcode_name,
1011 const unsigned char *operands,
1012 int num_operands,
1013 expressionS *operand_values)
1015 int i;
1017 memset (operand_values, 0, num_operands * sizeof operand_values[0]);
1019 SKIP_WHITESPACE ();
1020 for (i = 0; i < num_operands; i++)
1022 tilepro_operand_type type = tilepro_operands[operands[i]].type;
1024 SKIP_WHITESPACE ();
1026 if (type == TILEPRO_OP_TYPE_REGISTER)
1028 parse_reg_expression (&operand_values[i]);
1030 else if (*input_line_pointer == '}')
1032 operand_values[i].X_op = O_absent;
1034 else if (type == TILEPRO_OP_TYPE_SPR)
1036 /* Modify the expression parser to add SPRs to the namespace. */
1037 parsing_spr = 1;
1038 expression (&operand_values[i]);
1039 parsing_spr = 0;
1041 else
1043 expression (&operand_values[i]);
1046 SKIP_WHITESPACE ();
1048 if (i + 1 < num_operands)
1050 int separator = (unsigned char)*input_line_pointer++;
1052 if (is_end_of_line[separator] || (separator == '}'))
1054 as_bad (_("Too few operands to '%s'."), opcode_name);
1055 return;
1057 else if (separator != ',')
1059 as_bad (_("Unexpected character '%c' after operand %d to %s."),
1060 (char)separator, i + 1, opcode_name);
1061 return;
1065 /* Arbitrarily use the first valid pipe to get the operand type,
1066 since they are all the same. */
1067 switch (tilepro_operands[operands[i]].type)
1069 case TILEPRO_OP_TYPE_REGISTER:
1070 /* Handled in parse_reg_expression already. */
1071 break;
1072 case TILEPRO_OP_TYPE_SPR:
1073 /* Fall through */
1074 case TILEPRO_OP_TYPE_IMMEDIATE:
1075 /* Fall through */
1076 case TILEPRO_OP_TYPE_ADDRESS:
1077 if ( operand_values[i].X_op == O_register
1078 || operand_values[i].X_op == O_illegal
1079 || operand_values[i].X_op == O_absent)
1080 as_bad (_("Expected immediate expression"));
1081 break;
1082 default:
1083 abort ();
1087 if (!is_end_of_line[(unsigned char)*input_line_pointer])
1089 switch (*input_line_pointer)
1091 case '}':
1092 if (!inside_bundle)
1093 as_bad (_("Found '}' when not bundling."));
1094 ++input_line_pointer;
1095 inside_bundle = 0;
1096 demand_empty_rest_of_line ();
1097 break;
1099 case ',':
1100 as_bad (_("Too many operands"));
1101 break;
1103 default:
1104 /* Use default error for unrecognized garbage. */
1105 demand_empty_rest_of_line ();
1106 break;
1112 /* This is the guts of the machine-dependent assembler. STR points to a
1113 machine dependent instruction. This function is supposed to emit
1114 the frags/bytes it assembles to. */
1115 void
1116 md_assemble (char *str)
1118 char old_char;
1119 size_t opname_len;
1120 char *old_input_line_pointer;
1121 const struct tilepro_opcode *op;
1122 int first_pipe;
1124 /* Split off the opcode and look it up. */
1125 opname_len = strcspn (str, " {}");
1126 old_char = str[opname_len];
1127 str[opname_len] = '\0';
1129 op = hash_find(op_hash, str);
1130 str[opname_len] = old_char;
1131 if (op == NULL)
1133 as_bad (_("Unknown opcode `%.*s'."), (int)opname_len, str);
1134 return;
1137 /* Prepare to parse the operands. */
1138 old_input_line_pointer = input_line_pointer;
1139 input_line_pointer = str + opname_len;
1140 SKIP_WHITESPACE ();
1142 if (current_bundle_index == TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE)
1144 as_bad (_("Too many instructions for bundle."));
1145 tilepro_flush_bundle ();
1148 /* Make sure we have room for the upcoming bundle before we
1149 create any fixups. Otherwise if we have to switch to a new
1150 frag the fixup dot_value fields will be wrong. */
1151 frag_grow (TILEPRO_BUNDLE_SIZE_IN_BYTES);
1153 /* Find a valid pipe for this opcode. */
1154 for (first_pipe = 0; (op->pipes & (1 << first_pipe)) == 0; first_pipe++)
1157 /* Call the function that assembles this instruction. */
1158 current_bundle[current_bundle_index].opcode = op;
1159 parse_operands (op->name,
1160 &op->operands[first_pipe][0],
1161 op->num_operands,
1162 current_bundle[current_bundle_index].operand_values);
1163 ++current_bundle_index;
1165 /* Restore the saved value of input_line_pointer. */
1166 input_line_pointer = old_input_line_pointer;
1168 /* If we weren't inside curly braces, go ahead and emit
1169 this lone instruction as a bundle right now. */
1170 if (!inside_bundle)
1171 tilepro_flush_bundle ();
1174 static void
1175 s_require_canonical_reg_names (int require)
1177 demand_empty_rest_of_line ();
1178 require_canonical_reg_names = require;
1181 static void
1182 s_allow_suspicious_bundles (int allow)
1184 demand_empty_rest_of_line ();
1185 allow_suspicious_bundles = allow;
1188 const pseudo_typeS md_pseudo_table[] =
1190 {"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */
1191 {"word", cons, 4},
1192 {"require_canonical_reg_names", s_require_canonical_reg_names, 1 },
1193 {"no_require_canonical_reg_names", s_require_canonical_reg_names, 0 },
1194 {"allow_suspicious_bundles", s_allow_suspicious_bundles, 1 },
1195 {"no_allow_suspicious_bundles", s_allow_suspicious_bundles, 0 },
1196 { NULL, 0, 0 }
1199 /* Equal to MAX_PRECISION in atof-ieee.c */
1200 #define MAX_LITTLENUMS 6
1202 /* Turn the string pointed to by litP into a floating point constant
1203 of type TYPE, and emit the appropriate bytes. The number of
1204 LITTLENUMS emitted is stored in *SIZEP. An error message is
1205 returned, or NULL on OK. */
1207 char *
1208 md_atof (int type, char *litP, int *sizeP)
1210 int prec;
1211 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1212 LITTLENUM_TYPE *wordP;
1213 char *t;
1215 switch (type)
1217 case 'f':
1218 case 'F':
1219 prec = 2;
1220 break;
1222 case 'd':
1223 case 'D':
1224 prec = 4;
1225 break;
1227 default:
1228 *sizeP = 0;
1229 return _("Bad call to md_atof ()");
1231 t = atof_ieee (input_line_pointer, type, words);
1232 if (t)
1233 input_line_pointer = t;
1235 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1236 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
1237 the bigendian 386. */
1238 for (wordP = words + prec - 1; prec--;)
1240 md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
1241 litP += sizeof (LITTLENUM_TYPE);
1243 return 0;
1247 /* We have no need to default values of symbols. */
1249 symbolS *
1250 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1252 return NULL;
1256 void
1257 tilepro_cons_fix_new (fragS *frag,
1258 int where,
1259 int nbytes,
1260 expressionS *exp)
1262 expressionS subexp;
1263 bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
1264 int no_overflow = 0;
1265 fixS *fixP;
1267 /* See if it's one of our special functions. */
1268 switch (exp->X_op)
1270 case O_lo16:
1271 reloc = BFD_RELOC_LO16;
1272 no_overflow = 1;
1273 break;
1274 case O_hi16:
1275 reloc = BFD_RELOC_HI16;
1276 no_overflow = 1;
1277 break;
1278 case O_ha16:
1279 reloc = BFD_RELOC_HI16_S;
1280 no_overflow = 1;
1281 break;
1283 default:
1284 /* Do nothing. */
1285 break;
1288 if (reloc != BFD_RELOC_NONE)
1290 if (nbytes != 2)
1292 as_bad (_("This operator only produces two byte values."));
1293 nbytes = 2;
1296 memset (&subexp, 0, sizeof subexp);
1297 subexp.X_op = O_symbol;
1298 subexp.X_add_symbol = exp->X_add_symbol;
1299 exp = &subexp;
1301 else
1303 switch (nbytes)
1305 case 1:
1306 reloc = BFD_RELOC_8;
1307 break;
1308 case 2:
1309 reloc = BFD_RELOC_16;
1310 break;
1311 case 4:
1312 reloc = BFD_RELOC_32;
1313 break;
1314 case 8:
1315 reloc = BFD_RELOC_64;
1316 break;
1317 default:
1318 as_bad (_("unsupported BFD relocation size %d"), nbytes);
1319 reloc = BFD_RELOC_32;
1320 break;
1324 fixP = fix_new_exp (frag, where, nbytes, exp, 0, reloc);
1325 fixP->tc_fix_data = NULL;
1326 fixP->fx_no_overflow |= no_overflow;
1330 void
1331 md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
1333 const struct tilepro_operand *operand;
1334 valueT value = *valP;
1335 char *p;
1337 /* Leave these for the linker. */
1338 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1339 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1340 return;
1342 if (fixP->fx_subsy != (symbolS *) NULL)
1344 /* We can't actually support subtracting a symbol. */
1345 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1348 /* Correct relocation types for pc-relativeness. */
1349 switch (fixP->fx_r_type)
1351 #define FIX_PCREL(rtype) \
1352 case rtype: \
1353 if (fixP->fx_pcrel) \
1354 fixP->fx_r_type = rtype##_PCREL; \
1355 break; \
1357 case rtype##_PCREL: \
1358 if (!fixP->fx_pcrel) \
1359 fixP->fx_r_type = rtype; \
1360 break
1362 FIX_PCREL (BFD_RELOC_8);
1363 FIX_PCREL (BFD_RELOC_16);
1364 FIX_PCREL (BFD_RELOC_32);
1365 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0);
1366 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1);
1367 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_LO);
1368 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_LO);
1369 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_HI);
1370 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_HI);
1371 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_HA);
1372 FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_HA);
1374 #undef FIX_PCREL
1376 default:
1377 /* Do nothing */
1378 break;
1381 if (fixP->fx_addsy != NULL)
1383 #ifdef OBJ_ELF
1384 switch (fixP->fx_r_type)
1386 case BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD:
1387 case BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD:
1388 case BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD:
1389 case BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD:
1390 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD:
1391 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD:
1392 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO:
1393 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO:
1394 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI:
1395 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI:
1396 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA:
1397 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA:
1398 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE:
1399 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE:
1400 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO:
1401 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO:
1402 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI:
1403 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI:
1404 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA:
1405 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA:
1406 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE:
1407 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE:
1408 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO:
1409 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO:
1410 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI:
1411 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI:
1412 case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA:
1413 case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA:
1414 case BFD_RELOC_TILEPRO_TLS_GD_CALL:
1415 case BFD_RELOC_TILEPRO_TLS_IE_LOAD:
1416 case BFD_RELOC_TILEPRO_TLS_DTPMOD32:
1417 case BFD_RELOC_TILEPRO_TLS_DTPOFF32:
1418 case BFD_RELOC_TILEPRO_TLS_TPOFF32:
1419 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1420 break;
1422 default:
1423 /* Do nothing */
1424 break;
1426 #endif
1427 return;
1430 /* Apply lo16, hi16, ha16, etc. munging. */
1431 switch (fixP->fx_r_type)
1433 case BFD_RELOC_LO16:
1434 case BFD_RELOC_TILEPRO_IMM16_X0_LO:
1435 case BFD_RELOC_TILEPRO_IMM16_X1_LO:
1436 case BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL:
1437 case BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL:
1438 *valP = value = apply_special_operator (O_lo16, value);
1439 break;
1441 case BFD_RELOC_HI16:
1442 case BFD_RELOC_TILEPRO_IMM16_X0_HI:
1443 case BFD_RELOC_TILEPRO_IMM16_X1_HI:
1444 case BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL:
1445 case BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL:
1446 *valP = value = apply_special_operator (O_hi16, value);
1447 break;
1449 case BFD_RELOC_HI16_S:
1450 case BFD_RELOC_TILEPRO_IMM16_X0_HA:
1451 case BFD_RELOC_TILEPRO_IMM16_X1_HA:
1452 case BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL:
1453 case BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL:
1454 *valP = value = apply_special_operator (O_ha16, value);
1455 break;
1457 default:
1458 /* Do nothing */
1459 break;
1462 p = fixP->fx_frag->fr_literal + fixP->fx_where;
1464 operand = fixP->tc_fix_data;
1465 if (operand != NULL)
1467 /* It's an instruction operand. */
1468 tilepro_bundle_bits bits =
1469 insert_operand (0, operand, value, fixP->fx_file, fixP->fx_line);
1471 /* Note that we might either be writing out bits for a bundle or a
1472 static network instruction, which are different sizes, so it's
1473 important to stop touching memory once we run out of bits. ORing in
1474 values is OK since we know the existing bits for this operand are
1475 zero. */
1476 for (; bits != 0; bits >>= 8)
1477 *p++ |= (char)bits;
1479 else
1481 /* Some other kind of relocation. */
1482 switch (fixP->fx_r_type)
1484 case BFD_RELOC_8:
1485 case BFD_RELOC_8_PCREL:
1486 md_number_to_chars (p, value, 1);
1487 break;
1489 case BFD_RELOC_16:
1490 case BFD_RELOC_16_PCREL:
1491 md_number_to_chars (p, value, 2);
1492 break;
1494 case BFD_RELOC_32:
1495 case BFD_RELOC_32_PCREL:
1496 md_number_to_chars (p, value, 4);
1497 break;
1499 default:
1500 /* Leave it for the linker. */
1501 return;
1505 fixP->fx_done = 1;
1509 /* Generate the BFD reloc to be stuck in the object file from the
1510 fixup used internally in the assembler. */
1512 arelent *
1513 tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp)
1515 arelent *reloc;
1517 reloc = (arelent *) xmalloc (sizeof (arelent));
1518 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1519 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1520 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1522 /* Make sure none of our internal relocations make it this far.
1523 They'd better have been fully resolved by this point. */
1524 gas_assert ((int) fixp->fx_r_type > 0);
1526 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1527 if (reloc->howto == NULL)
1529 as_bad_where (fixp->fx_file, fixp->fx_line,
1530 _("cannot represent `%s' relocation in object file"),
1531 bfd_get_reloc_code_name (fixp->fx_r_type));
1532 return NULL;
1535 if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
1537 as_fatal (_("internal error? cannot generate `%s' relocation (%d, %d)"),
1538 bfd_get_reloc_code_name (fixp->fx_r_type),
1539 fixp->fx_pcrel, reloc->howto->pc_relative);
1541 gas_assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
1543 reloc->addend = fixp->fx_offset;
1545 return reloc;
1549 /* The location from which a PC relative jump should be calculated,
1550 given a PC relative reloc. */
1552 long
1553 md_pcrel_from (fixS *fixP)
1555 return fixP->fx_frag->fr_address + fixP->fx_where;
1559 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
1560 a section symbol plus some offset. */
1562 tilepro_fix_adjustable (fixS *fix)
1564 /* Prevent all adjustments to global symbols */
1565 if (S_IS_EXTERNAL (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
1566 return 0;
1568 return 1;
1573 tilepro_unrecognized_line (int ch)
1575 switch (ch)
1577 case '{':
1578 if (inside_bundle)
1580 as_bad (_("Found '{' when already bundling."));
1582 else
1584 inside_bundle = 1;
1585 current_bundle_index = 0;
1587 return 1;
1589 case '}':
1590 if (!inside_bundle)
1592 as_bad (_("Found '}' when not bundling."));
1594 else
1596 tilepro_flush_bundle ();
1599 /* Allow '{' to follow on the same line. We also allow ";;", but that
1600 happens automatically because ';' is an end of line marker. */
1601 SKIP_WHITESPACE ();
1602 if (input_line_pointer[0] == '{')
1604 input_line_pointer++;
1605 return tilepro_unrecognized_line ('{');
1608 demand_empty_rest_of_line ();
1609 return 1;
1611 default:
1612 break;
1615 /* Not a valid line. */
1616 return 0;
1620 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
1621 of an rs_align_code fragment. */
1623 void
1624 tilepro_handle_align (fragS *fragp)
1626 int bytes, fix;
1627 char *p;
1629 if (fragp->fr_type != rs_align_code)
1630 return;
1632 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
1633 p = fragp->fr_literal + fragp->fr_fix;
1634 fix = 0;
1636 /* Determine the bits for NOP. */
1637 const struct tilepro_opcode *nop_opcode =
1638 &tilepro_opcodes[TILEPRO_OPC_NOP];
1639 tilepro_bundle_bits nop =
1640 ( nop_opcode->fixed_bit_values[TILEPRO_PIPELINE_X0]
1641 | nop_opcode->fixed_bit_values[TILEPRO_PIPELINE_X1]);
1643 if ((bytes & (TILEPRO_BUNDLE_SIZE_IN_BYTES - 1)) != 0)
1645 fix = bytes & (TILEPRO_BUNDLE_SIZE_IN_BYTES - 1);
1646 memset (p, 0, fix);
1647 p += fix;
1648 bytes -= fix;
1651 number_to_chars_littleendian (p, (unsigned int)nop, 4);
1652 number_to_chars_littleendian (p + 4, (unsigned int)(nop >> 32), 4);
1653 fragp->fr_fix += fix;
1654 fragp->fr_var = TILEPRO_BUNDLE_SIZE_IN_BYTES;
1657 /* Standard calling conventions leave the CFA at SP on entry. */
1658 void
1659 tilepro_cfi_frame_initial_instructions (void)
1661 cfi_add_CFA_def_cfa_register (54);
1665 tc_tilepro_regname_to_dw2regnum (char *regname)
1667 int i;
1669 for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
1671 if (!strcmp (regname, tilepro_register_names[i]))
1672 return i;
1675 return -1;