OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gas/] [config/] [tc-cr16.c] - Blame information for rev 58

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.