]> Git Repo - binutils.git/blob - gas/config/tc-tilegx.c
Automatic date update in version.in
[binutils.git] / gas / config / tc-tilegx.c
1 /* tc-tilegx.c -- Assemble for a Tile-Gx chip.
2    Copyright (C) 2011-2022 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 "subsegs.h"
23
24 #include "elf/tilegx.h"
25 #include "opcode/tilegx.h"
26
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
29
30 #include "safe-ctype.h"
31
32
33 /* Special registers.  */
34 #define TREG_IDN0     57
35 #define TREG_IDN1     58
36 #define TREG_UDN0     59
37 #define TREG_UDN1     60
38 #define TREG_UDN2     61
39 #define TREG_UDN3     62
40 #define TREG_ZERO     63
41
42
43 /* Generic assembler global variables which must be defined by all
44    targets.  */
45
46 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
47 int tilegx_cie_data_alignment;
48
49 /* Characters which always start a comment.  */
50 const char comment_chars[] = "#";
51
52 /* Characters which start a comment at the beginning of a line.  */
53 const char line_comment_chars[] = "#";
54
55 /* Characters which may be used to separate multiple commands on a
56    single line.  */
57 const char line_separator_chars[] = ";";
58
59 /* Characters which are used to indicate an exponent in a floating
60    point number.  */
61 const char EXP_CHARS[] = "eE";
62
63 /* Characters which mean that a number is a floating point constant,
64    as in 0d1.0.  */
65 const char FLT_CHARS[] = "rRsSfFdDxXpP";
66
67 /* Either 32 or 64.  */
68 static int tilegx_arch_size = 64;
69
70
71 const char *
72 tilegx_target_format (void)
73 {
74     if (target_big_endian) {
75         return tilegx_arch_size == 64 ? "elf64-tilegx-be" : "elf32-tilegx-be";
76     } else {
77         return tilegx_arch_size == 64 ? "elf64-tilegx-le" : "elf32-tilegx-le";
78     }
79 }
80
81
82 #define OPTION_32 (OPTION_MD_BASE + 0)
83 #define OPTION_64 (OPTION_MD_BASE + 1)
84 #define OPTION_EB (OPTION_MD_BASE + 2)
85 #define OPTION_EL (OPTION_MD_BASE + 3)
86
87 const char *md_shortopts = "VQ:";
88
89 struct option md_longopts[] =
90 {
91   {"32", no_argument, NULL, OPTION_32},
92   {"64", no_argument, NULL, OPTION_64},
93   {"EB", no_argument, NULL, OPTION_EB },
94   {"EL", no_argument, NULL, OPTION_EL },
95   {NULL, no_argument, NULL, 0}
96 };
97
98 size_t md_longopts_size = sizeof (md_longopts);
99
100 int
101 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
102 {
103   switch (c)
104     {
105       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
106          should be emitted or not.  FIXME: Not implemented.  */
107     case 'Q':
108       break;
109
110       /* -V: SVR4 argument to print version ID.  */
111     case 'V':
112       print_version_id ();
113       break;
114
115     case OPTION_32:
116       tilegx_arch_size = 32;
117       break;
118
119     case OPTION_64:
120       tilegx_arch_size = 64;
121       break;
122
123     case OPTION_EB:
124       target_big_endian = 1;
125       break;
126
127     case OPTION_EL:
128       target_big_endian = 0;
129       break;
130
131     default:
132       return 0;
133     }
134
135   return 1;
136 }
137
138 void
139 md_show_usage (FILE *stream)
140 {
141   fprintf (stream, _("\
142   -Q                      ignored\n\
143   -V                      print assembler version number\n\
144   -EB/-EL                 generate big-endian/little-endian code\n\
145   --32/--64               generate 32bit/64bit code\n"));
146 }
147
148
149 /* Extra expression types.  */
150
151 #define O_hw0                   O_md1
152 #define O_hw1                   O_md2
153 #define O_hw2                   O_md3
154 #define O_hw3                   O_md4
155 #define O_hw0_last              O_md5
156 #define O_hw1_last              O_md6
157 #define O_hw2_last              O_md7
158 #define O_hw0_got               O_md8
159 #define O_hw0_last_got          O_md9
160 #define O_hw1_last_got          O_md10
161 #define O_plt                   O_md11
162 #define O_hw0_tls_gd            O_md12
163 #define O_hw0_last_tls_gd       O_md13
164 #define O_hw1_last_tls_gd       O_md14
165 #define O_hw0_tls_ie            O_md15
166 #define O_hw0_last_tls_ie       O_md16
167 #define O_hw1_last_tls_ie       O_md17
168 #define O_hw0_tls_le            O_md18
169 #define O_hw0_last_tls_le       O_md19
170 #define O_hw1_last_tls_le       O_md20
171 #define O_tls_gd_call           O_md21
172 #define O_tls_gd_add            O_md22
173 #define O_tls_ie_load           O_md23
174 #define O_tls_add               O_md24
175 #define O_hw0_plt               O_md25
176 #define O_hw1_plt               O_md26
177 #define O_hw1_last_plt          O_md27
178 #define O_hw2_last_plt          O_md28
179
180 static htab_t special_operator_hash;
181
182 /* Hash tables for instruction mnemonic lookup.  */
183 static htab_t op_hash;
184
185 /* Hash table for spr lookup.  */
186 static htab_t spr_hash;
187
188 /* True temporarily while parsing an SPR expression. This changes the
189  * namespace to include SPR names.  */
190 static int parsing_spr;
191
192 /* Are we currently inside `{ ... }'?  */
193 static int inside_bundle;
194
195 struct tilegx_instruction
196 {
197   const struct tilegx_opcode *opcode;
198   tilegx_pipeline pipe;
199   expressionS operand_values[TILEGX_MAX_OPERANDS];
200 };
201
202 /* This keeps track of the current bundle being built up.  */
203 static struct tilegx_instruction current_bundle[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];
204
205 /* Index in current_bundle for the next instruction to parse.  */
206 static int current_bundle_index;
207
208 /* Allow 'r63' in addition to 'zero', etc. Normally we disallow this as
209    'zero' is not a real register, so using it accidentally would be a
210    nasty bug. For other registers, such as 'sp', code using multiple names
211    for the same physical register is excessively confusing.
212
213    The '.require_canonical_reg_names' pseudo-op turns this error on,
214    and the '.no_require_canonical_reg_names' pseudo-op turns this off.
215    By default the error is on.  */
216 static int require_canonical_reg_names;
217
218 /* Allow bundles that do undefined or suspicious things like write
219    two different values to the same register at the same time.
220
221    The '.no_allow_suspicious_bundles' pseudo-op turns this error on,
222    and the '.allow_suspicious_bundles' pseudo-op turns this off.  */
223 static int allow_suspicious_bundles;
224
225
226 /* A hash table of main processor registers, mapping each register name
227    to its index.
228
229    Furthermore, if the register number is greater than the number
230    of registers for that processor, the user used an illegal alias
231    for that register (e.g. r63 instead of zero), so we should generate
232    a warning. The attempted register number can be found by clearing
233    NONCANONICAL_REG_NAME_FLAG.  */
234 static htab_t main_reg_hash;
235
236
237 /* We cannot unambiguously store a 0 in a hash table and look it up,
238    so we OR in this flag to every canonical register.  */
239 #define CANONICAL_REG_NAME_FLAG    0x1000
240
241 /* By default we disallow register aliases like r63, but we record
242    them in the hash table in case the .no_require_canonical_reg_names
243    directive is used. Noncanonical names have this value added to them.  */
244 #define NONCANONICAL_REG_NAME_FLAG 0x2000
245
246 /* Discards flags for register hash table entries and returns the
247    reg number.  */
248 #define EXTRACT_REGNO(p) ((p) & 63)
249
250 /* This function is called once, at assembler startup time.  It should
251    set up all the tables, etc., that the MD part of the assembler will
252    need.  */
253
254 void
255 md_begin (void)
256 {
257   const struct tilegx_opcode *op;
258   int i;
259   int mach = (tilegx_arch_size == 64) ? bfd_mach_tilegx : bfd_mach_tilegx32;
260
261   if (! bfd_set_arch_mach (stdoutput, bfd_arch_tilegx, mach))
262     as_warn (_("Could not set architecture and machine"));
263
264   /* Guarantee text section is aligned.  */
265   bfd_set_section_alignment (text_section,
266                              TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
267
268   require_canonical_reg_names = 1;
269   allow_suspicious_bundles = 0;
270   current_bundle_index = 0;
271   inside_bundle = 0;
272
273   tilegx_cie_data_alignment = (tilegx_arch_size == 64 ? -8 : -4);
274
275   /* Initialize special operator hash table.  */
276   special_operator_hash = str_htab_create ();
277 #define INSERT_SPECIAL_OP(name)                                 \
278   str_hash_insert (special_operator_hash, #name, (void *) O_##name, 0)
279
280   INSERT_SPECIAL_OP (hw0);
281   INSERT_SPECIAL_OP (hw1);
282   INSERT_SPECIAL_OP (hw2);
283   INSERT_SPECIAL_OP (hw3);
284   INSERT_SPECIAL_OP (hw0_last);
285   INSERT_SPECIAL_OP (hw1_last);
286   INSERT_SPECIAL_OP (hw2_last);
287   /* hw3_last is a convenience alias for the equivalent hw3.  */
288   str_hash_insert (special_operator_hash, "hw3_last", (void *) O_hw3, 0);
289   INSERT_SPECIAL_OP (hw0_got);
290   INSERT_SPECIAL_OP (hw0_last_got);
291   INSERT_SPECIAL_OP (hw1_last_got);
292   INSERT_SPECIAL_OP(plt);
293   INSERT_SPECIAL_OP (hw0_tls_gd);
294   INSERT_SPECIAL_OP (hw0_last_tls_gd);
295   INSERT_SPECIAL_OP (hw1_last_tls_gd);
296   INSERT_SPECIAL_OP (hw0_tls_ie);
297   INSERT_SPECIAL_OP (hw0_last_tls_ie);
298   INSERT_SPECIAL_OP (hw1_last_tls_ie);
299   INSERT_SPECIAL_OP (hw0_tls_le);
300   INSERT_SPECIAL_OP (hw0_last_tls_le);
301   INSERT_SPECIAL_OP (hw1_last_tls_le);
302   INSERT_SPECIAL_OP (tls_gd_call);
303   INSERT_SPECIAL_OP (tls_gd_add);
304   INSERT_SPECIAL_OP (tls_ie_load);
305   INSERT_SPECIAL_OP (tls_add);
306   INSERT_SPECIAL_OP (hw0_plt);
307   INSERT_SPECIAL_OP (hw1_plt);
308   INSERT_SPECIAL_OP (hw1_last_plt);
309   INSERT_SPECIAL_OP (hw2_last_plt);
310 #undef INSERT_SPECIAL_OP
311
312   /* Initialize op_hash hash table.  */
313   op_hash = str_htab_create ();
314   for (op = &tilegx_opcodes[0]; op->name != NULL; op++)
315     if (str_hash_insert (op_hash, op->name, op, 0) != NULL)
316       as_fatal (_("duplicate %s"), op->name);
317
318   /* Initialize the spr hash table.  */
319   parsing_spr = 0;
320   spr_hash = str_htab_create ();
321   for (i = 0; i < tilegx_num_sprs; i++)
322     str_hash_insert (spr_hash, tilegx_sprs[i].name, &tilegx_sprs[i], 0);
323
324   /* Set up the main_reg_hash table. We use this instead of
325      creating a symbol in the register section to avoid ambiguities
326      with labels that have the same names as registers.  */
327   main_reg_hash = str_htab_create ();
328   for (i = 0; i < TILEGX_NUM_REGISTERS; i++)
329     {
330       char buf[64];
331
332       str_hash_insert (main_reg_hash, tilegx_register_names[i],
333                        (void *) (long) (i | CANONICAL_REG_NAME_FLAG), 0);
334
335       /* See if we should insert a noncanonical alias, like r63.  */
336       sprintf (buf, "r%d", i);
337       if (strcmp (buf, tilegx_register_names[i]) != 0)
338         str_hash_insert (main_reg_hash, xstrdup (buf),
339                          (void *) (long) (i | NONCANONICAL_REG_NAME_FLAG), 0);
340     }
341 }
342
343 #define BUNDLE_TEMPLATE_MASK(p0, p1, p2) \
344   ((p0) | ((p1) << 8) | ((p2) << 16))
345 #define BUNDLE_TEMPLATE(p0, p1, p2) \
346   { { (p0), (p1), (p2) }, \
347      BUNDLE_TEMPLATE_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \
348   }
349
350 #define NO_PIPELINE TILEGX_NUM_PIPELINE_ENCODINGS
351
352 struct bundle_template
353 {
354   tilegx_pipeline pipe[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];
355   unsigned int pipe_mask;
356 };
357
358 static const struct bundle_template bundle_templates[] =
359 {
360   /* In Y format we must always have something in Y2, since it has
361      no fnop, so this conveys that Y2 must always be used.  */
362   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2, NO_PIPELINE),
363   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2, NO_PIPELINE),
364   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0, NO_PIPELINE),
365   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1, NO_PIPELINE),
366
367   /* Y format has three instructions.  */
368   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y2),
369   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y1),
370   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y2),
371   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y0),
372   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y1),
373   BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y0),
374
375   /* X format has only two instructions.  */
376   BUNDLE_TEMPLATE(TILEGX_PIPELINE_X0, TILEGX_PIPELINE_X1, NO_PIPELINE),
377   BUNDLE_TEMPLATE(TILEGX_PIPELINE_X1, TILEGX_PIPELINE_X0, NO_PIPELINE)
378 };
379
380
381 static void
382 prepend_nop_to_bundle (tilegx_mnemonic mnemonic)
383 {
384   memmove (&current_bundle[1], &current_bundle[0],
385            current_bundle_index * sizeof current_bundle[0]);
386   current_bundle[0].opcode = &tilegx_opcodes[mnemonic];
387   ++current_bundle_index;
388 }
389
390 static tilegx_bundle_bits
391 insert_operand (tilegx_bundle_bits bits,
392                 const struct tilegx_operand *operand,
393                 int operand_value,
394                 const char *file,
395                 unsigned lineno)
396 {
397   /* Range-check the immediate.  */
398   int num_bits = operand->num_bits;
399
400   operand_value >>= operand->rightshift;
401
402   if (bfd_check_overflow (operand->is_signed
403                           ? complain_overflow_signed
404                           : complain_overflow_unsigned,
405                           num_bits,
406                           0,
407                           bfd_arch_bits_per_address (stdoutput),
408                           operand_value)
409       != bfd_reloc_ok)
410     {
411       offsetT min, max;
412       if (operand->is_signed)
413         {
414           min = -(1 << (num_bits - 1));
415           max = (1 << (num_bits - 1)) - 1;
416         }
417       else
418         {
419           min = 0;
420           max = (1 << num_bits) - 1;
421         }
422       as_bad_value_out_of_range (_("operand"), operand_value, min, max,
423                                  file, lineno);
424     }
425
426   /* Write out the bits for the immediate.  */
427   return bits | operand->insert (operand_value);
428 }
429
430
431 static int
432 apply_special_operator (operatorT op, offsetT num, const char *file,
433                         unsigned lineno)
434 {
435   int ret;
436   int check_shift = -1;
437
438   switch (op)
439     {
440     case O_hw0_last:
441       check_shift = 0;
442       /* Fall through.  */
443     case O_hw0:
444       ret = (signed short)num;
445       break;
446
447     case O_hw1_last:
448       check_shift = 16;
449       /* Fall through.  */
450     case O_hw1:
451       ret = (signed short)(num >> 16);
452       break;
453
454     case O_hw2_last:
455       check_shift = 32;
456       /* Fall through.  */
457     case O_hw2:
458       ret = (signed short)(num >> 32);
459       break;
460
461     case O_hw3:
462       ret = (signed short)(num >> 48);
463       break;
464
465     default:
466       abort ();
467       break;
468     }
469
470   if (check_shift >= 0 && ret != (num >> check_shift))
471     {
472       as_bad_value_out_of_range (_("operand"), num,
473                                  ~0ULL << (check_shift + 16 - 1),
474                                  ~0ULL >> (64 - (check_shift + 16 - 1)),
475                                  file, lineno);
476     }
477
478   return ret;
479 }
480
481 static tilegx_bundle_bits
482 emit_tilegx_instruction (tilegx_bundle_bits bits,
483                          int num_operands,
484                          const unsigned char *operands,
485                          expressionS *operand_values,
486                          char *bundle_start)
487 {
488   int i;
489
490   for (i = 0; i < num_operands; i++)
491     {
492       const struct tilegx_operand *operand =
493         &tilegx_operands[operands[i]];
494       expressionS *operand_exp = &operand_values[i];
495       int is_pc_relative = operand->is_pc_relative;
496
497       if (operand_exp->X_op == O_register
498           || (operand_exp->X_op == O_constant && !is_pc_relative))
499         {
500           /* We know what the bits are right now, so insert them.  */
501           bits = insert_operand (bits, operand, operand_exp->X_add_number,
502                                  NULL, 0);
503         }
504       else
505         {
506           bfd_reloc_code_real_type reloc = operand->default_reloc;
507           expressionS subexp;
508           int die = 0, use_subexp = 0, require_symbol = 0;
509           fixS *fixP;
510
511           /* Take an expression like hw0(x) and turn it into x with
512              a different reloc type.  */
513           switch (operand_exp->X_op)
514             {
515 #define HANDLE_OP16(suffix)                                     \
516               switch (reloc)                                    \
517                 {                                               \
518                 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST:        \
519                   reloc = BFD_RELOC_TILEGX_IMM16_X0_##suffix;   \
520                   break;                                        \
521                 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST:        \
522                   reloc = BFD_RELOC_TILEGX_IMM16_X1_##suffix;   \
523                   break;                                        \
524                 default:                                        \
525                   die = 1;                                      \
526                   break;                                        \
527                 }                                               \
528               use_subexp = 1
529
530             case O_hw0:
531               HANDLE_OP16 (HW0);
532               break;
533
534             case O_hw1:
535               HANDLE_OP16 (HW1);
536               break;
537
538             case O_hw2:
539               HANDLE_OP16 (HW2);
540               break;
541
542             case O_hw3:
543               HANDLE_OP16 (HW3);
544               break;
545
546             case O_hw0_last:
547               HANDLE_OP16 (HW0_LAST);
548               break;
549
550             case O_hw1_last:
551               HANDLE_OP16 (HW1_LAST);
552               break;
553
554             case O_hw2_last:
555               HANDLE_OP16 (HW2_LAST);
556               break;
557
558             case O_hw0_got:
559               HANDLE_OP16 (HW0_GOT);
560               require_symbol = 1;
561               break;
562
563             case O_hw0_last_got:
564               HANDLE_OP16 (HW0_LAST_GOT);
565               require_symbol = 1;
566               break;
567
568             case O_hw1_last_got:
569               HANDLE_OP16 (HW1_LAST_GOT);
570               require_symbol = 1;
571               break;
572
573             case O_hw0_tls_gd:
574               HANDLE_OP16 (HW0_TLS_GD);
575               require_symbol = 1;
576               break;
577
578             case O_hw0_last_tls_gd:
579               HANDLE_OP16 (HW0_LAST_TLS_GD);
580               require_symbol = 1;
581               break;
582
583             case O_hw1_last_tls_gd:
584               HANDLE_OP16 (HW1_LAST_TLS_GD);
585               require_symbol = 1;
586               break;
587
588             case O_hw0_tls_ie:
589               HANDLE_OP16 (HW0_TLS_IE);
590               require_symbol = 1;
591               break;
592
593             case O_hw0_last_tls_ie:
594               HANDLE_OP16 (HW0_LAST_TLS_IE);
595               require_symbol = 1;
596               break;
597
598             case O_hw1_last_tls_ie:
599               HANDLE_OP16 (HW1_LAST_TLS_IE);
600               require_symbol = 1;
601               break;
602
603             case O_hw0_tls_le:
604               HANDLE_OP16 (HW0_TLS_LE);
605               require_symbol = 1;
606               break;
607
608             case O_hw0_last_tls_le:
609               HANDLE_OP16 (HW0_LAST_TLS_LE);
610               require_symbol = 1;
611               break;
612
613             case O_hw1_last_tls_le:
614               HANDLE_OP16 (HW1_LAST_TLS_LE);
615               require_symbol = 1;
616               break;
617
618             case O_hw0_plt:
619               HANDLE_OP16 (HW0_PLT_PCREL);
620               break;
621
622             case O_hw1_plt:
623               HANDLE_OP16 (HW1_PLT_PCREL);
624               break;
625
626             case O_hw1_last_plt:
627               HANDLE_OP16 (HW1_LAST_PLT_PCREL);
628               break;
629
630             case O_hw2_last_plt:
631               HANDLE_OP16 (HW2_LAST_PLT_PCREL);
632               break;
633
634 #undef HANDLE_OP16
635
636             case O_plt:
637               switch (reloc)
638                 {
639                 case BFD_RELOC_TILEGX_JUMPOFF_X1:
640                   reloc = BFD_RELOC_TILEGX_JUMPOFF_X1_PLT;
641                   break;
642                 default:
643                   die = 1;
644                   break;
645                 }
646               use_subexp = 1;
647               require_symbol = 1;
648               break;
649
650             case O_tls_gd_call:
651               switch (reloc)
652                 {
653                 case BFD_RELOC_TILEGX_JUMPOFF_X1:
654                   reloc = BFD_RELOC_TILEGX_TLS_GD_CALL;
655                   break;
656                 default:
657                   die = 1;
658                   break;
659                 }
660               use_subexp = 1;
661               require_symbol = 1;
662               break;
663
664             case O_tls_gd_add:
665               switch (reloc)
666                 {
667                 case BFD_RELOC_TILEGX_IMM8_X0:
668                   reloc = BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD;
669                   break;
670                 case BFD_RELOC_TILEGX_IMM8_X1:
671                   reloc = BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD;
672                   break;
673                 case BFD_RELOC_TILEGX_IMM8_Y0:
674                   reloc = BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD;
675                   break;
676                 case BFD_RELOC_TILEGX_IMM8_Y1:
677                   reloc = BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD;
678                   break;
679                 default:
680                   die = 1;
681                   break;
682                 }
683               use_subexp = 1;
684               require_symbol = 1;
685               break;
686
687             case O_tls_ie_load:
688               switch (reloc)
689                 {
690                 case BFD_RELOC_TILEGX_IMM8_X1:
691                   reloc = BFD_RELOC_TILEGX_TLS_IE_LOAD;
692                   break;
693                 default:
694                   die = 1;
695                   break;
696                 }
697               use_subexp = 1;
698               require_symbol = 1;
699               break;
700
701             case O_tls_add:
702               switch (reloc)
703                 {
704                 case BFD_RELOC_TILEGX_IMM8_X0:
705                   reloc = BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD;
706                   break;
707                 case BFD_RELOC_TILEGX_IMM8_X1:
708                   reloc = BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD;
709                   break;
710                 case BFD_RELOC_TILEGX_IMM8_Y0:
711                   reloc = BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD;
712                   break;
713                 case BFD_RELOC_TILEGX_IMM8_Y1:
714                   reloc = BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD;
715                   break;
716                 default:
717                   die = 1;
718                   break;
719                 }
720               use_subexp = 1;
721               require_symbol = 1;
722               break;
723
724             default:
725               /* Do nothing.  */
726               break;
727             }
728
729           if (die)
730             {
731               as_bad (_("Invalid operator for operand."));
732             }
733           else if (use_subexp)
734             {
735               expressionS *sval = NULL;
736               /* Now that we've changed the reloc, change ha16(x) into x,
737                  etc.  */
738
739               if (symbol_symbolS (operand_exp->X_add_symbol))
740                 sval = symbol_get_value_expression (operand_exp->X_add_symbol);
741               if (sval && sval->X_md)
742                 {
743                   /* HACK: We used X_md to mark this symbol as a fake wrapper
744                      around a real expression. To unwrap it, we just grab its
745                      value here.  */
746                   operand_exp = sval;
747
748                   if (require_symbol)
749                     {
750                       /* Look at the expression, and reject it if it's not a
751                          plain symbol.  */
752                       if (operand_exp->X_op != O_symbol
753                           || operand_exp->X_add_number != 0)
754                         as_bad (_("Operator may only be applied to symbols."));
755                     }
756                 }
757               else
758                 {
759                   /* The value of this expression is an actual symbol, so
760                      turn that into an expression.  */
761                   memset (&subexp, 0, sizeof subexp);
762                   subexp.X_op = O_symbol;
763                   subexp.X_add_symbol = operand_exp->X_add_symbol;
764                   operand_exp = &subexp;
765                 }
766             }
767
768           /* Create a fixup to handle this later.  */
769           fixP = fix_new_exp (frag_now,
770                               bundle_start - frag_now->fr_literal,
771                               (operand->num_bits + 7) >> 3,
772                               operand_exp,
773                               is_pc_relative,
774                               reloc);
775           fixP->tc_fix_data = operand;
776
777           /* Don't do overflow checking if we are applying a function like
778              ha16.  */
779           fixP->fx_no_overflow |= use_subexp;
780         }
781     }
782   return bits;
783 }
784
785
786 /* Detects and complains if two instructions in current_bundle write
787    to the same register, either implicitly or explicitly, or if a
788    read-only register is written.  */
789 static void
790 check_illegal_reg_writes (void)
791 {
792   uint64_t all_regs_written = 0;
793   int j;
794
795   for (j = 0; j < current_bundle_index; j++)
796     {
797       const struct tilegx_instruction *instr = &current_bundle[j];
798       int k;
799       uint64_t regs =
800         (uint64_t) 1 << instr->opcode->implicitly_written_register;
801       uint64_t conflict;
802
803       for (k = 0; k < instr->opcode->num_operands; k++)
804         {
805           const struct tilegx_operand *operand =
806             &tilegx_operands[instr->opcode->operands[instr->pipe][k]];
807
808           if (operand->is_dest_reg)
809             {
810               int regno = instr->operand_values[k].X_add_number;
811               uint64_t mask = (uint64_t) 1 << regno;
812
813               if ((mask & (  ((uint64_t) 1 << TREG_IDN1)
814                            | ((uint64_t) 1 << TREG_UDN1)
815                            | ((uint64_t) 1 << TREG_UDN2)
816                            | ((uint64_t) 1 << TREG_UDN3))) != 0
817                   && !allow_suspicious_bundles)
818                 {
819                   as_bad (_("Writes to register '%s' are not allowed."),
820                           tilegx_register_names[regno]);
821                 }
822
823               regs |= mask;
824             }
825         }
826
827       /* Writing to the zero register doesn't count.  */
828       regs &= ~((uint64_t) 1 << TREG_ZERO);
829
830       conflict = all_regs_written & regs;
831       if (conflict != 0 && !allow_suspicious_bundles)
832         {
833           /* Find which register caused the conflict.  */
834           const char *conflicting_reg_name = "???";
835           int i;
836
837           for (i = 0; i < TILEGX_NUM_REGISTERS; i++)
838             {
839               if (((conflict >> i) & 1) != 0)
840                 {
841                   conflicting_reg_name = tilegx_register_names[i];
842                   break;
843                 }
844             }
845
846           as_bad (_("Two instructions in the same bundle both write "
847                     "to register %s, which is not allowed."),
848                   conflicting_reg_name);
849         }
850
851       all_regs_written |= regs;
852     }
853 }
854
855
856 static void
857 tilegx_flush_bundle (void)
858 {
859   unsigned i;
860   int j;
861   addressT addr_mod;
862   unsigned compatible_pipes;
863   const struct bundle_template *match;
864   char *f;
865
866   inside_bundle = 0;
867
868   switch (current_bundle_index)
869     {
870     case 0:
871       /* No instructions.  */
872       return;
873     case 1:
874       if (current_bundle[0].opcode->can_bundle)
875         {
876           /* Simplify later logic by adding an explicit fnop.  */
877           prepend_nop_to_bundle (TILEGX_OPC_FNOP);
878         }
879       else
880         {
881           /* This instruction cannot be bundled with anything else.
882              Prepend an explicit 'nop', rather than an 'fnop', because
883              fnops can be replaced by later binary-processing tools while
884              nops cannot.  */
885           prepend_nop_to_bundle (TILEGX_OPC_NOP);
886         }
887       break;
888     default:
889       if (!allow_suspicious_bundles)
890         {
891           /* Make sure all instructions can be bundled with other
892              instructions.  */
893           const struct tilegx_opcode *cannot_bundle = NULL;
894           bool seen_non_nop = false;
895
896           for (j = 0; j < current_bundle_index; j++)
897             {
898               const struct tilegx_opcode *op = current_bundle[j].opcode;
899
900               if (!op->can_bundle && cannot_bundle == NULL)
901                 cannot_bundle = op;
902               else if (op->mnemonic != TILEGX_OPC_NOP
903                        && op->mnemonic != TILEGX_OPC_INFO
904                        && op->mnemonic != TILEGX_OPC_INFOL)
905                 seen_non_nop = true;
906             }
907
908           if (cannot_bundle != NULL && seen_non_nop)
909             {
910               current_bundle_index = 0;
911               as_bad (_("'%s' may not be bundled with other instructions."),
912                       cannot_bundle->name);
913               return;
914             }
915         }
916       break;
917     }
918
919   compatible_pipes =
920     BUNDLE_TEMPLATE_MASK(current_bundle[0].opcode->pipes,
921                          current_bundle[1].opcode->pipes,
922                          (current_bundle_index == 3
923                           ? current_bundle[2].opcode->pipes
924                           : (1 << NO_PIPELINE)));
925
926   /* Find a template that works, if any.  */
927   match = NULL;
928   for (i = 0; i < sizeof bundle_templates / sizeof bundle_templates[0]; i++)
929     {
930       const struct bundle_template *b = &bundle_templates[i];
931       if ((b->pipe_mask & compatible_pipes) == b->pipe_mask)
932         {
933           match = b;
934           break;
935         }
936     }
937
938   if (match == NULL)
939     {
940       current_bundle_index = 0;
941       as_bad (_("Invalid combination of instructions for bundle."));
942       return;
943     }
944
945   /* If the section seems to have no alignment set yet, go ahead and
946      make it large enough to hold code.  */
947   if (bfd_section_alignment (now_seg) == 0)
948     bfd_set_section_alignment (now_seg,
949                                TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
950
951   for (j = 0; j < current_bundle_index; j++)
952     current_bundle[j].pipe = match->pipe[j];
953
954   if (current_bundle_index == 2 && !tilegx_is_x_pipeline (match->pipe[0]))
955     {
956       /* We are in Y mode with only two instructions, so add an FNOP.  */
957       prepend_nop_to_bundle (TILEGX_OPC_FNOP);
958
959       /* Figure out what pipe the fnop must be in via arithmetic.
960        * p0 + p1 + p2 must sum to the sum of TILEGX_PIPELINE_Y[012].  */
961       current_bundle[0].pipe =
962         (tilegx_pipeline)((TILEGX_PIPELINE_Y0
963                            + TILEGX_PIPELINE_Y1
964                            + TILEGX_PIPELINE_Y2) -
965                           (current_bundle[1].pipe + current_bundle[2].pipe));
966     }
967
968   check_illegal_reg_writes ();
969
970   f = frag_more (TILEGX_BUNDLE_SIZE_IN_BYTES);
971
972   /* Check to see if this bundle is at an offset that is a multiple of 8-bytes
973      from the start of the frag.  */
974   addr_mod = frag_now_fix () & (TILEGX_BUNDLE_ALIGNMENT_IN_BYTES - 1);
975   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
976     as_bad (_("instruction address is not a multiple of 8"));
977   frag_now->insn_addr = addr_mod;
978   frag_now->has_code = 1;
979
980   tilegx_bundle_bits bits = 0;
981   for (j = 0; j < current_bundle_index; j++)
982     {
983       struct tilegx_instruction *instr = &current_bundle[j];
984       tilegx_pipeline pipeline = instr->pipe;
985       const struct tilegx_opcode *opcode = instr->opcode;
986
987       bits |= emit_tilegx_instruction (opcode->fixed_bit_values[pipeline],
988                                        opcode->num_operands,
989                                        &opcode->operands[pipeline][0],
990                                        instr->operand_values,
991                                        f);
992     }
993
994   number_to_chars_littleendian (f, bits, 8);
995   current_bundle_index = 0;
996
997   /* Emit DWARF2 debugging information.  */
998   dwarf2_emit_insn (TILEGX_BUNDLE_SIZE_IN_BYTES);
999 }
1000
1001
1002 /* Extend the expression parser to handle hw0(label), etc.
1003    as well as SPR names when in the context of parsing an SPR.  */
1004
1005 int
1006 tilegx_parse_name (char *name, expressionS *e, char *nextcharP)
1007 {
1008   operatorT op = O_illegal;
1009
1010   if (parsing_spr)
1011     {
1012       void* val = str_hash_find (spr_hash, name);
1013       if (val == NULL)
1014         return 0;
1015
1016       memset (e, 0, sizeof *e);
1017       e->X_op = O_constant;
1018       e->X_add_number = ((const struct tilegx_spr *)val)->number;
1019       return 1;
1020     }
1021
1022   if (*nextcharP != '(')
1023     {
1024       /* hw0, etc. not followed by a paren is just a label with that name.  */
1025       return 0;
1026     }
1027   else
1028     {
1029       /* Look up the operator in our table.  */
1030       void* val = str_hash_find (special_operator_hash, name);
1031       if (val == 0)
1032         return 0;
1033       op = (operatorT)(long)val;
1034     }
1035
1036   /* Restore old '(' and skip it.  */
1037   *input_line_pointer = '(';
1038   ++input_line_pointer;
1039
1040   expression (e);
1041
1042   if (*input_line_pointer != ')')
1043     {
1044       as_bad (_("Missing ')'"));
1045       *nextcharP = *input_line_pointer;
1046       return 0;
1047     }
1048   /* Skip ')'.  */
1049   ++input_line_pointer;
1050
1051   if (e->X_op == O_register || e->X_op == O_absent)
1052     {
1053       as_bad (_("Invalid expression."));
1054       e->X_op = O_constant;
1055       e->X_add_number = 0;
1056     }
1057   else
1058     {
1059       /* Wrap subexpression with a unary operator.  */
1060       symbolS *sym = make_expr_symbol (e);
1061
1062       if (sym != e->X_add_symbol)
1063         {
1064           /* HACK: mark this symbol as a temporary wrapper around a proper
1065              expression, so we can unwrap it later once we have communicated
1066              the relocation type.  */
1067           symbol_get_value_expression (sym)->X_md = 1;
1068         }
1069
1070       memset (e, 0, sizeof *e);
1071       e->X_op = op;
1072       e->X_add_symbol = sym;
1073       e->X_add_number = 0;
1074     }
1075
1076   *nextcharP = *input_line_pointer;
1077   return 1;
1078 }
1079
1080
1081 /* Parses an expression which must be a register name.  */
1082
1083 static void
1084 parse_reg_expression (expressionS* expression)
1085 {
1086   char *regname;
1087   char terminating_char;
1088   void *pval;
1089   int regno_and_flags;
1090   int regno;
1091
1092   /* Zero everything to make sure we don't miss any flags.  */
1093   memset (expression, 0, sizeof *expression);
1094
1095   terminating_char = get_symbol_name (&regname);
1096
1097   pval = str_hash_find (main_reg_hash, regname);
1098   if (pval == NULL)
1099     as_bad (_("Expected register, got '%s'."), regname);
1100
1101   regno_and_flags = (int)(size_t)pval;
1102   regno = EXTRACT_REGNO(regno_and_flags);
1103
1104   if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
1105       && require_canonical_reg_names)
1106     as_warn (_("Found use of non-canonical register name %s; "
1107                "use %s instead."),
1108              regname, tilegx_register_names[regno]);
1109
1110   /* Restore the old character following the register name.  */
1111   (void) restore_line_pointer (terminating_char);
1112
1113   /* Fill in the expression fields to indicate it's a register.  */
1114   expression->X_op = O_register;
1115   expression->X_add_number = regno;
1116 }
1117
1118
1119 /* Parses and type-checks comma-separated operands in input_line_pointer.  */
1120
1121 static void
1122 parse_operands (const char *opcode_name,
1123                 const unsigned char *operands,
1124                 int num_operands,
1125                 expressionS *operand_values)
1126 {
1127   int i;
1128
1129   memset (operand_values, 0, num_operands * sizeof operand_values[0]);
1130
1131   SKIP_WHITESPACE ();
1132   for (i = 0; i < num_operands; i++)
1133     {
1134       tilegx_operand_type type = tilegx_operands[operands[i]].type;
1135
1136       SKIP_WHITESPACE ();
1137
1138       if (type == TILEGX_OP_TYPE_REGISTER)
1139         {
1140           parse_reg_expression (&operand_values[i]);
1141         }
1142       else if (*input_line_pointer == '}')
1143         {
1144           operand_values[i].X_op = O_absent;
1145         }
1146       else if (type == TILEGX_OP_TYPE_SPR)
1147         {
1148           /* Modify the expression parser to add SPRs to the namespace.  */
1149           parsing_spr = 1;
1150           expression (&operand_values[i]);
1151           parsing_spr = 0;
1152         }
1153       else
1154         {
1155           expression (&operand_values[i]);
1156         }
1157
1158       SKIP_WHITESPACE ();
1159
1160       if (i + 1 < num_operands)
1161         {
1162           int separator = (unsigned char)*input_line_pointer++;
1163
1164           if (is_end_of_line[separator] || (separator == '}'))
1165             {
1166               as_bad (_("Too few operands to '%s'."), opcode_name);
1167               return;
1168             }
1169           else if (separator != ',')
1170             {
1171               as_bad (_("Unexpected character '%c' after operand %d to %s."),
1172                       (char)separator, i + 1, opcode_name);
1173               return;
1174             }
1175         }
1176
1177       /* Arbitrarily use the first valid pipe to get the operand type,
1178          since they are all the same.  */
1179       switch (tilegx_operands[operands[i]].type)
1180         {
1181         case TILEGX_OP_TYPE_REGISTER:
1182           /* Handled in parse_reg_expression already.  */
1183           break;
1184         case TILEGX_OP_TYPE_SPR:
1185           /* Fall through  */
1186         case TILEGX_OP_TYPE_IMMEDIATE:
1187           /* Fall through  */
1188         case TILEGX_OP_TYPE_ADDRESS:
1189           if (   operand_values[i].X_op == O_register
1190                  || operand_values[i].X_op == O_illegal
1191                  || operand_values[i].X_op == O_absent)
1192             as_bad (_("Expected immediate expression"));
1193           break;
1194         default:
1195           abort();
1196         }
1197     }
1198
1199   if (!is_end_of_line[(unsigned char)*input_line_pointer])
1200     {
1201       switch (*input_line_pointer)
1202         {
1203         case '}':
1204           if (!inside_bundle)
1205             as_bad (_("Found '}' when not bundling."));
1206           ++input_line_pointer;
1207           inside_bundle = 0;
1208           demand_empty_rest_of_line ();
1209           break;
1210
1211         case ',':
1212           as_bad (_("Too many operands"));
1213           break;
1214
1215         default:
1216           /* Use default error for unrecognized garbage.  */
1217           demand_empty_rest_of_line ();
1218           break;
1219         }
1220     }
1221 }
1222
1223
1224 /* This is the guts of the machine-dependent assembler.  STR points to a
1225    machine dependent instruction.  This function is supposed to emit the
1226    frags/bytes it assembles to.  */
1227
1228 void
1229 md_assemble (char *str)
1230 {
1231   char old_char;
1232   size_t opname_len;
1233   char *old_input_line_pointer;
1234   const struct tilegx_opcode *op;
1235   int first_pipe;
1236
1237   /* Split off the opcode and look it up.  */
1238   opname_len = strcspn (str, " {}");
1239   old_char = str[opname_len];
1240   str[opname_len] = '\0';
1241
1242   op = str_hash_find (op_hash, str);
1243   str[opname_len] = old_char;
1244   if (op == NULL)
1245     {
1246       as_bad (_("Unknown opcode `%.*s'."), (int)opname_len, str);
1247       return;
1248     }
1249
1250   /* Prepare to parse the operands.  */
1251   old_input_line_pointer = input_line_pointer;
1252   input_line_pointer = str + opname_len;
1253   SKIP_WHITESPACE ();
1254
1255   if (current_bundle_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
1256     {
1257       as_bad (_("Too many instructions for bundle."));
1258       tilegx_flush_bundle ();
1259     }
1260
1261   /* Make sure we have room for the upcoming bundle before we
1262      create any fixups. Otherwise if we have to switch to a new
1263      frag the fixup dot_value fields will be wrong.  */
1264   frag_grow (TILEGX_BUNDLE_SIZE_IN_BYTES);
1265
1266   /* Find a valid pipe for this opcode.  */
1267   for (first_pipe = 0; (op->pipes & (1 << first_pipe)) == 0; first_pipe++)
1268     ;
1269
1270   /* Call the function that assembles this instruction.  */
1271   current_bundle[current_bundle_index].opcode = op;
1272   parse_operands (op->name,
1273                   &op->operands[first_pipe][0],
1274                   op->num_operands,
1275                   current_bundle[current_bundle_index].operand_values);
1276   ++current_bundle_index;
1277
1278   /* Restore the saved value of input_line_pointer.  */
1279   input_line_pointer = old_input_line_pointer;
1280
1281   /* If we weren't inside curly braces, go ahead and emit
1282      this lone instruction as a bundle right now.  */
1283   if (!inside_bundle)
1284     tilegx_flush_bundle ();
1285 }
1286
1287
1288 static void
1289 s_require_canonical_reg_names (int require)
1290 {
1291   demand_empty_rest_of_line ();
1292   require_canonical_reg_names = require;
1293 }
1294
1295 static void
1296 s_allow_suspicious_bundles (int allow)
1297 {
1298   demand_empty_rest_of_line ();
1299   allow_suspicious_bundles = allow;
1300 }
1301
1302 const pseudo_typeS md_pseudo_table[] =
1303 {
1304   {"align", s_align_bytes, 0},  /* Defaulting is invalid (0).  */
1305   {"word", cons, 4},
1306   {"require_canonical_reg_names", s_require_canonical_reg_names, 1 },
1307   {"no_require_canonical_reg_names", s_require_canonical_reg_names, 0 },
1308   {"allow_suspicious_bundles", s_allow_suspicious_bundles, 1 },
1309   {"no_allow_suspicious_bundles", s_allow_suspicious_bundles, 0 },
1310   { NULL, 0, 0 }
1311 };
1312
1313 void
1314 md_number_to_chars (char * buf, valueT val, int n)
1315 {
1316   if (target_big_endian)
1317     number_to_chars_bigendian (buf, val, n);
1318   else
1319     number_to_chars_littleendian (buf, val, n);
1320 }
1321
1322 /* Turn the string pointed to by litP into a floating point constant
1323    of type TYPE, and emit the appropriate bytes.  The number of
1324    LITTLENUMS emitted is stored in *SIZEP.  An error message is
1325    returned, or NULL on OK.  */
1326
1327 const char *
1328 md_atof (int type, char *litP, int *sizeP)
1329 {
1330   int prec;
1331   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1332   LITTLENUM_TYPE *wordP;
1333   char *t;
1334
1335   switch (type)
1336     {
1337     case 'f':
1338     case 'F':
1339       prec = 2;
1340       break;
1341
1342     case 'd':
1343     case 'D':
1344       prec = 4;
1345       break;
1346
1347     default:
1348       *sizeP = 0;
1349       return _("Bad call to md_atof ()");
1350     }
1351   t = atof_ieee (input_line_pointer, type, words);
1352   if (t)
1353     input_line_pointer = t;
1354
1355   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1356   /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
1357      the bigendian 386.  */
1358   for (wordP = words + prec - 1; prec--;)
1359     {
1360       md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
1361       litP += sizeof (LITTLENUM_TYPE);
1362     }
1363   return 0;
1364 }
1365
1366
1367 /* We have no need to default values of symbols.  */
1368
1369 symbolS *
1370 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1371 {
1372   return NULL;
1373 }
1374
1375
1376 void
1377 tilegx_cons_fix_new (fragS *frag,
1378                      int where,
1379                      int nbytes,
1380                      expressionS *exp)
1381 {
1382   expressionS subexp;
1383   bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
1384   int no_overflow = 0;
1385   fixS *fixP;
1386
1387   /* See if it's one of our special functions.  */
1388   switch (exp->X_op)
1389     {
1390     case O_hw0:
1391       reloc = BFD_RELOC_TILEGX_HW0;
1392       no_overflow = 1;
1393       break;
1394     case O_hw1:
1395       reloc = BFD_RELOC_TILEGX_HW1;
1396       no_overflow = 1;
1397       break;
1398     case O_hw2:
1399       reloc = BFD_RELOC_TILEGX_HW2;
1400       no_overflow = 1;
1401       break;
1402     case O_hw3:
1403       reloc = BFD_RELOC_TILEGX_HW3;
1404       no_overflow = 1;
1405       break;
1406     case O_hw0_last:
1407       reloc = BFD_RELOC_TILEGX_HW0_LAST;
1408       break;
1409     case O_hw1_last:
1410       reloc = BFD_RELOC_TILEGX_HW1_LAST;
1411       break;
1412     case O_hw2_last:
1413       reloc = BFD_RELOC_TILEGX_HW2_LAST;
1414       break;
1415
1416     default:
1417       /* Do nothing.  */
1418       break;
1419     }
1420
1421   if (reloc != BFD_RELOC_NONE)
1422     {
1423       if (nbytes != 2)
1424         {
1425           as_bad (_("This operator only produces two byte values."));
1426           nbytes = 2;
1427         }
1428
1429       memset (&subexp, 0, sizeof subexp);
1430       subexp.X_op = O_symbol;
1431       subexp.X_add_symbol = exp->X_add_symbol;
1432       exp = &subexp;
1433     }
1434   else
1435     {
1436       switch (nbytes)
1437         {
1438         case 1:
1439           reloc = BFD_RELOC_8;
1440           break;
1441         case 2:
1442           reloc = BFD_RELOC_16;
1443           break;
1444         case 4:
1445           reloc = BFD_RELOC_32;
1446           break;
1447         case 8:
1448           reloc = BFD_RELOC_64;
1449           break;
1450         default:
1451           as_bad (_("unsupported BFD relocation size %d"), nbytes);
1452           reloc = BFD_RELOC_64;
1453           break;
1454         }
1455     }
1456
1457   fixP = fix_new_exp (frag, where, nbytes, exp, 0, reloc);
1458   fixP->tc_fix_data = NULL;
1459   fixP->fx_no_overflow |= no_overflow;
1460 }
1461
1462
1463 void
1464 md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
1465 {
1466   const struct tilegx_operand *operand;
1467   valueT value = *valP;
1468   operatorT special;
1469   char *p;
1470
1471   /* Leave these for the linker.  */
1472   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1473       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1474     return;
1475
1476   if (fixP->fx_subsy != (symbolS *) NULL)
1477     {
1478       /* We can't actually support subtracting a symbol.  */
1479       as_bad_subtract (fixP);
1480     }
1481
1482   /* Correct relocation types for pc-relativeness.  */
1483   switch (fixP->fx_r_type)
1484     {
1485 #define FIX_PCREL(rtype)                        \
1486       case rtype:                               \
1487         if (fixP->fx_pcrel)                     \
1488           fixP->fx_r_type = rtype##_PCREL;      \
1489       break;                                    \
1490                                                 \
1491     case rtype##_PCREL:                         \
1492       if (!fixP->fx_pcrel)                      \
1493         fixP->fx_r_type = rtype;                \
1494       break
1495
1496 #define FIX_PLT_PCREL(rtype)                    \
1497       case rtype##_PLT_PCREL:                   \
1498         if (!fixP->fx_pcrel)                    \
1499           fixP->fx_r_type = rtype;              \
1500                                                 \
1501       break;
1502
1503       FIX_PCREL (BFD_RELOC_8);
1504       FIX_PCREL (BFD_RELOC_16);
1505       FIX_PCREL (BFD_RELOC_32);
1506       FIX_PCREL (BFD_RELOC_64);
1507       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0);
1508       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0);
1509       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1);
1510       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1);
1511       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2);
1512       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2);
1513       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW3);
1514       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW3);
1515       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST);
1516       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST);
1517       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST);
1518       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST);
1519       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST);
1520       FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST);
1521       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0);
1522       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0);
1523       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1);
1524       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1);
1525       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST);
1526       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST);
1527       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST);
1528       FIX_PLT_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST);
1529
1530 #undef FIX_PCREL
1531
1532     default:
1533       /* Do nothing  */
1534       break;
1535     }
1536
1537   if (fixP->fx_addsy != NULL)
1538     {
1539 #ifdef OBJ_ELF
1540       switch (fixP->fx_r_type)
1541         {
1542         case BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD:
1543         case BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD:
1544         case BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD:
1545         case BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD:
1546         case BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD:
1547         case BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD:
1548         case BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD:
1549         case BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD:
1550         case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD:
1551         case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD:
1552         case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
1553         case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
1554         case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
1555         case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
1556         case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE:
1557         case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE:
1558         case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
1559         case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
1560         case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
1561         case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
1562         case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE:
1563         case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE:
1564         case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
1565         case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
1566         case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
1567         case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
1568         case BFD_RELOC_TILEGX_TLS_GD_CALL:
1569         case BFD_RELOC_TILEGX_TLS_IE_LOAD:
1570         case BFD_RELOC_TILEGX_TLS_DTPMOD64:
1571         case BFD_RELOC_TILEGX_TLS_DTPOFF64:
1572         case BFD_RELOC_TILEGX_TLS_TPOFF64:
1573         case BFD_RELOC_TILEGX_TLS_DTPMOD32:
1574         case BFD_RELOC_TILEGX_TLS_DTPOFF32:
1575         case BFD_RELOC_TILEGX_TLS_TPOFF32:
1576           S_SET_THREAD_LOCAL (fixP->fx_addsy);
1577           break;
1578
1579         default:
1580           /* Do nothing  */
1581           break;
1582         }
1583 #endif
1584       return;
1585     }
1586
1587   /* Apply hw0, etc.  */
1588   special = O_illegal;
1589   switch (fixP->fx_r_type)
1590     {
1591     case BFD_RELOC_TILEGX_HW0:
1592     case BFD_RELOC_TILEGX_IMM16_X0_HW0:
1593     case BFD_RELOC_TILEGX_IMM16_X1_HW0:
1594     case BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL:
1595     case BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL:
1596     case BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL:
1597     case BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL:
1598       special = O_hw0;
1599       break;
1600
1601     case BFD_RELOC_TILEGX_HW0_LAST:
1602     case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST:
1603     case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST:
1604     case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL:
1605     case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL:
1606     case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
1607     case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
1608       special = O_hw0_last;
1609       break;
1610
1611     case BFD_RELOC_TILEGX_HW1:
1612     case BFD_RELOC_TILEGX_IMM16_X0_HW1:
1613     case BFD_RELOC_TILEGX_IMM16_X1_HW1:
1614     case BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL:
1615     case BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL:
1616     case BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL:
1617     case BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL:
1618       special = O_hw1;
1619       break;
1620
1621     case BFD_RELOC_TILEGX_HW1_LAST:
1622     case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST:
1623     case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST:
1624     case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL:
1625     case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL:
1626     case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
1627     case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
1628       special = O_hw1_last;
1629       break;
1630
1631     case BFD_RELOC_TILEGX_HW2:
1632     case BFD_RELOC_TILEGX_IMM16_X0_HW2:
1633     case BFD_RELOC_TILEGX_IMM16_X1_HW2:
1634     case BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL:
1635     case BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL:
1636     case BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL:
1637     case BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL:
1638       special = O_hw2;
1639       break;
1640
1641     case BFD_RELOC_TILEGX_HW2_LAST:
1642     case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST:
1643     case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST:
1644     case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL:
1645     case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL:
1646     case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
1647     case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
1648       special = O_hw2_last;
1649       break;
1650
1651     case BFD_RELOC_TILEGX_HW3:
1652     case BFD_RELOC_TILEGX_IMM16_X0_HW3:
1653     case BFD_RELOC_TILEGX_IMM16_X1_HW3:
1654     case BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL:
1655     case BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL:
1656     case BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL:
1657     case BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL:
1658       special = O_hw3;
1659       break;
1660
1661     default:
1662       /* Do nothing  */
1663       break;
1664     }
1665
1666   if (special != O_illegal)
1667     {
1668       *valP = value = apply_special_operator (special, value,
1669                                               fixP->fx_file, fixP->fx_line);
1670     }
1671
1672   p = fixP->fx_frag->fr_literal + fixP->fx_where;
1673
1674   operand = fixP->tc_fix_data;
1675   if (operand != NULL)
1676     {
1677       /* It's an instruction operand.  */
1678       tilegx_bundle_bits bits =
1679         insert_operand (0, operand, value, fixP->fx_file, fixP->fx_line);
1680
1681       /* Note that we might either be writing out bits for a bundle
1682          or a static network instruction, which are different sizes, so it's
1683          important to stop touching memory once we run out of bits.
1684          ORing in values is OK since we know the existing bits for
1685          this operand are zero.  */
1686       for (; bits != 0; bits >>= 8)
1687         *p++ |= (char)bits;
1688     }
1689   else
1690     {
1691       /* Some other kind of relocation.  */
1692       switch (fixP->fx_r_type)
1693         {
1694         case BFD_RELOC_8:
1695         case BFD_RELOC_8_PCREL:
1696           md_number_to_chars (p, value, 1);
1697           break;
1698
1699         case BFD_RELOC_16:
1700         case BFD_RELOC_16_PCREL:
1701           md_number_to_chars (p, value, 2);
1702           break;
1703
1704         case BFD_RELOC_32:
1705         case BFD_RELOC_32_PCREL:
1706           md_number_to_chars (p, value, 4);
1707           break;
1708
1709         case BFD_RELOC_64:
1710         case BFD_RELOC_64_PCREL:
1711           md_number_to_chars (p, value, 8);
1712           break;
1713
1714         default:
1715           /* Leave it for the linker.  */
1716           return;
1717         }
1718     }
1719
1720   fixP->fx_done = 1;
1721 }
1722
1723
1724 /* Generate the BFD reloc to be stuck in the object file from the
1725    fixup used internally in the assembler.  */
1726
1727 arelent *
1728 tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp)
1729 {
1730   arelent *reloc;
1731
1732   reloc = XNEW (arelent);
1733   reloc->sym_ptr_ptr = XNEW (asymbol *);
1734   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1735   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1736
1737   /* Make sure none of our internal relocations make it this far.
1738      They'd better have been fully resolved by this point.  */
1739   gas_assert ((int) fixp->fx_r_type > 0);
1740
1741   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1742   if (reloc->howto == NULL)
1743     {
1744       as_bad_where (fixp->fx_file, fixp->fx_line,
1745                     _("cannot represent `%s' relocation in object file"),
1746                     bfd_get_reloc_code_name (fixp->fx_r_type));
1747       return NULL;
1748     }
1749
1750   if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
1751     {
1752       as_fatal (_("internal error? cannot generate `%s' relocation (%d, %d)"),
1753                 bfd_get_reloc_code_name (fixp->fx_r_type),
1754                 fixp->fx_pcrel, reloc->howto->pc_relative);
1755     }
1756   gas_assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
1757
1758   reloc->addend = fixp->fx_offset;
1759
1760   return reloc;
1761 }
1762
1763
1764 /* The location from which a PC relative jump should be calculated,
1765    given a PC relative reloc.  */
1766
1767 long
1768 md_pcrel_from (fixS *fixP)
1769 {
1770   return fixP->fx_frag->fr_address + fixP->fx_where;
1771 }
1772
1773
1774 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
1775    a section symbol plus some offset.  */
1776 int
1777 tilegx_fix_adjustable (fixS *fix)
1778 {
1779   /* Prevent all adjustments to global symbols  */
1780   if (S_IS_EXTERNAL (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
1781     return 0;
1782
1783   return 1;
1784 }
1785
1786
1787 int
1788 tilegx_unrecognized_line (int ch)
1789 {
1790   switch (ch)
1791     {
1792     case '{':
1793       if (inside_bundle)
1794         {
1795           as_bad (_("Found '{' when already bundling."));
1796         }
1797       else
1798         {
1799           inside_bundle = 1;
1800           current_bundle_index = 0;
1801         }
1802       return 1;
1803
1804     case '}':
1805       if (!inside_bundle)
1806         {
1807           as_bad (_("Found '}' when not bundling."));
1808         }
1809       else
1810         {
1811           tilegx_flush_bundle ();
1812         }
1813
1814       /* Allow '{' to follow on the same line.  We also allow ";;", but that
1815          happens automatically because ';' is an end of line marker.  */
1816       SKIP_WHITESPACE ();
1817       if (input_line_pointer[0] == '{')
1818         {
1819           input_line_pointer++;
1820           return tilegx_unrecognized_line ('{');
1821         }
1822
1823       demand_empty_rest_of_line ();
1824       return 1;
1825
1826     default:
1827       break;
1828     }
1829
1830   /* Not a valid line.  */
1831   return 0;
1832 }
1833
1834
1835 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
1836    of an rs_align_code fragment.  */
1837
1838 void
1839 tilegx_handle_align (fragS *fragp)
1840 {
1841   addressT bytes, fix;
1842   char *p;
1843
1844   if (fragp->fr_type != rs_align_code)
1845     return;
1846
1847   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
1848   p = fragp->fr_literal + fragp->fr_fix;
1849   fix = 0;
1850
1851   /* Determine the bits for NOP.  */
1852   const struct tilegx_opcode *nop_opcode =
1853     &tilegx_opcodes[TILEGX_OPC_NOP];
1854   tilegx_bundle_bits nop =
1855     (  nop_opcode->fixed_bit_values[TILEGX_PIPELINE_X0]
1856      | nop_opcode->fixed_bit_values[TILEGX_PIPELINE_X1]);
1857
1858   if ((bytes & (TILEGX_BUNDLE_SIZE_IN_BYTES - 1)) != 0)
1859     {
1860       fix = bytes & (TILEGX_BUNDLE_SIZE_IN_BYTES - 1);
1861       memset (p, 0, fix);
1862       p += fix;
1863       bytes -= fix;
1864     }
1865
1866   number_to_chars_littleendian (p, nop, 8);
1867   fragp->fr_fix += fix;
1868   fragp->fr_var = TILEGX_BUNDLE_SIZE_IN_BYTES;
1869 }
1870
1871 /* Standard calling conventions leave the CFA at SP on entry.  */
1872 void
1873 tilegx_cfi_frame_initial_instructions (void)
1874 {
1875   cfi_add_CFA_def_cfa_register (54);
1876 }
1877
1878 int
1879 tc_tilegx_regname_to_dw2regnum (char *regname)
1880 {
1881   int i;
1882   for (i = 0; i < TILEGX_NUM_REGISTERS; i++)
1883     {
1884       if (!strcmp (regname, tilegx_register_names[i]))
1885         return i;
1886     }
1887
1888   return -1;
1889 }
This page took 0.135218 seconds and 4 git commands to generate.