tc-cr16.c revision 1.1.1.2
1/* tc-cr16.c -- Assembler code for the CR16 CPU core.
2   Copyright 2007, 2008, 2009, 2010, 2011
3   Free Software Foundation, Inc.
4
5   Contributed by M R Swami Reddy <MR.Swami.Reddy@nsc.com>
6
7   This file is part of GAS, the GNU Assembler.
8
9   GAS is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 3, or (at your option)
12   any later version.
13
14   GAS is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with GAS; see the file COPYING.  If not, write to the
21   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
22   MA 02110-1301, USA.  */
23
24#include "as.h"
25#include "safe-ctype.h"
26#include "dwarf2dbg.h"
27#include "opcode/cr16.h"
28#include "elf/cr16.h"
29
30
31/* Word is considered here as a 16-bit unsigned short int.  */
32#define WORD_SHIFT  16
33
34/* Register is 2-byte size.  */
35#define REG_SIZE   2
36
37/* Maximum size of a single instruction (in words).  */
38#define INSN_MAX_SIZE   3
39
40/* Maximum bits which may be set in a `mask16' operand.  */
41#define MAX_REGS_IN_MASK16  8
42
43/* Assign a number NUM, shifted by SHIFT bytes, into a location
44   pointed by index BYTE of array 'output_opcode'.  */
45#define CR16_PRINT(BYTE, NUM, SHIFT)   output_opcode[BYTE] |= (NUM << SHIFT)
46
47/* Operand errors.  */
48typedef enum
49  {
50    OP_LEGAL = 0,       /* Legal operand.  */
51    OP_OUT_OF_RANGE,    /* Operand not within permitted range.  */
52    OP_NOT_EVEN         /* Operand is Odd number, should be even.  */
53  }
54op_err;
55
56/* Opcode mnemonics hash table.  */
57static struct hash_control *cr16_inst_hash;
58/* CR16 registers hash table.  */
59static struct hash_control *reg_hash;
60/* CR16 register pair hash table.  */
61static struct hash_control *regp_hash;
62/* CR16 processor registers hash table.  */
63static struct hash_control *preg_hash;
64/* CR16 processor registers 32 bit hash table.  */
65static struct hash_control *pregp_hash;
66/* Current instruction we're assembling.  */
67const inst *instruction;
68
69
70static int code_label = 0;
71
72/* Global variables.  */
73
74/* Array to hold an instruction encoding.  */
75long output_opcode[2];
76
77/* Nonzero means a relocatable symbol.  */
78int relocatable;
79
80/* A copy of the original instruction (used in error messages).  */
81char ins_parse[MAX_INST_LEN];
82
83/* The current processed argument number.  */
84int cur_arg_num;
85
86/* Generic assembler global variables which must be defined by all targets.  */
87
88/* Characters which always start a comment.  */
89const char comment_chars[] = "#";
90
91/* Characters which start a comment at the beginning of a line.  */
92const char line_comment_chars[] = "#";
93
94/* This array holds machine specific line separator characters.  */
95const char line_separator_chars[] = ";";
96
97/* Chars that can be used to separate mant from exp in floating point nums.  */
98const char EXP_CHARS[] = "eE";
99
100/* Chars that mean this number is a floating point constant as in 0f12.456  */
101const char FLT_CHARS[] = "f'";
102
103#ifdef OBJ_ELF
104/* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
105symbolS * GOT_symbol;
106#endif
107
108/* Target-specific multicharacter options, not const-declared at usage.  */
109const char *md_shortopts = "";
110struct option md_longopts[] =
111{
112  {NULL, no_argument, NULL, 0}
113};
114size_t md_longopts_size = sizeof (md_longopts);
115
116static void
117l_cons (int nbytes)
118{
119  int c;
120  expressionS exp;
121
122#ifdef md_flush_pending_output
123    md_flush_pending_output ();
124#endif
125
126  if (is_it_end_of_statement ())
127    {
128      demand_empty_rest_of_line ();
129      return;
130    }
131
132#ifdef TC_ADDRESS_BYTES
133  if (nbytes == 0)
134    nbytes = TC_ADDRESS_BYTES ();
135#endif
136
137#ifdef md_cons_align
138  md_cons_align (nbytes);
139#endif
140
141  c = 0;
142  do
143    {
144      unsigned int bits_available = BITS_PER_CHAR * nbytes;
145      char *hold = input_line_pointer;
146
147      expression (&exp);
148
149      if (*input_line_pointer == ':')
150        {
151          /* Bitfields.  */
152          long value = 0;
153
154          for (;;)
155            {
156              unsigned long width;
157
158              if (*input_line_pointer != ':')
159                {
160                  input_line_pointer = hold;
161                  break;
162                }
163              if (exp.X_op == O_absent)
164                {
165                  as_warn (_("using a bit field width of zero"));
166                  exp.X_add_number = 0;
167                  exp.X_op = O_constant;
168                }
169
170              if (exp.X_op != O_constant)
171                {
172                  *input_line_pointer = '\0';
173                  as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
174                  *input_line_pointer = ':';
175                  demand_empty_rest_of_line ();
176                  return;
177                }
178
179              if ((width = exp.X_add_number) >
180                  (unsigned int)(BITS_PER_CHAR * nbytes))
181                {
182                  as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"), width, nbytes, (BITS_PER_CHAR * nbytes));
183                  width = BITS_PER_CHAR * nbytes;
184                }                   /* Too big.  */
185
186
187              if (width > bits_available)
188                {
189                  /* FIXME-SOMEDAY: backing up and reparsing is wasteful.  */
190                  input_line_pointer = hold;
191                  exp.X_add_number = value;
192                  break;
193                }
194
195              /* Skip ':'.  */
196              hold = ++input_line_pointer;
197
198              expression (&exp);
199              if (exp.X_op != O_constant)
200                {
201                  char cache = *input_line_pointer;
202
203                  *input_line_pointer = '\0';
204                  as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
205                  *input_line_pointer = cache;
206                  demand_empty_rest_of_line ();
207                  return;
208                }
209
210              value |= ((~(-1 << width) & exp.X_add_number)
211                        << ((BITS_PER_CHAR * nbytes) - bits_available));
212
213              if ((bits_available -= width) == 0
214                  || is_it_end_of_statement ()
215                  || *input_line_pointer != ',')
216                break;
217
218              hold = ++input_line_pointer;
219              expression (&exp);
220            }
221
222          exp.X_add_number = value;
223          exp.X_op = O_constant;
224          exp.X_unsigned = 1;
225        }
226
227      if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
228        code_label = 1;
229      emit_expr (&exp, (unsigned int) nbytes);
230      ++c;
231      if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
232        {
233          input_line_pointer +=3;
234          break;
235        }
236    }
237  while ((*input_line_pointer++ == ','));
238
239  /* Put terminator back into stream.  */
240  input_line_pointer--;
241
242  demand_empty_rest_of_line ();
243}
244
245/* This table describes all the machine specific pseudo-ops
246   the assembler has to support.  The fields are:
247   *** Pseudo-op name without dot.
248   *** Function to call to execute this pseudo-op.
249   *** Integer arg to pass to the function.  */
250
251const pseudo_typeS md_pseudo_table[] =
252{
253  /* In CR16 machine, align is in bytes (not a ptwo boundary).  */
254  {"align", s_align_bytes, 0},
255  {"long", l_cons,  4 },
256  {"4byte", l_cons, 4 },
257  {0, 0, 0}
258};
259
260/* CR16 relaxation table.  */
261const relax_typeS md_relax_table[] =
262{
263  /* bCC  */
264  {0x7f, -0x80, 2, 1},                  /*  8 */
265  {0xfffe, -0x10000, 4, 2},             /* 16 */
266  {0xfffffe, -0x1000000, 6, 0},         /* 24 */
267};
268
269/* Return the bit size for a given operand.  */
270
271static int
272get_opbits (operand_type op)
273{
274  if (op < MAX_OPRD)
275    return cr16_optab[op].bit_size;
276
277  return 0;
278}
279
280/* Return the argument type of a given operand.  */
281
282static argtype
283get_optype (operand_type op)
284{
285  if (op < MAX_OPRD)
286    return cr16_optab[op].arg_type;
287  else
288    return nullargs;
289}
290
291/* Return the flags of a given operand.  */
292
293static int
294get_opflags (operand_type op)
295{
296  if (op < MAX_OPRD)
297    return cr16_optab[op].flags;
298
299  return 0;
300}
301
302/* Get the cc code.  */
303
304static int
305get_cc (char *cc_name)
306{
307   unsigned int i;
308
309   for (i = 0; i < cr16_num_cc; i++)
310     if (strcmp (cc_name, cr16_b_cond_tab[i]) == 0)
311       return i;
312
313   return -1;
314}
315
316/* Get the core processor register 'reg_name'.  */
317
318static reg
319get_register (char *reg_name)
320{
321  const reg_entry *rreg;
322
323  rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
324
325  if (rreg != NULL)
326    return rreg->value.reg_val;
327
328  return nullregister;
329}
330/* Get the core processor register-pair 'reg_name'.  */
331
332static reg
333get_register_pair (char *reg_name)
334{
335  const reg_entry *rreg;
336  char tmp_rp[16]="\0";
337
338  /* Add '(' and ')' to the reg pair, if its not present.  */
339  if (reg_name[0] != '(')
340    {
341      tmp_rp[0] = '(';
342      strcat (tmp_rp, reg_name);
343      strcat (tmp_rp,")");
344      rreg = (const reg_entry *) hash_find (regp_hash, tmp_rp);
345    }
346  else
347    rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
348
349  if (rreg != NULL)
350    return rreg->value.reg_val;
351
352  return nullregister;
353}
354
355/* Get the index register 'reg_name'.  */
356
357static reg
358get_index_register (char *reg_name)
359{
360  const reg_entry *rreg;
361
362  rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
363
364  if ((rreg != NULL)
365      && ((rreg->value.reg_val == 12) || (rreg->value.reg_val == 13)))
366    return rreg->value.reg_val;
367
368  return nullregister;
369}
370/* Get the core processor index register-pair 'reg_name'.  */
371
372static reg
373get_index_register_pair (char *reg_name)
374{
375  const reg_entry *rreg;
376
377  rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
378
379  if (rreg != NULL)
380    {
381      if ((rreg->value.reg_val != 1) || (rreg->value.reg_val != 7)
382          || (rreg->value.reg_val != 9) || (rreg->value.reg_val > 10))
383        return rreg->value.reg_val;
384
385      as_bad (_("Unknown register pair - index relative mode: `%d'"), rreg->value.reg_val);
386    }
387
388  return nullregister;
389}
390
391/* Get the processor register 'preg_name'.  */
392
393static preg
394get_pregister (char *preg_name)
395{
396  const reg_entry *prreg;
397
398  prreg = (const reg_entry *) hash_find (preg_hash, preg_name);
399
400  if (prreg != NULL)
401    return prreg->value.preg_val;
402
403  return nullpregister;
404}
405
406/* Get the processor register 'preg_name 32 bit'.  */
407
408static preg
409get_pregisterp (char *preg_name)
410{
411  const reg_entry *prreg;
412
413  prreg = (const reg_entry *) hash_find (pregp_hash, preg_name);
414
415  if (prreg != NULL)
416    return prreg->value.preg_val;
417
418  return nullpregister;
419}
420
421
422/* Round up a section size to the appropriate boundary.  */
423
424valueT
425md_section_align (segT seg, valueT val)
426{
427  /* Round .text section to a multiple of 2.  */
428  if (seg == text_section)
429    return (val + 1) & ~1;
430  return val;
431}
432
433/* Parse an operand that is machine-specific (remove '*').  */
434
435void
436md_operand (expressionS * exp)
437{
438  char c = *input_line_pointer;
439
440  switch (c)
441    {
442    case '*':
443      input_line_pointer++;
444      expression (exp);
445      break;
446    default:
447      break;
448    }
449}
450
451/* Reset global variables before parsing a new instruction.  */
452
453static void
454reset_vars (char *op)
455{
456  cur_arg_num = relocatable = 0;
457  memset (& output_opcode, '\0', sizeof (output_opcode));
458
459  /* Save a copy of the original OP (used in error messages).  */
460  strncpy (ins_parse, op, sizeof ins_parse - 1);
461  ins_parse [sizeof ins_parse - 1] = 0;
462}
463
464/* This macro decides whether a particular reloc is an entry in a
465   switch table.  It is used when relaxing, because the linker needs
466   to know about all such entries so that it can adjust them if
467   necessary.  */
468
469#define SWITCH_TABLE(fix)                                  \
470  (   (fix)->fx_addsy != NULL                              \
471   && (fix)->fx_subsy != NULL                              \
472   && S_GET_SEGMENT ((fix)->fx_addsy) ==                   \
473      S_GET_SEGMENT ((fix)->fx_subsy)                      \
474   && S_GET_SEGMENT (fix->fx_addsy) != undefined_section   \
475   && (   (fix)->fx_r_type == BFD_RELOC_CR16_NUM8          \
476       || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16         \
477       || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32         \
478       || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
479
480/* See whether we need to force a relocation into the output file.
481   This is used to force out switch and PC relative relocations when
482   relaxing.  */
483
484int
485cr16_force_relocation (fixS *fix)
486{
487  if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
488    return 1;
489
490  return 0;
491}
492
493/* Record a fixup for a cons expression.  */
494
495void
496cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp)
497{
498  int rtype = BFD_RELOC_UNUSED;
499
500  switch (len)
501    {
502    default: rtype = BFD_RELOC_NONE; break;
503    case 1: rtype = BFD_RELOC_CR16_NUM8 ; break;
504    case 2: rtype = BFD_RELOC_CR16_NUM16; break;
505    case 4:
506      if (code_label)
507        {
508          rtype = BFD_RELOC_CR16_NUM32a;
509          code_label = 0;
510        }
511      else
512        rtype = BFD_RELOC_CR16_NUM32;
513      break;
514    }
515
516  fix_new_exp (frag, offset, len, exp, 0, rtype);
517}
518
519/* Generate a relocation entry for a fixup.  */
520
521arelent *
522tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
523{
524  arelent * reloc;
525  bfd_reloc_code_real_type code;
526
527  /* If symbols are local and resolved, then no relocation needed.  */
528  if ( ((fixP->fx_addsy)
529        && (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
530       || ((fixP->fx_subsy)
531	   && (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)))
532     return NULL;
533
534  reloc = xmalloc (sizeof (arelent));
535  reloc->sym_ptr_ptr  = xmalloc (sizeof (asymbol *));
536  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
537  reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
538  reloc->addend = fixP->fx_offset;
539
540  if (fixP->fx_subsy != NULL)
541    {
542      if (SWITCH_TABLE (fixP))
543        {
544          /* Keep the current difference in the addend.  */
545          reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
546                           - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
547
548          switch (fixP->fx_r_type)
549            {
550            case BFD_RELOC_CR16_NUM8:
551              fixP->fx_r_type = BFD_RELOC_CR16_SWITCH8;
552              break;
553            case BFD_RELOC_CR16_NUM16:
554              fixP->fx_r_type = BFD_RELOC_CR16_SWITCH16;
555              break;
556            case BFD_RELOC_CR16_NUM32:
557              fixP->fx_r_type = BFD_RELOC_CR16_SWITCH32;
558              break;
559            case BFD_RELOC_CR16_NUM32a:
560              fixP->fx_r_type = BFD_RELOC_CR16_NUM32a;
561              break;
562            default:
563              abort ();
564              break;
565            }
566        }
567      else
568        {
569          /* We only resolve difference expressions in the same section.  */
570          as_bad_where (fixP->fx_file, fixP->fx_line,
571                        _("can't resolve `%s' {%s section} - `%s' {%s section}"),
572                        fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
573                        segment_name (fixP->fx_addsy
574                                      ? S_GET_SEGMENT (fixP->fx_addsy)
575                                      : absolute_section),
576                        S_GET_NAME (fixP->fx_subsy),
577                        segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
578        }
579    }
580#ifdef OBJ_ELF
581      if ((fixP->fx_r_type == BFD_RELOC_CR16_GOT_REGREL20)
582           && GOT_symbol
583	   && fixP->fx_addsy == GOT_symbol)
584	{
585	    code = BFD_RELOC_CR16_GOT_REGREL20;
586	    reloc->addend = fixP->fx_offset = reloc->address;
587	}
588      else if ((fixP->fx_r_type == BFD_RELOC_CR16_GOTC_REGREL20)
589           && GOT_symbol
590	   && fixP->fx_addsy == GOT_symbol)
591	{
592	    code = BFD_RELOC_CR16_GOTC_REGREL20;
593	    reloc->addend = fixP->fx_offset = reloc->address;
594	}
595#endif
596
597  gas_assert ((int) fixP->fx_r_type > 0);
598  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
599
600  if (reloc->howto == NULL)
601    {
602      as_bad_where (fixP->fx_file, fixP->fx_line,
603                    _("internal error: reloc %d (`%s') not supported by object file format"),
604                    fixP->fx_r_type,
605                    bfd_get_reloc_code_name (fixP->fx_r_type));
606      return NULL;
607    }
608  gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
609
610  return reloc;
611}
612
613/* Prepare machine-dependent frags for relaxation.  */
614
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, 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
723char *
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  break;
1129
1130  switch (rreg->type)
1131    {
1132    case CR16_R_REGTYPE:
1133      if (! is_procreg)
1134        return rreg->image;
1135      else
1136        IMAGE_ERR;
1137
1138    case CR16_P_REGTYPE:
1139      return rreg->image;
1140      break;
1141
1142    default:
1143      IMAGE_ERR;
1144    }
1145
1146  return 0;
1147}
1148
1149/* Parsing different types of operands
1150   -> constants             Immediate/Absolute/Relative numbers
1151   -> Labels                Relocatable symbols
1152   -> (reg pair base)       Register pair base
1153   -> (rbase)               Register base
1154   -> disp(rbase)           Register relative
1155   -> [rinx]disp(reg pair)  Register index with reg pair mode
1156   -> disp(rbase,ridx,scl)  Register index mode.  */
1157
1158static void
1159set_operand (char *operand, ins * cr16_ins)
1160{
1161  char *operandS; /* Pointer to start of sub-opearand.  */
1162  char *operandE; /* Pointer to end of sub-opearand.  */
1163
1164  argument *cur_arg = &cr16_ins->arg[cur_arg_num]; /* Current argument.  */
1165
1166  /* Initialize pointers.  */
1167  operandS = operandE = operand;
1168
1169  switch (cur_arg->type)
1170    {
1171    case arg_ic:    /* Case $0x18.  */
1172      operandS++;
1173    case arg_c:     /* Case 0x18.  */
1174      /* Set constant.  */
1175      process_label_constant (operandS, cr16_ins);
1176
1177      if (cur_arg->type != arg_ic)
1178        cur_arg->type = arg_c;
1179      break;
1180
1181    case arg_icr:   /* Case $0x18(r1).  */
1182      operandS++;
1183    case arg_cr:    /* Case 0x18(r1).   */
1184      /* Set displacement constant.  */
1185      while (*operandE != '(')
1186        operandE++;
1187      *operandE = '\0';
1188      process_label_constant (operandS, cr16_ins);
1189      operandS = operandE;
1190    case arg_rbase: /* Case (r1) or (r1,r0).  */
1191      operandS++;
1192      /* Set register base.  */
1193      while (*operandE != ')')
1194        operandE++;
1195      *operandE = '\0';
1196      if ((cur_arg->r = get_register (operandS)) == nullregister)
1197         as_bad (_("Illegal register `%s' in Instruction `%s'"),
1198              operandS, ins_parse);
1199
1200      /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1201      if ((cur_arg->type != arg_rbase)
1202          && ((getreg_image (cur_arg->r) == 12)
1203              || (getreg_image (cur_arg->r) == 13)
1204              || (getreg_image (cur_arg->r) == 14)
1205              || (getreg_image (cur_arg->r) == 15)))
1206         {
1207           cur_arg->type = arg_crp;
1208           cur_arg->rp = cur_arg->r;
1209         }
1210      break;
1211
1212    case arg_crp:    /* Case 0x18(r1,r0).   */
1213      /* Set displacement constant.  */
1214      while (*operandE != '(')
1215        operandE++;
1216      *operandE = '\0';
1217      process_label_constant (operandS, cr16_ins);
1218      operandS = operandE;
1219      operandS++;
1220      /* Set register pair base.  */
1221      while (*operandE != ')')
1222        operandE++;
1223      *operandE = '\0';
1224      if ((cur_arg->rp = get_register_pair (operandS)) == nullregister)
1225         as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1226              operandS, ins_parse);
1227      break;
1228
1229    case arg_idxr:
1230      /* Set register pair base.  */
1231      if ((strchr (operandS,'(') != NULL))
1232        {
1233         while ((*operandE != '(') && (! ISSPACE (*operandE)))
1234           operandE++;
1235         if ((cur_arg->rp = get_index_register_pair (operandE)) == nullregister)
1236              as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1237                            operandS, ins_parse);
1238         *operandE++ = '\0';
1239         cur_arg->type = arg_idxrp;
1240        }
1241      else
1242        cur_arg->rp = -1;
1243
1244       operandE = operandS;
1245      /* Set displacement constant.  */
1246      while (*operandE != ']')
1247        operandE++;
1248      process_label_constant (++operandE, cr16_ins);
1249      *operandE++ = '\0';
1250      operandE = operandS;
1251
1252      /* Set index register .  */
1253      operandS = strchr (operandE,'[');
1254      if (operandS != NULL)
1255        { /* Eliminate '[', detach from rest of operand.  */
1256          *operandS++ = '\0';
1257
1258          operandE = strchr (operandS, ']');
1259
1260          if (operandE == NULL)
1261            as_bad (_("unmatched '['"));
1262          else
1263            { /* Eliminate ']' and make sure it was the last thing
1264                 in the string.  */
1265              *operandE = '\0';
1266              if (*(operandE + 1) != '\0')
1267                as_bad (_("garbage after index spec ignored"));
1268            }
1269        }
1270
1271      if ((cur_arg->i_r = get_index_register (operandS)) == nullregister)
1272        as_bad (_("Illegal register `%s' in Instruction `%s'"),
1273                operandS, ins_parse);
1274      *operandE = '\0';
1275      *operandS = '\0';
1276      break;
1277
1278    default:
1279      break;
1280    }
1281}
1282
1283/* Parse a single operand.
1284   operand - Current operand to parse.
1285   cr16_ins - Current assembled instruction.  */
1286
1287static void
1288parse_operand (char *operand, ins * cr16_ins)
1289{
1290  int ret_val;
1291  argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument.  */
1292
1293  /* Initialize the type to NULL before parsing.  */
1294  cur_arg->type = nullargs;
1295
1296  /* Check whether this is a condition code .  */
1297  if ((IS_INSN_MNEMONIC ("b")) && ((ret_val = get_cc (operand)) != -1))
1298    {
1299      cur_arg->type = arg_cc;
1300      cur_arg->cc = ret_val;
1301      cur_arg->X_op = O_register;
1302      return;
1303    }
1304
1305  /* Check whether this is a general processor register.  */
1306  if ((ret_val = get_register (operand)) != nullregister)
1307    {
1308      cur_arg->type = arg_r;
1309      cur_arg->r = ret_val;
1310      cur_arg->X_op = 0;
1311      return;
1312    }
1313
1314  /* Check whether this is a general processor register pair.  */
1315  if ((operand[0] == '(')
1316      && ((ret_val = get_register_pair (operand)) != nullregister))
1317    {
1318      cur_arg->type = arg_rp;
1319      cur_arg->rp = ret_val;
1320      cur_arg->X_op = O_register;
1321      return;
1322    }
1323
1324  /* Check whether the operand is a processor register.
1325     For "lprd" and "sprd" instruction, only 32 bit
1326     processor registers used.  */
1327  if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1328      && ((ret_val = get_pregister (operand)) != nullpregister))
1329    {
1330      cur_arg->type = arg_pr;
1331      cur_arg->pr = ret_val;
1332      cur_arg->X_op = O_register;
1333      return;
1334    }
1335
1336  /* Check whether this is a processor register - 32 bit.  */
1337  if ((ret_val = get_pregisterp (operand)) != nullpregister)
1338    {
1339      cur_arg->type = arg_prp;
1340      cur_arg->prp = ret_val;
1341      cur_arg->X_op = O_register;
1342      return;
1343    }
1344
1345  /* Deal with special characters.  */
1346  switch (operand[0])
1347    {
1348    case '$':
1349      if (strchr (operand, '(') != NULL)
1350        cur_arg->type = arg_icr;
1351      else
1352        cur_arg->type = arg_ic;
1353      goto set_params;
1354      break;
1355
1356    case '(':
1357      cur_arg->type = arg_rbase;
1358      goto set_params;
1359      break;
1360
1361    case '[':
1362      cur_arg->type = arg_idxr;
1363      goto set_params;
1364      break;
1365
1366    default:
1367      break;
1368    }
1369
1370  if (strchr (operand, '(') != NULL)
1371    {
1372      if (strchr (operand, ',') != NULL
1373          && (strchr (operand, ',') > strchr (operand, '(')))
1374        cur_arg->type = arg_crp;
1375      else
1376        cur_arg->type = arg_cr;
1377    }
1378  else
1379    cur_arg->type = arg_c;
1380
1381/* Parse an operand according to its type.  */
1382 set_params:
1383  cur_arg->constant = 0;
1384  set_operand (operand, cr16_ins);
1385}
1386
1387/* Parse the various operands. Each operand is then analyzed to fillup
1388   the fields in the cr16_ins data structure.  */
1389
1390static void
1391parse_operands (ins * cr16_ins, char *operands)
1392{
1393  char *operandS;            /* Operands string.  */
1394  char *operandH, *operandT; /* Single operand head/tail pointers.  */
1395  int allocated = 0;         /* Indicates a new operands string was allocated.*/
1396  char *operand[MAX_OPERANDS];/* Separating the operands.  */
1397  int op_num = 0;             /* Current operand number we are parsing.  */
1398  int bracket_flag = 0;       /* Indicates a bracket '(' was found.  */
1399  int sq_bracket_flag = 0;    /* Indicates a square bracket '[' was found.  */
1400
1401  /* Preprocess the list of registers, if necessary.  */
1402  operandS = operandH = operandT = operands;
1403
1404  while (*operandT != '\0')
1405    {
1406      if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
1407        {
1408          *operandT++ = '\0';
1409          operand[op_num++] = strdup (operandH);
1410          operandH = operandT;
1411          continue;
1412        }
1413
1414      if (*operandT == ' ')
1415        as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
1416
1417      if (*operandT == '(')
1418        bracket_flag = 1;
1419      else if (*operandT == '[')
1420        sq_bracket_flag = 1;
1421
1422      if (*operandT == ')')
1423        {
1424          if (bracket_flag)
1425            bracket_flag = 0;
1426          else
1427            as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1428        }
1429      else if (*operandT == ']')
1430        {
1431          if (sq_bracket_flag)
1432            sq_bracket_flag = 0;
1433          else
1434            as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1435        }
1436
1437      if (bracket_flag == 1 && *operandT == ')')
1438        bracket_flag = 0;
1439      else if (sq_bracket_flag == 1 && *operandT == ']')
1440        sq_bracket_flag = 0;
1441
1442      operandT++;
1443    }
1444
1445  /* Adding the last operand.  */
1446  operand[op_num++] = strdup (operandH);
1447  cr16_ins->nargs = op_num;
1448
1449  /* Verifying correct syntax of operands (all brackets should be closed).  */
1450  if (bracket_flag || sq_bracket_flag)
1451    as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1452
1453  /* Now we parse each operand separately.  */
1454  for (op_num = 0; op_num < cr16_ins->nargs; op_num++)
1455    {
1456      cur_arg_num = op_num;
1457      parse_operand (operand[op_num], cr16_ins);
1458      free (operand[op_num]);
1459    }
1460
1461  if (allocated)
1462    free (operandS);
1463}
1464
1465/* Get the trap index in dispatch table, given its name.
1466   This routine is used by assembling the 'excp' instruction.  */
1467
1468static int
1469gettrap (char *s)
1470{
1471  const trap_entry *trap;
1472
1473  for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1474    if (strcasecmp (trap->name, s) == 0)
1475      return trap->entry;
1476
1477  /* To make compatable with CR16 4.1 tools, the below 3-lines of
1478   * code added. Refer: Development Tracker item #123 */
1479  for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1480    if (trap->entry  == (unsigned int) atoi (s))
1481      return trap->entry;
1482
1483  as_bad (_("Unknown exception: `%s'"), s);
1484  return 0;
1485}
1486
1487/* Top level module where instruction parsing starts.
1488   cr16_ins - data structure holds some information.
1489   operands - holds the operands part of the whole instruction.  */
1490
1491static void
1492parse_insn (ins *insn, char *operands)
1493{
1494  int i;
1495
1496  /* Handle instructions with no operands.  */
1497  for (i = 0; cr16_no_op_insn[i] != NULL; i++)
1498  {
1499    if (streq (cr16_no_op_insn[i], instruction->mnemonic))
1500    {
1501      insn->nargs = 0;
1502      return;
1503    }
1504  }
1505
1506  /* Handle 'excp' instructions.  */
1507  if (IS_INSN_MNEMONIC ("excp"))
1508    {
1509      insn->nargs = 1;
1510      insn->arg[0].type = arg_ic;
1511      insn->arg[0].constant = gettrap (operands);
1512      insn->arg[0].X_op = O_constant;
1513      return;
1514    }
1515
1516  if (operands != NULL)
1517    parse_operands (insn, operands);
1518}
1519
1520/* bCC instruction requires special handling.  */
1521static char *
1522get_b_cc (char * op)
1523{
1524  unsigned int i;
1525  char op1[5];
1526
1527  for (i = 1; i < strlen (op); i++)
1528     op1[i-1] = op[i];
1529
1530  op1[i-1] = '\0';
1531
1532  for (i = 0; i < cr16_num_cc ; i++)
1533    if (streq (op1, cr16_b_cond_tab[i]))
1534      return (char *) cr16_b_cond_tab[i];
1535
1536   return NULL;
1537}
1538
1539/* bCC instruction requires special handling.  */
1540static int
1541is_bcc_insn (char * op)
1542{
1543  if (!(streq (op, "bal") || streq (op, "beq0b") || streq (op, "bnq0b")
1544        || streq (op, "beq0w") || streq (op, "bnq0w")))
1545    if ((op[0] == 'b') && (get_b_cc (op) != NULL))
1546      return 1;
1547  return 0;
1548}
1549
1550/* Cinv instruction requires special handling.  */
1551
1552static int
1553check_cinv_options (char * operand)
1554{
1555  char *p = operand;
1556  int i_used = 0, u_used = 0, d_used = 0;
1557
1558  while (*++p != ']')
1559    {
1560      if (*p == ',' || *p == ' ')
1561        continue;
1562
1563      else if (*p == 'i')
1564        i_used = 1;
1565      else if (*p == 'u')
1566        u_used = 1;
1567      else if (*p == 'd')
1568        d_used = 1;
1569      else
1570        as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
1571    }
1572
1573  return 0;
1574}
1575
1576/* Retrieve the opcode image of a given register pair.
1577   If the register is illegal for the current instruction,
1578   issue an error.  */
1579
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 processort register.
1664   If the register is illegal for the current instruction,
1665   issue an error.  */
1666static int
1667getprocreg_image (reg r)
1668{
1669  const reg_entry *rreg;
1670  char *reg_name;
1671
1672  /* Check whether the register is in registers table.  */
1673  if (r >= MAX_REG && r < MAX_PREG)
1674    rreg = &cr16_pregtab[r - MAX_REG];
1675  /* Register not found.  */
1676  else
1677    {
1678      as_bad (_("Unknown processor register : `%d'"), r);
1679      return 0;
1680    }
1681
1682  reg_name = rreg->name;
1683
1684/* Issue a error message when register  pair is illegal.  */
1685#define PROCREG_IMAGE_ERR \
1686  as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1687            reg_name, ins_parse);                                      \
1688  break;
1689
1690  switch (rreg->type)
1691    {
1692    case CR16_P_REGTYPE:
1693      return rreg->image;
1694    default:
1695      PROCREG_IMAGE_ERR;
1696    }
1697
1698  return 0;
1699}
1700
1701/* Retrieve the opcode image of a given processort register.
1702   If the register is illegal for the current instruction,
1703   issue an error.  */
1704static int
1705getprocregp_image (reg 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))) nbits = 20;
1801    case 24:
1802    case 22:
1803    case 20:
1804      /* mask the upper part of the constant, that is, the bits
1805         going to the lowest byte of output_opcode[0].
1806         The upper part of output_opcode[1] is always filled,
1807         therefore it is always masked with 0xFFFF.  */
1808      mask = (1 << (nbits - 16)) - 1;
1809      /* Divide the constant between two consecutive words :
1810         0        1         2          3
1811         +---------+---------+---------+---------+
1812         |         | X X X X | - X - X |         |
1813         +---------+---------+---------+---------+
1814         output_opcode[0]    output_opcode[1]     */
1815
1816      if ((instruction->size > 2) && (shift == WORD_SHIFT))
1817        {
1818          if (arg->type == arg_idxrp)
1819            {
1820              CR16_PRINT (0, ((constant >> WORD_SHIFT) & mask) << 8, 0);
1821              CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1822            }
1823          else
1824            {
1825              CR16_PRINT (0, (((((constant >> WORD_SHIFT) & mask) << 8) & 0x0f00) | ((((constant >> WORD_SHIFT) & mask) >> 4) & 0xf)),0);
1826              CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1827            }
1828        }
1829      else
1830        CR16_PRINT (0, constant, shift);
1831      break;
1832
1833    case 14:
1834      if (arg->type == arg_idxrp)
1835        {
1836          if (instruction->size == 2)
1837            {
1838              CR16_PRINT (0, ((constant)      & 0xf), shift);        /* 0-3 bits.  */
1839              CR16_PRINT (0, ((constant >> 4) & 0x3), (shift + 20)); /* 4-5 bits.  */
1840              CR16_PRINT (0, ((constant >> 6) & 0x3), (shift + 14)); /* 6-7 bits.  */
1841              CR16_PRINT (0, ((constant >> 8) & 0x3f), (shift + 8)); /* 8-13 bits.  */
1842            }
1843          else
1844            CR16_PRINT (0, constant, shift);
1845        }
1846      break;
1847
1848    case 16:
1849    case 12:
1850      /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1851         always filling the upper part of output_opcode[1]. If we mistakenly
1852         write it to output_opcode[0], the constant prefix (that is, 'match')
1853         will be overriden.
1854         0        1         2         3
1855         +---------+---------+---------+---------+
1856         | 'match' |         | X X X X |         |
1857         +---------+---------+---------+---------+
1858         output_opcode[0]    output_opcode[1]     */
1859
1860      if ((instruction->size > 2) && (shift == WORD_SHIFT))
1861        CR16_PRINT (1, constant, WORD_SHIFT);
1862      else
1863        CR16_PRINT (0, constant, shift);
1864      break;
1865
1866    case 8:
1867      CR16_PRINT (0, ((constant / 2) & 0xf), shift);
1868      CR16_PRINT (0, ((constant / 2) >> 4), (shift + 8));
1869      break;
1870
1871    default:
1872      CR16_PRINT (0, constant,  shift);
1873      break;
1874    }
1875}
1876
1877/* Print an operand to 'output_opcode', which later on will be
1878   printed to the object file:
1879   ARG holds the operand's type, size and value.
1880   SHIFT represents the printing location of operand.
1881   NBITS determines the size (in bits) of a constant operand.  */
1882
1883static void
1884print_operand (int nbits, int shift, argument *arg)
1885{
1886  switch (arg->type)
1887    {
1888    case arg_cc:
1889      CR16_PRINT (0, arg->cc, shift);
1890      break;
1891
1892    case arg_r:
1893      CR16_PRINT (0, getreg_image (arg->r), shift);
1894      break;
1895
1896    case arg_rp:
1897      CR16_PRINT (0, getregp_image (arg->rp), shift);
1898      break;
1899
1900    case arg_pr:
1901      CR16_PRINT (0, getprocreg_image (arg->pr), shift);
1902      break;
1903
1904    case arg_prp:
1905      CR16_PRINT (0, getprocregp_image (arg->prp), shift);
1906      break;
1907
1908    case arg_idxrp:
1909      /*    16      12      8    6      0
1910            +-----------------------------+
1911            | r_index | disp  | rp_base   |
1912            +-----------------------------+          */
1913
1914      if (instruction->size == 3)
1915        {
1916          CR16_PRINT (0, getidxregp_image (arg->rp), 0);
1917          if (getreg_image (arg->i_r) == 12)
1918            CR16_PRINT (0, 0, 3);
1919          else
1920            CR16_PRINT (0, 1, 3);
1921        }
1922      else
1923        {
1924          CR16_PRINT (0, getidxregp_image (arg->rp), 16);
1925          if (getreg_image (arg->i_r) == 12)
1926            CR16_PRINT (0, 0, 19);
1927          else
1928            CR16_PRINT (0, 1, 19);
1929        }
1930      print_constant (nbits, shift, arg);
1931      break;
1932
1933    case arg_idxr:
1934      if (getreg_image (arg->i_r) == 12)
1935        if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1936            || IS_INSN_MNEMONIC ("tbitb"))
1937          CR16_PRINT (0, 0, 23);
1938        else CR16_PRINT (0, 0, 24);
1939      else
1940        if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1941            || IS_INSN_MNEMONIC ("tbitb"))
1942          CR16_PRINT (0, 1, 23);
1943        else CR16_PRINT (0, 1, 24);
1944
1945      print_constant (nbits, shift, arg);
1946      break;
1947
1948    case arg_ic:
1949    case arg_c:
1950      print_constant (nbits, shift, arg);
1951      break;
1952
1953    case arg_rbase:
1954      CR16_PRINT (0, getreg_image (arg->r), shift);
1955      break;
1956
1957    case arg_cr:
1958      print_constant (nbits, shift , arg);
1959      /* Add the register argument to the output_opcode.  */
1960      CR16_PRINT (0, getreg_image (arg->r), (shift+16));
1961      break;
1962
1963    case arg_crp:
1964      print_constant (nbits, shift , arg);
1965      if (instruction->size > 1)
1966        CR16_PRINT (0, getregp_image (arg->rp), (shift + 16));
1967      else if (IS_INSN_TYPE (LD_STOR_INS) || (IS_INSN_TYPE (CSTBIT_INS)))
1968        {
1969          if (instruction->size == 2)
1970            CR16_PRINT (0, getregp_image (arg->rp), (shift - 8));
1971          else if (instruction->size == 1)
1972            CR16_PRINT (0, getregp_image (arg->rp), 16);
1973        }
1974      else
1975        CR16_PRINT (0, getregp_image (arg->rp), shift);
1976      break;
1977
1978    default:
1979      break;
1980    }
1981}
1982
1983/* Retrieve the number of operands for the current assembled instruction.  */
1984
1985static int
1986get_number_of_operands (void)
1987{
1988  int i;
1989
1990  for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
1991    ;
1992  return i;
1993}
1994
1995/* Verify that the number NUM can be represented in BITS bits (that is,
1996   within its permitted range), based on the instruction's FLAGS.
1997   If UPDATE is nonzero, update the value of NUM if necessary.
1998   Return OP_LEGAL upon success, actual error type upon failure.  */
1999
2000static op_err
2001check_range (long *num, int bits, int unsigned flags, int update)
2002{
2003  long min, max;
2004  int retval = OP_LEGAL;
2005  long value = *num;
2006
2007  if (bits == 0 && value > 0) return OP_OUT_OF_RANGE;
2008
2009  /* For hosts witah longs bigger than 32-bits make sure that the top
2010     bits of a 32-bit negative value read in by the parser are set,
2011     so that the correct comparisons are made.  */
2012  if (value & 0x80000000)
2013    value |= (-1L << 31);
2014
2015
2016  /* Verify operand value is even.  */
2017  if (flags & OP_EVEN)
2018    {
2019      if (value % 2)
2020        return OP_NOT_EVEN;
2021    }
2022
2023  if (flags & OP_DEC)
2024    {
2025      value -= 1;
2026      if (update)
2027        *num = value;
2028    }
2029
2030  if (flags & OP_SHIFT)
2031    {
2032      value >>= 1;
2033      if (update)
2034        *num = value;
2035    }
2036  else if (flags & OP_SHIFT_DEC)
2037    {
2038      value = (value >> 1) - 1;
2039      if (update)
2040        *num = value;
2041    }
2042
2043  if (flags & OP_ABS20)
2044    {
2045      if (value > 0xEFFFF)
2046        return OP_OUT_OF_RANGE;
2047    }
2048
2049  if (flags & OP_ESC)
2050    {
2051      if (value == 0xB || value == 0x9)
2052        return OP_OUT_OF_RANGE;
2053      else if (value == -1)
2054        {
2055          if (update)
2056            *num = 9;
2057          return retval;
2058        }
2059    }
2060
2061  if (flags & OP_ESC1)
2062    {
2063      if (value > 13)
2064        return OP_OUT_OF_RANGE;
2065    }
2066
2067   if (flags & OP_SIGNED)
2068     {
2069       max = (1 << (bits - 1)) - 1;
2070       min = - (1 << (bits - 1));
2071       if ((value > max) || (value < min))
2072         retval = OP_OUT_OF_RANGE;
2073     }
2074   else if (flags & OP_UNSIGNED)
2075     {
2076       max = ((((1 << (bits - 1)) - 1) << 1) | 1);
2077       min = 0;
2078       if (((unsigned long) value > (unsigned long) max)
2079            || ((unsigned long) value < (unsigned long) min))
2080         retval = OP_OUT_OF_RANGE;
2081     }
2082   else if (flags & OP_NEG)
2083     {
2084       max = - 1;
2085       min = - ((1 << (bits - 1)) - 1);
2086       if ((value > max) || (value < min))
2087         retval = OP_OUT_OF_RANGE;
2088     }
2089   return retval;
2090}
2091
2092/* Bunch of error checkings.
2093   The checks are made after a matching instruction was found.  */
2094
2095static void
2096warn_if_needed (ins *insn)
2097{
2098  /* If the post-increment address mode is used and the load/store
2099     source register is the same as rbase, the result of the
2100     instruction is undefined.  */
2101  if (IS_INSN_TYPE (LD_STOR_INS_INC))
2102    {
2103      /* Enough to verify that one of the arguments is a simple reg.  */
2104      if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
2105        if (insn->arg[0].r == insn->arg[1].r)
2106          as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn->arg[0].r);
2107    }
2108
2109  if (IS_INSN_MNEMONIC ("pop")
2110      || IS_INSN_MNEMONIC ("push")
2111      || IS_INSN_MNEMONIC ("popret"))
2112    {
2113      unsigned int count = insn->arg[0].constant, reg_val;
2114
2115      /* Check if count operand caused to save/retrive the RA twice
2116         to generate warning message.  */
2117     if (insn->nargs > 2)
2118       {
2119         reg_val = getreg_image (insn->arg[1].r);
2120
2121         if (   ((reg_val == 9) &&  (count > 7))
2122             || ((reg_val == 10) && (count > 6))
2123             || ((reg_val == 11) && (count > 5))
2124             || ((reg_val == 12) && (count > 4))
2125             || ((reg_val == 13) && (count > 2))
2126             || ((reg_val == 14) && (count > 0)))
2127           as_warn (_("RA register is saved twice."));
2128
2129         /* Check if the third operand is "RA" or "ra" */
2130         if (!(((insn->arg[2].r) == ra) || ((insn->arg[2].r) == RA)))
2131           as_bad (_("`%s' Illegal use of registers."), ins_parse);
2132       }
2133
2134      if (insn->nargs > 1)
2135       {
2136         reg_val = getreg_image (insn->arg[1].r);
2137
2138         /* If register is a register pair ie r12/r13/r14 in operand1, then
2139            the count constant should be validated.  */
2140         if (((reg_val == 11) && (count > 7))
2141             || ((reg_val == 12) && (count > 6))
2142             || ((reg_val == 13) && (count > 4))
2143             || ((reg_val == 14) && (count > 2))
2144             || ((reg_val == 15) && (count > 0)))
2145           as_bad (_("`%s' Illegal count-register combination."), ins_parse);
2146       }
2147     else
2148       {
2149         /* Check if the operand is "RA" or "ra" */
2150         if (!(((insn->arg[0].r) == ra) || ((insn->arg[0].r) == RA)))
2151           as_bad (_("`%s' Illegal use of register."), ins_parse);
2152       }
2153    }
2154
2155  /* Some instruction assume the stack pointer as rptr operand.
2156     Issue an error when the register to be loaded is also SP.  */
2157  if (instruction->flags & NO_SP)
2158    {
2159      if (getreg_image (insn->arg[1].r) == getreg_image (sp))
2160        as_bad (_("`%s' has undefined result"), ins_parse);
2161    }
2162
2163  /* If the rptr register is specified as one of the registers to be loaded,
2164     the final contents of rptr are undefined. Thus, we issue an error.  */
2165  if (instruction->flags & NO_RPTR)
2166    {
2167      if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
2168        as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2169                  getreg_image (insn->arg[0].r));
2170    }
2171}
2172
2173/* In some cases, we need to adjust the instruction pointer although a
2174   match was already found. Here, we gather all these cases.
2175   Returns 1 if instruction pointer was adjusted, otherwise 0.  */
2176
2177static int
2178adjust_if_needed (ins *insn ATTRIBUTE_UNUSED)
2179{
2180  int ret_value = 0;
2181
2182  if ((IS_INSN_TYPE (CSTBIT_INS)) || (IS_INSN_TYPE (LD_STOR_INS)))
2183    {
2184      if ((instruction->operands[0].op_type == abs24)
2185           && ((insn->arg[0].constant) > 0xF00000))
2186        {
2187          insn->arg[0].constant &= 0xFFFFF;
2188          instruction--;
2189          ret_value = 1;
2190        }
2191    }
2192
2193  return ret_value;
2194}
2195
2196/* Assemble a single instruction:
2197   INSN is already parsed (that is, all operand values and types are set).
2198   For instruction to be assembled, we need to find an appropriate template in
2199   the instruction table, meeting the following conditions:
2200    1: Has the same number of operands.
2201    2: Has the same operand types.
2202    3: Each operand size is sufficient to represent the instruction's values.
2203   Returns 1 upon success, 0 upon failure.  */
2204
2205static int
2206assemble_insn (char *mnemonic, ins *insn)
2207{
2208  /* Type of each operand in the current template.  */
2209  argtype cur_type[MAX_OPERANDS];
2210  /* Size (in bits) of each operand in the current template.  */
2211  unsigned int cur_size[MAX_OPERANDS];
2212  /* Flags of each operand in the current template.  */
2213  unsigned int cur_flags[MAX_OPERANDS];
2214  /* Instruction type to match.  */
2215  unsigned int ins_type;
2216  /* Boolean flag to mark whether a match was found.  */
2217  int match = 0;
2218  int i;
2219  /* Nonzero if an instruction with same number of operands was found.  */
2220  int found_same_number_of_operands = 0;
2221  /* Nonzero if an instruction with same argument types was found.  */
2222  int found_same_argument_types = 0;
2223  /* Nonzero if a constant was found within the required range.  */
2224  int found_const_within_range  = 0;
2225  /* Argument number of an operand with invalid type.  */
2226  int invalid_optype = -1;
2227  /* Argument number of an operand with invalid constant value.  */
2228  int invalid_const  = -1;
2229  /* Operand error (used for issuing various constant error messages).  */
2230  op_err op_error, const_err = OP_LEGAL;
2231
2232/* Retrieve data (based on FUNC) for each operand of a given instruction.  */
2233#define GET_CURRENT_DATA(FUNC, ARRAY)                           \
2234  for (i = 0; i < insn->nargs; i++)                             \
2235    ARRAY[i] = FUNC (instruction->operands[i].op_type)
2236
2237#define GET_CURRENT_TYPE    GET_CURRENT_DATA (get_optype, cur_type)
2238#define GET_CURRENT_SIZE    GET_CURRENT_DATA (get_opbits, cur_size)
2239#define GET_CURRENT_FLAGS   GET_CURRENT_DATA (get_opflags, cur_flags)
2240
2241  /* Instruction has no operands -> only copy the constant opcode.   */
2242  if (insn->nargs == 0)
2243    {
2244      output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2245      return 1;
2246    }
2247
2248  /* In some case, same mnemonic can appear with different instruction types.
2249     For example, 'storb' is supported with 3 different types :
2250     LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2251     We assume that when reaching this point, the instruction type was
2252     pre-determined. We need to make sure that the type stays the same
2253     during a search for matching instruction.  */
2254  ins_type = CR16_INS_TYPE (instruction->flags);
2255
2256  while (/* Check that match is still not found.  */
2257         match != 1
2258         /* Check we didn't get to end of table.  */
2259         && instruction->mnemonic != NULL
2260         /* Check that the actual mnemonic is still available.  */
2261         && IS_INSN_MNEMONIC (mnemonic)
2262         /* Check that the instruction type wasn't changed.  */
2263         && IS_INSN_TYPE (ins_type))
2264    {
2265      /* Check whether number of arguments is legal.  */
2266      if (get_number_of_operands () != insn->nargs)
2267        goto next_insn;
2268      found_same_number_of_operands = 1;
2269
2270      /* Initialize arrays with data of each operand in current template.  */
2271      GET_CURRENT_TYPE;
2272      GET_CURRENT_SIZE;
2273      GET_CURRENT_FLAGS;
2274
2275      /* Check for type compatibility.  */
2276      for (i = 0; i < insn->nargs; i++)
2277        {
2278          if (cur_type[i] != insn->arg[i].type)
2279            {
2280              if (invalid_optype == -1)
2281                invalid_optype = i + 1;
2282              goto next_insn;
2283            }
2284        }
2285      found_same_argument_types = 1;
2286
2287      for (i = 0; i < insn->nargs; i++)
2288        {
2289          /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2290             then goto next instruction.  */
2291          if (IS_INSN_MNEMONIC ("bal") && (i == 0)
2292              && (instruction->size == 2) && (insn->arg[i].rp != 14))
2293            goto next_insn;
2294
2295          /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2296           * reg-pair, leads to undifined trap, so this should use
2297           * 20-bit disp of reg-pair.  */
2298          if (IS_INSN_MNEMONIC ("storb") && (instruction->size == 2)
2299              && (insn->arg[i].r == 15) && (insn->arg[i + 1].type == arg_crp))
2300            goto next_insn;
2301
2302          /* Only check range - don't update the constant's value, since the
2303             current instruction may not be the last we try to match.
2304             The constant's value will be updated later, right before printing
2305             it to the object file.  */
2306          if ((insn->arg[i].X_op == O_constant)
2307              && (op_error = check_range (&insn->arg[i].constant, cur_size[i],
2308                                          cur_flags[i], 0)))
2309            {
2310              if (invalid_const == -1)
2311                {
2312                  invalid_const = i + 1;
2313                  const_err = op_error;
2314                }
2315              goto next_insn;
2316            }
2317          /* For symbols, we make sure the relocation size (which was already
2318             determined) is sufficient.  */
2319          else if ((insn->arg[i].X_op == O_symbol)
2320                   && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
2321                       > cur_size[i]))
2322                  goto next_insn;
2323        }
2324      found_const_within_range = 1;
2325
2326      /* If we got till here -> Full match is found.  */
2327      match = 1;
2328      break;
2329
2330/* Try again with next instruction.  */
2331next_insn:
2332      instruction++;
2333    }
2334
2335  if (!match)
2336    {
2337      /* We haven't found a match - instruction can't be assembled.  */
2338      if (!found_same_number_of_operands)
2339        as_bad (_("Incorrect number of operands"));
2340      else if (!found_same_argument_types)
2341        as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
2342      else if (!found_const_within_range)
2343        {
2344          switch (const_err)
2345            {
2346            case OP_OUT_OF_RANGE:
2347              as_bad (_("Operand out of range (arg %d)"), invalid_const);
2348              break;
2349            case OP_NOT_EVEN:
2350              as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
2351              break;
2352            default:
2353              as_bad (_("Illegal operand (arg %d)"), invalid_const);
2354              break;
2355            }
2356        }
2357
2358       return 0;
2359    }
2360  else
2361    /* Full match - print the encoding to output file.  */
2362    {
2363      /* Make further checkings (such that couldn't be made earlier).
2364         Warn the user if necessary.  */
2365      warn_if_needed (insn);
2366
2367      /* Check whether we need to adjust the instruction pointer.  */
2368      if (adjust_if_needed (insn))
2369        /* If instruction pointer was adjusted, we need to update
2370           the size of the current template operands.  */
2371        GET_CURRENT_SIZE;
2372
2373      for (i = 0; i < insn->nargs; i++)
2374        {
2375          int j = instruction->flags & REVERSE_MATCH ?
2376                  i == 0 ? 1 :
2377                  i == 1 ? 0 : i :
2378                  i;
2379
2380          /* This time, update constant value before printing it.  */
2381            if ((insn->arg[j].X_op == O_constant)
2382               && (check_range (&insn->arg[j].constant, cur_size[j],
2383                                cur_flags[j], 1) != OP_LEGAL))
2384              as_fatal (_("Illegal operand (arg %d)"), j+1);
2385        }
2386
2387      /* First, copy the instruction's opcode.  */
2388      output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2389
2390      for (i = 0; i < insn->nargs; i++)
2391        {
2392         /* For BAL (ra),disp17 instuction only. And also set the
2393            DISP24a relocation type.  */
2394         if (IS_INSN_MNEMONIC ("bal") && (instruction->size == 2) && i == 0)
2395           {
2396             insn->rtype = BFD_RELOC_CR16_DISP24a;
2397             continue;
2398           }
2399          cur_arg_num = i;
2400          print_operand (cur_size[i], instruction->operands[i].shift,
2401                         &insn->arg[i]);
2402        }
2403    }
2404
2405  return 1;
2406}
2407
2408/* Print the instruction.
2409   Handle also cases where the instruction is relaxable/relocatable.  */
2410
2411static void
2412print_insn (ins *insn)
2413{
2414  unsigned int i, j, insn_size;
2415  char *this_frag;
2416  unsigned short words[4];
2417  int addr_mod;
2418
2419  /* Arrange the insn encodings in a WORD size array.  */
2420  for (i = 0, j = 0; i < 2; i++)
2421    {
2422      words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
2423      words[j++] = output_opcode[i] & 0xFFFF;
2424    }
2425
2426    /* Handle relocation.  */
2427    if ((instruction->flags & RELAXABLE) && relocatable)
2428      {
2429        int relax_subtype;
2430        /* Write the maximal instruction size supported.  */
2431        insn_size = INSN_MAX_SIZE;
2432
2433        if (IS_INSN_TYPE (BRANCH_INS))
2434          {
2435            switch (insn->rtype)
2436              {
2437              case BFD_RELOC_CR16_DISP24:
2438                relax_subtype = 2;
2439                break;
2440              case BFD_RELOC_CR16_DISP16:
2441                relax_subtype = 1;
2442                break;
2443              default:
2444                relax_subtype = 0;
2445                break;
2446              }
2447          }
2448        else
2449          abort ();
2450
2451        this_frag = frag_var (rs_machine_dependent, insn_size *2,
2452                              4, relax_subtype,
2453                              insn->exp.X_add_symbol,
2454                              0,
2455                              0);
2456      }
2457    else
2458      {
2459        insn_size = instruction->size;
2460        this_frag = frag_more (insn_size * 2);
2461
2462        if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
2463          {
2464             reloc_howto_type *reloc_howto;
2465             int size;
2466
2467             reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
2468
2469             if (!reloc_howto)
2470               abort ();
2471
2472             size = bfd_get_reloc_size (reloc_howto);
2473
2474             if (size < 1 || size > 4)
2475               abort ();
2476
2477             fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
2478                          size, &insn->exp, reloc_howto->pc_relative,
2479                          insn->rtype);
2480          }
2481      }
2482
2483  /* Verify a 2-byte code alignment.  */
2484  addr_mod = frag_now_fix () & 1;
2485  if (frag_now->has_code && frag_now->insn_addr != addr_mod)
2486    as_bad (_("instruction address is not a multiple of 2"));
2487  frag_now->insn_addr = addr_mod;
2488  frag_now->has_code = 1;
2489
2490  /* Write the instruction encoding to frag.  */
2491  for (i = 0; i < insn_size; i++)
2492    {
2493      md_number_to_chars (this_frag, (valueT) words[i], 2);
2494      this_frag += 2;
2495    }
2496}
2497
2498/* This is the guts of the machine-dependent assembler.  OP points to a
2499   machine dependent instruction.  This function is supposed to emit
2500   the frags/bytes it assembles to.  */
2501
2502void
2503md_assemble (char *op)
2504{
2505  ins cr16_ins;
2506  char *param, param1[32];
2507  char c;
2508
2509  /* Reset global variables for a new instruction.  */
2510  reset_vars (op);
2511
2512  /* Strip the mnemonic.  */
2513  for (param = op; *param != 0 && !ISSPACE (*param); param++)
2514    ;
2515  c = *param;
2516  *param++ = '\0';
2517
2518  /* bCC instuctions and adjust the mnemonic by adding extra white spaces.  */
2519  if (is_bcc_insn (op))
2520    {
2521      strcpy (param1, get_b_cc (op));
2522      op = "b";
2523      strcat (param1,",");
2524      strcat (param1, param);
2525      param = (char *) &param1;
2526    }
2527
2528  /* Checking the cinv options and adjust the mnemonic by removing the
2529     extra white spaces.  */
2530  if (streq ("cinv", op))
2531    {
2532     /* Validate the cinv options.  */
2533      check_cinv_options (param);
2534      strcat (op, param);
2535    }
2536
2537  /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2538     lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2539     as CR16 core doesn't support lsh[b/w] right shift operaions.  */
2540  if ((streq ("lshb", op) || streq ("lshw", op) || streq ("lshd", op))
2541      && (param [0] == '$'))
2542    {
2543      strcpy (param1, param);
2544      /* Find the instruction.  */
2545      instruction = (const inst *) hash_find (cr16_inst_hash, op);
2546       parse_operands (&cr16_ins, param1);
2547      if (((&cr16_ins)->arg[0].type == arg_ic)
2548          && ((&cr16_ins)->arg[0].constant >= 0))
2549        {
2550           if (streq ("lshb", op))
2551             op = "ashub";
2552           else if (streq ("lshd", op))
2553             op = "ashud";
2554           else
2555             op = "ashuw";
2556        }
2557    }
2558
2559  /* Find the instruction.  */
2560  instruction = (const inst *) hash_find (cr16_inst_hash, op);
2561  if (instruction == NULL)
2562    {
2563      as_bad (_("Unknown opcode: `%s'"), op);
2564      return;
2565    }
2566
2567  /* Tie dwarf2 debug info to the address at the start of the insn.  */
2568  dwarf2_emit_insn (0);
2569
2570  /* Parse the instruction's operands.  */
2571  parse_insn (&cr16_ins, param);
2572
2573  /* Assemble the instruction - return upon failure.  */
2574  if (assemble_insn (op, &cr16_ins) == 0)
2575    return;
2576
2577  /* Print the instruction.  */
2578  print_insn (&cr16_ins);
2579}
2580