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