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