gas/
[external/binutils.git] / gas / config / tc-tic6x.c
1 /* TI C6X assembler.
2    Copyright 2010
3    Free Software Foundation, Inc.
4
5    This file is part of GAS, the GNU Assembler.
6
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to the Free
19    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21
22 #include "as.h"
23 #include "dwarf2dbg.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "opcode/tic6x.h"
27 #include "elf/tic6x.h"
28 #include "elf32-tic6x.h"
29
30 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit
31    host gives identical results to a 32-bit host.  */
32 #define TRUNC(X)        ((valueT) (X) & 0xffffffffU)
33 #define SEXT(X)         ((TRUNC (X) ^ 0x80000000U) - 0x80000000U)
34
35 const char comment_chars[] = ";";
36 const char line_comment_chars[] = "#*;";
37 const char line_separator_chars[] = "@";
38
39 const char EXP_CHARS[] = "eE";
40 const char FLT_CHARS[] = "dDfF";
41
42 const char *md_shortopts = "";
43
44 enum
45   {
46     OPTION_MARCH = OPTION_MD_BASE,
47     OPTION_MATOMIC,
48     OPTION_MNO_ATOMIC,
49     OPTION_MBIG_ENDIAN,
50     OPTION_MLITTLE_ENDIAN,
51     OPTION_MGENERATE_REL
52   };
53
54 struct option md_longopts[] =
55   {
56     { "march", required_argument, NULL, OPTION_MARCH },
57     { "matomic", no_argument, NULL, OPTION_MATOMIC },
58     { "mno-atomic", no_argument, NULL, OPTION_MNO_ATOMIC },
59     { "mbig-endian", no_argument, NULL, OPTION_MBIG_ENDIAN },
60     { "mlittle-endian", no_argument, NULL, OPTION_MLITTLE_ENDIAN },
61     { "mgenerate-rel", no_argument, NULL, OPTION_MGENERATE_REL },
62     { NULL, no_argument, NULL, 0 }
63   };
64 size_t md_longopts_size = sizeof (md_longopts);
65
66 /* Whether to enable atomic instructions.  1 to enable them, 0 to
67    disable, -1 to default from architecture.  */
68 static int tic6x_atomic = -1;
69
70 /* The instructions enabled based only on the selected architecture
71    (all instructions, if no architecture specified).  Atomic
72    instructions may be enabled or disabled separately.  */
73 static unsigned short tic6x_arch_enable = (TIC6X_INSN_C62X
74                                            | TIC6X_INSN_C64X
75                                            | TIC6X_INSN_C64XP
76                                            | TIC6X_INSN_C67X
77                                            | TIC6X_INSN_C67XP
78                                            | TIC6X_INSN_C674X
79                                            | TIC6X_INSN_ATOMIC);
80
81 /* The instructions enabled based on the current set of features
82    (architecture, as modified by other options).  */
83 static unsigned short tic6x_features;
84
85 /* The architecture attribute value, or C6XABI_Tag_CPU_arch_none if
86    not yet set.  */
87 static int tic6x_arch_attribute = C6XABI_Tag_CPU_arch_none;
88
89 /* Whether any instructions at all have been seen.  Once any
90    instructions have been seen, architecture attributes merge into the
91    previous attribute value rather than replacing it.  */
92 static bfd_boolean tic6x_seen_insns = FALSE;
93
94 /* The number of registers in each register file supported by the
95    current architecture.  */
96 static unsigned int tic6x_num_registers;
97
98 /* Whether predication on A0 is possible.  */
99 static bfd_boolean tic6x_predicate_a0;
100
101 /* Whether execute packets can cross fetch packet boundaries.  */
102 static bfd_boolean tic6x_can_cross_fp_boundary;
103
104 /* Whether there are constraints on simultaneous reads and writes of
105    40-bit data.  */
106 static bfd_boolean tic6x_long_data_constraints;
107
108 /* Whether compact instructions are available.  */
109 static bfd_boolean tic6x_compact_insns;
110
111 /* Whether to generate RELA relocations.  */
112 static bfd_boolean tic6x_generate_rela = TRUE;
113
114 /* Table of supported architecture variants.  */
115 typedef struct
116 {
117   const char *arch;
118   int attr;
119   unsigned short features;
120 } tic6x_arch_table;
121 static const tic6x_arch_table tic6x_arches[] =
122   {
123     { "c62x", C6XABI_Tag_CPU_arch_C62X, TIC6X_INSN_C62X },
124     { "c64x", C6XABI_Tag_CPU_arch_C64X, TIC6X_INSN_C62X | TIC6X_INSN_C64X },
125     { "c64x+", C6XABI_Tag_CPU_arch_C64XP, (TIC6X_INSN_C62X
126                                            | TIC6X_INSN_C64X
127                                            | TIC6X_INSN_C64XP) },
128     { "c67x", C6XABI_Tag_CPU_arch_C67X, TIC6X_INSN_C62X | TIC6X_INSN_C67X },
129     { "c67x+", C6XABI_Tag_CPU_arch_C67XP, (TIC6X_INSN_C62X
130                                            | TIC6X_INSN_C67X
131                                            | TIC6X_INSN_C67XP) },
132     { "c674x", C6XABI_Tag_CPU_arch_C674X, (TIC6X_INSN_C62X
133                                            | TIC6X_INSN_C64X
134                                            | TIC6X_INSN_C64XP
135                                            | TIC6X_INSN_C67X
136                                            | TIC6X_INSN_C67XP
137                                            | TIC6X_INSN_C674X) }
138   };
139
140 /* Update the selected architecture based on ARCH, giving an error if
141    ARCH is an invalid value.  Does not call tic6x_update_features; the
142    caller must do that if necessary.  */
143
144 static void
145 tic6x_use_arch (const char *arch)
146 {
147   unsigned int i;
148
149   for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
150     if (strcmp (arch, tic6x_arches[i].arch) == 0)
151       {
152         tic6x_arch_enable = tic6x_arches[i].features;
153         if (tic6x_seen_insns)
154           tic6x_arch_attribute
155             = elf32_tic6x_merge_arch_attributes (tic6x_arch_attribute,
156                                                  tic6x_arches[i].attr);
157         else
158           tic6x_arch_attribute = tic6x_arches[i].attr;
159         return;
160       }
161
162   as_bad (_("unknown architecture '%s'"), arch);
163 }
164
165 /* Parse a target-specific option.  */
166
167 int
168 md_parse_option (int c, char *arg)
169 {
170   switch (c)
171     {
172     case OPTION_MARCH:
173       tic6x_use_arch (arg);
174       break;
175
176     case OPTION_MATOMIC:
177       tic6x_atomic = 1;
178       break;
179
180     case OPTION_MNO_ATOMIC:
181       tic6x_atomic = 0;
182       break;
183
184     case OPTION_MBIG_ENDIAN:
185       target_big_endian = 1;
186       break;
187
188     case OPTION_MLITTLE_ENDIAN:
189       target_big_endian = 0;
190       break;
191
192     case OPTION_MGENERATE_REL:
193       tic6x_generate_rela = FALSE;
194       break;
195
196     default:
197       return 0;
198     }
199   return 1;
200 }
201
202 void
203 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
204 {
205   unsigned int i;
206
207   fputc ('\n', stream);
208   fprintf (stream, _("TMS320C6000 options:\n"));
209   fprintf (stream, _("  -march=ARCH             enable instructions from architecture ARCH\n"));
210   fprintf (stream, _("  -matomic                enable atomic operation instructions\n"));
211   fprintf (stream, _("  -mno-atomic             disable atomic operation instructions\n"));
212   fprintf (stream, _("  -mbig-endian            generate big-endian code\n"));
213   fprintf (stream, _("  -mlittle-endian         generate little-endian code\n"));
214   /* -mgenerate-rel is only for testsuite use and is deliberately
215       undocumented.  */
216
217   fputc ('\n', stream);
218   fprintf (stream, _("Supported ARCH values are:"));
219   for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
220     fprintf (stream, " %s", tic6x_arches[i].arch);
221   fputc ('\n', stream);
222 }
223
224 /* Update enabled features based on the current architecture and
225    related settings.  */
226 static void
227 tic6x_update_features (void)
228 {
229   switch (tic6x_atomic)
230     {
231     case -1:
232       tic6x_features = tic6x_arch_enable;
233       break;
234
235     case 0:
236       tic6x_features = tic6x_arch_enable & ~TIC6X_INSN_ATOMIC;
237       break;
238
239     case 1:
240       tic6x_features = tic6x_arch_enable | TIC6X_INSN_ATOMIC;
241       break;
242
243     default:
244       abort ();
245     }
246
247   tic6x_num_registers
248     = (tic6x_arch_enable & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? 32 : 16;
249
250   tic6x_predicate_a0 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? TRUE : FALSE;
251
252   tic6x_can_cross_fp_boundary
253     = (tic6x_arch_enable
254        & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? TRUE : FALSE;
255
256   tic6x_long_data_constraints
257     = (tic6x_arch_enable & TIC6X_INSN_C64X) ? FALSE : TRUE;
258
259   tic6x_compact_insns = (tic6x_arch_enable & TIC6X_INSN_C64XP) ? TRUE : FALSE;
260 }
261
262 /* Do configuration after all options have been parsed.  */
263
264 void
265 tic6x_after_parse_args (void)
266 {
267   tic6x_update_features ();
268 }
269
270 /* Parse a .arch directive.  */
271
272 static void
273 s_tic6x_arch (int ignored ATTRIBUTE_UNUSED)
274 {
275   char c;
276   char *arch;
277
278   arch = input_line_pointer;
279   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
280     input_line_pointer++;
281   c = *input_line_pointer;
282   *input_line_pointer = 0;
283
284   tic6x_use_arch (arch);
285   tic6x_update_features ();
286   *input_line_pointer = c;
287   demand_empty_rest_of_line ();
288 }
289
290 /* Parse a .atomic directive.  */
291
292 static void
293 s_tic6x_atomic (int ignored ATTRIBUTE_UNUSED)
294 {
295   tic6x_atomic = 1;
296   tic6x_update_features ();
297   demand_empty_rest_of_line ();
298 }
299
300 /* Parse a .noatomic directive.  */
301
302 static void
303 s_tic6x_noatomic (int ignored ATTRIBUTE_UNUSED)
304 {
305   tic6x_atomic = 0;
306   tic6x_update_features ();
307   demand_empty_rest_of_line ();
308 }
309
310 /* Parse a .nocmp directive.  */
311
312 static void
313 s_tic6x_nocmp (int ignored ATTRIBUTE_UNUSED)
314 {
315   seg_info (now_seg)->tc_segment_info_data.nocmp = TRUE;
316   demand_empty_rest_of_line ();
317 }
318
319 /* Track for each attribute whether it has been set explicitly (and so
320    should not have a default value set by the assembler).  */
321 static bfd_boolean tic6x_attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
322
323 /* Parse a .c6xabi_attribute directive.  */
324
325 static void
326 s_tic6x_c6xabi_attribute (int ignored ATTRIBUTE_UNUSED)
327 {
328   int tag = s_vendor_attribute (OBJ_ATTR_PROC);
329
330   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
331     tic6x_attributes_set_explicitly[tag] = TRUE;
332 }
333
334 typedef struct
335 {
336   const char *name;
337   int tag;
338 } tic6x_attribute_table;
339
340 static const tic6x_attribute_table tic6x_attributes[] =
341   {
342 #define TAG(tag, value) { #tag, tag }
343 #include "elf/tic6x-attrs.h"
344 #undef TAG
345   };
346
347 /* Convert an attribute name to a number.  */
348
349 int
350 tic6x_convert_symbolic_attribute (const char *name)
351 {
352   unsigned int i;
353
354   for (i = 0; i < ARRAY_SIZE (tic6x_attributes); i++)
355     if (strcmp (name, tic6x_attributes[i].name) == 0)
356       return tic6x_attributes[i].tag;
357
358   return -1;
359 }
360
361 const pseudo_typeS md_pseudo_table[] =
362   {
363     { "arch", s_tic6x_arch, 0 },
364     { "atomic", s_tic6x_atomic, 0 },
365     { "c6xabi_attribute", s_tic6x_c6xabi_attribute, 0 },
366     { "noatomic", s_tic6x_noatomic, 0 },
367     { "nocmp", s_tic6x_nocmp, 0 },
368     { "word", cons, 4 },
369     { 0, 0, 0 }
370   };
371
372 /* Hash table of opcodes.  For each opcode name, this stores a pointer
373    to a tic6x_opcode_list listing (in an arbitrary order) all opcode
374    table entries with that name.  */
375 static struct hash_control *opcode_hash;
376
377 /* Initialize the assembler (called once at assembler startup).  */
378
379 void
380 md_begin (void)
381 {
382   tic6x_opcode_id id;
383
384   bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
385
386   /* Insert opcodes into the hash table.  */
387   opcode_hash = hash_new ();
388   for (id = 0; id < tic6x_opcode_max; id++)
389     {
390       const char *errmsg;
391       tic6x_opcode_list *opc = xmalloc (sizeof (tic6x_opcode_list));
392
393       opc->id = id;
394       opc->next = hash_find (opcode_hash, tic6x_opcode_table[id].name);
395       if ((errmsg = hash_jam (opcode_hash, tic6x_opcode_table[id].name, opc))
396           != NULL)
397         as_fatal ("%s", _(errmsg));
398     }
399 }
400
401 /* Whether the current line being parsed had the "||" parallel bars.  */
402 static bfd_boolean tic6x_line_parallel;
403
404 /* Whether the current line being parsed started "||^" to indicate an
405    SPMASKed parallel instruction.  */
406 static bfd_boolean tic6x_line_spmask;
407
408 /* If the current line being parsed had an instruction predicate, the
409    creg value for that predicate (which must be nonzero); otherwise
410    0.  */
411 static unsigned int tic6x_line_creg;
412
413 /* If the current line being parsed had an instruction predicate, the
414    z value for that predicate; otherwise 0.  */
415 static unsigned int tic6x_line_z;
416
417 /* Return 1 (updating input_line_pointer as appropriate) if the line
418    starting with C (immediately before input_line_pointer) starts with
419    pre-opcode text appropriate for this target, 0 otherwise.  */
420
421 int
422 tic6x_unrecognized_line (int c)
423 {
424   char *p, *endp;
425   unsigned int z;
426   bfd_boolean areg;
427   bfd_boolean bad_predicate;
428
429   switch (c)
430     {
431     case '|':
432       if (input_line_pointer[0] == '|')
433         {
434           if (input_line_pointer[1] == '^')
435             {
436               tic6x_line_spmask = TRUE;
437               input_line_pointer += 2;
438             }
439           else
440             input_line_pointer += 1;
441           if (tic6x_line_parallel)
442             as_bad (_("multiple '||' on same line"));
443           tic6x_line_parallel = TRUE;
444           if (tic6x_line_creg)
445             as_bad (_("'||' after predicate"));
446           return 1;
447         }
448       return 0;
449
450     case '[':
451       /* If it doesn't look like a predicate at all, just return 0.
452          If it looks like one but not a valid one, give a better
453          error.  */
454       p = input_line_pointer;
455       while (*p != ']' && !is_end_of_line[(unsigned char) *p])
456         p++;
457       if (*p != ']')
458         return 0;
459       endp = p + 1;
460       p = input_line_pointer;
461       z = 0;
462       bad_predicate = FALSE;
463       if (*p == '!')
464         {
465           z = 1;
466           p++;
467         }
468       if (*p == 'A' || *p == 'a')
469         areg = TRUE;
470       else if (*p == 'B' || *p == 'b')
471         areg = FALSE;
472       else
473         {
474           areg = TRUE; /* Avoid uninitialized warning.  */
475           bad_predicate = TRUE;
476         }
477       if (!bad_predicate)
478         {
479           p++;
480           if (*p != '0' && *p != '1' && *p != '2')
481             bad_predicate = TRUE;
482           else if (p[1] != ']')
483             bad_predicate = TRUE;
484           else
485             input_line_pointer = p + 2;
486         }
487
488       if (tic6x_line_creg)
489         as_bad (_("multiple predicates on same line"));
490
491       if (bad_predicate)
492         {
493           char ctmp = *endp;
494           *endp = 0;
495           as_bad (_("bad predicate '%s'"), input_line_pointer - 1);
496           *endp = ctmp;
497           input_line_pointer = endp;
498           return 1;
499         }
500
501       switch (*p)
502         {
503         case '0':
504           tic6x_line_creg = (areg ? 6 : 1);
505           if (areg && !tic6x_predicate_a0)
506             as_bad (_("predication on A0 not supported on this architecture"));
507           break;
508
509         case '1':
510           tic6x_line_creg = (areg ? 4 : 2);
511           break;
512
513         case '2':
514           tic6x_line_creg = (areg ? 5 : 3);
515           break;
516
517         default:
518           abort ();
519         }
520
521       tic6x_line_z = z;
522       return 1;
523
524     default:
525       return 0;
526     }
527 }
528
529 /* Do any target-specific handling of a label required.  */
530
531 void
532 tic6x_frob_label (symbolS *sym)
533 {
534   segment_info_type *si;
535   tic6x_label_list *list;
536
537   if (tic6x_line_parallel)
538     {
539       as_bad (_("label after '||'"));
540       tic6x_line_parallel = FALSE;
541       tic6x_line_spmask = FALSE;
542     }
543   if (tic6x_line_creg)
544     {
545       as_bad (_("label after predicate"));
546       tic6x_line_creg = 0;
547       tic6x_line_z = 0;
548     }
549
550   si = seg_info (now_seg);
551   list = si->tc_segment_info_data.label_list;
552   si->tc_segment_info_data.label_list = xmalloc (sizeof (tic6x_label_list));
553   si->tc_segment_info_data.label_list->next = list;
554   si->tc_segment_info_data.label_list->label = sym;
555
556   /* Defining tc_frob_label overrides the ELF definition of
557      obj_frob_label, so we need to apply its effects here.  */
558   dwarf2_emit_label (sym);
559 }
560
561 /* At end-of-line, give errors for start-of-line decorations that
562    needed an instruction but were not followed by one.  */
563
564 static void
565 tic6x_end_of_line (void)
566 {
567   if (tic6x_line_parallel)
568     {
569       as_bad (_("'||' not followed by instruction"));
570       tic6x_line_parallel = FALSE;
571       tic6x_line_spmask = FALSE;
572     }
573   if (tic6x_line_creg)
574     {
575       as_bad (_("predicate not followed by instruction"));
576       tic6x_line_creg = 0;
577       tic6x_line_z = 0;
578     }
579 }
580
581 /* Do any target-specific handling of the start of a logical line.  */
582
583 void
584 tic6x_start_line_hook (void)
585 {
586   tic6x_end_of_line ();
587 }
588
589 /* Do target-specific handling immediately after an input file from
590    the command line, and any other inputs it includes, have been
591    read.  */
592
593 void
594 tic6x_cleanup (void)
595 {
596   tic6x_end_of_line ();
597 }
598
599 /* Do target-specific initialization after arguments have been
600    processed and the output file created.  */
601
602 void
603 tic6x_init_after_args (void)
604 {
605   elf32_tic6x_set_use_rela_p (stdoutput, tic6x_generate_rela);
606 }
607
608 /* Free LIST of labels (possibly NULL).  */
609
610 static void
611 tic6x_free_label_list (tic6x_label_list *list)
612 {
613   while (list)
614     {
615       tic6x_label_list *old = list;
616
617       list = list->next;
618       free (old);
619     }
620 }
621
622 /* Handle a data alignment of N bytes.  */
623
624 void
625 tic6x_cons_align (int n ATTRIBUTE_UNUSED)
626 {
627   segment_info_type *seginfo = seg_info (now_seg);
628
629   /* Data means there is no current execute packet, and that any label
630      applies to that data rather than a subsequent instruction.  */
631   tic6x_free_label_list (seginfo->tc_segment_info_data.label_list);
632   seginfo->tc_segment_info_data.label_list = NULL;
633   seginfo->tc_segment_info_data.execute_packet_frag = NULL;
634   seginfo->tc_segment_info_data.last_insn_lsb = NULL;
635   seginfo->tc_segment_info_data.spmask_addr = NULL;
636   seginfo->tc_segment_info_data.func_units_used = 0;
637 }
638
639 /* Handle an alignment directive.  Return TRUE if the
640    machine-independent frag generation should be skipped.  */
641
642 bfd_boolean
643 tic6x_do_align (int n, char *fill, int len ATTRIBUTE_UNUSED, int max)
644 {
645   /* Given code alignments of 4, 8, 16 or 32 bytes, we try to handle
646      them in the md_end pass by inserting NOPs in parallel with
647      previous instructions.  We only do this in sections containing
648      nothing but instructions.  Code alignments of 1 or 2 bytes have
649      no effect in such sections (but we record them with
650      machine-dependent frags anyway so they can be skipped or
651      converted to machine-independent), while those of more than 64
652      bytes cannot reliably be handled in this way.  */
653   if (n > 0
654       && max >= 0
655       && max < (1 << n)
656       && !need_pass_2
657       && fill == NULL
658       && subseg_text_p (now_seg))
659     {
660       fragS *align_frag;
661       char *p;
662
663       if (n > 5)
664         return FALSE;
665
666       /* Machine-independent code would generate a frag here, but we
667          wish to handle it in a machine-dependent way.  */
668       if (frag_now_fix () != 0)
669         {
670           if (frag_now->fr_type != rs_machine_dependent)
671             frag_wane (frag_now);
672
673           frag_new (0);
674         }
675       frag_grow (32);
676       align_frag = frag_now;
677       p = frag_var (rs_machine_dependent, 32, 32, max, NULL, n, NULL);
678       /* This must be the same as the frag to which a pointer was just
679          saved.  */
680       if (p != align_frag->fr_literal)
681         abort ();
682       align_frag->tc_frag_data.is_insns = FALSE;
683       return TRUE;
684     }
685   else
686     return FALSE;
687 }
688
689 /* Types of operand for parsing purposes.  These are used as bit-masks
690    to tell tic6x_parse_operand what forms of operand are
691    permitted.  */
692 #define TIC6X_OP_EXP            0x0001u
693 #define TIC6X_OP_REG            0x0002u
694 #define TIC6X_OP_REGPAIR        0x0004u
695 #define TIC6X_OP_IRP            0x0008u
696 #define TIC6X_OP_NRP            0x0010u
697 /* With TIC6X_OP_MEM_NOUNREG, the contents of a () offset are always
698    interpreted as an expression, which may be a symbol with the same
699    name as a register that ends up being implicitly DP-relative.  With
700    TIC6X_OP_MEM_UNREG, the contents of a () offset are interpreted as
701    a register if they match one, and failing that as an expression,
702    which must be constant.  */
703 #define TIC6X_OP_MEM_NOUNREG    0x0020u
704 #define TIC6X_OP_MEM_UNREG      0x0040u
705 #define TIC6X_OP_CTRL           0x0080u
706 #define TIC6X_OP_FUNC_UNIT      0x0100u
707
708 /* A register or register pair read by the assembler.  */
709 typedef struct
710 {
711   /* The side the register is on (1 or 2).  */
712   unsigned int side;
713   /* The register number (0 to 31).  */
714   unsigned int num;
715 } tic6x_register;
716
717 /* Types of modification of a base address.  */
718 typedef enum
719   {
720     tic6x_mem_mod_none,
721     tic6x_mem_mod_plus,
722     tic6x_mem_mod_minus,
723     tic6x_mem_mod_preinc,
724     tic6x_mem_mod_predec,
725     tic6x_mem_mod_postinc,
726     tic6x_mem_mod_postdec
727   } tic6x_mem_mod;
728
729 /* Scaled [] or unscaled () nature of an offset.  */
730 typedef enum
731   {
732     tic6x_offset_none,
733     tic6x_offset_scaled,
734     tic6x_offset_unscaled
735   } tic6x_mem_scaling;
736
737 /* A memory operand read by the assembler.  */
738 typedef struct
739 {
740   /* The base register.  */
741   tic6x_register base_reg;
742   /* How the base register is modified.  */
743   tic6x_mem_mod mod;
744   /* Whether there is an offset (required with plain "+" and "-"), and
745      whether it is scaled or unscaled if so.  */
746   tic6x_mem_scaling scaled;
747   /* Whether the offset is a register (TRUE) or an expression
748      (FALSE).  */
749   bfd_boolean offset_is_reg;
750   /* The offset.  */
751   union
752   {
753     expressionS exp;
754     tic6x_register reg;
755   } offset;
756 } tic6x_mem_ref;
757
758 /* A functional unit in SPMASK operands read by the assembler.  */
759 typedef struct
760 {
761   /* The basic unit.  */
762   tic6x_func_unit_base base;
763   /* The side (1 or 2).  */
764   unsigned int side;
765 } tic6x_func_unit_operand;
766
767 /* An operand read by the assembler.  */
768 typedef struct
769 {
770   /* The syntactic form of the operand, as one of the bit-masks
771      above.  */
772   unsigned int form;
773   /* The operand value.  */
774   union
775   {
776     /* An expression: TIC6X_OP_EXP.  */
777     expressionS exp;
778     /* A register: TIC6X_OP_REG, TIC6X_OP_REGPAIR.  */
779     tic6x_register reg;
780     /* A memory reference: TIC6X_OP_MEM_NOUNREG,
781        TIC6X_OP_MEM_UNREG.  */
782     tic6x_mem_ref mem;
783     /* A control register: TIC6X_OP_CTRL.  */
784     tic6x_ctrl_id ctrl;
785     /* A functional unit: TIC6X_OP_FUNC_UNIT.  */
786     tic6x_func_unit_operand func_unit;
787   } value;
788 } tic6x_operand;
789
790 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
791
792 /* Parse a register operand, or part of an operand, starting at *P.
793    If syntactically OK (including that the number is in the range 0 to
794    31, but not necessarily in range for this architecture), return
795    TRUE, putting the register side and number in *REG and update *P to
796    point immediately after the register number; otherwise return FALSE
797    without changing *P (but possibly changing *REG).  Do not print any
798    diagnostics.  */
799
800 static bfd_boolean
801 tic6x_parse_register (char **p, tic6x_register *reg)
802 {
803   char *r = *p;
804
805   switch (*r)
806     {
807     case 'a':
808     case 'A':
809       reg->side = 1;
810       break;
811
812     case 'b':
813     case 'B':
814       reg->side = 2;
815       break;
816
817     default:
818       return FALSE;
819     }
820   r++;
821
822   if (*r >= '0' && *r <= '9')
823     {
824       reg->num = *r - '0';
825       r++;
826     }
827   else
828     return FALSE;
829
830   if (reg->num > 0 && *r >= '0' && *r <= '9')
831     {
832       reg->num = reg->num * 10 + (*r - '0');
833       r++;
834     }
835
836   if (*r >= '0' && *r <= '9')
837     return FALSE;
838
839   if (reg->num >= 32)
840     return FALSE;
841   *p = r;
842   return TRUE;
843 }
844
845 /* Parse the initial two characters of a functional unit name starting
846    at *P.  If OK, set *BASE and *SIDE and return TRUE; otherwise,
847    return FALSE.  */
848
849 static bfd_boolean
850 tic6x_parse_func_unit_base (char *p, tic6x_func_unit_base *base,
851                             unsigned int *side)
852 {
853   bfd_boolean good_func_unit = TRUE;
854   tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
855   unsigned int maybe_side = 0;
856
857   switch (p[0])
858     {
859     case 'd':
860     case 'D':
861       maybe_base = tic6x_func_unit_d;
862       break;
863
864     case 'l':
865     case 'L':
866       maybe_base = tic6x_func_unit_l;
867       break;
868
869     case 'm':
870     case 'M':
871       maybe_base = tic6x_func_unit_m;
872       break;
873
874     case 's':
875     case 'S':
876       maybe_base = tic6x_func_unit_s;
877       break;
878
879     default:
880       good_func_unit = FALSE;
881       break;
882     }
883
884   if (good_func_unit)
885     switch (p[1])
886       {
887       case '1':
888         maybe_side = 1;
889         break;
890
891       case '2':
892         maybe_side = 2;
893         break;
894
895       default:
896         good_func_unit = FALSE;
897         break;
898       }
899
900   if (good_func_unit)
901     {
902       *base = maybe_base;
903       *side = maybe_side;
904     }
905
906   return good_func_unit;
907 }
908
909 /* Parse an operand starting at *P.  If the operand parses OK, return
910    TRUE and store the value in *OP; otherwise return FALSE (possibly
911    changing *OP).  In any case, update *P to point to the following
912    comma or end of line.  The possible operand forms are given by
913    OP_FORMS.  For diagnostics, this is operand OPNO of an opcode
914    starting at STR, length OPC_LEN.  */
915
916 static bfd_boolean
917 tic6x_parse_operand (char **p, tic6x_operand *op, unsigned int op_forms,
918                      char *str, int opc_len, unsigned int opno)
919 {
920   bfd_boolean operand_parsed = FALSE;
921   char *q = *p;
922
923   if ((op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
924       == (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
925     abort ();
926
927   /* Check for functional unit names for SPMASK and SPMASKR.  */
928   if (!operand_parsed && (op_forms & TIC6X_OP_FUNC_UNIT))
929     {
930       tic6x_func_unit_base base = tic6x_func_unit_nfu;
931       unsigned int side = 0;
932
933       if (tic6x_parse_func_unit_base (q, &base, &side))
934         {
935           char *rq = q + 2;
936
937           skip_whitespace (rq);
938           if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
939             {
940               op->form = TIC6X_OP_FUNC_UNIT;
941               op->value.func_unit.base = base;
942               op->value.func_unit.side = side;
943               operand_parsed = TRUE;
944               q = rq;
945             }
946         }
947     }
948
949   /* Check for literal "irp".  */
950   if (!operand_parsed && (op_forms & TIC6X_OP_IRP))
951     {
952       if ((q[0] == 'i' || q[0] == 'I')
953           && (q[1] == 'r' || q[1] == 'R')
954           && (q[2] == 'p' || q[2] == 'P'))
955         {
956           char *rq = q + 3;
957
958           skip_whitespace (rq);
959           if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
960             {
961               op->form = TIC6X_OP_IRP;
962               operand_parsed = TRUE;
963               q = rq;
964             }
965         }
966     }
967
968   /* Check for literal "nrp".  */
969   if (!operand_parsed && (op_forms & TIC6X_OP_NRP))
970     {
971       if ((q[0] == 'n' || q[0] == 'N')
972           && (q[1] == 'r' || q[1] == 'R')
973           && (q[2] == 'p' || q[2] == 'P'))
974         {
975           char *rq = q + 3;
976
977           skip_whitespace (rq);
978           if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
979             {
980               op->form = TIC6X_OP_NRP;
981               operand_parsed = TRUE;
982               q = rq;
983             }
984         }
985     }
986
987   /* Check for control register names.  */
988   if (!operand_parsed && (op_forms & TIC6X_OP_CTRL))
989     {
990       tic6x_ctrl_id crid;
991
992       for (crid = 0; crid < tic6x_ctrl_max; crid++)
993         {
994           size_t len = strlen (tic6x_ctrl_table[crid].name);
995
996           if (strncasecmp (tic6x_ctrl_table[crid].name, q, len) == 0)
997             {
998               char *rq = q + len;
999
1000               skip_whitespace (rq);
1001               if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1002                 {
1003                   op->form = TIC6X_OP_CTRL;
1004                   op->value.ctrl = crid;
1005                   operand_parsed = TRUE;
1006                   q = rq;
1007                   if (!(tic6x_ctrl_table[crid].isa_variants & tic6x_features))
1008                     as_bad (_("control register '%s' not supported "
1009                               "on this architecture"),
1010                             tic6x_ctrl_table[crid].name);
1011                 }
1012             }
1013         }
1014     }
1015
1016   /* See if this looks like a memory reference.  */
1017   if (!operand_parsed
1018       && (op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG)))
1019     {
1020       bfd_boolean mem_ok = TRUE;
1021       char *mq = q;
1022       tic6x_mem_mod mem_mod = tic6x_mem_mod_none;
1023       tic6x_register base_reg;
1024       bfd_boolean require_offset, permit_offset;
1025       tic6x_mem_scaling scaled;
1026       bfd_boolean offset_is_reg;
1027       expressionS offset_exp;
1028       tic6x_register offset_reg;
1029
1030       if (*mq == '*')
1031         mq++;
1032       else
1033         mem_ok = FALSE;
1034
1035       if (mem_ok)
1036         {
1037           skip_whitespace (mq);
1038           switch (*mq)
1039             {
1040             case '+':
1041               if (mq[1] == '+')
1042                 {
1043                   mem_mod = tic6x_mem_mod_preinc;
1044                   mq += 2;
1045                 }
1046               else
1047                 {
1048                   mem_mod = tic6x_mem_mod_plus;
1049                   mq++;
1050                 }
1051               break;
1052
1053             case '-':
1054               if (mq[1] == '-')
1055                 {
1056                   mem_mod = tic6x_mem_mod_predec;
1057                   mq += 2;
1058                 }
1059               else
1060                 {
1061                   mem_mod = tic6x_mem_mod_minus;
1062                   mq++;
1063                 }
1064               break;
1065
1066             default:
1067               break;
1068             }
1069         }
1070
1071       if (mem_ok)
1072         {
1073           skip_whitespace (mq);
1074           mem_ok = tic6x_parse_register (&mq, &base_reg);
1075         }
1076
1077       if (mem_ok && mem_mod == tic6x_mem_mod_none)
1078         {
1079           skip_whitespace (mq);
1080           if (mq[0] == '+' && mq[1] == '+')
1081             {
1082               mem_mod = tic6x_mem_mod_postinc;
1083               mq += 2;
1084             }
1085           else if (mq[0] == '-' && mq[1] == '-')
1086             {
1087               mem_mod = tic6x_mem_mod_postdec;
1088               mq += 2;
1089             }
1090         }
1091
1092       if (mem_mod == tic6x_mem_mod_none)
1093         permit_offset = FALSE;
1094       else
1095         permit_offset = TRUE;
1096       if (mem_mod == tic6x_mem_mod_plus || mem_mod == tic6x_mem_mod_minus)
1097         require_offset = TRUE;
1098       else
1099         require_offset = FALSE;
1100       scaled = tic6x_offset_none;
1101       offset_is_reg = FALSE;
1102
1103       if (mem_ok && permit_offset)
1104         {
1105           char endc = 0;
1106
1107           skip_whitespace (mq);
1108           switch (*mq)
1109             {
1110             case '[':
1111               scaled = tic6x_offset_scaled;
1112               mq++;
1113               endc = ']';
1114               break;
1115
1116             case '(':
1117               scaled = tic6x_offset_unscaled;
1118               mq++;
1119               endc = ')';
1120               break;
1121
1122             default:
1123               break;
1124             }
1125           if (scaled != tic6x_offset_none)
1126             {
1127               skip_whitespace (mq);
1128               if (scaled == tic6x_offset_scaled
1129                   || (op_forms & TIC6X_OP_MEM_UNREG))
1130                 {
1131                   bfd_boolean reg_ok;
1132                   char *rq = mq;
1133
1134                   reg_ok = tic6x_parse_register (&rq, &offset_reg);
1135                   if (reg_ok)
1136                     {
1137                       skip_whitespace (rq);
1138                       if (*rq == endc)
1139                         {
1140                           mq = rq;
1141                           offset_is_reg = TRUE;
1142                         }
1143                     }
1144                 }
1145               if (!offset_is_reg)
1146                 {
1147                   char *save_input_line_pointer;
1148
1149                   save_input_line_pointer = input_line_pointer;
1150                   input_line_pointer = mq;
1151                   expression (&offset_exp);
1152                   mq = input_line_pointer;
1153                   input_line_pointer = save_input_line_pointer;
1154                 }
1155               skip_whitespace (mq);
1156               if (*mq == endc)
1157                 mq++;
1158               else
1159                 mem_ok = FALSE;
1160             }
1161         }
1162
1163       if (mem_ok && require_offset && scaled == tic6x_offset_none)
1164         mem_ok = FALSE;
1165
1166       if (mem_ok)
1167         {
1168           skip_whitespace (mq);
1169           if (!is_end_of_line[(unsigned char) *mq] && *mq != ',')
1170             mem_ok = FALSE;
1171         }
1172
1173       if (mem_ok)
1174         {
1175           op->form = op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG);
1176           op->value.mem.base_reg = base_reg;
1177           op->value.mem.mod = mem_mod;
1178           op->value.mem.scaled = scaled;
1179           op->value.mem.offset_is_reg = offset_is_reg;
1180           if (offset_is_reg)
1181             op->value.mem.offset.reg = offset_reg;
1182           else
1183             op->value.mem.offset.exp = offset_exp;
1184           operand_parsed = TRUE;
1185           q = mq;
1186           if (base_reg.num >= tic6x_num_registers)
1187             as_bad (_("register number %u not supported on this architecture"),
1188                     base_reg.num);
1189           if (offset_is_reg && offset_reg.num >= tic6x_num_registers)
1190             as_bad (_("register number %u not supported on this architecture"),
1191                     offset_reg.num);
1192         }
1193     }
1194
1195   /* See if this looks like a register or register pair.  */
1196   if (!operand_parsed && (op_forms & (TIC6X_OP_REG | TIC6X_OP_REGPAIR)))
1197     {
1198       tic6x_register first_reg, second_reg;
1199       bfd_boolean reg_ok;
1200       char *rq = q;
1201
1202       reg_ok = tic6x_parse_register (&rq, &first_reg);
1203
1204       if (reg_ok)
1205         {
1206           if (*rq == ':' && (op_forms & TIC6X_OP_REGPAIR))
1207             {
1208               rq++;
1209               reg_ok = tic6x_parse_register (&rq, &second_reg);
1210               if (reg_ok)
1211                 {
1212                   skip_whitespace (rq);
1213                   if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1214                     {
1215                       if ((second_reg.num & 1)
1216                           || (first_reg.num != second_reg.num + 1)
1217                           || (first_reg.side != second_reg.side))
1218                         as_bad (_("register pair for operand %u of '%.*s'"
1219                                   " not a valid even/odd pair"), opno,
1220                                 opc_len, str);
1221                       op->form = TIC6X_OP_REGPAIR;
1222                       op->value.reg = second_reg;
1223                       operand_parsed = TRUE;
1224                       q = rq;
1225                     }
1226                 }
1227             }
1228           else if (op_forms & TIC6X_OP_REG)
1229             {
1230               skip_whitespace (rq);
1231               if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1232                 {
1233                   op->form = TIC6X_OP_REG;
1234                   op->value.reg = first_reg;
1235                   operand_parsed = TRUE;
1236                   q = rq;
1237                 }
1238             }
1239         }
1240       if (operand_parsed)
1241         {
1242           if (first_reg.num >= tic6x_num_registers)
1243             as_bad (_("register number %u not supported on this architecture"),
1244                     first_reg.num);
1245           if (op->form == TIC6X_OP_REGPAIR
1246               && second_reg.num >= tic6x_num_registers)
1247             as_bad (_("register number %u not supported on this architecture"),
1248                     second_reg.num);
1249         }
1250     }
1251
1252   /* Otherwise, parse it as an expression.  */
1253   if (!operand_parsed && (op_forms & TIC6X_OP_EXP))
1254     {
1255       char *save_input_line_pointer;
1256
1257       save_input_line_pointer = input_line_pointer;
1258       input_line_pointer = q;
1259       op->form = TIC6X_OP_EXP;
1260       expression (&op->value.exp);
1261       q = input_line_pointer;
1262       input_line_pointer = save_input_line_pointer;
1263       operand_parsed = TRUE;
1264     }
1265
1266   if (operand_parsed)
1267     {
1268       /* Now the operand has been parsed, there must be nothing more
1269          before the comma or end of line.  */
1270       skip_whitespace (q);
1271       if (!is_end_of_line[(unsigned char) *q] && *q != ',')
1272         {
1273           operand_parsed = FALSE;
1274           as_bad (_("junk after operand %u of '%.*s'"), opno,
1275                   opc_len, str);
1276           while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1277             q++;
1278         }
1279     }
1280   else
1281     {
1282       /* This could not be parsed as any acceptable form of
1283          operand.  */
1284       switch (op_forms)
1285         {
1286         case TIC6X_OP_REG | TIC6X_OP_REGPAIR:
1287           as_bad (_("bad register or register pair for operand %u of '%.*s'"),
1288                   opno, opc_len, str);
1289           break;
1290
1291         case TIC6X_OP_REG | TIC6X_OP_CTRL:
1292         case TIC6X_OP_REG:
1293           as_bad (_("bad register for operand %u of '%.*s'"),
1294                   opno, opc_len, str);
1295           break;
1296
1297         case TIC6X_OP_REGPAIR:
1298           as_bad (_("bad register pair for operand %u of '%.*s'"),
1299                   opno, opc_len, str);
1300           break;
1301
1302         case TIC6X_OP_FUNC_UNIT:
1303           as_bad (_("bad functional unit for operand %u of '%.*s'"),
1304                   opno, opc_len, str);
1305           break;
1306
1307         default:
1308           as_bad (_("bad operand %u of '%.*s'"),
1309                   opno, opc_len, str);
1310           break;
1311
1312         }
1313       while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1314         q++;
1315     }
1316   *p = q;
1317   return operand_parsed;
1318 }
1319
1320 /* Table of assembler operators and associated O_* values.  */
1321 typedef struct
1322 {
1323   const char *name;
1324   operatorT op;
1325 } tic6x_operator_table;
1326 static const tic6x_operator_table tic6x_operators[] = {
1327 #define O_dsbt_index O_md1
1328   { "dsbt_index", O_dsbt_index },
1329 #define O_got O_md2
1330   { "got", O_got },
1331 #define O_dpr_got O_md3
1332   { "dpr_got", O_dpr_got },
1333 #define O_dpr_byte O_md4
1334   { "dpr_byte", O_dpr_byte },
1335 #define O_dpr_hword O_md5
1336   { "dpr_hword", O_dpr_hword },
1337 #define O_dpr_word O_md6
1338   { "dpr_word", O_dpr_word },
1339 };
1340
1341 /* Parse a name in some machine-specific way.  Used on C6X to handle
1342    assembler operators.  */
1343
1344 int
1345 tic6x_parse_name (const char *name, expressionS *exprP,
1346                   enum expr_mode mode ATTRIBUTE_UNUSED, char *nextchar)
1347 {
1348   char *p = input_line_pointer;
1349   char c, *name_start, *name_end;
1350   const char *inner_name;
1351   unsigned int i;
1352   operatorT op = O_illegal;
1353   symbolS *sym;
1354
1355   if (*name != '$')
1356     return 0;
1357
1358   for (i = 0; i < ARRAY_SIZE (tic6x_operators); i++)
1359     if (strcasecmp (name + 1, tic6x_operators[i].name) == 0)
1360       {
1361         op = tic6x_operators[i].op;
1362         break;
1363       }
1364
1365   if (op == O_illegal)
1366     return 0;
1367
1368   *input_line_pointer = *nextchar;
1369   skip_whitespace (p);
1370
1371   if (*p != '(')
1372     {
1373       *input_line_pointer = 0;
1374       return 0;
1375     }
1376   p++;
1377   skip_whitespace (p);
1378
1379   if (!is_name_beginner (*p))
1380     {
1381       *input_line_pointer = 0;
1382       return 0;
1383     }
1384
1385   name_start = p;
1386   p++;
1387   while (is_part_of_name (*p))
1388     p++;
1389   name_end = p;
1390   skip_whitespace (p);
1391
1392   if (*p != ')')
1393     {
1394       *input_line_pointer = 0;
1395       return 0;
1396     }
1397
1398   input_line_pointer = p + 1;
1399   *nextchar = *input_line_pointer;
1400   *input_line_pointer = 0;
1401
1402   c = *name_end;
1403   *name_end = 0;
1404   inner_name = name_start;
1405   if (op == O_dsbt_index && strcmp (inner_name, "__c6xabi_DSBT_BASE") != 0)
1406     {
1407       as_bad (_("$DSBT_INDEX must be used with __c6xabi_DSBT_BASE"));
1408       inner_name = "__c6xabi_DSBT_BASE";
1409     }
1410   sym = symbol_find_or_make (inner_name);
1411   *name_end = c;
1412
1413   exprP->X_op = op;
1414   exprP->X_add_symbol = sym;
1415   exprP->X_add_number = 0;
1416   exprP->X_op_symbol = NULL;
1417   exprP->X_md = 0;
1418
1419   return 1;
1420 }
1421
1422 /* Create a fixup for an expression.  Same arguments as fix_new_exp,
1423    plus FIX_ADDA which is TRUE for ADDA instructions (to indicate that
1424    fixes resolving to constants should have those constants implicitly
1425    shifted) and FALSE otherwise, but look for C6X-specific expression
1426    types and adjust the relocations or give errors accordingly.  */
1427
1428 static void
1429 tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
1430                    int pcrel, bfd_reloc_code_real_type r_type,
1431                    bfd_boolean fix_adda)
1432 {
1433   bfd_reloc_code_real_type new_reloc = BFD_RELOC_UNUSED;
1434   fixS *fix;
1435
1436   switch (exp->X_op)
1437     {
1438     case O_dsbt_index:
1439       switch (r_type)
1440         {
1441         case BFD_RELOC_C6000_SBR_U15_W:
1442           new_reloc = BFD_RELOC_C6000_DSBT_INDEX;
1443           break;
1444
1445         default:
1446           as_bad (_("$DSBT_INDEX not supported in this context"));
1447           return;
1448         }
1449       break;
1450
1451     case O_got:
1452       switch (r_type)
1453         {
1454         case BFD_RELOC_C6000_SBR_U15_W:
1455           new_reloc = BFD_RELOC_C6000_SBR_GOT_U15_W;
1456           break;
1457
1458         default:
1459           as_bad (_("$GOT not supported in this context"));
1460           return;
1461         }
1462       break;
1463
1464     case O_dpr_got:
1465       switch (r_type)
1466         {
1467         case BFD_RELOC_C6000_ABS_L16:
1468           new_reloc = BFD_RELOC_C6000_SBR_GOT_L16_W;
1469           break;
1470
1471         case BFD_RELOC_C6000_ABS_H16:
1472           new_reloc = BFD_RELOC_C6000_SBR_GOT_H16_W;
1473           break;
1474
1475         default:
1476           as_bad (_("$DPR_GOT not supported in this context"));
1477           return;
1478         }
1479       break;
1480
1481     case O_dpr_byte:
1482       switch (r_type)
1483         {
1484         case BFD_RELOC_C6000_ABS_S16:
1485           new_reloc = BFD_RELOC_C6000_SBR_S16;
1486           break;
1487
1488         case BFD_RELOC_C6000_ABS_L16:
1489           new_reloc = BFD_RELOC_C6000_SBR_L16_B;
1490           break;
1491
1492         case BFD_RELOC_C6000_ABS_H16:
1493           new_reloc = BFD_RELOC_C6000_SBR_H16_B;
1494           break;
1495
1496         default:
1497           as_bad (_("$DPR_BYTE not supported in this context"));
1498           return;
1499         }
1500       break;
1501
1502     case O_dpr_hword:
1503       switch (r_type)
1504         {
1505         case BFD_RELOC_C6000_ABS_L16:
1506           new_reloc = BFD_RELOC_C6000_SBR_L16_H;
1507           break;
1508
1509         case BFD_RELOC_C6000_ABS_H16:
1510           new_reloc = BFD_RELOC_C6000_SBR_H16_H;
1511           break;
1512
1513         default:
1514           as_bad (_("$DPR_HWORD not supported in this context"));
1515           return;
1516         }
1517       break;
1518
1519     case O_dpr_word:
1520       switch (r_type)
1521         {
1522         case BFD_RELOC_C6000_ABS_L16:
1523           new_reloc = BFD_RELOC_C6000_SBR_L16_W;
1524           break;
1525
1526         case BFD_RELOC_C6000_ABS_H16:
1527           new_reloc = BFD_RELOC_C6000_SBR_H16_W;
1528           break;
1529
1530         default:
1531           as_bad (_("$DPR_WORD not supported in this context"));
1532           return;
1533         }
1534       break;
1535
1536     case O_symbol:
1537       break;
1538
1539     default:
1540       if (pcrel)
1541         {
1542           as_bad (_("invalid PC-relative operand"));
1543           return;
1544         }
1545       break;
1546     }
1547
1548   if (new_reloc == BFD_RELOC_UNUSED)
1549     fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
1550   else
1551     fix = fix_new (frag, where, size, exp->X_add_symbol, exp->X_add_number,
1552                    pcrel, new_reloc);
1553   fix->tc_fix_data.fix_adda = fix_adda;
1554 }
1555
1556 /* Generate a fix for a constant (.word etc.).  Needed to ensure these
1557    go through the error checking in tic6x_fix_new_exp.  */
1558
1559 void
1560 tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp)
1561 {
1562   bfd_reloc_code_real_type r_type;
1563
1564   switch (size)
1565     {
1566     case 1:
1567       r_type = BFD_RELOC_8;
1568       break;
1569
1570     case 2:
1571       r_type = BFD_RELOC_16;
1572       break;
1573
1574     case 4:
1575       r_type = BFD_RELOC_32;
1576       break;
1577
1578     default:
1579       as_bad (_("no %d-byte relocations available"), size);
1580       return;
1581     }
1582
1583   tic6x_fix_new_exp (frag, where, size, exp, 0, r_type, FALSE);
1584 }
1585
1586 /* Initialize target-specific fix data.  */
1587
1588 void
1589 tic6x_init_fix_data (fixS *fixP)
1590 {
1591   fixP->tc_fix_data.fix_adda = FALSE;
1592 }
1593
1594 /* Return true if the fix can be handled by GAS, false if it must
1595    be passed through to the linker.  */
1596
1597 bfd_boolean
1598 tic6x_fix_adjustable (fixS *fixP)
1599 {
1600   switch (fixP->fx_r_type)
1601     {
1602       /* Adjust_reloc_syms doesn't know about the GOT.  */
1603     case BFD_RELOC_C6000_SBR_GOT_U15_W:
1604     case BFD_RELOC_C6000_SBR_GOT_H16_W:
1605     case BFD_RELOC_C6000_SBR_GOT_L16_W:
1606       return 0;
1607
1608     default:
1609       return 1;
1610     }
1611 }
1612
1613 /* Given the fine-grained form of an operand, return the coarse
1614    (bit-mask) form.  */
1615
1616 static unsigned int
1617 tic6x_coarse_operand_form (tic6x_operand_form form)
1618 {
1619   switch (form)
1620     {
1621     case tic6x_operand_asm_const:
1622     case tic6x_operand_link_const:
1623       return TIC6X_OP_EXP;
1624
1625     case tic6x_operand_reg:
1626     case tic6x_operand_xreg:
1627     case tic6x_operand_dreg:
1628     case tic6x_operand_areg:
1629     case tic6x_operand_retreg:
1630       return TIC6X_OP_REG;
1631
1632     case tic6x_operand_regpair:
1633     case tic6x_operand_xregpair:
1634     case tic6x_operand_dregpair:
1635       return TIC6X_OP_REGPAIR;
1636
1637     case tic6x_operand_irp:
1638       return TIC6X_OP_IRP;
1639
1640     case tic6x_operand_nrp:
1641       return TIC6X_OP_NRP;
1642
1643     case tic6x_operand_ctrl:
1644       return TIC6X_OP_CTRL;
1645
1646     case tic6x_operand_mem_short:
1647     case tic6x_operand_mem_long:
1648     case tic6x_operand_mem_deref:
1649       return TIC6X_OP_MEM_NOUNREG;
1650
1651     case tic6x_operand_mem_ndw:
1652       return TIC6X_OP_MEM_UNREG;
1653
1654     case tic6x_operand_func_unit:
1655       return TIC6X_OP_FUNC_UNIT;
1656
1657     default:
1658       abort ();
1659     }
1660 }
1661
1662 /* How an operand may match or not match a desired form.  If different
1663    instruction alternatives fail in different ways, the first failure
1664    in this list determines the diagnostic.  */
1665 typedef enum
1666   {
1667     /* Matches.  */
1668     tic6x_match_matches,
1669     /* Bad coarse form.  */
1670     tic6x_match_coarse,
1671     /* Not constant.  */
1672     tic6x_match_non_const,
1673     /* Register on wrong side.  */
1674     tic6x_match_wrong_side,
1675     /* Not a valid address register.  */
1676     tic6x_match_bad_address,
1677     /* Not a valid return address register.  */
1678     tic6x_match_bad_return,
1679     /* Control register not readable.  */
1680     tic6x_match_ctrl_write_only,
1681     /* Control register not writable.  */
1682     tic6x_match_ctrl_read_only,
1683     /* Not a valid memory reference for this instruction.  */
1684     tic6x_match_bad_mem
1685   } tic6x_operand_match;
1686
1687 /* Return whether an operand matches the given fine-grained form and
1688    read/write usage, and, if it does not match, how it fails to match.
1689    The main functional unit side is SIDE; the cross-path side is CROSS
1690    (the same as SIDE if a cross path not used); the data side is
1691    DATA_SIDE.  */
1692 static tic6x_operand_match
1693 tic6x_operand_matches_form (const tic6x_operand *op, tic6x_operand_form form,
1694                             tic6x_rw rw, unsigned int side, unsigned int cross,
1695                             unsigned int data_side)
1696 {
1697   unsigned int coarse = tic6x_coarse_operand_form (form);
1698
1699   if (coarse != op->form)
1700     return tic6x_match_coarse;
1701
1702   switch (form)
1703     {
1704     case tic6x_operand_asm_const:
1705       if (op->value.exp.X_op == O_constant)
1706         return tic6x_match_matches;
1707       else
1708         return tic6x_match_non_const;
1709
1710     case tic6x_operand_link_const:
1711     case tic6x_operand_irp:
1712     case tic6x_operand_nrp:
1713     case tic6x_operand_func_unit:
1714       /* All expressions are link-time constants, although there may
1715          not be relocations to express them in the output file.  "irp"
1716          and "nrp" are unique operand values.  All parsed functional
1717          unit names are valid.  */
1718       return tic6x_match_matches;
1719
1720     case tic6x_operand_reg:
1721     case tic6x_operand_regpair:
1722       if (op->value.reg.side == side)
1723         return tic6x_match_matches;
1724       else
1725         return tic6x_match_wrong_side;
1726
1727     case tic6x_operand_xreg:
1728     case tic6x_operand_xregpair:
1729       if (op->value.reg.side == cross)
1730         return tic6x_match_matches;
1731       else
1732         return tic6x_match_wrong_side;
1733
1734     case tic6x_operand_dreg:
1735     case tic6x_operand_dregpair:
1736       if (op->value.reg.side == data_side)
1737         return tic6x_match_matches;
1738       else
1739         return tic6x_match_wrong_side;
1740
1741     case tic6x_operand_areg:
1742       if (op->value.reg.side != cross)
1743         return tic6x_match_wrong_side;
1744       else if (op->value.reg.side == 2
1745                && (op->value.reg.num == 14 || op->value.reg.num == 15))
1746         return tic6x_match_matches;
1747       else
1748         return tic6x_match_bad_address;
1749
1750     case tic6x_operand_retreg:
1751       if (op->value.reg.side != side)
1752         return tic6x_match_wrong_side;
1753       else if (op->value.reg.num != 3)
1754         return tic6x_match_bad_return;
1755       else
1756         return tic6x_match_matches;
1757
1758     case tic6x_operand_ctrl:
1759       switch (rw)
1760         {
1761         case tic6x_rw_read:
1762           if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read
1763               || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
1764             return tic6x_match_matches;
1765           else
1766             return tic6x_match_ctrl_write_only;
1767
1768         case tic6x_rw_write:
1769           if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_write
1770               || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
1771             return tic6x_match_matches;
1772           else
1773             return tic6x_match_ctrl_read_only;
1774
1775         default:
1776           abort ();
1777         }
1778
1779     case tic6x_operand_mem_deref:
1780       if (op->value.mem.mod != tic6x_mem_mod_none)
1781         return tic6x_match_bad_mem;
1782       else if (op->value.mem.scaled != tic6x_offset_none)
1783         abort ();
1784       else if (op->value.mem.base_reg.side != side)
1785         return tic6x_match_bad_mem;
1786       else
1787         return tic6x_match_matches;
1788
1789     case tic6x_operand_mem_short:
1790     case tic6x_operand_mem_ndw:
1791       if (op->value.mem.base_reg.side != side)
1792         return tic6x_match_bad_mem;
1793       if (op->value.mem.mod == tic6x_mem_mod_none)
1794         {
1795           if (op->value.mem.scaled != tic6x_offset_none)
1796             abort ();
1797           return tic6x_match_matches;
1798         }
1799       if (op->value.mem.scaled == tic6x_offset_none)
1800         {
1801           if (op->value.mem.mod == tic6x_mem_mod_plus
1802               || op->value.mem.mod == tic6x_mem_mod_minus)
1803             abort ();
1804           return tic6x_match_matches;
1805         }
1806       if (op->value.mem.offset_is_reg)
1807         {
1808           if (op->value.mem.scaled == tic6x_offset_unscaled
1809               && form != tic6x_operand_mem_ndw)
1810             abort ();
1811           if (op->value.mem.offset.reg.side == side)
1812             return tic6x_match_matches;
1813           else
1814             return tic6x_match_bad_mem;
1815         }
1816       else
1817         {
1818           if (op->value.mem.offset.exp.X_op == O_constant)
1819             return tic6x_match_matches;
1820           else
1821             return tic6x_match_bad_mem;
1822         }
1823
1824     case tic6x_operand_mem_long:
1825       if (op->value.mem.base_reg.side == 2
1826           && (op->value.mem.base_reg.num == 14
1827               || op->value.mem.base_reg.num == 15))
1828         {
1829           switch (op->value.mem.mod)
1830             {
1831             case tic6x_mem_mod_none:
1832               if (op->value.mem.scaled != tic6x_offset_none)
1833                 abort ();
1834               return tic6x_match_matches;
1835
1836             case tic6x_mem_mod_plus:
1837               if (op->value.mem.scaled == tic6x_offset_none)
1838                 abort ();
1839               if (op->value.mem.offset_is_reg)
1840                 return tic6x_match_bad_mem;
1841               else if (op->value.mem.scaled == tic6x_offset_scaled
1842                        && op->value.mem.offset.exp.X_op != O_constant)
1843                 return tic6x_match_bad_mem;
1844               else
1845                 return tic6x_match_matches;
1846
1847             case tic6x_mem_mod_minus:
1848             case tic6x_mem_mod_preinc:
1849             case tic6x_mem_mod_predec:
1850             case tic6x_mem_mod_postinc:
1851             case tic6x_mem_mod_postdec:
1852               return tic6x_match_bad_mem;
1853
1854             default:
1855               abort ();
1856             }
1857
1858         }
1859       else
1860         return tic6x_match_bad_mem;
1861
1862     default:
1863       abort ();
1864     }
1865 }
1866
1867 /* Return the number of bits shift used with DP-relative coding method
1868    CODING.  */
1869
1870 static unsigned int
1871 tic6x_dpr_shift (tic6x_coding_method coding)
1872 {
1873   switch (coding)
1874     {
1875     case tic6x_coding_ulcst_dpr_byte:
1876       return 0;
1877
1878     case tic6x_coding_ulcst_dpr_half:
1879       return 1;
1880
1881     case tic6x_coding_ulcst_dpr_word:
1882       return 2;
1883
1884     default:
1885       abort ();
1886     }
1887 }
1888
1889 /* Return the relocation used with DP-relative coding method
1890    CODING.  */
1891
1892 static bfd_reloc_code_real_type
1893 tic6x_dpr_reloc (tic6x_coding_method coding)
1894 {
1895   switch (coding)
1896     {
1897     case tic6x_coding_ulcst_dpr_byte:
1898       return BFD_RELOC_C6000_SBR_U15_B;
1899
1900     case tic6x_coding_ulcst_dpr_half:
1901       return BFD_RELOC_C6000_SBR_U15_H;
1902
1903     case tic6x_coding_ulcst_dpr_word:
1904       return BFD_RELOC_C6000_SBR_U15_W;
1905
1906     default:
1907       abort ();
1908     }
1909 }
1910
1911 /* Given a memory reference *MEM_REF as originally parsed, fill in
1912    defaults for missing offsets.  */
1913
1914 static void
1915 tic6x_default_mem_ref (tic6x_mem_ref *mem_ref)
1916 {
1917   switch (mem_ref->mod)
1918     {
1919     case tic6x_mem_mod_none:
1920       if (mem_ref->scaled != tic6x_offset_none)
1921         abort ();
1922       mem_ref->mod = tic6x_mem_mod_plus;
1923       mem_ref->scaled = tic6x_offset_unscaled;
1924       mem_ref->offset_is_reg = FALSE;
1925       memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
1926       mem_ref->offset.exp.X_op = O_constant;
1927       mem_ref->offset.exp.X_add_number = 0;
1928       mem_ref->offset.exp.X_unsigned = 0;
1929       break;
1930
1931     case tic6x_mem_mod_plus:
1932     case tic6x_mem_mod_minus:
1933       if (mem_ref->scaled == tic6x_offset_none)
1934         abort ();
1935       break;
1936
1937     case tic6x_mem_mod_preinc:
1938     case tic6x_mem_mod_predec:
1939     case tic6x_mem_mod_postinc:
1940     case tic6x_mem_mod_postdec:
1941       if (mem_ref->scaled != tic6x_offset_none)
1942         break;
1943       mem_ref->scaled = tic6x_offset_scaled;
1944       mem_ref->offset_is_reg = FALSE;
1945       memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
1946       mem_ref->offset.exp.X_op = O_constant;
1947       mem_ref->offset.exp.X_add_number = 1;
1948       mem_ref->offset.exp.X_unsigned = 0;
1949       break;
1950
1951     default:
1952       abort ();
1953     }
1954 }
1955
1956 /* Return the encoding in the 8-bit field of an SPMASK or SPMASKR
1957    instruction of the specified UNIT, side SIDE.  */
1958
1959 static unsigned int
1960 tic6x_encode_spmask (tic6x_func_unit_base unit, unsigned int side)
1961 {
1962   switch (unit)
1963     {
1964     case tic6x_func_unit_l:
1965       return 1 << (side - 1);
1966
1967     case tic6x_func_unit_s:
1968       return 1 << (side + 1);
1969
1970     case tic6x_func_unit_d:
1971       return 1 << (side + 3);
1972
1973     case tic6x_func_unit_m:
1974       return 1 << (side + 5);
1975
1976     default:
1977       abort ();
1978     }
1979 }
1980
1981 /* Try to encode the instruction with opcode number ID and operands
1982    OPERANDS (number NUM_OPERANDS), creg value THIS_LINE_CREG and z
1983    value THIS_LINE_Z; FUNC_UNIT_SIDE, FUNC_UNIT_CROSS and
1984    FUNC_UNIT_DATA_SIDE describe the functional unit specification;
1985    SPLOOP_II is the ii value from the previous SPLOOP-family
1986    instruction, or 0 if not in such a loop; the only possible problems
1987    are operands being out of range (they already match the
1988    fine-grained form), and inappropriate predication.  If this
1989    succeeds, return the encoding and set *OK to TRUE; otherwise return
1990    0 and set *OK to FALSE.  If a fix is needed, set *FIX_NEEDED to
1991    true and fill in *FIX_EXP, *FIX_PCREL, *FX_R_TYPE and *FIX_ADDA.
1992    Print error messages for failure if PRINT_ERRORS is TRUE; the
1993    opcode starts at STR and has length OPC_LEN.  */
1994
1995 static unsigned int
1996 tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
1997                   unsigned int num_operands, unsigned int this_line_creg,
1998                   unsigned int this_line_z, unsigned int func_unit_side,
1999                   unsigned int func_unit_cross,
2000                   unsigned int func_unit_data_side, int sploop_ii,
2001                   expressionS **fix_exp, int *fix_pcrel,
2002                   bfd_reloc_code_real_type *fx_r_type, bfd_boolean *fix_adda,
2003                   bfd_boolean *fix_needed, bfd_boolean *ok,
2004                   bfd_boolean print_errors, char *str, int opc_len)
2005 {
2006   const tic6x_opcode *opct;
2007   const tic6x_insn_format *fmt;
2008   unsigned int opcode_value;
2009   unsigned int fld;
2010
2011   opct = &tic6x_opcode_table[id];
2012   fmt = &tic6x_insn_format_table[opct->format];
2013   opcode_value = fmt->cst_bits;
2014
2015   for (fld = 0; fld < opct->num_fixed_fields; fld++)
2016     {
2017       if (opct->fixed_fields[fld].min_val == opct->fixed_fields[fld].max_val)
2018         {
2019           const tic6x_insn_field *fldd;
2020           fldd = tic6x_field_from_fmt (fmt, opct->fixed_fields[fld].field_id);
2021           if (fldd == NULL)
2022             abort ();
2023           opcode_value |= opct->fixed_fields[fld].min_val << fldd->low_pos;
2024         }
2025     }
2026
2027   for (fld = 0; fld < opct->num_variable_fields; fld++)
2028     {
2029       const tic6x_insn_field *fldd;
2030       unsigned int value;
2031       unsigned int opno;
2032       unsigned int ffld;
2033       offsetT sign_value;
2034       unsigned int bits;
2035       unsigned int fcyc_bits;
2036       expressionS *expp;
2037       expressionS ucexp;
2038       tic6x_mem_ref mem;
2039
2040       fldd = tic6x_field_from_fmt (fmt, opct->variable_fields[fld].field_id);
2041       if (fldd == NULL)
2042         abort ();
2043       opno = opct->variable_fields[fld].operand_num;
2044       switch (opct->variable_fields[fld].coding_method)
2045         {
2046         case tic6x_coding_ucst:
2047           if (operands[opno].form != TIC6X_OP_EXP)
2048             abort ();
2049           if (operands[opno].value.exp.X_op != O_constant)
2050             abort ();
2051           ucexp = operands[opno].value.exp;
2052         unsigned_constant:
2053           if (ucexp.X_add_number < 0
2054               || ucexp.X_add_number >= (1 << fldd->width))
2055             {
2056               if (print_errors)
2057                 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2058                         opc_len, str);
2059               *ok = FALSE;
2060               return 0;
2061             }
2062           value = ucexp.X_add_number;
2063           break;
2064
2065         case tic6x_coding_scst:
2066           if (operands[opno].form != TIC6X_OP_EXP)
2067             abort ();
2068           if (operands[opno].value.exp.X_op != O_constant)
2069             {
2070               value = 0;
2071               /* Opcode table should not permit non-constants without
2072                  a known relocation for them.  */
2073               if (fldd->low_pos != 7 || fldd->width != 16)
2074                 abort ();
2075               *fix_needed = TRUE;
2076               *fix_exp = &operands[opno].value.exp;
2077               *fix_pcrel = 0;
2078               *fx_r_type = BFD_RELOC_C6000_ABS_S16;
2079               *fix_adda = FALSE;
2080               break;
2081             }
2082           sign_value = SEXT (operands[opno].value.exp.X_add_number);
2083         signed_constant:
2084           if (sign_value < -(1 << (fldd->width - 1))
2085               || (sign_value >= (1 << (fldd->width - 1))))
2086             {
2087               if (print_errors)
2088                 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2089                         opc_len, str);
2090               *ok = FALSE;
2091               return 0;
2092             }
2093           value = sign_value + (1 << (fldd->width - 1));
2094           value ^= (1 << (fldd->width - 1));
2095           break;
2096
2097         case tic6x_coding_ucst_minus_one:
2098           if (operands[opno].form != TIC6X_OP_EXP)
2099             abort ();
2100           if (operands[opno].value.exp.X_op != O_constant)
2101             abort ();
2102           if (operands[opno].value.exp.X_add_number <= 0
2103               || operands[opno].value.exp.X_add_number > (1 << fldd->width))
2104             {
2105               if (print_errors)
2106                 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2107                         opc_len, str);
2108               *ok = FALSE;
2109               return 0;
2110             }
2111           value = operands[opno].value.exp.X_add_number - 1;
2112           break;
2113
2114         case tic6x_coding_scst_negate:
2115           if (operands[opno].form != TIC6X_OP_EXP)
2116             abort ();
2117           if (operands[opno].value.exp.X_op != O_constant)
2118             abort ();
2119           sign_value = SEXT (-operands[opno].value.exp.X_add_number);
2120           goto signed_constant;
2121
2122         case tic6x_coding_ulcst_dpr_byte:
2123         case tic6x_coding_ulcst_dpr_half:
2124         case tic6x_coding_ulcst_dpr_word:
2125           bits = tic6x_dpr_shift (opct->variable_fields[fld].coding_method);
2126           switch (operands[opno].form)
2127             {
2128             case TIC6X_OP_EXP:
2129               if (operands[opno].value.exp.X_op == O_constant)
2130                 {
2131                   ucexp = operands[opno].value.exp;
2132                   goto unsigned_constant;
2133                 }
2134               expp = &operands[opno].value.exp;
2135               break;
2136
2137             case TIC6X_OP_MEM_NOUNREG:
2138               mem = operands[opno].value.mem;
2139               tic6x_default_mem_ref (&mem);
2140               if (mem.offset_is_reg)
2141                 abort ();
2142               if (mem.offset.exp.X_op == O_constant)
2143                 {
2144                   ucexp = mem.offset.exp;
2145                   if (mem.scaled == tic6x_offset_unscaled)
2146                     {
2147                       if (ucexp.X_add_number & ((1 << bits) - 1))
2148                         {
2149                           if (print_errors)
2150                             as_bad (_("offset in operand %u of '%.*s' not "
2151                                       "divisible by %u"), opno + 1, opc_len,
2152                                     str, 1u << bits);
2153                           *ok = FALSE;
2154                           return 0;
2155                         }
2156                       ucexp.X_add_number >>= bits;
2157                     }
2158                   goto unsigned_constant;
2159                 }
2160               if (mem.scaled != tic6x_offset_unscaled)
2161                 abort ();
2162               if (operands[opno].value.mem.mod == tic6x_mem_mod_none
2163                   || operands[opno].value.mem.scaled != tic6x_offset_unscaled
2164                   || operands[opno].value.mem.offset_is_reg)
2165                 abort ();
2166               expp = &operands[opno].value.mem.offset.exp;
2167               break;
2168
2169             default:
2170               abort ();
2171             }
2172           value = 0;
2173           /* Opcode table should not use this encoding without a known
2174              relocation.  */
2175           if (fldd->low_pos != 8 || fldd->width != 15)
2176             abort ();
2177           /* We do not check for offset divisibility here; such a
2178              check is not needed at this point to encode the value,
2179              and if there is eventually a problem it will be detected
2180              either in md_apply_fix or at link time.  */
2181           *fix_needed = TRUE;
2182           *fix_exp = expp;
2183           *fix_pcrel = 0;
2184           *fx_r_type
2185             = tic6x_dpr_reloc (opct->variable_fields[fld].coding_method);
2186           if (operands[opno].form == TIC6X_OP_EXP)
2187             *fix_adda = TRUE;
2188           else
2189             *fix_adda = FALSE;
2190           break;
2191
2192         case tic6x_coding_lcst_low16:
2193           if (operands[opno].form != TIC6X_OP_EXP)
2194             abort ();
2195           if (operands[opno].value.exp.X_op == O_constant)
2196             value = operands[opno].value.exp.X_add_number & 0xffff;
2197           else
2198             {
2199               value = 0;
2200               /* Opcode table should not use this encoding without a
2201                  known relocation.  */
2202               if (fldd->low_pos != 7 || fldd->width != 16)
2203                 abort ();
2204               *fix_needed = TRUE;
2205               *fix_exp = &operands[opno].value.exp;
2206               *fix_pcrel = 0;
2207               *fx_r_type = BFD_RELOC_C6000_ABS_L16;
2208               *fix_adda = FALSE;
2209             }
2210           break;
2211
2212         case tic6x_coding_lcst_high16:
2213           if (operands[opno].form != TIC6X_OP_EXP)
2214             abort ();
2215           if (operands[opno].value.exp.X_op == O_constant)
2216             value = (operands[opno].value.exp.X_add_number >> 16) & 0xffff;
2217           else
2218             {
2219               value = 0;
2220               /* Opcode table should not use this encoding without a
2221                  known relocation.  */
2222               if (fldd->low_pos != 7 || fldd->width != 16)
2223                 abort ();
2224               *fix_needed = TRUE;
2225               *fix_exp = &operands[opno].value.exp;
2226               *fix_pcrel = 0;
2227               *fx_r_type = BFD_RELOC_C6000_ABS_H16;
2228               *fix_adda = FALSE;
2229             }
2230           break;
2231
2232         case tic6x_coding_pcrel:
2233         case tic6x_coding_pcrel_half:
2234           if (operands[opno].form != TIC6X_OP_EXP)
2235             abort ();
2236           value = 0;
2237           *fix_needed = TRUE;
2238           *fix_exp = &operands[opno].value.exp;
2239           *fix_pcrel = 1;
2240           if (fldd->low_pos == 7 && fldd->width == 21)
2241             *fx_r_type = BFD_RELOC_C6000_PCR_S21;
2242           else if (fldd->low_pos == 16 && fldd->width == 12)
2243             *fx_r_type = BFD_RELOC_C6000_PCR_S12;
2244           else if (fldd->low_pos == 13 && fldd->width == 10)
2245             *fx_r_type = BFD_RELOC_C6000_PCR_S10;
2246           else if (fldd->low_pos == 16 && fldd->width == 7)
2247             *fx_r_type = BFD_RELOC_C6000_PCR_S7;
2248           else
2249             /* Opcode table should not use this encoding without a
2250                known relocation.  */
2251             abort ();
2252           *fix_adda = FALSE;
2253           break;
2254
2255         case tic6x_coding_reg:
2256           switch (operands[opno].form)
2257             {
2258             case TIC6X_OP_REG:
2259             case TIC6X_OP_REGPAIR:
2260               value = operands[opno].value.reg.num;
2261               break;
2262
2263             case TIC6X_OP_MEM_NOUNREG:
2264             case TIC6X_OP_MEM_UNREG:
2265               value = operands[opno].value.mem.base_reg.num;
2266               break;
2267
2268             default:
2269               abort ();
2270             }
2271           break;
2272
2273         case tic6x_coding_areg:
2274           switch (operands[opno].form)
2275             {
2276             case TIC6X_OP_REG:
2277               value = (operands[opno].value.reg.num == 15 ? 1 : 0);
2278               break;
2279
2280             case TIC6X_OP_MEM_NOUNREG:
2281               value = (operands[opno].value.mem.base_reg.num == 15 ? 1 : 0);
2282               break;
2283
2284             default:
2285               abort ();
2286             }
2287           break;
2288
2289         case tic6x_coding_crlo:
2290           if (operands[opno].form != TIC6X_OP_CTRL)
2291             abort ();
2292           value = tic6x_ctrl_table[operands[opno].value.ctrl].crlo;
2293           break;
2294
2295         case tic6x_coding_crhi:
2296           if (operands[opno].form != TIC6X_OP_CTRL)
2297             abort ();
2298           value = 0;
2299           break;
2300
2301         case tic6x_coding_reg_shift:
2302           if (operands[opno].form != TIC6X_OP_REGPAIR)
2303             abort ();
2304           value = operands[opno].value.reg.num >> 1;
2305           break;
2306
2307         case tic6x_coding_mem_offset:
2308           if (operands[opno].form != TIC6X_OP_MEM_NOUNREG)
2309             abort ();
2310           mem = operands[opno].value.mem;
2311           tic6x_default_mem_ref (&mem);
2312           if (mem.offset_is_reg)
2313             {
2314               if (mem.scaled != tic6x_offset_scaled)
2315                 abort ();
2316               value = mem.offset.reg.num;
2317             }
2318           else
2319             {
2320               int scale;
2321
2322               if (mem.offset.exp.X_op != O_constant)
2323                 abort ();
2324               switch (mem.scaled)
2325                 {
2326                 case tic6x_offset_scaled:
2327                   scale = 1;
2328                   break;
2329
2330                 case tic6x_offset_unscaled:
2331                   scale = opct->operand_info[opno].size;
2332                   if (scale != 1 && scale != 2 && scale != 4 && scale != 8)
2333                     abort ();
2334                   break;
2335
2336                 default:
2337                   abort ();
2338                 }
2339               if (mem.offset.exp.X_add_number < 0
2340                   || mem.offset.exp.X_add_number >= (1 << fldd->width) * scale)
2341                 {
2342                   if (print_errors)
2343                     as_bad (_("offset in operand %u of '%.*s' out of range"),
2344                             opno + 1, opc_len, str);
2345                   *ok = FALSE;
2346                   return 0;
2347                 }
2348               if (mem.offset.exp.X_add_number % scale)
2349                 {
2350                   if (print_errors)
2351                     as_bad (_("offset in operand %u of '%.*s' not "
2352                               "divisible by %u"),
2353                             opno + 1, opc_len, str, scale);
2354                   *ok = FALSE;
2355                   return 0;
2356                 }
2357               value = mem.offset.exp.X_add_number / scale;
2358             }
2359           break;
2360
2361         case tic6x_coding_mem_offset_noscale:
2362           if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2363             abort ();
2364           mem = operands[opno].value.mem;
2365           tic6x_default_mem_ref (&mem);
2366           if (mem.offset_is_reg)
2367             value = mem.offset.reg.num;
2368           else
2369             {
2370               if (mem.offset.exp.X_op != O_constant)
2371                 abort ();
2372               if (mem.offset.exp.X_add_number < 0
2373                   || mem.offset.exp.X_add_number >= (1 << fldd->width))
2374                 {
2375                   if (print_errors)
2376                     as_bad (_("offset in operand %u of '%.*s' out of range"),
2377                             opno + 1, opc_len, str);
2378                   *ok = FALSE;
2379                   return 0;
2380                 }
2381               value = mem.offset.exp.X_add_number;
2382             }
2383           break;
2384
2385         case tic6x_coding_mem_mode:
2386           if (operands[opno].form != TIC6X_OP_MEM_NOUNREG
2387               && operands[opno].form != TIC6X_OP_MEM_UNREG)
2388             abort ();
2389           mem = operands[opno].value.mem;
2390           tic6x_default_mem_ref (&mem);
2391           switch (mem.mod)
2392             {
2393             case tic6x_mem_mod_plus:
2394               value = 1;
2395               break;
2396
2397             case tic6x_mem_mod_minus:
2398               value = 0;
2399               break;
2400
2401             case tic6x_mem_mod_preinc:
2402               value = 9;
2403               break;
2404
2405             case tic6x_mem_mod_predec:
2406               value = 8;
2407               break;
2408
2409             case tic6x_mem_mod_postinc:
2410               value = 11;
2411               break;
2412
2413             case tic6x_mem_mod_postdec:
2414               value = 10;
2415               break;
2416
2417             default:
2418               abort ();
2419             }
2420           value += (mem.offset_is_reg ? 4 : 0);
2421           break;
2422
2423         case tic6x_coding_scaled:
2424           if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2425             abort ();
2426           mem = operands[opno].value.mem;
2427           tic6x_default_mem_ref (&mem);
2428           switch (mem.scaled)
2429             {
2430             case tic6x_offset_unscaled:
2431               value = 0;
2432               break;
2433
2434             case tic6x_offset_scaled:
2435               value = 1;
2436               break;
2437
2438             default:
2439               abort ();
2440             }
2441           break;
2442
2443         case tic6x_coding_spmask:
2444           /* The position of such a field is hardcoded in the handling
2445              of "||^".  */
2446           if (fldd->low_pos != 18)
2447             abort ();
2448           value = 0;
2449           for (opno = 0; opno < num_operands; opno++)
2450             {
2451               unsigned int v;
2452
2453               v = tic6x_encode_spmask (operands[opno].value.func_unit.base,
2454                                        operands[opno].value.func_unit.side);
2455               if (value & v)
2456                 {
2457                   if (print_errors)
2458                     as_bad (_("functional unit already masked for operand "
2459                               "%u of '%.*s'"), opno + 1, opc_len, str);
2460                   *ok = FALSE;
2461                   return 0;
2462                 }
2463               value |= v;
2464             }
2465           break;
2466
2467         case tic6x_coding_reg_unused:
2468           /* This is a placeholder; correct handling goes along with
2469              resource constraint checks.  */
2470           value = 0;
2471           break;
2472
2473         case tic6x_coding_fstg:
2474         case tic6x_coding_fcyc:
2475           if (operands[opno].form != TIC6X_OP_EXP)
2476             abort ();
2477           if (operands[opno].value.exp.X_op != O_constant)
2478             abort ();
2479           if (!sploop_ii)
2480             {
2481               if (print_errors)
2482                 as_bad (_("'%.*s' instruction not in a software "
2483                           "pipelined loop"),
2484                         opc_len, str);
2485               *ok = FALSE;
2486               return 0;
2487             }
2488
2489           if (sploop_ii <= 1)
2490             fcyc_bits = 0;
2491           else if (sploop_ii <= 2)
2492             fcyc_bits = 1;
2493           else if (sploop_ii <= 4)
2494             fcyc_bits = 2;
2495           else if (sploop_ii <= 8)
2496             fcyc_bits = 3;
2497           else if (sploop_ii <= 14)
2498             fcyc_bits = 4;
2499           else
2500             abort ();
2501           if (fcyc_bits > fldd->width)
2502             abort ();
2503
2504           if (opct->variable_fields[fld].coding_method == tic6x_coding_fstg)
2505             {
2506               if (operands[opno].value.exp.X_add_number < 0
2507                   || (operands[opno].value.exp.X_add_number
2508                       >= (1 << (fldd->width - fcyc_bits))))
2509                 {
2510                   if (print_errors)
2511                     as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2512                             opc_len, str);
2513                   *ok = FALSE;
2514                   return 0;
2515                 }
2516               value = operands[opno].value.exp.X_add_number << fcyc_bits;
2517             }
2518           else
2519             {
2520               if (operands[opno].value.exp.X_add_number < 0
2521                   || (operands[opno].value.exp.X_add_number >= sploop_ii))
2522                 {
2523                   if (print_errors)
2524                     as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2525                             opc_len, str);
2526                   *ok = FALSE;
2527                   return 0;
2528                 }
2529               value = operands[opno].value.exp.X_add_number;
2530             }
2531           break;
2532
2533         case tic6x_coding_fu:
2534           value = func_unit_side == 2 ? 1 : 0;
2535           break;
2536
2537         case tic6x_coding_data_fu:
2538           value = func_unit_data_side == 2 ? 1 : 0;
2539           break;
2540
2541         case tic6x_coding_xpath:
2542           value = func_unit_cross;
2543           break;
2544
2545         default:
2546           abort ();
2547         }
2548
2549       for (ffld = 0; ffld < opct->num_fixed_fields; ffld++)
2550         if ((opct->fixed_fields[ffld].field_id
2551              == opct->variable_fields[fld].field_id)
2552             && (value < opct->fixed_fields[ffld].min_val
2553                 || value > opct->fixed_fields[ffld].max_val))
2554           {
2555             if (print_errors)
2556               as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2557                       opc_len, str);
2558             *ok = FALSE;
2559             return 0;
2560           }
2561
2562       opcode_value |= value << fldd->low_pos;
2563     }
2564
2565   if (this_line_creg)
2566     {
2567       const tic6x_insn_field *creg;
2568       const tic6x_insn_field *z;
2569
2570       creg = tic6x_field_from_fmt (fmt, tic6x_field_creg);
2571       if (creg == NULL)
2572         {
2573           if (print_errors)
2574             as_bad (_("instruction '%.*s' cannot be predicated"),
2575                     opc_len, str);
2576           *ok = FALSE;
2577           return 0;
2578         }
2579       z = tic6x_field_from_fmt (fmt, tic6x_field_z);
2580       /* If there is a creg field, there must be a z field; otherwise
2581          there is an error in the format table.  */
2582       if (z == NULL)
2583         abort ();
2584
2585       opcode_value |= this_line_creg << creg->low_pos;
2586       opcode_value |= this_line_z << z->low_pos;
2587     }
2588
2589   *ok = TRUE;
2590   return opcode_value;
2591 }
2592
2593 /* Convert the target integer stored in N bytes in BUF to a host
2594    integer, returning that value.  */
2595
2596 static valueT
2597 md_chars_to_number (char *buf, int n)
2598 {
2599   valueT result = 0;
2600   unsigned char *p = (unsigned char *) buf;
2601
2602   if (target_big_endian)
2603     {
2604       while (n--)
2605         {
2606           result <<= 8;
2607           result |= (*p++ & 0xff);
2608         }
2609     }
2610   else
2611     {
2612       while (n--)
2613         {
2614           result <<= 8;
2615           result |= (p[n] & 0xff);
2616         }
2617     }
2618
2619   return result;
2620 }
2621
2622 /* Assemble the instruction starting at STR (an opcode, with the
2623    opcode name all-lowercase).  */
2624
2625 void
2626 md_assemble (char *str)
2627 {
2628   char *p;
2629   int opc_len;
2630   bfd_boolean this_line_parallel;
2631   bfd_boolean this_line_spmask;
2632   unsigned int this_line_creg;
2633   unsigned int this_line_z;
2634   tic6x_label_list *this_insn_label_list;
2635   segment_info_type *seginfo;
2636   tic6x_opcode_list *opc_list, *opc;
2637   tic6x_func_unit_base func_unit_base = tic6x_func_unit_nfu;
2638   unsigned int func_unit_side = 0;
2639   unsigned int func_unit_cross = 0;
2640   unsigned int cross_side = 0;
2641   unsigned int func_unit_data_side = 0;
2642   unsigned int max_matching_opcodes, num_matching_opcodes;
2643   tic6x_opcode_id *opcm = NULL;
2644   unsigned int opc_rank[TIC6X_NUM_PREFER];
2645   const tic6x_opcode *opct = NULL;
2646   int min_rank, try_rank, max_rank;
2647   bfd_boolean num_operands_permitted[TIC6X_MAX_SOURCE_OPERANDS + 1]
2648     = { FALSE };
2649   unsigned int operand_forms[TIC6X_MAX_SOURCE_OPERANDS] = { 0 };
2650   tic6x_operand operands[TIC6X_MAX_SOURCE_OPERANDS];
2651   unsigned int max_num_operands;
2652   unsigned int num_operands_read;
2653   bfd_boolean ok_this_arch, ok_this_fu, ok_this_arch_fu;
2654   bfd_boolean bad_operands = FALSE;
2655   unsigned int opcode_value;
2656   bfd_boolean encoded_ok;
2657   bfd_boolean fix_needed = FALSE;
2658   expressionS *fix_exp = NULL;
2659   int fix_pcrel = 0;
2660   bfd_reloc_code_real_type fx_r_type = BFD_RELOC_UNUSED;
2661   bfd_boolean fix_adda = FALSE;
2662   fragS *insn_frag;
2663   char *output;
2664
2665   p = str;
2666   while (*p && !is_end_of_line[(unsigned char) *p] && *p != ' ')
2667     p++;
2668
2669   /* This function should only have been called when there is actually
2670      an instruction to assemble.  */
2671   if (p == str)
2672     abort ();
2673
2674   /* Now an instruction has been seen, architecture attributes from
2675      .arch directives merge with rather than overriding the previous
2676      value.  */
2677   tic6x_seen_insns = TRUE;
2678   /* If no .arch directives or -march options have been seen, we are
2679      assessing instruction validity based on the C674X default, so set
2680      the attribute accordingly.  */
2681   if (tic6x_arch_attribute == C6XABI_Tag_CPU_arch_none)
2682     tic6x_arch_attribute = C6XABI_Tag_CPU_arch_C674X;
2683
2684   /* Reset global settings for parallel bars and predicates now to
2685      avoid extra errors if there are problems with this opcode.  */
2686   this_line_parallel = tic6x_line_parallel;
2687   this_line_spmask = tic6x_line_spmask;
2688   this_line_creg = tic6x_line_creg;
2689   this_line_z = tic6x_line_z;
2690   tic6x_line_parallel = FALSE;
2691   tic6x_line_spmask = FALSE;
2692   tic6x_line_creg = 0;
2693   tic6x_line_z = 0;
2694   seginfo = seg_info (now_seg);
2695   this_insn_label_list = seginfo->tc_segment_info_data.label_list;
2696   seginfo->tc_segment_info_data.label_list = NULL;
2697
2698   opc_list = hash_find_n (opcode_hash, str, p - str);
2699   if (opc_list == NULL)
2700     {
2701       char c = *p;
2702       *p = 0;
2703       as_bad (_("unknown opcode '%s'"), str);
2704       *p = c;
2705       return;
2706     }
2707
2708   opc_len = p - str;
2709   skip_whitespace (p);
2710
2711   /* See if there is something that looks like a functional unit
2712      specifier.  */
2713   if (*p == '.')
2714     {
2715       bfd_boolean good_func_unit;
2716       tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
2717       unsigned int maybe_side = 0;
2718       unsigned int maybe_cross = 0;
2719       unsigned int maybe_data_side = 0;
2720
2721       good_func_unit = tic6x_parse_func_unit_base (p + 1, &maybe_base,
2722                                                    &maybe_side);
2723
2724       if (good_func_unit)
2725         {
2726           if (p[3] == ' ' || is_end_of_line[(unsigned char) p[3]])
2727             p += 3;
2728           else if ((p[3] == 'x' || p[3] == 'X')
2729                    && (p[4] == ' ' || is_end_of_line[(unsigned char) p[4]]))
2730             {
2731               maybe_cross = 1;
2732               p += 4;
2733             }
2734           else if (maybe_base == tic6x_func_unit_d
2735                    && (p[3] == 't' || p[3] == 'T')
2736                    && (p[4] == '1' || p[4] == '2')
2737                    && (p[5] == ' ' || is_end_of_line[(unsigned char) p[5]]))
2738             {
2739               maybe_data_side = p[4] - '0';
2740               p += 5;
2741             }
2742           else
2743             good_func_unit = FALSE;
2744         }
2745
2746       if (good_func_unit)
2747         {
2748           func_unit_base = maybe_base;
2749           func_unit_side = maybe_side;
2750           func_unit_cross = maybe_cross;
2751           cross_side = (func_unit_cross ? 3 - func_unit_side : func_unit_side);
2752           func_unit_data_side = maybe_data_side;
2753         }
2754
2755       skip_whitespace (p);
2756     }
2757
2758   /* Determine which entries in the opcode table match, and the
2759      associated permitted forms of operands.  */
2760   max_matching_opcodes = 0;
2761   for (opc = opc_list; opc; opc = opc->next)
2762     max_matching_opcodes++;
2763   num_matching_opcodes = 0;
2764   opcm = xmalloc (max_matching_opcodes * sizeof (*opcm));
2765   max_num_operands = 0;
2766   ok_this_arch = FALSE;
2767   ok_this_fu = FALSE;
2768   ok_this_arch_fu = FALSE;
2769   for (opc = opc_list; opc; opc = opc->next)
2770     {
2771       unsigned int num_operands;
2772       unsigned int i;
2773       bfd_boolean this_opc_arch_ok = TRUE;
2774       bfd_boolean this_opc_fu_ok = TRUE;
2775
2776       if (tic6x_insn_format_table[tic6x_opcode_table[opc->id].format].num_bits
2777           != 32)
2778         continue;
2779       if (!(tic6x_opcode_table[opc->id].isa_variants & tic6x_features))
2780         this_opc_arch_ok = FALSE;
2781       if (tic6x_opcode_table[opc->id].func_unit != func_unit_base)
2782         this_opc_fu_ok = FALSE;
2783       if (func_unit_side == 1
2784           && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_B_ONLY))
2785         this_opc_fu_ok = FALSE;
2786       if (func_unit_cross
2787           && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_NO_CROSS))
2788         this_opc_fu_ok = FALSE;
2789       if (!func_unit_data_side
2790           && (tic6x_opcode_table[opc->id].flags
2791               & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
2792         this_opc_fu_ok = FALSE;
2793       if (func_unit_data_side
2794           && !(tic6x_opcode_table[opc->id].flags
2795                & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
2796         this_opc_fu_ok = FALSE;
2797       if (func_unit_data_side == 1
2798           && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_T2_ONLY))
2799         this_opc_fu_ok = FALSE;
2800       if (this_opc_arch_ok)
2801         ok_this_arch = TRUE;
2802       if (this_opc_fu_ok)
2803         ok_this_fu = TRUE;
2804       if (!this_opc_arch_ok || !this_opc_fu_ok)
2805         continue;
2806       ok_this_arch_fu = TRUE;
2807       opcm[num_matching_opcodes] = opc->id;
2808       num_matching_opcodes++;
2809       num_operands = tic6x_opcode_table[opc->id].num_operands;
2810
2811       if (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SPMASK)
2812         {
2813           if (num_operands != 1
2814               || (tic6x_opcode_table[opc->id].operand_info[0].form
2815                   != tic6x_operand_func_unit))
2816             abort ();
2817           num_operands = 8;
2818           for (i = 0; i < num_operands; i++)
2819             {
2820               operand_forms[i]
2821                 |= tic6x_coarse_operand_form (tic6x_operand_func_unit);
2822               num_operands_permitted[i] = TRUE;
2823             }
2824         }
2825       else
2826         {
2827           for (i = 0; i < num_operands; i++)
2828             {
2829               tic6x_operand_form f
2830                 = tic6x_opcode_table[opc->id].operand_info[i].form;
2831
2832               operand_forms[i] |= tic6x_coarse_operand_form (f);
2833             }
2834         }
2835       num_operands_permitted[num_operands] = TRUE;
2836       if (num_operands > max_num_operands)
2837         max_num_operands = num_operands;
2838     }
2839
2840   if (!ok_this_arch)
2841     {
2842       as_bad (_("'%.*s' instruction not supported on this architecture"),
2843               opc_len, str);
2844       free (opcm);
2845       return;
2846     }
2847
2848   if (!ok_this_fu)
2849     {
2850       as_bad (_("'%.*s' instruction not supported on this functional unit"),
2851               opc_len, str);
2852       free (opcm);
2853       return;
2854     }
2855
2856   if (!ok_this_arch_fu)
2857     {
2858       as_bad (_("'%.*s' instruction not supported on this functional unit"
2859                 " for this architecture"),
2860               opc_len, str);
2861       free (opcm);
2862       return;
2863     }
2864
2865   /* If there were no instructions matching the above availability
2866      checks, we should now have given an error and returned.  */
2867   if (num_matching_opcodes == 0)
2868     abort ();
2869
2870   num_operands_read = 0;
2871   while (TRUE)
2872     {
2873       skip_whitespace (p);
2874       if (is_end_of_line[(unsigned char) *p])
2875         {
2876           if (num_operands_read > 0)
2877             {
2878               as_bad (_("missing operand after comma"));
2879               bad_operands = TRUE;
2880             }
2881           break;
2882         }
2883
2884       if (max_num_operands == 0)
2885         {
2886           as_bad (_("too many operands to '%.*s'"), opc_len, str);
2887           bad_operands = TRUE;
2888           break;
2889         }
2890
2891       if (!tic6x_parse_operand (&p, &operands[num_operands_read],
2892                                 operand_forms[num_operands_read], str, opc_len,
2893                                 num_operands_read + 1))
2894         bad_operands = TRUE;
2895       num_operands_read++;
2896
2897       if (is_end_of_line[(unsigned char) *p])
2898         break;
2899       else if (*p == ',')
2900         {
2901           p++;
2902           if (num_operands_read == max_num_operands)
2903             {
2904               as_bad (_("too many operands to '%.*s'"), opc_len, str);
2905               bad_operands = TRUE;
2906               break;
2907             }
2908           continue;
2909         }
2910       else
2911         /* Operand parsing should consume whole operands.  */
2912         abort ();
2913     }
2914
2915   if (!bad_operands && !num_operands_permitted[num_operands_read])
2916     {
2917       as_bad (_("bad number of operands to '%.*s'"), opc_len, str);
2918       bad_operands = TRUE;
2919     }
2920
2921   if (!bad_operands)
2922     {
2923       /* Each operand is of the right syntactic form for some opcode
2924          choice, and the number of operands is valid.  Check that each
2925          operand is OK in detail for some opcode choice with the right
2926          number of operands.  */
2927       unsigned int i;
2928
2929       for (i = 0; i < num_operands_read; i++)
2930         {
2931           bfd_boolean coarse_ok = FALSE;
2932           bfd_boolean fine_ok = FALSE;
2933           tic6x_operand_match fine_failure = tic6x_match_matches;
2934           unsigned int j;
2935
2936           for (j = 0; j < num_matching_opcodes; j++)
2937             {
2938               tic6x_operand_form f;
2939               tic6x_rw rw;
2940               unsigned int cf;
2941               tic6x_operand_match this_fine_failure;
2942
2943               if (tic6x_opcode_table[opcm[j]].flags & TIC6X_FLAG_SPMASK)
2944                 {
2945                   f = tic6x_operand_func_unit;
2946                   rw = tic6x_rw_none;
2947                 }
2948               else
2949                 {
2950                   if (tic6x_opcode_table[opcm[j]].num_operands
2951                       != num_operands_read)
2952                     continue;
2953
2954                   f = tic6x_opcode_table[opcm[j]].operand_info[i].form;
2955                   rw = tic6x_opcode_table[opcm[j]].operand_info[i].rw;
2956                 }
2957               cf = tic6x_coarse_operand_form (f);
2958
2959               if (operands[i].form != cf)
2960                 continue;
2961
2962               coarse_ok = TRUE;
2963               this_fine_failure
2964                 = tic6x_operand_matches_form (&operands[i], f, rw,
2965                                               func_unit_side,
2966                                               cross_side,
2967                                               func_unit_data_side);
2968               if (this_fine_failure == tic6x_match_matches)
2969                 {
2970                   fine_ok = TRUE;
2971                   break;
2972                 }
2973               if (fine_failure == tic6x_match_matches
2974                   || fine_failure > this_fine_failure)
2975                 fine_failure = this_fine_failure;
2976             }
2977
2978           /* No instructions should have operand syntactic forms only
2979              acceptable with certain numbers of operands, so no
2980              diagnostic for this case.  */
2981           if (!coarse_ok)
2982             abort ();
2983
2984           if (!fine_ok)
2985             {
2986               switch (fine_failure)
2987                 {
2988                 case tic6x_match_non_const:
2989                   as_bad (_("operand %u of '%.*s' not constant"),
2990                           i + 1, opc_len, str);
2991                   break;
2992
2993                 case tic6x_match_wrong_side:
2994                   as_bad (_("operand %u of '%.*s' on wrong side"),
2995                           i + 1, opc_len, str);
2996                   break;
2997
2998                 case tic6x_match_bad_return:
2999                   as_bad (_("operand %u of '%.*s' not a valid return "
3000                             "address register"),
3001                           i + 1, opc_len, str);
3002                   break;
3003
3004                 case tic6x_match_ctrl_write_only:
3005                   as_bad (_("operand %u of '%.*s' is write-only"),
3006                           i + 1, opc_len, str);
3007                   break;
3008
3009                 case tic6x_match_ctrl_read_only:
3010                   as_bad (_("operand %u of '%.*s' is read-only"),
3011                           i + 1, opc_len, str);
3012                   break;
3013
3014                 case tic6x_match_bad_mem:
3015                   as_bad (_("operand %u of '%.*s' not a valid memory "
3016                             "reference"),
3017                           i + 1, opc_len, str);
3018                   break;
3019
3020                 case tic6x_match_bad_address:
3021                   as_bad (_("operand %u of '%.*s' not a valid base "
3022                             "address register"),
3023                           i + 1, opc_len, str);
3024                   break;
3025
3026                 default:
3027                   abort ();
3028                 }
3029               bad_operands = TRUE;
3030               break;
3031             }
3032         }
3033     }
3034
3035   if (!bad_operands)
3036     {
3037       /* Each operand is OK for some opcode choice, and the number of
3038          operands is valid.  Check whether there is an opcode choice
3039          for which all operands are simultaneously valid.  */
3040       unsigned int i;
3041       bfd_boolean found_match = FALSE;
3042
3043       for (i = 0; i < TIC6X_NUM_PREFER; i++)
3044         opc_rank[i] = (unsigned int) -1;
3045
3046       min_rank = TIC6X_NUM_PREFER - 1;
3047       max_rank = 0;
3048
3049       for (i = 0; i < num_matching_opcodes; i++)
3050         {
3051           unsigned int j;
3052           bfd_boolean this_matches = TRUE;
3053
3054           if (!(tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3055               && tic6x_opcode_table[opcm[i]].num_operands != num_operands_read)
3056             continue;
3057
3058           for (j = 0; j < num_operands_read; j++)
3059             {
3060               tic6x_operand_form f;
3061               tic6x_rw rw;
3062
3063               if (tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3064                 {
3065                   f = tic6x_operand_func_unit;
3066                   rw = tic6x_rw_none;
3067                 }
3068               else
3069                 {
3070                   f = tic6x_opcode_table[opcm[i]].operand_info[j].form;
3071                   rw = tic6x_opcode_table[opcm[i]].operand_info[j].rw;
3072                 }
3073               if (tic6x_operand_matches_form (&operands[j], f, rw,
3074                                               func_unit_side,
3075                                               cross_side,
3076                                               func_unit_data_side)
3077                   != tic6x_match_matches)
3078                 {
3079                   this_matches = FALSE;
3080                   break;
3081                 }
3082             }
3083
3084           if (this_matches)
3085             {
3086               int rank = TIC6X_PREFER_VAL (tic6x_opcode_table[opcm[i]].flags);
3087
3088               if (rank < min_rank)
3089                 min_rank = rank;
3090               if (rank > max_rank)
3091                 max_rank = rank;
3092
3093               if (opc_rank[rank] == (unsigned int) -1)
3094                 opc_rank[rank] = i;
3095               else
3096                 /* The opcode table should provide a total ordering
3097                    for all cases where multiple matches may get
3098                    here.  */
3099                 abort ();
3100
3101               found_match = TRUE;
3102             }
3103         }
3104
3105       if (!found_match)
3106         {
3107           as_bad (_("bad operand combination for '%.*s'"), opc_len, str);
3108           bad_operands = TRUE;
3109         }
3110     }
3111
3112   if (bad_operands)
3113     {
3114       free (opcm);
3115       return;
3116     }
3117
3118   opcode_value = 0;
3119   encoded_ok = FALSE;
3120   for (try_rank = max_rank; try_rank >= min_rank; try_rank--)
3121     {
3122       fix_needed = FALSE;
3123
3124       if (opc_rank[try_rank] == (unsigned int) -1)
3125         continue;
3126
3127       opcode_value = tic6x_try_encode (opcm[opc_rank[try_rank]], operands,
3128                                        num_operands_read, this_line_creg,
3129                                        this_line_z, func_unit_side,
3130                                        func_unit_cross, func_unit_data_side,
3131                                        seginfo->tc_segment_info_data.sploop_ii,
3132                                        &fix_exp, &fix_pcrel, &fx_r_type,
3133                                        &fix_adda, &fix_needed, &encoded_ok,
3134                                        (try_rank == min_rank ? TRUE : FALSE),
3135                                        str, opc_len);
3136       if (encoded_ok)
3137         {
3138           opct = &tic6x_opcode_table[opcm[opc_rank[try_rank]]];
3139           break;
3140         }
3141     }
3142
3143   free (opcm);
3144
3145   if (!encoded_ok)
3146     return;
3147
3148   if (this_line_parallel)
3149     {
3150       insn_frag = seginfo->tc_segment_info_data.execute_packet_frag;
3151       if (insn_frag == NULL)
3152         {
3153           as_bad (_("parallel instruction not following another instruction"));
3154           return;
3155         }
3156
3157       if (insn_frag->fr_fix >= 32)
3158         {
3159           as_bad (_("too many instructions in execute packet"));
3160           return;
3161         }
3162
3163       if (this_insn_label_list != NULL)
3164         as_bad (_("label not at start of execute packet"));
3165
3166       if (opct->flags & TIC6X_FLAG_FIRST)
3167         as_bad (_("'%.*s' instruction not at start of execute packet"),
3168                 opc_len, str);
3169
3170       *seginfo->tc_segment_info_data.last_insn_lsb |= 0x1;
3171       output = insn_frag->fr_literal + insn_frag->fr_fix;
3172     }
3173   else
3174     {
3175       tic6x_label_list *l;
3176
3177       seginfo->tc_segment_info_data.spmask_addr = NULL;
3178       seginfo->tc_segment_info_data.func_units_used = 0;
3179
3180       /* Start a new frag for this execute packet.  */
3181       if (frag_now_fix () != 0)
3182         {
3183           if (frag_now->fr_type != rs_machine_dependent)
3184             frag_wane (frag_now);
3185
3186           frag_new (0);
3187         }
3188       frag_grow (32);
3189       insn_frag = seginfo->tc_segment_info_data.execute_packet_frag = frag_now;
3190       for (l = this_insn_label_list; l; l = l->next)
3191         {
3192           symbol_set_frag (l->label, frag_now);
3193           S_SET_VALUE (l->label, 0);
3194           S_SET_SEGMENT (l->label, now_seg);
3195         }
3196       tic6x_free_label_list (this_insn_label_list);
3197       dwarf2_emit_insn (0);
3198       output = frag_var (rs_machine_dependent, 32, 32, 0, NULL, 0, NULL);
3199       /* This must be the same as the frag to which a pointer was just
3200          saved.  */
3201       if (output != insn_frag->fr_literal)
3202         abort ();
3203       insn_frag->tc_frag_data.is_insns = TRUE;
3204       insn_frag->tc_frag_data.can_cross_fp_boundary
3205         = tic6x_can_cross_fp_boundary;
3206     }
3207
3208   if (func_unit_base != tic6x_func_unit_nfu)
3209     {
3210       unsigned int func_unit_enc;
3211
3212       func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
3213
3214       if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
3215         as_bad (_("functional unit already used in this execute packet"));
3216
3217       seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
3218     }
3219
3220   if (opct->flags & TIC6X_FLAG_SPLOOP)
3221     {
3222       if (seginfo->tc_segment_info_data.sploop_ii)
3223         as_bad (_("nested software pipelined loop"));
3224       if (num_operands_read != 1
3225           || operands[0].form != TIC6X_OP_EXP
3226           || operands[0].value.exp.X_op != O_constant)
3227         abort ();
3228       seginfo->tc_segment_info_data.sploop_ii
3229         = operands[0].value.exp.X_add_number;
3230     }
3231   else if (opct->flags & TIC6X_FLAG_SPKERNEL)
3232     {
3233       if (!seginfo->tc_segment_info_data.sploop_ii)
3234         as_bad (_("'%.*s' instruction not in a software pipelined loop"),
3235                 opc_len, str);
3236       seginfo->tc_segment_info_data.sploop_ii = 0;
3237     }
3238
3239   if (this_line_spmask)
3240     {
3241       if (seginfo->tc_segment_info_data.spmask_addr == NULL)
3242         as_bad (_("'||^' without previous SPMASK"));
3243       else if (func_unit_base == tic6x_func_unit_nfu)
3244         as_bad (_("cannot mask instruction using no functional unit"));
3245       else
3246         {
3247           unsigned int spmask_opcode;
3248           unsigned int mask_bit;
3249
3250           spmask_opcode
3251             = md_chars_to_number (seginfo->tc_segment_info_data.spmask_addr,
3252                                   4);
3253           mask_bit = tic6x_encode_spmask (func_unit_base, func_unit_side);
3254           mask_bit <<= 18;
3255           if (spmask_opcode & mask_bit)
3256             as_bad (_("functional unit already masked"));
3257           spmask_opcode |= mask_bit;
3258           md_number_to_chars (seginfo->tc_segment_info_data.spmask_addr,
3259                               spmask_opcode, 4);
3260         }
3261     }
3262
3263   record_alignment (now_seg, 5);
3264   md_number_to_chars (output, opcode_value, 4);
3265   if (fix_needed)
3266     tic6x_fix_new_exp (insn_frag, output - insn_frag->fr_literal, 4, fix_exp,
3267                        fix_pcrel, fx_r_type, fix_adda);
3268   insn_frag->fr_fix += 4;
3269   insn_frag->fr_var -= 4;
3270   seginfo->tc_segment_info_data.last_insn_lsb
3271     = (target_big_endian ? output + 3 : output);
3272   if (opct->flags & TIC6X_FLAG_SPMASK)
3273     seginfo->tc_segment_info_data.spmask_addr = output;
3274 }
3275
3276 /* Modify NEWVAL (32-bit) by inserting VALUE, shifted right by SHIFT
3277    and the least significant BITS bits taken, at position POS.  */
3278 #define MODIFY_VALUE(NEWVAL, VALUE, SHIFT, POS, BITS)                   \
3279   do {                                                                  \
3280     (NEWVAL) &= 0xffffffffU & ~(((1U << (BITS)) - 1) << (POS));         \
3281     (NEWVAL) |= (((VALUE) >> (SHIFT)) & ((1U << (BITS)) - 1)) << (POS); \
3282   } while (0)
3283
3284 /* Apply a fixup to the object file.  */
3285
3286 void
3287 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3288 {
3289   offsetT value = *valP;
3290   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3291
3292   value = SEXT (value);
3293   *valP = value;
3294
3295   fixP->fx_offset = SEXT (fixP->fx_offset);
3296
3297   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3298     fixP->fx_done = 1;
3299
3300   /* We do our own overflow checks.  */
3301   fixP->fx_no_overflow = 1;
3302
3303   switch (fixP->fx_r_type)
3304     {
3305     case BFD_RELOC_NONE:
3306       /* Force output to the object file.  */
3307       fixP->fx_done = 0;
3308       break;
3309
3310     case BFD_RELOC_32:
3311       if (fixP->fx_done || !seg->use_rela_p)
3312         md_number_to_chars (buf, value, 4);
3313       break;
3314
3315     case BFD_RELOC_16:
3316       if (fixP->fx_done || !seg->use_rela_p)
3317         {
3318           if (value < -0x8000 || value > 0xffff)
3319             as_bad_where (fixP->fx_file, fixP->fx_line,
3320                           _("value too large for 2-byte field"));
3321           md_number_to_chars (buf, value, 2);
3322         }
3323       break;
3324
3325     case BFD_RELOC_8:
3326       if (fixP->fx_done || !seg->use_rela_p)
3327         {
3328           if (value < -0x80 || value > 0xff)
3329             as_bad_where (fixP->fx_file, fixP->fx_line,
3330                           _("value too large for 1-byte field"));
3331           md_number_to_chars (buf, value, 1);
3332         }
3333       break;
3334
3335     case BFD_RELOC_C6000_ABS_S16:
3336     case BFD_RELOC_C6000_ABS_L16:
3337     case BFD_RELOC_C6000_SBR_S16:
3338     case BFD_RELOC_C6000_SBR_L16_B:
3339     case BFD_RELOC_C6000_SBR_L16_H:
3340     case BFD_RELOC_C6000_SBR_L16_W:
3341     case BFD_RELOC_C6000_SBR_GOT_L16_W:
3342       if (fixP->fx_done || !seg->use_rela_p)
3343         {
3344           offsetT newval = md_chars_to_number (buf, 4);
3345           int shift;
3346
3347           switch (fixP->fx_r_type)
3348             {
3349             case BFD_RELOC_C6000_SBR_L16_H:
3350               shift = 1;
3351               break;
3352
3353             case BFD_RELOC_C6000_SBR_L16_W:
3354             case BFD_RELOC_C6000_SBR_GOT_L16_W:
3355               shift = 2;
3356               break;
3357
3358             default:
3359               shift = 0;
3360               break;
3361             }
3362
3363           MODIFY_VALUE (newval, value, shift, 7, 16);
3364           if ((value < -0x8000 || value > 0x7fff)
3365               && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16
3366                   || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16))
3367             as_bad_where (fixP->fx_file, fixP->fx_line,
3368                           _("immediate offset out of range"));
3369
3370           md_number_to_chars (buf, newval, 4);
3371         }
3372       if (fixP->fx_done
3373           && fixP->fx_r_type != BFD_RELOC_C6000_ABS_S16
3374           && fixP->fx_r_type != BFD_RELOC_C6000_ABS_L16)
3375         abort ();
3376       break;
3377
3378     case BFD_RELOC_C6000_ABS_H16:
3379     case BFD_RELOC_C6000_SBR_H16_B:
3380     case BFD_RELOC_C6000_SBR_H16_H:
3381     case BFD_RELOC_C6000_SBR_H16_W:
3382     case BFD_RELOC_C6000_SBR_GOT_H16_W:
3383       if (fixP->fx_done || !seg->use_rela_p)
3384         {
3385           offsetT newval = md_chars_to_number (buf, 4);
3386           int shift;
3387
3388           switch (fixP->fx_r_type)
3389             {
3390             case BFD_RELOC_C6000_SBR_H16_H:
3391               shift = 17;
3392               break;
3393
3394             case BFD_RELOC_C6000_SBR_H16_W:
3395             case BFD_RELOC_C6000_SBR_GOT_H16_W:
3396               shift = 18;
3397               break;
3398
3399             default:
3400               shift = 16;
3401               break;
3402             }
3403
3404           MODIFY_VALUE (newval, value, shift, 7, 16);
3405
3406           md_number_to_chars (buf, newval, 4);
3407         }
3408       if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_ABS_H16)
3409         abort ();
3410       break;
3411
3412     case BFD_RELOC_C6000_SBR_U15_B:
3413       if (fixP->fx_done || !seg->use_rela_p)
3414         {
3415           offsetT newval = md_chars_to_number (buf, 4);
3416
3417           MODIFY_VALUE (newval, value, 0, 8, 15);
3418           if (value < 0 || value > 0x7fff)
3419             as_bad_where (fixP->fx_file, fixP->fx_line,
3420                           _("immediate offset out of range"));
3421
3422           md_number_to_chars (buf, newval, 4);
3423         }
3424       break;
3425
3426     case BFD_RELOC_C6000_SBR_U15_H:
3427       if (fixP->fx_done || !seg->use_rela_p)
3428         {
3429           offsetT newval = md_chars_to_number (buf, 4);
3430
3431           /* Constant ADDA operands, processed as constant when the
3432              instruction is parsed, are encoded as-is rather than
3433              shifted.  If the operand of an ADDA instruction is now
3434              constant (for example, the difference between two labels
3435              found after the instruction), ensure it is encoded the
3436              same way it would have been if the constant value had
3437              been known when the instruction was parsed.  */
3438           if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3439             value <<= 1;
3440
3441           MODIFY_VALUE (newval, value, 1, 8, 15);
3442           if (value & 1)
3443             as_bad_where (fixP->fx_file, fixP->fx_line,
3444                           _("immediate offset not 2-byte-aligned"));
3445           if (value < 0 || value > 0xfffe)
3446             as_bad_where (fixP->fx_file, fixP->fx_line,
3447                           _("immediate offset out of range"));
3448
3449           md_number_to_chars (buf, newval, 4);
3450         }
3451       break;
3452
3453     case BFD_RELOC_C6000_SBR_U15_W:
3454     case BFD_RELOC_C6000_SBR_GOT_U15_W:
3455       if (fixP->fx_done || !seg->use_rela_p)
3456         {
3457           offsetT newval = md_chars_to_number (buf, 4);
3458
3459           /* Constant ADDA operands, processed as constant when the
3460              instruction is parsed, are encoded as-is rather than
3461              shifted.  If the operand of an ADDA instruction is now
3462              constant (for example, the difference between two labels
3463              found after the instruction), ensure it is encoded the
3464              same way it would have been if the constant value had
3465              been known when the instruction was parsed.  */
3466           if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3467             value <<= 2;
3468
3469           MODIFY_VALUE (newval, value, 2, 8, 15);
3470           if (value & 3)
3471             as_bad_where (fixP->fx_file, fixP->fx_line,
3472                           _("immediate offset not 4-byte-aligned"));
3473           if (value < 0 || value > 0x1fffc)
3474             as_bad_where (fixP->fx_file, fixP->fx_line,
3475                           _("immediate offset out of range"));
3476
3477           md_number_to_chars (buf, newval, 4);
3478         }
3479       if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_SBR_U15_W)
3480         abort ();
3481       break;
3482
3483     case BFD_RELOC_C6000_DSBT_INDEX:
3484       if (value != 0)
3485         as_bad_where (fixP->fx_file, fixP->fx_line,
3486                       _("addend used with $DSBT_INDEX"));
3487       if (fixP->fx_done)
3488         abort ();
3489       break;
3490
3491     case BFD_RELOC_C6000_PCR_S21:
3492       if (fixP->fx_done || !seg->use_rela_p)
3493         {
3494           offsetT newval = md_chars_to_number (buf, 4);
3495
3496           MODIFY_VALUE (newval, value, 2, 7, 21);
3497
3498           if (value & 3)
3499             as_bad_where (fixP->fx_file, fixP->fx_line,
3500                           _("PC-relative offset not 4-byte-aligned"));
3501           if (value < -0x400000 || value > 0x3ffffc)
3502             as_bad_where (fixP->fx_file, fixP->fx_line,
3503                           _("PC-relative offset out of range"));
3504
3505           md_number_to_chars (buf, newval, 4);
3506         }
3507       break;
3508
3509     case BFD_RELOC_C6000_PCR_S12:
3510       if (fixP->fx_done || !seg->use_rela_p)
3511         {
3512           offsetT newval = md_chars_to_number (buf, 4);
3513
3514           MODIFY_VALUE (newval, value, 2, 16, 12);
3515
3516           if (value & 3)
3517             as_bad_where (fixP->fx_file, fixP->fx_line,
3518                           _("PC-relative offset not 4-byte-aligned"));
3519           if (value < -0x2000 || value > 0x1ffc)
3520             as_bad_where (fixP->fx_file, fixP->fx_line,
3521                           _("PC-relative offset out of range"));
3522
3523           md_number_to_chars (buf, newval, 4);
3524         }
3525       break;
3526
3527     case BFD_RELOC_C6000_PCR_S10:
3528       if (fixP->fx_done || !seg->use_rela_p)
3529         {
3530           offsetT newval = md_chars_to_number (buf, 4);
3531
3532           MODIFY_VALUE (newval, value, 2, 13, 10);
3533
3534           if (value & 3)
3535             as_bad_where (fixP->fx_file, fixP->fx_line,
3536                           _("PC-relative offset not 4-byte-aligned"));
3537           if (value < -0x800 || value > 0x7fc)
3538             as_bad_where (fixP->fx_file, fixP->fx_line,
3539                           _("PC-relative offset out of range"));
3540
3541           md_number_to_chars (buf, newval, 4);
3542         }
3543       break;
3544
3545     case BFD_RELOC_C6000_PCR_S7:
3546       if (fixP->fx_done || !seg->use_rela_p)
3547         {
3548           offsetT newval = md_chars_to_number (buf, 4);
3549
3550           MODIFY_VALUE (newval, value, 2, 16, 7);
3551
3552           if (value & 3)
3553             as_bad_where (fixP->fx_file, fixP->fx_line,
3554                           _("PC-relative offset not 4-byte-aligned"));
3555           if (value < -0x100 || value > 0xfc)
3556             as_bad_where (fixP->fx_file, fixP->fx_line,
3557                           _("PC-relative offset out of range"));
3558
3559           md_number_to_chars (buf, newval, 4);
3560         }
3561       break;
3562
3563     default:
3564       abort ();
3565     }
3566 }
3567
3568 /* Convert a floating-point number to target (IEEE) format.  */
3569
3570 char *
3571 md_atof (int type, char *litP, int *sizeP)
3572 {
3573   return ieee_md_atof (type, litP, sizeP, target_big_endian);
3574 }
3575
3576 /* Adjust the frags in SECTION (see tic6x_end).  */
3577
3578 static void
3579 tic6x_adjust_section (bfd *abfd ATTRIBUTE_UNUSED, segT section,
3580                       void *dummy ATTRIBUTE_UNUSED)
3581 {
3582   segment_info_type *info;
3583   frchainS *frchp;
3584   fragS *fragp;
3585   bfd_boolean have_code = FALSE;
3586   bfd_boolean have_non_code = FALSE;
3587
3588   info = seg_info (section);
3589   if (info == NULL)
3590     return;
3591
3592   for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
3593     for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
3594       switch (fragp->fr_type)
3595         {
3596         case rs_machine_dependent:
3597           if (fragp->tc_frag_data.is_insns)
3598             have_code = TRUE;
3599           break;
3600
3601         case rs_dummy:
3602         case rs_fill:
3603           if (fragp->fr_fix > 0)
3604             have_non_code = TRUE;
3605           break;
3606
3607         default:
3608           have_non_code = TRUE;
3609           break;
3610         }
3611
3612   /* Process alignment requirements in a code-only section.  */
3613   if (have_code && !have_non_code)
3614     {
3615       /* If we need to insert an odd number of instructions to meet an
3616          alignment requirement, there must have been an odd number of
3617          instructions since the last 8-byte-aligned execute packet
3618          boundary.  So there must have been an execute packet with an
3619          odd number (and so a number fewer than 8) of instructions
3620          into which we can insert a NOP without breaking any previous
3621          alignments.
3622
3623          If then we need to insert a number 2 mod 4 of instructions,
3624          the number of instructions since the last 16-byte-aligned
3625          execute packet boundary must be 2 mod 4.  So between that
3626          boundary and the following 8-byte-aligned boundary there must
3627          either be at least one execute packet with 2-mod-4
3628          instructions, or at least two with an odd number of
3629          instructions; again, greedily inserting NOPs as soon as
3630          possible suffices to meet the alignment requirement.
3631
3632          If then we need to insert 4 instructions, we look between the
3633          last 32-byte-aligned boundary and the following
3634          16-byte-aligned boundary.  The sizes of the execute packets
3635          in this range total 4 instructions mod 8, so again there is
3636          room for greedy insertion of NOPs to meet the alignment
3637          requirement, and before any intermediate point with 8-byte
3638          (2-instruction) alignment requirement the sizes of execute
3639          packets (and so the room for NOPs) will total 2 instructions
3640          mod 4 so greedy insertion will not break such alignments.
3641
3642          So we can always meet these alignment requirements by
3643          inserting NOPs in parallel with existing execute packets, and
3644          by induction the approach described above inserts the minimum
3645          number of such NOPs.  */
3646
3647       /* The number of NOPs we are currently looking to insert, if we
3648          have gone back to insert NOPs.  */
3649       unsigned int want_insert = 0;
3650
3651       /* Out of that number, the number inserted so far in the current
3652          stage of the above algorithm.  */
3653       unsigned int want_insert_done_so_far = 0;
3654
3655       /* The position mod 32 at the start of the current frag.  */
3656       unsigned int pos = 0;
3657
3658       /* The locations in the frag chain of the most recent frags at
3659          the start of which there is the given alignment.  */
3660       frchainS *frchp_last32, *frchp_last16, *frchp_last8;
3661       fragS *fragp_last32, *fragp_last16, *fragp_last8;
3662       unsigned int pos_last32, pos_last16, pos_last8;
3663
3664       frchp_last32 = frchp_last16 = frchp_last8 = info->frchainP;
3665       fragp_last32 = fragp_last16 = fragp_last8 = info->frchainP->frch_root;
3666       pos_last32 = pos_last16 = pos_last8 = 0;
3667
3668       for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
3669         for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
3670         look_at_frag:
3671           {
3672             bfd_boolean go_back = FALSE;
3673             frchainS *frchp_next;
3674             fragS *fragp_next;
3675
3676             if (fragp->fr_type != rs_machine_dependent)
3677               continue;
3678
3679             if (fragp->tc_frag_data.is_insns
3680                 && pos + fragp->fr_fix > 32
3681                 && !fragp->tc_frag_data.can_cross_fp_boundary)
3682               {
3683                 /* As described above, we should always have met an
3684                    alignment requirement by the time we come back to
3685                    it.  */
3686                 if (want_insert)
3687                   abort ();
3688
3689                 if (pos & 3)
3690                   abort ();
3691                 want_insert = (32 - pos) >> 2;
3692                 if (want_insert > 7)
3693                   abort ();
3694                 want_insert_done_so_far = 0;
3695                 go_back = TRUE;
3696               }
3697
3698             if (!fragp->tc_frag_data.is_insns)
3699               {
3700                 unsigned int would_insert_bytes;
3701
3702                 if (!(pos & ((1 << fragp->fr_offset) - 1)))
3703                   /* This alignment requirement is already met.  */
3704                   continue;
3705
3706                 /* As described above, we should always have met an
3707                    alignment requirement by the time we come back to
3708                    it.  */
3709                 if (want_insert)
3710                   abort ();
3711
3712                 /* We may not be able to meet this requirement within
3713                    the given number of characters.  */
3714                 would_insert_bytes
3715                   = ((1 << fragp->fr_offset)
3716                      - (pos & ((1 << fragp->fr_offset) - 1)));
3717
3718                 if (fragp->fr_subtype != 0
3719                     && would_insert_bytes > fragp->fr_subtype)
3720                   continue;
3721
3722                 /* An unmet alignment must be 8, 16 or 32 bytes;
3723                    smaller ones must always be met within code-only
3724                    sections and larger ones cause the section not to
3725                    be code-only.  */
3726                 if (fragp->fr_offset != 3
3727                     && fragp->fr_offset != 4
3728                     && fragp->fr_offset != 5)
3729                   abort ();
3730
3731                 if (would_insert_bytes & 3)
3732                   abort ();
3733                 want_insert = would_insert_bytes >> 2;
3734                 if (want_insert > 7)
3735                   abort ();
3736                 want_insert_done_so_far = 0;
3737                 go_back = TRUE;
3738               }
3739             else if (want_insert && !go_back)
3740               {
3741                 unsigned int num_insns = fragp->fr_fix >> 2;
3742                 unsigned int max_poss_nops = 8 - num_insns;
3743
3744                 if (max_poss_nops)
3745                   {
3746                     unsigned int cur_want_nops, max_want_nops, do_nops, i;
3747
3748                     if (want_insert & 1)
3749                       cur_want_nops = 1;
3750                     else if (want_insert & 2)
3751                       cur_want_nops = 2;
3752                     else if (want_insert & 4)
3753                       cur_want_nops = 4;
3754                     else
3755                       abort ();
3756
3757                     max_want_nops = cur_want_nops - want_insert_done_so_far;
3758
3759                     do_nops = (max_poss_nops < max_want_nops
3760                                ? max_poss_nops
3761                                : max_want_nops);
3762                     for (i = 0; i < do_nops; i++)
3763                       {
3764                         md_number_to_chars (fragp->fr_literal + fragp->fr_fix,
3765                                             0, 4);
3766                         if (target_big_endian)
3767                           fragp->fr_literal[fragp->fr_fix - 1] |= 0x1;
3768                         else
3769                           fragp->fr_literal[fragp->fr_fix - 4] |= 0x1;
3770                         fragp->fr_fix += 4;
3771                         fragp->fr_var -= 4;
3772                       }
3773                     want_insert_done_so_far += do_nops;
3774                     if (want_insert_done_so_far == cur_want_nops)
3775                       {
3776                         want_insert -= want_insert_done_so_far;
3777                         want_insert_done_so_far = 0;
3778                         if (want_insert)
3779                           go_back = TRUE;
3780                       }
3781                   }
3782               }
3783             if (go_back)
3784               {
3785                 if (want_insert & 1)
3786                   {
3787                     frchp = frchp_last8;
3788                     fragp = fragp_last8;
3789                     pos = pos_last8;
3790                   }
3791                 else if (want_insert & 2)
3792                   {
3793                     frchp = frchp_last8 = frchp_last16;
3794                     fragp = fragp_last8 = fragp_last16;
3795                     pos = pos_last8 = pos_last16;
3796                   }
3797                 else if (want_insert & 4)
3798                   {
3799                     frchp = frchp_last8 = frchp_last16 = frchp_last32;
3800                     fragp = fragp_last8 = fragp_last16 = fragp_last32;
3801                     pos = pos_last8 = pos_last16 = pos_last32;
3802                   }
3803                 else
3804                   abort ();
3805
3806                 goto look_at_frag;
3807               }
3808
3809             /* Update current position for moving past a code
3810                frag.  */
3811             pos += fragp->fr_fix;
3812             pos &= 31;
3813             frchp_next = frchp;
3814             fragp_next = fragp->fr_next;
3815             if (fragp_next == NULL)
3816               {
3817                 frchp_next = frchp->frch_next;
3818                 if (frchp_next != NULL)
3819                   fragp_next = frchp_next->frch_root;
3820               }
3821             if (!(pos & 7))
3822               {
3823                 frchp_last8 = frchp_next;
3824                 fragp_last8 = fragp_next;
3825                 pos_last8 = pos;
3826               }
3827             if (!(pos & 15))
3828               {
3829                 frchp_last16 = frchp_next;
3830                 fragp_last16 = fragp_next;
3831                 pos_last16 = pos;
3832               }
3833             if (!(pos & 31))
3834               {
3835                 frchp_last32 = frchp_next;
3836                 fragp_last32 = fragp_next;
3837                 pos_last32 = pos;
3838               }
3839           }
3840     }
3841
3842   /* Now convert the machine-dependent frags to machine-independent
3843      ones.  */
3844   for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
3845     for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
3846       {
3847         if (fragp->fr_type == rs_machine_dependent)
3848           {
3849             if (fragp->tc_frag_data.is_insns)
3850               frag_wane (fragp);
3851             else
3852               {
3853                 fragp->fr_type = rs_align_code;
3854                 fragp->fr_var = 1;
3855                 *fragp->fr_literal = 0;
3856               }
3857           }
3858       }
3859 }
3860
3861 /* Initialize the machine-dependent parts of a frag.  */
3862
3863 void
3864 tic6x_frag_init (fragS *fragp)
3865 {
3866   fragp->tc_frag_data.is_insns = FALSE;
3867   fragp->tc_frag_data.can_cross_fp_boundary = FALSE;
3868 }
3869
3870 /* Set an attribute if it has not already been set by the user.  */
3871
3872 static void
3873 tic6x_set_attribute_int (int tag, int value)
3874 {
3875   if (tag < 1
3876       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
3877     abort ();
3878   if (!tic6x_attributes_set_explicitly[tag])
3879     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
3880 }
3881
3882 /* Set object attributes deduced from the input file and command line
3883    rather than given explicitly.  */
3884 static void
3885 tic6x_set_attributes (void)
3886 {
3887   if (tic6x_arch_attribute == C6XABI_Tag_CPU_arch_none)
3888     tic6x_arch_attribute = C6XABI_Tag_CPU_arch_C674X;
3889
3890   tic6x_set_attribute_int (Tag_C6XABI_Tag_CPU_arch, tic6x_arch_attribute);
3891 }
3892
3893 /* Do machine-dependent manipulations of the frag chains after all
3894    input has been read and before the machine-independent sizing and
3895    relaxing.  */
3896
3897 void
3898 tic6x_end (void)
3899 {
3900   /* Set object attributes at this point if not explicitly set.  */
3901   tic6x_set_attributes ();
3902
3903   /* Meeting alignment requirements may require inserting NOPs in
3904      parallel in execute packets earlier in the segment.  Future
3905      16-bit instruction generation involves whole-segment optimization
3906      to determine the best choice and ordering of 32-bit or 16-bit
3907      instructions.  This doesn't fit will in the general relaxation
3908      framework, so handle alignment and 16-bit instruction generation
3909      here.  */
3910   bfd_map_over_sections (stdoutput, tic6x_adjust_section, NULL);
3911 }
3912
3913 /* No machine-dependent frags at this stage; all converted in
3914    tic6x_end.  */
3915
3916 void
3917 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
3918                  fragS *fragp ATTRIBUTE_UNUSED)
3919 {
3920   abort ();
3921 }
3922
3923 /* No machine-dependent frags at this stage; all converted in
3924    tic6x_end.  */
3925
3926 int
3927 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
3928                                segT seg ATTRIBUTE_UNUSED)
3929 {
3930   abort ();
3931 }
3932
3933 /* Put a number into target byte order.  */
3934
3935 void
3936 md_number_to_chars (char *buf, valueT val, int n)
3937 {
3938   if (target_big_endian)
3939     number_to_chars_bigendian (buf, val, n);
3940   else
3941     number_to_chars_littleendian (buf, val, n);
3942 }
3943
3944 /* Machine-dependent operand parsing not currently needed.  */
3945
3946 void
3947 md_operand (expressionS *op ATTRIBUTE_UNUSED)
3948 {
3949 }
3950
3951 /* PC-relative operands are relative to the start of the fetch
3952    packet.  */
3953
3954 long
3955 tic6x_pcrel_from_section (fixS *fixp, segT sec)
3956 {
3957   if (fixp->fx_addsy != NULL
3958       && (!S_IS_DEFINED (fixp->fx_addsy)
3959           || S_GET_SEGMENT (fixp->fx_addsy) != sec))
3960     return 0;
3961   return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f;
3962 }
3963
3964 /* Round up a section size to the appropriate boundary.  */
3965
3966 valueT
3967 md_section_align (segT segment ATTRIBUTE_UNUSED,
3968                   valueT size)
3969 {
3970   /* Round up section sizes to ensure that text sections consist of
3971      whole fetch packets.  */
3972   int align = bfd_get_section_alignment (stdoutput, segment);
3973   return ((size + (1 << align) - 1) & ((valueT) -1 << align));
3974 }
3975
3976 /* No special undefined symbol handling needed for now.  */
3977
3978 symbolS *
3979 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
3980 {
3981   return NULL;
3982 }
3983
3984 /* Translate internal representation of relocation info to BFD target
3985    format.  */
3986
3987 arelent *
3988 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
3989 {
3990   arelent *reloc;
3991   bfd_reloc_code_real_type r_type;
3992
3993   reloc = xmalloc (sizeof (arelent));
3994   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
3995   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3996   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3997   reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
3998   r_type = fixp->fx_r_type;
3999   reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4000
4001   if (reloc->howto == NULL)
4002     {
4003       as_bad_where (fixp->fx_file, fixp->fx_line,
4004                     _("Cannot represent relocation type %s"),
4005                     bfd_get_reloc_code_name (r_type));
4006       return NULL;
4007     }
4008
4009   /* Correct for adjustments bfd_install_relocation will make.  */
4010   if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
4011     reloc->addend += reloc->address;
4012
4013   return reloc;
4014 }