Home | History | Annotate | Line # | Download | only in config
tc-cr16.c revision 1.1.1.5.12.1
      1 /* tc-cr16.c -- Assembler code for the CR16 CPU core.
      2    Copyright (C) 2007-2018 Free Software Foundation, Inc.
      3 
      4    Contributed by M R Swami Reddy <MR.Swami.Reddy (at) nsc.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
     20    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 #include "as.h"
     24 #include "safe-ctype.h"
     25 #include "dwarf2dbg.h"
     26 #include "opcode/cr16.h"
     27 #include "elf/cr16.h"
     28 
     29 
     30 /* Word is considered here as a 16-bit unsigned short int.  */
     31 #define WORD_SHIFT  16
     32 
     33 /* Register is 2-byte size.  */
     34 #define REG_SIZE   2
     35 
     36 /* Maximum size of a single instruction (in words).  */
     37 #define INSN_MAX_SIZE   3
     38 
     39 /* Maximum bits which may be set in a `mask16' operand.  */
     40 #define MAX_REGS_IN_MASK16  8
     41 
     42 /* Assign a number NUM, shifted by SHIFT bytes, into a location
     43    pointed by index BYTE of array 'output_opcode'.  */
     44 #define CR16_PRINT(BYTE, NUM, SHIFT)   output_opcode[BYTE] |= (NUM << SHIFT)
     45 
     46 /* Operand errors.  */
     47 typedef enum
     48   {
     49     OP_LEGAL = 0,       /* Legal operand.  */
     50     OP_OUT_OF_RANGE,    /* Operand not within permitted range.  */
     51     OP_NOT_EVEN         /* Operand is Odd number, should be even.  */
     52   }
     53 op_err;
     54 
     55 /* Opcode mnemonics hash table.  */
     56 static struct hash_control *cr16_inst_hash;
     57 /* CR16 registers hash table.  */
     58 static struct hash_control *reg_hash;
     59 /* CR16 register pair hash table.  */
     60 static struct hash_control *regp_hash;
     61 /* CR16 processor registers hash table.  */
     62 static struct hash_control *preg_hash;
     63 /* CR16 processor registers 32 bit hash table.  */
     64 static struct hash_control *pregp_hash;
     65 /* Current instruction we're assembling.  */
     66 const inst *instruction;
     67 
     68 
     69 static int code_label = 0;
     70 
     71 /* Global variables.  */
     72 
     73 /* Array to hold an instruction encoding.  */
     74 long output_opcode[2];
     75 
     76 /* Nonzero means a relocatable symbol.  */
     77 int relocatable;
     78 
     79 /* A copy of the original instruction (used in error messages).  */
     80 char ins_parse[MAX_INST_LEN];
     81 
     82 /* The current processed argument number.  */
     83 int cur_arg_num;
     84 
     85 /* Generic assembler global variables which must be defined by all targets.  */
     86 
     87 /* Characters which always start a comment.  */
     88 const char comment_chars[] = "#";
     89 
     90 /* Characters which start a comment at the beginning of a line.  */
     91 const char line_comment_chars[] = "#";
     92 
     93 /* This array holds machine specific line separator characters.  */
     94 const char line_separator_chars[] = ";";
     95 
     96 /* Chars that can be used to separate mant from exp in floating point nums.  */
     97 const char EXP_CHARS[] = "eE";
     98 
     99 /* Chars that mean this number is a floating point constant as in 0f12.456  */
    100 const char FLT_CHARS[] = "f'";
    101 
    102 #ifdef OBJ_ELF
    103 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
    104 symbolS * GOT_symbol;
    105 #endif
    106 
    107 /* Target-specific multicharacter options, not const-declared at usage.  */
    108 const char *md_shortopts = "";
    109 struct option md_longopts[] =
    110 {
    111   {NULL, no_argument, NULL, 0}
    112 };
    113 size_t md_longopts_size = sizeof (md_longopts);
    114 
    115 static void
    116 l_cons (int nbytes)
    117 {
    118   int c;
    119   expressionS exp;
    120 
    121 #ifdef md_flush_pending_output
    122     md_flush_pending_output ();
    123 #endif
    124 
    125   if (is_it_end_of_statement ())
    126     {
    127       demand_empty_rest_of_line ();
    128       return;
    129     }
    130 
    131 #ifdef TC_ADDRESS_BYTES
    132   if (nbytes == 0)
    133     nbytes = TC_ADDRESS_BYTES ();
    134 #endif
    135 
    136 #ifdef md_cons_align
    137   md_cons_align (nbytes);
    138 #endif
    139 
    140   c = 0;
    141   do
    142     {
    143       unsigned int bits_available = BITS_PER_CHAR * nbytes;
    144       char *hold = input_line_pointer;
    145 
    146       expression (&exp);
    147 
    148       if (*input_line_pointer == ':')
    149         {
    150           /* Bitfields.  */
    151           long value = 0;
    152 
    153           for (;;)
    154             {
    155               unsigned long width;
    156 
    157               if (*input_line_pointer != ':')
    158                 {
    159                   input_line_pointer = hold;
    160                   break;
    161                 }
    162               if (exp.X_op == O_absent)
    163                 {
    164                   as_warn (_("using a bit field width of zero"));
    165                   exp.X_add_number = 0;
    166                   exp.X_op = O_constant;
    167                 }
    168 
    169               if (exp.X_op != O_constant)
    170                 {
    171                   *input_line_pointer = '\0';
    172                   as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
    173                   *input_line_pointer = ':';
    174                   demand_empty_rest_of_line ();
    175                   return;
    176                 }
    177 
    178               if ((width = exp.X_add_number) >
    179                   (unsigned int)(BITS_PER_CHAR * nbytes))
    180                 {
    181 		  as_warn (ngettext ("field width %lu too big to fit in %d"
    182 				     " byte: truncated to %d bits",
    183 				     "field width %lu too big to fit in %d"
    184 				     " bytes: truncated to %d bits",
    185 				     nbytes),
    186 			   width, nbytes, (BITS_PER_CHAR * nbytes));
    187                   width = BITS_PER_CHAR * nbytes;
    188                 }                   /* Too big.  */
    189 
    190 
    191               if (width > bits_available)
    192                 {
    193                   /* FIXME-SOMEDAY: backing up and reparsing is wasteful.  */
    194                   input_line_pointer = hold;
    195                   exp.X_add_number = value;
    196                   break;
    197                 }
    198 
    199               /* Skip ':'.  */
    200               hold = ++input_line_pointer;
    201 
    202               expression (&exp);
    203               if (exp.X_op != O_constant)
    204                 {
    205                   char cache = *input_line_pointer;
    206 
    207                   *input_line_pointer = '\0';
    208                   as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
    209                   *input_line_pointer = cache;
    210                   demand_empty_rest_of_line ();
    211                   return;
    212                 }
    213 
    214               value |= ((~(-(1 << width)) & exp.X_add_number)
    215                         << ((BITS_PER_CHAR * nbytes) - bits_available));
    216 
    217               if ((bits_available -= width) == 0
    218                   || is_it_end_of_statement ()
    219                   || *input_line_pointer != ',')
    220                 break;
    221 
    222               hold = ++input_line_pointer;
    223               expression (&exp);
    224             }
    225 
    226           exp.X_add_number = value;
    227           exp.X_op = O_constant;
    228           exp.X_unsigned = 1;
    229         }
    230 
    231       if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
    232         code_label = 1;
    233       emit_expr (&exp, (unsigned int) nbytes);
    234       ++c;
    235       if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
    236         {
    237           input_line_pointer +=3;
    238           break;
    239         }
    240     }
    241   while ((*input_line_pointer++ == ','));
    242 
    243   /* Put terminator back into stream.  */
    244   input_line_pointer--;
    245 
    246   demand_empty_rest_of_line ();
    247 }
    248 
    249 /* This table describes all the machine specific pseudo-ops
    250    the assembler has to support.  The fields are:
    251    *** Pseudo-op name without dot.
    252    *** Function to call to execute this pseudo-op.
    253    *** Integer arg to pass to the function.  */
    254 
    255 const pseudo_typeS md_pseudo_table[] =
    256 {
    257   /* In CR16 machine, align is in bytes (not a ptwo boundary).  */
    258   {"align", s_align_bytes, 0},
    259   {"long", l_cons,  4 },
    260   {"4byte", l_cons, 4 },
    261   {0, 0, 0}
    262 };
    263 
    264 /* CR16 relaxation table.  */
    265 const relax_typeS md_relax_table[] =
    266 {
    267   /* bCC  */
    268   {0x7f, -0x80, 2, 1},                  /*  8 */
    269   {0xfffe, -0x10000, 4, 2},             /* 16 */
    270   {0xfffffe, -0x1000000, 6, 0},         /* 24 */
    271 };
    272 
    273 /* Return the bit size for a given operand.  */
    274 
    275 static int
    276 get_opbits (operand_type op)
    277 {
    278   if (op < MAX_OPRD)
    279     return cr16_optab[op].bit_size;
    280 
    281   return 0;
    282 }
    283 
    284 /* Return the argument type of a given operand.  */
    285 
    286 static argtype
    287 get_optype (operand_type op)
    288 {
    289   if (op < MAX_OPRD)
    290     return cr16_optab[op].arg_type;
    291   else
    292     return nullargs;
    293 }
    294 
    295 /* Return the flags of a given operand.  */
    296 
    297 static int
    298 get_opflags (operand_type op)
    299 {
    300   if (op < MAX_OPRD)
    301     return cr16_optab[op].flags;
    302 
    303   return 0;
    304 }
    305 
    306 /* Get the cc code.  */
    307 
    308 static int
    309 get_cc (char *cc_name)
    310 {
    311    unsigned int i;
    312 
    313    for (i = 0; i < cr16_num_cc; i++)
    314      if (strcmp (cc_name, cr16_b_cond_tab[i]) == 0)
    315        return i;
    316 
    317    return -1;
    318 }
    319 
    320 /* Get the core processor register 'reg_name'.  */
    321 
    322 static reg
    323 get_register (char *reg_name)
    324 {
    325   const reg_entry *rreg;
    326 
    327   rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
    328 
    329   if (rreg != NULL)
    330     return rreg->value.reg_val;
    331 
    332   return nullregister;
    333 }
    334 /* Get the core processor register-pair 'reg_name'.  */
    335 
    336 static reg
    337 get_register_pair (char *reg_name)
    338 {
    339   const reg_entry *rreg;
    340   char tmp_rp[16]="\0";
    341 
    342   /* Add '(' and ')' to the reg pair, if it's not present.  */
    343   if (reg_name[0] != '(')
    344     {
    345       tmp_rp[0] = '(';
    346       strcat (tmp_rp, reg_name);
    347       strcat (tmp_rp,")");
    348       rreg = (const reg_entry *) hash_find (regp_hash, tmp_rp);
    349     }
    350   else
    351     rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
    352 
    353   if (rreg != NULL)
    354     return rreg->value.reg_val;
    355 
    356   return nullregister;
    357 }
    358 
    359 /* Get the index register 'reg_name'.  */
    360 
    361 static reg
    362 get_index_register (char *reg_name)
    363 {
    364   const reg_entry *rreg;
    365 
    366   rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
    367 
    368   if ((rreg != NULL)
    369       && ((rreg->value.reg_val == 12) || (rreg->value.reg_val == 13)))
    370     return rreg->value.reg_val;
    371 
    372   return nullregister;
    373 }
    374 /* Get the core processor index register-pair 'reg_name'.  */
    375 
    376 static reg
    377 get_index_register_pair (char *reg_name)
    378 {
    379   const reg_entry *rreg;
    380 
    381   rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
    382 
    383   if (rreg != NULL)
    384     {
    385       if ((rreg->value.reg_val != 1) || (rreg->value.reg_val != 7)
    386           || (rreg->value.reg_val != 9) || (rreg->value.reg_val > 10))
    387         return rreg->value.reg_val;
    388 
    389       as_bad (_("Unknown register pair - index relative mode: `%d'"), rreg->value.reg_val);
    390     }
    391 
    392   return nullregister;
    393 }
    394 
    395 /* Get the processor register 'preg_name'.  */
    396 
    397 static preg
    398 get_pregister (char *preg_name)
    399 {
    400   const reg_entry *prreg;
    401 
    402   prreg = (const reg_entry *) hash_find (preg_hash, preg_name);
    403 
    404   if (prreg != NULL)
    405     return prreg->value.preg_val;
    406 
    407   return nullpregister;
    408 }
    409 
    410 /* Get the processor register 'preg_name 32 bit'.  */
    411 
    412 static preg
    413 get_pregisterp (char *preg_name)
    414 {
    415   const reg_entry *prreg;
    416 
    417   prreg = (const reg_entry *) hash_find (pregp_hash, preg_name);
    418 
    419   if (prreg != NULL)
    420     return prreg->value.preg_val;
    421 
    422   return nullpregister;
    423 }
    424 
    425 
    426 /* Round up a section size to the appropriate boundary.  */
    427 
    428 valueT
    429 md_section_align (segT seg, valueT val)
    430 {
    431   /* Round .text section to a multiple of 2.  */
    432   if (seg == text_section)
    433     return (val + 1) & ~1;
    434   return val;
    435 }
    436 
    437 /* Parse an operand that is machine-specific (remove '*').  */
    438 
    439 void
    440 md_operand (expressionS * exp)
    441 {
    442   char c = *input_line_pointer;
    443 
    444   switch (c)
    445     {
    446     case '*':
    447       input_line_pointer++;
    448       expression (exp);
    449       break;
    450     default:
    451       break;
    452     }
    453 }
    454 
    455 /* Reset global variables before parsing a new instruction.  */
    456 
    457 static void
    458 reset_vars (char *op)
    459 {
    460   cur_arg_num = relocatable = 0;
    461   memset (& output_opcode, '\0', sizeof (output_opcode));
    462 
    463   /* Save a copy of the original OP (used in error messages).  */
    464   strncpy (ins_parse, op, sizeof ins_parse - 1);
    465   ins_parse [sizeof ins_parse - 1] = 0;
    466 }
    467 
    468 /* This macro decides whether a particular reloc is an entry in a
    469    switch table.  It is used when relaxing, because the linker needs
    470    to know about all such entries so that it can adjust them if
    471    necessary.  */
    472 
    473 #define SWITCH_TABLE(fix)                                  \
    474   (   (fix)->fx_addsy != NULL                              \
    475    && (fix)->fx_subsy != NULL                              \
    476    && S_GET_SEGMENT ((fix)->fx_addsy) ==                   \
    477       S_GET_SEGMENT ((fix)->fx_subsy)                      \
    478    && S_GET_SEGMENT (fix->fx_addsy) != undefined_section   \
    479    && (   (fix)->fx_r_type == BFD_RELOC_CR16_NUM8          \
    480        || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16         \
    481        || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32         \
    482        || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
    483 
    484 /* See whether we need to force a relocation into the output file.
    485    This is used to force out switch and PC relative relocations when
    486    relaxing.  */
    487 
    488 int
    489 cr16_force_relocation (fixS *fix)
    490 {
    491   if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
    492     return 1;
    493 
    494   return 0;
    495 }
    496 
    497 /* Record a fixup for a cons expression.  */
    498 
    499 void
    500 cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp,
    501 		   bfd_reloc_code_real_type rtype)
    502 {
    503   switch (len)
    504     {
    505     default: rtype = BFD_RELOC_NONE; break;
    506     case 1: rtype = BFD_RELOC_CR16_NUM8 ; break;
    507     case 2: rtype = BFD_RELOC_CR16_NUM16; break;
    508     case 4:
    509       if (code_label)
    510         {
    511           rtype = BFD_RELOC_CR16_NUM32a;
    512           code_label = 0;
    513         }
    514       else
    515         rtype = BFD_RELOC_CR16_NUM32;
    516       break;
    517     }
    518 
    519   fix_new_exp (frag, offset, len, exp, 0, rtype);
    520 }
    521 
    522 /* Generate a relocation entry for a fixup.  */
    523 
    524 arelent *
    525 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
    526 {
    527   arelent * reloc;
    528 
    529   /* If symbols are local and resolved, then no relocation needed.  */
    530   if ( ((fixP->fx_addsy)
    531         && (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
    532        || ((fixP->fx_subsy)
    533 	   && (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)))
    534      return NULL;
    535 
    536   reloc = XNEW (arelent);
    537   reloc->sym_ptr_ptr  = XNEW (asymbol *);
    538   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
    539   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
    540   reloc->addend = fixP->fx_offset;
    541 
    542   if (fixP->fx_subsy != NULL)
    543     {
    544       if (SWITCH_TABLE (fixP))
    545         {
    546           /* Keep the current difference in the addend.  */
    547           reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
    548                            - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
    549 
    550           switch (fixP->fx_r_type)
    551             {
    552             case BFD_RELOC_CR16_NUM8:
    553               fixP->fx_r_type = BFD_RELOC_CR16_SWITCH8;
    554               break;
    555             case BFD_RELOC_CR16_NUM16:
    556               fixP->fx_r_type = BFD_RELOC_CR16_SWITCH16;
    557               break;
    558             case BFD_RELOC_CR16_NUM32:
    559               fixP->fx_r_type = BFD_RELOC_CR16_SWITCH32;
    560               break;
    561             case BFD_RELOC_CR16_NUM32a:
    562               fixP->fx_r_type = BFD_RELOC_CR16_NUM32a;
    563               break;
    564             default:
    565               abort ();
    566               break;
    567             }
    568         }
    569       else
    570         {
    571           /* We only resolve difference expressions in the same section.  */
    572           as_bad_where (fixP->fx_file, fixP->fx_line,
    573                         _("can't resolve `%s' {%s section} - `%s' {%s section}"),
    574                         fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
    575                         segment_name (fixP->fx_addsy
    576                                       ? S_GET_SEGMENT (fixP->fx_addsy)
    577                                       : absolute_section),
    578                         S_GET_NAME (fixP->fx_subsy),
    579                         segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
    580         }
    581     }
    582 #ifdef OBJ_ELF
    583       if ((fixP->fx_r_type == BFD_RELOC_CR16_GOT_REGREL20)
    584            && GOT_symbol
    585 	   && fixP->fx_addsy == GOT_symbol)
    586 	{
    587 	    reloc->addend = fixP->fx_offset = reloc->address;
    588 	}
    589       else if ((fixP->fx_r_type == BFD_RELOC_CR16_GOTC_REGREL20)
    590            && GOT_symbol
    591 	   && fixP->fx_addsy == GOT_symbol)
    592 	{
    593 	    reloc->addend = fixP->fx_offset = reloc->address;
    594 	}
    595 #endif
    596 
    597   gas_assert ((int) fixP->fx_r_type > 0);
    598   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
    599 
    600   if (reloc->howto == NULL)
    601     {
    602       as_bad_where (fixP->fx_file, fixP->fx_line,
    603                     _("internal error: reloc %d (`%s') not supported by object file format"),
    604                     fixP->fx_r_type,
    605                     bfd_get_reloc_code_name (fixP->fx_r_type));
    606       return NULL;
    607     }
    608   gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
    609 
    610   return reloc;
    611 }
    612 
    613 /* Prepare machine-dependent frags for relaxation.  */
    614 
    615 int
    616 md_estimate_size_before_relax (fragS *fragp, asection *seg)
    617 {
    618   /* If symbol is undefined or located in a different section,
    619      select the largest supported relocation.  */
    620   relax_substateT subtype;
    621   relax_substateT rlx_state[] = {0, 2};
    622 
    623   for (subtype = 0; subtype < ARRAY_SIZE (rlx_state); subtype += 2)
    624     {
    625       if (fragp->fr_subtype == rlx_state[subtype]
    626           && (!S_IS_DEFINED (fragp->fr_symbol)
    627               || seg != S_GET_SEGMENT (fragp->fr_symbol)))
    628         {
    629           fragp->fr_subtype = rlx_state[subtype + 1];
    630           break;
    631         }
    632     }
    633 
    634   if (fragp->fr_subtype >= ARRAY_SIZE (md_relax_table))
    635     abort ();
    636 
    637   return md_relax_table[fragp->fr_subtype].rlx_length;
    638 }
    639 
    640 void
    641 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP)
    642 {
    643   /* 'opcode' points to the start of the instruction, whether
    644      we need to change the instruction's fixed encoding.  */
    645   char *opcode = fragP->fr_literal + fragP->fr_fix;
    646   bfd_reloc_code_real_type reloc;
    647 
    648   subseg_change (sec, 0);
    649 
    650   switch (fragP->fr_subtype)
    651     {
    652     case 0:
    653       reloc = BFD_RELOC_CR16_DISP8;
    654       break;
    655     case 1:
    656       /* If the subtype is not changed due to :m operand qualifier,
    657          then no need to update the opcode value.  */
    658       if ((int)opcode[1] != 0x18)
    659         {
    660           opcode[0] = (opcode[0] & 0xf0);
    661           opcode[1] = 0x18;
    662         }
    663       reloc = BFD_RELOC_CR16_DISP16;
    664       break;
    665     case 2:
    666       /* If the subtype is not changed due to :l operand qualifier,
    667          then no need to update the opcode value.  */
    668       if ((int)opcode[1] != 0)
    669         {
    670           opcode[2] = opcode[0];
    671           opcode[0] = opcode[1];
    672           opcode[1] = 0x0;
    673         }
    674       reloc = BFD_RELOC_CR16_DISP24;
    675       break;
    676     default:
    677       abort();
    678     }
    679 
    680   fix_new (fragP, fragP->fr_fix,
    681            bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput, reloc)),
    682            fragP->fr_symbol, fragP->fr_offset, 1, reloc);
    683   fragP->fr_var = 0;
    684   fragP->fr_fix += md_relax_table[fragP->fr_subtype].rlx_length;
    685 }
    686 
    687 symbolS *
    688 md_undefined_symbol (char *name)
    689 {
    690   if (*name == '_' && *(name + 1) == 'G'
    691       && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
    692    {
    693      if (!GOT_symbol)
    694        {
    695          if (symbol_find (name))
    696              as_bad (_("GOT already in symbol table"));
    697           GOT_symbol = symbol_new (name, undefined_section,
    698                                    (valueT) 0, &zero_address_frag);
    699        }
    700      return GOT_symbol;
    701    }
    702   return 0;
    703 }
    704 
    705 /* Process machine-dependent command line options.  Called once for
    706    each option on the command line that the machine-independent part of
    707    GAS does not understand.  */
    708 
    709 int
    710 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
    711 {
    712   return 0;
    713 }
    714 
    715 /* Machine-dependent usage-output.  */
    716 
    717 void
    718 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
    719 {
    720   return;
    721 }
    722 
    723 const char *
    724 md_atof (int type, char *litP, int *sizeP)
    725 {
    726   return ieee_md_atof (type, litP, sizeP, target_big_endian);
    727 }
    728 
    729 /* Apply a fixS (fixup of an instruction or data that we didn't have
    730    enough info to complete immediately) to the data in a frag.
    731    Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
    732    relaxation of debug sections, this function is called only when
    733    fixuping relocations of debug sections.  */
    734 
    735 void
    736 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
    737 {
    738   valueT val = * valP;
    739 
    740   if (fixP->fx_addsy == NULL
    741       && fixP->fx_pcrel == 0)
    742     fixP->fx_done = 1;
    743   else if (fixP->fx_pcrel == 1
    744       && fixP->fx_addsy != NULL
    745       && S_GET_SEGMENT (fixP->fx_addsy) == seg)
    746     fixP->fx_done = 1;
    747   else
    748     fixP->fx_done = 0;
    749 
    750   if (fixP->fx_addsy != NULL && !fixP->fx_pcrel)
    751     {
    752       val = fixP->fx_offset;
    753       fixP->fx_done = 1;
    754     }
    755 
    756   if (fixP->fx_done)
    757     {
    758       char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
    759 
    760       fixP->fx_offset = 0;
    761 
    762       switch (fixP->fx_r_type)
    763 	{
    764 	case BFD_RELOC_CR16_NUM8:
    765 	  bfd_put_8 (stdoutput, (unsigned char) val, buf);
    766 	  break;
    767 	case BFD_RELOC_CR16_NUM16:
    768 	  bfd_put_16 (stdoutput, val, buf);
    769 	  break;
    770 	case BFD_RELOC_CR16_NUM32:
    771 	  bfd_put_32 (stdoutput, val, buf);
    772 	  break;
    773 	case BFD_RELOC_CR16_NUM32a:
    774 	  bfd_put_32 (stdoutput, val, buf);
    775 	  break;
    776 	default:
    777 	  /* We shouldn't ever get here because linkrelax is nonzero.  */
    778 	  abort ();
    779 	  break;
    780 	}
    781       fixP->fx_done = 0;
    782     }
    783   else
    784     fixP->fx_offset = * valP;
    785 }
    786 
    787 /* The location from which a PC relative jump should be calculated,
    788    given a PC relative reloc.  */
    789 
    790 long
    791 md_pcrel_from (fixS *fixp)
    792 {
    793   return fixp->fx_frag->fr_address + fixp->fx_where;
    794 }
    795 
    796 static void
    797 initialise_reg_hash_table (struct hash_control ** hash_table,
    798                            const reg_entry * register_table,
    799                            const unsigned int num_entries)
    800 {
    801   const reg_entry * rreg;
    802   const char *hashret;
    803 
    804   if ((* hash_table = hash_new ()) == NULL)
    805     as_fatal (_("Virtual memory exhausted"));
    806 
    807   for (rreg = register_table;
    808        rreg < (register_table + num_entries);
    809        rreg++)
    810     {
    811       hashret = hash_insert (* hash_table, rreg->name, (char *) rreg);
    812       if (hashret)
    813         as_fatal (_("Internal Error:  Can't hash %s: %s"),
    814                   rreg->name, hashret);
    815     }
    816 }
    817 
    818 /* This function is called once, at assembler startup time.  This should
    819    set up all the tables, etc that the MD part of the assembler needs.  */
    820 
    821 void
    822 md_begin (void)
    823 {
    824   int i = 0;
    825 
    826   /* Set up a hash table for the instructions.  */
    827   if ((cr16_inst_hash = hash_new ()) == NULL)
    828     as_fatal (_("Virtual memory exhausted"));
    829 
    830   while (cr16_instruction[i].mnemonic != NULL)
    831     {
    832       const char *hashret;
    833       const char *mnemonic = cr16_instruction[i].mnemonic;
    834 
    835       hashret = hash_insert (cr16_inst_hash, mnemonic,
    836                              (char *)(cr16_instruction + i));
    837 
    838       if (hashret != NULL && *hashret != '\0')
    839         as_fatal (_("Can't hash `%s': %s\n"), cr16_instruction[i].mnemonic,
    840                   *hashret == 0 ? _("(unknown reason)") : hashret);
    841 
    842       /* Insert unique names into hash table.  The CR16 instruction set
    843          has many identical opcode names that have different opcodes based
    844          on the operands.  This hash table then provides a quick index to
    845          the first opcode with a particular name in the opcode table.  */
    846       do
    847         {
    848           ++i;
    849         }
    850       while (cr16_instruction[i].mnemonic != NULL
    851              && streq (cr16_instruction[i].mnemonic, mnemonic));
    852     }
    853 
    854   /* Initialize reg_hash hash table.  */
    855   initialise_reg_hash_table (& reg_hash, cr16_regtab, NUMREGS);
    856   /* Initialize regp_hash hash table.  */
    857   initialise_reg_hash_table (& regp_hash, cr16_regptab, NUMREGPS);
    858   /* Initialize preg_hash hash table.  */
    859   initialise_reg_hash_table (& preg_hash, cr16_pregtab, NUMPREGS);
    860   /* Initialize pregp_hash hash table.  */
    861   initialise_reg_hash_table (& pregp_hash, cr16_pregptab, NUMPREGPS);
    862 
    863   /*  Set linkrelax here to avoid fixups in most sections.  */
    864   linkrelax = 1;
    865 }
    866 
    867 /* Process constants (immediate/absolute)
    868    and labels (jump targets/Memory locations).  */
    869 
    870 static void
    871 process_label_constant (char *str, ins * cr16_ins)
    872 {
    873   char *saved_input_line_pointer;
    874   int symbol_with_at = 0;
    875   int symbol_with_s = 0;
    876   int symbol_with_m = 0;
    877   int symbol_with_l = 0;
    878   int symbol_with_at_got = 0;
    879   int symbol_with_at_gotc = 0;
    880   argument *cur_arg = cr16_ins->arg + cur_arg_num;  /* Current argument.  */
    881 
    882   saved_input_line_pointer = input_line_pointer;
    883   input_line_pointer = str;
    884 
    885   expression (&cr16_ins->exp);
    886 
    887   switch (cr16_ins->exp.X_op)
    888     {
    889     case O_big:
    890     case O_absent:
    891       /* Missing or bad expr becomes absolute 0.  */
    892       as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
    893               str);
    894       cr16_ins->exp.X_op = O_constant;
    895       cr16_ins->exp.X_add_number = 0;
    896       cr16_ins->exp.X_add_symbol = NULL;
    897       cr16_ins->exp.X_op_symbol = NULL;
    898       /* Fall through.  */
    899 
    900     case O_constant:
    901       cur_arg->X_op = O_constant;
    902       cur_arg->constant = cr16_ins->exp.X_add_number;
    903       break;
    904 
    905     case O_symbol:
    906     case O_subtract:
    907     case O_add:
    908       cur_arg->X_op = O_symbol;
    909       cur_arg->constant = cr16_ins->exp.X_add_number;
    910       cr16_ins->exp.X_add_number = 0;
    911       cr16_ins->rtype = BFD_RELOC_NONE;
    912       relocatable = 1;
    913 
    914       if (strneq (input_line_pointer, "@c", 2))
    915         symbol_with_at = 1;
    916 
    917       if (strneq (input_line_pointer, "@l", 2)
    918           || strneq (input_line_pointer, ":l", 2))
    919         symbol_with_l = 1;
    920 
    921       if (strneq (input_line_pointer, "@m", 2)
    922           || strneq (input_line_pointer, ":m", 2))
    923         symbol_with_m = 1;
    924 
    925       if (strneq (input_line_pointer, "@s", 2)
    926           || strneq (input_line_pointer, ":s", 2))
    927         symbol_with_s = 1;
    928 
    929       if (strneq (input_line_pointer, "@cGOT", 5)
    930           || strneq (input_line_pointer, "@cgot", 5))
    931 	{
    932 	  if (GOT_symbol == NULL)
    933            GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
    934 
    935           symbol_with_at_gotc = 1;
    936 	}
    937       else if (strneq (input_line_pointer, "@GOT", 4)
    938           || strneq (input_line_pointer, "@got", 4))
    939 	{
    940           if ((strneq (input_line_pointer, "+", 1))
    941 	       || (strneq (input_line_pointer, "-", 1)))
    942            as_warn (_("GOT bad expression with %s."), input_line_pointer);
    943 
    944 	  if (GOT_symbol == NULL)
    945            GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
    946 
    947           symbol_with_at_got = 1;
    948 	}
    949 
    950       switch (cur_arg->type)
    951         {
    952         case arg_cr:
    953           if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
    954             {
    955 	      if (symbol_with_at_got)
    956 	          cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
    957 	      else if (symbol_with_at_gotc)
    958 	          cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
    959 	      else if (cur_arg->size == 20)
    960                 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
    961               else
    962                 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
    963             }
    964           break;
    965 
    966         case arg_crp:
    967           if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
    968 	   {
    969 	    if (symbol_with_at_got)
    970 	      cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
    971 	    else if (symbol_with_at_gotc)
    972 	      cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
    973 	   } else {
    974             switch (instruction->size)
    975               {
    976               case 1:
    977                 switch (cur_arg->size)
    978                   {
    979                   case 0:
    980                     cr16_ins->rtype = BFD_RELOC_CR16_REGREL0;
    981                     break;
    982                   case 4:
    983                     if (IS_INSN_MNEMONIC ("loadb") || IS_INSN_MNEMONIC ("storb"))
    984                       cr16_ins->rtype = BFD_RELOC_CR16_REGREL4;
    985                     else
    986                       cr16_ins->rtype = BFD_RELOC_CR16_REGREL4a;
    987                     break;
    988                   default: break;
    989                   }
    990                 break;
    991               case 2:
    992                 cr16_ins->rtype = BFD_RELOC_CR16_REGREL16;
    993                 break;
    994               case 3:
    995                 if (cur_arg->size == 20)
    996                   cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
    997                 else
    998                   cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
    999                 break;
   1000               default:
   1001                 break;
   1002               }
   1003 	    }
   1004           break;
   1005 
   1006         case arg_idxr:
   1007           if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
   1008 	    {
   1009 	      if (symbol_with_at_got)
   1010 	        cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
   1011 	      else if (symbol_with_at_gotc)
   1012 	        cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
   1013 	      else
   1014                 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
   1015 	    }
   1016           break;
   1017 
   1018         case arg_idxrp:
   1019           if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
   1020 	    {
   1021 	    if (symbol_with_at_got)
   1022 	      cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
   1023 	    else if (symbol_with_at_gotc)
   1024 	      cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
   1025 	    else {
   1026             switch (instruction->size)
   1027               {
   1028               case 1: cr16_ins->rtype = BFD_RELOC_CR16_REGREL0; break;
   1029               case 2: cr16_ins->rtype = BFD_RELOC_CR16_REGREL14; break;
   1030               case 3: cr16_ins->rtype = BFD_RELOC_CR16_REGREL20; break;
   1031               default: break;
   1032               }
   1033 	    }
   1034 	   }
   1035           break;
   1036 
   1037         case arg_c:
   1038           if (IS_INSN_MNEMONIC ("bal"))
   1039             cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
   1040           else if (IS_INSN_TYPE (BRANCH_INS))
   1041             {
   1042               if (symbol_with_l)
   1043                 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
   1044               else if (symbol_with_m)
   1045                 cr16_ins->rtype = BFD_RELOC_CR16_DISP16;
   1046               else
   1047                 cr16_ins->rtype = BFD_RELOC_CR16_DISP8;
   1048             }
   1049           else if (IS_INSN_TYPE (STOR_IMM_INS) || IS_INSN_TYPE (LD_STOR_INS)
   1050                    || IS_INSN_TYPE (CSTBIT_INS))
   1051             {
   1052 	      if (symbol_with_s)
   1053                 as_bad (_("operand %d: illegal use expression: `%s`"), cur_arg_num + 1, str);
   1054 	      if (symbol_with_at_got)
   1055 	        cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
   1056 	      else if (symbol_with_at_gotc)
   1057 	        cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
   1058 	      else if (symbol_with_m)
   1059                 cr16_ins->rtype = BFD_RELOC_CR16_ABS20;
   1060               else /* Default to (symbol_with_l) */
   1061                 cr16_ins->rtype = BFD_RELOC_CR16_ABS24;
   1062             }
   1063           else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
   1064             cr16_ins->rtype = BFD_RELOC_CR16_DISP4;
   1065           break;
   1066 
   1067         case arg_ic:
   1068           if (IS_INSN_TYPE (ARITH_INS))
   1069             {
   1070 	      if (symbol_with_at_got)
   1071 	        cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
   1072 	      else if (symbol_with_at_gotc)
   1073 	        cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
   1074 	      else if (symbol_with_s)
   1075                 cr16_ins->rtype = BFD_RELOC_CR16_IMM4;
   1076               else if (symbol_with_m)
   1077                 cr16_ins->rtype = BFD_RELOC_CR16_IMM20;
   1078               else if (symbol_with_at)
   1079                 cr16_ins->rtype = BFD_RELOC_CR16_IMM32a;
   1080               else /* Default to (symbol_with_l) */
   1081                 cr16_ins->rtype = BFD_RELOC_CR16_IMM32;
   1082             }
   1083           else if (IS_INSN_TYPE (ARITH_BYTE_INS))
   1084             {
   1085               cr16_ins->rtype = BFD_RELOC_CR16_IMM16;
   1086             }
   1087           break;
   1088         default:
   1089           break;
   1090         }
   1091       break;
   1092 
   1093     default:
   1094       cur_arg->X_op = cr16_ins->exp.X_op;
   1095       break;
   1096     }
   1097 
   1098   input_line_pointer = saved_input_line_pointer;
   1099   return;
   1100 }
   1101 
   1102 /* Retrieve the opcode image of a given register.
   1103    If the register is illegal for the current instruction,
   1104    issue an error.  */
   1105 
   1106 static int
   1107 getreg_image (reg r)
   1108 {
   1109   const reg_entry *rreg;
   1110   char *reg_name;
   1111   int is_procreg = 0; /* Nonzero means argument should be processor reg.  */
   1112 
   1113   /* Check whether the register is in registers table.  */
   1114   if (r < MAX_REG)
   1115     rreg = cr16_regtab + r;
   1116   else /* Register not found.  */
   1117     {
   1118       as_bad (_("Unknown register: `%d'"), r);
   1119       return 0;
   1120     }
   1121 
   1122   reg_name = rreg->name;
   1123 
   1124 /* Issue a error message when register is illegal.  */
   1125 #define IMAGE_ERR \
   1126   as_bad (_("Illegal register (`%s') in Instruction: `%s'"), \
   1127             reg_name, ins_parse);                            \
   1128   break;
   1129 
   1130   switch (rreg->type)
   1131     {
   1132     case CR16_R_REGTYPE:
   1133       if (! is_procreg)
   1134         return rreg->image;
   1135       else
   1136         IMAGE_ERR;
   1137 
   1138     case CR16_P_REGTYPE:
   1139       return rreg->image;
   1140       break;
   1141 
   1142     default:
   1143       IMAGE_ERR;
   1144     }
   1145 
   1146   return 0;
   1147 }
   1148 
   1149 /* Parsing different types of operands
   1150    -> constants             Immediate/Absolute/Relative numbers
   1151    -> Labels                Relocatable symbols
   1152    -> (reg pair base)       Register pair base
   1153    -> (rbase)               Register base
   1154    -> disp(rbase)           Register relative
   1155    -> [rinx]disp(reg pair)  Register index with reg pair mode
   1156    -> disp(rbase,ridx,scl)  Register index mode.  */
   1157 
   1158 static void
   1159 set_operand (char *operand, ins * cr16_ins)
   1160 {
   1161   char *operandS; /* Pointer to start of sub-operand.  */
   1162   char *operandE; /* Pointer to end of sub-operand.  */
   1163 
   1164   argument *cur_arg = &cr16_ins->arg[cur_arg_num]; /* Current argument.  */
   1165 
   1166   /* Initialize pointers.  */
   1167   operandS = operandE = operand;
   1168 
   1169   switch (cur_arg->type)
   1170     {
   1171     case arg_ic:    /* Case $0x18.  */
   1172       operandS++;
   1173       /* Fall through.  */
   1174     case arg_c:     /* Case 0x18.  */
   1175       /* Set constant.  */
   1176       process_label_constant (operandS, cr16_ins);
   1177 
   1178       if (cur_arg->type != arg_ic)
   1179         cur_arg->type = arg_c;
   1180       break;
   1181 
   1182     case arg_icr:   /* Case $0x18(r1).  */
   1183       operandS++;
   1184     case arg_cr:    /* Case 0x18(r1).   */
   1185       /* Set displacement constant.  */
   1186       while (*operandE != '(')
   1187         operandE++;
   1188       *operandE = '\0';
   1189       process_label_constant (operandS, cr16_ins);
   1190       operandS = operandE;
   1191       /* Fall through.  */
   1192     case arg_rbase: /* Case (r1) or (r1,r0).  */
   1193       operandS++;
   1194       /* Set register base.  */
   1195       while (*operandE != ')')
   1196         operandE++;
   1197       *operandE = '\0';
   1198       if ((cur_arg->r = get_register (operandS)) == nullregister)
   1199          as_bad (_("Illegal register `%s' in Instruction `%s'"),
   1200               operandS, ins_parse);
   1201 
   1202       /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
   1203       if ((cur_arg->type != arg_rbase)
   1204           && ((getreg_image (cur_arg->r) == 12)
   1205               || (getreg_image (cur_arg->r) == 13)
   1206               || (getreg_image (cur_arg->r) == 14)
   1207               || (getreg_image (cur_arg->r) == 15)))
   1208          {
   1209            cur_arg->type = arg_crp;
   1210            cur_arg->rp = cur_arg->r;
   1211          }
   1212       break;
   1213 
   1214     case arg_crp:    /* Case 0x18(r1,r0).   */
   1215       /* Set displacement constant.  */
   1216       while (*operandE != '(')
   1217         operandE++;
   1218       *operandE = '\0';
   1219       process_label_constant (operandS, cr16_ins);
   1220       operandS = operandE;
   1221       operandS++;
   1222       /* Set register pair base.  */
   1223       while (*operandE != ')')
   1224         operandE++;
   1225       *operandE = '\0';
   1226       if ((cur_arg->rp = get_register_pair (operandS)) == nullregister)
   1227          as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
   1228               operandS, ins_parse);
   1229       break;
   1230 
   1231     case arg_idxr:
   1232       /* Set register pair base.  */
   1233       if ((strchr (operandS,'(') != NULL))
   1234         {
   1235          while ((*operandE != '(') && (! ISSPACE (*operandE)))
   1236            operandE++;
   1237          if ((cur_arg->rp = get_index_register_pair (operandE)) == nullregister)
   1238               as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
   1239                             operandS, ins_parse);
   1240          *operandE++ = '\0';
   1241          cur_arg->type = arg_idxrp;
   1242         }
   1243       else
   1244         cur_arg->rp = -1;
   1245 
   1246        operandE = operandS;
   1247       /* Set displacement constant.  */
   1248       while (*operandE != ']')
   1249         operandE++;
   1250       process_label_constant (++operandE, cr16_ins);
   1251       *operandE++ = '\0';
   1252       operandE = operandS;
   1253 
   1254       /* Set index register .  */
   1255       operandS = strchr (operandE,'[');
   1256       if (operandS != NULL)
   1257         { /* Eliminate '[', detach from rest of operand.  */
   1258           *operandS++ = '\0';
   1259 
   1260           operandE = strchr (operandS, ']');
   1261 
   1262           if (operandE == NULL)
   1263             as_bad (_("unmatched '['"));
   1264           else
   1265             { /* Eliminate ']' and make sure it was the last thing
   1266                  in the string.  */
   1267               *operandE = '\0';
   1268               if (*(operandE + 1) != '\0')
   1269                 as_bad (_("garbage after index spec ignored"));
   1270             }
   1271         }
   1272 
   1273       if ((cur_arg->i_r = get_index_register (operandS)) == nullregister)
   1274         as_bad (_("Illegal register `%s' in Instruction `%s'"),
   1275                 operandS, ins_parse);
   1276       *operandE = '\0';
   1277       *operandS = '\0';
   1278       break;
   1279 
   1280     default:
   1281       break;
   1282     }
   1283 }
   1284 
   1285 /* Parse a single operand.
   1286    operand - Current operand to parse.
   1287    cr16_ins - Current assembled instruction.  */
   1288 
   1289 static void
   1290 parse_operand (char *operand, ins * cr16_ins)
   1291 {
   1292   int ret_val;
   1293   argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument.  */
   1294 
   1295   /* Initialize the type to NULL before parsing.  */
   1296   cur_arg->type = nullargs;
   1297 
   1298   /* Check whether this is a condition code .  */
   1299   if ((IS_INSN_MNEMONIC ("b")) && ((ret_val = get_cc (operand)) != -1))
   1300     {
   1301       cur_arg->type = arg_cc;
   1302       cur_arg->cc = ret_val;
   1303       cur_arg->X_op = O_register;
   1304       return;
   1305     }
   1306 
   1307   /* Check whether this is a general processor register.  */
   1308   if ((ret_val = get_register (operand)) != nullregister)
   1309     {
   1310       cur_arg->type = arg_r;
   1311       cur_arg->r = ret_val;
   1312       cur_arg->X_op = 0;
   1313       return;
   1314     }
   1315 
   1316   /* Check whether this is a general processor register pair.  */
   1317   if ((operand[0] == '(')
   1318       && ((ret_val = get_register_pair (operand)) != nullregister))
   1319     {
   1320       cur_arg->type = arg_rp;
   1321       cur_arg->rp = ret_val;
   1322       cur_arg->X_op = O_register;
   1323       return;
   1324     }
   1325 
   1326   /* Check whether the operand is a processor register.
   1327      For "lprd" and "sprd" instruction, only 32 bit
   1328      processor registers used.  */
   1329   if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
   1330       && ((ret_val = get_pregister (operand)) != nullpregister))
   1331     {
   1332       cur_arg->type = arg_pr;
   1333       cur_arg->pr = ret_val;
   1334       cur_arg->X_op = O_register;
   1335       return;
   1336     }
   1337 
   1338   /* Check whether this is a processor register - 32 bit.  */
   1339   if ((ret_val = get_pregisterp (operand)) != nullpregister)
   1340     {
   1341       cur_arg->type = arg_prp;
   1342       cur_arg->prp = ret_val;
   1343       cur_arg->X_op = O_register;
   1344       return;
   1345     }
   1346 
   1347   /* Deal with special characters.  */
   1348   switch (operand[0])
   1349     {
   1350     case '$':
   1351       if (strchr (operand, '(') != NULL)
   1352         cur_arg->type = arg_icr;
   1353       else
   1354         cur_arg->type = arg_ic;
   1355       goto set_params;
   1356       break;
   1357 
   1358     case '(':
   1359       cur_arg->type = arg_rbase;
   1360       goto set_params;
   1361       break;
   1362 
   1363     case '[':
   1364       cur_arg->type = arg_idxr;
   1365       goto set_params;
   1366       break;
   1367 
   1368     default:
   1369       break;
   1370     }
   1371 
   1372   if (strchr (operand, '(') != NULL)
   1373     {
   1374       if (strchr (operand, ',') != NULL
   1375           && (strchr (operand, ',') > strchr (operand, '(')))
   1376         cur_arg->type = arg_crp;
   1377       else
   1378         cur_arg->type = arg_cr;
   1379     }
   1380   else
   1381     cur_arg->type = arg_c;
   1382 
   1383 /* Parse an operand according to its type.  */
   1384  set_params:
   1385   cur_arg->constant = 0;
   1386   set_operand (operand, cr16_ins);
   1387 }
   1388 
   1389 /* Parse the various operands. Each operand is then analyzed to fillup
   1390    the fields in the cr16_ins data structure.  */
   1391 
   1392 static void
   1393 parse_operands (ins * cr16_ins, char *operands)
   1394 {
   1395   char *operandS;            /* Operands string.  */
   1396   char *operandH, *operandT; /* Single operand head/tail pointers.  */
   1397   int allocated = 0;         /* Indicates a new operands string was allocated.*/
   1398   char *operand[MAX_OPERANDS];/* Separating the operands.  */
   1399   int op_num = 0;             /* Current operand number we are parsing.  */
   1400   int bracket_flag = 0;       /* Indicates a bracket '(' was found.  */
   1401   int sq_bracket_flag = 0;    /* Indicates a square bracket '[' was found.  */
   1402 
   1403   /* Preprocess the list of registers, if necessary.  */
   1404   operandS = operandH = operandT = operands;
   1405 
   1406   while (*operandT != '\0')
   1407     {
   1408       if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
   1409         {
   1410           *operandT++ = '\0';
   1411           operand[op_num++] = strdup (operandH);
   1412           operandH = operandT;
   1413           continue;
   1414         }
   1415 
   1416       if (*operandT == ' ')
   1417         as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
   1418 
   1419       if (*operandT == '(')
   1420         bracket_flag = 1;
   1421       else if (*operandT == '[')
   1422         sq_bracket_flag = 1;
   1423 
   1424       if (*operandT == ')')
   1425         {
   1426           if (bracket_flag)
   1427             bracket_flag = 0;
   1428           else
   1429             as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
   1430         }
   1431       else if (*operandT == ']')
   1432         {
   1433           if (sq_bracket_flag)
   1434             sq_bracket_flag = 0;
   1435           else
   1436             as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
   1437         }
   1438 
   1439       if (bracket_flag == 1 && *operandT == ')')
   1440         bracket_flag = 0;
   1441       else if (sq_bracket_flag == 1 && *operandT == ']')
   1442         sq_bracket_flag = 0;
   1443 
   1444       operandT++;
   1445     }
   1446 
   1447   /* Adding the last operand.  */
   1448   operand[op_num++] = strdup (operandH);
   1449   cr16_ins->nargs = op_num;
   1450 
   1451   /* Verifying correct syntax of operands (all brackets should be closed).  */
   1452   if (bracket_flag || sq_bracket_flag)
   1453     as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
   1454 
   1455   /* Now we parse each operand separately.  */
   1456   for (op_num = 0; op_num < cr16_ins->nargs; op_num++)
   1457     {
   1458       cur_arg_num = op_num;
   1459       parse_operand (operand[op_num], cr16_ins);
   1460       free (operand[op_num]);
   1461     }
   1462 
   1463   if (allocated)
   1464     free (operandS);
   1465 }
   1466 
   1467 /* Get the trap index in dispatch table, given its name.
   1468    This routine is used by assembling the 'excp' instruction.  */
   1469 
   1470 static int
   1471 gettrap (char *s)
   1472 {
   1473   const trap_entry *trap;
   1474 
   1475   for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
   1476     if (strcasecmp (trap->name, s) == 0)
   1477       return trap->entry;
   1478 
   1479   /* To make compatible with CR16 4.1 tools, the below 3-lines of
   1480    * code added. Refer: Development Tracker item #123 */
   1481   for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
   1482     if (trap->entry  == (unsigned int) atoi (s))
   1483       return trap->entry;
   1484 
   1485   as_bad (_("Unknown exception: `%s'"), s);
   1486   return 0;
   1487 }
   1488 
   1489 /* Top level module where instruction parsing starts.
   1490    cr16_ins - data structure holds some information.
   1491    operands - holds the operands part of the whole instruction.  */
   1492 
   1493 static void
   1494 parse_insn (ins *insn, char *operands)
   1495 {
   1496   int i;
   1497 
   1498   /* Handle instructions with no operands.  */
   1499   for (i = 0; cr16_no_op_insn[i] != NULL; i++)
   1500   {
   1501     if (streq (cr16_no_op_insn[i], instruction->mnemonic))
   1502     {
   1503       insn->nargs = 0;
   1504       return;
   1505     }
   1506   }
   1507 
   1508   /* Handle 'excp' instructions.  */
   1509   if (IS_INSN_MNEMONIC ("excp"))
   1510     {
   1511       insn->nargs = 1;
   1512       insn->arg[0].type = arg_ic;
   1513       insn->arg[0].constant = gettrap (operands);
   1514       insn->arg[0].X_op = O_constant;
   1515       return;
   1516     }
   1517 
   1518   if (operands != NULL)
   1519     parse_operands (insn, operands);
   1520 }
   1521 
   1522 /* bCC instruction requires special handling.  */
   1523 static char *
   1524 get_b_cc (char * op)
   1525 {
   1526   unsigned int i;
   1527   char op1[5];
   1528 
   1529   for (i = 1; i < strlen (op); i++)
   1530      op1[i-1] = op[i];
   1531 
   1532   op1[i-1] = '\0';
   1533 
   1534   for (i = 0; i < cr16_num_cc ; i++)
   1535     if (streq (op1, cr16_b_cond_tab[i]))
   1536       return (char *) cr16_b_cond_tab[i];
   1537 
   1538    return NULL;
   1539 }
   1540 
   1541 /* bCC instruction requires special handling.  */
   1542 static int
   1543 is_bcc_insn (char * op)
   1544 {
   1545   if (!(streq (op, "bal") || streq (op, "beq0b") || streq (op, "bnq0b")
   1546         || streq (op, "beq0w") || streq (op, "bnq0w")))
   1547     if ((op[0] == 'b') && (get_b_cc (op) != NULL))
   1548       return 1;
   1549   return 0;
   1550 }
   1551 
   1552 /* Cinv instruction requires special handling.  */
   1553 
   1554 static void
   1555 check_cinv_options (char * operand)
   1556 {
   1557   char *p = operand;
   1558 
   1559   while (*++p != ']')
   1560     {
   1561       switch (*p)
   1562 	{
   1563 	case ',':
   1564 	case ' ':
   1565 	case 'i':
   1566 	case 'u':
   1567 	case 'd':
   1568 	  break;
   1569 	default:
   1570 	  as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
   1571 	}
   1572     }
   1573 }
   1574 
   1575 /* Retrieve the opcode image of a given register pair.
   1576    If the register is illegal for the current instruction,
   1577    issue an error.  */
   1578 
   1579 static int
   1580 getregp_image (reg r)
   1581 {
   1582   const reg_entry *rreg;
   1583   char *reg_name;
   1584 
   1585   /* Check whether the register is in registers table.  */
   1586   if (r < MAX_REG)
   1587     rreg = cr16_regptab + r;
   1588   /* Register not found.  */
   1589   else
   1590     {
   1591       as_bad (_("Unknown register pair: `%d'"), r);
   1592       return 0;
   1593     }
   1594 
   1595   reg_name = rreg->name;
   1596 
   1597 /* Issue a error message when register  pair is illegal.  */
   1598 #define RPAIR_IMAGE_ERR \
   1599   as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
   1600             reg_name, ins_parse);                                 \
   1601   break;
   1602 
   1603   switch (rreg->type)
   1604     {
   1605     case CR16_RP_REGTYPE:
   1606       return rreg->image;
   1607     default:
   1608       RPAIR_IMAGE_ERR;
   1609     }
   1610 
   1611   return 0;
   1612 }
   1613 
   1614 /* Retrieve the opcode image of a given index register pair.
   1615    If the register is illegal for the current instruction,
   1616    issue an error.  */
   1617 
   1618 static int
   1619 getidxregp_image (reg r)
   1620 {
   1621   const reg_entry *rreg;
   1622   char *reg_name;
   1623 
   1624   /* Check whether the register is in registers table.  */
   1625   if (r < MAX_REG)
   1626     rreg = cr16_regptab + r;
   1627   /* Register not found.  */
   1628   else
   1629     {
   1630       as_bad (_("Unknown register pair: `%d'"), r);
   1631       return 0;
   1632     }
   1633 
   1634   reg_name = rreg->name;
   1635 
   1636 /* Issue a error message when register  pair is illegal.  */
   1637 #define IDX_RPAIR_IMAGE_ERR \
   1638   as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
   1639             reg_name, ins_parse);                                       \
   1640 
   1641   if (rreg->type == CR16_RP_REGTYPE)
   1642     {
   1643       switch (rreg->image)
   1644         {
   1645         case 0:  return 0; break;
   1646         case 2:  return 1; break;
   1647         case 4:  return 2; break;
   1648         case 6:  return 3; break;
   1649         case 8:  return 4; break;
   1650         case 10: return 5; break;
   1651         case 3:  return 6; break;
   1652         case 5:  return 7; break;
   1653         default:
   1654           break;
   1655         }
   1656     }
   1657 
   1658   IDX_RPAIR_IMAGE_ERR;
   1659   return 0;
   1660 }
   1661 
   1662 /* Retrieve the opcode image of a given processor register.
   1663    If the register is illegal for the current instruction,
   1664    issue an error.  */
   1665 static int
   1666 getprocreg_image (int r)
   1667 {
   1668   const reg_entry *rreg;
   1669   char *reg_name;
   1670 
   1671   /* Check whether the register is in registers table.  */
   1672   if (r >= MAX_REG && r < MAX_PREG)
   1673     rreg = &cr16_pregtab[r - MAX_REG];
   1674   /* Register not found.  */
   1675   else
   1676     {
   1677       as_bad (_("Unknown processor register : `%d'"), r);
   1678       return 0;
   1679     }
   1680 
   1681   reg_name = rreg->name;
   1682 
   1683 /* Issue a error message when register  pair is illegal.  */
   1684 #define PROCREG_IMAGE_ERR \
   1685   as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
   1686             reg_name, ins_parse);                                      \
   1687   break;
   1688 
   1689   switch (rreg->type)
   1690     {
   1691     case CR16_P_REGTYPE:
   1692       return rreg->image;
   1693     default:
   1694       PROCREG_IMAGE_ERR;
   1695     }
   1696 
   1697   return 0;
   1698 }
   1699 
   1700 /* Retrieve the opcode image of a given processor register.
   1701    If the register is illegal for the current instruction,
   1702    issue an error.  */
   1703 static int
   1704 getprocregp_image (int r)
   1705 {
   1706   const reg_entry *rreg;
   1707   char *reg_name;
   1708   int pregptab_disp = 0;
   1709 
   1710   /* Check whether the register is in registers table.  */
   1711   if (r >= MAX_REG && r < MAX_PREG)
   1712     {
   1713       r = r - MAX_REG;
   1714       switch (r)
   1715         {
   1716         case 4: pregptab_disp = 1;  break;
   1717         case 6: pregptab_disp = 2;  break;
   1718         case 8:
   1719         case 9:
   1720         case 10:
   1721           pregptab_disp = 3;  break;
   1722         case 12:
   1723           pregptab_disp = 4;  break;
   1724         case 14:
   1725           pregptab_disp = 5;  break;
   1726         default: break;
   1727         }
   1728       rreg = &cr16_pregptab[r - pregptab_disp];
   1729     }
   1730   /* Register not found.  */
   1731   else
   1732     {
   1733       as_bad (_("Unknown processor register (32 bit) : `%d'"), r);
   1734       return 0;
   1735     }
   1736 
   1737   reg_name = rreg->name;
   1738 
   1739 /* Issue a error message when register  pair is illegal.  */
   1740 #define PROCREGP_IMAGE_ERR \
   1741   as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
   1742             reg_name, ins_parse);                                              \
   1743   break;
   1744 
   1745   switch (rreg->type)
   1746     {
   1747     case CR16_P_REGTYPE:
   1748       return rreg->image;
   1749     default:
   1750       PROCREGP_IMAGE_ERR;
   1751     }
   1752 
   1753   return 0;
   1754 }
   1755 
   1756 /* Routine used to represent integer X using NBITS bits.  */
   1757 
   1758 static long
   1759 getconstant (long x, int nbits)
   1760 {
   1761   /* The following expression avoids overflow if
   1762      'nbits' is the number of bits in 'bfd_vma'.  */
   1763   return (x & ((((1 << (nbits - 1)) - 1) << 1) | 1));
   1764 }
   1765 
   1766 /* Print a constant value to 'output_opcode':
   1767    ARG holds the operand's type and value.
   1768    SHIFT represents the location of the operand to be print into.
   1769    NBITS determines the size (in bits) of the constant.  */
   1770 
   1771 static void
   1772 print_constant (int nbits, int shift, argument *arg)
   1773 {
   1774   unsigned long mask = 0;
   1775 
   1776   long constant = getconstant (arg->constant, nbits);
   1777 
   1778   switch (nbits)
   1779     {
   1780     case 32:
   1781     case 28:
   1782       /* mask the upper part of the constant, that is, the bits
   1783          going to the lowest byte of output_opcode[0].
   1784          The upper part of output_opcode[1] is always filled,
   1785          therefore it is always masked with 0xFFFF.  */
   1786       mask = (1 << (nbits - 16)) - 1;
   1787       /* Divide the constant between two consecutive words :
   1788          0        1         2         3
   1789          +---------+---------+---------+---------+
   1790          |         | X X X X | x X x X |         |
   1791          +---------+---------+---------+---------+
   1792          output_opcode[0]    output_opcode[1]     */
   1793 
   1794       CR16_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
   1795       CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
   1796       break;
   1797 
   1798     case 21:
   1799       if ((nbits == 21) && (IS_INSN_TYPE (LD_STOR_INS)))
   1800 	nbits = 20;
   1801       /* Fall through.  */
   1802     case 24:
   1803     case 22:
   1804     case 20:
   1805       /* mask the upper part of the constant, that is, the bits
   1806          going to the lowest byte of output_opcode[0].
   1807          The upper part of output_opcode[1] is always filled,
   1808          therefore it is always masked with 0xFFFF.  */
   1809       mask = (1 << (nbits - 16)) - 1;
   1810       /* Divide the constant between two consecutive words :
   1811          0        1         2          3
   1812          +---------+---------+---------+---------+
   1813          |         | X X X X | - X - X |         |
   1814          +---------+---------+---------+---------+
   1815          output_opcode[0]    output_opcode[1]     */
   1816 
   1817       if ((instruction->size > 2) && (shift == WORD_SHIFT))
   1818         {
   1819           if (arg->type == arg_idxrp)
   1820             {
   1821               CR16_PRINT (0, ((constant >> WORD_SHIFT) & mask) << 8, 0);
   1822               CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
   1823             }
   1824           else
   1825             {
   1826               CR16_PRINT (0, (((((constant >> WORD_SHIFT) & mask) << 8) & 0x0f00) | ((((constant >> WORD_SHIFT) & mask) >> 4) & 0xf)),0);
   1827               CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
   1828             }
   1829         }
   1830       else
   1831         CR16_PRINT (0, constant, shift);
   1832       break;
   1833 
   1834     case 14:
   1835       if (arg->type == arg_idxrp)
   1836         {
   1837           if (instruction->size == 2)
   1838             {
   1839               CR16_PRINT (0, ((constant)      & 0xf), shift);        /* 0-3 bits.  */
   1840               CR16_PRINT (0, ((constant >> 4) & 0x3), (shift + 20)); /* 4-5 bits.  */
   1841               CR16_PRINT (0, ((constant >> 6) & 0x3), (shift + 14)); /* 6-7 bits.  */
   1842               CR16_PRINT (0, ((constant >> 8) & 0x3f), (shift + 8)); /* 8-13 bits.  */
   1843             }
   1844           else
   1845             CR16_PRINT (0, constant, shift);
   1846         }
   1847       break;
   1848 
   1849     case 16:
   1850     case 12:
   1851       /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
   1852          always filling the upper part of output_opcode[1]. If we mistakenly
   1853          write it to output_opcode[0], the constant prefix (that is, 'match')
   1854          will be overridden.
   1855          0        1         2         3
   1856          +---------+---------+---------+---------+
   1857          | 'match' |         | X X X X |         |
   1858          +---------+---------+---------+---------+
   1859          output_opcode[0]    output_opcode[1]     */
   1860 
   1861       if ((instruction->size > 2) && (shift == WORD_SHIFT))
   1862         CR16_PRINT (1, constant, WORD_SHIFT);
   1863       else
   1864         CR16_PRINT (0, constant, shift);
   1865       break;
   1866 
   1867     case 8:
   1868       CR16_PRINT (0, ((constant / 2) & 0xf), shift);
   1869       CR16_PRINT (0, ((constant / 2) >> 4), (shift + 8));
   1870       break;
   1871 
   1872     default:
   1873       CR16_PRINT (0, constant,  shift);
   1874       break;
   1875     }
   1876 }
   1877 
   1878 /* Print an operand to 'output_opcode', which later on will be
   1879    printed to the object file:
   1880    ARG holds the operand's type, size and value.
   1881    SHIFT represents the printing location of operand.
   1882    NBITS determines the size (in bits) of a constant operand.  */
   1883 
   1884 static void
   1885 print_operand (int nbits, int shift, argument *arg)
   1886 {
   1887   switch (arg->type)
   1888     {
   1889     case arg_cc:
   1890       CR16_PRINT (0, arg->cc, shift);
   1891       break;
   1892 
   1893     case arg_r:
   1894       CR16_PRINT (0, getreg_image (arg->r), shift);
   1895       break;
   1896 
   1897     case arg_rp:
   1898       CR16_PRINT (0, getregp_image (arg->rp), shift);
   1899       break;
   1900 
   1901     case arg_pr:
   1902       CR16_PRINT (0, getprocreg_image (arg->pr), shift);
   1903       break;
   1904 
   1905     case arg_prp:
   1906       CR16_PRINT (0, getprocregp_image (arg->prp), shift);
   1907       break;
   1908 
   1909     case arg_idxrp:
   1910       /*    16      12      8    6      0
   1911             +-----------------------------+
   1912             | r_index | disp  | rp_base   |
   1913             +-----------------------------+          */
   1914 
   1915       if (instruction->size == 3)
   1916         {
   1917           CR16_PRINT (0, getidxregp_image (arg->rp), 0);
   1918           if (getreg_image (arg->i_r) == 12)
   1919             CR16_PRINT (0, 0, 3);
   1920           else
   1921             CR16_PRINT (0, 1, 3);
   1922         }
   1923       else
   1924         {
   1925           CR16_PRINT (0, getidxregp_image (arg->rp), 16);
   1926           if (getreg_image (arg->i_r) == 12)
   1927             CR16_PRINT (0, 0, 19);
   1928           else
   1929             CR16_PRINT (0, 1, 19);
   1930         }
   1931       print_constant (nbits, shift, arg);
   1932       break;
   1933 
   1934     case arg_idxr:
   1935       if (getreg_image (arg->i_r) == 12)
   1936         if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
   1937             || IS_INSN_MNEMONIC ("tbitb"))
   1938           CR16_PRINT (0, 0, 23);
   1939         else CR16_PRINT (0, 0, 24);
   1940       else
   1941         if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
   1942             || IS_INSN_MNEMONIC ("tbitb"))
   1943           CR16_PRINT (0, 1, 23);
   1944         else CR16_PRINT (0, 1, 24);
   1945 
   1946       print_constant (nbits, shift, arg);
   1947       break;
   1948 
   1949     case arg_ic:
   1950     case arg_c:
   1951       print_constant (nbits, shift, arg);
   1952       break;
   1953 
   1954     case arg_rbase:
   1955       CR16_PRINT (0, getreg_image (arg->r), shift);
   1956       break;
   1957 
   1958     case arg_cr:
   1959       print_constant (nbits, shift , arg);
   1960       /* Add the register argument to the output_opcode.  */
   1961       CR16_PRINT (0, getreg_image (arg->r), (shift+16));
   1962       break;
   1963 
   1964     case arg_crp:
   1965       print_constant (nbits, shift , arg);
   1966       if (instruction->size > 1)
   1967         CR16_PRINT (0, getregp_image (arg->rp), (shift + 16));
   1968       else if (IS_INSN_TYPE (LD_STOR_INS) || (IS_INSN_TYPE (CSTBIT_INS)))
   1969         {
   1970           if (instruction->size == 2)
   1971             CR16_PRINT (0, getregp_image (arg->rp), (shift - 8));
   1972           else if (instruction->size == 1)
   1973             CR16_PRINT (0, getregp_image (arg->rp), 16);
   1974         }
   1975       else
   1976         CR16_PRINT (0, getregp_image (arg->rp), shift);
   1977       break;
   1978 
   1979     default:
   1980       break;
   1981     }
   1982 }
   1983 
   1984 /* Retrieve the number of operands for the current assembled instruction.  */
   1985 
   1986 static int
   1987 get_number_of_operands (void)
   1988 {
   1989   int i;
   1990 
   1991   for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
   1992     ;
   1993   return i;
   1994 }
   1995 
   1996 /* Verify that the number NUM can be represented in BITS bits (that is,
   1997    within its permitted range), based on the instruction's FLAGS.
   1998    If UPDATE is nonzero, update the value of NUM if necessary.
   1999    Return OP_LEGAL upon success, actual error type upon failure.  */
   2000 
   2001 static op_err
   2002 check_range (long *num, int bits, int unsigned flags, int update)
   2003 {
   2004   long min, max;
   2005   op_err retval = OP_LEGAL;
   2006   long value = *num;
   2007 
   2008   if (bits == 0 && value > 0) return OP_OUT_OF_RANGE;
   2009 
   2010   /* For hosts with longs bigger than 32-bits make sure that the top
   2011      bits of a 32-bit negative value read in by the parser are set,
   2012      so that the correct comparisons are made.  */
   2013   if (value & 0x80000000)
   2014     value |= (-1UL << 31);
   2015 
   2016 
   2017   /* Verify operand value is even.  */
   2018   if (flags & OP_EVEN)
   2019     {
   2020       if (value % 2)
   2021         return OP_NOT_EVEN;
   2022     }
   2023 
   2024   if (flags & OP_DEC)
   2025     {
   2026       value -= 1;
   2027       if (update)
   2028         *num = value;
   2029     }
   2030 
   2031   if (flags & OP_SHIFT)
   2032     {
   2033       value >>= 1;
   2034       if (update)
   2035         *num = value;
   2036     }
   2037   else if (flags & OP_SHIFT_DEC)
   2038     {
   2039       value = (value >> 1) - 1;
   2040       if (update)
   2041         *num = value;
   2042     }
   2043 
   2044   if (flags & OP_ABS20)
   2045     {
   2046       if (value > 0xEFFFF)
   2047         return OP_OUT_OF_RANGE;
   2048     }
   2049 
   2050   if (flags & OP_ESC)
   2051     {
   2052       if (value == 0xB || value == 0x9)
   2053         return OP_OUT_OF_RANGE;
   2054       else if (value == -1)
   2055         {
   2056           if (update)
   2057             *num = 9;
   2058           return retval;
   2059         }
   2060     }
   2061 
   2062   if (flags & OP_ESC1)
   2063     {
   2064       if (value > 13)
   2065         return OP_OUT_OF_RANGE;
   2066     }
   2067 
   2068    if (flags & OP_SIGNED)
   2069      {
   2070        max = (1 << (bits - 1)) - 1;
   2071        min = - (1 << (bits - 1));
   2072        if ((value > max) || (value < min))
   2073          retval = OP_OUT_OF_RANGE;
   2074      }
   2075    else if (flags & OP_UNSIGNED)
   2076      {
   2077        max = ((((1 << (bits - 1)) - 1) << 1) | 1);
   2078        min = 0;
   2079        if (((unsigned long) value > (unsigned long) max)
   2080             || ((unsigned long) value < (unsigned long) min))
   2081          retval = OP_OUT_OF_RANGE;
   2082      }
   2083    else if (flags & OP_NEG)
   2084      {
   2085        max = - 1;
   2086        min = - ((1 << (bits - 1)) - 1);
   2087        if ((value > max) || (value < min))
   2088          retval = OP_OUT_OF_RANGE;
   2089      }
   2090    return retval;
   2091 }
   2092 
   2093 /* Bunch of error checking.
   2094    The checks are made after a matching instruction was found.  */
   2095 
   2096 static void
   2097 warn_if_needed (ins *insn)
   2098 {
   2099   /* If the post-increment address mode is used and the load/store
   2100      source register is the same as rbase, the result of the
   2101      instruction is undefined.  */
   2102   if (IS_INSN_TYPE (LD_STOR_INS_INC))
   2103     {
   2104       /* Enough to verify that one of the arguments is a simple reg.  */
   2105       if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
   2106         if (insn->arg[0].r == insn->arg[1].r)
   2107           as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn->arg[0].r);
   2108     }
   2109 
   2110   if (IS_INSN_MNEMONIC ("pop")
   2111       || IS_INSN_MNEMONIC ("push")
   2112       || IS_INSN_MNEMONIC ("popret"))
   2113     {
   2114       unsigned int count = insn->arg[0].constant, reg_val;
   2115 
   2116       /* Check if count operand caused to save/retrieve the RA twice
   2117          to generate warning message.  */
   2118      if (insn->nargs > 2)
   2119        {
   2120          reg_val = getreg_image (insn->arg[1].r);
   2121 
   2122          if (   ((reg_val == 9) &&  (count > 7))
   2123              || ((reg_val == 10) && (count > 6))
   2124              || ((reg_val == 11) && (count > 5))
   2125              || ((reg_val == 12) && (count > 4))
   2126              || ((reg_val == 13) && (count > 2))
   2127              || ((reg_val == 14) && (count > 0)))
   2128            as_warn (_("RA register is saved twice."));
   2129 
   2130          /* Check if the third operand is "RA" or "ra" */
   2131          if (!(((insn->arg[2].r) == ra) || ((insn->arg[2].r) == RA)))
   2132            as_bad (_("`%s' Illegal use of registers."), ins_parse);
   2133        }
   2134 
   2135       if (insn->nargs > 1)
   2136        {
   2137          reg_val = getreg_image (insn->arg[1].r);
   2138 
   2139          /* If register is a register pair ie r12/r13/r14 in operand1, then
   2140             the count constant should be validated.  */
   2141          if (((reg_val == 11) && (count > 7))
   2142              || ((reg_val == 12) && (count > 6))
   2143              || ((reg_val == 13) && (count > 4))
   2144              || ((reg_val == 14) && (count > 2))
   2145              || ((reg_val == 15) && (count > 0)))
   2146            as_bad (_("`%s' Illegal count-register combination."), ins_parse);
   2147        }
   2148      else
   2149        {
   2150          /* Check if the operand is "RA" or "ra" */
   2151          if (!(((insn->arg[0].r) == ra) || ((insn->arg[0].r) == RA)))
   2152            as_bad (_("`%s' Illegal use of register."), ins_parse);
   2153        }
   2154     }
   2155 
   2156   /* Some instruction assume the stack pointer as rptr operand.
   2157      Issue an error when the register to be loaded is also SP.  */
   2158   if (instruction->flags & NO_SP)
   2159     {
   2160       if (getreg_image (insn->arg[1].r) == getreg_image (sp))
   2161         as_bad (_("`%s' has undefined result"), ins_parse);
   2162     }
   2163 
   2164   /* If the rptr register is specified as one of the registers to be loaded,
   2165      the final contents of rptr are undefined. Thus, we issue an error.  */
   2166   if (instruction->flags & NO_RPTR)
   2167     {
   2168       if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
   2169         as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
   2170                   getreg_image (insn->arg[0].r));
   2171     }
   2172 }
   2173 
   2174 /* In some cases, we need to adjust the instruction pointer although a
   2175    match was already found. Here, we gather all these cases.
   2176    Returns 1 if instruction pointer was adjusted, otherwise 0.  */
   2177 
   2178 static int
   2179 adjust_if_needed (ins *insn ATTRIBUTE_UNUSED)
   2180 {
   2181   int ret_value = 0;
   2182 
   2183   if ((IS_INSN_TYPE (CSTBIT_INS)) || (IS_INSN_TYPE (LD_STOR_INS)))
   2184     {
   2185       if ((instruction->operands[0].op_type == abs24)
   2186            && ((insn->arg[0].constant) > 0xF00000))
   2187         {
   2188           insn->arg[0].constant &= 0xFFFFF;
   2189           instruction--;
   2190           ret_value = 1;
   2191         }
   2192     }
   2193 
   2194   return ret_value;
   2195 }
   2196 
   2197 /* Assemble a single instruction:
   2198    INSN is already parsed (that is, all operand values and types are set).
   2199    For instruction to be assembled, we need to find an appropriate template in
   2200    the instruction table, meeting the following conditions:
   2201     1: Has the same number of operands.
   2202     2: Has the same operand types.
   2203     3: Each operand size is sufficient to represent the instruction's values.
   2204    Returns 1 upon success, 0 upon failure.  */
   2205 
   2206 static int
   2207 assemble_insn (const char *mnemonic, ins *insn)
   2208 {
   2209   /* Type of each operand in the current template.  */
   2210   argtype cur_type[MAX_OPERANDS];
   2211   /* Size (in bits) of each operand in the current template.  */
   2212   unsigned int cur_size[MAX_OPERANDS];
   2213   /* Flags of each operand in the current template.  */
   2214   unsigned int cur_flags[MAX_OPERANDS];
   2215   /* Instruction type to match.  */
   2216   unsigned int ins_type;
   2217   /* Boolean flag to mark whether a match was found.  */
   2218   int match = 0;
   2219   int i;
   2220   /* Nonzero if an instruction with same number of operands was found.  */
   2221   int found_same_number_of_operands = 0;
   2222   /* Nonzero if an instruction with same argument types was found.  */
   2223   int found_same_argument_types = 0;
   2224   /* Nonzero if a constant was found within the required range.  */
   2225   int found_const_within_range  = 0;
   2226   /* Argument number of an operand with invalid type.  */
   2227   int invalid_optype = -1;
   2228   /* Argument number of an operand with invalid constant value.  */
   2229   int invalid_const  = -1;
   2230   /* Operand error (used for issuing various constant error messages).  */
   2231   op_err op_error, const_err = OP_LEGAL;
   2232 
   2233 /* Retrieve data (based on FUNC) for each operand of a given instruction.  */
   2234 #define GET_CURRENT_DATA(FUNC, ARRAY)                           \
   2235   for (i = 0; i < insn->nargs; i++)                             \
   2236     ARRAY[i] = FUNC (instruction->operands[i].op_type)
   2237 
   2238 #define GET_CURRENT_TYPE    GET_CURRENT_DATA (get_optype, cur_type)
   2239 #define GET_CURRENT_SIZE    GET_CURRENT_DATA (get_opbits, cur_size)
   2240 #define GET_CURRENT_FLAGS   GET_CURRENT_DATA (get_opflags, cur_flags)
   2241 
   2242   /* Instruction has no operands -> only copy the constant opcode.   */
   2243   if (insn->nargs == 0)
   2244     {
   2245       output_opcode[0] = BIN (instruction->match, instruction->match_bits);
   2246       return 1;
   2247     }
   2248 
   2249   /* In some case, same mnemonic can appear with different instruction types.
   2250      For example, 'storb' is supported with 3 different types :
   2251      LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
   2252      We assume that when reaching this point, the instruction type was
   2253      pre-determined. We need to make sure that the type stays the same
   2254      during a search for matching instruction.  */
   2255   ins_type = CR16_INS_TYPE (instruction->flags);
   2256 
   2257   while (/* Check that match is still not found.  */
   2258          match != 1
   2259          /* Check we didn't get to end of table.  */
   2260          && instruction->mnemonic != NULL
   2261          /* Check that the actual mnemonic is still available.  */
   2262          && IS_INSN_MNEMONIC (mnemonic)
   2263          /* Check that the instruction type wasn't changed.  */
   2264          && IS_INSN_TYPE (ins_type))
   2265     {
   2266       /* Check whether number of arguments is legal.  */
   2267       if (get_number_of_operands () != insn->nargs)
   2268         goto next_insn;
   2269       found_same_number_of_operands = 1;
   2270 
   2271       /* Initialize arrays with data of each operand in current template.  */
   2272       GET_CURRENT_TYPE;
   2273       GET_CURRENT_SIZE;
   2274       GET_CURRENT_FLAGS;
   2275 
   2276       /* Check for type compatibility.  */
   2277       for (i = 0; i < insn->nargs; i++)
   2278         {
   2279           if (cur_type[i] != insn->arg[i].type)
   2280             {
   2281               if (invalid_optype == -1)
   2282                 invalid_optype = i + 1;
   2283               goto next_insn;
   2284             }
   2285         }
   2286       found_same_argument_types = 1;
   2287 
   2288       for (i = 0; i < insn->nargs; i++)
   2289         {
   2290           /* If 'bal' instruction size is '2' and reg operand is not 'ra'
   2291              then goto next instruction.  */
   2292           if (IS_INSN_MNEMONIC ("bal") && (i == 0)
   2293               && (instruction->size == 2) && (insn->arg[i].rp != 14))
   2294             goto next_insn;
   2295 
   2296           /* If 'storb' instruction with 'sp' reg and 16-bit disp of
   2297            * reg-pair, leads to undefined trap, so this should use
   2298            * 20-bit disp of reg-pair.  */
   2299           if (IS_INSN_MNEMONIC ("storb") && (instruction->size == 2)
   2300               && (insn->arg[i].r == 15) && (insn->arg[i + 1].type == arg_crp))
   2301             goto next_insn;
   2302 
   2303           /* Only check range - don't update the constant's value, since the
   2304              current instruction may not be the last we try to match.
   2305              The constant's value will be updated later, right before printing
   2306              it to the object file.  */
   2307           if ((insn->arg[i].X_op == O_constant)
   2308               && (op_error = check_range (&insn->arg[i].constant, cur_size[i],
   2309                                           cur_flags[i], 0)))
   2310             {
   2311               if (invalid_const == -1)
   2312                 {
   2313                   invalid_const = i + 1;
   2314                   const_err = op_error;
   2315                 }
   2316               goto next_insn;
   2317             }
   2318           /* For symbols, we make sure the relocation size (which was already
   2319              determined) is sufficient.  */
   2320           else if ((insn->arg[i].X_op == O_symbol)
   2321                    && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
   2322                        > cur_size[i]))
   2323                   goto next_insn;
   2324         }
   2325       found_const_within_range = 1;
   2326 
   2327       /* If we got till here -> Full match is found.  */
   2328       match = 1;
   2329       break;
   2330 
   2331 /* Try again with next instruction.  */
   2332 next_insn:
   2333       instruction++;
   2334     }
   2335 
   2336   if (!match)
   2337     {
   2338       /* We haven't found a match - instruction can't be assembled.  */
   2339       if (!found_same_number_of_operands)
   2340         as_bad (_("Incorrect number of operands"));
   2341       else if (!found_same_argument_types)
   2342         as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
   2343       else if (!found_const_within_range)
   2344         {
   2345           switch (const_err)
   2346             {
   2347             case OP_OUT_OF_RANGE:
   2348               as_bad (_("Operand out of range (arg %d)"), invalid_const);
   2349               break;
   2350             case OP_NOT_EVEN:
   2351               as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
   2352               break;
   2353             default:
   2354               as_bad (_("Illegal operand (arg %d)"), invalid_const);
   2355               break;
   2356             }
   2357         }
   2358 
   2359        return 0;
   2360     }
   2361   else
   2362     /* Full match - print the encoding to output file.  */
   2363     {
   2364       /* Make further checking (such that couldn't be made earlier).
   2365          Warn the user if necessary.  */
   2366       warn_if_needed (insn);
   2367 
   2368       /* Check whether we need to adjust the instruction pointer.  */
   2369       if (adjust_if_needed (insn))
   2370         /* If instruction pointer was adjusted, we need to update
   2371            the size of the current template operands.  */
   2372         GET_CURRENT_SIZE;
   2373 
   2374       for (i = 0; i < insn->nargs; i++)
   2375         {
   2376           int j = instruction->flags & REVERSE_MATCH ?
   2377                   i == 0 ? 1 :
   2378                   i == 1 ? 0 : i :
   2379                   i;
   2380 
   2381           /* This time, update constant value before printing it.  */
   2382             if ((insn->arg[j].X_op == O_constant)
   2383                && (check_range (&insn->arg[j].constant, cur_size[j],
   2384                                 cur_flags[j], 1) != OP_LEGAL))
   2385               as_fatal (_("Illegal operand (arg %d)"), j+1);
   2386         }
   2387 
   2388       /* First, copy the instruction's opcode.  */
   2389       output_opcode[0] = BIN (instruction->match, instruction->match_bits);
   2390 
   2391       for (i = 0; i < insn->nargs; i++)
   2392         {
   2393          /* For BAL (ra),disp17 instruction only. And also set the
   2394             DISP24a relocation type.  */
   2395          if (IS_INSN_MNEMONIC ("bal") && (instruction->size == 2) && i == 0)
   2396            {
   2397              insn->rtype = BFD_RELOC_CR16_DISP24a;
   2398              continue;
   2399            }
   2400           cur_arg_num = i;
   2401           print_operand (cur_size[i], instruction->operands[i].shift,
   2402                          &insn->arg[i]);
   2403         }
   2404     }
   2405 
   2406   return 1;
   2407 }
   2408 
   2409 /* Print the instruction.
   2410    Handle also cases where the instruction is relaxable/relocatable.  */
   2411 
   2412 static void
   2413 print_insn (ins *insn)
   2414 {
   2415   unsigned int i, j, insn_size;
   2416   char *this_frag;
   2417   unsigned short words[4];
   2418   int addr_mod;
   2419 
   2420   /* Arrange the insn encodings in a WORD size array.  */
   2421   for (i = 0, j = 0; i < 2; i++)
   2422     {
   2423       words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
   2424       words[j++] = output_opcode[i] & 0xFFFF;
   2425     }
   2426 
   2427     /* Handle relocation.  */
   2428     if ((instruction->flags & RELAXABLE) && relocatable)
   2429       {
   2430         int relax_subtype;
   2431         /* Write the maximal instruction size supported.  */
   2432         insn_size = INSN_MAX_SIZE;
   2433 
   2434         if (IS_INSN_TYPE (BRANCH_INS))
   2435           {
   2436             switch (insn->rtype)
   2437               {
   2438               case BFD_RELOC_CR16_DISP24:
   2439                 relax_subtype = 2;
   2440                 break;
   2441               case BFD_RELOC_CR16_DISP16:
   2442                 relax_subtype = 1;
   2443                 break;
   2444               default:
   2445                 relax_subtype = 0;
   2446                 break;
   2447               }
   2448           }
   2449         else
   2450           abort ();
   2451 
   2452         this_frag = frag_var (rs_machine_dependent, insn_size *2,
   2453                               4, relax_subtype,
   2454                               insn->exp.X_add_symbol,
   2455                               0,
   2456                               0);
   2457       }
   2458     else
   2459       {
   2460         insn_size = instruction->size;
   2461         this_frag = frag_more (insn_size * 2);
   2462 
   2463         if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
   2464           {
   2465              reloc_howto_type *reloc_howto;
   2466              int size;
   2467 
   2468              reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
   2469 
   2470              if (!reloc_howto)
   2471                abort ();
   2472 
   2473              size = bfd_get_reloc_size (reloc_howto);
   2474 
   2475              if (size < 1 || size > 4)
   2476                abort ();
   2477 
   2478              fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
   2479                           size, &insn->exp, reloc_howto->pc_relative,
   2480                           insn->rtype);
   2481           }
   2482       }
   2483 
   2484   /* Verify a 2-byte code alignment.  */
   2485   addr_mod = frag_now_fix () & 1;
   2486   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
   2487     as_bad (_("instruction address is not a multiple of 2"));
   2488   frag_now->insn_addr = addr_mod;
   2489   frag_now->has_code = 1;
   2490 
   2491   /* Write the instruction encoding to frag.  */
   2492   for (i = 0; i < insn_size; i++)
   2493     {
   2494       md_number_to_chars (this_frag, (valueT) words[i], 2);
   2495       this_frag += 2;
   2496     }
   2497 }
   2498 
   2499 /* Actually assemble an instruction.  */
   2500 
   2501 static void
   2502 cr16_assemble (const char *op, char *param)
   2503 {
   2504   ins cr16_ins;
   2505 
   2506   /* Find the instruction.  */
   2507   instruction = (const inst *) hash_find (cr16_inst_hash, op);
   2508   if (instruction == NULL)
   2509     {
   2510       as_bad (_("Unknown opcode: `%s'"), op);
   2511       return;
   2512     }
   2513 
   2514   /* Tie dwarf2 debug info to the address at the start of the insn.  */
   2515   dwarf2_emit_insn (0);
   2516 
   2517   /* Parse the instruction's operands.  */
   2518   parse_insn (&cr16_ins, param);
   2519 
   2520   /* Assemble the instruction - return upon failure.  */
   2521   if (assemble_insn (op, &cr16_ins) == 0)
   2522     return;
   2523 
   2524   /* Print the instruction.  */
   2525   print_insn (&cr16_ins);
   2526 }
   2527 
   2528 /* This is the guts of the machine-dependent assembler.  OP points to a
   2529    machine dependent instruction.  This function is supposed to emit
   2530    the frags/bytes it assembles to.  */
   2531 
   2532 void
   2533 md_assemble (char *op)
   2534 {
   2535   ins cr16_ins;
   2536   char *param, param1[32];
   2537 
   2538   /* Reset global variables for a new instruction.  */
   2539   reset_vars (op);
   2540 
   2541   /* Strip the mnemonic.  */
   2542   for (param = op; *param != 0 && !ISSPACE (*param); param++)
   2543     ;
   2544   *param++ = '\0';
   2545 
   2546   /* bCC instructions and adjust the mnemonic by adding extra white spaces.  */
   2547   if (is_bcc_insn (op))
   2548     {
   2549       strcpy (param1, get_b_cc (op));
   2550       strcat (param1,",");
   2551       strcat (param1, param);
   2552       param = (char *) &param1;
   2553       cr16_assemble ("b", param);
   2554       return;
   2555     }
   2556 
   2557   /* Checking the cinv options and adjust the mnemonic by removing the
   2558      extra white spaces.  */
   2559   if (streq ("cinv", op))
   2560     {
   2561      /* Validate the cinv options.  */
   2562       check_cinv_options (param);
   2563       strcat (op, param);
   2564     }
   2565 
   2566   /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
   2567      lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
   2568      as CR16 core doesn't support lsh[b/w] right shift operations.  */
   2569   if ((streq ("lshb", op) || streq ("lshw", op) || streq ("lshd", op))
   2570       && (param [0] == '$'))
   2571     {
   2572       strcpy (param1, param);
   2573       /* Find the instruction.  */
   2574       instruction = (const inst *) hash_find (cr16_inst_hash, op);
   2575        parse_operands (&cr16_ins, param1);
   2576       if (((&cr16_ins)->arg[0].type == arg_ic)
   2577           && ((&cr16_ins)->arg[0].constant >= 0))
   2578         {
   2579            if (streq ("lshb", op))
   2580              cr16_assemble ("ashub", param);
   2581            else if (streq ("lshd", op))
   2582              cr16_assemble ("ashud", param);
   2583            else
   2584              cr16_assemble ("ashuw", param);
   2585 	   return;
   2586         }
   2587     }
   2588 
   2589   cr16_assemble (op, param);
   2590 }
   2591