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