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