xref: /netbsd-src/external/gpl3/binutils/dist/gas/config/tc-cr16.c (revision 2b3d1ee8a773e028429b331332895d44f445d720)
1 /* tc-cr16.c -- Assembler code for the CR16 CPU core.
2    Copyright 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4 
5    Contributed by M R Swami Reddy <MR.Swami.Reddy@nsc.com>
6 
7    This file is part of GAS, the GNU Assembler.
8 
9    GAS is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3, or (at your option)
12    any later version.
13 
14    GAS is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with GAS; see the file COPYING.  If not, write to the
21    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23 
24 #include "as.h"
25 #include "safe-ctype.h"
26 #include "dwarf2dbg.h"
27 #include "opcode/cr16.h"
28 #include "elf/cr16.h"
29 
30 
31 /* Word is considered here as a 16-bit unsigned short int.  */
32 #define WORD_SHIFT  16
33 
34 /* Register is 2-byte size.  */
35 #define REG_SIZE   2
36 
37 /* Maximum size of a single instruction (in words).  */
38 #define INSN_MAX_SIZE   3
39 
40 /* Maximum bits which may be set in a `mask16' operand.  */
41 #define MAX_REGS_IN_MASK16  8
42 
43 /* Assign a number NUM, shifted by SHIFT bytes, into a location
44    pointed by index BYTE of array 'output_opcode'.  */
45 #define CR16_PRINT(BYTE, NUM, SHIFT)   output_opcode[BYTE] |= (NUM << SHIFT)
46 
47 /* Operand errors.  */
48 typedef enum
49   {
50     OP_LEGAL = 0,       /* Legal operand.  */
51     OP_OUT_OF_RANGE,    /* Operand not within permitted range.  */
52     OP_NOT_EVEN         /* Operand is Odd number, should be even.  */
53   }
54 op_err;
55 
56 /* Opcode mnemonics hash table.  */
57 static struct hash_control *cr16_inst_hash;
58 /* CR16 registers hash table.  */
59 static struct hash_control *reg_hash;
60 /* CR16 register pair hash table.  */
61 static struct hash_control *regp_hash;
62 /* CR16 processor registers hash table.  */
63 static struct hash_control *preg_hash;
64 /* CR16 processor registers 32 bit hash table.  */
65 static struct hash_control *pregp_hash;
66 /* Current instruction we're assembling.  */
67 const inst *instruction;
68 
69 
70 static int code_label = 0;
71 
72 /* Global variables.  */
73 
74 /* Array to hold an instruction encoding.  */
75 long output_opcode[2];
76 
77 /* Nonzero means a relocatable symbol.  */
78 int relocatable;
79 
80 /* A copy of the original instruction (used in error messages).  */
81 char ins_parse[MAX_INST_LEN];
82 
83 /* The current processed argument number.  */
84 int cur_arg_num;
85 
86 /* Generic assembler global variables which must be defined by all targets.  */
87 
88 /* Characters which always start a comment.  */
89 const char comment_chars[] = "#";
90 
91 /* Characters which start a comment at the beginning of a line.  */
92 const char line_comment_chars[] = "#";
93 
94 /* This array holds machine specific line separator characters.  */
95 const char line_separator_chars[] = ";";
96 
97 /* Chars that can be used to separate mant from exp in floating point nums.  */
98 const char EXP_CHARS[] = "eE";
99 
100 /* Chars that mean this number is a floating point constant as in 0f12.456  */
101 const char FLT_CHARS[] = "f'";
102 
103 #ifdef OBJ_ELF
104 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
105 symbolS * GOT_symbol;
106 #endif
107 
108 /* Target-specific multicharacter options, not const-declared at usage.  */
109 const char *md_shortopts = "";
110 struct option md_longopts[] =
111 {
112   {NULL, no_argument, NULL, 0}
113 };
114 size_t md_longopts_size = sizeof (md_longopts);
115 
116 static void
117 l_cons (int nbytes)
118 {
119   int c;
120   expressionS exp;
121 
122 #ifdef md_flush_pending_output
123     md_flush_pending_output ();
124 #endif
125 
126   if (is_it_end_of_statement ())
127     {
128       demand_empty_rest_of_line ();
129       return;
130     }
131 
132 #ifdef TC_ADDRESS_BYTES
133   if (nbytes == 0)
134     nbytes = TC_ADDRESS_BYTES ();
135 #endif
136 
137 #ifdef md_cons_align
138   md_cons_align (nbytes);
139 #endif
140 
141   c = 0;
142   do
143     {
144       unsigned int bits_available = BITS_PER_CHAR * nbytes;
145       char *hold = input_line_pointer;
146 
147       expression (&exp);
148 
149       if (*input_line_pointer == ':')
150         {
151           /* Bitfields.  */
152           long value = 0;
153 
154           for (;;)
155             {
156               unsigned long width;
157 
158               if (*input_line_pointer != ':')
159                 {
160                   input_line_pointer = hold;
161                   break;
162                 }
163               if (exp.X_op == O_absent)
164                 {
165                   as_warn (_("using a bit field width of zero"));
166                   exp.X_add_number = 0;
167                   exp.X_op = O_constant;
168                 }
169 
170               if (exp.X_op != O_constant)
171                 {
172                   *input_line_pointer = '\0';
173                   as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
174                   *input_line_pointer = ':';
175                   demand_empty_rest_of_line ();
176                   return;
177                 }
178 
179               if ((width = exp.X_add_number) >
180                   (unsigned int)(BITS_PER_CHAR * nbytes))
181                 {
182                   as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"), width, nbytes, (BITS_PER_CHAR * nbytes));
183                   width = BITS_PER_CHAR * nbytes;
184                 }                   /* Too big.  */
185 
186 
187               if (width > bits_available)
188                 {
189                   /* FIXME-SOMEDAY: backing up and reparsing is wasteful.  */
190                   input_line_pointer = hold;
191                   exp.X_add_number = value;
192                   break;
193                 }
194 
195               /* Skip ':'.  */
196               hold = ++input_line_pointer;
197 
198               expression (&exp);
199               if (exp.X_op != O_constant)
200                 {
201                   char cache = *input_line_pointer;
202 
203                   *input_line_pointer = '\0';
204                   as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
205                   *input_line_pointer = cache;
206                   demand_empty_rest_of_line ();
207                   return;
208                 }
209 
210               value |= ((~(-1 << width) & exp.X_add_number)
211                         << ((BITS_PER_CHAR * nbytes) - bits_available));
212 
213               if ((bits_available -= width) == 0
214                   || is_it_end_of_statement ()
215                   || *input_line_pointer != ',')
216                 break;
217 
218               hold = ++input_line_pointer;
219               expression (&exp);
220             }
221 
222           exp.X_add_number = value;
223           exp.X_op = O_constant;
224           exp.X_unsigned = 1;
225         }
226 
227       if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
228         code_label = 1;
229       emit_expr (&exp, (unsigned int) nbytes);
230       ++c;
231       if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
232         {
233           input_line_pointer +=3;
234           break;
235         }
236     }
237   while ((*input_line_pointer++ == ','));
238 
239   /* Put terminator back into stream.  */
240   input_line_pointer--;
241 
242   demand_empty_rest_of_line ();
243 }
244 
245 /* This table describes all the machine specific pseudo-ops
246    the assembler has to support.  The fields are:
247    *** Pseudo-op name without dot.
248    *** Function to call to execute this pseudo-op.
249    *** Integer arg to pass to the function.  */
250 
251 const pseudo_typeS md_pseudo_table[] =
252 {
253   /* In CR16 machine, align is in bytes (not a ptwo boundary).  */
254   {"align", s_align_bytes, 0},
255   {"long", l_cons,  4 },
256   {"4byte", l_cons, 4 },
257   {0, 0, 0}
258 };
259 
260 /* CR16 relaxation table.  */
261 const relax_typeS md_relax_table[] =
262 {
263   /* bCC  */
264   {0x7f, -0x80, 2, 1},                  /*  8 */
265   {0xfffe, -0x10000, 4, 2},             /* 16 */
266   {0xfffffe, -0x1000000, 6, 0},         /* 24 */
267 };
268 
269 /* Return the bit size for a given operand.  */
270 
271 static int
272 get_opbits (operand_type op)
273 {
274   if (op < MAX_OPRD)
275     return cr16_optab[op].bit_size;
276 
277   return 0;
278 }
279 
280 /* Return the argument type of a given operand.  */
281 
282 static argtype
283 get_optype (operand_type op)
284 {
285   if (op < MAX_OPRD)
286     return cr16_optab[op].arg_type;
287   else
288     return nullargs;
289 }
290 
291 /* Return the flags of a given operand.  */
292 
293 static int
294 get_opflags (operand_type op)
295 {
296   if (op < MAX_OPRD)
297     return cr16_optab[op].flags;
298 
299   return 0;
300 }
301 
302 /* Get the cc code.  */
303 
304 static int
305 get_cc (char *cc_name)
306 {
307    unsigned int i;
308 
309    for (i = 0; i < cr16_num_cc; i++)
310      if (strcmp (cc_name, cr16_b_cond_tab[i]) == 0)
311        return i;
312 
313    return -1;
314 }
315 
316 /* Get the core processor register 'reg_name'.  */
317 
318 static reg
319 get_register (char *reg_name)
320 {
321   const reg_entry *rreg;
322 
323   rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
324 
325   if (rreg != NULL)
326     return rreg->value.reg_val;
327 
328   return nullregister;
329 }
330 /* Get the core processor register-pair 'reg_name'.  */
331 
332 static reg
333 get_register_pair (char *reg_name)
334 {
335   const reg_entry *rreg;
336   char tmp_rp[16]="\0";
337 
338   /* Add '(' and ')' to the reg pair, if its not present.  */
339   if (reg_name[0] != '(')
340     {
341       tmp_rp[0] = '(';
342       strcat (tmp_rp, reg_name);
343       strcat (tmp_rp,")");
344       rreg = (const reg_entry *) hash_find (regp_hash, tmp_rp);
345     }
346   else
347     rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
348 
349   if (rreg != NULL)
350     return rreg->value.reg_val;
351 
352   return nullregister;
353 }
354 
355 /* Get the index register 'reg_name'.  */
356 
357 static reg
358 get_index_register (char *reg_name)
359 {
360   const reg_entry *rreg;
361 
362   rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
363 
364   if ((rreg != NULL)
365       && ((rreg->value.reg_val == 12) || (rreg->value.reg_val == 13)))
366     return rreg->value.reg_val;
367 
368   return nullregister;
369 }
370 /* Get the core processor index register-pair 'reg_name'.  */
371 
372 static reg
373 get_index_register_pair (char *reg_name)
374 {
375   const reg_entry *rreg;
376 
377   rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
378 
379   if (rreg != NULL)
380     {
381       if ((rreg->value.reg_val != 1) || (rreg->value.reg_val != 7)
382           || (rreg->value.reg_val != 9) || (rreg->value.reg_val > 10))
383         return rreg->value.reg_val;
384 
385       as_bad (_("Unknown register pair - index relative mode: `%d'"), rreg->value.reg_val);
386     }
387 
388   return nullregister;
389 }
390 
391 /* Get the processor register 'preg_name'.  */
392 
393 static preg
394 get_pregister (char *preg_name)
395 {
396   const reg_entry *prreg;
397 
398   prreg = (const reg_entry *) hash_find (preg_hash, preg_name);
399 
400   if (prreg != NULL)
401     return prreg->value.preg_val;
402 
403   return nullpregister;
404 }
405 
406 /* Get the processor register 'preg_name 32 bit'.  */
407 
408 static preg
409 get_pregisterp (char *preg_name)
410 {
411   const reg_entry *prreg;
412 
413   prreg = (const reg_entry *) hash_find (pregp_hash, preg_name);
414 
415   if (prreg != NULL)
416     return prreg->value.preg_val;
417 
418   return nullpregister;
419 }
420 
421 
422 /* Round up a section size to the appropriate boundary.  */
423 
424 valueT
425 md_section_align (segT seg, valueT val)
426 {
427   /* Round .text section to a multiple of 2.  */
428   if (seg == text_section)
429     return (val + 1) & ~1;
430   return val;
431 }
432 
433 /* Parse an operand that is machine-specific (remove '*').  */
434 
435 void
436 md_operand (expressionS * exp)
437 {
438   char c = *input_line_pointer;
439 
440   switch (c)
441     {
442     case '*':
443       input_line_pointer++;
444       expression (exp);
445       break;
446     default:
447       break;
448     }
449 }
450 
451 /* Reset global variables before parsing a new instruction.  */
452 
453 static void
454 reset_vars (char *op)
455 {
456   cur_arg_num = relocatable = 0;
457   memset (& output_opcode, '\0', sizeof (output_opcode));
458 
459   /* Save a copy of the original OP (used in error messages).  */
460   strncpy (ins_parse, op, sizeof ins_parse - 1);
461   ins_parse [sizeof ins_parse - 1] = 0;
462 }
463 
464 /* This macro decides whether a particular reloc is an entry in a
465    switch table.  It is used when relaxing, because the linker needs
466    to know about all such entries so that it can adjust them if
467    necessary.  */
468 
469 #define SWITCH_TABLE(fix)                                  \
470   (   (fix)->fx_addsy != NULL                              \
471    && (fix)->fx_subsy != NULL                              \
472    && S_GET_SEGMENT ((fix)->fx_addsy) ==                   \
473       S_GET_SEGMENT ((fix)->fx_subsy)                      \
474    && S_GET_SEGMENT (fix->fx_addsy) != undefined_section   \
475    && (   (fix)->fx_r_type == BFD_RELOC_CR16_NUM8          \
476        || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16         \
477        || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32         \
478        || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
479 
480 /* See whether we need to force a relocation into the output file.
481    This is used to force out switch and PC relative relocations when
482    relaxing.  */
483 
484 int
485 cr16_force_relocation (fixS *fix)
486 {
487   if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
488     return 1;
489 
490   return 0;
491 }
492 
493 /* Record a fixup for a cons expression.  */
494 
495 void
496 cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp)
497 {
498   int rtype = BFD_RELOC_UNUSED;
499 
500   switch (len)
501     {
502     default: rtype = BFD_RELOC_NONE; break;
503     case 1: rtype = BFD_RELOC_CR16_NUM8 ; break;
504     case 2: rtype = BFD_RELOC_CR16_NUM16; break;
505     case 4:
506       if (code_label)
507         {
508           rtype = BFD_RELOC_CR16_NUM32a;
509           code_label = 0;
510         }
511       else
512         rtype = BFD_RELOC_CR16_NUM32;
513       break;
514     }
515 
516   fix_new_exp (frag, offset, len, exp, 0, rtype);
517 }
518 
519 /* Generate a relocation entry for a fixup.  */
520 
521 arelent *
522 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
523 {
524   arelent * reloc;
525   bfd_reloc_code_real_type code;
526 
527   /* If symbols are local and resolved, then no relocation needed.  */
528   if ( ((fixP->fx_addsy)
529         && (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
530        || ((fixP->fx_subsy)
531 	   && (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)))
532      return NULL;
533 
534   reloc = xmalloc (sizeof (arelent));
535   reloc->sym_ptr_ptr  = xmalloc (sizeof (asymbol *));
536   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
537   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
538   reloc->addend = fixP->fx_offset;
539 
540   if (fixP->fx_subsy != NULL)
541     {
542       if (SWITCH_TABLE (fixP))
543         {
544           /* Keep the current difference in the addend.  */
545           reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
546                            - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
547 
548           switch (fixP->fx_r_type)
549             {
550             case BFD_RELOC_CR16_NUM8:
551               fixP->fx_r_type = BFD_RELOC_CR16_SWITCH8;
552               break;
553             case BFD_RELOC_CR16_NUM16:
554               fixP->fx_r_type = BFD_RELOC_CR16_SWITCH16;
555               break;
556             case BFD_RELOC_CR16_NUM32:
557               fixP->fx_r_type = BFD_RELOC_CR16_SWITCH32;
558               break;
559             case BFD_RELOC_CR16_NUM32a:
560               fixP->fx_r_type = BFD_RELOC_CR16_NUM32a;
561               break;
562             default:
563               abort ();
564               break;
565             }
566         }
567       else
568         {
569           /* We only resolve difference expressions in the same section.  */
570           as_bad_where (fixP->fx_file, fixP->fx_line,
571                         _("can't resolve `%s' {%s section} - `%s' {%s section}"),
572                         fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
573                         segment_name (fixP->fx_addsy
574                                       ? S_GET_SEGMENT (fixP->fx_addsy)
575                                       : absolute_section),
576                         S_GET_NAME (fixP->fx_subsy),
577                         segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
578         }
579     }
580 #ifdef OBJ_ELF
581       if ((fixP->fx_r_type == BFD_RELOC_CR16_GOT_REGREL20)
582            && GOT_symbol
583 	   && fixP->fx_addsy == GOT_symbol)
584 	{
585 	    code = BFD_RELOC_CR16_GOT_REGREL20;
586 	    reloc->addend = fixP->fx_offset = reloc->address;
587 	}
588       else if ((fixP->fx_r_type == BFD_RELOC_CR16_GOTC_REGREL20)
589            && GOT_symbol
590 	   && fixP->fx_addsy == GOT_symbol)
591 	{
592 	    code = BFD_RELOC_CR16_GOTC_REGREL20;
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, 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 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-opearand.  */
1162   char *operandE; /* Pointer to end of sub-opearand.  */
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     case arg_c:     /* Case 0x18.  */
1174       /* Set constant.  */
1175       process_label_constant (operandS, cr16_ins);
1176 
1177       if (cur_arg->type != arg_ic)
1178         cur_arg->type = arg_c;
1179       break;
1180 
1181     case arg_icr:   /* Case $0x18(r1).  */
1182       operandS++;
1183     case arg_cr:    /* Case 0x18(r1).   */
1184       /* Set displacement constant.  */
1185       while (*operandE != '(')
1186         operandE++;
1187       *operandE = '\0';
1188       process_label_constant (operandS, cr16_ins);
1189       operandS = operandE;
1190     case arg_rbase: /* Case (r1) or (r1,r0).  */
1191       operandS++;
1192       /* Set register base.  */
1193       while (*operandE != ')')
1194         operandE++;
1195       *operandE = '\0';
1196       if ((cur_arg->r = get_register (operandS)) == nullregister)
1197          as_bad (_("Illegal register `%s' in Instruction `%s'"),
1198               operandS, ins_parse);
1199 
1200       /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1201       if ((cur_arg->type != arg_rbase)
1202           && ((getreg_image (cur_arg->r) == 12)
1203               || (getreg_image (cur_arg->r) == 13)
1204               || (getreg_image (cur_arg->r) == 14)
1205               || (getreg_image (cur_arg->r) == 15)))
1206          {
1207            cur_arg->type = arg_crp;
1208            cur_arg->rp = cur_arg->r;
1209          }
1210       break;
1211 
1212     case arg_crp:    /* Case 0x18(r1,r0).   */
1213       /* Set displacement constant.  */
1214       while (*operandE != '(')
1215         operandE++;
1216       *operandE = '\0';
1217       process_label_constant (operandS, cr16_ins);
1218       operandS = operandE;
1219       operandS++;
1220       /* Set register pair base.  */
1221       while (*operandE != ')')
1222         operandE++;
1223       *operandE = '\0';
1224       if ((cur_arg->rp = get_register_pair (operandS)) == nullregister)
1225          as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1226               operandS, ins_parse);
1227       break;
1228 
1229     case arg_idxr:
1230       /* Set register pair base.  */
1231       if ((strchr (operandS,'(') != NULL))
1232         {
1233          while ((*operandE != '(') && (! ISSPACE (*operandE)))
1234            operandE++;
1235          if ((cur_arg->rp = get_index_register_pair (operandE)) == nullregister)
1236               as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1237                             operandS, ins_parse);
1238          *operandE++ = '\0';
1239          cur_arg->type = arg_idxrp;
1240         }
1241       else
1242         cur_arg->rp = -1;
1243 
1244        operandE = operandS;
1245       /* Set displacement constant.  */
1246       while (*operandE != ']')
1247         operandE++;
1248       process_label_constant (++operandE, cr16_ins);
1249       *operandE++ = '\0';
1250       operandE = operandS;
1251 
1252       /* Set index register .  */
1253       operandS = strchr (operandE,'[');
1254       if (operandS != NULL)
1255         { /* Eliminate '[', detach from rest of operand.  */
1256           *operandS++ = '\0';
1257 
1258           operandE = strchr (operandS, ']');
1259 
1260           if (operandE == NULL)
1261             as_bad (_("unmatched '['"));
1262           else
1263             { /* Eliminate ']' and make sure it was the last thing
1264                  in the string.  */
1265               *operandE = '\0';
1266               if (*(operandE + 1) != '\0')
1267                 as_bad (_("garbage after index spec ignored"));
1268             }
1269         }
1270 
1271       if ((cur_arg->i_r = get_index_register (operandS)) == nullregister)
1272         as_bad (_("Illegal register `%s' in Instruction `%s'"),
1273                 operandS, ins_parse);
1274       *operandE = '\0';
1275       *operandS = '\0';
1276       break;
1277 
1278     default:
1279       break;
1280     }
1281 }
1282 
1283 /* Parse a single operand.
1284    operand - Current operand to parse.
1285    cr16_ins - Current assembled instruction.  */
1286 
1287 static void
1288 parse_operand (char *operand, ins * cr16_ins)
1289 {
1290   int ret_val;
1291   argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument.  */
1292 
1293   /* Initialize the type to NULL before parsing.  */
1294   cur_arg->type = nullargs;
1295 
1296   /* Check whether this is a condition code .  */
1297   if ((IS_INSN_MNEMONIC ("b")) && ((ret_val = get_cc (operand)) != -1))
1298     {
1299       cur_arg->type = arg_cc;
1300       cur_arg->cc = ret_val;
1301       cur_arg->X_op = O_register;
1302       return;
1303     }
1304 
1305   /* Check whether this is a general processor register.  */
1306   if ((ret_val = get_register (operand)) != nullregister)
1307     {
1308       cur_arg->type = arg_r;
1309       cur_arg->r = ret_val;
1310       cur_arg->X_op = 0;
1311       return;
1312     }
1313 
1314   /* Check whether this is a general processor register pair.  */
1315   if ((operand[0] == '(')
1316       && ((ret_val = get_register_pair (operand)) != nullregister))
1317     {
1318       cur_arg->type = arg_rp;
1319       cur_arg->rp = ret_val;
1320       cur_arg->X_op = O_register;
1321       return;
1322     }
1323 
1324   /* Check whether the operand is a processor register.
1325      For "lprd" and "sprd" instruction, only 32 bit
1326      processor registers used.  */
1327   if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1328       && ((ret_val = get_pregister (operand)) != nullpregister))
1329     {
1330       cur_arg->type = arg_pr;
1331       cur_arg->pr = ret_val;
1332       cur_arg->X_op = O_register;
1333       return;
1334     }
1335 
1336   /* Check whether this is a processor register - 32 bit.  */
1337   if ((ret_val = get_pregisterp (operand)) != nullpregister)
1338     {
1339       cur_arg->type = arg_prp;
1340       cur_arg->prp = ret_val;
1341       cur_arg->X_op = O_register;
1342       return;
1343     }
1344 
1345   /* Deal with special characters.  */
1346   switch (operand[0])
1347     {
1348     case '$':
1349       if (strchr (operand, '(') != NULL)
1350         cur_arg->type = arg_icr;
1351       else
1352         cur_arg->type = arg_ic;
1353       goto set_params;
1354       break;
1355 
1356     case '(':
1357       cur_arg->type = arg_rbase;
1358       goto set_params;
1359       break;
1360 
1361     case '[':
1362       cur_arg->type = arg_idxr;
1363       goto set_params;
1364       break;
1365 
1366     default:
1367       break;
1368     }
1369 
1370   if (strchr (operand, '(') != NULL)
1371     {
1372       if (strchr (operand, ',') != NULL
1373           && (strchr (operand, ',') > strchr (operand, '(')))
1374         cur_arg->type = arg_crp;
1375       else
1376         cur_arg->type = arg_cr;
1377     }
1378   else
1379     cur_arg->type = arg_c;
1380 
1381 /* Parse an operand according to its type.  */
1382  set_params:
1383   cur_arg->constant = 0;
1384   set_operand (operand, cr16_ins);
1385 }
1386 
1387 /* Parse the various operands. Each operand is then analyzed to fillup
1388    the fields in the cr16_ins data structure.  */
1389 
1390 static void
1391 parse_operands (ins * cr16_ins, char *operands)
1392 {
1393   char *operandS;            /* Operands string.  */
1394   char *operandH, *operandT; /* Single operand head/tail pointers.  */
1395   int allocated = 0;         /* Indicates a new operands string was allocated.*/
1396   char *operand[MAX_OPERANDS];/* Separating the operands.  */
1397   int op_num = 0;             /* Current operand number we are parsing.  */
1398   int bracket_flag = 0;       /* Indicates a bracket '(' was found.  */
1399   int sq_bracket_flag = 0;    /* Indicates a square bracket '[' was found.  */
1400 
1401   /* Preprocess the list of registers, if necessary.  */
1402   operandS = operandH = operandT = operands;
1403 
1404   while (*operandT != '\0')
1405     {
1406       if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
1407         {
1408           *operandT++ = '\0';
1409           operand[op_num++] = strdup (operandH);
1410           operandH = operandT;
1411           continue;
1412         }
1413 
1414       if (*operandT == ' ')
1415         as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
1416 
1417       if (*operandT == '(')
1418         bracket_flag = 1;
1419       else if (*operandT == '[')
1420         sq_bracket_flag = 1;
1421 
1422       if (*operandT == ')')
1423         {
1424           if (bracket_flag)
1425             bracket_flag = 0;
1426           else
1427             as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1428         }
1429       else if (*operandT == ']')
1430         {
1431           if (sq_bracket_flag)
1432             sq_bracket_flag = 0;
1433           else
1434             as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1435         }
1436 
1437       if (bracket_flag == 1 && *operandT == ')')
1438         bracket_flag = 0;
1439       else if (sq_bracket_flag == 1 && *operandT == ']')
1440         sq_bracket_flag = 0;
1441 
1442       operandT++;
1443     }
1444 
1445   /* Adding the last operand.  */
1446   operand[op_num++] = strdup (operandH);
1447   cr16_ins->nargs = op_num;
1448 
1449   /* Verifying correct syntax of operands (all brackets should be closed).  */
1450   if (bracket_flag || sq_bracket_flag)
1451     as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1452 
1453   /* Now we parse each operand separately.  */
1454   for (op_num = 0; op_num < cr16_ins->nargs; op_num++)
1455     {
1456       cur_arg_num = op_num;
1457       parse_operand (operand[op_num], cr16_ins);
1458       free (operand[op_num]);
1459     }
1460 
1461   if (allocated)
1462     free (operandS);
1463 }
1464 
1465 /* Get the trap index in dispatch table, given its name.
1466    This routine is used by assembling the 'excp' instruction.  */
1467 
1468 static int
1469 gettrap (char *s)
1470 {
1471   const trap_entry *trap;
1472 
1473   for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1474     if (strcasecmp (trap->name, s) == 0)
1475       return trap->entry;
1476 
1477   /* To make compatable with CR16 4.1 tools, the below 3-lines of
1478    * code added. Refer: Development Tracker item #123 */
1479   for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1480     if (trap->entry  == (unsigned int) atoi (s))
1481       return trap->entry;
1482 
1483   as_bad (_("Unknown exception: `%s'"), s);
1484   return 0;
1485 }
1486 
1487 /* Top level module where instruction parsing starts.
1488    cr16_ins - data structure holds some information.
1489    operands - holds the operands part of the whole instruction.  */
1490 
1491 static void
1492 parse_insn (ins *insn, char *operands)
1493 {
1494   int i;
1495 
1496   /* Handle instructions with no operands.  */
1497   for (i = 0; cr16_no_op_insn[i] != NULL; i++)
1498   {
1499     if (streq (cr16_no_op_insn[i], instruction->mnemonic))
1500     {
1501       insn->nargs = 0;
1502       return;
1503     }
1504   }
1505 
1506   /* Handle 'excp' instructions.  */
1507   if (IS_INSN_MNEMONIC ("excp"))
1508     {
1509       insn->nargs = 1;
1510       insn->arg[0].type = arg_ic;
1511       insn->arg[0].constant = gettrap (operands);
1512       insn->arg[0].X_op = O_constant;
1513       return;
1514     }
1515 
1516   if (operands != NULL)
1517     parse_operands (insn, operands);
1518 }
1519 
1520 /* bCC instruction requires special handling.  */
1521 static char *
1522 get_b_cc (char * op)
1523 {
1524   unsigned int i;
1525   char op1[5];
1526 
1527   for (i = 1; i < strlen (op); i++)
1528      op1[i-1] = op[i];
1529 
1530   op1[i-1] = '\0';
1531 
1532   for (i = 0; i < cr16_num_cc ; i++)
1533     if (streq (op1, cr16_b_cond_tab[i]))
1534       return (char *) cr16_b_cond_tab[i];
1535 
1536    return NULL;
1537 }
1538 
1539 /* bCC instruction requires special handling.  */
1540 static int
1541 is_bcc_insn (char * op)
1542 {
1543   if (!(streq (op, "bal") || streq (op, "beq0b") || streq (op, "bnq0b")
1544         || streq (op, "beq0w") || streq (op, "bnq0w")))
1545     if ((op[0] == 'b') && (get_b_cc (op) != NULL))
1546       return 1;
1547   return 0;
1548 }
1549 
1550 /* Cinv instruction requires special handling.  */
1551 
1552 static int
1553 check_cinv_options (char * operand)
1554 {
1555   char *p = operand;
1556   int i_used = 0, u_used = 0, d_used = 0;
1557 
1558   while (*++p != ']')
1559     {
1560       if (*p == ',' || *p == ' ')
1561         continue;
1562 
1563       else if (*p == 'i')
1564         i_used = 1;
1565       else if (*p == 'u')
1566         u_used = 1;
1567       else if (*p == 'd')
1568         d_used = 1;
1569       else
1570         as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
1571     }
1572 
1573   return 0;
1574 }
1575 
1576 /* Retrieve the opcode image of a given register pair.
1577    If the register is illegal for the current instruction,
1578    issue an error.  */
1579 
1580 static int
1581 getregp_image (reg r)
1582 {
1583   const reg_entry *rreg;
1584   char *reg_name;
1585 
1586   /* Check whether the register is in registers table.  */
1587   if (r < MAX_REG)
1588     rreg = cr16_regptab + r;
1589   /* Register not found.  */
1590   else
1591     {
1592       as_bad (_("Unknown register pair: `%d'"), r);
1593       return 0;
1594     }
1595 
1596   reg_name = rreg->name;
1597 
1598 /* Issue a error message when register  pair is illegal.  */
1599 #define RPAIR_IMAGE_ERR \
1600   as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
1601             reg_name, ins_parse);                                 \
1602   break;
1603 
1604   switch (rreg->type)
1605     {
1606     case CR16_RP_REGTYPE:
1607       return rreg->image;
1608     default:
1609       RPAIR_IMAGE_ERR;
1610     }
1611 
1612   return 0;
1613 }
1614 
1615 /* Retrieve the opcode image of a given index register pair.
1616    If the register is illegal for the current instruction,
1617    issue an error.  */
1618 
1619 static int
1620 getidxregp_image (reg r)
1621 {
1622   const reg_entry *rreg;
1623   char *reg_name;
1624 
1625   /* Check whether the register is in registers table.  */
1626   if (r < MAX_REG)
1627     rreg = cr16_regptab + r;
1628   /* Register not found.  */
1629   else
1630     {
1631       as_bad (_("Unknown register pair: `%d'"), r);
1632       return 0;
1633     }
1634 
1635   reg_name = rreg->name;
1636 
1637 /* Issue a error message when register  pair is illegal.  */
1638 #define IDX_RPAIR_IMAGE_ERR \
1639   as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
1640             reg_name, ins_parse);                                       \
1641 
1642   if (rreg->type == CR16_RP_REGTYPE)
1643     {
1644       switch (rreg->image)
1645         {
1646         case 0:  return 0; break;
1647         case 2:  return 1; break;
1648         case 4:  return 2; break;
1649         case 6:  return 3; break;
1650         case 8:  return 4; break;
1651         case 10: return 5; break;
1652         case 3:  return 6; break;
1653         case 5:  return 7; break;
1654         default:
1655           break;
1656         }
1657     }
1658 
1659   IDX_RPAIR_IMAGE_ERR;
1660   return 0;
1661 }
1662 
1663 /* Retrieve the opcode image of a given processort register.
1664    If the register is illegal for the current instruction,
1665    issue an error.  */
1666 static int
1667 getprocreg_image (reg r)
1668 {
1669   const reg_entry *rreg;
1670   char *reg_name;
1671 
1672   /* Check whether the register is in registers table.  */
1673   if (r >= MAX_REG && r < MAX_PREG)
1674     rreg = &cr16_pregtab[r - MAX_REG];
1675   /* Register not found.  */
1676   else
1677     {
1678       as_bad (_("Unknown processor register : `%d'"), r);
1679       return 0;
1680     }
1681 
1682   reg_name = rreg->name;
1683 
1684 /* Issue a error message when register  pair is illegal.  */
1685 #define PROCREG_IMAGE_ERR \
1686   as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1687             reg_name, ins_parse);                                      \
1688   break;
1689 
1690   switch (rreg->type)
1691     {
1692     case CR16_P_REGTYPE:
1693       return rreg->image;
1694     default:
1695       PROCREG_IMAGE_ERR;
1696     }
1697 
1698   return 0;
1699 }
1700 
1701 /* Retrieve the opcode image of a given processort register.
1702    If the register is illegal for the current instruction,
1703    issue an error.  */
1704 static int
1705 getprocregp_image (reg r)
1706 {
1707   const reg_entry *rreg;
1708   char *reg_name;
1709   int pregptab_disp = 0;
1710 
1711   /* Check whether the register is in registers table.  */
1712   if (r >= MAX_REG && r < MAX_PREG)
1713     {
1714       r = r - MAX_REG;
1715       switch (r)
1716         {
1717         case 4: pregptab_disp = 1;  break;
1718         case 6: pregptab_disp = 2;  break;
1719         case 8:
1720         case 9:
1721         case 10:
1722           pregptab_disp = 3;  break;
1723         case 12:
1724           pregptab_disp = 4;  break;
1725         case 14:
1726           pregptab_disp = 5;  break;
1727         default: break;
1728         }
1729       rreg = &cr16_pregptab[r - pregptab_disp];
1730     }
1731   /* Register not found.  */
1732   else
1733     {
1734       as_bad (_("Unknown processor register (32 bit) : `%d'"), r);
1735       return 0;
1736     }
1737 
1738   reg_name = rreg->name;
1739 
1740 /* Issue a error message when register  pair is illegal.  */
1741 #define PROCREGP_IMAGE_ERR \
1742   as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
1743             reg_name, ins_parse);                                              \
1744   break;
1745 
1746   switch (rreg->type)
1747     {
1748     case CR16_P_REGTYPE:
1749       return rreg->image;
1750     default:
1751       PROCREGP_IMAGE_ERR;
1752     }
1753 
1754   return 0;
1755 }
1756 
1757 /* Routine used to represent integer X using NBITS bits.  */
1758 
1759 static long
1760 getconstant (long x, int nbits)
1761 {
1762   /* The following expression avoids overflow if
1763      'nbits' is the number of bits in 'bfd_vma'.  */
1764   return (x & ((((1 << (nbits - 1)) - 1) << 1) | 1));
1765 }
1766 
1767 /* Print a constant value to 'output_opcode':
1768    ARG holds the operand's type and value.
1769    SHIFT represents the location of the operand to be print into.
1770    NBITS determines the size (in bits) of the constant.  */
1771 
1772 static void
1773 print_constant (int nbits, int shift, argument *arg)
1774 {
1775   unsigned long mask = 0;
1776 
1777   long constant = getconstant (arg->constant, nbits);
1778 
1779   switch (nbits)
1780     {
1781     case 32:
1782     case 28:
1783       /* mask the upper part of the constant, that is, the bits
1784          going to the lowest byte of output_opcode[0].
1785          The upper part of output_opcode[1] is always filled,
1786          therefore it is always masked with 0xFFFF.  */
1787       mask = (1 << (nbits - 16)) - 1;
1788       /* Divide the constant between two consecutive words :
1789          0        1         2         3
1790          +---------+---------+---------+---------+
1791          |         | X X X X | x X x X |         |
1792          +---------+---------+---------+---------+
1793          output_opcode[0]    output_opcode[1]     */
1794 
1795       CR16_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
1796       CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1797       break;
1798 
1799     case 21:
1800       if ((nbits == 21) && (IS_INSN_TYPE (LD_STOR_INS))) nbits = 20;
1801     case 24:
1802     case 22:
1803     case 20:
1804       /* mask the upper part of the constant, that is, the bits
1805          going to the lowest byte of output_opcode[0].
1806          The upper part of output_opcode[1] is always filled,
1807          therefore it is always masked with 0xFFFF.  */
1808       mask = (1 << (nbits - 16)) - 1;
1809       /* Divide the constant between two consecutive words :
1810          0        1         2          3
1811          +---------+---------+---------+---------+
1812          |         | X X X X | - X - X |         |
1813          +---------+---------+---------+---------+
1814          output_opcode[0]    output_opcode[1]     */
1815 
1816       if ((instruction->size > 2) && (shift == WORD_SHIFT))
1817         {
1818           if (arg->type == arg_idxrp)
1819             {
1820               CR16_PRINT (0, ((constant >> WORD_SHIFT) & mask) << 8, 0);
1821               CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1822             }
1823           else
1824             {
1825               CR16_PRINT (0, (((((constant >> WORD_SHIFT) & mask) << 8) & 0x0f00) | ((((constant >> WORD_SHIFT) & mask) >> 4) & 0xf)),0);
1826               CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1827             }
1828         }
1829       else
1830         CR16_PRINT (0, constant, shift);
1831       break;
1832 
1833     case 14:
1834       if (arg->type == arg_idxrp)
1835         {
1836           if (instruction->size == 2)
1837             {
1838               CR16_PRINT (0, ((constant)      & 0xf), shift);        /* 0-3 bits.  */
1839               CR16_PRINT (0, ((constant >> 4) & 0x3), (shift + 20)); /* 4-5 bits.  */
1840               CR16_PRINT (0, ((constant >> 6) & 0x3), (shift + 14)); /* 6-7 bits.  */
1841               CR16_PRINT (0, ((constant >> 8) & 0x3f), (shift + 8)); /* 8-13 bits.  */
1842             }
1843           else
1844             CR16_PRINT (0, constant, shift);
1845         }
1846       break;
1847 
1848     case 16:
1849     case 12:
1850       /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1851          always filling the upper part of output_opcode[1]. If we mistakenly
1852          write it to output_opcode[0], the constant prefix (that is, 'match')
1853          will be overriden.
1854          0        1         2         3
1855          +---------+---------+---------+---------+
1856          | 'match' |         | X X X X |         |
1857          +---------+---------+---------+---------+
1858          output_opcode[0]    output_opcode[1]     */
1859 
1860       if ((instruction->size > 2) && (shift == WORD_SHIFT))
1861         CR16_PRINT (1, constant, WORD_SHIFT);
1862       else
1863         CR16_PRINT (0, constant, shift);
1864       break;
1865 
1866     case 8:
1867       CR16_PRINT (0, ((constant / 2) & 0xf), shift);
1868       CR16_PRINT (0, ((constant / 2) >> 4), (shift + 8));
1869       break;
1870 
1871     default:
1872       CR16_PRINT (0, constant,  shift);
1873       break;
1874     }
1875 }
1876 
1877 /* Print an operand to 'output_opcode', which later on will be
1878    printed to the object file:
1879    ARG holds the operand's type, size and value.
1880    SHIFT represents the printing location of operand.
1881    NBITS determines the size (in bits) of a constant operand.  */
1882 
1883 static void
1884 print_operand (int nbits, int shift, argument *arg)
1885 {
1886   switch (arg->type)
1887     {
1888     case arg_cc:
1889       CR16_PRINT (0, arg->cc, shift);
1890       break;
1891 
1892     case arg_r:
1893       CR16_PRINT (0, getreg_image (arg->r), shift);
1894       break;
1895 
1896     case arg_rp:
1897       CR16_PRINT (0, getregp_image (arg->rp), shift);
1898       break;
1899 
1900     case arg_pr:
1901       CR16_PRINT (0, getprocreg_image (arg->pr), shift);
1902       break;
1903 
1904     case arg_prp:
1905       CR16_PRINT (0, getprocregp_image (arg->prp), shift);
1906       break;
1907 
1908     case arg_idxrp:
1909       /*    16      12      8    6      0
1910             +-----------------------------+
1911             | r_index | disp  | rp_base   |
1912             +-----------------------------+          */
1913 
1914       if (instruction->size == 3)
1915         {
1916           CR16_PRINT (0, getidxregp_image (arg->rp), 0);
1917           if (getreg_image (arg->i_r) == 12)
1918             CR16_PRINT (0, 0, 3);
1919           else
1920             CR16_PRINT (0, 1, 3);
1921         }
1922       else
1923         {
1924           CR16_PRINT (0, getidxregp_image (arg->rp), 16);
1925           if (getreg_image (arg->i_r) == 12)
1926             CR16_PRINT (0, 0, 19);
1927           else
1928             CR16_PRINT (0, 1, 19);
1929         }
1930       print_constant (nbits, shift, arg);
1931       break;
1932 
1933     case arg_idxr:
1934       if (getreg_image (arg->i_r) == 12)
1935         if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1936             || IS_INSN_MNEMONIC ("tbitb"))
1937           CR16_PRINT (0, 0, 23);
1938         else CR16_PRINT (0, 0, 24);
1939       else
1940         if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1941             || IS_INSN_MNEMONIC ("tbitb"))
1942           CR16_PRINT (0, 1, 23);
1943         else CR16_PRINT (0, 1, 24);
1944 
1945       print_constant (nbits, shift, arg);
1946       break;
1947 
1948     case arg_ic:
1949     case arg_c:
1950       print_constant (nbits, shift, arg);
1951       break;
1952 
1953     case arg_rbase:
1954       CR16_PRINT (0, getreg_image (arg->r), shift);
1955       break;
1956 
1957     case arg_cr:
1958       print_constant (nbits, shift , arg);
1959       /* Add the register argument to the output_opcode.  */
1960       CR16_PRINT (0, getreg_image (arg->r), (shift+16));
1961       break;
1962 
1963     case arg_crp:
1964       print_constant (nbits, shift , arg);
1965       if (instruction->size > 1)
1966         CR16_PRINT (0, getregp_image (arg->rp), (shift + 16));
1967       else if (IS_INSN_TYPE (LD_STOR_INS) || (IS_INSN_TYPE (CSTBIT_INS)))
1968         {
1969           if (instruction->size == 2)
1970             CR16_PRINT (0, getregp_image (arg->rp), (shift - 8));
1971           else if (instruction->size == 1)
1972             CR16_PRINT (0, getregp_image (arg->rp), 16);
1973         }
1974       else
1975         CR16_PRINT (0, getregp_image (arg->rp), shift);
1976       break;
1977 
1978     default:
1979       break;
1980     }
1981 }
1982 
1983 /* Retrieve the number of operands for the current assembled instruction.  */
1984 
1985 static int
1986 get_number_of_operands (void)
1987 {
1988   int i;
1989 
1990   for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
1991     ;
1992   return i;
1993 }
1994 
1995 /* Verify that the number NUM can be represented in BITS bits (that is,
1996    within its permitted range), based on the instruction's FLAGS.
1997    If UPDATE is nonzero, update the value of NUM if necessary.
1998    Return OP_LEGAL upon success, actual error type upon failure.  */
1999 
2000 static op_err
2001 check_range (long *num, int bits, int unsigned flags, int update)
2002 {
2003   long min, max;
2004   int retval = OP_LEGAL;
2005   long value = *num;
2006 
2007   if (bits == 0 && value > 0) return OP_OUT_OF_RANGE;
2008 
2009   /* For hosts witah longs bigger than 32-bits make sure that the top
2010      bits of a 32-bit negative value read in by the parser are set,
2011      so that the correct comparisons are made.  */
2012   if (value & 0x80000000)
2013     value |= (-1L << 31);
2014 
2015 
2016   /* Verify operand value is even.  */
2017   if (flags & OP_EVEN)
2018     {
2019       if (value % 2)
2020         return OP_NOT_EVEN;
2021     }
2022 
2023   if (flags & OP_DEC)
2024     {
2025       value -= 1;
2026       if (update)
2027         *num = value;
2028     }
2029 
2030   if (flags & OP_SHIFT)
2031     {
2032       value >>= 1;
2033       if (update)
2034         *num = value;
2035     }
2036   else if (flags & OP_SHIFT_DEC)
2037     {
2038       value = (value >> 1) - 1;
2039       if (update)
2040         *num = value;
2041     }
2042 
2043   if (flags & OP_ABS20)
2044     {
2045       if (value > 0xEFFFF)
2046         return OP_OUT_OF_RANGE;
2047     }
2048 
2049   if (flags & OP_ESC)
2050     {
2051       if (value == 0xB || value == 0x9)
2052         return OP_OUT_OF_RANGE;
2053       else if (value == -1)
2054         {
2055           if (update)
2056             *num = 9;
2057           return retval;
2058         }
2059     }
2060 
2061   if (flags & OP_ESC1)
2062     {
2063       if (value > 13)
2064         return OP_OUT_OF_RANGE;
2065     }
2066 
2067    if (flags & OP_SIGNED)
2068      {
2069        max = (1 << (bits - 1)) - 1;
2070        min = - (1 << (bits - 1));
2071        if ((value > max) || (value < min))
2072          retval = OP_OUT_OF_RANGE;
2073      }
2074    else if (flags & OP_UNSIGNED)
2075      {
2076        max = ((((1 << (bits - 1)) - 1) << 1) | 1);
2077        min = 0;
2078        if (((unsigned long) value > (unsigned long) max)
2079             || ((unsigned long) value < (unsigned long) min))
2080          retval = OP_OUT_OF_RANGE;
2081      }
2082    else if (flags & OP_NEG)
2083      {
2084        max = - 1;
2085        min = - ((1 << (bits - 1)) - 1);
2086        if ((value > max) || (value < min))
2087          retval = OP_OUT_OF_RANGE;
2088      }
2089    return retval;
2090 }
2091 
2092 /* Bunch of error checkings.
2093    The checks are made after a matching instruction was found.  */
2094 
2095 static void
2096 warn_if_needed (ins *insn)
2097 {
2098   /* If the post-increment address mode is used and the load/store
2099      source register is the same as rbase, the result of the
2100      instruction is undefined.  */
2101   if (IS_INSN_TYPE (LD_STOR_INS_INC))
2102     {
2103       /* Enough to verify that one of the arguments is a simple reg.  */
2104       if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
2105         if (insn->arg[0].r == insn->arg[1].r)
2106           as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn->arg[0].r);
2107     }
2108 
2109   if (IS_INSN_MNEMONIC ("pop")
2110       || IS_INSN_MNEMONIC ("push")
2111       || IS_INSN_MNEMONIC ("popret"))
2112     {
2113       unsigned int count = insn->arg[0].constant, reg_val;
2114 
2115       /* Check if count operand caused to save/retrive the RA twice
2116          to generate warning message.  */
2117      if (insn->nargs > 2)
2118        {
2119          reg_val = getreg_image (insn->arg[1].r);
2120 
2121          if (   ((reg_val == 9) &&  (count > 7))
2122              || ((reg_val == 10) && (count > 6))
2123              || ((reg_val == 11) && (count > 5))
2124              || ((reg_val == 12) && (count > 4))
2125              || ((reg_val == 13) && (count > 2))
2126              || ((reg_val == 14) && (count > 0)))
2127            as_warn (_("RA register is saved twice."));
2128 
2129          /* Check if the third operand is "RA" or "ra" */
2130          if (!(((insn->arg[2].r) == ra) || ((insn->arg[2].r) == RA)))
2131            as_bad (_("`%s' Illegal use of registers."), ins_parse);
2132        }
2133 
2134       if (insn->nargs > 1)
2135        {
2136          reg_val = getreg_image (insn->arg[1].r);
2137 
2138          /* If register is a register pair ie r12/r13/r14 in operand1, then
2139             the count constant should be validated.  */
2140          if (((reg_val == 11) && (count > 7))
2141              || ((reg_val == 12) && (count > 6))
2142              || ((reg_val == 13) && (count > 4))
2143              || ((reg_val == 14) && (count > 2))
2144              || ((reg_val == 15) && (count > 0)))
2145            as_bad (_("`%s' Illegal count-register combination."), ins_parse);
2146        }
2147      else
2148        {
2149          /* Check if the operand is "RA" or "ra" */
2150          if (!(((insn->arg[0].r) == ra) || ((insn->arg[0].r) == RA)))
2151            as_bad (_("`%s' Illegal use of register."), ins_parse);
2152        }
2153     }
2154 
2155   /* Some instruction assume the stack pointer as rptr operand.
2156      Issue an error when the register to be loaded is also SP.  */
2157   if (instruction->flags & NO_SP)
2158     {
2159       if (getreg_image (insn->arg[1].r) == getreg_image (sp))
2160         as_bad (_("`%s' has undefined result"), ins_parse);
2161     }
2162 
2163   /* If the rptr register is specified as one of the registers to be loaded,
2164      the final contents of rptr are undefined. Thus, we issue an error.  */
2165   if (instruction->flags & NO_RPTR)
2166     {
2167       if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
2168         as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2169                   getreg_image (insn->arg[0].r));
2170     }
2171 }
2172 
2173 /* In some cases, we need to adjust the instruction pointer although a
2174    match was already found. Here, we gather all these cases.
2175    Returns 1 if instruction pointer was adjusted, otherwise 0.  */
2176 
2177 static int
2178 adjust_if_needed (ins *insn ATTRIBUTE_UNUSED)
2179 {
2180   int ret_value = 0;
2181 
2182   if ((IS_INSN_TYPE (CSTBIT_INS)) || (IS_INSN_TYPE (LD_STOR_INS)))
2183     {
2184       if ((instruction->operands[0].op_type == abs24)
2185            && ((insn->arg[0].constant) > 0xF00000))
2186         {
2187           insn->arg[0].constant &= 0xFFFFF;
2188           instruction--;
2189           ret_value = 1;
2190         }
2191     }
2192 
2193   return ret_value;
2194 }
2195 
2196 /* Assemble a single instruction:
2197    INSN is already parsed (that is, all operand values and types are set).
2198    For instruction to be assembled, we need to find an appropriate template in
2199    the instruction table, meeting the following conditions:
2200     1: Has the same number of operands.
2201     2: Has the same operand types.
2202     3: Each operand size is sufficient to represent the instruction's values.
2203    Returns 1 upon success, 0 upon failure.  */
2204 
2205 static int
2206 assemble_insn (char *mnemonic, ins *insn)
2207 {
2208   /* Type of each operand in the current template.  */
2209   argtype cur_type[MAX_OPERANDS];
2210   /* Size (in bits) of each operand in the current template.  */
2211   unsigned int cur_size[MAX_OPERANDS];
2212   /* Flags of each operand in the current template.  */
2213   unsigned int cur_flags[MAX_OPERANDS];
2214   /* Instruction type to match.  */
2215   unsigned int ins_type;
2216   /* Boolean flag to mark whether a match was found.  */
2217   int match = 0;
2218   int i;
2219   /* Nonzero if an instruction with same number of operands was found.  */
2220   int found_same_number_of_operands = 0;
2221   /* Nonzero if an instruction with same argument types was found.  */
2222   int found_same_argument_types = 0;
2223   /* Nonzero if a constant was found within the required range.  */
2224   int found_const_within_range  = 0;
2225   /* Argument number of an operand with invalid type.  */
2226   int invalid_optype = -1;
2227   /* Argument number of an operand with invalid constant value.  */
2228   int invalid_const  = -1;
2229   /* Operand error (used for issuing various constant error messages).  */
2230   op_err op_error, const_err = OP_LEGAL;
2231 
2232 /* Retrieve data (based on FUNC) for each operand of a given instruction.  */
2233 #define GET_CURRENT_DATA(FUNC, ARRAY)                           \
2234   for (i = 0; i < insn->nargs; i++)                             \
2235     ARRAY[i] = FUNC (instruction->operands[i].op_type)
2236 
2237 #define GET_CURRENT_TYPE    GET_CURRENT_DATA (get_optype, cur_type)
2238 #define GET_CURRENT_SIZE    GET_CURRENT_DATA (get_opbits, cur_size)
2239 #define GET_CURRENT_FLAGS   GET_CURRENT_DATA (get_opflags, cur_flags)
2240 
2241   /* Instruction has no operands -> only copy the constant opcode.   */
2242   if (insn->nargs == 0)
2243     {
2244       output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2245       return 1;
2246     }
2247 
2248   /* In some case, same mnemonic can appear with different instruction types.
2249      For example, 'storb' is supported with 3 different types :
2250      LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2251      We assume that when reaching this point, the instruction type was
2252      pre-determined. We need to make sure that the type stays the same
2253      during a search for matching instruction.  */
2254   ins_type = CR16_INS_TYPE (instruction->flags);
2255 
2256   while (/* Check that match is still not found.  */
2257          match != 1
2258          /* Check we didn't get to end of table.  */
2259          && instruction->mnemonic != NULL
2260          /* Check that the actual mnemonic is still available.  */
2261          && IS_INSN_MNEMONIC (mnemonic)
2262          /* Check that the instruction type wasn't changed.  */
2263          && IS_INSN_TYPE (ins_type))
2264     {
2265       /* Check whether number of arguments is legal.  */
2266       if (get_number_of_operands () != insn->nargs)
2267         goto next_insn;
2268       found_same_number_of_operands = 1;
2269 
2270       /* Initialize arrays with data of each operand in current template.  */
2271       GET_CURRENT_TYPE;
2272       GET_CURRENT_SIZE;
2273       GET_CURRENT_FLAGS;
2274 
2275       /* Check for type compatibility.  */
2276       for (i = 0; i < insn->nargs; i++)
2277         {
2278           if (cur_type[i] != insn->arg[i].type)
2279             {
2280               if (invalid_optype == -1)
2281                 invalid_optype = i + 1;
2282               goto next_insn;
2283             }
2284         }
2285       found_same_argument_types = 1;
2286 
2287       for (i = 0; i < insn->nargs; i++)
2288         {
2289           /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2290              then goto next instruction.  */
2291           if (IS_INSN_MNEMONIC ("bal") && (i == 0)
2292               && (instruction->size == 2) && (insn->arg[i].rp != 14))
2293             goto next_insn;
2294 
2295           /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2296            * reg-pair, leads to undifined trap, so this should use
2297            * 20-bit disp of reg-pair.  */
2298           if (IS_INSN_MNEMONIC ("storb") && (instruction->size == 2)
2299               && (insn->arg[i].r == 15) && (insn->arg[i + 1].type == arg_crp))
2300             goto next_insn;
2301 
2302           /* Only check range - don't update the constant's value, since the
2303              current instruction may not be the last we try to match.
2304              The constant's value will be updated later, right before printing
2305              it to the object file.  */
2306           if ((insn->arg[i].X_op == O_constant)
2307               && (op_error = check_range (&insn->arg[i].constant, cur_size[i],
2308                                           cur_flags[i], 0)))
2309             {
2310               if (invalid_const == -1)
2311                 {
2312                   invalid_const = i + 1;
2313                   const_err = op_error;
2314                 }
2315               goto next_insn;
2316             }
2317           /* For symbols, we make sure the relocation size (which was already
2318              determined) is sufficient.  */
2319           else if ((insn->arg[i].X_op == O_symbol)
2320                    && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
2321                        > cur_size[i]))
2322                   goto next_insn;
2323         }
2324       found_const_within_range = 1;
2325 
2326       /* If we got till here -> Full match is found.  */
2327       match = 1;
2328       break;
2329 
2330 /* Try again with next instruction.  */
2331 next_insn:
2332       instruction++;
2333     }
2334 
2335   if (!match)
2336     {
2337       /* We haven't found a match - instruction can't be assembled.  */
2338       if (!found_same_number_of_operands)
2339         as_bad (_("Incorrect number of operands"));
2340       else if (!found_same_argument_types)
2341         as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
2342       else if (!found_const_within_range)
2343         {
2344           switch (const_err)
2345             {
2346             case OP_OUT_OF_RANGE:
2347               as_bad (_("Operand out of range (arg %d)"), invalid_const);
2348               break;
2349             case OP_NOT_EVEN:
2350               as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
2351               break;
2352             default:
2353               as_bad (_("Illegal operand (arg %d)"), invalid_const);
2354               break;
2355             }
2356         }
2357 
2358        return 0;
2359     }
2360   else
2361     /* Full match - print the encoding to output file.  */
2362     {
2363       /* Make further checkings (such that couldn't be made earlier).
2364          Warn the user if necessary.  */
2365       warn_if_needed (insn);
2366 
2367       /* Check whether we need to adjust the instruction pointer.  */
2368       if (adjust_if_needed (insn))
2369         /* If instruction pointer was adjusted, we need to update
2370            the size of the current template operands.  */
2371         GET_CURRENT_SIZE;
2372 
2373       for (i = 0; i < insn->nargs; i++)
2374         {
2375           int j = instruction->flags & REVERSE_MATCH ?
2376                   i == 0 ? 1 :
2377                   i == 1 ? 0 : i :
2378                   i;
2379 
2380           /* This time, update constant value before printing it.  */
2381             if ((insn->arg[j].X_op == O_constant)
2382                && (check_range (&insn->arg[j].constant, cur_size[j],
2383                                 cur_flags[j], 1) != OP_LEGAL))
2384               as_fatal (_("Illegal operand (arg %d)"), j+1);
2385         }
2386 
2387       /* First, copy the instruction's opcode.  */
2388       output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2389 
2390       for (i = 0; i < insn->nargs; i++)
2391         {
2392          /* For BAL (ra),disp17 instuction only. And also set the
2393             DISP24a relocation type.  */
2394          if (IS_INSN_MNEMONIC ("bal") && (instruction->size == 2) && i == 0)
2395            {
2396              insn->rtype = BFD_RELOC_CR16_DISP24a;
2397              continue;
2398            }
2399           cur_arg_num = i;
2400           print_operand (cur_size[i], instruction->operands[i].shift,
2401                          &insn->arg[i]);
2402         }
2403     }
2404 
2405   return 1;
2406 }
2407 
2408 /* Print the instruction.
2409    Handle also cases where the instruction is relaxable/relocatable.  */
2410 
2411 static void
2412 print_insn (ins *insn)
2413 {
2414   unsigned int i, j, insn_size;
2415   char *this_frag;
2416   unsigned short words[4];
2417   int addr_mod;
2418 
2419   /* Arrange the insn encodings in a WORD size array.  */
2420   for (i = 0, j = 0; i < 2; i++)
2421     {
2422       words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
2423       words[j++] = output_opcode[i] & 0xFFFF;
2424     }
2425 
2426     /* Handle relocation.  */
2427     if ((instruction->flags & RELAXABLE) && relocatable)
2428       {
2429         int relax_subtype;
2430         /* Write the maximal instruction size supported.  */
2431         insn_size = INSN_MAX_SIZE;
2432 
2433         if (IS_INSN_TYPE (BRANCH_INS))
2434           {
2435             switch (insn->rtype)
2436               {
2437               case BFD_RELOC_CR16_DISP24:
2438                 relax_subtype = 2;
2439                 break;
2440               case BFD_RELOC_CR16_DISP16:
2441                 relax_subtype = 1;
2442                 break;
2443               default:
2444                 relax_subtype = 0;
2445                 break;
2446               }
2447           }
2448         else
2449           abort ();
2450 
2451         this_frag = frag_var (rs_machine_dependent, insn_size *2,
2452                               4, relax_subtype,
2453                               insn->exp.X_add_symbol,
2454                               0,
2455                               0);
2456       }
2457     else
2458       {
2459         insn_size = instruction->size;
2460         this_frag = frag_more (insn_size * 2);
2461 
2462         if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
2463           {
2464              reloc_howto_type *reloc_howto;
2465              int size;
2466 
2467              reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
2468 
2469              if (!reloc_howto)
2470                abort ();
2471 
2472              size = bfd_get_reloc_size (reloc_howto);
2473 
2474              if (size < 1 || size > 4)
2475                abort ();
2476 
2477              fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
2478                           size, &insn->exp, reloc_howto->pc_relative,
2479                           insn->rtype);
2480           }
2481       }
2482 
2483   /* Verify a 2-byte code alignment.  */
2484   addr_mod = frag_now_fix () & 1;
2485   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
2486     as_bad (_("instruction address is not a multiple of 2"));
2487   frag_now->insn_addr = addr_mod;
2488   frag_now->has_code = 1;
2489 
2490   /* Write the instruction encoding to frag.  */
2491   for (i = 0; i < insn_size; i++)
2492     {
2493       md_number_to_chars (this_frag, (valueT) words[i], 2);
2494       this_frag += 2;
2495     }
2496 }
2497 
2498 /* This is the guts of the machine-dependent assembler.  OP points to a
2499    machine dependent instruction.  This function is supposed to emit
2500    the frags/bytes it assembles to.  */
2501 
2502 void
2503 md_assemble (char *op)
2504 {
2505   ins cr16_ins;
2506   char *param, param1[32];
2507   char c;
2508 
2509   /* Reset global variables for a new instruction.  */
2510   reset_vars (op);
2511 
2512   /* Strip the mnemonic.  */
2513   for (param = op; *param != 0 && !ISSPACE (*param); param++)
2514     ;
2515   c = *param;
2516   *param++ = '\0';
2517 
2518   /* bCC instuctions and adjust the mnemonic by adding extra white spaces.  */
2519   if (is_bcc_insn (op))
2520     {
2521       strcpy (param1, get_b_cc (op));
2522       op = "b";
2523       strcat (param1,",");
2524       strcat (param1, param);
2525       param = (char *) &param1;
2526     }
2527 
2528   /* Checking the cinv options and adjust the mnemonic by removing the
2529      extra white spaces.  */
2530   if (streq ("cinv", op))
2531     {
2532      /* Validate the cinv options.  */
2533       check_cinv_options (param);
2534       strcat (op, param);
2535     }
2536 
2537   /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2538      lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2539      as CR16 core doesn't support lsh[b/w] right shift operaions.  */
2540   if ((streq ("lshb", op) || streq ("lshw", op) || streq ("lshd", op))
2541       && (param [0] == '$'))
2542     {
2543       strcpy (param1, param);
2544       /* Find the instruction.  */
2545       instruction = (const inst *) hash_find (cr16_inst_hash, op);
2546        parse_operands (&cr16_ins, param1);
2547       if (((&cr16_ins)->arg[0].type == arg_ic)
2548           && ((&cr16_ins)->arg[0].constant >= 0))
2549         {
2550            if (streq ("lshb", op))
2551              op = "ashub";
2552            else if (streq ("lshd", op))
2553              op = "ashud";
2554            else
2555              op = "ashuw";
2556         }
2557     }
2558 
2559   /* Find the instruction.  */
2560   instruction = (const inst *) hash_find (cr16_inst_hash, op);
2561   if (instruction == NULL)
2562     {
2563       as_bad (_("Unknown opcode: `%s'"), op);
2564       return;
2565     }
2566 
2567   /* Tie dwarf2 debug info to the address at the start of the insn.  */
2568   dwarf2_emit_insn (0);
2569 
2570   /* Parse the instruction's operands.  */
2571   parse_insn (&cr16_ins, param);
2572 
2573   /* Assemble the instruction - return upon failure.  */
2574   if (assemble_insn (op, &cr16_ins) == 0)
2575     return;
2576 
2577   /* Print the instruction.  */
2578   print_insn (&cr16_ins);
2579 }
2580