Upload Tizen:Base source
[external/binutils.git] / gas / config / tc-cr16.c
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 (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 processort 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))) 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 }