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.  */
47typedef 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  }
53op_err;
54
55/* Opcode mnemonics hash table.  */
56static struct hash_control *cr16_inst_hash;
57/* CR16 registers hash table.  */
58static struct hash_control *reg_hash;
59/* CR16 register pair hash table.  */
60static struct hash_control *regp_hash;
61/* CR16 processor registers hash table.  */
62static struct hash_control *preg_hash;
63/* CR16 processor registers 32 bit hash table.  */
64static struct hash_control *pregp_hash;
65/* Current instruction we're assembling.  */
66const inst *instruction;
67
68
69static int code_label = 0;
70
71/* Global variables.  */
72
73/* Array to hold an instruction encoding.  */
74long output_opcode[2];
75
76/* Nonzero means a relocatable symbol.  */
77int relocatable;
78
79/* A copy of the original instruction (used in error messages).  */
80char ins_parse[MAX_INST_LEN];
81
82/* The current processed argument number.  */
83int cur_arg_num;
84
85/* Generic assembler global variables which must be defined by all targets.  */
86
87/* Characters which always start a comment.  */
88const char comment_chars[] = "#";
89
90/* Characters which start a comment at the beginning of a line.  */
91const char line_comment_chars[] = "#";
92
93/* This array holds machine specific line separator characters.  */
94const char line_separator_chars[] = ";";
95
96/* Chars that can be used to separate mant from exp in floating point nums.  */
97const char EXP_CHARS[] = "eE";
98
99/* Chars that mean this number is a floating point constant as in 0f12.456  */
100const char FLT_CHARS[] = "f'";
101
102/* Target-specific multicharacter options, not const-declared at usage.  */
103const char *md_shortopts = "";
104struct option md_longopts[] =
105{
106  {NULL, no_argument, NULL, 0}
107};
108size_t md_longopts_size = sizeof (md_longopts);
109
110static void
111l_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
246const 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.  */
255const 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
265static int
266get_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
276static argtype
277get_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
287static int
288get_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
298static int
299get_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
312static reg
313get_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
326static reg
327get_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
351static reg
352get_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
366static reg
367get_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
387static preg
388get_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
402static preg
403get_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
418valueT
419md_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
429void
430md_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
447static void
448reset_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
478int
479cr16_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
491void
492cr16_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
516arelent *
517tc_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
586int
587md_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
611void
612md_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
631int
632md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
633{
634  return 0;
635}
636
637/* Machine-dependent usage-output.  */
638
639void
640md_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
650char *
651md_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
705void
706md_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
747long
748md_pcrel_from (fixS *fixp)
749{
750  return fixp->fx_frag->fr_address + fixp->fx_where;
751}
752
753static void
754initialise_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
778void
779md_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
827static void
828process_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
1004static int
1005getreg_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
1056static void
1057set_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
1185static void
1186parse_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
1288static void
1289parse_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
1366static int
1367gettrap (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
1389static void
1390parse_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.  */
1419static char *
1420get_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.  */
1438static int
1439is_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
1450static int
1451check_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
1478static int
1479getregp_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
1517static int
1518getidxregp_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.  */
1564static int
1565getprocreg_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.  */
1602static int
1603getprocregp_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
1657static long
1658getconstant (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
1670static void
1671print_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
1781static void
1782print_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
1883static int
1884get_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
1898static op_err
1899check_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
1993static void
1994warn_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
2075static int
2076adjust_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
2103static int
2104assemble_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.  */
2229next_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
2309static void
2310print_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
2367void
2368md_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