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