ld/testsuite/
[external/binutils.git] / gas / config / tc-tic6x.c
1 /* TI C6X assembler.
2    Copyright 2010, 2011
3    Free Software Foundation, Inc.
4    Contributed by Joseph Myers <joseph@codesourcery.com>
5                   Bernd Schmidt  <bernds@codesourcery.com>
6
7    This file is part of GAS, the GNU Assembler.
8
9    GAS is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3, or (at your option)
12    any later version.
13
14    GAS is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with GAS; see the file COPYING.  If not, write to the Free
21    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23
24 #include "as.h"
25 #include "dwarf2dbg.h"
26 #include "dw2gencfi.h"
27 #include "safe-ctype.h"
28 #include "subsegs.h"
29 #include "opcode/tic6x.h"
30 #include "elf/tic6x.h"
31 #include "elf32-tic6x.h"
32
33 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit
34    host gives identical results to a 32-bit host.  */
35 #define TRUNC(X)        ((valueT) (X) & 0xffffffffU)
36 #define SEXT(X)         ((TRUNC (X) ^ 0x80000000U) - 0x80000000U)
37
38 #define streq(a, b)           (strcmp (a, b) == 0)
39
40 /* Stuff for .scomm symbols.  */
41 static segT sbss_section;
42 static asection scom_section;
43 static asymbol scom_symbol;
44
45 const char comment_chars[] = ";";
46 const char line_comment_chars[] = "#*;";
47 const char line_separator_chars[] = "@";
48
49 const char EXP_CHARS[] = "eE";
50 const char FLT_CHARS[] = "dDfF";
51
52 const char *md_shortopts = "";
53
54 enum
55   {
56     OPTION_MARCH = OPTION_MD_BASE,
57     OPTION_MBIG_ENDIAN,
58     OPTION_MLITTLE_ENDIAN,
59     OPTION_MDSBT,
60     OPTION_MNO_DSBT,
61     OPTION_MPID,
62     OPTION_MPIC,
63     OPTION_MNO_PIC,
64     OPTION_MGENERATE_REL
65   };
66
67 struct option md_longopts[] =
68   {
69     { "march", required_argument, NULL, OPTION_MARCH },
70     { "mbig-endian", no_argument, NULL, OPTION_MBIG_ENDIAN },
71     { "mlittle-endian", no_argument, NULL, OPTION_MLITTLE_ENDIAN },
72     { "mdsbt", no_argument, NULL, OPTION_MDSBT },
73     { "mno-dsbt", no_argument, NULL, OPTION_MNO_DSBT },
74     { "mpid", required_argument, NULL, OPTION_MPID },
75     { "mpic", no_argument, NULL, OPTION_MPIC },
76     { "mno-pic", no_argument, NULL, OPTION_MNO_PIC },
77     { "mgenerate-rel", no_argument, NULL, OPTION_MGENERATE_REL },
78     { NULL, no_argument, NULL, 0 }
79   };
80 size_t md_longopts_size = sizeof (md_longopts);
81
82 /* The instructions enabled based only on the selected architecture
83    (all instructions, if no architecture specified).  */
84 static unsigned short tic6x_arch_enable = (TIC6X_INSN_C62X
85                                            | TIC6X_INSN_C64X
86                                            | TIC6X_INSN_C64XP
87                                            | TIC6X_INSN_C67X
88                                            | TIC6X_INSN_C67XP
89                                            | TIC6X_INSN_C674X);
90
91 /* The instructions enabled based on the current set of features
92    (architecture, as modified by other options).  */
93 static unsigned short tic6x_features;
94
95 /* The architecture attribute value, or C6XABI_Tag_ISA_none if
96    not yet set.  */
97 static int tic6x_arch_attribute = C6XABI_Tag_ISA_none;
98
99 /* Whether any instructions at all have been seen.  Once any
100    instructions have been seen, architecture attributes merge into the
101    previous attribute value rather than replacing it.  */
102 static bfd_boolean tic6x_seen_insns = FALSE;
103
104 /* The number of registers in each register file supported by the
105    current architecture.  */
106 static unsigned int tic6x_num_registers;
107
108 /* Whether predication on A0 is possible.  */
109 static bfd_boolean tic6x_predicate_a0;
110
111 /* Whether execute packets can cross fetch packet boundaries.  */
112 static bfd_boolean tic6x_can_cross_fp_boundary;
113
114 /* Whether there are constraints on simultaneous reads and writes of
115    40-bit data.  */
116 static bfd_boolean tic6x_long_data_constraints;
117
118 /* Whether compact instructions are available.  */
119 static bfd_boolean tic6x_compact_insns;
120
121 /* Whether to generate RELA relocations.  */
122 static bfd_boolean tic6x_generate_rela = TRUE;
123
124 /* Whether the code uses DSBT addressing.  */
125 static bfd_boolean tic6x_dsbt;
126
127 /* Types of position-independent data (attribute values for
128    Tag_ABI_PID).  */
129 typedef enum
130   {
131     tic6x_pid_no = 0,
132     tic6x_pid_near = 1,
133     tic6x_pid_far = 2
134   } tic6x_pid_type;
135
136 /* The type of data addressing used in this code.  */
137 static tic6x_pid_type tic6x_pid;
138
139 /* Whether the code uses position-independent code.  */
140 static bfd_boolean tic6x_pic;
141
142 /* Table of supported architecture variants.  */
143 typedef struct
144 {
145   const char *arch;
146   int attr;
147   unsigned short features;
148 } tic6x_arch_table;
149 static const tic6x_arch_table tic6x_arches[] =
150   {
151     { "c62x", C6XABI_Tag_ISA_C62X, TIC6X_INSN_C62X },
152     { "c64x", C6XABI_Tag_ISA_C64X, TIC6X_INSN_C62X | TIC6X_INSN_C64X },
153     { "c64x+", C6XABI_Tag_ISA_C64XP, (TIC6X_INSN_C62X
154                                       | TIC6X_INSN_C64X
155                                       | TIC6X_INSN_C64XP) },
156     { "c67x", C6XABI_Tag_ISA_C67X, TIC6X_INSN_C62X | TIC6X_INSN_C67X },
157     { "c67x+", C6XABI_Tag_ISA_C67XP, (TIC6X_INSN_C62X
158                                       | TIC6X_INSN_C67X
159                                       | TIC6X_INSN_C67XP) },
160     { "c674x", C6XABI_Tag_ISA_C674X, (TIC6X_INSN_C62X
161                                       | TIC6X_INSN_C64X
162                                       | TIC6X_INSN_C64XP
163                                       | TIC6X_INSN_C67X
164                                       | TIC6X_INSN_C67XP
165                                       | TIC6X_INSN_C674X) }
166   };
167
168 /* Caller saved register encodings.  The standard frame layout uses this
169    order, starting from the highest address.  There must be
170    TIC6X_NUM_UNWIND_REGS values.  */
171 enum
172 {
173   UNWIND_A15,
174   UNWIND_B15,
175   UNWIND_B14,
176   UNWIND_B13,
177   UNWIND_B12,
178   UNWIND_B11,
179   UNWIND_B10,
180   UNWIND_B3,
181   UNWIND_A14,
182   UNWIND_A13,
183   UNWIND_A12,
184   UNWIND_A11,
185   UNWIND_A10
186 };
187
188 static void tic6x_output_unwinding (bfd_boolean need_extab);
189
190 /* Return the frame unwind state for the current function, allocating
191    as necessary.  */
192
193 static tic6x_unwind_info *tic6x_get_unwind (void)
194 {
195   tic6x_unwind_info *unwind;
196
197   unwind = seg_info (now_seg)->tc_segment_info_data.unwind;
198   if (unwind)
199     return unwind;
200
201   unwind = seg_info (now_seg)->tc_segment_info_data.text_unwind;
202   if (unwind)
203     return unwind;
204
205   unwind = (tic6x_unwind_info *)xmalloc (sizeof (tic6x_unwind_info));
206   seg_info (now_seg)->tc_segment_info_data.unwind = unwind;
207   memset (unwind, 0, sizeof (*unwind));
208   return unwind;
209 }
210
211 /* Update the selected architecture based on ARCH, giving an error if
212    ARCH is an invalid value.  Does not call tic6x_update_features; the
213    caller must do that if necessary.  */
214
215 static void
216 tic6x_use_arch (const char *arch)
217 {
218   unsigned int i;
219
220   for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
221     if (strcmp (arch, tic6x_arches[i].arch) == 0)
222       {
223         tic6x_arch_enable = tic6x_arches[i].features;
224         if (tic6x_seen_insns)
225           tic6x_arch_attribute
226             = elf32_tic6x_merge_arch_attributes (tic6x_arch_attribute,
227                                                  tic6x_arches[i].attr);
228         else
229           tic6x_arch_attribute = tic6x_arches[i].attr;
230         return;
231       }
232
233   as_bad (_("unknown architecture '%s'"), arch);
234 }
235
236 /* Table of supported -mpid arguments.  */
237 typedef struct
238 {
239   const char *arg;
240   tic6x_pid_type attr;
241 } tic6x_pid_type_table;
242 static const tic6x_pid_type_table tic6x_pid_types[] =
243   {
244     { "no", tic6x_pid_no },
245     { "near", tic6x_pid_near },
246     { "far", tic6x_pid_far }
247   };
248
249 /* Handle -mpid=ARG.  */
250
251 static void
252 tic6x_use_pid (const char *arg)
253 {
254   unsigned int i;
255
256   for (i = 0; i < ARRAY_SIZE (tic6x_pid_types); i++)
257     if (strcmp (arg, tic6x_pid_types[i].arg) == 0)
258       {
259         tic6x_pid = tic6x_pid_types[i].attr;
260         return;
261       }
262
263   as_bad (_("unknown -mpid= argument '%s'"), arg);
264 }
265
266 /* Parse a target-specific option.  */
267
268 int
269 md_parse_option (int c, char *arg)
270 {
271   switch (c)
272     {
273     case OPTION_MARCH:
274       tic6x_use_arch (arg);
275       break;
276
277     case OPTION_MBIG_ENDIAN:
278       target_big_endian = 1;
279       break;
280
281     case OPTION_MLITTLE_ENDIAN:
282       target_big_endian = 0;
283       break;
284
285     case OPTION_MDSBT:
286       tic6x_dsbt = 1;
287       break;
288
289     case OPTION_MNO_DSBT:
290       tic6x_dsbt = 0;
291       break;
292
293     case OPTION_MPID:
294       tic6x_use_pid (arg);
295       break;
296
297     case OPTION_MPIC:
298       tic6x_pic = 1;
299       break;
300
301     case OPTION_MNO_PIC:
302       tic6x_pic = 0;
303       break;
304
305     case OPTION_MGENERATE_REL:
306       tic6x_generate_rela = FALSE;
307       break;
308
309     default:
310       return 0;
311     }
312   return 1;
313 }
314
315 void
316 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
317 {
318   unsigned int i;
319
320   fputc ('\n', stream);
321   fprintf (stream, _("TMS320C6000 options:\n"));
322   fprintf (stream, _("  -march=ARCH             enable instructions from architecture ARCH\n"));
323   fprintf (stream, _("  -mbig-endian            generate big-endian code\n"));
324   fprintf (stream, _("  -mlittle-endian         generate little-endian code\n"));
325   fprintf (stream, _("  -mdsbt                  code uses DSBT addressing\n"));
326   fprintf (stream, _("  -mno-dsbt               code does not use DSBT addressing\n"));
327   fprintf (stream, _("  -mpid=no                code uses position-dependent data addressing\n"));
328   fprintf (stream, _("  -mpid=near              code uses position-independent data addressing,\n"
329                      "                            GOT accesses use near DP addressing\n"));
330   fprintf (stream, _("  -mpid=far               code uses position-independent data addressing,\n"
331                      "                            GOT accesses use far DP addressing\n"));
332   fprintf (stream, _("  -mpic                   code addressing is position-independent\n"));
333   fprintf (stream, _("  -mno-pic                code addressing is position-dependent\n"));
334   /* -mgenerate-rel is only for testsuite use and is deliberately
335       undocumented.  */
336
337   fputc ('\n', stream);
338   fprintf (stream, _("Supported ARCH values are:"));
339   for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
340     fprintf (stream, " %s", tic6x_arches[i].arch);
341   fputc ('\n', stream);
342 }
343
344 /* Update enabled features based on the current architecture and
345    related settings.  */
346 static void
347 tic6x_update_features (void)
348 {
349   tic6x_features = tic6x_arch_enable;
350
351   tic6x_num_registers
352     = (tic6x_arch_enable & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? 32 : 16;
353
354   tic6x_predicate_a0 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? TRUE : FALSE;
355
356   tic6x_can_cross_fp_boundary
357     = (tic6x_arch_enable
358        & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? TRUE : FALSE;
359
360   tic6x_long_data_constraints
361     = (tic6x_arch_enable & TIC6X_INSN_C64X) ? FALSE : TRUE;
362
363   tic6x_compact_insns = (tic6x_arch_enable & TIC6X_INSN_C64XP) ? TRUE : FALSE;
364 }
365
366 /* Do configuration after all options have been parsed.  */
367
368 void
369 tic6x_after_parse_args (void)
370 {
371   tic6x_update_features ();
372 }
373
374 /* Parse a .cantunwind directive.  */
375 static void
376 s_tic6x_cantunwind (int ignored ATTRIBUTE_UNUSED)
377 {
378   tic6x_unwind_info *unwind = tic6x_get_unwind ();
379
380   /* GCC sometimes spits out superfluous .cantunwind directives, so ignore
381      them.  */
382   if (unwind->data_bytes == 0)
383     return;
384
385   if (unwind->data_bytes != -1)
386     {
387       as_bad (_("unexpected .cantunwind directive"));
388       return;
389     }
390
391   demand_empty_rest_of_line ();
392
393   if (unwind->personality_routine || unwind->personality_index != -1)
394     as_bad (_("personality routine specified for cantunwind frame"));
395
396   unwind->personality_index = -2;
397 }
398
399 /* Parse a .handlerdata directive.  */
400 static void
401 s_tic6x_handlerdata (int ignored ATTRIBUTE_UNUSED)
402 {
403   tic6x_unwind_info *unwind = tic6x_get_unwind ();
404
405   if (!unwind->saved_seg)
406     {
407       as_bad (_("unexpected .handlerdata directive"));
408       return;
409     }
410
411   if (unwind->table_entry || unwind->personality_index == -2)
412     {
413       as_bad (_("duplicate .handlerdata directive"));
414       return;
415     }
416
417   if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
418     {
419       as_bad (_("personality routine required before .handlerdata directive"));
420       return;
421     }
422
423   tic6x_output_unwinding (TRUE);
424 }
425
426 /* Parse a .endp directive.  */
427 static void
428 s_tic6x_endp (int ignored ATTRIBUTE_UNUSED)
429 {
430   tic6x_unwind_info *unwind = tic6x_get_unwind ();
431
432   if (unwind->data_bytes != 0)
433     {
434       /* Output a .exidx entry if we have not already done so.
435          Then switch back to the text section.  */
436       if (!unwind->table_entry)
437         tic6x_output_unwinding (FALSE);
438
439       subseg_set (unwind->saved_seg, unwind->saved_subseg);
440     }
441
442   unwind->saved_seg = NULL;
443   unwind->table_entry = NULL;
444   unwind->data_bytes = 0;
445 }
446
447 /* Parse a .personalityindex directive.  */
448 static void
449 s_tic6x_personalityindex (int ignored ATTRIBUTE_UNUSED)
450 {
451   tic6x_unwind_info *unwind = tic6x_get_unwind ();
452   expressionS exp;
453
454   if (unwind->personality_routine || unwind->personality_index != -1)
455     as_bad (_("duplicate .personalityindex directive"));
456
457   expression (&exp);
458
459   if (exp.X_op != O_constant
460       || exp.X_add_number < 0 || exp.X_add_number > 15)
461     {
462       as_bad (_("bad personality routine number"));
463       ignore_rest_of_line ();
464       return;
465     }
466
467   unwind->personality_index = exp.X_add_number;
468
469   demand_empty_rest_of_line ();
470 }
471
472 static void
473 s_tic6x_personality (int ignored ATTRIBUTE_UNUSED)
474 {
475   char *name, *p, c;
476   tic6x_unwind_info *unwind = tic6x_get_unwind ();
477
478   if (unwind->personality_routine || unwind->personality_index != -1)
479     as_bad (_("duplicate .personality directive"));
480
481   name = input_line_pointer;
482   c = get_symbol_end ();
483   p = input_line_pointer;
484   unwind->personality_routine = symbol_find_or_make (name);
485   *p = c;
486   demand_empty_rest_of_line ();
487 }
488
489 /* Parse a .arch directive.  */
490 static void
491 s_tic6x_arch (int ignored ATTRIBUTE_UNUSED)
492 {
493   char c;
494   char *arch;
495
496   arch = input_line_pointer;
497   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
498     input_line_pointer++;
499   c = *input_line_pointer;
500   *input_line_pointer = 0;
501
502   tic6x_use_arch (arch);
503   tic6x_update_features ();
504   *input_line_pointer = c;
505   demand_empty_rest_of_line ();
506 }
507
508 /* Parse a .ehtype directive.  */
509
510 static void
511 s_tic6x_ehtype (int ignored ATTRIBUTE_UNUSED)
512 {
513   expressionS exp;
514   char *p;
515
516 #ifdef md_flush_pending_output
517   md_flush_pending_output ();
518 #endif
519
520   if (is_it_end_of_statement ())
521     {
522       demand_empty_rest_of_line ();
523       return;
524     }
525
526 #ifdef md_cons_align
527   md_cons_align (4);
528 #endif
529
530
531   expression (&exp);
532
533   if (exp.X_op != O_symbol)
534     {
535       as_bad (_("expected symbol"));
536       return;
537     }
538
539   p = frag_more (4);
540   fix_new_exp (frag_now, p - frag_now->fr_literal, 4,
541                &exp, 0, BFD_RELOC_C6000_EHTYPE);
542
543   demand_empty_rest_of_line ();
544 }
545
546 /* Parse a .nocmp directive.  */
547
548 static void
549 s_tic6x_nocmp (int ignored ATTRIBUTE_UNUSED)
550 {
551   seg_info (now_seg)->tc_segment_info_data.nocmp = TRUE;
552   demand_empty_rest_of_line ();
553 }
554
555 /* .scomm pseudo-op handler.
556
557    This is a new pseudo-op to handle putting objects in .scommon.
558    By doing this the linker won't need to do any work,
559    and more importantly it removes the implicit -G arg necessary to
560    correctly link the object file.  */
561
562 static void
563 s_tic6x_scomm (int ignore ATTRIBUTE_UNUSED)
564 {
565   char *name;
566   char c;
567   char *p;
568   offsetT size;
569   symbolS *symbolP;
570   offsetT align;
571   int align2;
572
573   name = input_line_pointer;
574   c = get_symbol_end ();
575
576   /* Just after name is now '\0'.  */
577   p = input_line_pointer;
578   *p = c;
579   SKIP_WHITESPACE ();
580   if (*input_line_pointer != ',')
581     {
582       as_bad (_("expected comma after symbol name"));
583       ignore_rest_of_line ();
584       return;
585     }
586
587   /* Skip ','.  */
588   input_line_pointer++;
589   if ((size = get_absolute_expression ()) < 0)
590     {
591       /* xgettext:c-format  */
592       as_warn (_("invalid length for .scomm directive"));
593       ignore_rest_of_line ();
594       return;
595     }
596
597   /* The third argument to .scomm is the alignment.  */
598   if (*input_line_pointer != ',')
599     align = 8;
600   else
601     {
602       ++input_line_pointer;
603       align = get_absolute_expression ();
604       if (align <= 0)
605         {
606           as_warn (_("alignment is not a positive number"));
607           align = 8;
608         }
609     }
610
611   /* Convert to a power of 2 alignment.  */
612   if (align)
613     {
614       for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
615         continue;
616       if (align != 1)
617         {
618           as_bad (_("alignment is not a power of 2"));
619           ignore_rest_of_line ();
620           return;
621         }
622     }
623   else
624     align2 = 0;
625
626   *p = 0;
627   symbolP = symbol_find_or_make (name);
628   *p = c;
629
630   if (S_IS_DEFINED (symbolP))
631     {
632       /* xgettext:c-format  */
633       as_bad (_("attempt to re-define symbol `%s'"),
634               S_GET_NAME (symbolP));
635       ignore_rest_of_line ();
636       return;
637     }
638
639   if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
640     {
641       /* xgettext:c-format  */
642       as_bad (_("attempt to redefine `%s' with a different length"),
643               S_GET_NAME (symbolP));
644
645       ignore_rest_of_line ();
646       return;
647     }
648
649   if (symbol_get_obj (symbolP)->local)
650     {
651       segT old_sec = now_seg;
652       int old_subsec = now_subseg;
653       char *pfrag;
654
655       record_alignment (sbss_section, align2);
656       subseg_set (sbss_section, 0);
657
658       if (align2)
659         frag_align (align2, 0, 0);
660
661       if (S_GET_SEGMENT (symbolP) == sbss_section)
662         symbol_get_frag (symbolP)->fr_symbol = 0;
663
664       symbol_set_frag (symbolP, frag_now);
665
666       pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
667                         (char *) 0);
668       *pfrag = 0;
669       S_SET_SIZE (symbolP, size);
670       S_SET_SEGMENT (symbolP, sbss_section);
671       S_CLEAR_EXTERNAL (symbolP);
672       subseg_set (old_sec, old_subsec);
673     }
674   else
675     {
676       S_SET_VALUE (symbolP, (valueT) size);
677       S_SET_ALIGN (symbolP, 1 << align2);
678       S_SET_EXTERNAL (symbolP);
679       S_SET_SEGMENT (symbolP, &scom_section);
680     }
681
682   symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
683
684   demand_empty_rest_of_line ();
685 }
686
687 /* Track for each attribute whether it has been set explicitly (and so
688    should not have a default value set by the assembler).  */
689 static bfd_boolean tic6x_attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
690
691 /* Parse a .c6xabi_attribute directive.  */
692
693 static void
694 s_tic6x_c6xabi_attribute (int ignored ATTRIBUTE_UNUSED)
695 {
696   int tag = s_vendor_attribute (OBJ_ATTR_PROC);
697
698   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
699     tic6x_attributes_set_explicitly[tag] = TRUE;
700 }
701
702 typedef struct
703 {
704   const char *name;
705   int tag;
706 } tic6x_attribute_table;
707
708 static const tic6x_attribute_table tic6x_attributes[] =
709   {
710 #define TAG(tag, value) { #tag, tag },
711 #include "elf/tic6x-attrs.h"
712 #undef TAG
713   };
714
715 /* Convert an attribute name to a number.  */
716
717 int
718 tic6x_convert_symbolic_attribute (const char *name)
719 {
720   unsigned int i;
721
722   for (i = 0; i < ARRAY_SIZE (tic6x_attributes); i++)
723     if (strcmp (name, tic6x_attributes[i].name) == 0)
724       return tic6x_attributes[i].tag;
725
726   return -1;
727 }
728
729 const pseudo_typeS md_pseudo_table[] =
730   {
731     { "arch", s_tic6x_arch, 0 },
732     { "c6xabi_attribute", s_tic6x_c6xabi_attribute, 0 },
733     { "nocmp", s_tic6x_nocmp, 0 },
734     { "scomm",  s_tic6x_scomm, 0 },
735     { "word", cons, 4 },
736     { "ehtype", s_tic6x_ehtype, 0 },
737     { "endp", s_tic6x_endp, 0 },
738     { "handlerdata", s_tic6x_handlerdata, 0 },
739     { "personalityindex", s_tic6x_personalityindex, 0 },
740     { "personality", s_tic6x_personality, 0 },
741     { "cantunwind", s_tic6x_cantunwind, 0 },
742     { 0, 0, 0 }
743   };
744
745 /* Hash table of opcodes.  For each opcode name, this stores a pointer
746    to a tic6x_opcode_list listing (in an arbitrary order) all opcode
747    table entries with that name.  */
748 static struct hash_control *opcode_hash;
749
750 /* Initialize the assembler (called once at assembler startup).  */
751
752 void
753 md_begin (void)
754 {
755   tic6x_opcode_id id;
756   flagword applicable;
757   segT seg;
758   subsegT subseg;
759
760   bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
761
762   /* Insert opcodes into the hash table.  */
763   opcode_hash = hash_new ();
764   for (id = 0; id < tic6x_opcode_max; id++)
765     {
766       const char *errmsg;
767       tic6x_opcode_list *opc = xmalloc (sizeof (tic6x_opcode_list));
768
769       opc->id = id;
770       opc->next = hash_find (opcode_hash, tic6x_opcode_table[id].name);
771       if ((errmsg = hash_jam (opcode_hash, tic6x_opcode_table[id].name, opc))
772           != NULL)
773         as_fatal ("%s", _(errmsg));
774     }
775
776   /* Save the current subseg so we can restore it [it's the default one and
777      we don't want the initial section to be .sbss].  */
778   seg = now_seg;
779   subseg = now_subseg;
780
781   /* The sbss section is for local .scomm symbols.  */
782   sbss_section = subseg_new (".bss", 0);
783   seg_info (sbss_section)->bss = 1;
784
785   /* This is copied from perform_an_assembly_pass.  */
786   applicable = bfd_applicable_section_flags (stdoutput);
787   bfd_set_section_flags (stdoutput, sbss_section, applicable & SEC_ALLOC);
788
789   subseg_set (seg, subseg);
790
791   /* We must construct a fake section similar to bfd_com_section
792      but with the name .scommon.  */
793   scom_section                = bfd_com_section;
794   scom_section.name           = ".scommon";
795   scom_section.output_section = & scom_section;
796   scom_section.symbol         = & scom_symbol;
797   scom_section.symbol_ptr_ptr = & scom_section.symbol;
798   scom_symbol                 = * bfd_com_section.symbol;
799   scom_symbol.name            = ".scommon";
800   scom_symbol.section         = & scom_section;
801 }
802
803 /* Whether the current line being parsed had the "||" parallel bars.  */
804 static bfd_boolean tic6x_line_parallel;
805
806 /* Whether the current line being parsed started "||^" to indicate an
807    SPMASKed parallel instruction.  */
808 static bfd_boolean tic6x_line_spmask;
809
810 /* If the current line being parsed had an instruction predicate, the
811    creg value for that predicate (which must be nonzero); otherwise
812    0.  */
813 static unsigned int tic6x_line_creg;
814
815 /* If the current line being parsed had an instruction predicate, the
816    z value for that predicate; otherwise 0.  */
817 static unsigned int tic6x_line_z;
818
819 /* Return 1 (updating input_line_pointer as appropriate) if the line
820    starting with C (immediately before input_line_pointer) starts with
821    pre-opcode text appropriate for this target, 0 otherwise.  */
822
823 int
824 tic6x_unrecognized_line (int c)
825 {
826   char *p, *endp;
827   unsigned int z;
828   bfd_boolean areg;
829   bfd_boolean bad_predicate;
830
831   switch (c)
832     {
833     case '|':
834       if (input_line_pointer[0] == '|')
835         {
836           if (input_line_pointer[1] == '^')
837             {
838               tic6x_line_spmask = TRUE;
839               input_line_pointer += 2;
840             }
841           else
842             input_line_pointer += 1;
843           if (tic6x_line_parallel)
844             as_bad (_("multiple '||' on same line"));
845           tic6x_line_parallel = TRUE;
846           if (tic6x_line_creg)
847             as_bad (_("'||' after predicate"));
848           return 1;
849         }
850       return 0;
851
852     case '[':
853       /* If it doesn't look like a predicate at all, just return 0.
854          If it looks like one but not a valid one, give a better
855          error.  */
856       p = input_line_pointer;
857       while (*p != ']' && !is_end_of_line[(unsigned char) *p])
858         p++;
859       if (*p != ']')
860         return 0;
861       endp = p + 1;
862       p = input_line_pointer;
863       z = 0;
864       bad_predicate = FALSE;
865       if (*p == '!')
866         {
867           z = 1;
868           p++;
869         }
870       if (*p == 'A' || *p == 'a')
871         areg = TRUE;
872       else if (*p == 'B' || *p == 'b')
873         areg = FALSE;
874       else
875         {
876           areg = TRUE; /* Avoid uninitialized warning.  */
877           bad_predicate = TRUE;
878         }
879       if (!bad_predicate)
880         {
881           p++;
882           if (*p != '0' && *p != '1' && *p != '2')
883             bad_predicate = TRUE;
884           else if (p[1] != ']')
885             bad_predicate = TRUE;
886           else
887             input_line_pointer = p + 2;
888         }
889
890       if (tic6x_line_creg)
891         as_bad (_("multiple predicates on same line"));
892
893       if (bad_predicate)
894         {
895           char ctmp = *endp;
896           *endp = 0;
897           as_bad (_("bad predicate '%s'"), input_line_pointer - 1);
898           *endp = ctmp;
899           input_line_pointer = endp;
900           return 1;
901         }
902
903       switch (*p)
904         {
905         case '0':
906           tic6x_line_creg = (areg ? 6 : 1);
907           if (areg && !tic6x_predicate_a0)
908             as_bad (_("predication on A0 not supported on this architecture"));
909           break;
910
911         case '1':
912           tic6x_line_creg = (areg ? 4 : 2);
913           break;
914
915         case '2':
916           tic6x_line_creg = (areg ? 5 : 3);
917           break;
918
919         default:
920           abort ();
921         }
922
923       tic6x_line_z = z;
924       return 1;
925
926     default:
927       return 0;
928     }
929 }
930
931 /* Do any target-specific handling of a label required.  */
932
933 void
934 tic6x_frob_label (symbolS *sym)
935 {
936   segment_info_type *si;
937   tic6x_label_list *list;
938
939   if (tic6x_line_parallel)
940     {
941       as_bad (_("label after '||'"));
942       tic6x_line_parallel = FALSE;
943       tic6x_line_spmask = FALSE;
944     }
945   if (tic6x_line_creg)
946     {
947       as_bad (_("label after predicate"));
948       tic6x_line_creg = 0;
949       tic6x_line_z = 0;
950     }
951
952   si = seg_info (now_seg);
953   list = si->tc_segment_info_data.label_list;
954   si->tc_segment_info_data.label_list = xmalloc (sizeof (tic6x_label_list));
955   si->tc_segment_info_data.label_list->next = list;
956   si->tc_segment_info_data.label_list->label = sym;
957
958   /* Defining tc_frob_label overrides the ELF definition of
959      obj_frob_label, so we need to apply its effects here.  */
960   dwarf2_emit_label (sym);
961 }
962
963 /* At end-of-line, give errors for start-of-line decorations that
964    needed an instruction but were not followed by one.  */
965
966 static void
967 tic6x_end_of_line (void)
968 {
969   if (tic6x_line_parallel)
970     {
971       as_bad (_("'||' not followed by instruction"));
972       tic6x_line_parallel = FALSE;
973       tic6x_line_spmask = FALSE;
974     }
975   if (tic6x_line_creg)
976     {
977       as_bad (_("predicate not followed by instruction"));
978       tic6x_line_creg = 0;
979       tic6x_line_z = 0;
980     }
981 }
982
983 /* Do any target-specific handling of the start of a logical line.  */
984
985 void
986 tic6x_start_line_hook (void)
987 {
988   tic6x_end_of_line ();
989 }
990
991 /* Do target-specific handling immediately after an input file from
992    the command line, and any other inputs it includes, have been
993    read.  */
994
995 void
996 tic6x_cleanup (void)
997 {
998   tic6x_end_of_line ();
999 }
1000
1001 /* Do target-specific initialization after arguments have been
1002    processed and the output file created.  */
1003
1004 void
1005 tic6x_init_after_args (void)
1006 {
1007   elf32_tic6x_set_use_rela_p (stdoutput, tic6x_generate_rela);
1008 }
1009
1010 /* Free LIST of labels (possibly NULL).  */
1011
1012 static void
1013 tic6x_free_label_list (tic6x_label_list *list)
1014 {
1015   while (list)
1016     {
1017       tic6x_label_list *old = list;
1018
1019       list = list->next;
1020       free (old);
1021     }
1022 }
1023
1024 /* Handle a data alignment of N bytes.  */
1025
1026 void
1027 tic6x_cons_align (int n ATTRIBUTE_UNUSED)
1028 {
1029   segment_info_type *seginfo = seg_info (now_seg);
1030
1031   /* Data means there is no current execute packet, and that any label
1032      applies to that data rather than a subsequent instruction.  */
1033   tic6x_free_label_list (seginfo->tc_segment_info_data.label_list);
1034   seginfo->tc_segment_info_data.label_list = NULL;
1035   seginfo->tc_segment_info_data.execute_packet_frag = NULL;
1036   seginfo->tc_segment_info_data.last_insn_lsb = NULL;
1037   seginfo->tc_segment_info_data.spmask_addr = NULL;
1038   seginfo->tc_segment_info_data.func_units_used = 0;
1039 }
1040
1041 /* Handle an alignment directive.  Return TRUE if the
1042    machine-independent frag generation should be skipped.  */
1043
1044 bfd_boolean
1045 tic6x_do_align (int n, char *fill, int len ATTRIBUTE_UNUSED, int max)
1046 {
1047   /* Given code alignments of 4, 8, 16 or 32 bytes, we try to handle
1048      them in the md_end pass by inserting NOPs in parallel with
1049      previous instructions.  We only do this in sections containing
1050      nothing but instructions.  Code alignments of 1 or 2 bytes have
1051      no effect in such sections (but we record them with
1052      machine-dependent frags anyway so they can be skipped or
1053      converted to machine-independent), while those of more than 64
1054      bytes cannot reliably be handled in this way.  */
1055   if (n > 0
1056       && max >= 0
1057       && max < (1 << n)
1058       && !need_pass_2
1059       && fill == NULL
1060       && subseg_text_p (now_seg))
1061     {
1062       fragS *align_frag;
1063       char *p;
1064
1065       if (n > 5)
1066         return FALSE;
1067
1068       /* Machine-independent code would generate a frag here, but we
1069          wish to handle it in a machine-dependent way.  */
1070       if (frag_now_fix () != 0)
1071         {
1072           if (frag_now->fr_type != rs_machine_dependent)
1073             frag_wane (frag_now);
1074
1075           frag_new (0);
1076         }
1077       frag_grow (32);
1078       align_frag = frag_now;
1079       p = frag_var (rs_machine_dependent, 32, 32, max, NULL, n, NULL);
1080       /* This must be the same as the frag to which a pointer was just
1081          saved.  */
1082       if (p != align_frag->fr_literal)
1083         abort ();
1084       align_frag->tc_frag_data.is_insns = FALSE;
1085       return TRUE;
1086     }
1087   else
1088     return FALSE;
1089 }
1090
1091 /* Types of operand for parsing purposes.  These are used as bit-masks
1092    to tell tic6x_parse_operand what forms of operand are
1093    permitted.  */
1094 #define TIC6X_OP_EXP            0x0001u
1095 #define TIC6X_OP_REG            0x0002u
1096 #define TIC6X_OP_REGPAIR        0x0004u
1097 #define TIC6X_OP_IRP            0x0008u
1098 #define TIC6X_OP_NRP            0x0010u
1099 /* With TIC6X_OP_MEM_NOUNREG, the contents of a () offset are always
1100    interpreted as an expression, which may be a symbol with the same
1101    name as a register that ends up being implicitly DP-relative.  With
1102    TIC6X_OP_MEM_UNREG, the contents of a () offset are interpreted as
1103    a register if they match one, and failing that as an expression,
1104    which must be constant.  */
1105 #define TIC6X_OP_MEM_NOUNREG    0x0020u
1106 #define TIC6X_OP_MEM_UNREG      0x0040u
1107 #define TIC6X_OP_CTRL           0x0080u
1108 #define TIC6X_OP_FUNC_UNIT      0x0100u
1109
1110 /* A register or register pair read by the assembler.  */
1111 typedef struct
1112 {
1113   /* The side the register is on (1 or 2).  */
1114   unsigned int side;
1115   /* The register number (0 to 31).  */
1116   unsigned int num;
1117 } tic6x_register;
1118
1119 /* Types of modification of a base address.  */
1120 typedef enum
1121   {
1122     tic6x_mem_mod_none,
1123     tic6x_mem_mod_plus,
1124     tic6x_mem_mod_minus,
1125     tic6x_mem_mod_preinc,
1126     tic6x_mem_mod_predec,
1127     tic6x_mem_mod_postinc,
1128     tic6x_mem_mod_postdec
1129   } tic6x_mem_mod;
1130
1131 /* Scaled [] or unscaled () nature of an offset.  */
1132 typedef enum
1133   {
1134     tic6x_offset_none,
1135     tic6x_offset_scaled,
1136     tic6x_offset_unscaled
1137   } tic6x_mem_scaling;
1138
1139 /* A memory operand read by the assembler.  */
1140 typedef struct
1141 {
1142   /* The base register.  */
1143   tic6x_register base_reg;
1144   /* How the base register is modified.  */
1145   tic6x_mem_mod mod;
1146   /* Whether there is an offset (required with plain "+" and "-"), and
1147      whether it is scaled or unscaled if so.  */
1148   tic6x_mem_scaling scaled;
1149   /* Whether the offset is a register (TRUE) or an expression
1150      (FALSE).  */
1151   bfd_boolean offset_is_reg;
1152   /* The offset.  */
1153   union
1154   {
1155     expressionS exp;
1156     tic6x_register reg;
1157   } offset;
1158 } tic6x_mem_ref;
1159
1160 /* A functional unit in SPMASK operands read by the assembler.  */
1161 typedef struct
1162 {
1163   /* The basic unit.  */
1164   tic6x_func_unit_base base;
1165   /* The side (1 or 2).  */
1166   unsigned int side;
1167 } tic6x_func_unit_operand;
1168
1169 /* An operand read by the assembler.  */
1170 typedef struct
1171 {
1172   /* The syntactic form of the operand, as one of the bit-masks
1173      above.  */
1174   unsigned int form;
1175   /* The operand value.  */
1176   union
1177   {
1178     /* An expression: TIC6X_OP_EXP.  */
1179     expressionS exp;
1180     /* A register: TIC6X_OP_REG, TIC6X_OP_REGPAIR.  */
1181     tic6x_register reg;
1182     /* A memory reference: TIC6X_OP_MEM_NOUNREG,
1183        TIC6X_OP_MEM_UNREG.  */
1184     tic6x_mem_ref mem;
1185     /* A control register: TIC6X_OP_CTRL.  */
1186     tic6x_ctrl_id ctrl;
1187     /* A functional unit: TIC6X_OP_FUNC_UNIT.  */
1188     tic6x_func_unit_operand func_unit;
1189   } value;
1190 } tic6x_operand;
1191
1192 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
1193
1194 /* Parse a register operand, or part of an operand, starting at *P.
1195    If syntactically OK (including that the number is in the range 0 to
1196    31, but not necessarily in range for this architecture), return
1197    TRUE, putting the register side and number in *REG and update *P to
1198    point immediately after the register number; otherwise return FALSE
1199    without changing *P (but possibly changing *REG).  Do not print any
1200    diagnostics.  */
1201
1202 static bfd_boolean
1203 tic6x_parse_register (char **p, tic6x_register *reg)
1204 {
1205   char *r = *p;
1206
1207   switch (*r)
1208     {
1209     case 'a':
1210     case 'A':
1211       reg->side = 1;
1212       break;
1213
1214     case 'b':
1215     case 'B':
1216       reg->side = 2;
1217       break;
1218
1219     default:
1220       return FALSE;
1221     }
1222   r++;
1223
1224   if (*r >= '0' && *r <= '9')
1225     {
1226       reg->num = *r - '0';
1227       r++;
1228     }
1229   else
1230     return FALSE;
1231
1232   if (reg->num > 0 && *r >= '0' && *r <= '9')
1233     {
1234       reg->num = reg->num * 10 + (*r - '0');
1235       r++;
1236     }
1237
1238   if (*r >= '0' && *r <= '9')
1239     return FALSE;
1240
1241   if (reg->num >= 32)
1242     return FALSE;
1243   *p = r;
1244   return TRUE;
1245 }
1246
1247 /* Parse the initial two characters of a functional unit name starting
1248    at *P.  If OK, set *BASE and *SIDE and return TRUE; otherwise,
1249    return FALSE.  */
1250
1251 static bfd_boolean
1252 tic6x_parse_func_unit_base (char *p, tic6x_func_unit_base *base,
1253                             unsigned int *side)
1254 {
1255   bfd_boolean good_func_unit = TRUE;
1256   tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
1257   unsigned int maybe_side = 0;
1258
1259   switch (p[0])
1260     {
1261     case 'd':
1262     case 'D':
1263       maybe_base = tic6x_func_unit_d;
1264       break;
1265
1266     case 'l':
1267     case 'L':
1268       maybe_base = tic6x_func_unit_l;
1269       break;
1270
1271     case 'm':
1272     case 'M':
1273       maybe_base = tic6x_func_unit_m;
1274       break;
1275
1276     case 's':
1277     case 'S':
1278       maybe_base = tic6x_func_unit_s;
1279       break;
1280
1281     default:
1282       good_func_unit = FALSE;
1283       break;
1284     }
1285
1286   if (good_func_unit)
1287     switch (p[1])
1288       {
1289       case '1':
1290         maybe_side = 1;
1291         break;
1292
1293       case '2':
1294         maybe_side = 2;
1295         break;
1296
1297       default:
1298         good_func_unit = FALSE;
1299         break;
1300       }
1301
1302   if (good_func_unit)
1303     {
1304       *base = maybe_base;
1305       *side = maybe_side;
1306     }
1307
1308   return good_func_unit;
1309 }
1310
1311 /* Parse an operand starting at *P.  If the operand parses OK, return
1312    TRUE and store the value in *OP; otherwise return FALSE (possibly
1313    changing *OP).  In any case, update *P to point to the following
1314    comma or end of line.  The possible operand forms are given by
1315    OP_FORMS.  For diagnostics, this is operand OPNO of an opcode
1316    starting at STR, length OPC_LEN.  */
1317
1318 static bfd_boolean
1319 tic6x_parse_operand (char **p, tic6x_operand *op, unsigned int op_forms,
1320                      char *str, int opc_len, unsigned int opno)
1321 {
1322   bfd_boolean operand_parsed = FALSE;
1323   char *q = *p;
1324
1325   if ((op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
1326       == (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
1327     abort ();
1328
1329   /* Check for functional unit names for SPMASK and SPMASKR.  */
1330   if (!operand_parsed && (op_forms & TIC6X_OP_FUNC_UNIT))
1331     {
1332       tic6x_func_unit_base base = tic6x_func_unit_nfu;
1333       unsigned int side = 0;
1334
1335       if (tic6x_parse_func_unit_base (q, &base, &side))
1336         {
1337           char *rq = q + 2;
1338
1339           skip_whitespace (rq);
1340           if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1341             {
1342               op->form = TIC6X_OP_FUNC_UNIT;
1343               op->value.func_unit.base = base;
1344               op->value.func_unit.side = side;
1345               operand_parsed = TRUE;
1346               q = rq;
1347             }
1348         }
1349     }
1350
1351   /* Check for literal "irp".  */
1352   if (!operand_parsed && (op_forms & TIC6X_OP_IRP))
1353     {
1354       if ((q[0] == 'i' || q[0] == 'I')
1355           && (q[1] == 'r' || q[1] == 'R')
1356           && (q[2] == 'p' || q[2] == 'P'))
1357         {
1358           char *rq = q + 3;
1359
1360           skip_whitespace (rq);
1361           if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1362             {
1363               op->form = TIC6X_OP_IRP;
1364               operand_parsed = TRUE;
1365               q = rq;
1366             }
1367         }
1368     }
1369
1370   /* Check for literal "nrp".  */
1371   if (!operand_parsed && (op_forms & TIC6X_OP_NRP))
1372     {
1373       if ((q[0] == 'n' || q[0] == 'N')
1374           && (q[1] == 'r' || q[1] == 'R')
1375           && (q[2] == 'p' || q[2] == 'P'))
1376         {
1377           char *rq = q + 3;
1378
1379           skip_whitespace (rq);
1380           if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1381             {
1382               op->form = TIC6X_OP_NRP;
1383               operand_parsed = TRUE;
1384               q = rq;
1385             }
1386         }
1387     }
1388
1389   /* Check for control register names.  */
1390   if (!operand_parsed && (op_forms & TIC6X_OP_CTRL))
1391     {
1392       tic6x_ctrl_id crid;
1393
1394       for (crid = 0; crid < tic6x_ctrl_max; crid++)
1395         {
1396           size_t len = strlen (tic6x_ctrl_table[crid].name);
1397
1398           if (strncasecmp (tic6x_ctrl_table[crid].name, q, len) == 0)
1399             {
1400               char *rq = q + len;
1401
1402               skip_whitespace (rq);
1403               if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1404                 {
1405                   op->form = TIC6X_OP_CTRL;
1406                   op->value.ctrl = crid;
1407                   operand_parsed = TRUE;
1408                   q = rq;
1409                   if (!(tic6x_ctrl_table[crid].isa_variants & tic6x_features))
1410                     as_bad (_("control register '%s' not supported "
1411                               "on this architecture"),
1412                             tic6x_ctrl_table[crid].name);
1413                 }
1414             }
1415         }
1416     }
1417
1418   /* See if this looks like a memory reference.  */
1419   if (!operand_parsed
1420       && (op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG)))
1421     {
1422       bfd_boolean mem_ok = TRUE;
1423       char *mq = q;
1424       tic6x_mem_mod mem_mod = tic6x_mem_mod_none;
1425       tic6x_register base_reg;
1426       bfd_boolean require_offset, permit_offset;
1427       tic6x_mem_scaling scaled;
1428       bfd_boolean offset_is_reg;
1429       expressionS offset_exp;
1430       tic6x_register offset_reg;
1431
1432       if (*mq == '*')
1433         mq++;
1434       else
1435         mem_ok = FALSE;
1436
1437       if (mem_ok)
1438         {
1439           skip_whitespace (mq);
1440           switch (*mq)
1441             {
1442             case '+':
1443               if (mq[1] == '+')
1444                 {
1445                   mem_mod = tic6x_mem_mod_preinc;
1446                   mq += 2;
1447                 }
1448               else
1449                 {
1450                   mem_mod = tic6x_mem_mod_plus;
1451                   mq++;
1452                 }
1453               break;
1454
1455             case '-':
1456               if (mq[1] == '-')
1457                 {
1458                   mem_mod = tic6x_mem_mod_predec;
1459                   mq += 2;
1460                 }
1461               else
1462                 {
1463                   mem_mod = tic6x_mem_mod_minus;
1464                   mq++;
1465                 }
1466               break;
1467
1468             default:
1469               break;
1470             }
1471         }
1472
1473       if (mem_ok)
1474         {
1475           skip_whitespace (mq);
1476           mem_ok = tic6x_parse_register (&mq, &base_reg);
1477         }
1478
1479       if (mem_ok && mem_mod == tic6x_mem_mod_none)
1480         {
1481           skip_whitespace (mq);
1482           if (mq[0] == '+' && mq[1] == '+')
1483             {
1484               mem_mod = tic6x_mem_mod_postinc;
1485               mq += 2;
1486             }
1487           else if (mq[0] == '-' && mq[1] == '-')
1488             {
1489               mem_mod = tic6x_mem_mod_postdec;
1490               mq += 2;
1491             }
1492         }
1493
1494       if (mem_mod == tic6x_mem_mod_none)
1495         permit_offset = FALSE;
1496       else
1497         permit_offset = TRUE;
1498       if (mem_mod == tic6x_mem_mod_plus || mem_mod == tic6x_mem_mod_minus)
1499         require_offset = TRUE;
1500       else
1501         require_offset = FALSE;
1502       scaled = tic6x_offset_none;
1503       offset_is_reg = FALSE;
1504
1505       if (mem_ok && permit_offset)
1506         {
1507           char endc = 0;
1508
1509           skip_whitespace (mq);
1510           switch (*mq)
1511             {
1512             case '[':
1513               scaled = tic6x_offset_scaled;
1514               mq++;
1515               endc = ']';
1516               break;
1517
1518             case '(':
1519               scaled = tic6x_offset_unscaled;
1520               mq++;
1521               endc = ')';
1522               break;
1523
1524             default:
1525               break;
1526             }
1527           if (scaled != tic6x_offset_none)
1528             {
1529               skip_whitespace (mq);
1530               if (scaled == tic6x_offset_scaled
1531                   || (op_forms & TIC6X_OP_MEM_UNREG))
1532                 {
1533                   bfd_boolean reg_ok;
1534                   char *rq = mq;
1535
1536                   reg_ok = tic6x_parse_register (&rq, &offset_reg);
1537                   if (reg_ok)
1538                     {
1539                       skip_whitespace (rq);
1540                       if (*rq == endc)
1541                         {
1542                           mq = rq;
1543                           offset_is_reg = TRUE;
1544                         }
1545                     }
1546                 }
1547               if (!offset_is_reg)
1548                 {
1549                   char *save_input_line_pointer;
1550
1551                   save_input_line_pointer = input_line_pointer;
1552                   input_line_pointer = mq;
1553                   expression (&offset_exp);
1554                   mq = input_line_pointer;
1555                   input_line_pointer = save_input_line_pointer;
1556                 }
1557               skip_whitespace (mq);
1558               if (*mq == endc)
1559                 mq++;
1560               else
1561                 mem_ok = FALSE;
1562             }
1563         }
1564
1565       if (mem_ok && require_offset && scaled == tic6x_offset_none)
1566         mem_ok = FALSE;
1567
1568       if (mem_ok)
1569         {
1570           skip_whitespace (mq);
1571           if (!is_end_of_line[(unsigned char) *mq] && *mq != ',')
1572             mem_ok = FALSE;
1573         }
1574
1575       if (mem_ok)
1576         {
1577           op->form = op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG);
1578           op->value.mem.base_reg = base_reg;
1579           op->value.mem.mod = mem_mod;
1580           op->value.mem.scaled = scaled;
1581           op->value.mem.offset_is_reg = offset_is_reg;
1582           if (offset_is_reg)
1583             op->value.mem.offset.reg = offset_reg;
1584           else
1585             op->value.mem.offset.exp = offset_exp;
1586           operand_parsed = TRUE;
1587           q = mq;
1588           if (base_reg.num >= tic6x_num_registers)
1589             as_bad (_("register number %u not supported on this architecture"),
1590                     base_reg.num);
1591           if (offset_is_reg && offset_reg.num >= tic6x_num_registers)
1592             as_bad (_("register number %u not supported on this architecture"),
1593                     offset_reg.num);
1594         }
1595     }
1596
1597   /* See if this looks like a register or register pair.  */
1598   if (!operand_parsed && (op_forms & (TIC6X_OP_REG | TIC6X_OP_REGPAIR)))
1599     {
1600       tic6x_register first_reg, second_reg;
1601       bfd_boolean reg_ok;
1602       char *rq = q;
1603
1604       reg_ok = tic6x_parse_register (&rq, &first_reg);
1605
1606       if (reg_ok)
1607         {
1608           if (*rq == ':' && (op_forms & TIC6X_OP_REGPAIR))
1609             {
1610               rq++;
1611               reg_ok = tic6x_parse_register (&rq, &second_reg);
1612               if (reg_ok)
1613                 {
1614                   skip_whitespace (rq);
1615                   if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1616                     {
1617                       if ((second_reg.num & 1)
1618                           || (first_reg.num != second_reg.num + 1)
1619                           || (first_reg.side != second_reg.side))
1620                         as_bad (_("register pair for operand %u of '%.*s'"
1621                                   " not a valid even/odd pair"), opno,
1622                                 opc_len, str);
1623                       op->form = TIC6X_OP_REGPAIR;
1624                       op->value.reg = second_reg;
1625                       operand_parsed = TRUE;
1626                       q = rq;
1627                     }
1628                 }
1629             }
1630           else if (op_forms & TIC6X_OP_REG)
1631             {
1632               skip_whitespace (rq);
1633               if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1634                 {
1635                   op->form = TIC6X_OP_REG;
1636                   op->value.reg = first_reg;
1637                   operand_parsed = TRUE;
1638                   q = rq;
1639                 }
1640             }
1641         }
1642       if (operand_parsed)
1643         {
1644           if (first_reg.num >= tic6x_num_registers)
1645             as_bad (_("register number %u not supported on this architecture"),
1646                     first_reg.num);
1647           if (op->form == TIC6X_OP_REGPAIR
1648               && second_reg.num >= tic6x_num_registers)
1649             as_bad (_("register number %u not supported on this architecture"),
1650                     second_reg.num);
1651         }
1652     }
1653
1654   /* Otherwise, parse it as an expression.  */
1655   if (!operand_parsed && (op_forms & TIC6X_OP_EXP))
1656     {
1657       char *save_input_line_pointer;
1658
1659       save_input_line_pointer = input_line_pointer;
1660       input_line_pointer = q;
1661       op->form = TIC6X_OP_EXP;
1662       expression (&op->value.exp);
1663       q = input_line_pointer;
1664       input_line_pointer = save_input_line_pointer;
1665       operand_parsed = TRUE;
1666     }
1667
1668   if (operand_parsed)
1669     {
1670       /* Now the operand has been parsed, there must be nothing more
1671          before the comma or end of line.  */
1672       skip_whitespace (q);
1673       if (!is_end_of_line[(unsigned char) *q] && *q != ',')
1674         {
1675           operand_parsed = FALSE;
1676           as_bad (_("junk after operand %u of '%.*s'"), opno,
1677                   opc_len, str);
1678           while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1679             q++;
1680         }
1681     }
1682   else
1683     {
1684       /* This could not be parsed as any acceptable form of
1685          operand.  */
1686       switch (op_forms)
1687         {
1688         case TIC6X_OP_REG | TIC6X_OP_REGPAIR:
1689           as_bad (_("bad register or register pair for operand %u of '%.*s'"),
1690                   opno, opc_len, str);
1691           break;
1692
1693         case TIC6X_OP_REG | TIC6X_OP_CTRL:
1694         case TIC6X_OP_REG:
1695           as_bad (_("bad register for operand %u of '%.*s'"),
1696                   opno, opc_len, str);
1697           break;
1698
1699         case TIC6X_OP_REGPAIR:
1700           as_bad (_("bad register pair for operand %u of '%.*s'"),
1701                   opno, opc_len, str);
1702           break;
1703
1704         case TIC6X_OP_FUNC_UNIT:
1705           as_bad (_("bad functional unit for operand %u of '%.*s'"),
1706                   opno, opc_len, str);
1707           break;
1708
1709         default:
1710           as_bad (_("bad operand %u of '%.*s'"),
1711                   opno, opc_len, str);
1712           break;
1713
1714         }
1715       while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1716         q++;
1717     }
1718   *p = q;
1719   return operand_parsed;
1720 }
1721
1722 /* Table of assembler operators and associated O_* values.  */
1723 typedef struct
1724 {
1725   const char *name;
1726   operatorT op;
1727 } tic6x_operator_table;
1728 static const tic6x_operator_table tic6x_operators[] = {
1729 #define O_dsbt_index O_md1
1730   { "dsbt_index", O_dsbt_index },
1731 #define O_got O_md2
1732   { "got", O_got },
1733 #define O_dpr_got O_md3
1734   { "dpr_got", O_dpr_got },
1735 #define O_dpr_byte O_md4
1736   { "dpr_byte", O_dpr_byte },
1737 #define O_dpr_hword O_md5
1738   { "dpr_hword", O_dpr_hword },
1739 #define O_dpr_word O_md6
1740   { "dpr_word", O_dpr_word },
1741 #define O_pcr_offset O_md7
1742   { "pcr_offset", O_pcr_offset }
1743 };
1744
1745 /* Parse a name in some machine-specific way.  Used on C6X to handle
1746    assembler operators.  */
1747
1748 int
1749 tic6x_parse_name (const char *name, expressionS *exprP,
1750                   enum expr_mode mode ATTRIBUTE_UNUSED, char *nextchar)
1751 {
1752   char *p = input_line_pointer;
1753   char c, *name_start, *name_end;
1754   const char *inner_name;
1755   unsigned int i;
1756   operatorT op = O_illegal;
1757   symbolS *sym, *op_sym = NULL;
1758
1759   if (*name != '$')
1760     return 0;
1761
1762   for (i = 0; i < ARRAY_SIZE (tic6x_operators); i++)
1763     if (strcasecmp (name + 1, tic6x_operators[i].name) == 0)
1764       {
1765         op = tic6x_operators[i].op;
1766         break;
1767       }
1768
1769   if (op == O_illegal)
1770     return 0;
1771
1772   *input_line_pointer = *nextchar;
1773   skip_whitespace (p);
1774
1775   if (*p != '(')
1776     {
1777       *input_line_pointer = 0;
1778       return 0;
1779     }
1780   p++;
1781   skip_whitespace (p);
1782
1783   if (!is_name_beginner (*p))
1784     {
1785       *input_line_pointer = 0;
1786       return 0;
1787     }
1788
1789   name_start = p;
1790   p++;
1791   while (is_part_of_name (*p))
1792     p++;
1793   name_end = p;
1794   skip_whitespace (p);
1795
1796   if (op == O_pcr_offset)
1797     {
1798       char *op_name_start, *op_name_end;
1799
1800       if (*p != ',')
1801         {
1802           *input_line_pointer = 0;
1803           return 0;
1804         }
1805       p++;
1806       skip_whitespace (p);
1807
1808       if (!is_name_beginner (*p))
1809         {
1810           *input_line_pointer = 0;
1811           return 0;
1812         }
1813
1814       op_name_start = p;
1815       p++;
1816       while (is_part_of_name (*p))
1817         p++;
1818       op_name_end = p;
1819       skip_whitespace (p);
1820
1821       c = *op_name_end;
1822       *op_name_end = 0;
1823       op_sym = symbol_find_or_make (op_name_start);
1824       *op_name_end = c;
1825     }
1826
1827   if (*p != ')')
1828     {
1829       *input_line_pointer = 0;
1830       return 0;
1831     }
1832
1833   input_line_pointer = p + 1;
1834   *nextchar = *input_line_pointer;
1835   *input_line_pointer = 0;
1836
1837   c = *name_end;
1838   *name_end = 0;
1839   inner_name = name_start;
1840   if (op == O_dsbt_index && strcmp (inner_name, "__c6xabi_DSBT_BASE") != 0)
1841     {
1842       as_bad (_("$DSBT_INDEX must be used with __c6xabi_DSBT_BASE"));
1843       inner_name = "__c6xabi_DSBT_BASE";
1844     }
1845   sym = symbol_find_or_make (inner_name);
1846   *name_end = c;
1847
1848   exprP->X_op = op;
1849   exprP->X_add_symbol = sym;
1850   exprP->X_add_number = 0;
1851   exprP->X_op_symbol = op_sym;
1852   exprP->X_md = 0;
1853
1854   return 1;
1855 }
1856
1857 /* Create a fixup for an expression.  Same arguments as fix_new_exp,
1858    plus FIX_ADDA which is TRUE for ADDA instructions (to indicate that
1859    fixes resolving to constants should have those constants implicitly
1860    shifted) and FALSE otherwise, but look for C6X-specific expression
1861    types and adjust the relocations or give errors accordingly.  */
1862
1863 static void
1864 tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
1865                    int pcrel, bfd_reloc_code_real_type r_type,
1866                    bfd_boolean fix_adda)
1867 {
1868   bfd_reloc_code_real_type new_reloc = BFD_RELOC_UNUSED;
1869   symbolS *subsy = NULL;
1870   fixS *fix;
1871
1872   switch (exp->X_op)
1873     {
1874     case O_dsbt_index:
1875       switch (r_type)
1876         {
1877         case BFD_RELOC_C6000_SBR_U15_W:
1878           new_reloc = BFD_RELOC_C6000_DSBT_INDEX;
1879           break;
1880
1881         default:
1882           as_bad (_("$DSBT_INDEX not supported in this context"));
1883           return;
1884         }
1885       break;
1886
1887     case O_got:
1888       switch (r_type)
1889         {
1890         case BFD_RELOC_C6000_SBR_U15_W:
1891           new_reloc = BFD_RELOC_C6000_SBR_GOT_U15_W;
1892           break;
1893
1894         default:
1895           as_bad (_("$GOT not supported in this context"));
1896           return;
1897         }
1898       break;
1899
1900     case O_dpr_got:
1901       switch (r_type)
1902         {
1903         case BFD_RELOC_C6000_ABS_L16:
1904           new_reloc = BFD_RELOC_C6000_SBR_GOT_L16_W;
1905           break;
1906
1907         case BFD_RELOC_C6000_ABS_H16:
1908           new_reloc = BFD_RELOC_C6000_SBR_GOT_H16_W;
1909           break;
1910
1911         default:
1912           as_bad (_("$DPR_GOT not supported in this context"));
1913           return;
1914         }
1915       break;
1916
1917     case O_dpr_byte:
1918       switch (r_type)
1919         {
1920         case BFD_RELOC_C6000_ABS_S16:
1921           new_reloc = BFD_RELOC_C6000_SBR_S16;
1922           break;
1923
1924         case BFD_RELOC_C6000_ABS_L16:
1925           new_reloc = BFD_RELOC_C6000_SBR_L16_B;
1926           break;
1927
1928         case BFD_RELOC_C6000_ABS_H16:
1929           new_reloc = BFD_RELOC_C6000_SBR_H16_B;
1930           break;
1931
1932         default:
1933           as_bad (_("$DPR_BYTE not supported in this context"));
1934           return;
1935         }
1936       break;
1937
1938     case O_dpr_hword:
1939       switch (r_type)
1940         {
1941         case BFD_RELOC_C6000_ABS_L16:
1942           new_reloc = BFD_RELOC_C6000_SBR_L16_H;
1943           break;
1944
1945         case BFD_RELOC_C6000_ABS_H16:
1946           new_reloc = BFD_RELOC_C6000_SBR_H16_H;
1947           break;
1948
1949         default:
1950           as_bad (_("$DPR_HWORD not supported in this context"));
1951           return;
1952         }
1953       break;
1954
1955     case O_dpr_word:
1956       switch (r_type)
1957         {
1958         case BFD_RELOC_C6000_ABS_L16:
1959           new_reloc = BFD_RELOC_C6000_SBR_L16_W;
1960           break;
1961
1962         case BFD_RELOC_C6000_ABS_H16:
1963           new_reloc = BFD_RELOC_C6000_SBR_H16_W;
1964           break;
1965
1966         default:
1967           as_bad (_("$DPR_WORD not supported in this context"));
1968           return;
1969         }
1970       break;
1971
1972     case O_pcr_offset:
1973       subsy = exp->X_op_symbol;
1974       switch (r_type)
1975         {
1976         case BFD_RELOC_C6000_ABS_S16:
1977         case BFD_RELOC_C6000_ABS_L16:
1978           new_reloc = BFD_RELOC_C6000_PCR_L16;
1979           break;
1980
1981         case BFD_RELOC_C6000_ABS_H16:
1982           new_reloc = BFD_RELOC_C6000_PCR_H16;
1983           break;
1984
1985         default:
1986           as_bad (_("$PCR_OFFSET not supported in this context"));
1987           return;
1988         }
1989       break;
1990
1991     case O_symbol:
1992       break;
1993
1994     default:
1995       if (pcrel)
1996         {
1997           as_bad (_("invalid PC-relative operand"));
1998           return;
1999         }
2000       break;
2001     }
2002
2003   if (new_reloc == BFD_RELOC_UNUSED)
2004     fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
2005   else
2006     fix = fix_new (frag, where, size, exp->X_add_symbol, exp->X_add_number,
2007                    pcrel, new_reloc);
2008   fix->tc_fix_data.fix_subsy = subsy;
2009   fix->tc_fix_data.fix_adda = fix_adda;
2010 }
2011
2012 /* Generate a fix for a constant (.word etc.).  Needed to ensure these
2013    go through the error checking in tic6x_fix_new_exp.  */
2014
2015 void
2016 tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp)
2017 {
2018   bfd_reloc_code_real_type r_type;
2019
2020   switch (size)
2021     {
2022     case 1:
2023       r_type = BFD_RELOC_8;
2024       break;
2025
2026     case 2:
2027       r_type = BFD_RELOC_16;
2028       break;
2029
2030     case 4:
2031       r_type = BFD_RELOC_32;
2032       break;
2033
2034     default:
2035       as_bad (_("no %d-byte relocations available"), size);
2036       return;
2037     }
2038
2039   tic6x_fix_new_exp (frag, where, size, exp, 0, r_type, FALSE);
2040 }
2041
2042 /* Initialize target-specific fix data.  */
2043
2044 void
2045 tic6x_init_fix_data (fixS *fixP)
2046 {
2047   fixP->tc_fix_data.fix_adda = FALSE;
2048   fixP->tc_fix_data.fix_subsy = NULL;
2049 }
2050
2051 /* Return true if the fix can be handled by GAS, false if it must
2052    be passed through to the linker.  */
2053
2054 bfd_boolean
2055 tic6x_fix_adjustable (fixS *fixP)
2056 {
2057   switch (fixP->fx_r_type)
2058     {
2059       /* Adjust_reloc_syms doesn't know about the GOT.  */
2060     case BFD_RELOC_C6000_SBR_GOT_U15_W:
2061     case BFD_RELOC_C6000_SBR_GOT_H16_W:
2062     case BFD_RELOC_C6000_SBR_GOT_L16_W:
2063     case BFD_RELOC_C6000_EHTYPE:
2064       return 0;
2065
2066     case BFD_RELOC_C6000_PREL31:
2067       return 0;
2068
2069     case BFD_RELOC_C6000_PCR_H16:
2070     case BFD_RELOC_C6000_PCR_L16:
2071       return 0;
2072       
2073     default:
2074       return 1;
2075     }
2076 }
2077
2078 /* Given the fine-grained form of an operand, return the coarse
2079    (bit-mask) form.  */
2080
2081 static unsigned int
2082 tic6x_coarse_operand_form (tic6x_operand_form form)
2083 {
2084   switch (form)
2085     {
2086     case tic6x_operand_asm_const:
2087     case tic6x_operand_link_const:
2088       return TIC6X_OP_EXP;
2089
2090     case tic6x_operand_reg:
2091     case tic6x_operand_xreg:
2092     case tic6x_operand_dreg:
2093     case tic6x_operand_areg:
2094     case tic6x_operand_retreg:
2095       return TIC6X_OP_REG;
2096
2097     case tic6x_operand_regpair:
2098     case tic6x_operand_xregpair:
2099     case tic6x_operand_dregpair:
2100       return TIC6X_OP_REGPAIR;
2101
2102     case tic6x_operand_irp:
2103       return TIC6X_OP_IRP;
2104
2105     case tic6x_operand_nrp:
2106       return TIC6X_OP_NRP;
2107
2108     case tic6x_operand_ctrl:
2109       return TIC6X_OP_CTRL;
2110
2111     case tic6x_operand_mem_short:
2112     case tic6x_operand_mem_long:
2113     case tic6x_operand_mem_deref:
2114       return TIC6X_OP_MEM_NOUNREG;
2115
2116     case tic6x_operand_mem_ndw:
2117       return TIC6X_OP_MEM_UNREG;
2118
2119     case tic6x_operand_func_unit:
2120       return TIC6X_OP_FUNC_UNIT;
2121
2122     default:
2123       abort ();
2124     }
2125 }
2126
2127 /* How an operand may match or not match a desired form.  If different
2128    instruction alternatives fail in different ways, the first failure
2129    in this list determines the diagnostic.  */
2130 typedef enum
2131   {
2132     /* Matches.  */
2133     tic6x_match_matches,
2134     /* Bad coarse form.  */
2135     tic6x_match_coarse,
2136     /* Not constant.  */
2137     tic6x_match_non_const,
2138     /* Register on wrong side.  */
2139     tic6x_match_wrong_side,
2140     /* Not a valid address register.  */
2141     tic6x_match_bad_address,
2142     /* Not a valid return address register.  */
2143     tic6x_match_bad_return,
2144     /* Control register not readable.  */
2145     tic6x_match_ctrl_write_only,
2146     /* Control register not writable.  */
2147     tic6x_match_ctrl_read_only,
2148     /* Not a valid memory reference for this instruction.  */
2149     tic6x_match_bad_mem
2150   } tic6x_operand_match;
2151
2152 /* Return whether an operand matches the given fine-grained form and
2153    read/write usage, and, if it does not match, how it fails to match.
2154    The main functional unit side is SIDE; the cross-path side is CROSS
2155    (the same as SIDE if a cross path not used); the data side is
2156    DATA_SIDE.  */
2157 static tic6x_operand_match
2158 tic6x_operand_matches_form (const tic6x_operand *op, tic6x_operand_form form,
2159                             tic6x_rw rw, unsigned int side, unsigned int cross,
2160                             unsigned int data_side)
2161 {
2162   unsigned int coarse = tic6x_coarse_operand_form (form);
2163
2164   if (coarse != op->form)
2165     return tic6x_match_coarse;
2166
2167   switch (form)
2168     {
2169     case tic6x_operand_asm_const:
2170       if (op->value.exp.X_op == O_constant)
2171         return tic6x_match_matches;
2172       else
2173         return tic6x_match_non_const;
2174
2175     case tic6x_operand_link_const:
2176     case tic6x_operand_irp:
2177     case tic6x_operand_nrp:
2178     case tic6x_operand_func_unit:
2179       /* All expressions are link-time constants, although there may
2180          not be relocations to express them in the output file.  "irp"
2181          and "nrp" are unique operand values.  All parsed functional
2182          unit names are valid.  */
2183       return tic6x_match_matches;
2184
2185     case tic6x_operand_reg:
2186     case tic6x_operand_regpair:
2187       if (op->value.reg.side == side)
2188         return tic6x_match_matches;
2189       else
2190         return tic6x_match_wrong_side;
2191
2192     case tic6x_operand_xreg:
2193     case tic6x_operand_xregpair:
2194       if (op->value.reg.side == cross)
2195         return tic6x_match_matches;
2196       else
2197         return tic6x_match_wrong_side;
2198
2199     case tic6x_operand_dreg:
2200     case tic6x_operand_dregpair:
2201       if (op->value.reg.side == data_side)
2202         return tic6x_match_matches;
2203       else
2204         return tic6x_match_wrong_side;
2205
2206     case tic6x_operand_areg:
2207       if (op->value.reg.side != cross)
2208         return tic6x_match_wrong_side;
2209       else if (op->value.reg.side == 2
2210                && (op->value.reg.num == 14 || op->value.reg.num == 15))
2211         return tic6x_match_matches;
2212       else
2213         return tic6x_match_bad_address;
2214
2215     case tic6x_operand_retreg:
2216       if (op->value.reg.side != side)
2217         return tic6x_match_wrong_side;
2218       else if (op->value.reg.num != 3)
2219         return tic6x_match_bad_return;
2220       else
2221         return tic6x_match_matches;
2222
2223     case tic6x_operand_ctrl:
2224       switch (rw)
2225         {
2226         case tic6x_rw_read:
2227           if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read
2228               || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2229             return tic6x_match_matches;
2230           else
2231             return tic6x_match_ctrl_write_only;
2232
2233         case tic6x_rw_write:
2234           if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_write
2235               || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2236             return tic6x_match_matches;
2237           else
2238             return tic6x_match_ctrl_read_only;
2239
2240         default:
2241           abort ();
2242         }
2243
2244     case tic6x_operand_mem_deref:
2245       if (op->value.mem.mod != tic6x_mem_mod_none)
2246         return tic6x_match_bad_mem;
2247       else if (op->value.mem.scaled != tic6x_offset_none)
2248         abort ();
2249       else if (op->value.mem.base_reg.side != side)
2250         return tic6x_match_bad_mem;
2251       else
2252         return tic6x_match_matches;
2253
2254     case tic6x_operand_mem_short:
2255     case tic6x_operand_mem_ndw:
2256       if (op->value.mem.base_reg.side != side)
2257         return tic6x_match_bad_mem;
2258       if (op->value.mem.mod == tic6x_mem_mod_none)
2259         {
2260           if (op->value.mem.scaled != tic6x_offset_none)
2261             abort ();
2262           return tic6x_match_matches;
2263         }
2264       if (op->value.mem.scaled == tic6x_offset_none)
2265         {
2266           if (op->value.mem.mod == tic6x_mem_mod_plus
2267               || op->value.mem.mod == tic6x_mem_mod_minus)
2268             abort ();
2269           return tic6x_match_matches;
2270         }
2271       if (op->value.mem.offset_is_reg)
2272         {
2273           if (op->value.mem.scaled == tic6x_offset_unscaled
2274               && form != tic6x_operand_mem_ndw)
2275             abort ();
2276           if (op->value.mem.offset.reg.side == side)
2277             return tic6x_match_matches;
2278           else
2279             return tic6x_match_bad_mem;
2280         }
2281       else
2282         {
2283           if (op->value.mem.offset.exp.X_op == O_constant)
2284             return tic6x_match_matches;
2285           else
2286             return tic6x_match_bad_mem;
2287         }
2288
2289     case tic6x_operand_mem_long:
2290       if (op->value.mem.base_reg.side == 2
2291           && (op->value.mem.base_reg.num == 14
2292               || op->value.mem.base_reg.num == 15))
2293         {
2294           switch (op->value.mem.mod)
2295             {
2296             case tic6x_mem_mod_none:
2297               if (op->value.mem.scaled != tic6x_offset_none)
2298                 abort ();
2299               return tic6x_match_matches;
2300
2301             case tic6x_mem_mod_plus:
2302               if (op->value.mem.scaled == tic6x_offset_none)
2303                 abort ();
2304               if (op->value.mem.offset_is_reg)
2305                 return tic6x_match_bad_mem;
2306               else if (op->value.mem.scaled == tic6x_offset_scaled
2307                        && op->value.mem.offset.exp.X_op != O_constant)
2308                 return tic6x_match_bad_mem;
2309               else
2310                 return tic6x_match_matches;
2311
2312             case tic6x_mem_mod_minus:
2313             case tic6x_mem_mod_preinc:
2314             case tic6x_mem_mod_predec:
2315             case tic6x_mem_mod_postinc:
2316             case tic6x_mem_mod_postdec:
2317               return tic6x_match_bad_mem;
2318
2319             default:
2320               abort ();
2321             }
2322
2323         }
2324       else
2325         return tic6x_match_bad_mem;
2326
2327     default:
2328       abort ();
2329     }
2330 }
2331
2332 /* Return the number of bits shift used with DP-relative coding method
2333    CODING.  */
2334
2335 static unsigned int
2336 tic6x_dpr_shift (tic6x_coding_method coding)
2337 {
2338   switch (coding)
2339     {
2340     case tic6x_coding_ulcst_dpr_byte:
2341       return 0;
2342
2343     case tic6x_coding_ulcst_dpr_half:
2344       return 1;
2345
2346     case tic6x_coding_ulcst_dpr_word:
2347       return 2;
2348
2349     default:
2350       abort ();
2351     }
2352 }
2353
2354 /* Return the relocation used with DP-relative coding method
2355    CODING.  */
2356
2357 static bfd_reloc_code_real_type
2358 tic6x_dpr_reloc (tic6x_coding_method coding)
2359 {
2360   switch (coding)
2361     {
2362     case tic6x_coding_ulcst_dpr_byte:
2363       return BFD_RELOC_C6000_SBR_U15_B;
2364
2365     case tic6x_coding_ulcst_dpr_half:
2366       return BFD_RELOC_C6000_SBR_U15_H;
2367
2368     case tic6x_coding_ulcst_dpr_word:
2369       return BFD_RELOC_C6000_SBR_U15_W;
2370
2371     default:
2372       abort ();
2373     }
2374 }
2375
2376 /* Given a memory reference *MEM_REF as originally parsed, fill in
2377    defaults for missing offsets.  */
2378
2379 static void
2380 tic6x_default_mem_ref (tic6x_mem_ref *mem_ref)
2381 {
2382   switch (mem_ref->mod)
2383     {
2384     case tic6x_mem_mod_none:
2385       if (mem_ref->scaled != tic6x_offset_none)
2386         abort ();
2387       mem_ref->mod = tic6x_mem_mod_plus;
2388       mem_ref->scaled = tic6x_offset_unscaled;
2389       mem_ref->offset_is_reg = FALSE;
2390       memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2391       mem_ref->offset.exp.X_op = O_constant;
2392       mem_ref->offset.exp.X_add_number = 0;
2393       mem_ref->offset.exp.X_unsigned = 0;
2394       break;
2395
2396     case tic6x_mem_mod_plus:
2397     case tic6x_mem_mod_minus:
2398       if (mem_ref->scaled == tic6x_offset_none)
2399         abort ();
2400       break;
2401
2402     case tic6x_mem_mod_preinc:
2403     case tic6x_mem_mod_predec:
2404     case tic6x_mem_mod_postinc:
2405     case tic6x_mem_mod_postdec:
2406       if (mem_ref->scaled != tic6x_offset_none)
2407         break;
2408       mem_ref->scaled = tic6x_offset_scaled;
2409       mem_ref->offset_is_reg = FALSE;
2410       memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2411       mem_ref->offset.exp.X_op = O_constant;
2412       mem_ref->offset.exp.X_add_number = 1;
2413       mem_ref->offset.exp.X_unsigned = 0;
2414       break;
2415
2416     default:
2417       abort ();
2418     }
2419 }
2420
2421 /* Return the encoding in the 8-bit field of an SPMASK or SPMASKR
2422    instruction of the specified UNIT, side SIDE.  */
2423
2424 static unsigned int
2425 tic6x_encode_spmask (tic6x_func_unit_base unit, unsigned int side)
2426 {
2427   switch (unit)
2428     {
2429     case tic6x_func_unit_l:
2430       return 1 << (side - 1);
2431
2432     case tic6x_func_unit_s:
2433       return 1 << (side + 1);
2434
2435     case tic6x_func_unit_d:
2436       return 1 << (side + 3);
2437
2438     case tic6x_func_unit_m:
2439       return 1 << (side + 5);
2440
2441     default:
2442       abort ();
2443     }
2444 }
2445
2446 /* Try to encode the instruction with opcode number ID and operands
2447    OPERANDS (number NUM_OPERANDS), creg value THIS_LINE_CREG and z
2448    value THIS_LINE_Z; FUNC_UNIT_SIDE, FUNC_UNIT_CROSS and
2449    FUNC_UNIT_DATA_SIDE describe the functional unit specification;
2450    SPLOOP_II is the ii value from the previous SPLOOP-family
2451    instruction, or 0 if not in such a loop; the only possible problems
2452    are operands being out of range (they already match the
2453    fine-grained form), and inappropriate predication.  If this
2454    succeeds, return the encoding and set *OK to TRUE; otherwise return
2455    0 and set *OK to FALSE.  If a fix is needed, set *FIX_NEEDED to
2456    true and fill in *FIX_EXP, *FIX_PCREL, *FX_R_TYPE and *FIX_ADDA.
2457    Print error messages for failure if PRINT_ERRORS is TRUE; the
2458    opcode starts at STR and has length OPC_LEN.  */
2459
2460 static unsigned int
2461 tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
2462                   unsigned int num_operands, unsigned int this_line_creg,
2463                   unsigned int this_line_z, unsigned int func_unit_side,
2464                   unsigned int func_unit_cross,
2465                   unsigned int func_unit_data_side, int sploop_ii,
2466                   expressionS **fix_exp, int *fix_pcrel,
2467                   bfd_reloc_code_real_type *fx_r_type, bfd_boolean *fix_adda,
2468                   bfd_boolean *fix_needed, bfd_boolean *ok,
2469                   bfd_boolean print_errors, char *str, int opc_len)
2470 {
2471   const tic6x_opcode *opct;
2472   const tic6x_insn_format *fmt;
2473   unsigned int opcode_value;
2474   unsigned int fld;
2475
2476   opct = &tic6x_opcode_table[id];
2477   fmt = &tic6x_insn_format_table[opct->format];
2478   opcode_value = fmt->cst_bits;
2479
2480   for (fld = 0; fld < opct->num_fixed_fields; fld++)
2481     {
2482       if (opct->fixed_fields[fld].min_val == opct->fixed_fields[fld].max_val)
2483         {
2484           const tic6x_insn_field *fldd;
2485           fldd = tic6x_field_from_fmt (fmt, opct->fixed_fields[fld].field_id);
2486           if (fldd == NULL)
2487             abort ();
2488           opcode_value |= opct->fixed_fields[fld].min_val << fldd->low_pos;
2489         }
2490     }
2491
2492   for (fld = 0; fld < opct->num_variable_fields; fld++)
2493     {
2494       const tic6x_insn_field *fldd;
2495       unsigned int value;
2496       unsigned int opno;
2497       unsigned int ffld;
2498       offsetT sign_value;
2499       unsigned int bits;
2500       unsigned int fcyc_bits;
2501       expressionS *expp;
2502       expressionS ucexp;
2503       tic6x_mem_ref mem;
2504
2505       fldd = tic6x_field_from_fmt (fmt, opct->variable_fields[fld].field_id);
2506       if (fldd == NULL)
2507         abort ();
2508       opno = opct->variable_fields[fld].operand_num;
2509       switch (opct->variable_fields[fld].coding_method)
2510         {
2511         case tic6x_coding_ucst:
2512           if (operands[opno].form != TIC6X_OP_EXP)
2513             abort ();
2514           if (operands[opno].value.exp.X_op != O_constant)
2515             abort ();
2516           ucexp = operands[opno].value.exp;
2517         unsigned_constant:
2518           if (ucexp.X_add_number < 0
2519               || ucexp.X_add_number >= (1 << fldd->width))
2520             {
2521               if (print_errors)
2522                 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2523                         opc_len, str);
2524               *ok = FALSE;
2525               return 0;
2526             }
2527           value = ucexp.X_add_number;
2528           break;
2529
2530         case tic6x_coding_scst:
2531           if (operands[opno].form != TIC6X_OP_EXP)
2532             abort ();
2533           if (operands[opno].value.exp.X_op != O_constant)
2534             {
2535               value = 0;
2536               /* Opcode table should not permit non-constants without
2537                  a known relocation for them.  */
2538               if (fldd->low_pos != 7 || fldd->width != 16)
2539                 abort ();
2540               *fix_needed = TRUE;
2541               *fix_exp = &operands[opno].value.exp;
2542               *fix_pcrel = 0;
2543               *fx_r_type = BFD_RELOC_C6000_ABS_S16;
2544               *fix_adda = FALSE;
2545               break;
2546             }
2547           sign_value = SEXT (operands[opno].value.exp.X_add_number);
2548         signed_constant:
2549           if (sign_value < -(1 << (fldd->width - 1))
2550               || (sign_value >= (1 << (fldd->width - 1))))
2551             {
2552               if (print_errors)
2553                 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2554                         opc_len, str);
2555               *ok = FALSE;
2556               return 0;
2557             }
2558           value = sign_value + (1 << (fldd->width - 1));
2559           value ^= (1 << (fldd->width - 1));
2560           break;
2561
2562         case tic6x_coding_ucst_minus_one:
2563           if (operands[opno].form != TIC6X_OP_EXP)
2564             abort ();
2565           if (operands[opno].value.exp.X_op != O_constant)
2566             abort ();
2567           if (operands[opno].value.exp.X_add_number <= 0
2568               || operands[opno].value.exp.X_add_number > (1 << fldd->width))
2569             {
2570               if (print_errors)
2571                 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2572                         opc_len, str);
2573               *ok = FALSE;
2574               return 0;
2575             }
2576           value = operands[opno].value.exp.X_add_number - 1;
2577           break;
2578
2579         case tic6x_coding_scst_negate:
2580           if (operands[opno].form != TIC6X_OP_EXP)
2581             abort ();
2582           if (operands[opno].value.exp.X_op != O_constant)
2583             abort ();
2584           sign_value = SEXT (-operands[opno].value.exp.X_add_number);
2585           goto signed_constant;
2586
2587         case tic6x_coding_ulcst_dpr_byte:
2588         case tic6x_coding_ulcst_dpr_half:
2589         case tic6x_coding_ulcst_dpr_word:
2590           bits = tic6x_dpr_shift (opct->variable_fields[fld].coding_method);
2591           switch (operands[opno].form)
2592             {
2593             case TIC6X_OP_EXP:
2594               if (operands[opno].value.exp.X_op == O_constant)
2595                 {
2596                   ucexp = operands[opno].value.exp;
2597                   goto unsigned_constant;
2598                 }
2599               expp = &operands[opno].value.exp;
2600               break;
2601
2602             case TIC6X_OP_MEM_NOUNREG:
2603               mem = operands[opno].value.mem;
2604               tic6x_default_mem_ref (&mem);
2605               if (mem.offset_is_reg)
2606                 abort ();
2607               if (mem.offset.exp.X_op == O_constant)
2608                 {
2609                   ucexp = mem.offset.exp;
2610                   if (mem.scaled == tic6x_offset_unscaled)
2611                     {
2612                       if (ucexp.X_add_number & ((1 << bits) - 1))
2613                         {
2614                           if (print_errors)
2615                             as_bad (_("offset in operand %u of '%.*s' not "
2616                                       "divisible by %u"), opno + 1, opc_len,
2617                                     str, 1u << bits);
2618                           *ok = FALSE;
2619                           return 0;
2620                         }
2621                       ucexp.X_add_number >>= bits;
2622                     }
2623                   goto unsigned_constant;
2624                 }
2625               if (mem.scaled != tic6x_offset_unscaled)
2626                 abort ();
2627               if (operands[opno].value.mem.mod == tic6x_mem_mod_none
2628                   || operands[opno].value.mem.scaled != tic6x_offset_unscaled
2629                   || operands[opno].value.mem.offset_is_reg)
2630                 abort ();
2631               expp = &operands[opno].value.mem.offset.exp;
2632               break;
2633
2634             default:
2635               abort ();
2636             }
2637           value = 0;
2638           /* Opcode table should not use this encoding without a known
2639              relocation.  */
2640           if (fldd->low_pos != 8 || fldd->width != 15)
2641             abort ();
2642           /* We do not check for offset divisibility here; such a
2643              check is not needed at this point to encode the value,
2644              and if there is eventually a problem it will be detected
2645              either in md_apply_fix or at link time.  */
2646           *fix_needed = TRUE;
2647           *fix_exp = expp;
2648           *fix_pcrel = 0;
2649           *fx_r_type
2650             = tic6x_dpr_reloc (opct->variable_fields[fld].coding_method);
2651           if (operands[opno].form == TIC6X_OP_EXP)
2652             *fix_adda = TRUE;
2653           else
2654             *fix_adda = FALSE;
2655           break;
2656
2657         case tic6x_coding_lcst_low16:
2658           if (operands[opno].form != TIC6X_OP_EXP)
2659             abort ();
2660           if (operands[opno].value.exp.X_op == O_constant)
2661             value = operands[opno].value.exp.X_add_number & 0xffff;
2662           else
2663             {
2664               value = 0;
2665               /* Opcode table should not use this encoding without a
2666                  known relocation.  */
2667               if (fldd->low_pos != 7 || fldd->width != 16)
2668                 abort ();
2669               *fix_needed = TRUE;
2670               *fix_exp = &operands[opno].value.exp;
2671               *fix_pcrel = 0;
2672               *fx_r_type = BFD_RELOC_C6000_ABS_L16;
2673               *fix_adda = FALSE;
2674             }
2675           break;
2676
2677         case tic6x_coding_lcst_high16:
2678           if (operands[opno].form != TIC6X_OP_EXP)
2679             abort ();
2680           if (operands[opno].value.exp.X_op == O_constant)
2681             value = (operands[opno].value.exp.X_add_number >> 16) & 0xffff;
2682           else
2683             {
2684               value = 0;
2685               /* Opcode table should not use this encoding without a
2686                  known relocation.  */
2687               if (fldd->low_pos != 7 || fldd->width != 16)
2688                 abort ();
2689               *fix_needed = TRUE;
2690               *fix_exp = &operands[opno].value.exp;
2691               *fix_pcrel = 0;
2692               *fx_r_type = BFD_RELOC_C6000_ABS_H16;
2693               *fix_adda = FALSE;
2694             }
2695           break;
2696
2697         case tic6x_coding_pcrel:
2698         case tic6x_coding_pcrel_half:
2699           if (operands[opno].form != TIC6X_OP_EXP)
2700             abort ();
2701           value = 0;
2702           *fix_needed = TRUE;
2703           *fix_exp = &operands[opno].value.exp;
2704           *fix_pcrel = 1;
2705           if (fldd->low_pos == 7 && fldd->width == 21)
2706             *fx_r_type = BFD_RELOC_C6000_PCR_S21;
2707           else if (fldd->low_pos == 16 && fldd->width == 12)
2708             *fx_r_type = BFD_RELOC_C6000_PCR_S12;
2709           else if (fldd->low_pos == 13 && fldd->width == 10)
2710             *fx_r_type = BFD_RELOC_C6000_PCR_S10;
2711           else if (fldd->low_pos == 16 && fldd->width == 7)
2712             *fx_r_type = BFD_RELOC_C6000_PCR_S7;
2713           else
2714             /* Opcode table should not use this encoding without a
2715                known relocation.  */
2716             abort ();
2717           *fix_adda = FALSE;
2718           break;
2719
2720         case tic6x_coding_reg:
2721           switch (operands[opno].form)
2722             {
2723             case TIC6X_OP_REG:
2724             case TIC6X_OP_REGPAIR:
2725               value = operands[opno].value.reg.num;
2726               break;
2727
2728             case TIC6X_OP_MEM_NOUNREG:
2729             case TIC6X_OP_MEM_UNREG:
2730               value = operands[opno].value.mem.base_reg.num;
2731               break;
2732
2733             default:
2734               abort ();
2735             }
2736           break;
2737
2738         case tic6x_coding_areg:
2739           switch (operands[opno].form)
2740             {
2741             case TIC6X_OP_REG:
2742               value = (operands[opno].value.reg.num == 15 ? 1 : 0);
2743               break;
2744
2745             case TIC6X_OP_MEM_NOUNREG:
2746               value = (operands[opno].value.mem.base_reg.num == 15 ? 1 : 0);
2747               break;
2748
2749             default:
2750               abort ();
2751             }
2752           break;
2753
2754         case tic6x_coding_crlo:
2755           if (operands[opno].form != TIC6X_OP_CTRL)
2756             abort ();
2757           value = tic6x_ctrl_table[operands[opno].value.ctrl].crlo;
2758           break;
2759
2760         case tic6x_coding_crhi:
2761           if (operands[opno].form != TIC6X_OP_CTRL)
2762             abort ();
2763           value = 0;
2764           break;
2765
2766         case tic6x_coding_reg_shift:
2767           if (operands[opno].form != TIC6X_OP_REGPAIR)
2768             abort ();
2769           value = operands[opno].value.reg.num >> 1;
2770           break;
2771
2772         case tic6x_coding_mem_offset:
2773           if (operands[opno].form != TIC6X_OP_MEM_NOUNREG)
2774             abort ();
2775           mem = operands[opno].value.mem;
2776           tic6x_default_mem_ref (&mem);
2777           if (mem.offset_is_reg)
2778             {
2779               if (mem.scaled != tic6x_offset_scaled)
2780                 abort ();
2781               value = mem.offset.reg.num;
2782             }
2783           else
2784             {
2785               int scale;
2786
2787               if (mem.offset.exp.X_op != O_constant)
2788                 abort ();
2789               switch (mem.scaled)
2790                 {
2791                 case tic6x_offset_scaled:
2792                   scale = 1;
2793                   break;
2794
2795                 case tic6x_offset_unscaled:
2796                   scale = opct->operand_info[opno].size;
2797                   if (scale != 1 && scale != 2 && scale != 4 && scale != 8)
2798                     abort ();
2799                   break;
2800
2801                 default:
2802                   abort ();
2803                 }
2804               if (mem.offset.exp.X_add_number < 0
2805                   || mem.offset.exp.X_add_number >= (1 << fldd->width) * scale)
2806                 {
2807                   if (print_errors)
2808                     as_bad (_("offset in operand %u of '%.*s' out of range"),
2809                             opno + 1, opc_len, str);
2810                   *ok = FALSE;
2811                   return 0;
2812                 }
2813               if (mem.offset.exp.X_add_number % scale)
2814                 {
2815                   if (print_errors)
2816                     as_bad (_("offset in operand %u of '%.*s' not "
2817                               "divisible by %u"),
2818                             opno + 1, opc_len, str, scale);
2819                   *ok = FALSE;
2820                   return 0;
2821                 }
2822               value = mem.offset.exp.X_add_number / scale;
2823             }
2824           break;
2825
2826         case tic6x_coding_mem_offset_noscale:
2827           if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2828             abort ();
2829           mem = operands[opno].value.mem;
2830           tic6x_default_mem_ref (&mem);
2831           if (mem.offset_is_reg)
2832             value = mem.offset.reg.num;
2833           else
2834             {
2835               if (mem.offset.exp.X_op != O_constant)
2836                 abort ();
2837               if (mem.offset.exp.X_add_number < 0
2838                   || mem.offset.exp.X_add_number >= (1 << fldd->width))
2839                 {
2840                   if (print_errors)
2841                     as_bad (_("offset in operand %u of '%.*s' out of range"),
2842                             opno + 1, opc_len, str);
2843                   *ok = FALSE;
2844                   return 0;
2845                 }
2846               value = mem.offset.exp.X_add_number;
2847             }
2848           break;
2849
2850         case tic6x_coding_mem_mode:
2851           if (operands[opno].form != TIC6X_OP_MEM_NOUNREG
2852               && operands[opno].form != TIC6X_OP_MEM_UNREG)
2853             abort ();
2854           mem = operands[opno].value.mem;
2855           tic6x_default_mem_ref (&mem);
2856           switch (mem.mod)
2857             {
2858             case tic6x_mem_mod_plus:
2859               value = 1;
2860               break;
2861
2862             case tic6x_mem_mod_minus:
2863               value = 0;
2864               break;
2865
2866             case tic6x_mem_mod_preinc:
2867               value = 9;
2868               break;
2869
2870             case tic6x_mem_mod_predec:
2871               value = 8;
2872               break;
2873
2874             case tic6x_mem_mod_postinc:
2875               value = 11;
2876               break;
2877
2878             case tic6x_mem_mod_postdec:
2879               value = 10;
2880               break;
2881
2882             default:
2883               abort ();
2884             }
2885           value += (mem.offset_is_reg ? 4 : 0);
2886           break;
2887
2888         case tic6x_coding_scaled:
2889           if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2890             abort ();
2891           mem = operands[opno].value.mem;
2892           tic6x_default_mem_ref (&mem);
2893           switch (mem.scaled)
2894             {
2895             case tic6x_offset_unscaled:
2896               value = 0;
2897               break;
2898
2899             case tic6x_offset_scaled:
2900               value = 1;
2901               break;
2902
2903             default:
2904               abort ();
2905             }
2906           break;
2907
2908         case tic6x_coding_spmask:
2909           /* The position of such a field is hardcoded in the handling
2910              of "||^".  */
2911           if (fldd->low_pos != 18)
2912             abort ();
2913           value = 0;
2914           for (opno = 0; opno < num_operands; opno++)
2915             {
2916               unsigned int v;
2917
2918               v = tic6x_encode_spmask (operands[opno].value.func_unit.base,
2919                                        operands[opno].value.func_unit.side);
2920               if (value & v)
2921                 {
2922                   if (print_errors)
2923                     as_bad (_("functional unit already masked for operand "
2924                               "%u of '%.*s'"), opno + 1, opc_len, str);
2925                   *ok = FALSE;
2926                   return 0;
2927                 }
2928               value |= v;
2929             }
2930           break;
2931
2932         case tic6x_coding_reg_unused:
2933           /* This is a placeholder; correct handling goes along with
2934              resource constraint checks.  */
2935           value = 0;
2936           break;
2937
2938         case tic6x_coding_fstg:
2939         case tic6x_coding_fcyc:
2940           if (operands[opno].form != TIC6X_OP_EXP)
2941             abort ();
2942           if (operands[opno].value.exp.X_op != O_constant)
2943             abort ();
2944           if (!sploop_ii)
2945             {
2946               if (print_errors)
2947                 as_bad (_("'%.*s' instruction not in a software "
2948                           "pipelined loop"),
2949                         opc_len, str);
2950               *ok = FALSE;
2951               return 0;
2952             }
2953
2954           if (sploop_ii <= 1)
2955             fcyc_bits = 0;
2956           else if (sploop_ii <= 2)
2957             fcyc_bits = 1;
2958           else if (sploop_ii <= 4)
2959             fcyc_bits = 2;
2960           else if (sploop_ii <= 8)
2961             fcyc_bits = 3;
2962           else if (sploop_ii <= 14)
2963             fcyc_bits = 4;
2964           else
2965             abort ();
2966           if (fcyc_bits > fldd->width)
2967             abort ();
2968
2969           if (opct->variable_fields[fld].coding_method == tic6x_coding_fstg)
2970             {
2971               int i, t;
2972               if (operands[opno].value.exp.X_add_number < 0
2973                   || (operands[opno].value.exp.X_add_number
2974                       >= (1 << (fldd->width - fcyc_bits))))
2975                 {
2976                   if (print_errors)
2977                     as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2978                             opc_len, str);
2979                   *ok = FALSE;
2980                   return 0;
2981                 }
2982               value = operands[opno].value.exp.X_add_number;
2983               for (t = 0, i = fcyc_bits; i < fldd->width; i++)
2984                 {
2985                   t = (t << 1) | (value & 1);
2986                   value >>= 1;
2987                 }
2988               value = t << fcyc_bits;
2989             }
2990           else
2991             {
2992               if (operands[opno].value.exp.X_add_number < 0
2993                   || (operands[opno].value.exp.X_add_number >= sploop_ii))
2994                 {
2995                   if (print_errors)
2996                     as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2997                             opc_len, str);
2998                   *ok = FALSE;
2999                   return 0;
3000                 }
3001               value = operands[opno].value.exp.X_add_number;
3002             }
3003           break;
3004
3005         case tic6x_coding_fu:
3006           value = func_unit_side == 2 ? 1 : 0;
3007           break;
3008
3009         case tic6x_coding_data_fu:
3010           value = func_unit_data_side == 2 ? 1 : 0;
3011           break;
3012
3013         case tic6x_coding_xpath:
3014           value = func_unit_cross;
3015           break;
3016
3017         default:
3018           abort ();
3019         }
3020
3021       for (ffld = 0; ffld < opct->num_fixed_fields; ffld++)
3022         if ((opct->fixed_fields[ffld].field_id
3023              == opct->variable_fields[fld].field_id)
3024             && (value < opct->fixed_fields[ffld].min_val
3025                 || value > opct->fixed_fields[ffld].max_val))
3026           {
3027             if (print_errors)
3028               as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
3029                       opc_len, str);
3030             *ok = FALSE;
3031             return 0;
3032           }
3033
3034       opcode_value |= value << fldd->low_pos;
3035     }
3036
3037   if (this_line_creg)
3038     {
3039       const tic6x_insn_field *creg;
3040       const tic6x_insn_field *z;
3041
3042       creg = tic6x_field_from_fmt (fmt, tic6x_field_creg);
3043       if (creg == NULL)
3044         {
3045           if (print_errors)
3046             as_bad (_("instruction '%.*s' cannot be predicated"),
3047                     opc_len, str);
3048           *ok = FALSE;
3049           return 0;
3050         }
3051       z = tic6x_field_from_fmt (fmt, tic6x_field_z);
3052       /* If there is a creg field, there must be a z field; otherwise
3053          there is an error in the format table.  */
3054       if (z == NULL)
3055         abort ();
3056
3057       opcode_value |= this_line_creg << creg->low_pos;
3058       opcode_value |= this_line_z << z->low_pos;
3059     }
3060
3061   *ok = TRUE;
3062   return opcode_value;
3063 }
3064
3065 /* Convert the target integer stored in N bytes in BUF to a host
3066    integer, returning that value.  */
3067
3068 static valueT
3069 md_chars_to_number (char *buf, int n)
3070 {
3071   valueT result = 0;
3072   unsigned char *p = (unsigned char *) buf;
3073
3074   if (target_big_endian)
3075     {
3076       while (n--)
3077         {
3078           result <<= 8;
3079           result |= (*p++ & 0xff);
3080         }
3081     }
3082   else
3083     {
3084       while (n--)
3085         {
3086           result <<= 8;
3087           result |= (p[n] & 0xff);
3088         }
3089     }
3090
3091   return result;
3092 }
3093
3094 /* Assemble the instruction starting at STR (an opcode, with the
3095    opcode name all-lowercase).  */
3096
3097 void
3098 md_assemble (char *str)
3099 {
3100   char *p;
3101   int opc_len;
3102   bfd_boolean this_line_parallel;
3103   bfd_boolean this_line_spmask;
3104   unsigned int this_line_creg;
3105   unsigned int this_line_z;
3106   tic6x_label_list *this_insn_label_list;
3107   segment_info_type *seginfo;
3108   tic6x_opcode_list *opc_list, *opc;
3109   tic6x_func_unit_base func_unit_base = tic6x_func_unit_nfu;
3110   unsigned int func_unit_side = 0;
3111   unsigned int func_unit_cross = 0;
3112   unsigned int cross_side = 0;
3113   unsigned int func_unit_data_side = 0;
3114   unsigned int max_matching_opcodes, num_matching_opcodes;
3115   tic6x_opcode_id *opcm = NULL;
3116   unsigned int opc_rank[TIC6X_NUM_PREFER];
3117   const tic6x_opcode *opct = NULL;
3118   int min_rank, try_rank, max_rank;
3119   bfd_boolean num_operands_permitted[TIC6X_MAX_SOURCE_OPERANDS + 1]
3120     = { FALSE };
3121   unsigned int operand_forms[TIC6X_MAX_SOURCE_OPERANDS] = { 0 };
3122   tic6x_operand operands[TIC6X_MAX_SOURCE_OPERANDS];
3123   unsigned int max_num_operands;
3124   unsigned int num_operands_read;
3125   bfd_boolean ok_this_arch, ok_this_fu, ok_this_arch_fu;
3126   bfd_boolean bad_operands = FALSE;
3127   unsigned int opcode_value;
3128   bfd_boolean encoded_ok;
3129   bfd_boolean fix_needed = FALSE;
3130   expressionS *fix_exp = NULL;
3131   int fix_pcrel = 0;
3132   bfd_reloc_code_real_type fx_r_type = BFD_RELOC_UNUSED;
3133   bfd_boolean fix_adda = FALSE;
3134   fragS *insn_frag;
3135   char *output;
3136
3137   p = str;
3138   while (*p && !is_end_of_line[(unsigned char) *p] && *p != ' ')
3139     p++;
3140
3141   /* This function should only have been called when there is actually
3142      an instruction to assemble.  */
3143   if (p == str)
3144     abort ();
3145
3146   /* Now an instruction has been seen, architecture attributes from
3147      .arch directives merge with rather than overriding the previous
3148      value.  */
3149   tic6x_seen_insns = TRUE;
3150   /* If no .arch directives or -march options have been seen, we are
3151      assessing instruction validity based on the C674X default, so set
3152      the attribute accordingly.  */
3153   if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
3154     tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
3155
3156   /* Reset global settings for parallel bars and predicates now to
3157      avoid extra errors if there are problems with this opcode.  */
3158   this_line_parallel = tic6x_line_parallel;
3159   this_line_spmask = tic6x_line_spmask;
3160   this_line_creg = tic6x_line_creg;
3161   this_line_z = tic6x_line_z;
3162   tic6x_line_parallel = FALSE;
3163   tic6x_line_spmask = FALSE;
3164   tic6x_line_creg = 0;
3165   tic6x_line_z = 0;
3166   seginfo = seg_info (now_seg);
3167   this_insn_label_list = seginfo->tc_segment_info_data.label_list;
3168   seginfo->tc_segment_info_data.label_list = NULL;
3169
3170   opc_list = hash_find_n (opcode_hash, str, p - str);
3171   if (opc_list == NULL)
3172     {
3173       char c = *p;
3174       *p = 0;
3175       as_bad (_("unknown opcode '%s'"), str);
3176       *p = c;
3177       return;
3178     }
3179
3180   opc_len = p - str;
3181   skip_whitespace (p);
3182
3183   /* See if there is something that looks like a functional unit
3184      specifier.  */
3185   if (*p == '.')
3186     {
3187       bfd_boolean good_func_unit;
3188       tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
3189       unsigned int maybe_side = 0;
3190       unsigned int maybe_cross = 0;
3191       unsigned int maybe_data_side = 0;
3192
3193       good_func_unit = tic6x_parse_func_unit_base (p + 1, &maybe_base,
3194                                                    &maybe_side);
3195
3196       if (good_func_unit)
3197         {
3198           if (p[3] == ' ' || is_end_of_line[(unsigned char) p[3]])
3199             p += 3;
3200           else if ((p[3] == 'x' || p[3] == 'X')
3201                    && (p[4] == ' ' || is_end_of_line[(unsigned char) p[4]]))
3202             {
3203               maybe_cross = 1;
3204               p += 4;
3205             }
3206           else if (maybe_base == tic6x_func_unit_d
3207                    && (p[3] == 't' || p[3] == 'T')
3208                    && (p[4] == '1' || p[4] == '2')
3209                    && (p[5] == ' ' || is_end_of_line[(unsigned char) p[5]]))
3210             {
3211               maybe_data_side = p[4] - '0';
3212               p += 5;
3213             }
3214           else
3215             good_func_unit = FALSE;
3216         }
3217
3218       if (good_func_unit)
3219         {
3220           func_unit_base = maybe_base;
3221           func_unit_side = maybe_side;
3222           func_unit_cross = maybe_cross;
3223           cross_side = (func_unit_cross ? 3 - func_unit_side : func_unit_side);
3224           func_unit_data_side = maybe_data_side;
3225         }
3226
3227       skip_whitespace (p);
3228     }
3229
3230   /* Determine which entries in the opcode table match, and the
3231      associated permitted forms of operands.  */
3232   max_matching_opcodes = 0;
3233   for (opc = opc_list; opc; opc = opc->next)
3234     max_matching_opcodes++;
3235   num_matching_opcodes = 0;
3236   opcm = xmalloc (max_matching_opcodes * sizeof (*opcm));
3237   max_num_operands = 0;
3238   ok_this_arch = FALSE;
3239   ok_this_fu = FALSE;
3240   ok_this_arch_fu = FALSE;
3241   for (opc = opc_list; opc; opc = opc->next)
3242     {
3243       unsigned int num_operands;
3244       unsigned int i;
3245       bfd_boolean this_opc_arch_ok = TRUE;
3246       bfd_boolean this_opc_fu_ok = TRUE;
3247
3248       if (tic6x_insn_format_table[tic6x_opcode_table[opc->id].format].num_bits
3249           != 32)
3250         continue;
3251       if (!(tic6x_opcode_table[opc->id].isa_variants & tic6x_features))
3252         this_opc_arch_ok = FALSE;
3253       if (tic6x_opcode_table[opc->id].func_unit != func_unit_base)
3254         this_opc_fu_ok = FALSE;
3255       if (func_unit_side == 1
3256           && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_B_ONLY))
3257         this_opc_fu_ok = FALSE;
3258       if (func_unit_cross
3259           && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_NO_CROSS))
3260         this_opc_fu_ok = FALSE;
3261       if (!func_unit_data_side
3262           && (tic6x_opcode_table[opc->id].flags
3263               & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3264         this_opc_fu_ok = FALSE;
3265       if (func_unit_data_side
3266           && !(tic6x_opcode_table[opc->id].flags
3267                & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3268         this_opc_fu_ok = FALSE;
3269       if (func_unit_data_side == 1
3270           && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_T2_ONLY))
3271         this_opc_fu_ok = FALSE;
3272       if (this_opc_arch_ok)
3273         ok_this_arch = TRUE;
3274       if (this_opc_fu_ok)
3275         ok_this_fu = TRUE;
3276       if (!this_opc_arch_ok || !this_opc_fu_ok)
3277         continue;
3278       ok_this_arch_fu = TRUE;
3279       opcm[num_matching_opcodes] = opc->id;
3280       num_matching_opcodes++;
3281       num_operands = tic6x_opcode_table[opc->id].num_operands;
3282
3283       if (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SPMASK)
3284         {
3285           if (num_operands != 1
3286               || (tic6x_opcode_table[opc->id].operand_info[0].form
3287                   != tic6x_operand_func_unit))
3288             abort ();
3289           num_operands = 8;
3290           for (i = 0; i < num_operands; i++)
3291             {
3292               operand_forms[i]
3293                 |= tic6x_coarse_operand_form (tic6x_operand_func_unit);
3294               num_operands_permitted[i] = TRUE;
3295             }
3296         }
3297       else
3298         {
3299           for (i = 0; i < num_operands; i++)
3300             {
3301               tic6x_operand_form f
3302                 = tic6x_opcode_table[opc->id].operand_info[i].form;
3303
3304               operand_forms[i] |= tic6x_coarse_operand_form (f);
3305             }
3306         }
3307       num_operands_permitted[num_operands] = TRUE;
3308       if (num_operands > max_num_operands)
3309         max_num_operands = num_operands;
3310     }
3311
3312   if (!ok_this_arch)
3313     {
3314       as_bad (_("'%.*s' instruction not supported on this architecture"),
3315               opc_len, str);
3316       free (opcm);
3317       return;
3318     }
3319
3320   if (!ok_this_fu)
3321     {
3322       as_bad (_("'%.*s' instruction not supported on this functional unit"),
3323               opc_len, str);
3324       free (opcm);
3325       return;
3326     }
3327
3328   if (!ok_this_arch_fu)
3329     {
3330       as_bad (_("'%.*s' instruction not supported on this functional unit"
3331                 " for this architecture"),
3332               opc_len, str);
3333       free (opcm);
3334       return;
3335     }
3336
3337   /* If there were no instructions matching the above availability
3338      checks, we should now have given an error and returned.  */
3339   if (num_matching_opcodes == 0)
3340     abort ();
3341
3342   num_operands_read = 0;
3343   while (TRUE)
3344     {
3345       skip_whitespace (p);
3346       if (is_end_of_line[(unsigned char) *p])
3347         {
3348           if (num_operands_read > 0)
3349             {
3350               as_bad (_("missing operand after comma"));
3351               bad_operands = TRUE;
3352             }
3353           break;
3354         }
3355
3356       if (max_num_operands == 0)
3357         {
3358           as_bad (_("too many operands to '%.*s'"), opc_len, str);
3359           bad_operands = TRUE;
3360           break;
3361         }
3362
3363       if (!tic6x_parse_operand (&p, &operands[num_operands_read],
3364                                 operand_forms[num_operands_read], str, opc_len,
3365                                 num_operands_read + 1))
3366         bad_operands = TRUE;
3367       num_operands_read++;
3368
3369       if (is_end_of_line[(unsigned char) *p])
3370         break;
3371       else if (*p == ',')
3372         {
3373           p++;
3374           if (num_operands_read == max_num_operands)
3375             {
3376               as_bad (_("too many operands to '%.*s'"), opc_len, str);
3377               bad_operands = TRUE;
3378               break;
3379             }
3380           continue;
3381         }
3382       else
3383         /* Operand parsing should consume whole operands.  */
3384         abort ();
3385     }
3386
3387   if (!bad_operands && !num_operands_permitted[num_operands_read])
3388     {
3389       as_bad (_("bad number of operands to '%.*s'"), opc_len, str);
3390       bad_operands = TRUE;
3391     }
3392
3393   if (!bad_operands)
3394     {
3395       /* Each operand is of the right syntactic form for some opcode
3396          choice, and the number of operands is valid.  Check that each
3397          operand is OK in detail for some opcode choice with the right
3398          number of operands.  */
3399       unsigned int i;
3400
3401       for (i = 0; i < num_operands_read; i++)
3402         {
3403           bfd_boolean coarse_ok = FALSE;
3404           bfd_boolean fine_ok = FALSE;
3405           tic6x_operand_match fine_failure = tic6x_match_matches;
3406           unsigned int j;
3407
3408           for (j = 0; j < num_matching_opcodes; j++)
3409             {
3410               tic6x_operand_form f;
3411               tic6x_rw rw;
3412               unsigned int cf;
3413               tic6x_operand_match this_fine_failure;
3414
3415               if (tic6x_opcode_table[opcm[j]].flags & TIC6X_FLAG_SPMASK)
3416                 {
3417                   f = tic6x_operand_func_unit;
3418                   rw = tic6x_rw_none;
3419                 }
3420               else
3421                 {
3422                   if (tic6x_opcode_table[opcm[j]].num_operands
3423                       != num_operands_read)
3424                     continue;
3425
3426                   f = tic6x_opcode_table[opcm[j]].operand_info[i].form;
3427                   rw = tic6x_opcode_table[opcm[j]].operand_info[i].rw;
3428                 }
3429               cf = tic6x_coarse_operand_form (f);
3430
3431               if (operands[i].form != cf)
3432                 continue;
3433
3434               coarse_ok = TRUE;
3435               this_fine_failure
3436                 = tic6x_operand_matches_form (&operands[i], f, rw,
3437                                               func_unit_side,
3438                                               cross_side,
3439                                               func_unit_data_side);
3440               if (this_fine_failure == tic6x_match_matches)
3441                 {
3442                   fine_ok = TRUE;
3443                   break;
3444                 }
3445               if (fine_failure == tic6x_match_matches
3446                   || fine_failure > this_fine_failure)
3447                 fine_failure = this_fine_failure;
3448             }
3449
3450           /* No instructions should have operand syntactic forms only
3451              acceptable with certain numbers of operands, so no
3452              diagnostic for this case.  */
3453           if (!coarse_ok)
3454             abort ();
3455
3456           if (!fine_ok)
3457             {
3458               switch (fine_failure)
3459                 {
3460                 case tic6x_match_non_const:
3461                   as_bad (_("operand %u of '%.*s' not constant"),
3462                           i + 1, opc_len, str);
3463                   break;
3464
3465                 case tic6x_match_wrong_side:
3466                   as_bad (_("operand %u of '%.*s' on wrong side"),
3467                           i + 1, opc_len, str);
3468                   break;
3469
3470                 case tic6x_match_bad_return:
3471                   as_bad (_("operand %u of '%.*s' not a valid return "
3472                             "address register"),
3473                           i + 1, opc_len, str);
3474                   break;
3475
3476                 case tic6x_match_ctrl_write_only:
3477                   as_bad (_("operand %u of '%.*s' is write-only"),
3478                           i + 1, opc_len, str);
3479                   break;
3480
3481                 case tic6x_match_ctrl_read_only:
3482                   as_bad (_("operand %u of '%.*s' is read-only"),
3483                           i + 1, opc_len, str);
3484                   break;
3485
3486                 case tic6x_match_bad_mem:
3487                   as_bad (_("operand %u of '%.*s' not a valid memory "
3488                             "reference"),
3489                           i + 1, opc_len, str);
3490                   break;
3491
3492                 case tic6x_match_bad_address:
3493                   as_bad (_("operand %u of '%.*s' not a valid base "
3494                             "address register"),
3495                           i + 1, opc_len, str);
3496                   break;
3497
3498                 default:
3499                   abort ();
3500                 }
3501               bad_operands = TRUE;
3502               break;
3503             }
3504         }
3505     }
3506
3507   if (!bad_operands)
3508     {
3509       /* Each operand is OK for some opcode choice, and the number of
3510          operands is valid.  Check whether there is an opcode choice
3511          for which all operands are simultaneously valid.  */
3512       unsigned int i;
3513       bfd_boolean found_match = FALSE;
3514
3515       for (i = 0; i < TIC6X_NUM_PREFER; i++)
3516         opc_rank[i] = (unsigned int) -1;
3517
3518       min_rank = TIC6X_NUM_PREFER - 1;
3519       max_rank = 0;
3520
3521       for (i = 0; i < num_matching_opcodes; i++)
3522         {
3523           unsigned int j;
3524           bfd_boolean this_matches = TRUE;
3525
3526           if (!(tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3527               && tic6x_opcode_table[opcm[i]].num_operands != num_operands_read)
3528             continue;
3529
3530           for (j = 0; j < num_operands_read; j++)
3531             {
3532               tic6x_operand_form f;
3533               tic6x_rw rw;
3534
3535               if (tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3536                 {
3537                   f = tic6x_operand_func_unit;
3538                   rw = tic6x_rw_none;
3539                 }
3540               else
3541                 {
3542                   f = tic6x_opcode_table[opcm[i]].operand_info[j].form;
3543                   rw = tic6x_opcode_table[opcm[i]].operand_info[j].rw;
3544                 }
3545               if (tic6x_operand_matches_form (&operands[j], f, rw,
3546                                               func_unit_side,
3547                                               cross_side,
3548                                               func_unit_data_side)
3549                   != tic6x_match_matches)
3550                 {
3551                   this_matches = FALSE;
3552                   break;
3553                 }
3554             }
3555
3556           if (this_matches)
3557             {
3558               int rank = TIC6X_PREFER_VAL (tic6x_opcode_table[opcm[i]].flags);
3559
3560               if (rank < min_rank)
3561                 min_rank = rank;
3562               if (rank > max_rank)
3563                 max_rank = rank;
3564
3565               if (opc_rank[rank] == (unsigned int) -1)
3566                 opc_rank[rank] = i;
3567               else
3568                 /* The opcode table should provide a total ordering
3569                    for all cases where multiple matches may get
3570                    here.  */
3571                 abort ();
3572
3573               found_match = TRUE;
3574             }
3575         }
3576
3577       if (!found_match)
3578         {
3579           as_bad (_("bad operand combination for '%.*s'"), opc_len, str);
3580           bad_operands = TRUE;
3581         }
3582     }
3583
3584   if (bad_operands)
3585     {
3586       free (opcm);
3587       return;
3588     }
3589
3590   opcode_value = 0;
3591   encoded_ok = FALSE;
3592   for (try_rank = max_rank; try_rank >= min_rank; try_rank--)
3593     {
3594       fix_needed = FALSE;
3595
3596       if (opc_rank[try_rank] == (unsigned int) -1)
3597         continue;
3598
3599       opcode_value = tic6x_try_encode (opcm[opc_rank[try_rank]], operands,
3600                                        num_operands_read, this_line_creg,
3601                                        this_line_z, func_unit_side,
3602                                        func_unit_cross, func_unit_data_side,
3603                                        seginfo->tc_segment_info_data.sploop_ii,
3604                                        &fix_exp, &fix_pcrel, &fx_r_type,
3605                                        &fix_adda, &fix_needed, &encoded_ok,
3606                                        (try_rank == min_rank ? TRUE : FALSE),
3607                                        str, opc_len);
3608       if (encoded_ok)
3609         {
3610           opct = &tic6x_opcode_table[opcm[opc_rank[try_rank]]];
3611           break;
3612         }
3613     }
3614
3615   free (opcm);
3616
3617   if (!encoded_ok)
3618     return;
3619
3620   if (this_line_parallel)
3621     {
3622       insn_frag = seginfo->tc_segment_info_data.execute_packet_frag;
3623       if (insn_frag == NULL)
3624         {
3625           as_bad (_("parallel instruction not following another instruction"));
3626           return;
3627         }
3628
3629       if (insn_frag->fr_fix >= 32)
3630         {
3631           as_bad (_("too many instructions in execute packet"));
3632           return;
3633         }
3634
3635       if (this_insn_label_list != NULL)
3636         as_bad (_("label not at start of execute packet"));
3637
3638       if (opct->flags & TIC6X_FLAG_FIRST)
3639         as_bad (_("'%.*s' instruction not at start of execute packet"),
3640                 opc_len, str);
3641
3642       *seginfo->tc_segment_info_data.last_insn_lsb |= 0x1;
3643       output = insn_frag->fr_literal + insn_frag->fr_fix;
3644     }
3645   else
3646     {
3647       tic6x_label_list *l;
3648
3649       seginfo->tc_segment_info_data.spmask_addr = NULL;
3650       seginfo->tc_segment_info_data.func_units_used = 0;
3651
3652       /* Start a new frag for this execute packet.  */
3653       if (frag_now_fix () != 0)
3654         {
3655           if (frag_now->fr_type != rs_machine_dependent)
3656             frag_wane (frag_now);
3657
3658           frag_new (0);
3659         }
3660       frag_grow (32);
3661       insn_frag = seginfo->tc_segment_info_data.execute_packet_frag = frag_now;
3662       for (l = this_insn_label_list; l; l = l->next)
3663         {
3664           symbol_set_frag (l->label, frag_now);
3665           S_SET_VALUE (l->label, 0);
3666           S_SET_SEGMENT (l->label, now_seg);
3667         }
3668       tic6x_free_label_list (this_insn_label_list);
3669       dwarf2_emit_insn (0);
3670       output = frag_var (rs_machine_dependent, 32, 32, 0, NULL, 0, NULL);
3671       /* This must be the same as the frag to which a pointer was just
3672          saved.  */
3673       if (output != insn_frag->fr_literal)
3674         abort ();
3675       insn_frag->tc_frag_data.is_insns = TRUE;
3676       insn_frag->tc_frag_data.can_cross_fp_boundary
3677         = tic6x_can_cross_fp_boundary;
3678     }
3679
3680   if (func_unit_base != tic6x_func_unit_nfu)
3681     {
3682       unsigned int func_unit_enc;
3683
3684       func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
3685
3686       if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
3687         as_bad (_("functional unit already used in this execute packet"));
3688
3689       seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
3690     }
3691
3692   if (opct->flags & TIC6X_FLAG_SPLOOP)
3693     {
3694       if (seginfo->tc_segment_info_data.sploop_ii)
3695         as_bad (_("nested software pipelined loop"));
3696       if (num_operands_read != 1
3697           || operands[0].form != TIC6X_OP_EXP
3698           || operands[0].value.exp.X_op != O_constant)
3699         abort ();
3700       seginfo->tc_segment_info_data.sploop_ii
3701         = operands[0].value.exp.X_add_number;
3702     }
3703   else if (opct->flags & TIC6X_FLAG_SPKERNEL)
3704     {
3705       if (!seginfo->tc_segment_info_data.sploop_ii)
3706         as_bad (_("'%.*s' instruction not in a software pipelined loop"),
3707                 opc_len, str);
3708       seginfo->tc_segment_info_data.sploop_ii = 0;
3709     }
3710
3711   if (this_line_spmask)
3712     {
3713       if (seginfo->tc_segment_info_data.spmask_addr == NULL)
3714         as_bad (_("'||^' without previous SPMASK"));
3715       else if (func_unit_base == tic6x_func_unit_nfu)
3716         as_bad (_("cannot mask instruction using no functional unit"));
3717       else
3718         {
3719           unsigned int spmask_opcode;
3720           unsigned int mask_bit;
3721
3722           spmask_opcode
3723             = md_chars_to_number (seginfo->tc_segment_info_data.spmask_addr,
3724                                   4);
3725           mask_bit = tic6x_encode_spmask (func_unit_base, func_unit_side);
3726           mask_bit <<= 18;
3727           if (spmask_opcode & mask_bit)
3728             as_bad (_("functional unit already masked"));
3729           spmask_opcode |= mask_bit;
3730           md_number_to_chars (seginfo->tc_segment_info_data.spmask_addr,
3731                               spmask_opcode, 4);
3732         }
3733     }
3734
3735   record_alignment (now_seg, 5);
3736   md_number_to_chars (output, opcode_value, 4);
3737   if (fix_needed)
3738     tic6x_fix_new_exp (insn_frag, output - insn_frag->fr_literal, 4, fix_exp,
3739                        fix_pcrel, fx_r_type, fix_adda);
3740   insn_frag->fr_fix += 4;
3741   insn_frag->fr_var -= 4;
3742   seginfo->tc_segment_info_data.last_insn_lsb
3743     = (target_big_endian ? output + 3 : output);
3744   if (opct->flags & TIC6X_FLAG_SPMASK)
3745     seginfo->tc_segment_info_data.spmask_addr = output;
3746 }
3747
3748 /* Modify NEWVAL (32-bit) by inserting VALUE, shifted right by SHIFT
3749    and the least significant BITS bits taken, at position POS.  */
3750 #define MODIFY_VALUE(NEWVAL, VALUE, SHIFT, POS, BITS)                   \
3751   do {                                                                  \
3752     (NEWVAL) &= 0xffffffffU & ~(((1U << (BITS)) - 1) << (POS));         \
3753     (NEWVAL) |= (((VALUE) >> (SHIFT)) & ((1U << (BITS)) - 1)) << (POS); \
3754   } while (0)
3755
3756 /* Apply a fixup to the object file.  */
3757
3758 void
3759 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3760 {
3761   offsetT value = *valP;
3762   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3763
3764   value = SEXT (value);
3765   *valP = value;
3766
3767   fixP->fx_offset = SEXT (fixP->fx_offset);
3768
3769   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3770     fixP->fx_done = 1;
3771
3772   /* We do our own overflow checks.  */
3773   fixP->fx_no_overflow = 1;
3774
3775   switch (fixP->fx_r_type)
3776     {
3777     case BFD_RELOC_NONE:
3778     case BFD_RELOC_C6000_EHTYPE:
3779       /* Force output to the object file.  */
3780       fixP->fx_done = 0;
3781       break;
3782
3783     case BFD_RELOC_32:
3784       if (fixP->fx_done || !seg->use_rela_p)
3785         md_number_to_chars (buf, value, 4);
3786       break;
3787
3788     case BFD_RELOC_16:
3789       if (fixP->fx_done || !seg->use_rela_p)
3790         {
3791           if (value < -0x8000 || value > 0xffff)
3792             as_bad_where (fixP->fx_file, fixP->fx_line,
3793                           _("value too large for 2-byte field"));
3794           md_number_to_chars (buf, value, 2);
3795         }
3796       break;
3797
3798     case BFD_RELOC_8:
3799       if (fixP->fx_done || !seg->use_rela_p)
3800         {
3801           if (value < -0x80 || value > 0xff)
3802             as_bad_where (fixP->fx_file, fixP->fx_line,
3803                           _("value too large for 1-byte field"));
3804           md_number_to_chars (buf, value, 1);
3805         }
3806       break;
3807
3808     case BFD_RELOC_C6000_ABS_S16:
3809     case BFD_RELOC_C6000_ABS_L16:
3810     case BFD_RELOC_C6000_SBR_S16:
3811     case BFD_RELOC_C6000_SBR_L16_B:
3812     case BFD_RELOC_C6000_SBR_L16_H:
3813     case BFD_RELOC_C6000_SBR_L16_W:
3814     case BFD_RELOC_C6000_SBR_GOT_L16_W:
3815       if (fixP->fx_done || !seg->use_rela_p)
3816         {
3817           offsetT newval = md_chars_to_number (buf, 4);
3818           int shift;
3819
3820           switch (fixP->fx_r_type)
3821             {
3822             case BFD_RELOC_C6000_SBR_L16_H:
3823               shift = 1;
3824               break;
3825
3826             case BFD_RELOC_C6000_SBR_L16_W:
3827             case BFD_RELOC_C6000_SBR_GOT_L16_W:
3828               shift = 2;
3829               break;
3830
3831             default:
3832               shift = 0;
3833               break;
3834             }
3835
3836           MODIFY_VALUE (newval, value, shift, 7, 16);
3837           if ((value < -0x8000 || value > 0x7fff)
3838               && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16
3839                   || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16))
3840             as_bad_where (fixP->fx_file, fixP->fx_line,
3841                           _("immediate offset out of range"));
3842
3843           md_number_to_chars (buf, newval, 4);
3844         }
3845       if (fixP->fx_done
3846           && fixP->fx_r_type != BFD_RELOC_C6000_ABS_S16
3847           && fixP->fx_r_type != BFD_RELOC_C6000_ABS_L16)
3848         abort ();
3849       break;
3850
3851     case BFD_RELOC_C6000_ABS_H16:
3852     case BFD_RELOC_C6000_SBR_H16_B:
3853     case BFD_RELOC_C6000_SBR_H16_H:
3854     case BFD_RELOC_C6000_SBR_H16_W:
3855     case BFD_RELOC_C6000_SBR_GOT_H16_W:
3856       if (fixP->fx_done || !seg->use_rela_p)
3857         {
3858           offsetT newval = md_chars_to_number (buf, 4);
3859           int shift;
3860
3861           switch (fixP->fx_r_type)
3862             {
3863             case BFD_RELOC_C6000_SBR_H16_H:
3864               shift = 17;
3865               break;
3866
3867             case BFD_RELOC_C6000_SBR_H16_W:
3868             case BFD_RELOC_C6000_SBR_GOT_H16_W:
3869               shift = 18;
3870               break;
3871
3872             default:
3873               shift = 16;
3874               break;
3875             }
3876
3877           MODIFY_VALUE (newval, value, shift, 7, 16);
3878
3879           md_number_to_chars (buf, newval, 4);
3880         }
3881       if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_ABS_H16)
3882         abort ();
3883       break;
3884
3885     case BFD_RELOC_C6000_PCR_H16:
3886     case BFD_RELOC_C6000_PCR_L16:
3887       if (fixP->fx_done || !seg->use_rela_p)
3888         {
3889           offsetT newval = md_chars_to_number (buf, 4);
3890           int shift = fixP->fx_r_type == BFD_RELOC_C6000_PCR_H16 ? 16 : 0;
3891
3892           MODIFY_VALUE (newval, value, shift, 7, 16);
3893
3894           md_number_to_chars (buf, newval, 4);
3895         }
3896       break;
3897
3898     case BFD_RELOC_C6000_SBR_U15_B:
3899       if (fixP->fx_done || !seg->use_rela_p)
3900         {
3901           offsetT newval = md_chars_to_number (buf, 4);
3902
3903           MODIFY_VALUE (newval, value, 0, 8, 15);
3904           if (value < 0 || value > 0x7fff)
3905             as_bad_where (fixP->fx_file, fixP->fx_line,
3906                           _("immediate offset out of range"));
3907
3908           md_number_to_chars (buf, newval, 4);
3909         }
3910       break;
3911
3912     case BFD_RELOC_C6000_SBR_U15_H:
3913       if (fixP->fx_done || !seg->use_rela_p)
3914         {
3915           offsetT newval = md_chars_to_number (buf, 4);
3916
3917           /* Constant ADDA operands, processed as constant when the
3918              instruction is parsed, are encoded as-is rather than
3919              shifted.  If the operand of an ADDA instruction is now
3920              constant (for example, the difference between two labels
3921              found after the instruction), ensure it is encoded the
3922              same way it would have been if the constant value had
3923              been known when the instruction was parsed.  */
3924           if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3925             value <<= 1;
3926
3927           MODIFY_VALUE (newval, value, 1, 8, 15);
3928           if (value & 1)
3929             as_bad_where (fixP->fx_file, fixP->fx_line,
3930                           _("immediate offset not 2-byte-aligned"));
3931           if (value < 0 || value > 0xfffe)
3932             as_bad_where (fixP->fx_file, fixP->fx_line,
3933                           _("immediate offset out of range"));
3934
3935           md_number_to_chars (buf, newval, 4);
3936         }
3937       break;
3938
3939     case BFD_RELOC_C6000_SBR_U15_W:
3940     case BFD_RELOC_C6000_SBR_GOT_U15_W:
3941       if (fixP->fx_done || !seg->use_rela_p)
3942         {
3943           offsetT newval = md_chars_to_number (buf, 4);
3944
3945           /* Constant ADDA operands, processed as constant when the
3946              instruction is parsed, are encoded as-is rather than
3947              shifted.  If the operand of an ADDA instruction is now
3948              constant (for example, the difference between two labels
3949              found after the instruction), ensure it is encoded the
3950              same way it would have been if the constant value had
3951              been known when the instruction was parsed.  */
3952           if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3953             value <<= 2;
3954
3955           MODIFY_VALUE (newval, value, 2, 8, 15);
3956           if (value & 3)
3957             as_bad_where (fixP->fx_file, fixP->fx_line,
3958                           _("immediate offset not 4-byte-aligned"));
3959           if (value < 0 || value > 0x1fffc)
3960             as_bad_where (fixP->fx_file, fixP->fx_line,
3961                           _("immediate offset out of range"));
3962
3963           md_number_to_chars (buf, newval, 4);
3964         }
3965       if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_SBR_U15_W)
3966         abort ();
3967       break;
3968
3969     case BFD_RELOC_C6000_DSBT_INDEX:
3970       if (value != 0)
3971         as_bad_where (fixP->fx_file, fixP->fx_line,
3972                       _("addend used with $DSBT_INDEX"));
3973       if (fixP->fx_done)
3974         abort ();
3975       break;
3976
3977     case BFD_RELOC_C6000_PCR_S21:
3978       if (fixP->fx_done || !seg->use_rela_p)
3979         {
3980           offsetT newval = md_chars_to_number (buf, 4);
3981
3982           MODIFY_VALUE (newval, value, 2, 7, 21);
3983
3984           if (value & 3)
3985             as_bad_where (fixP->fx_file, fixP->fx_line,
3986                           _("PC-relative offset not 4-byte-aligned"));
3987           if (value < -0x400000 || value > 0x3ffffc)
3988             as_bad_where (fixP->fx_file, fixP->fx_line,
3989                           _("PC-relative offset out of range"));
3990
3991           md_number_to_chars (buf, newval, 4);
3992         }
3993       break;
3994
3995     case BFD_RELOC_C6000_PCR_S12:
3996       if (fixP->fx_done || !seg->use_rela_p)
3997         {
3998           offsetT newval = md_chars_to_number (buf, 4);
3999
4000           MODIFY_VALUE (newval, value, 2, 16, 12);
4001
4002           if (value & 3)
4003             as_bad_where (fixP->fx_file, fixP->fx_line,
4004                           _("PC-relative offset not 4-byte-aligned"));
4005           if (value < -0x2000 || value > 0x1ffc)
4006             as_bad_where (fixP->fx_file, fixP->fx_line,
4007                           _("PC-relative offset out of range"));
4008
4009           md_number_to_chars (buf, newval, 4);
4010         }
4011       break;
4012
4013     case BFD_RELOC_C6000_PCR_S10:
4014       if (fixP->fx_done || !seg->use_rela_p)
4015         {
4016           offsetT newval = md_chars_to_number (buf, 4);
4017
4018           MODIFY_VALUE (newval, value, 2, 13, 10);
4019
4020           if (value & 3)
4021             as_bad_where (fixP->fx_file, fixP->fx_line,
4022                           _("PC-relative offset not 4-byte-aligned"));
4023           if (value < -0x800 || value > 0x7fc)
4024             as_bad_where (fixP->fx_file, fixP->fx_line,
4025                           _("PC-relative offset out of range"));
4026
4027           md_number_to_chars (buf, newval, 4);
4028         }
4029       break;
4030
4031     case BFD_RELOC_C6000_PCR_S7:
4032       if (fixP->fx_done || !seg->use_rela_p)
4033         {
4034           offsetT newval = md_chars_to_number (buf, 4);
4035
4036           MODIFY_VALUE (newval, value, 2, 16, 7);
4037
4038           if (value & 3)
4039             as_bad_where (fixP->fx_file, fixP->fx_line,
4040                           _("PC-relative offset not 4-byte-aligned"));
4041           if (value < -0x100 || value > 0xfc)
4042             as_bad_where (fixP->fx_file, fixP->fx_line,
4043                           _("PC-relative offset out of range"));
4044
4045           md_number_to_chars (buf, newval, 4);
4046         }
4047       break;
4048
4049     case BFD_RELOC_C6000_PREL31:
4050       /* Force output to the object file.  */
4051       fixP->fx_done = 0;
4052       break;
4053
4054     default:
4055       abort ();
4056     }
4057 }
4058
4059 /* Convert a floating-point number to target (IEEE) format.  */
4060
4061 char *
4062 md_atof (int type, char *litP, int *sizeP)
4063 {
4064   return ieee_md_atof (type, litP, sizeP, target_big_endian);
4065 }
4066
4067 /* Adjust the frags in SECTION (see tic6x_end).  */
4068
4069 static void
4070 tic6x_adjust_section (bfd *abfd ATTRIBUTE_UNUSED, segT section,
4071                       void *dummy ATTRIBUTE_UNUSED)
4072 {
4073   segment_info_type *info;
4074   frchainS *frchp;
4075   fragS *fragp;
4076   bfd_boolean have_code = FALSE;
4077   bfd_boolean have_non_code = FALSE;
4078
4079   info = seg_info (section);
4080   if (info == NULL)
4081     return;
4082
4083   for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4084     for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4085       switch (fragp->fr_type)
4086         {
4087         case rs_machine_dependent:
4088           if (fragp->tc_frag_data.is_insns)
4089             have_code = TRUE;
4090           break;
4091
4092         case rs_dummy:
4093         case rs_fill:
4094           if (fragp->fr_fix > 0)
4095             have_non_code = TRUE;
4096           break;
4097
4098         default:
4099           have_non_code = TRUE;
4100           break;
4101         }
4102
4103   /* Process alignment requirements in a code-only section.  */
4104   if (have_code && !have_non_code)
4105     {
4106       /* If we need to insert an odd number of instructions to meet an
4107          alignment requirement, there must have been an odd number of
4108          instructions since the last 8-byte-aligned execute packet
4109          boundary.  So there must have been an execute packet with an
4110          odd number (and so a number fewer than 8) of instructions
4111          into which we can insert a NOP without breaking any previous
4112          alignments.
4113
4114          If then we need to insert a number 2 mod 4 of instructions,
4115          the number of instructions since the last 16-byte-aligned
4116          execute packet boundary must be 2 mod 4.  So between that
4117          boundary and the following 8-byte-aligned boundary there must
4118          either be at least one execute packet with 2-mod-4
4119          instructions, or at least two with an odd number of
4120          instructions; again, greedily inserting NOPs as soon as
4121          possible suffices to meet the alignment requirement.
4122
4123          If then we need to insert 4 instructions, we look between the
4124          last 32-byte-aligned boundary and the following
4125          16-byte-aligned boundary.  The sizes of the execute packets
4126          in this range total 4 instructions mod 8, so again there is
4127          room for greedy insertion of NOPs to meet the alignment
4128          requirement, and before any intermediate point with 8-byte
4129          (2-instruction) alignment requirement the sizes of execute
4130          packets (and so the room for NOPs) will total 2 instructions
4131          mod 4 so greedy insertion will not break such alignments.
4132
4133          So we can always meet these alignment requirements by
4134          inserting NOPs in parallel with existing execute packets, and
4135          by induction the approach described above inserts the minimum
4136          number of such NOPs.  */
4137
4138       /* The number of NOPs we are currently looking to insert, if we
4139          have gone back to insert NOPs.  */
4140       unsigned int want_insert = 0;
4141
4142       /* Out of that number, the number inserted so far in the current
4143          stage of the above algorithm.  */
4144       unsigned int want_insert_done_so_far = 0;
4145
4146       /* The position mod 32 at the start of the current frag.  */
4147       unsigned int pos = 0;
4148
4149       /* The locations in the frag chain of the most recent frags at
4150          the start of which there is the given alignment.  */
4151       frchainS *frchp_last32, *frchp_last16, *frchp_last8;
4152       fragS *fragp_last32, *fragp_last16, *fragp_last8;
4153       unsigned int pos_last32, pos_last16, pos_last8;
4154
4155       frchp_last32 = frchp_last16 = frchp_last8 = info->frchainP;
4156       fragp_last32 = fragp_last16 = fragp_last8 = info->frchainP->frch_root;
4157       pos_last32 = pos_last16 = pos_last8 = 0;
4158
4159       for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4160         for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4161         look_at_frag:
4162           {
4163             bfd_boolean go_back = FALSE;
4164             frchainS *frchp_next;
4165             fragS *fragp_next;
4166
4167             if (fragp->fr_type != rs_machine_dependent)
4168               continue;
4169
4170             if (fragp->tc_frag_data.is_insns
4171                 && pos + fragp->fr_fix > 32
4172                 && !fragp->tc_frag_data.can_cross_fp_boundary)
4173               {
4174                 /* As described above, we should always have met an
4175                    alignment requirement by the time we come back to
4176                    it.  */
4177                 if (want_insert)
4178                   abort ();
4179
4180                 if (pos & 3)
4181                   abort ();
4182                 want_insert = (32 - pos) >> 2;
4183                 if (want_insert > 7)
4184                   abort ();
4185                 want_insert_done_so_far = 0;
4186                 go_back = TRUE;
4187               }
4188
4189             if (!fragp->tc_frag_data.is_insns)
4190               {
4191                 unsigned int would_insert_bytes;
4192
4193                 if (!(pos & ((1 << fragp->fr_offset) - 1)))
4194                   /* This alignment requirement is already met.  */
4195                   continue;
4196
4197                 /* As described above, we should always have met an
4198                    alignment requirement by the time we come back to
4199                    it.  */
4200                 if (want_insert)
4201                   abort ();
4202
4203                 /* We may not be able to meet this requirement within
4204                    the given number of characters.  */
4205                 would_insert_bytes
4206                   = ((1 << fragp->fr_offset)
4207                      - (pos & ((1 << fragp->fr_offset) - 1)));
4208
4209                 if (fragp->fr_subtype != 0
4210                     && would_insert_bytes > fragp->fr_subtype)
4211                   continue;
4212
4213                 /* An unmet alignment must be 8, 16 or 32 bytes;
4214                    smaller ones must always be met within code-only
4215                    sections and larger ones cause the section not to
4216                    be code-only.  */
4217                 if (fragp->fr_offset != 3
4218                     && fragp->fr_offset != 4
4219                     && fragp->fr_offset != 5)
4220                   abort ();
4221
4222                 if (would_insert_bytes & 3)
4223                   abort ();
4224                 want_insert = would_insert_bytes >> 2;
4225                 if (want_insert > 7)
4226                   abort ();
4227                 want_insert_done_so_far = 0;
4228                 go_back = TRUE;
4229               }
4230             else if (want_insert && !go_back)
4231               {
4232                 unsigned int num_insns = fragp->fr_fix >> 2;
4233                 unsigned int max_poss_nops = 8 - num_insns;
4234
4235                 if (max_poss_nops)
4236                   {
4237                     unsigned int cur_want_nops, max_want_nops, do_nops, i;
4238
4239                     if (want_insert & 1)
4240                       cur_want_nops = 1;
4241                     else if (want_insert & 2)
4242                       cur_want_nops = 2;
4243                     else if (want_insert & 4)
4244                       cur_want_nops = 4;
4245                     else
4246                       abort ();
4247
4248                     max_want_nops = cur_want_nops - want_insert_done_so_far;
4249
4250                     do_nops = (max_poss_nops < max_want_nops
4251                                ? max_poss_nops
4252                                : max_want_nops);
4253                     for (i = 0; i < do_nops; i++)
4254                       {
4255                         md_number_to_chars (fragp->fr_literal + fragp->fr_fix,
4256                                             0, 4);
4257                         if (target_big_endian)
4258                           fragp->fr_literal[fragp->fr_fix - 1] |= 0x1;
4259                         else
4260                           fragp->fr_literal[fragp->fr_fix - 4] |= 0x1;
4261                         fragp->fr_fix += 4;
4262                         fragp->fr_var -= 4;
4263                       }
4264                     want_insert_done_so_far += do_nops;
4265                     if (want_insert_done_so_far == cur_want_nops)
4266                       {
4267                         want_insert -= want_insert_done_so_far;
4268                         want_insert_done_so_far = 0;
4269                         if (want_insert)
4270                           go_back = TRUE;
4271                       }
4272                   }
4273               }
4274             if (go_back)
4275               {
4276                 if (want_insert & 1)
4277                   {
4278                     frchp = frchp_last8;
4279                     fragp = fragp_last8;
4280                     pos = pos_last8;
4281                   }
4282                 else if (want_insert & 2)
4283                   {
4284                     frchp = frchp_last8 = frchp_last16;
4285                     fragp = fragp_last8 = fragp_last16;
4286                     pos = pos_last8 = pos_last16;
4287                   }
4288                 else if (want_insert & 4)
4289                   {
4290                     frchp = frchp_last8 = frchp_last16 = frchp_last32;
4291                     fragp = fragp_last8 = fragp_last16 = fragp_last32;
4292                     pos = pos_last8 = pos_last16 = pos_last32;
4293                   }
4294                 else
4295                   abort ();
4296
4297                 goto look_at_frag;
4298               }
4299
4300             /* Update current position for moving past a code
4301                frag.  */
4302             pos += fragp->fr_fix;
4303             pos &= 31;
4304             frchp_next = frchp;
4305             fragp_next = fragp->fr_next;
4306             if (fragp_next == NULL)
4307               {
4308                 frchp_next = frchp->frch_next;
4309                 if (frchp_next != NULL)
4310                   fragp_next = frchp_next->frch_root;
4311               }
4312             if (!(pos & 7))
4313               {
4314                 frchp_last8 = frchp_next;
4315                 fragp_last8 = fragp_next;
4316                 pos_last8 = pos;
4317               }
4318             if (!(pos & 15))
4319               {
4320                 frchp_last16 = frchp_next;
4321                 fragp_last16 = fragp_next;
4322                 pos_last16 = pos;
4323               }
4324             if (!(pos & 31))
4325               {
4326                 frchp_last32 = frchp_next;
4327                 fragp_last32 = fragp_next;
4328                 pos_last32 = pos;
4329               }
4330           }
4331     }
4332
4333   /* Now convert the machine-dependent frags to machine-independent
4334      ones.  */
4335   for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4336     for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4337       {
4338         if (fragp->fr_type == rs_machine_dependent)
4339           {
4340             if (fragp->tc_frag_data.is_insns)
4341               frag_wane (fragp);
4342             else
4343               {
4344                 fragp->fr_type = rs_align_code;
4345                 fragp->fr_var = 1;
4346                 *fragp->fr_literal = 0;
4347               }
4348           }
4349       }
4350 }
4351
4352 /* Initialize the machine-dependent parts of a frag.  */
4353
4354 void
4355 tic6x_frag_init (fragS *fragp)
4356 {
4357   fragp->tc_frag_data.is_insns = FALSE;
4358   fragp->tc_frag_data.can_cross_fp_boundary = FALSE;
4359 }
4360
4361 /* Set an attribute if it has not already been set by the user.  */
4362
4363 static void
4364 tic6x_set_attribute_int (int tag, int value)
4365 {
4366   if (tag < 1
4367       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
4368     abort ();
4369   if (!tic6x_attributes_set_explicitly[tag])
4370     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
4371 }
4372
4373 /* Set object attributes deduced from the input file and command line
4374    rather than given explicitly.  */
4375 static void
4376 tic6x_set_attributes (void)
4377 {
4378   if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
4379     tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
4380
4381   tic6x_set_attribute_int (Tag_ISA, tic6x_arch_attribute);
4382   tic6x_set_attribute_int (Tag_ABI_DSBT, tic6x_dsbt);
4383   tic6x_set_attribute_int (Tag_ABI_PID, tic6x_pid);
4384   tic6x_set_attribute_int (Tag_ABI_PIC, tic6x_pic);
4385 }
4386
4387 /* Do machine-dependent manipulations of the frag chains after all
4388    input has been read and before the machine-independent sizing and
4389    relaxing.  */
4390
4391 void
4392 tic6x_end (void)
4393 {
4394   /* Set object attributes at this point if not explicitly set.  */
4395   tic6x_set_attributes ();
4396
4397   /* Meeting alignment requirements may require inserting NOPs in
4398      parallel in execute packets earlier in the segment.  Future
4399      16-bit instruction generation involves whole-segment optimization
4400      to determine the best choice and ordering of 32-bit or 16-bit
4401      instructions.  This doesn't fit will in the general relaxation
4402      framework, so handle alignment and 16-bit instruction generation
4403      here.  */
4404   bfd_map_over_sections (stdoutput, tic6x_adjust_section, NULL);
4405 }
4406
4407 /* No machine-dependent frags at this stage; all converted in
4408    tic6x_end.  */
4409
4410 void
4411 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
4412                  fragS *fragp ATTRIBUTE_UNUSED)
4413 {
4414   abort ();
4415 }
4416
4417 /* No machine-dependent frags at this stage; all converted in
4418    tic6x_end.  */
4419
4420 int
4421 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
4422                                segT seg ATTRIBUTE_UNUSED)
4423 {
4424   abort ();
4425 }
4426
4427 /* Put a number into target byte order.  */
4428
4429 void
4430 md_number_to_chars (char *buf, valueT val, int n)
4431 {
4432   if (target_big_endian)
4433     number_to_chars_bigendian (buf, val, n);
4434   else
4435     number_to_chars_littleendian (buf, val, n);
4436 }
4437
4438 /* Machine-dependent operand parsing not currently needed.  */
4439
4440 void
4441 md_operand (expressionS *op ATTRIBUTE_UNUSED)
4442 {
4443 }
4444
4445 /* PC-relative operands are relative to the start of the fetch
4446    packet.  */
4447
4448 long
4449 tic6x_pcrel_from_section (fixS *fixp, segT sec)
4450 {
4451   if (fixp->fx_addsy != NULL
4452       && (!S_IS_DEFINED (fixp->fx_addsy)
4453           || S_GET_SEGMENT (fixp->fx_addsy) != sec))
4454     return 0;
4455   return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f;
4456 }
4457
4458 /* Round up a section size to the appropriate boundary.  */
4459
4460 valueT
4461 md_section_align (segT segment ATTRIBUTE_UNUSED,
4462                   valueT size)
4463 {
4464   /* Round up section sizes to ensure that text sections consist of
4465      whole fetch packets.  */
4466   int align = bfd_get_section_alignment (stdoutput, segment);
4467   return ((size + (1 << align) - 1) & ((valueT) -1 << align));
4468 }
4469
4470 /* No special undefined symbol handling needed for now.  */
4471
4472 symbolS *
4473 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
4474 {
4475   return NULL;
4476 }
4477
4478 /* Translate internal representation of relocation info to BFD target
4479    format.  */
4480
4481 arelent *
4482 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
4483 {
4484   arelent *reloc;
4485   asymbol *symbol;
4486   bfd_reloc_code_real_type r_type;
4487
4488   reloc = xmalloc (sizeof (arelent));
4489   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
4490   symbol = symbol_get_bfdsym (fixp->fx_addsy);
4491   *reloc->sym_ptr_ptr = symbol;
4492   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4493   reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
4494   r_type = fixp->fx_r_type;
4495   reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4496
4497   if (reloc->howto == NULL)
4498     {
4499       as_bad_where (fixp->fx_file, fixp->fx_line,
4500                     _("Cannot represent relocation type %s"),
4501                     bfd_get_reloc_code_name (r_type));
4502       return NULL;
4503     }
4504
4505   /* Correct for adjustments bfd_install_relocation will make.  */
4506   if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
4507     {
4508       reloc->addend += reloc->address;
4509       if (!bfd_is_com_section (symbol))
4510         reloc->addend -= symbol->value;
4511     }
4512   if (r_type == BFD_RELOC_C6000_PCR_H16
4513       || r_type == BFD_RELOC_C6000_PCR_L16)
4514     {
4515       symbolS *t = fixp->tc_fix_data.fix_subsy;
4516       segT sub_symbol_segment;
4517
4518       resolve_symbol_value (t);
4519       sub_symbol_segment = S_GET_SEGMENT (t);
4520       if (sub_symbol_segment == undefined_section)
4521         as_bad_where (fixp->fx_file, fixp->fx_line,
4522                       _("undefined symbol %s in PCR relocation"),
4523                       S_GET_NAME (t));
4524       else
4525         {
4526           reloc->addend = reloc->address & ~0x1F;
4527           reloc->addend -= S_GET_VALUE (t);
4528         }
4529     }
4530   return reloc;
4531 }
4532
4533 /* Convert REGNAME to a DWARF-2 register number.  */
4534
4535 int
4536 tic6x_regname_to_dw2regnum (char *regname)
4537 {
4538   bfd_boolean reg_ok;
4539   tic6x_register reg;
4540   char *rq = regname;
4541
4542   reg_ok = tic6x_parse_register (&rq, &reg);
4543
4544   if (!reg_ok)
4545     return -1;
4546
4547   switch (reg.side)
4548     {
4549     case 1: /* A regs.  */
4550       if (reg.num < 16)
4551         return reg.num;
4552       else if (reg.num < 32)
4553         return (reg.num - 16) + 37;
4554       else
4555         return -1;
4556
4557     case 2: /* B regs.  */
4558       if (reg.num < 16)
4559         return reg.num + 16;
4560       else if (reg.num < 32)
4561         return (reg.num - 16) + 53;
4562       else
4563         return -1;
4564
4565     default:
4566       return -1;
4567     }
4568 }
4569
4570 /* Initialize the DWARF-2 unwind information for this procedure.  */
4571
4572 void
4573 tic6x_frame_initial_instructions (void)
4574 {
4575   /* CFA is initial stack pointer (B15).  */
4576   cfi_add_CFA_def_cfa (31, 0);
4577 }
4578
4579 /* Start an exception table entry.  If idx is nonzero this is an index table
4580    entry.  */
4581
4582 static void
4583 tic6x_start_unwind_section (const segT text_seg, int idx)
4584 {
4585   tic6x_unwind_info *unwind = tic6x_get_unwind ();
4586   const char * text_name;
4587   const char * prefix;
4588   const char * prefix_once;
4589   const char * group_name;
4590   size_t prefix_len;
4591   size_t text_len;
4592   char * sec_name;
4593   size_t sec_name_len;
4594   int type;
4595   int flags;
4596   int linkonce;
4597
4598   if (idx)
4599     {
4600       prefix = ELF_STRING_C6000_unwind;
4601       prefix_once = ELF_STRING_C6000_unwind_once;
4602       type = SHT_C6000_UNWIND;
4603     }
4604   else
4605     {
4606       prefix = ELF_STRING_C6000_unwind_info;
4607       prefix_once = ELF_STRING_C6000_unwind_info_once;
4608       type = SHT_PROGBITS;
4609     }
4610
4611   text_name = segment_name (text_seg);
4612   if (streq (text_name, ".text"))
4613     text_name = "";
4614
4615   if (strncmp (text_name, ".gnu.linkonce.t.",
4616                strlen (".gnu.linkonce.t.")) == 0)
4617     {
4618       prefix = prefix_once;
4619       text_name += strlen (".gnu.linkonce.t.");
4620     }
4621
4622   prefix_len = strlen (prefix);
4623   text_len = strlen (text_name);
4624   sec_name_len = prefix_len + text_len;
4625   sec_name = (char *) xmalloc (sec_name_len + 1);
4626   memcpy (sec_name, prefix, prefix_len);
4627   memcpy (sec_name + prefix_len, text_name, text_len);
4628   sec_name[prefix_len + text_len] = '\0';
4629
4630   flags = SHF_ALLOC;
4631   linkonce = 0;
4632   group_name = 0;
4633
4634   /* Handle COMDAT group.  */
4635   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
4636     {
4637       group_name = elf_group_name (text_seg);
4638       if (group_name == NULL)
4639         {
4640           as_bad (_("group section `%s' has no group signature"),
4641                   segment_name (text_seg));
4642           ignore_rest_of_line ();
4643           return;
4644         }
4645       flags |= SHF_GROUP;
4646       linkonce = 1;
4647     }
4648
4649   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
4650
4651   /* Set the section link for index tables.  */
4652   if (idx)
4653     elf_linked_to_section (now_seg) = text_seg;
4654
4655   seg_info (now_seg)->tc_segment_info_data.text_unwind = unwind;
4656 }
4657
4658
4659 static const int
4660 tic6x_unwind_frame_regs[TIC6X_NUM_UNWIND_REGS] = 
4661 /* A15 B15 B14 B13 B12 B11 B10  B3 A14 A13 A12 A11 A10.  */
4662   { 15, 31, 30, 29, 28, 27, 26, 19, 14, 13, 12, 11, 10 };
4663
4664 /* Register save offsets for __c6xabi_push_rts.  */
4665 static const int
4666 tic6x_pop_rts_offset_little[TIC6X_NUM_UNWIND_REGS] = 
4667 /* A15 B15 B14 B13 B12 B11 B10  B3 A14 A13 A12 A11 A10.  */
4668   { -1,  1,  0, -3, -4, -7, -8,-11, -2, -5, -6, -9,-10};
4669
4670 static const int
4671 tic6x_pop_rts_offset_big[TIC6X_NUM_UNWIND_REGS] = 
4672 /* A15 B15 B14 B13 B12 B11 B10  B3 A14 A13 A12 A11 A10.  */
4673   { -2,  1,  0, -4, -3, -8, -7,-12, -1, -6, -5,-10, -9};
4674
4675 /* Map from dwarf register number to unwind frame register number.  */
4676 static int
4677 tic6x_unwind_reg_from_dwarf (int dwarf)
4678 {
4679   int reg;
4680
4681   for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4682     {
4683       if (tic6x_unwind_frame_regs[reg] == dwarf)
4684         return reg;
4685     }
4686
4687   return -1;
4688 }
4689
4690 /* Unwinding bytecode definitions.  */
4691 #define UNWIND_OP_ADD_SP  0x00
4692 #define UNWIND_OP_ADD_SP2 0xd2
4693 #define UNWIND_OP2_POP 0x8000
4694 #define UNWIND_OP2_POP_COMPACT 0xa000
4695 #define UNWIND_OP_POP_REG 0xc0
4696 #define UNWIND_OP_MV_FP 0xd0
4697 #define UNWIND_OP_POP_RTS 0xd1
4698 #define UNWIND_OP_RET 0xe0
4699
4700 /* Maximum stack adjustment for __c6xabi_unwind_cpp_pr3/4 */
4701 #define MAX_COMPACT_SP_OFFSET (0x7f << 3)
4702
4703 static void
4704 tic6x_flush_unwind_word (valueT data)
4705 {
4706   tic6x_unwind_info *unwind = tic6x_get_unwind ();
4707   char *ptr;
4708
4709   /* Create EXTAB entry if it does not exist.  */
4710   if (unwind->table_entry == NULL)
4711     {
4712       tic6x_start_unwind_section (unwind->saved_seg, 0);
4713       frag_align (2, 0, 0);
4714       record_alignment (now_seg, 2);
4715       unwind->table_entry = expr_build_dot ();
4716       ptr = frag_more (4);
4717       unwind->frag_start = ptr;
4718     }
4719   else
4720     {
4721       /* Append additional word of data.  */
4722       ptr = frag_more (4);
4723     }
4724
4725   md_number_to_chars (ptr, data, 4);
4726 }
4727
4728 /* Add a single byte of unwinding data.  */
4729
4730 static void
4731 tic6x_unwind_byte (int byte)
4732 {
4733   tic6x_unwind_info *unwind = tic6x_get_unwind ();
4734
4735   unwind->data_bytes++;
4736   /* Only flush the first word after we know multiple words are required.  */
4737   if (unwind->data_bytes == 5)
4738     {
4739       if (unwind->personality_index == -1)
4740         {
4741           /* At this point we know we are too big for pr0.  */
4742           unwind->personality_index = 1;
4743           tic6x_flush_unwind_word (0x81000000 | ((unwind->data >> 8) & 0xffff));
4744           unwind->data = ((unwind->data & 0xff) << 8) | byte;
4745           unwind->data_bytes++;
4746         }
4747       else
4748         {
4749           tic6x_flush_unwind_word (unwind->data);
4750           unwind->data = byte;
4751         }
4752     }
4753   else
4754     {
4755       unwind->data = (unwind->data << 8) | byte;
4756       if ((unwind->data_bytes & 3) == 0 && unwind->data_bytes > 4)
4757         {
4758           tic6x_flush_unwind_word (unwind->data);
4759           unwind->data = 0;
4760         }
4761     }
4762 }
4763
4764 /* Add a two-byte unwinding opcode.  */
4765 static void
4766 tic6x_unwind_2byte (int bytes)
4767 {
4768   tic6x_unwind_byte (bytes >> 8);
4769   tic6x_unwind_byte (bytes & 0xff);
4770 }
4771
4772 static void
4773 tic6x_unwind_uleb (offsetT offset)
4774 {
4775   while (offset > 0x7f)
4776     {
4777       tic6x_unwind_byte ((offset & 0x7f) | 0x80);
4778       offset >>= 7;
4779     }
4780   tic6x_unwind_byte (offset);
4781 }
4782
4783 void
4784 tic6x_cfi_startproc (void)
4785 {
4786   tic6x_unwind_info *unwind = tic6x_get_unwind ();
4787
4788   unwind->personality_index = -1;
4789   unwind->personality_routine = NULL;
4790   if (unwind->table_entry)
4791     as_bad (_("missing .endp before .cfi_startproc"));
4792
4793   unwind->table_entry = NULL;
4794   unwind->data_bytes = -1;
4795 }
4796
4797 static void
4798 tic6x_output_exidx_entry (void)
4799 {
4800   char *ptr;
4801   long where;
4802   unsigned int marked_pr_dependency;
4803   segT old_seg;
4804   subsegT old_subseg;
4805   tic6x_unwind_info *unwind = tic6x_get_unwind ();
4806
4807   old_seg = now_seg;
4808   old_subseg = now_subseg;
4809
4810   /* Add index table entry.  This is two words.  */
4811   tic6x_start_unwind_section (unwind->saved_seg, 1);
4812   frag_align (2, 0, 0);
4813   record_alignment (now_seg, 2);
4814
4815   ptr = frag_more (8);
4816   where = frag_now_fix () - 8;
4817
4818   /* Self relative offset of the function start.  */
4819   fix_new (frag_now, where, 4, unwind->function_start, 0, 1,
4820            BFD_RELOC_C6000_PREL31);
4821
4822   /* Indicate dependency on ABI-defined personality routines to the
4823      linker, if it hasn't been done already.  */
4824   marked_pr_dependency
4825     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
4826   if (unwind->personality_index >= 0 && unwind->personality_index < 5
4827       && !(marked_pr_dependency & (1 << unwind->personality_index)))
4828     {
4829       static const char *const name[] =
4830         {
4831           "__c6xabi_unwind_cpp_pr0",
4832           "__c6xabi_unwind_cpp_pr1",
4833           "__c6xabi_unwind_cpp_pr2",
4834           "__c6xabi_unwind_cpp_pr3",
4835           "__c6xabi_unwind_cpp_pr4"
4836         };
4837       symbolS *pr = symbol_find_or_make (name[unwind->personality_index]);
4838       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
4839       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
4840         |= 1 << unwind->personality_index;
4841     }
4842
4843   if (unwind->table_entry)
4844     {
4845       /* Self relative offset of the table entry.        */
4846       fix_new (frag_now, where + 4, 4, unwind->table_entry, 0, 1,
4847                BFD_RELOC_C6000_PREL31);
4848     }
4849   else
4850     {
4851       /* Inline exception table entry.  */
4852       md_number_to_chars (ptr + 4, unwind->data, 4);
4853     }
4854
4855   /* Restore the original section.  */
4856   subseg_set (old_seg, old_subseg);
4857 }
4858
4859 static void
4860 tic6x_output_unwinding (bfd_boolean need_extab)
4861 {
4862   tic6x_unwind_info *unwind = tic6x_get_unwind ();
4863   unsigned safe_mask = unwind->safe_mask;
4864   unsigned compact_mask = unwind->compact_mask;
4865   unsigned reg_saved_mask = unwind->reg_saved_mask;
4866   offsetT cfa_offset = unwind->cfa_offset;
4867   long where;
4868   int reg;
4869
4870   if (unwind->personality_index == -2)
4871     {
4872       /* Function can not be unwound.  */
4873       unwind->data = 1;
4874       tic6x_output_exidx_entry ();
4875       return;
4876     }
4877
4878   if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
4879     {
4880       /* Auto-select a personality routine if none specified.  */
4881       if (reg_saved_mask || cfa_offset >= MAX_COMPACT_SP_OFFSET)
4882         unwind->personality_index = -1;
4883       else if (safe_mask)
4884         unwind->personality_index = 3;
4885       else
4886         unwind->personality_index = 4;
4887     }
4888
4889   /* Calculate unwinding opcodes, and emit to EXTAB if necessary.  */
4890   unwind->table_entry = NULL;
4891   if (unwind->personality_index == 3 || unwind->personality_index == 4)
4892     {
4893       if (cfa_offset >= MAX_COMPACT_SP_OFFSET)
4894         {
4895           as_bad (_("stack pointer offset too large for personality routine"));
4896           return;
4897         }
4898       if (reg_saved_mask
4899           || (unwind->personality_index == 3 && compact_mask != 0)
4900           || (unwind->personality_index == 4 && safe_mask != 0))
4901         {
4902           as_bad (_("stack frame layout does not match personality routine"));
4903           return;
4904         }
4905
4906       unwind->data = (1u << 31) | (unwind->personality_index << 24);
4907       if (unwind->cfa_reg == 15)
4908         unwind->data |= 0x7f << 17;
4909       else
4910         unwind->data |= cfa_offset << (17 - 3);
4911
4912       if (unwind->personality_index == 3)
4913         unwind->data |= safe_mask << 4;
4914       else
4915         unwind->data |= compact_mask << 4;
4916       unwind->data |= unwind->return_reg;
4917       unwind->data_bytes = 4;
4918     }
4919   else
4920     {
4921       if (unwind->personality_routine)
4922         {
4923           unwind->data = 0;
4924           unwind->data_bytes = 5;
4925           tic6x_flush_unwind_word (0);
4926           /* First word is personality routine.  */
4927           where = frag_now_fix () - 4;
4928           fix_new (frag_now, where, 4, unwind->personality_routine, 0, 1,
4929                    BFD_RELOC_C6000_PREL31);
4930         }
4931       else if (unwind->personality_index > 0)
4932         {
4933           unwind->data = 0x8000 | (unwind->personality_index << 8);
4934           unwind->data_bytes = 2;
4935         }
4936       else /* pr0 or undecided */
4937         {
4938           unwind->data = 0x80;
4939           unwind->data_bytes = 1;
4940         }
4941
4942       if (unwind->return_reg != UNWIND_B3)
4943         {
4944           tic6x_unwind_byte (UNWIND_OP_RET | unwind->return_reg);
4945         }
4946
4947       if (unwind->cfa_reg == 15)
4948         {
4949           tic6x_unwind_byte (UNWIND_OP_MV_FP);
4950         }
4951       else if (cfa_offset != 0)
4952         {
4953           cfa_offset >>= 3;
4954           if (cfa_offset > 0x80)
4955             {
4956               tic6x_unwind_byte (UNWIND_OP_ADD_SP2);
4957               tic6x_unwind_uleb (cfa_offset - 0x81);
4958             }
4959           else if (cfa_offset > 0x40)
4960             {
4961               tic6x_unwind_byte (UNWIND_OP_ADD_SP | 0x3f);
4962               tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 0x40));
4963             }
4964           else
4965             {
4966               tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 1));
4967             }
4968         }
4969
4970       if (safe_mask)
4971         tic6x_unwind_2byte (UNWIND_OP2_POP | unwind->safe_mask);
4972       else if (unwind->pop_rts)
4973         tic6x_unwind_byte (UNWIND_OP_POP_RTS);
4974       else if (compact_mask)
4975         tic6x_unwind_2byte (UNWIND_OP2_POP_COMPACT | unwind->compact_mask);
4976       else if (reg_saved_mask)
4977         {
4978           offsetT cur_offset;
4979           int val;
4980           int last_val;
4981
4982           tic6x_unwind_byte (UNWIND_OP_POP_REG | unwind->saved_reg_count);
4983           last_val = 0;
4984           for (cur_offset = 0; unwind->saved_reg_count > 0; cur_offset -= 4)
4985             {
4986               val = 0xf;
4987               for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4988                 {
4989                   if (!unwind->reg_saved[reg])
4990                     continue;
4991
4992                   if (unwind->reg_offset[reg] == cur_offset)
4993                     {
4994                       unwind->saved_reg_count--;
4995                       val = reg;
4996                       break;
4997                     }
4998                 }
4999               if ((cur_offset & 4) == 4)
5000                 tic6x_unwind_byte ((last_val << 4) | val);
5001               else
5002                 last_val = val;
5003             }
5004           if ((cur_offset & 4) == 4)
5005             tic6x_unwind_byte ((last_val << 4) | 0xf);
5006         }
5007
5008       /* Pad with RETURN opcodes.  */
5009       while ((unwind->data_bytes & 3) != 0)
5010         tic6x_unwind_byte (UNWIND_OP_RET | UNWIND_B3);
5011
5012       if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
5013         unwind->personality_index = 0;
5014     }
5015
5016   /* Force creation of an EXTAB entry if an LSDA is required.  */
5017   if (need_extab && !unwind->table_entry)
5018     {
5019       if (unwind->data_bytes != 4)
5020         abort ();
5021
5022       tic6x_flush_unwind_word (unwind->data);
5023     }
5024   else if (unwind->table_entry && !need_extab)
5025     {
5026       /* Add an empty descriptor if there is no user-specified data.   */
5027       char *ptr = frag_more (4);
5028       md_number_to_chars (ptr, 0, 4);
5029     }
5030
5031   /* Fill in length of unwinding bytecode.  */
5032   if (unwind->table_entry)
5033     {
5034       valueT tmp;
5035       if (unwind->data_bytes > 0x400)
5036         as_bad (_("too many unwinding instructions"));
5037
5038       if (unwind->personality_index == -1)
5039         {
5040           tmp = md_chars_to_number (unwind->frag_start + 4, 4);
5041           tmp |= ((unwind->data_bytes - 8) >> 2) << 24;
5042           md_number_to_chars (unwind->frag_start + 4, tmp, 4);
5043         }
5044       else if (unwind->personality_index == 1 || unwind->personality_index == 2)
5045         {
5046           tmp = md_chars_to_number (unwind->frag_start, 4);
5047           tmp |= ((unwind->data_bytes - 4) >> 2) << 16;
5048           md_number_to_chars (unwind->frag_start, tmp, 4);
5049         }
5050     }
5051   tic6x_output_exidx_entry ();
5052 }
5053
5054 /* FIXME: This will get horribly confused if cfi directives are emitted for
5055    function epilogue.  */
5056 void
5057 tic6x_cfi_endproc (struct fde_entry *fde)
5058 {
5059   tic6x_unwind_info *unwind = tic6x_get_unwind ();
5060   struct cfi_insn_data *insn;
5061   int reg;
5062   unsigned safe_mask = 0;
5063   unsigned compact_mask = 0;
5064   unsigned reg_saved_mask = 0;
5065   offsetT cfa_offset = 0;
5066   offsetT save_offset = 0;
5067
5068   unwind->cfa_reg = 31;
5069   unwind->return_reg = UNWIND_B3;
5070   unwind->saved_reg_count = 0;
5071   unwind->pop_rts = FALSE;
5072
5073   unwind->saved_seg = now_seg;
5074   unwind->saved_subseg = now_subseg;
5075
5076   for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5077     unwind->reg_saved[reg] = FALSE;
5078
5079   /* Scan FDE instructions to build up stack frame layout.  */
5080   for (insn = fde->data; insn; insn = insn->next)
5081     {
5082       switch (insn->insn)
5083         {
5084         case DW_CFA_advance_loc:
5085           break;
5086
5087         case DW_CFA_def_cfa:
5088           unwind->cfa_reg = insn->u.ri.reg;
5089           cfa_offset = insn->u.ri.offset;
5090           break;
5091
5092         case DW_CFA_def_cfa_register:
5093           unwind->cfa_reg = insn->u.r;
5094           break;
5095
5096         case DW_CFA_def_cfa_offset:
5097           cfa_offset = insn->u.i;
5098           break;
5099
5100         case DW_CFA_undefined:
5101         case DW_CFA_same_value:
5102           reg = tic6x_unwind_reg_from_dwarf (insn->u.r);
5103           if (reg >= 0)
5104             unwind->reg_saved[reg] = FALSE;
5105           break;
5106
5107         case DW_CFA_offset:
5108           reg = tic6x_unwind_reg_from_dwarf (insn->u.ri.reg);
5109           if (reg < 0)
5110             {
5111               as_bad (_("unable to generate unwinding opcode for reg %d"),
5112                       insn->u.ri.reg);
5113               return;
5114             }
5115           unwind->reg_saved[reg] = TRUE;
5116           unwind->reg_offset[reg] = insn->u.ri.offset;
5117           if (insn->u.ri.reg == UNWIND_B3)
5118             unwind->return_reg = UNWIND_B3;
5119           break;
5120
5121         case DW_CFA_register:
5122           if (insn->u.rr.reg1 != 19)
5123             {
5124               as_bad (_("unable to generate unwinding opcode for reg %d"),
5125                       insn->u.rr.reg1);
5126               return;
5127             }
5128
5129           reg = tic6x_unwind_reg_from_dwarf (insn->u.rr.reg2);
5130           if (reg < 0)
5131             {
5132               as_bad (_("unable to generate unwinding opcode for reg %d"),
5133                       insn->u.rr.reg2);
5134               return;
5135             }
5136
5137           unwind->return_reg = reg;
5138           unwind->reg_saved[UNWIND_B3] = FALSE;
5139           if (unwind->reg_saved[reg])
5140             {
5141               as_bad (_("unable to restore return address from "
5142                         "previously restored reg"));
5143               return;
5144             }
5145           break;
5146
5147         case DW_CFA_restore:
5148         case DW_CFA_remember_state:
5149         case DW_CFA_restore_state:
5150         case DW_CFA_GNU_window_save:
5151         case CFI_escape:
5152         case CFI_val_encoded_addr:
5153           as_bad (_("unhandled CFA insn for unwinding (%d)"), insn->insn);
5154           break;
5155
5156         default:
5157           abort ();
5158         }
5159     }
5160
5161   if (unwind->cfa_reg != 15 && unwind->cfa_reg != 31)
5162     {
5163       as_bad (_("unable to generate unwinding opcode for frame pointer reg %d"),
5164               unwind->cfa_reg);
5165       return;
5166     }
5167
5168   if (unwind->cfa_reg == 15)
5169     {
5170       if (cfa_offset != 0)
5171         {
5172           as_bad (_("unable to generate unwinding opcode for "
5173                     "frame pointer offset"));
5174           return;
5175         }
5176     }
5177   else
5178     {
5179       if ((cfa_offset & 7) != 0)
5180         {
5181           as_bad (_("unwound stack pointer not doubleword aligned"));
5182           return;
5183         }
5184     }
5185
5186   for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5187     {
5188       if (unwind->reg_saved[reg])
5189         reg_saved_mask |= 1 << (TIC6X_NUM_UNWIND_REGS - (reg + 1));
5190     }
5191
5192   /* Check for standard "safe debug" frame layout */
5193   if (reg_saved_mask)
5194     {
5195       save_offset = 0;
5196       for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5197         {
5198           if (!unwind->reg_saved[reg])
5199             continue;
5200
5201           if (target_big_endian
5202               && reg < TIC6X_NUM_UNWIND_REGS - 1
5203               && unwind->reg_saved[reg + 1]
5204               && tic6x_unwind_frame_regs[reg]
5205                   == tic6x_unwind_frame_regs[reg + 1] + 1
5206               && (tic6x_unwind_frame_regs[reg] & 1) == 1
5207               && (save_offset & 4) == 4)
5208             {
5209               /* Swapped pair */
5210               if (save_offset != unwind->reg_offset[reg + 1]
5211                   || save_offset - 4 != unwind->reg_offset[reg])
5212                 break;
5213               save_offset -= 8;
5214               reg++;
5215             }
5216           else
5217             {
5218               if (save_offset != unwind->reg_offset[reg])
5219                 break;
5220               save_offset -= 4;
5221             }
5222         }
5223       if (reg == TIC6X_NUM_UNWIND_REGS)
5224         {
5225           safe_mask = reg_saved_mask;
5226           reg_saved_mask = 0;
5227         }
5228     }
5229
5230   /* Check for compact frame layout.  */
5231   if (reg_saved_mask)
5232     {
5233       save_offset = 0;
5234       for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5235         {
5236           int reg2;
5237
5238           if (!unwind->reg_saved[reg])
5239             continue;
5240
5241           if (reg < TIC6X_NUM_UNWIND_REGS - 1)
5242             {
5243               reg2 = reg + 1;
5244
5245               if (!unwind->reg_saved[reg2]
5246                   || tic6x_unwind_frame_regs[reg]
5247                       != tic6x_unwind_frame_regs[reg2] + 1
5248                   || (tic6x_unwind_frame_regs[reg2] & 1) != 0
5249                   || save_offset == 0)
5250                 reg2 = -1;
5251             }
5252           else
5253             reg2 = -1;
5254
5255           if (reg2 >= 0)
5256             {
5257               int high_offset;
5258               if (target_big_endian)
5259                 high_offset = 4; /* lower address = positive stack offset.  */
5260               else
5261                 high_offset = 0;
5262
5263               if (save_offset + 4 - high_offset != unwind->reg_offset[reg]
5264                   || save_offset + high_offset != unwind->reg_offset[reg2])
5265                 {
5266                   break;
5267                 }
5268               reg++;
5269             }
5270           else
5271             {
5272               if (save_offset != unwind->reg_offset[reg])
5273                 break;
5274             }
5275           save_offset -= 8;
5276         }
5277
5278       if (reg == TIC6X_NUM_UNWIND_REGS)
5279         {
5280           compact_mask = reg_saved_mask;
5281           reg_saved_mask = 0;
5282         }
5283     }
5284
5285   /* Check for __c6xabi_pop_rts format */
5286   if (reg_saved_mask == 0x17ff)
5287     {
5288       const int *pop_rts_offset = target_big_endian
5289                                 ? tic6x_pop_rts_offset_big
5290                                 : tic6x_pop_rts_offset_little;
5291
5292       save_offset = 0;
5293       for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5294         {
5295           if (reg == UNWIND_B15)
5296             continue;
5297
5298           if (unwind->reg_offset[reg] != pop_rts_offset[reg] * 4)
5299             break;
5300         }
5301
5302       if (reg == TIC6X_NUM_UNWIND_REGS)
5303         {
5304           unwind->pop_rts = TRUE;
5305           reg_saved_mask = 0;
5306         }
5307     }
5308   /* If all else fails then describe the frame manually.  */
5309   if (reg_saved_mask)
5310     {
5311       save_offset = 0;
5312
5313       for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5314         {
5315           if (!unwind->reg_saved[reg])
5316             continue;
5317
5318           unwind->saved_reg_count++;
5319           /* Encoding uses 4 bits per word, so size of unwinding opcode data 
5320              limits the save area size.  The exact cap will be figured out
5321              later due to overflow, the 0x800 here is just a quick sanity
5322              check to weed out obviously excessive offsets.  */
5323           if (unwind->reg_offset[reg] > 0 || unwind->reg_offset[reg] < -0x800
5324               || (unwind->reg_offset[reg] & 3) != 0)
5325             {
5326               as_bad (_("stack frame layout too complex for unwinder"));
5327               return;
5328             }
5329
5330           if (unwind->reg_offset[reg] < save_offset)
5331             save_offset = unwind->reg_offset[reg] - 4;
5332         }
5333     }
5334
5335   /* Align to 8-byte boundary (stack grows towards negative offsets).  */
5336   save_offset &= ~7;
5337
5338   if (unwind->cfa_reg == 31 && !reg_saved_mask)
5339     {
5340       cfa_offset += save_offset;
5341       if (cfa_offset < 0)
5342         {
5343           as_bad (_("unwound frame has negative size"));
5344           return;
5345         }
5346     }
5347
5348   unwind->safe_mask = safe_mask;
5349   unwind->compact_mask = compact_mask;
5350   unwind->reg_saved_mask = reg_saved_mask;
5351   unwind->cfa_offset = cfa_offset;
5352   unwind->function_start = fde->start_address;
5353 }