Home | History | Annotate | Line # | Download | only in config
tc-crx.c revision 1.1.1.8
      1 /* tc-crx.c -- Assembler code for the CRX CPU core.
      2    Copyright (C) 2004-2020 Free Software Foundation, Inc.
      3 
      4    Contributed by Tomer Levi, NSC, Israel.
      5    Originally written for GAS 2.12 by Tomer Levi, NSC, Israel.
      6    Updates, BFDizing, GNUifying and ELF support by Tomer Levi.
      7 
      8    This file is part of GAS, the GNU Assembler.
      9 
     10    GAS is free software; you can redistribute it and/or modify
     11    it under the terms of the GNU General Public License as published by
     12    the Free Software Foundation; either version 3, or (at your option)
     13    any later version.
     14 
     15    GAS is distributed in the hope that it will be useful,
     16    but WITHOUT ANY WARRANTY; without even the implied warranty of
     17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18    GNU General Public License for more details.
     19 
     20    You should have received a copy of the GNU General Public License
     21    along with GAS; see the file COPYING.  If not, write to the
     22    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
     23    MA 02110-1301, USA.  */
     24 
     25 #include "as.h"
     26 #include "bfd_stdint.h"
     27 #include "safe-ctype.h"
     28 #include "dwarf2dbg.h"
     29 #include "opcode/crx.h"
     30 #include "elf/crx.h"
     31 
     32 /* Word is considered here as a 16-bit unsigned short int.  */
     33 #define WORD_SHIFT  16
     34 
     35 /* Register is 4-bit size.  */
     36 #define REG_SIZE   4
     37 
     38 /* Maximum size of a single instruction (in words).  */
     39 #define INSN_MAX_SIZE   3
     40 
     41 /* Maximum bits which may be set in a `mask16' operand.  */
     42 #define MAX_REGS_IN_MASK16  8
     43 
     44 /* Utility macros for string comparison.  */
     45 #define streq(a, b)           (strcmp (a, b) == 0)
     46 #define strneq(a, b, c)       (strncmp (a, b, c) == 0)
     47 
     48 /* Assign a number NUM, shifted by SHIFT bytes, into a location
     49    pointed by index BYTE of array 'output_opcode'.  */
     50 #define CRX_PRINT(BYTE, NUM, SHIFT)   output_opcode[BYTE] |= (NUM << SHIFT)
     51 
     52 /* Operand errors.  */
     53 typedef enum
     54   {
     55     OP_LEGAL = 0,	/* Legal operand.  */
     56     OP_OUT_OF_RANGE,	/* Operand not within permitted range.  */
     57     OP_NOT_EVEN,	/* Operand is Odd number, should be even.  */
     58     OP_ILLEGAL_DISPU4,	/* Operand is not within DISPU4 range.  */
     59     OP_ILLEGAL_CST4,	/* Operand is not within CST4 range.  */
     60     OP_NOT_UPPER_64KB	/* Operand is not within the upper 64KB
     61 			   (0xFFFF0000-0xFFFFFFFF).  */
     62   }
     63 op_err;
     64 
     65 /* Opcode mnemonics hash table.  */
     66 static struct hash_control *crx_inst_hash;
     67 /* CRX registers hash table.  */
     68 static struct hash_control *reg_hash;
     69 /* CRX coprocessor registers hash table.  */
     70 static struct hash_control *copreg_hash;
     71 /* Current instruction we're assembling.  */
     72 static const inst *instruction;
     73 
     74 /* Global variables.  */
     75 
     76 /* Array to hold an instruction encoding.  */
     77 static long output_opcode[2];
     78 
     79 /* Nonzero means a relocatable symbol.  */
     80 static int relocatable;
     81 
     82 /* A copy of the original instruction (used in error messages).  */
     83 static char ins_parse[MAX_INST_LEN];
     84 
     85 /* The current processed argument number.  */
     86 static int cur_arg_num;
     87 
     88 /* Generic assembler global variables which must be defined by all targets.  */
     89 
     90 /* Characters which always start a comment.  */
     91 const char comment_chars[] = "#";
     92 
     93 /* Characters which start a comment at the beginning of a line.  */
     94 const char line_comment_chars[] = "#";
     95 
     96 /* This array holds machine specific line separator characters.  */
     97 const char line_separator_chars[] = ";";
     98 
     99 /* Chars that can be used to separate mant from exp in floating point nums.  */
    100 const char EXP_CHARS[] = "eE";
    101 
    102 /* Chars that mean this number is a floating point constant as in 0f12.456  */
    103 const char FLT_CHARS[] = "f'";
    104 
    105 /* Target-specific multicharacter options, not const-declared at usage.  */
    106 const char *md_shortopts = "";
    107 struct option md_longopts[] =
    108 {
    109   {NULL, no_argument, NULL, 0}
    110 };
    111 size_t md_longopts_size = sizeof (md_longopts);
    112 
    113 /* This table describes all the machine specific pseudo-ops
    114    the assembler has to support.  The fields are:
    115    *** Pseudo-op name without dot.
    116    *** Function to call to execute this pseudo-op.
    117    *** Integer arg to pass to the function.  */
    118 
    119 const pseudo_typeS md_pseudo_table[] =
    120 {
    121   /* In CRX machine, align is in bytes (not a ptwo boundary).  */
    122   {"align", s_align_bytes, 0},
    123   {0, 0, 0}
    124 };
    125 
    126 /* CRX relaxation table.  */
    127 const relax_typeS md_relax_table[] =
    128 {
    129   /* bCC  */
    130   {0xfa, -0x100, 2, 1},			/*  8 */
    131   {0xfffe, -0x10000, 4, 2},		/* 16 */
    132   {0xfffffffe, -0xfffffffe, 6, 0},	/* 32 */
    133 
    134   /* bal  */
    135   {0xfffe, -0x10000, 4, 4},		/* 16 */
    136   {0xfffffffe, -0xfffffffe, 6, 0},	/* 32 */
    137 
    138   /* cmpbr/bcop  */
    139   {0xfe, -0x100, 4, 6},			/*  8 */
    140   {0xfffffe, -0x1000000, 6, 0}		/* 24 */
    141 };
    142 
    143 static void    reset_vars	        (char *);
    144 static reg     get_register	        (char *);
    145 static copreg  get_copregister	        (char *);
    146 static argtype get_optype	        (operand_type);
    147 static int     get_opbits	        (operand_type);
    148 static int     get_opflags	        (operand_type);
    149 static int     get_number_of_operands   (void);
    150 static void    parse_operand	        (char *, ins *);
    151 static int     gettrap		        (const char *);
    152 static void    handle_LoadStor	        (const char *);
    153 static int     get_cinv_parameters      (const char *);
    154 static long    getconstant		(long, int);
    155 static op_err  check_range		(long *, int, unsigned int, int);
    156 static int     getreg_image	        (reg);
    157 static void    parse_operands	        (ins *, char *);
    158 static void    parse_insn	        (ins *, char *);
    159 static void    print_operand	        (int, int, argument *);
    160 static void    print_constant	        (int, int, argument *);
    161 static int     exponent2scale	        (int);
    162 static void    mask_reg		        (int, unsigned short *);
    163 static void    process_label_constant   (char *, ins *);
    164 static void    set_operand	        (char *, ins *);
    165 static char *  preprocess_reglist       (char *, int *);
    166 static int     assemble_insn	        (char *, ins *);
    167 static void    print_insn	        (ins *);
    168 static void    warn_if_needed		(ins *);
    169 static int     adjust_if_needed		(ins *);
    170 
    171 /* Return the bit size for a given operand.  */
    172 
    173 static int
    174 get_opbits (operand_type op)
    175 {
    176   if (op < MAX_OPRD)
    177     return crx_optab[op].bit_size;
    178   else
    179     return 0;
    180 }
    181 
    182 /* Return the argument type of a given operand.  */
    183 
    184 static argtype
    185 get_optype (operand_type op)
    186 {
    187   if (op < MAX_OPRD)
    188     return crx_optab[op].arg_type;
    189   else
    190     return nullargs;
    191 }
    192 
    193 /* Return the flags of a given operand.  */
    194 
    195 static int
    196 get_opflags (operand_type op)
    197 {
    198   if (op < MAX_OPRD)
    199     return crx_optab[op].flags;
    200   else
    201     return 0;
    202 }
    203 
    204 /* Get the core processor register 'reg_name'.  */
    205 
    206 static reg
    207 get_register (char *reg_name)
    208 {
    209   const reg_entry *rreg;
    210 
    211   rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
    212 
    213   if (rreg != NULL)
    214     return rreg->value.reg_val;
    215   else
    216     return nullregister;
    217 }
    218 
    219 /* Get the coprocessor register 'copreg_name'.  */
    220 
    221 static copreg
    222 get_copregister (char *copreg_name)
    223 {
    224   const reg_entry *coreg;
    225 
    226   coreg = (const reg_entry *) hash_find (copreg_hash, copreg_name);
    227 
    228   if (coreg != NULL)
    229     return coreg->value.copreg_val;
    230   else
    231     return nullcopregister;
    232 }
    233 
    234 /* Round up a section size to the appropriate boundary.  */
    235 
    236 valueT
    237 md_section_align (segT seg, valueT val)
    238 {
    239   /* Round .text section to a multiple of 2.  */
    240   if (seg == text_section)
    241     return (val + 1) & ~1;
    242   return val;
    243 }
    244 
    245 /* Parse an operand that is machine-specific (remove '*').  */
    246 
    247 void
    248 md_operand (expressionS * exp)
    249 {
    250   char c = *input_line_pointer;
    251 
    252   switch (c)
    253     {
    254     case '*':
    255       input_line_pointer++;
    256       expression (exp);
    257       break;
    258     default:
    259       break;
    260     }
    261 }
    262 
    263 /* Reset global variables before parsing a new instruction.  */
    264 
    265 static void
    266 reset_vars (char *op)
    267 {
    268   cur_arg_num = relocatable = 0;
    269   memset (& output_opcode, '\0', sizeof (output_opcode));
    270 
    271   /* Save a copy of the original OP (used in error messages).  */
    272   strncpy (ins_parse, op, sizeof ins_parse - 1);
    273   ins_parse [sizeof ins_parse - 1] = 0;
    274 }
    275 
    276 /* This macro decides whether a particular reloc is an entry in a
    277    switch table.  It is used when relaxing, because the linker needs
    278    to know about all such entries so that it can adjust them if
    279    necessary.  */
    280 
    281 #define SWITCH_TABLE(fix)				  \
    282   (   (fix)->fx_addsy != NULL				  \
    283    && (fix)->fx_subsy != NULL				  \
    284    && S_GET_SEGMENT ((fix)->fx_addsy) ==		  \
    285       S_GET_SEGMENT ((fix)->fx_subsy)			  \
    286    && S_GET_SEGMENT (fix->fx_addsy) != undefined_section  \
    287    && (   (fix)->fx_r_type == BFD_RELOC_CRX_NUM8	  \
    288        || (fix)->fx_r_type == BFD_RELOC_CRX_NUM16	  \
    289        || (fix)->fx_r_type == BFD_RELOC_CRX_NUM32))
    290 
    291 /* See whether we need to force a relocation into the output file.
    292    This is used to force out switch and PC relative relocations when
    293    relaxing.  */
    294 
    295 int
    296 crx_force_relocation (fixS *fix)
    297 {
    298   if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
    299     return 1;
    300 
    301   return 0;
    302 }
    303 
    304 /* Generate a relocation entry for a fixup.  */
    305 
    306 arelent *
    307 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
    308 {
    309   arelent * reloc;
    310 
    311   reloc = XNEW (arelent);
    312   reloc->sym_ptr_ptr  = XNEW (asymbol *);
    313   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
    314   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
    315   reloc->addend = fixP->fx_offset;
    316 
    317   if (fixP->fx_subsy != NULL)
    318     {
    319       if (SWITCH_TABLE (fixP))
    320 	{
    321 	  /* Keep the current difference in the addend.  */
    322 	  reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
    323 			   - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
    324 
    325 	  switch (fixP->fx_r_type)
    326 	    {
    327 	    case BFD_RELOC_CRX_NUM8:
    328 	      fixP->fx_r_type = BFD_RELOC_CRX_SWITCH8;
    329 	      break;
    330 	    case BFD_RELOC_CRX_NUM16:
    331 	      fixP->fx_r_type = BFD_RELOC_CRX_SWITCH16;
    332 	      break;
    333 	    case BFD_RELOC_CRX_NUM32:
    334 	      fixP->fx_r_type = BFD_RELOC_CRX_SWITCH32;
    335 	      break;
    336 	    default:
    337 	      abort ();
    338 	      break;
    339 	    }
    340 	}
    341       else
    342 	{
    343 	  /* We only resolve difference expressions in the same section.  */
    344 	  as_bad_where (fixP->fx_file, fixP->fx_line,
    345 			_("can't resolve `%s' {%s section} - `%s' {%s section}"),
    346 			fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
    347 			segment_name (fixP->fx_addsy
    348 				      ? S_GET_SEGMENT (fixP->fx_addsy)
    349 				      : absolute_section),
    350 			S_GET_NAME (fixP->fx_subsy),
    351 			segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
    352 	}
    353     }
    354 
    355   gas_assert ((int) fixP->fx_r_type > 0);
    356   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
    357 
    358   if (reloc->howto == (reloc_howto_type *) NULL)
    359     {
    360       as_bad_where (fixP->fx_file, fixP->fx_line,
    361 		    _("internal error: reloc %d (`%s') not supported by object file format"),
    362 		    fixP->fx_r_type,
    363 		    bfd_get_reloc_code_name (fixP->fx_r_type));
    364       return NULL;
    365     }
    366   gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
    367 
    368   return reloc;
    369 }
    370 
    371 /* Prepare machine-dependent frags for relaxation.  */
    372 
    373 int
    374 md_estimate_size_before_relax (fragS *fragp, asection *seg)
    375 {
    376   /* If symbol is undefined or located in a different section,
    377      select the largest supported relocation.  */
    378   relax_substateT subtype;
    379   relax_substateT rlx_state[] = {0, 2,
    380 				 3, 4,
    381 				 5, 6};
    382 
    383   for (subtype = 0; subtype < ARRAY_SIZE (rlx_state); subtype += 2)
    384     {
    385       if (fragp->fr_subtype == rlx_state[subtype]
    386 	  && (!S_IS_DEFINED (fragp->fr_symbol)
    387 	      || seg != S_GET_SEGMENT (fragp->fr_symbol)))
    388 	{
    389 	  fragp->fr_subtype = rlx_state[subtype + 1];
    390 	  break;
    391 	}
    392     }
    393 
    394   if (fragp->fr_subtype >= ARRAY_SIZE (md_relax_table))
    395     abort ();
    396 
    397   return md_relax_table[fragp->fr_subtype].rlx_length;
    398 }
    399 
    400 void
    401 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP)
    402 {
    403   /* 'opcode' points to the start of the instruction, whether
    404      we need to change the instruction's fixed encoding.  */
    405   char *opcode = fragP->fr_literal + fragP->fr_fix;
    406   bfd_reloc_code_real_type reloc;
    407 
    408   subseg_change (sec, 0);
    409 
    410   switch (fragP->fr_subtype)
    411     {
    412     case 0:
    413       reloc = BFD_RELOC_CRX_REL8;
    414       break;
    415     case 1:
    416       *opcode = 0x7e;
    417       reloc = BFD_RELOC_CRX_REL16;
    418       break;
    419     case 2:
    420       *opcode = 0x7f;
    421       reloc = BFD_RELOC_CRX_REL32;
    422       break;
    423     case 3:
    424       reloc = BFD_RELOC_CRX_REL16;
    425       break;
    426     case 4:
    427       *++opcode = 0x31;
    428       reloc = BFD_RELOC_CRX_REL32;
    429       break;
    430     case 5:
    431       reloc = BFD_RELOC_CRX_REL8_CMP;
    432       break;
    433     case 6:
    434       *++opcode = 0x31;
    435       reloc = BFD_RELOC_CRX_REL24;
    436       break;
    437     default:
    438       abort ();
    439       break;
    440     }
    441 
    442     fix_new (fragP, fragP->fr_fix,
    443 	     bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput, reloc)),
    444 	     fragP->fr_symbol, fragP->fr_offset, 1, reloc);
    445     fragP->fr_var = 0;
    446     fragP->fr_fix += md_relax_table[fragP->fr_subtype].rlx_length;
    447 }
    448 
    449 /* Process machine-dependent command line options.  Called once for
    450    each option on the command line that the machine-independent part of
    451    GAS does not understand.  */
    452 
    453 int
    454 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
    455 {
    456   return 0;
    457 }
    458 
    459 /* Machine-dependent usage-output.  */
    460 
    461 void
    462 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
    463 {
    464   return;
    465 }
    466 
    467 const char *
    468 md_atof (int type, char *litP, int *sizeP)
    469 {
    470   return ieee_md_atof (type, litP, sizeP, target_big_endian);
    471 }
    472 
    473 /* Apply a fixS (fixup of an instruction or data that we didn't have
    474    enough info to complete immediately) to the data in a frag.
    475    Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
    476    relaxation of debug sections, this function is called only when
    477    fixuping relocations of debug sections.  */
    478 
    479 void
    480 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
    481 {
    482   valueT val = * valP;
    483   char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
    484   fixP->fx_offset = 0;
    485 
    486   switch (fixP->fx_r_type)
    487     {
    488     case BFD_RELOC_CRX_NUM8:
    489       bfd_put_8 (stdoutput, (unsigned char) val, buf);
    490       break;
    491     case BFD_RELOC_CRX_NUM16:
    492       bfd_put_16 (stdoutput, val, buf);
    493       break;
    494     case BFD_RELOC_CRX_NUM32:
    495       bfd_put_32 (stdoutput, val, buf);
    496       break;
    497     default:
    498       /* We shouldn't ever get here because linkrelax is nonzero.  */
    499       abort ();
    500       break;
    501     }
    502 
    503   fixP->fx_done = 0;
    504 
    505   if (fixP->fx_addsy == NULL
    506       && fixP->fx_pcrel == 0)
    507     fixP->fx_done = 1;
    508 
    509   if (fixP->fx_pcrel == 1
    510       && fixP->fx_addsy != NULL
    511       && S_GET_SEGMENT (fixP->fx_addsy) == seg)
    512     fixP->fx_done = 1;
    513 }
    514 
    515 /* The location from which a PC relative jump should be calculated,
    516    given a PC relative reloc.  */
    517 
    518 long
    519 md_pcrel_from (fixS *fixp)
    520 {
    521   return fixp->fx_frag->fr_address + fixp->fx_where;
    522 }
    523 
    524 /* This function is called once, at assembler startup time.  This should
    525    set up all the tables, etc that the MD part of the assembler needs.  */
    526 
    527 void
    528 md_begin (void)
    529 {
    530   const char *hashret = NULL;
    531   int i = 0;
    532 
    533   /* Set up a hash table for the instructions.  */
    534   if ((crx_inst_hash = hash_new ()) == NULL)
    535     as_fatal (_("Virtual memory exhausted"));
    536 
    537   while (crx_instruction[i].mnemonic != NULL)
    538     {
    539       const char *mnemonic = crx_instruction[i].mnemonic;
    540 
    541       hashret = hash_insert (crx_inst_hash, mnemonic,
    542 			     (void *) &crx_instruction[i]);
    543 
    544       if (hashret != NULL && *hashret != '\0')
    545 	as_fatal (_("Can't hash `%s': %s\n"), crx_instruction[i].mnemonic,
    546 		  *hashret == 0 ? _("(unknown reason)") : hashret);
    547 
    548       /* Insert unique names into hash table.  The CRX instruction set
    549 	 has many identical opcode names that have different opcodes based
    550 	 on the operands.  This hash table then provides a quick index to
    551 	 the first opcode with a particular name in the opcode table.  */
    552       do
    553 	{
    554 	  ++i;
    555 	}
    556       while (crx_instruction[i].mnemonic != NULL
    557 	     && streq (crx_instruction[i].mnemonic, mnemonic));
    558     }
    559 
    560   /* Initialize reg_hash hash table.  */
    561   if ((reg_hash = hash_new ()) == NULL)
    562     as_fatal (_("Virtual memory exhausted"));
    563 
    564   {
    565     const reg_entry *regtab;
    566 
    567     for (regtab = crx_regtab;
    568 	 regtab < (crx_regtab + NUMREGS); regtab++)
    569       {
    570 	hashret = hash_insert (reg_hash, regtab->name, (void *) regtab);
    571 	if (hashret)
    572 	  as_fatal (_("Internal error: Can't hash %s: %s"),
    573 		    regtab->name,
    574 		    hashret);
    575       }
    576   }
    577 
    578   /* Initialize copreg_hash hash table.  */
    579   if ((copreg_hash = hash_new ()) == NULL)
    580     as_fatal (_("Virtual memory exhausted"));
    581 
    582   {
    583     const reg_entry *copregtab;
    584 
    585     for (copregtab = crx_copregtab; copregtab < (crx_copregtab + NUMCOPREGS);
    586 	 copregtab++)
    587       {
    588 	hashret = hash_insert (copreg_hash, copregtab->name,
    589 			       (void *) copregtab);
    590 	if (hashret)
    591 	  as_fatal (_("Internal error: Can't hash %s: %s"),
    592 		    copregtab->name,
    593 		    hashret);
    594       }
    595   }
    596   /*  Set linkrelax here to avoid fixups in most sections.  */
    597   linkrelax = 1;
    598 }
    599 
    600 /* Process constants (immediate/absolute)
    601    and labels (jump targets/Memory locations).  */
    602 
    603 static void
    604 process_label_constant (char *str, ins * crx_ins)
    605 {
    606   char *saved_input_line_pointer;
    607   argument *cur_arg = &crx_ins->arg[cur_arg_num];  /* Current argument.  */
    608 
    609   saved_input_line_pointer = input_line_pointer;
    610   input_line_pointer = str;
    611 
    612   expression (&crx_ins->exp);
    613 
    614   switch (crx_ins->exp.X_op)
    615     {
    616     case O_big:
    617     case O_absent:
    618       /* Missing or bad expr becomes absolute 0.  */
    619       as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
    620 	      str);
    621       crx_ins->exp.X_op = O_constant;
    622       crx_ins->exp.X_add_number = 0;
    623       crx_ins->exp.X_add_symbol = (symbolS *) 0;
    624       crx_ins->exp.X_op_symbol = (symbolS *) 0;
    625       /* Fall through.  */
    626 
    627     case O_constant:
    628       cur_arg->X_op = O_constant;
    629       cur_arg->constant = crx_ins->exp.X_add_number;
    630       break;
    631 
    632     case O_symbol:
    633     case O_subtract:
    634     case O_add:
    635       cur_arg->X_op = O_symbol;
    636       crx_ins->rtype = BFD_RELOC_NONE;
    637       relocatable = 1;
    638 
    639       switch (cur_arg->type)
    640 	{
    641 	case arg_cr:
    642           if (IS_INSN_TYPE (LD_STOR_INS_INC))
    643 	    crx_ins->rtype = BFD_RELOC_CRX_REGREL12;
    644           else if (IS_INSN_TYPE (CSTBIT_INS)
    645 		   || IS_INSN_TYPE (STOR_IMM_INS))
    646 	    crx_ins->rtype = BFD_RELOC_CRX_REGREL28;
    647           else
    648 	    crx_ins->rtype = BFD_RELOC_CRX_REGREL32;
    649 	  break;
    650 
    651 	case arg_idxr:
    652 	    crx_ins->rtype = BFD_RELOC_CRX_REGREL22;
    653 	  break;
    654 
    655 	case arg_c:
    656           if (IS_INSN_MNEMONIC ("bal") || IS_INSN_TYPE (DCR_BRANCH_INS))
    657 	    crx_ins->rtype = BFD_RELOC_CRX_REL16;
    658 	  else if (IS_INSN_TYPE (BRANCH_INS))
    659 	    crx_ins->rtype = BFD_RELOC_CRX_REL8;
    660           else if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (STOR_IMM_INS)
    661 		   || IS_INSN_TYPE (CSTBIT_INS))
    662 	    crx_ins->rtype = BFD_RELOC_CRX_ABS32;
    663 	  else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
    664 	    crx_ins->rtype = BFD_RELOC_CRX_REL4;
    665           else if (IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (COP_BRANCH_INS))
    666 	    crx_ins->rtype = BFD_RELOC_CRX_REL8_CMP;
    667 	  break;
    668 
    669 	case arg_ic:
    670           if (IS_INSN_TYPE (ARITH_INS))
    671 	    crx_ins->rtype = BFD_RELOC_CRX_IMM32;
    672 	  else if (IS_INSN_TYPE (ARITH_BYTE_INS))
    673 	    crx_ins->rtype = BFD_RELOC_CRX_IMM16;
    674 	  break;
    675 	default:
    676 	  break;
    677       }
    678       break;
    679 
    680     default:
    681       cur_arg->X_op = crx_ins->exp.X_op;
    682       break;
    683     }
    684 
    685   input_line_pointer = saved_input_line_pointer;
    686   return;
    687 }
    688 
    689 /* Get the values of the scale to be encoded -
    690    used for the scaled index mode of addressing.  */
    691 
    692 static int
    693 exponent2scale (int val)
    694 {
    695   int exponent;
    696 
    697   /* If 'val' is 0, the following 'for' will be an endless loop.  */
    698   if (val == 0)
    699     return 0;
    700 
    701   for (exponent = 0; (val != 1); val >>= 1, exponent++)
    702     ;
    703 
    704   return exponent;
    705 }
    706 
    707 /* Parsing different types of operands
    708    -> constants		    Immediate/Absolute/Relative numbers
    709    -> Labels		    Relocatable symbols
    710    -> (rbase)		    Register base
    711    -> disp(rbase)	    Register relative
    712    -> disp(rbase)+	    Post-increment mode
    713    -> disp(rbase,ridx,scl)  Register index mode  */
    714 
    715 static void
    716 set_operand (char *operand, ins * crx_ins)
    717 {
    718   char *operandS; /* Pointer to start of sub-operand.  */
    719   char *operandE; /* Pointer to end of sub-operand.  */
    720   expressionS scale;
    721   int scale_val;
    722   char *input_save, c;
    723   argument *cur_arg = &crx_ins->arg[cur_arg_num]; /* Current argument.  */
    724 
    725   /* Initialize pointers.  */
    726   operandS = operandE = operand;
    727 
    728   switch (cur_arg->type)
    729     {
    730     case arg_sc:    /* Case *+0x18.  */
    731     case arg_ic:    /* Case $0x18.  */
    732       operandS++;
    733       /* Fall through.  */
    734     case arg_c:	    /* Case 0x18.  */
    735       /* Set constant.  */
    736       process_label_constant (operandS, crx_ins);
    737 
    738       if (cur_arg->type != arg_ic)
    739 	cur_arg->type = arg_c;
    740       break;
    741 
    742     case arg_icr:   /* Case $0x18(r1).  */
    743       operandS++;
    744     case arg_cr:    /* Case 0x18(r1).   */
    745       /* Set displacement constant.  */
    746       while (*operandE != '(')
    747 	operandE++;
    748       *operandE = '\0';
    749       process_label_constant (operandS, crx_ins);
    750       operandS = operandE;
    751       /* Fall through.  */
    752     case arg_rbase: /* Case (r1).  */
    753       operandS++;
    754       /* Set register base.  */
    755       while (*operandE != ')')
    756 	operandE++;
    757       *operandE = '\0';
    758       if ((cur_arg->r = get_register (operandS)) == nullregister)
    759 	as_bad (_("Illegal register `%s' in instruction `%s'"),
    760 		operandS, ins_parse);
    761 
    762       if (cur_arg->type != arg_rbase)
    763 	cur_arg->type = arg_cr;
    764       break;
    765 
    766     case arg_idxr:
    767       /* Set displacement constant.  */
    768       while (*operandE != '(')
    769 	operandE++;
    770       *operandE = '\0';
    771       process_label_constant (operandS, crx_ins);
    772       operandS = ++operandE;
    773 
    774       /* Set register base.  */
    775       while ((*operandE != ',') && (! ISSPACE (*operandE)))
    776 	operandE++;
    777       *operandE++ = '\0';
    778       if ((cur_arg->r = get_register (operandS)) == nullregister)
    779 	as_bad (_("Illegal register `%s' in instruction `%s'"),
    780 		operandS, ins_parse);
    781 
    782       /* Skip leading white space.  */
    783       while (ISSPACE (*operandE))
    784 	operandE++;
    785       operandS = operandE;
    786 
    787       /* Set register index.  */
    788       while ((*operandE != ')') && (*operandE != ','))
    789 	operandE++;
    790       c = *operandE;
    791       *operandE++ = '\0';
    792 
    793       if ((cur_arg->i_r = get_register (operandS)) == nullregister)
    794 	as_bad (_("Illegal register `%s' in instruction `%s'"),
    795 		operandS, ins_parse);
    796 
    797       /* Skip leading white space.  */
    798       while (ISSPACE (*operandE))
    799 	operandE++;
    800       operandS = operandE;
    801 
    802       /* Set the scale.  */
    803       if (c == ')')
    804 	cur_arg->scale = 0;
    805       else
    806         {
    807 	  while (*operandE != ')')
    808 	    operandE++;
    809 	  *operandE = '\0';
    810 
    811 	  /* Preprocess the scale string.  */
    812 	  input_save = input_line_pointer;
    813 	  input_line_pointer = operandS;
    814 	  expression (&scale);
    815 	  input_line_pointer = input_save;
    816 
    817 	  scale_val = scale.X_add_number;
    818 
    819 	  /* Check if the scale value is legal.  */
    820           if (scale_val != 1 && scale_val != 2
    821               && scale_val != 4 && scale_val != 8)
    822 	    as_bad (_("Illegal Scale - `%d'"), scale_val);
    823 
    824 	  cur_arg->scale = exponent2scale (scale_val);
    825         }
    826       break;
    827 
    828     default:
    829       break;
    830     }
    831 }
    832 
    833 /* Parse a single operand.
    834    operand - Current operand to parse.
    835    crx_ins - Current assembled instruction.  */
    836 
    837 static void
    838 parse_operand (char *operand, ins * crx_ins)
    839 {
    840   int ret_val;
    841   argument *cur_arg = &crx_ins->arg[cur_arg_num]; /* Current argument.  */
    842 
    843   /* Initialize the type to NULL before parsing.  */
    844   cur_arg->type = nullargs;
    845 
    846   /* Check whether this is a general processor register.  */
    847   if ((ret_val = get_register (operand)) != nullregister)
    848     {
    849       cur_arg->type = arg_r;
    850       cur_arg->r = ret_val;
    851       cur_arg->X_op = O_register;
    852       return;
    853     }
    854 
    855   /* Check whether this is a core [special] coprocessor register.  */
    856   if ((ret_val = get_copregister (operand)) != nullcopregister)
    857     {
    858       cur_arg->type = arg_copr;
    859       if (ret_val >= cs0)
    860 	cur_arg->type = arg_copsr;
    861       cur_arg->cr = ret_val;
    862       cur_arg->X_op = O_register;
    863       return;
    864     }
    865 
    866   /* Deal with special characters.  */
    867   switch (operand[0])
    868     {
    869     case '$':
    870       if (strchr (operand, '(') != NULL)
    871 	cur_arg->type = arg_icr;
    872       else
    873         cur_arg->type = arg_ic;
    874       goto set_params;
    875       break;
    876 
    877     case '*':
    878       cur_arg->type = arg_sc;
    879       goto set_params;
    880       break;
    881 
    882     case '(':
    883       cur_arg->type = arg_rbase;
    884       goto set_params;
    885       break;
    886 
    887     default:
    888 	break;
    889     }
    890 
    891   if (strchr (operand, '(') != NULL)
    892     {
    893       if (strchr (operand, ',') != NULL
    894           && (strchr (operand, ',') > strchr (operand, '(')))
    895 	    cur_arg->type = arg_idxr;
    896       else
    897 	cur_arg->type = arg_cr;
    898     }
    899   else
    900     cur_arg->type = arg_c;
    901   goto set_params;
    902 
    903 /* Parse an operand according to its type.  */
    904 set_params:
    905   cur_arg->constant = 0;
    906   set_operand (operand, crx_ins);
    907 }
    908 
    909 /* Parse the various operands. Each operand is then analyzed to fillup
    910    the fields in the crx_ins data structure.  */
    911 
    912 static void
    913 parse_operands (ins * crx_ins, char *operands)
    914 {
    915   char *operandS;	       /* Operands string.  */
    916   char *operandH, *operandT;   /* Single operand head/tail pointers.  */
    917   int allocated = 0;	       /* Indicates a new operands string was allocated.  */
    918   char *operand[MAX_OPERANDS]; /* Separating the operands.  */
    919   int op_num = 0;	       /* Current operand number we are parsing.  */
    920   int bracket_flag = 0;	       /* Indicates a bracket '(' was found.  */
    921   int sq_bracket_flag = 0;     /* Indicates a square bracket '[' was found.  */
    922 
    923   /* Preprocess the list of registers, if necessary.  */
    924   operandS = operandH = operandT = (INST_HAS_REG_LIST) ?
    925     preprocess_reglist (operands, &allocated) : operands;
    926 
    927   while (*operandT != '\0')
    928     {
    929       if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
    930         {
    931 	  *operandT++ = '\0';
    932 	  operand[op_num++] = strdup (operandH);
    933           operandH = operandT;
    934           continue;
    935         }
    936 
    937       if (*operandT == ' ')
    938 	as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
    939 
    940       if (*operandT == '(')
    941 	bracket_flag = 1;
    942       else if (*operandT == '[')
    943 	sq_bracket_flag = 1;
    944 
    945       if (*operandT == ')')
    946 	{
    947 	  if (bracket_flag)
    948 	    bracket_flag = 0;
    949 	  else
    950 	    as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
    951 	}
    952       else if (*operandT == ']')
    953 	{
    954 	  if (sq_bracket_flag)
    955 	    sq_bracket_flag = 0;
    956 	  else
    957 	    as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
    958 	}
    959 
    960       if (bracket_flag == 1 && *operandT == ')')
    961 	bracket_flag = 0;
    962       else if (sq_bracket_flag == 1 && *operandT == ']')
    963 	sq_bracket_flag = 0;
    964 
    965       operandT++;
    966     }
    967 
    968   /* Adding the last operand.  */
    969   operand[op_num++] = strdup (operandH);
    970   crx_ins->nargs = op_num;
    971 
    972   /* Verifying correct syntax of operands (all brackets should be closed).  */
    973   if (bracket_flag || sq_bracket_flag)
    974     as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
    975 
    976   /* Now we parse each operand separately.  */
    977   for (op_num = 0; op_num < crx_ins->nargs; op_num++)
    978     {
    979       cur_arg_num = op_num;
    980       parse_operand (operand[op_num], crx_ins);
    981       free (operand[op_num]);
    982     }
    983 
    984   if (allocated)
    985     free (operandS);
    986 }
    987 
    988 /* Get the trap index in dispatch table, given its name.
    989    This routine is used by assembling the 'excp' instruction.  */
    990 
    991 static int
    992 gettrap (const char *s)
    993 {
    994   const trap_entry *trap;
    995 
    996   for (trap = crx_traps; trap < (crx_traps + NUMTRAPS); trap++)
    997     if (strcasecmp (trap->name, s) == 0)
    998       return trap->entry;
    999 
   1000   as_bad (_("Unknown exception: `%s'"), s);
   1001   return 0;
   1002 }
   1003 
   1004 /* Post-Increment instructions, as well as Store-Immediate instructions, are a
   1005    sub-group within load/stor instruction groups.
   1006    Therefore, when parsing a Post-Increment/Store-Immediate insn, we have to
   1007    advance the instruction pointer to the start of that sub-group (that is, up
   1008    to the first instruction of that type).
   1009    Otherwise, the insn will be mistakenly identified as of type LD_STOR_INS.  */
   1010 
   1011 static void
   1012 handle_LoadStor (const char *operands)
   1013 {
   1014   /* Post-Increment instructions precede Store-Immediate instructions in
   1015      CRX instruction table, hence they are handled before.
   1016      This synchronization should be kept.  */
   1017 
   1018   /* Assuming Post-Increment insn has the following format :
   1019      'MNEMONIC DISP(REG)+, REG' (e.g. 'loadw 12(r5)+, r6').
   1020      LD_STOR_INS_INC are the only store insns containing a plus sign (+).  */
   1021   if (strstr (operands, ")+") != NULL)
   1022     {
   1023       while (! IS_INSN_TYPE (LD_STOR_INS_INC))
   1024 	instruction++;
   1025       return;
   1026     }
   1027 
   1028   /* Assuming Store-Immediate insn has the following format :
   1029      'MNEMONIC $DISP, ...' (e.g. 'storb $1, 12(r5)').
   1030      STOR_IMM_INS are the only store insns containing a dollar sign ($).  */
   1031   if (strstr (operands, "$") != NULL)
   1032     while (! IS_INSN_TYPE (STOR_IMM_INS))
   1033       instruction++;
   1034 }
   1035 
   1036 /* Top level module where instruction parsing starts.
   1037    crx_ins - data structure holds some information.
   1038    operands - holds the operands part of the whole instruction.  */
   1039 
   1040 static void
   1041 parse_insn (ins *insn, char *operands)
   1042 {
   1043   int i;
   1044 
   1045   /* Handle instructions with no operands.  */
   1046   for (i = 0; crx_no_op_insn[i] != NULL; i++)
   1047   {
   1048     if (streq (crx_no_op_insn[i], instruction->mnemonic))
   1049     {
   1050       insn->nargs = 0;
   1051       return;
   1052     }
   1053   }
   1054 
   1055   /* Handle 'excp'/'cinv' instructions.  */
   1056   if (IS_INSN_MNEMONIC ("excp") || IS_INSN_MNEMONIC ("cinv"))
   1057     {
   1058       insn->nargs = 1;
   1059       insn->arg[0].type = arg_ic;
   1060       insn->arg[0].constant = IS_INSN_MNEMONIC ("excp") ?
   1061 	gettrap (operands) : get_cinv_parameters (operands);
   1062       insn->arg[0].X_op = O_constant;
   1063       return;
   1064     }
   1065 
   1066   /* Handle load/stor unique instructions before parsing.  */
   1067   if (IS_INSN_TYPE (LD_STOR_INS))
   1068     handle_LoadStor (operands);
   1069 
   1070   if (operands != NULL)
   1071     parse_operands (insn, operands);
   1072 }
   1073 
   1074 /* Cinv instruction requires special handling.  */
   1075 
   1076 static int
   1077 get_cinv_parameters (const char *operand)
   1078 {
   1079   const char *p = operand;
   1080   int d_used = 0, i_used = 0, u_used = 0, b_used = 0;
   1081 
   1082   while (*++p != ']')
   1083     {
   1084       if (*p == ',' || *p == ' ')
   1085 	continue;
   1086 
   1087       if (*p == 'd')
   1088 	d_used = 1;
   1089       else if (*p == 'i')
   1090 	i_used = 1;
   1091       else if (*p == 'u')
   1092 	u_used = 1;
   1093       else if (*p == 'b')
   1094 	b_used = 1;
   1095       else
   1096 	as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
   1097     }
   1098 
   1099   return ((b_used ? 8 : 0)
   1100 	+ (d_used ? 4 : 0)
   1101 	+ (i_used ? 2 : 0)
   1102 	+ (u_used ? 1 : 0));
   1103 }
   1104 
   1105 /* Retrieve the opcode image of a given register.
   1106    If the register is illegal for the current instruction,
   1107    issue an error.  */
   1108 
   1109 static int
   1110 getreg_image (reg r)
   1111 {
   1112   const reg_entry *rreg;
   1113   char *reg_name;
   1114   int is_procreg = 0; /* Nonzero means argument should be processor reg.  */
   1115 
   1116   if (((IS_INSN_MNEMONIC ("mtpr")) && (cur_arg_num == 1))
   1117       || ((IS_INSN_MNEMONIC ("mfpr")) && (cur_arg_num == 0)) )
   1118     is_procreg = 1;
   1119 
   1120   /* Check whether the register is in registers table.  */
   1121   if (r < MAX_REG)
   1122     rreg = &crx_regtab[r];
   1123   /* Check whether the register is in coprocessor registers table.  */
   1124   else if (r < (int) MAX_COPREG)
   1125     rreg = &crx_copregtab[r-MAX_REG];
   1126   /* Register not found.  */
   1127   else
   1128     {
   1129       as_bad (_("Unknown register: `%d'"), r);
   1130       return 0;
   1131     }
   1132 
   1133   reg_name = rreg->name;
   1134 
   1135 /* Issue a error message when register is illegal.  */
   1136 #define IMAGE_ERR \
   1137   as_bad (_("Illegal register (`%s') in instruction: `%s'"), \
   1138 	  reg_name, ins_parse);
   1139 
   1140   switch (rreg->type)
   1141   {
   1142     case CRX_U_REGTYPE:
   1143       if (is_procreg || (instruction->flags & USER_REG))
   1144 	return rreg->image;
   1145       else
   1146 	IMAGE_ERR;
   1147       break;
   1148 
   1149     case CRX_CFG_REGTYPE:
   1150       if (is_procreg)
   1151 	return rreg->image;
   1152       else
   1153 	IMAGE_ERR;
   1154       break;
   1155 
   1156     case CRX_R_REGTYPE:
   1157       if (! is_procreg)
   1158 	return rreg->image;
   1159       else
   1160 	IMAGE_ERR;
   1161       break;
   1162 
   1163     case CRX_C_REGTYPE:
   1164     case CRX_CS_REGTYPE:
   1165       return rreg->image;
   1166       break;
   1167 
   1168     default:
   1169       IMAGE_ERR;
   1170       break;
   1171   }
   1172 
   1173   return 0;
   1174 }
   1175 
   1176 /* Routine used to represent integer X using NBITS bits.  */
   1177 
   1178 static long
   1179 getconstant (long x, int nbits)
   1180 {
   1181   return x & ((((1U << (nbits - 1)) - 1) << 1) | 1);
   1182 }
   1183 
   1184 /* Print a constant value to 'output_opcode':
   1185    ARG holds the operand's type and value.
   1186    SHIFT represents the location of the operand to be print into.
   1187    NBITS determines the size (in bits) of the constant.  */
   1188 
   1189 static void
   1190 print_constant (int nbits, int shift, argument *arg)
   1191 {
   1192   unsigned long mask = 0;
   1193 
   1194   long constant = getconstant (arg->constant, nbits);
   1195 
   1196   switch (nbits)
   1197   {
   1198     case 32:
   1199     case 28:
   1200     case 24:
   1201     case 22:
   1202       /* mask the upper part of the constant, that is, the bits
   1203 	 going to the lowest byte of output_opcode[0].
   1204 	 The upper part of output_opcode[1] is always filled,
   1205 	 therefore it is always masked with 0xFFFF.  */
   1206       mask = (1 << (nbits - 16)) - 1;
   1207       /* Divide the constant between two consecutive words :
   1208 		 0	   1	     2	       3
   1209 	    +---------+---------+---------+---------+
   1210 	    |	      | X X X X | X X X X |	    |
   1211 	    +---------+---------+---------+---------+
   1212 	      output_opcode[0]    output_opcode[1]     */
   1213 
   1214       CRX_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
   1215       CRX_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
   1216       break;
   1217 
   1218     case 16:
   1219     case 12:
   1220       /* Special case - in arg_cr, the SHIFT represents the location
   1221 	 of the REGISTER, not the constant, which is itself not shifted.  */
   1222       if (arg->type == arg_cr)
   1223 	{
   1224 	  CRX_PRINT (0, constant,  0);
   1225 	  break;
   1226 	}
   1227 
   1228       /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
   1229 	 always filling the upper part of output_opcode[1]. If we mistakenly
   1230 	 write it to output_opcode[0], the constant prefix (that is, 'match')
   1231 	 will be overridden.
   1232 		 0	   1	     2	       3
   1233 	    +---------+---------+---------+---------+
   1234 	    | 'match' |         | X X X X |	    |
   1235 	    +---------+---------+---------+---------+
   1236 	      output_opcode[0]    output_opcode[1]     */
   1237 
   1238       if ((instruction->size > 2) && (shift == WORD_SHIFT))
   1239 	CRX_PRINT (1, constant, WORD_SHIFT);
   1240       else
   1241 	CRX_PRINT (0, constant, shift);
   1242       break;
   1243 
   1244     default:
   1245       CRX_PRINT (0, constant,  shift);
   1246       break;
   1247   }
   1248 }
   1249 
   1250 /* Print an operand to 'output_opcode', which later on will be
   1251    printed to the object file:
   1252    ARG holds the operand's type, size and value.
   1253    SHIFT represents the printing location of operand.
   1254    NBITS determines the size (in bits) of a constant operand.  */
   1255 
   1256 static void
   1257 print_operand (int nbits, int shift, argument *arg)
   1258 {
   1259   switch (arg->type)
   1260     {
   1261     case arg_r:
   1262       CRX_PRINT (0, getreg_image (arg->r), shift);
   1263       break;
   1264 
   1265     case arg_copr:
   1266       if (arg->cr < c0 || arg->cr > c15)
   1267 	as_bad (_("Illegal co-processor register in instruction `%s'"),
   1268 		ins_parse);
   1269       CRX_PRINT (0, getreg_image (arg->cr), shift);
   1270       break;
   1271 
   1272     case arg_copsr:
   1273       if (arg->cr < cs0 || arg->cr > cs15)
   1274 	as_bad (_("Illegal co-processor special register in instruction `%s'"),
   1275 		ins_parse);
   1276       CRX_PRINT (0, getreg_image (arg->cr), shift);
   1277       break;
   1278 
   1279     case arg_idxr:
   1280       /*    16      12	      8    6         0
   1281 	    +--------------------------------+
   1282 	    | r_base | r_idx  | scl|  disp   |
   1283 	    +--------------------------------+	  */
   1284       CRX_PRINT (0, getreg_image (arg->r), 12);
   1285       CRX_PRINT (0, getreg_image (arg->i_r), 8);
   1286       CRX_PRINT (0, arg->scale, 6);
   1287       /* Fall through.  */
   1288     case arg_ic:
   1289     case arg_c:
   1290       print_constant (nbits, shift, arg);
   1291       break;
   1292 
   1293     case arg_rbase:
   1294       CRX_PRINT (0, getreg_image (arg->r), shift);
   1295       break;
   1296 
   1297     case arg_cr:
   1298       /* case base_cst4.  */
   1299       if (instruction->flags & DISPU4MAP)
   1300 	print_constant (nbits, shift + REG_SIZE, arg);
   1301       else
   1302 	/* rbase_disps<NN> and other such cases.  */
   1303 	print_constant (nbits, shift, arg);
   1304       /* Add the register argument to the output_opcode.  */
   1305       CRX_PRINT (0, getreg_image (arg->r), shift);
   1306       break;
   1307 
   1308     default:
   1309       break;
   1310     }
   1311 }
   1312 
   1313 /* Retrieve the number of operands for the current assembled instruction.  */
   1314 
   1315 static int
   1316 get_number_of_operands (void)
   1317 {
   1318   int i;
   1319 
   1320   for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
   1321     ;
   1322   return i;
   1323 }
   1324 
   1325 /* Verify that the number NUM can be represented in BITS bits (that is,
   1326    within its permitted range), based on the instruction's FLAGS.
   1327    If UPDATE is nonzero, update the value of NUM if necessary.
   1328    Return OP_LEGAL upon success, actual error type upon failure.  */
   1329 
   1330 static op_err
   1331 check_range (long *num, int bits, int unsigned flags, int update)
   1332 {
   1333   uint32_t max;
   1334   op_err retval = OP_LEGAL;
   1335   int bin;
   1336   uint32_t upper_64kb = 0xffff0000;
   1337   uint32_t value = *num;
   1338 
   1339   /* Verify operand value is even.  */
   1340   if (flags & OP_EVEN)
   1341     {
   1342       if (value % 2)
   1343 	return OP_NOT_EVEN;
   1344     }
   1345 
   1346   if (flags & OP_UPPER_64KB)
   1347     {
   1348       /* Check if value is to be mapped to upper 64 KB memory area.  */
   1349       if ((value & upper_64kb) == upper_64kb)
   1350 	{
   1351 	  value -= upper_64kb;
   1352 	  if (update)
   1353 	    *num = value;
   1354 	}
   1355       else
   1356 	return OP_NOT_UPPER_64KB;
   1357     }
   1358 
   1359   if (flags & OP_SHIFT)
   1360     {
   1361       /* All OP_SHIFT args are also OP_SIGNED, so we want to keep the
   1362 	 sign.  However, right shift of a signed type with a negative
   1363 	 value is implementation defined.  See ISO C 6.5.7.  So we use
   1364 	 an unsigned type and sign extend afterwards.  */
   1365       value >>= 1;
   1366       value = (value ^ 0x40000000) - 0x40000000;
   1367       if (update)
   1368 	*num = value;
   1369     }
   1370   else if (flags & OP_SHIFT_DEC)
   1371     {
   1372       value = (value >> 1) - 1;
   1373       if (update)
   1374 	*num = value;
   1375     }
   1376 
   1377   if (flags & OP_ESC)
   1378     {
   1379       /* 0x7e and 0x7f are reserved escape sequences of dispe9.  */
   1380       if (value == 0x7e || value == 0x7f)
   1381 	return OP_OUT_OF_RANGE;
   1382     }
   1383 
   1384   if (flags & OP_DISPU4)
   1385     {
   1386       int is_dispu4 = 0;
   1387 
   1388       uint32_t mul = (instruction->flags & DISPUB4 ? 1
   1389 		      : instruction->flags & DISPUW4 ? 2
   1390 		      : instruction->flags & DISPUD4 ? 4
   1391 		      : 0);
   1392 
   1393       for (bin = 0; bin < crx_cst4_maps; bin++)
   1394 	{
   1395 	  if (value == mul * bin)
   1396 	    {
   1397 	      is_dispu4 = 1;
   1398 	      if (update)
   1399 		*num = bin;
   1400 	      break;
   1401 	    }
   1402 	}
   1403       if (!is_dispu4)
   1404 	retval = OP_ILLEGAL_DISPU4;
   1405     }
   1406   else if (flags & OP_CST4)
   1407     {
   1408       int is_cst4 = 0;
   1409 
   1410       for (bin = 0; bin < crx_cst4_maps; bin++)
   1411 	{
   1412 	  if (value == (uint32_t) crx_cst4_map[bin])
   1413 	    {
   1414 	      is_cst4 = 1;
   1415 	      if (update)
   1416 		*num = bin;
   1417 	      break;
   1418 	    }
   1419 	}
   1420       if (!is_cst4)
   1421 	retval = OP_ILLEGAL_CST4;
   1422     }
   1423   else if (flags & OP_SIGNED)
   1424     {
   1425       max = 1;
   1426       max = max << (bits - 1);
   1427       value += max;
   1428       max = ((max - 1) << 1) | 1;
   1429       if (value > max)
   1430 	retval = OP_OUT_OF_RANGE;
   1431     }
   1432   else if (flags & OP_UNSIGNED)
   1433     {
   1434       max = 1;
   1435       max = max << (bits - 1);
   1436       max = ((max - 1) << 1) | 1;
   1437       if (value > max)
   1438 	retval = OP_OUT_OF_RANGE;
   1439     }
   1440   return retval;
   1441 }
   1442 
   1443 /* Assemble a single instruction:
   1444    INSN is already parsed (that is, all operand values and types are set).
   1445    For instruction to be assembled, we need to find an appropriate template in
   1446    the instruction table, meeting the following conditions:
   1447     1: Has the same number of operands.
   1448     2: Has the same operand types.
   1449     3: Each operand size is sufficient to represent the instruction's values.
   1450    Returns 1 upon success, 0 upon failure.  */
   1451 
   1452 static int
   1453 assemble_insn (char *mnemonic, ins *insn)
   1454 {
   1455   /* Type of each operand in the current template.  */
   1456   argtype cur_type[MAX_OPERANDS];
   1457   /* Size (in bits) of each operand in the current template.  */
   1458   unsigned int cur_size[MAX_OPERANDS];
   1459   /* Flags of each operand in the current template.  */
   1460   unsigned int cur_flags[MAX_OPERANDS];
   1461   /* Instruction type to match.  */
   1462   unsigned int ins_type;
   1463   /* Boolean flag to mark whether a match was found.  */
   1464   int match = 0;
   1465   int i;
   1466   /* Nonzero if an instruction with same number of operands was found.  */
   1467   int found_same_number_of_operands = 0;
   1468   /* Nonzero if an instruction with same argument types was found.  */
   1469   int found_same_argument_types = 0;
   1470   /* Nonzero if a constant was found within the required range.  */
   1471   int found_const_within_range  = 0;
   1472   /* Argument number of an operand with invalid type.  */
   1473   int invalid_optype = -1;
   1474   /* Argument number of an operand with invalid constant value.  */
   1475   int invalid_const  = -1;
   1476   /* Operand error (used for issuing various constant error messages).  */
   1477   op_err op_error, const_err = OP_LEGAL;
   1478 
   1479 /* Retrieve data (based on FUNC) for each operand of a given instruction.  */
   1480 #define GET_CURRENT_DATA(FUNC, ARRAY)				  \
   1481   for (i = 0; i < insn->nargs; i++)				  \
   1482     ARRAY[i] = FUNC (instruction->operands[i].op_type)
   1483 
   1484 #define GET_CURRENT_TYPE    GET_CURRENT_DATA(get_optype, cur_type)
   1485 #define GET_CURRENT_SIZE    GET_CURRENT_DATA(get_opbits, cur_size)
   1486 #define GET_CURRENT_FLAGS   GET_CURRENT_DATA(get_opflags, cur_flags)
   1487 
   1488   /* Instruction has no operands -> only copy the constant opcode.   */
   1489   if (insn->nargs == 0)
   1490     {
   1491       output_opcode[0] = BIN (instruction->match, instruction->match_bits);
   1492       return 1;
   1493     }
   1494 
   1495   /* In some case, same mnemonic can appear with different instruction types.
   1496      For example, 'storb' is supported with 3 different types :
   1497      LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
   1498      We assume that when reaching this point, the instruction type was
   1499      pre-determined. We need to make sure that the type stays the same
   1500      during a search for matching instruction.  */
   1501   ins_type = CRX_INS_TYPE(instruction->flags);
   1502 
   1503   while (/* Check that match is still not found.  */
   1504 	 match != 1
   1505 	 /* Check we didn't get to end of table.  */
   1506 	 && instruction->mnemonic != NULL
   1507 	 /* Check that the actual mnemonic is still available.  */
   1508 	 && IS_INSN_MNEMONIC (mnemonic)
   1509 	 /* Check that the instruction type wasn't changed.  */
   1510 	 && IS_INSN_TYPE(ins_type))
   1511     {
   1512       /* Check whether number of arguments is legal.  */
   1513       if (get_number_of_operands () != insn->nargs)
   1514 	goto next_insn;
   1515       found_same_number_of_operands = 1;
   1516 
   1517       /* Initialize arrays with data of each operand in current template.  */
   1518       GET_CURRENT_TYPE;
   1519       GET_CURRENT_SIZE;
   1520       GET_CURRENT_FLAGS;
   1521 
   1522       /* Check for type compatibility.  */
   1523       for (i = 0; i < insn->nargs; i++)
   1524         {
   1525 	  if (cur_type[i] != insn->arg[i].type)
   1526 	    {
   1527 	      if (invalid_optype == -1)
   1528 		invalid_optype = i + 1;
   1529 	      goto next_insn;
   1530 	    }
   1531 	}
   1532       found_same_argument_types = 1;
   1533 
   1534       for (i = 0; i < insn->nargs; i++)
   1535 	{
   1536 	  /* Reverse the operand indices for certain opcodes:
   1537 	     Index 0	  -->> 1
   1538 	     Index 1	  -->> 0
   1539 	     Other index  -->> stays the same.  */
   1540 	  int j = instruction->flags & REVERSE_MATCH ?
   1541 		  i == 0 ? 1 :
   1542 		  i == 1 ? 0 : i :
   1543 		  i;
   1544 
   1545 	  /* Only check range - don't update the constant's value, since the
   1546 	     current instruction may not be the last we try to match.
   1547 	     The constant's value will be updated later, right before printing
   1548 	     it to the object file.  */
   1549   	  if ((insn->arg[j].X_op == O_constant)
   1550 	       && (op_error = check_range (&insn->arg[j].constant, cur_size[j],
   1551 					   cur_flags[j], 0)))
   1552   	    {
   1553 	      if (invalid_const == -1)
   1554 	      {
   1555 		invalid_const = j + 1;
   1556 		const_err = op_error;
   1557 	      }
   1558 	      goto next_insn;
   1559 	    }
   1560 	  /* For symbols, we make sure the relocation size (which was already
   1561 	     determined) is sufficient.  */
   1562 	  else if ((insn->arg[j].X_op == O_symbol)
   1563 		    && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
   1564 			 > cur_size[j]))
   1565 		  goto next_insn;
   1566 	}
   1567       found_const_within_range = 1;
   1568 
   1569       /* If we got till here -> Full match is found.  */
   1570       match = 1;
   1571       break;
   1572 
   1573 /* Try again with next instruction.  */
   1574 next_insn:
   1575       instruction++;
   1576     }
   1577 
   1578   if (!match)
   1579     {
   1580       /* We haven't found a match - instruction can't be assembled.  */
   1581       if (!found_same_number_of_operands)
   1582 	as_bad (_("Incorrect number of operands"));
   1583       else if (!found_same_argument_types)
   1584 	as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
   1585       else if (!found_const_within_range)
   1586       {
   1587 	switch (const_err)
   1588 	{
   1589 	case OP_OUT_OF_RANGE:
   1590 	  as_bad (_("Operand out of range (arg %d)"), invalid_const);
   1591 	  break;
   1592 	case OP_NOT_EVEN:
   1593 	  as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
   1594 	  break;
   1595 	case OP_ILLEGAL_DISPU4:
   1596 	  as_bad (_("Invalid DISPU4 operand value (arg %d)"), invalid_const);
   1597 	  break;
   1598 	case OP_ILLEGAL_CST4:
   1599 	  as_bad (_("Invalid CST4 operand value (arg %d)"), invalid_const);
   1600 	  break;
   1601 	case OP_NOT_UPPER_64KB:
   1602 	  as_bad (_("Operand value is not within upper 64 KB (arg %d)"),
   1603 		    invalid_const);
   1604 	  break;
   1605 	default:
   1606 	  as_bad (_("Illegal operand (arg %d)"), invalid_const);
   1607 	  break;
   1608 	}
   1609       }
   1610 
   1611       return 0;
   1612     }
   1613   else
   1614     /* Full match - print the encoding to output file.  */
   1615     {
   1616       /* Make further checking (such that couldn't be made earlier).
   1617 	 Warn the user if necessary.  */
   1618       warn_if_needed (insn);
   1619 
   1620       /* Check whether we need to adjust the instruction pointer.  */
   1621       if (adjust_if_needed (insn))
   1622 	/* If instruction pointer was adjusted, we need to update
   1623 	   the size of the current template operands.  */
   1624 	GET_CURRENT_SIZE;
   1625 
   1626       for (i = 0; i < insn->nargs; i++)
   1627         {
   1628 	  int j = instruction->flags & REVERSE_MATCH ?
   1629 		  i == 0 ? 1 :
   1630 		  i == 1 ? 0 : i :
   1631 		  i;
   1632 
   1633 	  /* This time, update constant value before printing it.  */
   1634   	  if ((insn->arg[j].X_op == O_constant)
   1635 	       && (check_range (&insn->arg[j].constant, cur_size[j],
   1636 				cur_flags[j], 1) != OP_LEGAL))
   1637 	      as_fatal (_("Illegal operand (arg %d)"), j+1);
   1638 	}
   1639 
   1640       /* First, copy the instruction's opcode.  */
   1641       output_opcode[0] = BIN (instruction->match, instruction->match_bits);
   1642 
   1643       for (i = 0; i < insn->nargs; i++)
   1644         {
   1645 	  cur_arg_num = i;
   1646           print_operand (cur_size[i], instruction->operands[i].shift,
   1647 			 &insn->arg[i]);
   1648         }
   1649     }
   1650 
   1651   return 1;
   1652 }
   1653 
   1654 /* Bunch of error checking.
   1655    The checks are made after a matching instruction was found.  */
   1656 
   1657 void
   1658 warn_if_needed (ins *insn)
   1659 {
   1660   /* If the post-increment address mode is used and the load/store
   1661      source register is the same as rbase, the result of the
   1662      instruction is undefined.  */
   1663   if (IS_INSN_TYPE (LD_STOR_INS_INC))
   1664     {
   1665       /* Enough to verify that one of the arguments is a simple reg.  */
   1666       if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
   1667 	if (insn->arg[0].r == insn->arg[1].r)
   1668 	  as_bad (_("Same src/dest register is used (`r%d'), result is undefined"),
   1669 		   insn->arg[0].r);
   1670     }
   1671 
   1672   /* Some instruction assume the stack pointer as rptr operand.
   1673      Issue an error when the register to be loaded is also SP.  */
   1674   if (instruction->flags & NO_SP)
   1675     {
   1676       if (getreg_image (insn->arg[0].r) == getreg_image (sp))
   1677 	as_bad (_("`%s' has undefined result"), ins_parse);
   1678     }
   1679 
   1680   /* If the rptr register is specified as one of the registers to be loaded,
   1681      the final contents of rptr are undefined. Thus, we issue an error.  */
   1682   if (instruction->flags & NO_RPTR)
   1683     {
   1684       if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
   1685 	as_bad (_("Same src/dest register is used (`r%d'), result is undefined"),
   1686 	 getreg_image (insn->arg[0].r));
   1687     }
   1688 }
   1689 
   1690 /* In some cases, we need to adjust the instruction pointer although a
   1691    match was already found. Here, we gather all these cases.
   1692    Returns 1 if instruction pointer was adjusted, otherwise 0.  */
   1693 
   1694 int
   1695 adjust_if_needed (ins *insn)
   1696 {
   1697   int ret_value = 0;
   1698 
   1699   /* Special check for 'addub $0, r0' instruction -
   1700      The opcode '0000 0000 0000 0000' is not allowed.  */
   1701   if (IS_INSN_MNEMONIC ("addub"))
   1702     {
   1703       if ((instruction->operands[0].op_type == cst4)
   1704 	  && instruction->operands[1].op_type == regr)
   1705         {
   1706           if (insn->arg[0].constant == 0 && insn->arg[1].r == r0)
   1707 	    {
   1708 	      instruction++;
   1709 	      ret_value = 1;
   1710 	    }
   1711         }
   1712     }
   1713 
   1714   /* Optimization: Omit a zero displacement in bit operations,
   1715      saving 2-byte encoding space (e.g., 'cbitw $8, 0(r1)').  */
   1716   if (IS_INSN_TYPE (CSTBIT_INS))
   1717     {
   1718       if ((instruction->operands[1].op_type == rbase_disps12)
   1719 	   && (insn->arg[1].X_op == O_constant)
   1720 	   && (insn->arg[1].constant == 0))
   1721             {
   1722               instruction--;
   1723 	      ret_value = 1;
   1724             }
   1725     }
   1726 
   1727   return ret_value;
   1728 }
   1729 
   1730 /* Set the appropriate bit for register 'r' in 'mask'.
   1731    This indicates that this register is loaded or stored by
   1732    the instruction.  */
   1733 
   1734 static void
   1735 mask_reg (int r, unsigned short int *mask)
   1736 {
   1737   if ((reg)r > (reg)sp)
   1738     {
   1739       as_bad (_("Invalid register in register list"));
   1740       return;
   1741     }
   1742 
   1743   *mask |= (1 << r);
   1744 }
   1745 
   1746 /* Preprocess register list - create a 16-bit mask with one bit for each
   1747    of the 16 general purpose registers. If a bit is set, it indicates
   1748    that this register is loaded or stored by the instruction.  */
   1749 
   1750 static char *
   1751 preprocess_reglist (char *param, int *allocated)
   1752 {
   1753   char reg_name[MAX_REGNAME_LEN]; /* Current parsed register name.  */
   1754   char *regP;			  /* Pointer to 'reg_name' string.  */
   1755   int reg_counter = 0;		  /* Count number of parsed registers.  */
   1756   unsigned short int mask = 0;	  /* Mask for 16 general purpose registers.  */
   1757   char *new_param;		  /* New created operands string.  */
   1758   char *paramP = param;		  /* Pointer to original operands string.  */
   1759   char maskstring[10];		  /* Array to print the mask as a string.  */
   1760   int hi_found = 0, lo_found = 0; /* Boolean flags for hi/lo registers.  */
   1761   reg r;
   1762   copreg cr;
   1763 
   1764   /* If 'param' is already in form of a number, no need to preprocess.  */
   1765   if (strchr (paramP, '{') == NULL)
   1766     return param;
   1767 
   1768   /* Verifying correct syntax of operand.  */
   1769   if (strchr (paramP, '}') == NULL)
   1770     as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
   1771 
   1772   while (*paramP++ != '{');
   1773 
   1774   new_param = XCNEWVEC (char, MAX_INST_LEN);
   1775   *allocated = 1;
   1776   strncpy (new_param, param, paramP - param - 1);
   1777 
   1778   while (*paramP != '}')
   1779     {
   1780       regP = paramP;
   1781       memset (&reg_name, '\0', sizeof (reg_name));
   1782 
   1783       while (ISALNUM (*paramP))
   1784 	paramP++;
   1785 
   1786       strncpy (reg_name, regP, paramP - regP);
   1787 
   1788       /* Coprocessor register c<N>.  */
   1789       if (IS_INSN_TYPE (COP_REG_INS))
   1790         {
   1791           if (((cr = get_copregister (reg_name)) == nullcopregister)
   1792 	      || (crx_copregtab[cr-MAX_REG].type != CRX_C_REGTYPE))
   1793 	    as_fatal (_("Illegal register `%s' in cop-register list"), reg_name);
   1794 	  mask_reg (getreg_image (cr - c0), &mask);
   1795         }
   1796       /* Coprocessor Special register cs<N>.  */
   1797       else if (IS_INSN_TYPE (COPS_REG_INS))
   1798         {
   1799           if (((cr = get_copregister (reg_name)) == nullcopregister)
   1800 	      || (crx_copregtab[cr-MAX_REG].type != CRX_CS_REGTYPE))
   1801 	    as_fatal (_("Illegal register `%s' in cop-special-register list"),
   1802 		      reg_name);
   1803 	  mask_reg (getreg_image (cr - cs0), &mask);
   1804         }
   1805       /* User register u<N>.  */
   1806       else if (instruction->flags & USER_REG)
   1807 	{
   1808 	  if (streq(reg_name, "uhi"))
   1809 	    {
   1810 	      hi_found = 1;
   1811 	      goto next_inst;
   1812 	    }
   1813 	  else if (streq(reg_name, "ulo"))
   1814 	    {
   1815 	      lo_found = 1;
   1816 	      goto next_inst;
   1817 	    }
   1818           else if (((r = get_register (reg_name)) == nullregister)
   1819 	      || (crx_regtab[r].type != CRX_U_REGTYPE))
   1820 	    as_fatal (_("Illegal register `%s' in user register list"), reg_name);
   1821 
   1822 	  mask_reg (getreg_image (r - u0), &mask);
   1823 	}
   1824       /* General purpose register r<N>.  */
   1825       else
   1826         {
   1827 	  if (streq(reg_name, "hi"))
   1828 	    {
   1829 	      hi_found = 1;
   1830 	      goto next_inst;
   1831 	    }
   1832 	  else if (streq(reg_name, "lo"))
   1833 	    {
   1834 	      lo_found = 1;
   1835 	      goto next_inst;
   1836 	    }
   1837           else if (((r = get_register (reg_name)) == nullregister)
   1838 	      || (crx_regtab[r].type != CRX_R_REGTYPE))
   1839 	    as_fatal (_("Illegal register `%s' in register list"), reg_name);
   1840 
   1841 	  mask_reg (getreg_image (r - r0), &mask);
   1842         }
   1843 
   1844       if (++reg_counter > MAX_REGS_IN_MASK16)
   1845 	as_bad (_("Maximum %d bits may be set in `mask16' operand"),
   1846 		MAX_REGS_IN_MASK16);
   1847 
   1848 next_inst:
   1849       while (!ISALNUM (*paramP) && *paramP != '}')
   1850 	  paramP++;
   1851     }
   1852 
   1853   if (*++paramP != '\0')
   1854     as_warn (_("rest of line ignored; first ignored character is `%c'"),
   1855 	     *paramP);
   1856 
   1857   switch (hi_found + lo_found)
   1858     {
   1859     case 0:
   1860       /* At least one register should be specified.  */
   1861       if (mask == 0)
   1862 	as_bad (_("Illegal `mask16' operand, operation is undefined - `%s'"),
   1863 		ins_parse);
   1864       break;
   1865 
   1866     case 1:
   1867       /* HI can't be specified without LO (and vise-versa).  */
   1868       as_bad (_("HI/LO registers should be specified together"));
   1869       break;
   1870 
   1871     case 2:
   1872       /* HI/LO registers mustn't be masked with additional registers.  */
   1873       if (mask != 0)
   1874 	as_bad (_("HI/LO registers should be specified without additional registers"));
   1875 
   1876     default:
   1877       break;
   1878     }
   1879 
   1880   sprintf (maskstring, "$0x%x", mask);
   1881   strcat (new_param, maskstring);
   1882   return new_param;
   1883 }
   1884 
   1885 /* Print the instruction.
   1886    Handle also cases where the instruction is relaxable/relocatable.  */
   1887 
   1888 void
   1889 print_insn (ins *insn)
   1890 {
   1891   unsigned int i, j, insn_size;
   1892   char *this_frag;
   1893   unsigned short words[4];
   1894   int addr_mod;
   1895 
   1896   /* Arrange the insn encodings in a WORD size array.  */
   1897   for (i = 0, j = 0; i < 2; i++)
   1898     {
   1899       words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
   1900       words[j++] = output_opcode[i] & 0xFFFF;
   1901     }
   1902 
   1903   /* Handle relaxation.  */
   1904   if ((instruction->flags & RELAXABLE) && relocatable)
   1905     {
   1906       int relax_subtype;
   1907 
   1908       /* Write the maximal instruction size supported.  */
   1909       insn_size = INSN_MAX_SIZE;
   1910 
   1911       /* bCC  */
   1912       if (IS_INSN_TYPE (BRANCH_INS))
   1913 	relax_subtype = 0;
   1914       /* bal  */
   1915       else if (IS_INSN_TYPE (DCR_BRANCH_INS) || IS_INSN_MNEMONIC ("bal"))
   1916 	relax_subtype = 3;
   1917       /* cmpbr/bcop  */
   1918       else if (IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (COP_BRANCH_INS))
   1919 	relax_subtype = 5;
   1920       else
   1921 	abort ();
   1922 
   1923       this_frag = frag_var (rs_machine_dependent, insn_size * 2,
   1924 			    4, relax_subtype,
   1925 			    insn->exp.X_add_symbol,
   1926 			    insn->exp.X_add_number,
   1927 			    0);
   1928     }
   1929   else
   1930     {
   1931       insn_size = instruction->size;
   1932       this_frag = frag_more (insn_size * 2);
   1933 
   1934       /* Handle relocation.  */
   1935       if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
   1936 	{
   1937 	  reloc_howto_type *reloc_howto;
   1938 	  int size;
   1939 
   1940 	  reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
   1941 
   1942 	  if (!reloc_howto)
   1943 	    abort ();
   1944 
   1945 	  size = bfd_get_reloc_size (reloc_howto);
   1946 
   1947 	  if (size < 1 || size > 4)
   1948 	    abort ();
   1949 
   1950 	  fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
   1951 		       size, &insn->exp, reloc_howto->pc_relative,
   1952 		       insn->rtype);
   1953 	}
   1954     }
   1955 
   1956   /* Verify a 2-byte code alignment.  */
   1957   addr_mod = frag_now_fix () & 1;
   1958   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
   1959     as_bad (_("instruction address is not a multiple of 2"));
   1960   frag_now->insn_addr = addr_mod;
   1961   frag_now->has_code = 1;
   1962 
   1963   /* Write the instruction encoding to frag.  */
   1964   for (i = 0; i < insn_size; i++)
   1965     {
   1966       md_number_to_chars (this_frag, (valueT) words[i], 2);
   1967       this_frag += 2;
   1968     }
   1969 }
   1970 
   1971 /* This is the guts of the machine-dependent assembler.  OP points to a
   1972    machine dependent instruction.  This function is supposed to emit
   1973    the frags/bytes it assembles to.  */
   1974 
   1975 void
   1976 md_assemble (char *op)
   1977 {
   1978   ins crx_ins;
   1979   char *param;
   1980   char c;
   1981 
   1982   /* Reset global variables for a new instruction.  */
   1983   reset_vars (op);
   1984 
   1985   /* Strip the mnemonic.  */
   1986   for (param = op; *param != 0 && !ISSPACE (*param); param++)
   1987     ;
   1988   c = *param;
   1989   *param++ = '\0';
   1990 
   1991   /* Find the instruction.  */
   1992   instruction = (const inst *) hash_find (crx_inst_hash, op);
   1993   if (instruction == NULL)
   1994     {
   1995       as_bad (_("Unknown opcode: `%s'"), op);
   1996       param[-1] = c;
   1997       return;
   1998     }
   1999 
   2000   /* Tie dwarf2 debug info to the address at the start of the insn.  */
   2001   dwarf2_emit_insn (0);
   2002 
   2003   /* Parse the instruction's operands.  */
   2004   parse_insn (&crx_ins, param);
   2005 
   2006   /* Assemble the instruction - return upon failure.  */
   2007   if (assemble_insn (op, &crx_ins) == 0)
   2008     {
   2009       param[-1] = c;
   2010       return;
   2011     }
   2012 
   2013   /* Print the instruction.  */
   2014   param[-1] = c;
   2015   print_insn (&crx_ins);
   2016 }
   2017