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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.20.1/] [gas/] [config/] [tc-d10v.c] - Blame information for rev 413

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

Line No. Rev Author Line
1 205 julius
/* tc-d10v.c -- Assembler code for the Mitsubishi D10V
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
3
   2007, 2009
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GAS, the GNU Assembler.
7
 
8
   GAS is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3, or (at your option)
11
   any later version.
12
 
13
   GAS is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with GAS; see the file COPYING.  If not, write to
20
   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
21
   Boston, MA 02110-1301, USA.  */
22
 
23
#include "as.h"
24
#include "safe-ctype.h"
25
#include "subsegs.h"
26
#include "opcode/d10v.h"
27
#include "elf/ppc.h"
28
#include "dwarf2dbg.h"
29
 
30
const char comment_chars[]        = ";";
31
const char line_comment_chars[]   = "#";
32
const char line_separator_chars[] = "";
33
const char *md_shortopts          = "O";
34
const char EXP_CHARS[]            = "eE";
35
const char FLT_CHARS[]            = "dD";
36
 
37
int Optimizing = 0;
38
 
39
#define AT_WORD_P(X) ((X)->X_op == O_right_shift \
40
                      && (X)->X_op_symbol != NULL \
41
                      && symbol_constant_p ((X)->X_op_symbol) \
42
                      && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
43
#define AT_WORD_RIGHT_SHIFT 2
44
 
45
/* Fixups.  */
46
#define MAX_INSN_FIXUPS  5
47
 
48
struct d10v_fixup
49
{
50
  expressionS exp;
51
  int operand;
52
  int pcrel;
53
  int size;
54
  bfd_reloc_code_real_type reloc;
55
};
56
 
57
typedef struct _fixups
58
{
59
  int fc;
60
  struct d10v_fixup fix[MAX_INSN_FIXUPS];
61
  struct _fixups *next;
62
} Fixups;
63
 
64
static Fixups FixUps[2];
65
static Fixups *fixups;
66
 
67
static int do_not_ignore_hash = 0;
68
 
69
typedef int packing_type;
70
#define PACK_UNSPEC     (0)     /* Packing order not specified.  */
71
#define PACK_PARALLEL   (1)     /* "||"  */
72
#define PACK_LEFT_RIGHT (2)     /* "->"  */
73
#define PACK_RIGHT_LEFT (3)     /* "<-"  */
74
static packing_type etype = PACK_UNSPEC; /* Used by d10v_cleanup.  */
75
 
76
/* TRUE if instruction swapping warnings should be inhibited.
77
   --nowarnswap.  */
78
static bfd_boolean flag_warn_suppress_instructionswap;
79
 
80
/* TRUE if instruction packing should be performed when --gstabs is specified.
81
   --gstabs-packing, --no-gstabs-packing.  */
82
static bfd_boolean flag_allow_gstabs_packing = 1;
83
 
84
/* Local functions.  */
85
 
86
enum options
87
{
88
  OPTION_NOWARNSWAP = OPTION_MD_BASE,
89
  OPTION_GSTABSPACKING,
90
  OPTION_NOGSTABSPACKING
91
};
92
 
93
struct option md_longopts[] =
94
{
95
  {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP},
96
  {"gstabspacking",  no_argument, NULL, OPTION_GSTABSPACKING},
97
  {"gstabs-packing", no_argument, NULL, OPTION_GSTABSPACKING},
98
  {"nogstabspacking",   no_argument, NULL, OPTION_NOGSTABSPACKING},
99
  {"no-gstabs-packing", no_argument, NULL, OPTION_NOGSTABSPACKING},
100
  {NULL, no_argument, NULL, 0}
101
};
102
 
103
size_t md_longopts_size = sizeof (md_longopts);
104
 
105
/* Opcode hash table.  */
106
static struct hash_control *d10v_hash;
107
 
108
/* Do a binary search of the d10v_predefined_registers array to see if
109
   NAME is a valid regiter name.  Return the register number from the
110
   array on success, or -1 on failure.  */
111
 
112
static int
113
reg_name_search (char *name)
114
{
115
  int middle, low, high;
116
  int cmp;
117
 
118
  low = 0;
119
  high = d10v_reg_name_cnt () - 1;
120
 
121
  do
122
    {
123
      middle = (low + high) / 2;
124
      cmp = strcasecmp (name, d10v_predefined_registers[middle].name);
125
      if (cmp < 0)
126
        high = middle - 1;
127
      else if (cmp > 0)
128
        low = middle + 1;
129
      else
130
        return d10v_predefined_registers[middle].value;
131
    }
132
  while (low <= high);
133
  return -1;
134
}
135
 
136
/* Check the string at input_line_pointer
137
   to see if it is a valid register name.  */
138
 
139
static int
140
register_name (expressionS *expressionP)
141
{
142
  int reg_number;
143
  char c, *p = input_line_pointer;
144
 
145
  while (*p
146
         && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
147
    p++;
148
 
149
  c = *p;
150
  if (c)
151
    *p++ = 0;
152
 
153
  /* Look to see if it's in the register table.  */
154
  reg_number = reg_name_search (input_line_pointer);
155
  if (reg_number >= 0)
156
    {
157
      expressionP->X_op = O_register;
158
      /* Temporarily store a pointer to the string here.  */
159
      expressionP->X_op_symbol = (symbolS *) input_line_pointer;
160
      expressionP->X_add_number = reg_number;
161
      input_line_pointer = p;
162
      return 1;
163
    }
164
  if (c)
165
    *(p - 1) = c;
166
  return 0;
167
}
168
 
169
static int
170
check_range (unsigned long num, int bits, int flags)
171
{
172
  long min, max;
173
  int retval = 0;
174
 
175
  /* Don't bother checking 16-bit values.  */
176
  if (bits == 16)
177
    return 0;
178
 
179
  if (flags & OPERAND_SHIFT)
180
    {
181
      /* All special shift operands are unsigned and <= 16.
182
         We allow 0 for now.  */
183
      if (num > 16)
184
        return 1;
185
      else
186
        return 0;
187
    }
188
 
189
  if (flags & OPERAND_SIGNED)
190
    {
191
      /* Signed 3-bit integers are restricted to the (-2, 3) range.  */
192
      if (flags & RESTRICTED_NUM3)
193
        {
194
          if ((long) num < -2 || (long) num > 3)
195
            retval = 1;
196
        }
197
      else
198
        {
199
          max = (1 << (bits - 1)) - 1;
200
          min = - (1 << (bits - 1));
201
          if (((long) num > max) || ((long) num < min))
202
            retval = 1;
203
        }
204
    }
205
  else
206
    {
207
      max = (1 << bits) - 1;
208
      min = 0;
209
      if (((long) num > max) || ((long) num < min))
210
        retval = 1;
211
    }
212
  return retval;
213
}
214
 
215
void
216
md_show_usage (FILE *stream)
217
{
218
  fprintf (stream, _("D10V options:\n\
219
-O                      Optimize.  Will do some operations in parallel.\n\
220
--gstabs-packing        Pack adjacent short instructions together even\n\
221
                        when --gstabs is specified.  On by default.\n\
222
--no-gstabs-packing     If --gstabs is specified, do not pack adjacent\n\
223
                        instructions together.\n"));
224
}
225
 
226
int
227
md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
228
{
229
  switch (c)
230
    {
231
    case 'O':
232
      /* Optimize. Will attempt to parallelize operations.  */
233
      Optimizing = 1;
234
      break;
235
    case OPTION_NOWARNSWAP:
236
      flag_warn_suppress_instructionswap = 1;
237
      break;
238
    case OPTION_GSTABSPACKING:
239
      flag_allow_gstabs_packing = 1;
240
      break;
241
    case OPTION_NOGSTABSPACKING:
242
      flag_allow_gstabs_packing = 0;
243
      break;
244
    default:
245
      return 0;
246
    }
247
  return 1;
248
}
249
 
250
symbolS *
251
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
252
{
253
  return 0;
254
}
255
 
256
char *
257
md_atof (int type, char *litP, int *sizeP)
258
{
259
  return ieee_md_atof (type, litP, sizeP, TRUE);
260
}
261
 
262
void
263
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
264
                 asection *sec ATTRIBUTE_UNUSED,
265
                 fragS *fragP ATTRIBUTE_UNUSED)
266
{
267
  abort ();
268
}
269
 
270
valueT
271
md_section_align (asection *seg, valueT addr)
272
{
273
  int align = bfd_get_section_alignment (stdoutput, seg);
274
  return ((addr + (1 << align) - 1) & (-1 << align));
275
}
276
 
277
void
278
md_begin (void)
279
{
280
  char *prev_name = "";
281
  struct d10v_opcode *opcode;
282
  d10v_hash = hash_new ();
283
 
284
  /* Insert unique names into hash table.  The D10v instruction set
285
     has many identical opcode names that have different opcodes based
286
     on the operands.  This hash table then provides a quick index to
287
     the first opcode with a particular name in the opcode table.  */
288
 
289
  for (opcode = (struct d10v_opcode *) d10v_opcodes; opcode->name; opcode++)
290
    {
291
      if (strcmp (prev_name, opcode->name))
292
        {
293
          prev_name = (char *) opcode->name;
294
          hash_insert (d10v_hash, opcode->name, (char *) opcode);
295
        }
296
    }
297
 
298
  fixups = &FixUps[0];
299
  FixUps[0].next = &FixUps[1];
300
  FixUps[1].next = &FixUps[0];
301
}
302
 
303
/* Remove the postincrement or postdecrement operator ( '+' or '-' )
304
   from an expression.  */
305
 
306
static int
307
postfix (char *p)
308
{
309
  while (*p != '-' && *p != '+')
310
    {
311
      if (*p == 0 || *p == '\n' || *p == '\r')
312
        break;
313
      p++;
314
    }
315
 
316
  if (*p == '-')
317
    {
318
      *p = ' ';
319
      return -1;
320
    }
321
  if (*p == '+')
322
    {
323
      *p = ' ';
324
      return 1;
325
    }
326
 
327
  return 0;
328
}
329
 
330
static bfd_reloc_code_real_type
331
get_reloc (struct d10v_operand *op)
332
{
333
  int bits = op->bits;
334
 
335
  if (bits <= 4)
336
    return 0;
337
 
338
  if (op->flags & OPERAND_ADDR)
339
    {
340
      if (bits == 8)
341
        return BFD_RELOC_D10V_10_PCREL_R;
342
      else
343
        return BFD_RELOC_D10V_18_PCREL;
344
    }
345
 
346
  return BFD_RELOC_16;
347
}
348
 
349
/* Parse a string of operands.  Return an array of expressions.  */
350
 
351
static int
352
get_operands (expressionS exp[])
353
{
354
  char *p = input_line_pointer;
355
  int numops = 0;
356
  int post = 0;
357
  int uses_at = 0;
358
 
359
  while (*p)
360
    {
361
      while (*p == ' ' || *p == '\t' || *p == ',')
362
        p++;
363
      if (*p == 0 || *p == '\n' || *p == '\r')
364
        break;
365
 
366
      if (*p == '@')
367
        {
368
          uses_at = 1;
369
 
370
          p++;
371
          exp[numops].X_op = O_absent;
372
          if (*p == '(')
373
            {
374
              p++;
375
              exp[numops].X_add_number = OPERAND_ATPAR;
376
            }
377
          else if (*p == '-')
378
            {
379
              p++;
380
              exp[numops].X_add_number = OPERAND_ATMINUS;
381
            }
382
          else
383
            {
384
              exp[numops].X_add_number = OPERAND_ATSIGN;
385
              if (*p == '+')
386
                {
387
                  numops++;
388
                  exp[numops].X_op = O_absent;
389
                  exp[numops].X_add_number = OPERAND_PLUS;
390
                  p++;
391
                }
392
              post = postfix (p);
393
            }
394
          numops++;
395
          continue;
396
        }
397
 
398
      if (*p == ')')
399
        {
400
          /* Just skip the trailing paren.  */
401
          p++;
402
          continue;
403
        }
404
 
405
      input_line_pointer = p;
406
 
407
      /* Check to see if it might be a register name.  */
408
      if (!register_name (&exp[numops]))
409
        {
410
          /* Parse as an expression.  */
411
          if (uses_at)
412
            {
413
              /* Any expression that involves the indirect addressing
414
                 cannot also involve immediate addressing.  Therefore
415
                 the use of the hash character is illegal.  */
416
              int save = do_not_ignore_hash;
417
              do_not_ignore_hash = 1;
418
 
419
              expression (&exp[numops]);
420
 
421
              do_not_ignore_hash = save;
422
            }
423
          else
424
            expression (&exp[numops]);
425
        }
426
 
427
      if (strncasecmp (input_line_pointer, "@word", 5) == 0)
428
        {
429
          input_line_pointer += 5;
430
          if (exp[numops].X_op == O_register)
431
            {
432
              /* If it looked like a register name but was followed by
433
                 "@word" then it was really a symbol, so change it to
434
                 one.  */
435
              exp[numops].X_op = O_symbol;
436
              exp[numops].X_add_symbol =
437
                symbol_find_or_make ((char *) exp[numops].X_op_symbol);
438
            }
439
 
440
          /* Check for identifier@word+constant.  */
441
          if (*input_line_pointer == '-' || *input_line_pointer == '+')
442
            {
443
              expressionS new_exp;
444
              expression (&new_exp);
445
              exp[numops].X_add_number = new_exp.X_add_number;
446
            }
447
 
448
          /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT.  */
449
          {
450
            expressionS new_exp;
451
            memset (&new_exp, 0, sizeof new_exp);
452
            new_exp.X_add_number = AT_WORD_RIGHT_SHIFT;
453
            new_exp.X_op = O_constant;
454
            new_exp.X_unsigned = 1;
455
            exp[numops].X_op_symbol = make_expr_symbol (&new_exp);
456
            exp[numops].X_op = O_right_shift;
457
          }
458
 
459
          know (AT_WORD_P (&exp[numops]));
460
        }
461
 
462
      if (exp[numops].X_op == O_illegal)
463
        as_bad (_("illegal operand"));
464
      else if (exp[numops].X_op == O_absent)
465
        as_bad (_("missing operand"));
466
 
467
      numops++;
468
      p = input_line_pointer;
469
    }
470
 
471
  switch (post)
472
    {
473
    case -1:    /* Postdecrement mode.  */
474
      exp[numops].X_op = O_absent;
475
      exp[numops++].X_add_number = OPERAND_MINUS;
476
      break;
477
    case 1:     /* Postincrement mode.  */
478
      exp[numops].X_op = O_absent;
479
      exp[numops++].X_add_number = OPERAND_PLUS;
480
      break;
481
    }
482
 
483
  exp[numops].X_op = 0;
484
  return numops;
485
}
486
 
487
static unsigned long
488
d10v_insert_operand (unsigned long insn,
489
                     int op_type,
490
                     offsetT value,
491
                     int left,
492
                     fixS *fix)
493
{
494
  int shift, bits;
495
 
496
  shift = d10v_operands[op_type].shift;
497
  if (left)
498
    shift += 15;
499
 
500
  bits = d10v_operands[op_type].bits;
501
 
502
  /* Truncate to the proper number of bits.  */
503
  if (check_range (value, bits, d10v_operands[op_type].flags))
504
    as_bad_where (fix->fx_file, fix->fx_line,
505
                  _("operand out of range: %ld"), (long) value);
506
 
507
  value &= 0x7FFFFFFF >> (31 - bits);
508
  insn |= (value << shift);
509
 
510
  return insn;
511
}
512
 
513
/* Take a pointer to the opcode entry in the opcode table and the
514
   array of operand expressions.  Return the instruction.  */
515
 
516
static unsigned long
517
build_insn (struct d10v_opcode *opcode,
518
            expressionS *opers,
519
            unsigned long insn)
520
{
521
  int i, bits, shift, flags, format;
522
  unsigned long number;
523
 
524
  /* The insn argument is only used for the DIVS kludge.  */
525
  if (insn)
526
    format = LONG_R;
527
  else
528
    {
529
      insn = opcode->opcode;
530
      format = opcode->format;
531
    }
532
 
533
  for (i = 0; opcode->operands[i]; i++)
534
    {
535
      flags = d10v_operands[opcode->operands[i]].flags;
536
      bits = d10v_operands[opcode->operands[i]].bits;
537
      shift = d10v_operands[opcode->operands[i]].shift;
538
      number = opers[i].X_add_number;
539
 
540
      if (flags & OPERAND_REG)
541
        {
542
          number &= REGISTER_MASK;
543
          if (format == LONG_L)
544
            shift += 15;
545
        }
546
 
547
      if (opers[i].X_op != O_register && opers[i].X_op != O_constant)
548
        {
549
          /* Now create a fixup.  */
550
 
551
          if (fixups->fc >= MAX_INSN_FIXUPS)
552
            as_fatal (_("too many fixups"));
553
 
554
          if (AT_WORD_P (&opers[i]))
555
            {
556
              /* Recognize XXX>>1+N aka XXX@word+N as special (AT_WORD).  */
557
              fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18;
558
              opers[i].X_op = O_symbol;
559
              opers[i].X_op_symbol = NULL; /* Should free it.  */
560
              /* number is left shifted by AT_WORD_RIGHT_SHIFT so
561
                 that, it is aligned with the symbol's value.  Later,
562
                 BFD_RELOC_D10V_18 will right shift (symbol_value +
563
                 X_add_number).  */
564
              number <<= AT_WORD_RIGHT_SHIFT;
565
              opers[i].X_add_number = number;
566
            }
567
          else
568
            {
569
              fixups->fix[fixups->fc].reloc =
570
                get_reloc ((struct d10v_operand *) &d10v_operands[opcode->operands[i]]);
571
 
572
              /* Check that an immediate was passed to ops that expect one.  */
573
              if ((flags & OPERAND_NUM)
574
                  && (fixups->fix[fixups->fc].reloc == 0))
575
                as_bad (_("operand is not an immediate"));
576
            }
577
 
578
          if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 ||
579
              fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18)
580
            fixups->fix[fixups->fc].size = 2;
581
          else
582
            fixups->fix[fixups->fc].size = 4;
583
 
584
          fixups->fix[fixups->fc].exp = opers[i];
585
          fixups->fix[fixups->fc].operand = opcode->operands[i];
586
          fixups->fix[fixups->fc].pcrel =
587
            (flags & OPERAND_ADDR) ? TRUE : FALSE;
588
          (fixups->fc)++;
589
        }
590
 
591
      /* Truncate to the proper number of bits.  */
592
      if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
593
        as_bad (_("operand out of range: %lu"), number);
594
      number &= 0x7FFFFFFF >> (31 - bits);
595
      insn = insn | (number << shift);
596
    }
597
 
598
  /* kludge: for DIVS, we need to put the operands in twice on the second
599
     pass, format is changed to LONG_R to force the second set of operands
600
     to not be shifted over 15.  */
601
  if ((opcode->opcode == OPCODE_DIVS) && (format == LONG_L))
602
    insn = build_insn (opcode, opers, insn);
603
 
604
  return insn;
605
}
606
 
607
/* Write out a long form instruction.  */
608
 
609
static void
610
write_long (unsigned long insn, Fixups *fx)
611
{
612
  int i, where;
613
  char *f = frag_more (4);
614
 
615
  dwarf2_emit_insn (4);
616
  insn |= FM11;
617
  number_to_chars_bigendian (f, insn, 4);
618
 
619
  for (i = 0; i < fx->fc; i++)
620
    {
621
      if (fx->fix[i].reloc)
622
        {
623
          where = f - frag_now->fr_literal;
624
          if (fx->fix[i].size == 2)
625
            where += 2;
626
 
627
          if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
628
            fx->fix[i].operand |= 4096;
629
 
630
          fix_new_exp (frag_now,
631
                       where,
632
                       fx->fix[i].size,
633
                       &(fx->fix[i].exp),
634
                       fx->fix[i].pcrel,
635
                       fx->fix[i].operand|2048);
636
        }
637
    }
638
  fx->fc = 0;
639
}
640
 
641
/* Write out a short form instruction by itself.  */
642
 
643
static void
644
write_1_short (struct d10v_opcode *opcode,
645
               unsigned long insn,
646
               Fixups *fx)
647
{
648
  char *f = frag_more (4);
649
  int i, where;
650
 
651
  dwarf2_emit_insn (4);
652
  if (opcode->exec_type & PARONLY)
653
    as_fatal (_("Instruction must be executed in parallel with another instruction."));
654
 
655
  /* The other container needs to be NOP.
656
     According to 4.3.1: for FM=00, sub-instructions performed only by IU
657
     cannot be encoded in L-container.  */
658
  if (opcode->unit == IU)
659
    insn |= FM00 | (NOP << 15);         /* Right container.  */
660
  else
661
    insn = FM00 | (insn << 15) | NOP;   /* Left container.  */
662
 
663
  number_to_chars_bigendian (f, insn, 4);
664
  for (i = 0; i < fx->fc; i++)
665
    {
666
      if (fx->fix[i].reloc)
667
        {
668
          where = f - frag_now->fr_literal;
669
          if (fx->fix[i].size == 2)
670
            where += 2;
671
 
672
          if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
673
            fx->fix[i].operand |= 4096;
674
 
675
          /* If it's an R reloc, we may have to switch it to L.  */
676
          if ((fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R)
677
              && (opcode->unit != IU))
678
            fx->fix[i].operand |= 1024;
679
 
680
          fix_new_exp (frag_now,
681
                       where,
682
                       fx->fix[i].size,
683
                       &(fx->fix[i].exp),
684
                       fx->fix[i].pcrel,
685
                       fx->fix[i].operand|2048);
686
        }
687
    }
688
  fx->fc = 0;
689
}
690
 
691
/* Determine if there are any resource conflicts among two manually
692
   parallelized instructions.  Some of this was lifted from parallel_ok.  */
693
 
694
static void
695
check_resource_conflict (struct d10v_opcode *op1,
696
                         unsigned long insn1,
697
                         struct d10v_opcode *op2,
698
                         unsigned long insn2)
699
{
700
  int i, j, flags, mask, shift, regno;
701
  unsigned long ins, mod[2];
702
  struct d10v_opcode *op;
703
 
704
  if ((op1->exec_type & SEQ)
705
      || ! ((op1->exec_type & PAR) || (op1->exec_type & PARONLY)))
706
    {
707
      as_warn (_("packing conflict: %s must dispatch sequentially"),
708
              op1->name);
709
      return;
710
    }
711
 
712
  if ((op2->exec_type & SEQ)
713
      || ! ((op2->exec_type & PAR) || (op2->exec_type & PARONLY)))
714
    {
715
      as_warn (_("packing conflict: %s must dispatch sequentially"),
716
              op2->name);
717
      return;
718
    }
719
 
720
   /* See if both instructions write to the same resource.
721
 
722
      The idea here is to create two sets of bitmasks (mod and used) which
723
      indicate which registers are modified or used by each instruction.
724
      The operation can only be done in parallel if neither instruction
725
      modifies the same register. Accesses to control registers and memory
726
      are treated as accesses to a single register. So if both instructions
727
      write memory or if the first instruction writes memory and the second
728
      reads, then they cannot be done in parallel. We treat reads to the PSW
729
      (which includes C, F0, and F1) in isolation. So simultaneously writing
730
      C and F0 in two different sub-instructions is permitted.  */
731
 
732
  /* The bitmasks (mod and used) look like this (bit 31 = MSB).
733
     r0-r15       0-15
734
     a0-a1        16-17
735
     cr (not psw) 18
736
     psw(other)   19
737
     mem          20
738
     psw(C flag)  21
739
     psw(F0 flag) 22  */
740
 
741
  for (j = 0; j < 2; j++)
742
    {
743
      if (j == 0)
744
        {
745
          op = op1;
746
          ins = insn1;
747
        }
748
      else
749
        {
750
          op = op2;
751
          ins = insn2;
752
        }
753
      mod[j] = 0;
754
      if (op->exec_type & BRANCH_LINK)
755
        mod[j] |= 1 << 13;
756
 
757
      for (i = 0; op->operands[i]; i++)
758
        {
759
          flags = d10v_operands[op->operands[i]].flags;
760
          shift = d10v_operands[op->operands[i]].shift;
761
          mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
762
          if (flags & OPERAND_REG)
763
            {
764
              regno = (ins >> shift) & mask;
765
              if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
766
                regno += 16;
767
              else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */
768
                {
769
                  if (regno == 0)
770
                    regno = 19;
771
                  else
772
                    regno = 18;
773
                }
774
              else if (flags & OPERAND_FFLAG)
775
                regno = 22;
776
              else if (flags & OPERAND_CFLAG)
777
                regno = 21;
778
 
779
              if (flags & OPERAND_DEST
780
                  /* Auto inc/dec also modifies the register.  */
781
                  || (op->operands[i + 1] != 0
782
                      && (d10v_operands[op->operands[i + 1]].flags
783
                          & (OPERAND_PLUS | OPERAND_MINUS)) != 0))
784
                {
785
                  mod[j] |= 1 << regno;
786
                  if (flags & OPERAND_EVEN)
787
                    mod[j] |= 1 << (regno + 1);
788
                }
789
            }
790
          else if (flags & OPERAND_ATMINUS)
791
            {
792
              /* SP implicitly used/modified.  */
793
              mod[j] |= 1 << 15;
794
            }
795
        }
796
 
797
      if (op->exec_type & WMEM)
798
        mod[j] |= 1 << 20;
799
      else if (op->exec_type & WF0)
800
        mod[j] |= 1 << 22;
801
      else if (op->exec_type & WCAR)
802
        mod[j] |= 1 << 21;
803
    }
804
 
805
  if ((mod[0] & mod[1]) == 0)
806
    return;
807
  else
808
    {
809
      unsigned long x;
810
      x = mod[0] & mod[1];
811
 
812
      for (j = 0; j <= 15; j++)
813
        if (x & (1 << j))
814
          as_warn (_("resource conflict (R%d)"), j);
815
      for (j = 16; j <= 17; j++)
816
        if (x & (1 << j))
817
          as_warn (_("resource conflict (A%d)"), j - 16);
818
      if (x & (1 << 19))
819
        as_warn (_("resource conflict (PSW)"));
820
      if (x & (1 << 21))
821
        as_warn (_("resource conflict (C flag)"));
822
      if (x & (1 << 22))
823
        as_warn (_("resource conflict (F flag)"));
824
    }
825
}
826
 
827
/* Check 2 instructions and determine if they can be safely
828
   executed in parallel.  Return 1 if they can be.  */
829
 
830
static int
831
parallel_ok (struct d10v_opcode *op1,
832
             unsigned long insn1,
833
             struct d10v_opcode *op2,
834
             unsigned long insn2,
835
             packing_type exec_type)
836
{
837
  int i, j, flags, mask, shift, regno;
838
  unsigned long ins, mod[2], used[2];
839
  struct d10v_opcode *op;
840
 
841
  if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0
842
      || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0
843
      || (op1->unit == BOTH) || (op2->unit == BOTH)
844
      || (op1->unit == IU && op2->unit == IU)
845
      || (op1->unit == MU && op2->unit == MU))
846
    return 0;
847
 
848
  /* If this is auto parallelization, and the first instruction is a
849
     branch or should not be packed, then don't parallelize.  */
850
  if (exec_type == PACK_UNSPEC
851
      && (op1->exec_type & (ALONE | BRANCH)))
852
    return 0;
853
 
854
  /* The idea here is to create two sets of bitmasks (mod and used)
855
     which indicate which registers are modified or used by each
856
     instruction.  The operation can only be done in parallel if
857
     instruction 1 and instruction 2 modify different registers, and
858
     the first instruction does not modify registers that the second
859
     is using (The second instruction can modify registers that the
860
     first is using as they are only written back after the first
861
     instruction has completed).  Accesses to control registers, PSW,
862
     and memory are treated as accesses to a single register.  So if
863
     both instructions write memory or if the first instruction writes
864
     memory and the second reads, then they cannot be done in
865
     parallel.  Likewise, if the first instruction mucks with the psw
866
     and the second reads the PSW (which includes C, F0, and F1), then
867
     they cannot operate safely in parallel.  */
868
 
869
  /* The bitmasks (mod and used) look like this (bit 31 = MSB).
870
     r0-r15       0-15
871
     a0-a1        16-17
872
     cr (not psw) 18
873
     psw          19
874
     mem          20  */
875
 
876
  for (j = 0; j < 2; j++)
877
    {
878
      if (j == 0)
879
        {
880
          op = op1;
881
          ins = insn1;
882
        }
883
      else
884
        {
885
          op = op2;
886
          ins = insn2;
887
        }
888
      mod[j] = used[j] = 0;
889
      if (op->exec_type & BRANCH_LINK)
890
        mod[j] |= 1 << 13;
891
 
892
      for (i = 0; op->operands[i]; i++)
893
        {
894
          flags = d10v_operands[op->operands[i]].flags;
895
          shift = d10v_operands[op->operands[i]].shift;
896
          mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
897
          if (flags & OPERAND_REG)
898
            {
899
              regno = (ins >> shift) & mask;
900
              if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
901
                regno += 16;
902
              else if (flags & OPERAND_CONTROL) /* mvtc or mvfc.  */
903
                {
904
                  if (regno == 0)
905
                    regno = 19;
906
                  else
907
                    regno = 18;
908
                }
909
              else if (flags & (OPERAND_FFLAG | OPERAND_CFLAG))
910
                regno = 19;
911
 
912
              if (flags & OPERAND_DEST)
913
                {
914
                  mod[j] |= 1 << regno;
915
                  if (flags & OPERAND_EVEN)
916
                    mod[j] |= 1 << (regno + 1);
917
                }
918
              else
919
                {
920
                  used[j] |= 1 << regno;
921
                  if (flags & OPERAND_EVEN)
922
                    used[j] |= 1 << (regno + 1);
923
 
924
                  /* Auto inc/dec also modifies the register.  */
925
                  if (op->operands[i + 1] != 0
926
                      && (d10v_operands[op->operands[i + 1]].flags
927
                          & (OPERAND_PLUS | OPERAND_MINUS)) != 0)
928
                    mod[j] |= 1 << regno;
929
                }
930
            }
931
          else if (flags & OPERAND_ATMINUS)
932
            {
933
              /* SP implicitly used/modified.  */
934
              mod[j] |= 1 << 15;
935
              used[j] |= 1 << 15;
936
            }
937
        }
938
      if (op->exec_type & RMEM)
939
        used[j] |= 1 << 20;
940
      else if (op->exec_type & WMEM)
941
        mod[j] |= 1 << 20;
942
      else if (op->exec_type & RF0)
943
        used[j] |= 1 << 19;
944
      else if (op->exec_type & WF0)
945
        mod[j] |= 1 << 19;
946
      else if (op->exec_type & WCAR)
947
        mod[j] |= 1 << 19;
948
    }
949
  if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0)
950
    return 1;
951
  return 0;
952
}
953
 
954
/* Expects two short instructions.
955
   If possible, writes out both as a single packed instruction.
956
   Otherwise, writes out the first one, packed with a NOP.
957
   Returns number of instructions not written out.  */
958
 
959
static int
960
write_2_short (struct d10v_opcode *opcode1,
961
               unsigned long insn1,
962
               struct d10v_opcode *opcode2,
963
               unsigned long insn2,
964
               packing_type exec_type,
965
               Fixups *fx)
966
{
967
  unsigned long insn;
968
  char *f;
969
  int i, j, where;
970
 
971
  if ((exec_type != PACK_PARALLEL)
972
      && ((opcode1->exec_type & PARONLY) || (opcode2->exec_type & PARONLY)))
973
    as_fatal (_("Instruction must be executed in parallel"));
974
 
975
  if ((opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE))
976
    as_fatal (_("Long instructions may not be combined."));
977
 
978
  switch (exec_type)
979
    {
980
    case PACK_UNSPEC:   /* Order not specified.  */
981
      if (opcode1->exec_type & ALONE)
982
        {
983
          /* Case of a short branch on a separate GAS line.  Pack with NOP.  */
984
          write_1_short (opcode1, insn1, fx->next);
985
          return 1;
986
        }
987
      if (Optimizing
988
          && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
989
        {
990
          /* Parallel.  */
991
          if (opcode1->unit == IU)
992
            insn = FM00 | (insn2 << 15) | insn1;
993
          else if (opcode2->unit == MU)
994
            insn = FM00 | (insn2 << 15) | insn1;
995
          else
996
            insn = FM00 | (insn1 << 15) | insn2;
997
        }
998
      else if (opcode1->unit == IU)
999
        /* Reverse sequential with IU opcode1 on right and done first.  */
1000
        insn = FM10 | (insn2 << 15) | insn1;
1001
      else
1002
        /* Sequential with non-IU opcode1 on left and done first.  */
1003
        insn = FM01 | (insn1 << 15) | insn2;
1004
      break;
1005
 
1006
    case PACK_PARALLEL:
1007
      if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ)
1008
        as_fatal
1009
          (_("One of these instructions may not be executed in parallel."));
1010
      if (opcode1->unit == IU)
1011
        {
1012
          if (opcode2->unit == IU)
1013
            as_fatal (_("Two IU instructions may not be executed in parallel"));
1014
          if (!flag_warn_suppress_instructionswap)
1015
            as_warn (_("Swapping instruction order"));
1016
          insn = FM00 | (insn2 << 15) | insn1;
1017
        }
1018
      else if (opcode2->unit == MU)
1019
        {
1020
          if (opcode1->unit == MU)
1021
            as_fatal (_("Two MU instructions may not be executed in parallel"));
1022
          if (!flag_warn_suppress_instructionswap)
1023
            as_warn (_("Swapping instruction order"));
1024
          insn = FM00 | (insn2 << 15) | insn1;
1025
        }
1026
      else
1027
        insn = FM00 | (insn1 << 15) | insn2;
1028
      check_resource_conflict (opcode1, insn1, opcode2, insn2);
1029
      break;
1030
 
1031
    case PACK_LEFT_RIGHT:
1032
      if (opcode1->unit != IU)
1033
        insn = FM01 | (insn1 << 15) | insn2;
1034
      else if (opcode2->unit == MU || opcode2->unit == EITHER)
1035
        {
1036
          if (!flag_warn_suppress_instructionswap)
1037
            as_warn (_("Swapping instruction order"));
1038
          insn = FM10 | (insn2 << 15) | insn1;
1039
        }
1040
      else
1041
        as_fatal (_("IU instruction may not be in the left container"));
1042
      if (opcode1->exec_type & ALONE)
1043
        as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1044
      break;
1045
 
1046
    case PACK_RIGHT_LEFT:
1047
      if (opcode2->unit != MU)
1048
        insn = FM10 | (insn1 << 15) | insn2;
1049
      else if (opcode1->unit == IU || opcode1->unit == EITHER)
1050
        {
1051
          if (!flag_warn_suppress_instructionswap)
1052
            as_warn (_("Swapping instruction order"));
1053
          insn = FM01 | (insn2 << 15) | insn1;
1054
        }
1055
      else
1056
        as_fatal (_("MU instruction may not be in the right container"));
1057
      if (opcode2->exec_type & ALONE)
1058
        as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1059
      break;
1060
 
1061
    default:
1062
      as_fatal (_("unknown execution type passed to write_2_short()"));
1063
    }
1064
 
1065
  f = frag_more (4);
1066
  dwarf2_emit_insn (4);
1067
  number_to_chars_bigendian (f, insn, 4);
1068
 
1069
  /* Process fixup chains.  fx refers to insn2 when j == 0, and to
1070
     insn1 when j == 1.  Yes, it's reversed.  */
1071
 
1072
  for (j = 0; j < 2; j++)
1073
    {
1074
      for (i = 0; i < fx->fc; i++)
1075
        {
1076
          if (fx->fix[i].reloc)
1077
            {
1078
              where = f - frag_now->fr_literal;
1079
              if (fx->fix[i].size == 2)
1080
                where += 2;
1081
 
1082
              if (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R
1083
                  /* A BFD_RELOC_D10V_10_PCREL_R relocation applied to
1084
                     the instruction in the L container has to be
1085
                     adjusted to BDF_RELOC_D10V_10_PCREL_L.  When
1086
                     j==0, we're processing insn2's operands, so we
1087
                     want to mark the operand if insn2 is *not* in the
1088
                     R container.  When j==1, we're processing insn1's
1089
                     operands, so we want to mark the operand if insn2
1090
                     *is* in the R container.  Note that, if two
1091
                     instructions are identical, we're never going to
1092
                     swap them, so the test is safe.  */
1093
                  && j == ((insn & 0x7fff) == insn2))
1094
                fx->fix[i].operand |= 1024;
1095
 
1096
              if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
1097
                fx->fix[i].operand |= 4096;
1098
 
1099
              fix_new_exp (frag_now,
1100
                           where,
1101
                           fx->fix[i].size,
1102
                           &(fx->fix[i].exp),
1103
                           fx->fix[i].pcrel,
1104
                           fx->fix[i].operand|2048);
1105
            }
1106
        }
1107
      fx->fc = 0;
1108
      fx = fx->next;
1109
    }
1110
  return 0;
1111
}
1112
 
1113
/* This is the main entry point for the machine-dependent assembler.
1114
   str points to a machine-dependent instruction.  This function is
1115
   supposed to emit the frags/bytes it assembles to.  For the D10V, it
1116
   mostly handles the special VLIW parsing and packing and leaves the
1117
   difficult stuff to do_assemble().  */
1118
 
1119
static unsigned long prev_insn;
1120
static struct d10v_opcode *prev_opcode = 0;
1121
static subsegT prev_subseg;
1122
static segT prev_seg = 0;;
1123
 
1124
/* Find the symbol which has the same name as the register in exp.  */
1125
 
1126
static symbolS *
1127
find_symbol_matching_register (expressionS *exp)
1128
{
1129
  int i;
1130
 
1131
  if (exp->X_op != O_register)
1132
    return NULL;
1133
 
1134
  /* Find the name of the register.  */
1135
  for (i = d10v_reg_name_cnt (); i--;)
1136
    if (d10v_predefined_registers[i].value == exp->X_add_number)
1137
      break;
1138
 
1139
  if (i < 0)
1140
    abort ();
1141
 
1142
  /* Now see if a symbol has been defined with the same name.  */
1143
  return symbol_find (d10v_predefined_registers[i].name);
1144
}
1145
 
1146
/* Get a pointer to an entry in the opcode table.
1147
   The function must look at all opcodes with the same name and use
1148
   the operands to choose the correct opcode.  */
1149
 
1150
static struct d10v_opcode *
1151
find_opcode (struct d10v_opcode *opcode, expressionS myops[])
1152
{
1153
  int i, match;
1154
  struct d10v_opcode *next_opcode;
1155
 
1156
  /* Get all the operands and save them as expressions.  */
1157
  get_operands (myops);
1158
 
1159
  /* Now see if the operand is a fake.  If so, find the correct size
1160
     instruction, if possible.  */
1161
  if (opcode->format == OPCODE_FAKE)
1162
    {
1163
      int opnum = opcode->operands[0];
1164
      int flags;
1165
 
1166
      if (myops[opnum].X_op == O_register)
1167
        {
1168
          myops[opnum].X_op = O_symbol;
1169
          myops[opnum].X_add_symbol =
1170
            symbol_find_or_make ((char *) myops[opnum].X_op_symbol);
1171
          myops[opnum].X_add_number = 0;
1172
          myops[opnum].X_op_symbol = NULL;
1173
        }
1174
 
1175
      next_opcode = opcode + 1;
1176
 
1177
      /* If the first operand is supposed to be a register, make sure
1178
         we got a valid one.  */
1179
      flags = d10v_operands[next_opcode->operands[0]].flags;
1180
      if (flags & OPERAND_REG)
1181
        {
1182
          int X_op = myops[0].X_op;
1183
          int num = myops[0].X_add_number;
1184
 
1185
          if (X_op != O_register
1186
              || (num & ~flags
1187
                  & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1188
                     | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL))
1189
              || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1190
            {
1191
              as_bad (_("bad opcode or operands"));
1192
              return 0;
1193
            }
1194
        }
1195
 
1196
      if (myops[opnum].X_op == O_constant
1197
          || (myops[opnum].X_op == O_symbol
1198
              && S_IS_DEFINED (myops[opnum].X_add_symbol)
1199
              && (S_GET_SEGMENT (myops[opnum].X_add_symbol) == now_seg)))
1200
        {
1201
          for (i = 0; opcode->operands[i + 1]; i++)
1202
            {
1203
              int bits = d10v_operands[next_opcode->operands[opnum]].bits;
1204
              int flags = d10v_operands[next_opcode->operands[opnum]].flags;
1205
              if (flags & OPERAND_ADDR)
1206
                bits += 2;
1207
 
1208
              if (myops[opnum].X_op == O_constant)
1209
                {
1210
                  if (!check_range (myops[opnum].X_add_number, bits, flags))
1211
                    break;
1212
                }
1213
              else
1214
                {
1215
                  fragS *sym_frag;
1216
                  fragS *f;
1217
                  unsigned long current_position;
1218
                  unsigned long symbol_position;
1219
                  unsigned long value;
1220
                  bfd_boolean found_symbol;
1221
 
1222
                  /* Calculate the address of the current instruction
1223
                     and the address of the symbol.  Do this by summing
1224
                     the offsets of previous frags until we reach the
1225
                     frag containing the symbol, and the current frag.  */
1226
                  sym_frag = symbol_get_frag (myops[opnum].X_add_symbol);
1227
                  found_symbol = FALSE;
1228
 
1229
                  current_position =
1230
                    obstack_next_free (&frchain_now->frch_obstack)
1231
                    - frag_now->fr_literal;
1232
                  symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
1233
 
1234
                  for (f = frchain_now->frch_root; f; f = f->fr_next)
1235
                    {
1236
                      current_position += f->fr_fix + f->fr_offset;
1237
 
1238
                      if (f == sym_frag)
1239
                        found_symbol = TRUE;
1240
 
1241
                      if (! found_symbol)
1242
                        symbol_position += f->fr_fix + f->fr_offset;
1243
                    }
1244
 
1245
                  value = symbol_position;
1246
 
1247
                  if (flags & OPERAND_ADDR)
1248
                    value -= current_position;
1249
 
1250
                  if (AT_WORD_P (&myops[opnum]))
1251
                    {
1252
                      if (bits > 4)
1253
                        {
1254
                          bits += 2;
1255
                          if (!check_range (value, bits, flags))
1256
                            break;
1257
                        }
1258
                    }
1259
                  else if (!check_range (value, bits, flags))
1260
                    break;
1261
                }
1262
              next_opcode++;
1263
            }
1264
 
1265
          if (opcode->operands [i + 1] == 0)
1266
            as_fatal (_("value out of range"));
1267
          else
1268
            opcode = next_opcode;
1269
        }
1270
      else
1271
        /* Not a constant, so use a long instruction.  */
1272
        opcode += 2;
1273
    }
1274
 
1275
  match = 0;
1276
 
1277
  /* Now search the opcode table table for one with operands
1278
     that matches what we've got.  */
1279
  while (!match)
1280
    {
1281
      match = 1;
1282
      for (i = 0; opcode->operands[i]; i++)
1283
        {
1284
          int flags = d10v_operands[opcode->operands[i]].flags;
1285
          int X_op = myops[i].X_op;
1286
          int num = myops[i].X_add_number;
1287
 
1288
          if (X_op == 0)
1289
            {
1290
              match = 0;
1291
              break;
1292
            }
1293
 
1294
          if (flags & OPERAND_REG)
1295
            {
1296
              if ((X_op != O_register)
1297
                  || (num & ~flags
1298
                      & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1299
                         | OPERAND_FFLAG | OPERAND_CFLAG
1300
                         | OPERAND_CONTROL))
1301
                  || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1302
                {
1303
                  match = 0;
1304
                  break;
1305
                }
1306
            }
1307
 
1308
          if (((flags & OPERAND_MINUS)   && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1309
              ((flags & OPERAND_PLUS)    && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1310
              ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1311
              ((flags & OPERAND_ATPAR)   && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1312
              ((flags & OPERAND_ATSIGN)  && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR)))))
1313
            {
1314
              match = 0;
1315
              break;
1316
            }
1317
 
1318
          /* Unfortunately, for the indirect operand in instructions such
1319
             as ``ldb r1, @(c,r14)'' this function can be passed
1320
             X_op == O_register (because 'c' is a valid register name).
1321
             However we cannot just ignore the case when X_op == O_register
1322
             but flags & OPERAND_REG is null, so we check to see if a symbol
1323
             of the same name as the register exists.  If the symbol does
1324
             exist, then the parser was unable to distinguish the two cases
1325
             and we fix things here. (Ref: PR14826)  */
1326
 
1327
          if (!(flags & OPERAND_REG) && (X_op == O_register))
1328
            {
1329
              symbolS * sym;
1330
 
1331
              sym = find_symbol_matching_register (& myops[i]);
1332
 
1333
              if (sym != NULL)
1334
                {
1335
                  myops[i].X_op = X_op = O_symbol;
1336
                  myops[i].X_add_symbol = sym;
1337
                }
1338
              else
1339
                as_bad
1340
                  (_("illegal operand - register name found where none expected"));
1341
            }
1342
        }
1343
 
1344
      /* We're only done if the operands matched so far AND there
1345
             are no more to check.  */
1346
      if (match && myops[i].X_op == 0)
1347
        break;
1348
      else
1349
        match = 0;
1350
 
1351
      next_opcode = opcode + 1;
1352
 
1353
      if (next_opcode->opcode == 0)
1354
        break;
1355
 
1356
      if (strcmp (next_opcode->name, opcode->name))
1357
        break;
1358
 
1359
      opcode = next_opcode;
1360
    }
1361
 
1362
  if (!match)
1363
    {
1364
      as_bad (_("bad opcode or operands"));
1365
      return 0;
1366
    }
1367
 
1368
  /* Check that all registers that are required to be even are.
1369
     Also, if any operands were marked as registers, but were really symbols,
1370
     fix that here.  */
1371
  for (i = 0; opcode->operands[i]; i++)
1372
    {
1373
      if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1374
          (myops[i].X_add_number & 1))
1375
        as_fatal (_("Register number must be EVEN"));
1376
      if ((d10v_operands[opcode->operands[i]].flags & OPERAND_NOSP)
1377
          && (myops[i].X_add_number & OPERAND_SP))
1378
        as_bad (_("Unsupported use of sp"));
1379
      if (myops[i].X_op == O_register)
1380
        {
1381
          if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1382
            {
1383
              myops[i].X_op = O_symbol;
1384
              myops[i].X_add_symbol =
1385
                symbol_find_or_make ((char *) myops[i].X_op_symbol);
1386
              myops[i].X_add_number = 0;
1387
              myops[i].X_op_symbol = NULL;
1388
            }
1389
        }
1390
      if ((d10v_operands[opcode->operands[i]].flags & OPERAND_CONTROL)
1391
          && (myops[i].X_add_number == OPERAND_CONTROL + 4
1392
              || myops[i].X_add_number == OPERAND_CONTROL + 5
1393
              || myops[i].X_add_number == OPERAND_CONTROL + 6
1394
              || myops[i].X_add_number == OPERAND_CONTROL + 12
1395
              || myops[i].X_add_number == OPERAND_CONTROL + 13
1396
              || myops[i].X_add_number == OPERAND_CONTROL + 15))
1397
        as_warn (_("cr%ld is a reserved control register"),
1398
                 myops[i].X_add_number - OPERAND_CONTROL);
1399
    }
1400
  return opcode;
1401
}
1402
 
1403
/* Assemble a single instruction.
1404
   Return an opcode, or -1 (an invalid opcode) on error.  */
1405
 
1406
static unsigned long
1407
do_assemble (char *str, struct d10v_opcode **opcode)
1408
{
1409
  unsigned char *op_start, *op_end;
1410
  char *save;
1411
  char name[20];
1412
  int nlen = 0;
1413
  expressionS myops[6];
1414
 
1415
  /* Drop leading whitespace.  */
1416
  while (*str == ' ')
1417
    str++;
1418
 
1419
  /* Find the opcode end.  */
1420
  for (op_start = op_end = (unsigned char *) str;
1421
       *op_end && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
1422
       op_end++)
1423
    {
1424
      name[nlen] = TOLOWER (op_start[nlen]);
1425
      nlen++;
1426
    }
1427
  name[nlen] = 0;
1428
 
1429
  if (nlen == 0)
1430
    return -1;
1431
 
1432
  /* Find the first opcode with the proper name.  */
1433
  *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name);
1434
  if (*opcode == NULL)
1435
    return -1;
1436
 
1437
  save = input_line_pointer;
1438
  input_line_pointer = (char *) op_end;
1439
  *opcode = find_opcode (*opcode, myops);
1440
  if (*opcode == 0)
1441
    return -1;
1442
  input_line_pointer = save;
1443
 
1444
  return build_insn ((*opcode), myops, 0);
1445
}
1446
 
1447
/* If while processing a fixup, a reloc really needs to be created.
1448
   Then it is done here.  */
1449
 
1450
arelent *
1451
tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1452
{
1453
  arelent *reloc;
1454
  reloc = xmalloc (sizeof (arelent));
1455
  reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1456
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1457
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1458
  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1459
  if (reloc->howto == (reloc_howto_type *) NULL)
1460
    {
1461
      as_bad_where (fixp->fx_file, fixp->fx_line,
1462
                    _("reloc %d not supported by object file format"),
1463
                    (int) fixp->fx_r_type);
1464
      return NULL;
1465
    }
1466
 
1467
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1468
    reloc->address = fixp->fx_offset;
1469
 
1470
  reloc->addend = 0;
1471
 
1472
  return reloc;
1473
}
1474
 
1475
int
1476
md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1477
                               asection *seg ATTRIBUTE_UNUSED)
1478
{
1479
  abort ();
1480
  return 0;
1481
}
1482
 
1483
long
1484
md_pcrel_from_section (fixS *fixp, segT sec)
1485
{
1486
  if (fixp->fx_addsy != (symbolS *) NULL
1487
      && (!S_IS_DEFINED (fixp->fx_addsy)
1488
          || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1489
    return 0;
1490
  return fixp->fx_frag->fr_address + fixp->fx_where;
1491
}
1492
 
1493
void
1494
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1495
{
1496
  char *where;
1497
  unsigned long insn;
1498
  long value = *valP;
1499
  int op_type;
1500
  int left = 0;
1501
 
1502
  if (fixP->fx_addsy == (symbolS *) NULL)
1503
    fixP->fx_done = 1;
1504
 
1505
  /* We don't actually support subtracting a symbol.  */
1506
  if (fixP->fx_subsy != (symbolS *) NULL)
1507
    as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1508
 
1509
  op_type = fixP->fx_r_type;
1510
  if (op_type & 2048)
1511
    {
1512
      op_type -= 2048;
1513
      if (op_type & 1024)
1514
        {
1515
          op_type -= 1024;
1516
          fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1517
          left = 1;
1518
        }
1519
      else if (op_type & 4096)
1520
        {
1521
          op_type -= 4096;
1522
          fixP->fx_r_type = BFD_RELOC_D10V_18;
1523
        }
1524
      else
1525
        fixP->fx_r_type =
1526
          get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1527
    }
1528
 
1529
  /* Fetch the instruction, insert the fully resolved operand
1530
     value, and stuff the instruction back again.  */
1531
  where = fixP->fx_frag->fr_literal + fixP->fx_where;
1532
  insn = bfd_getb32 ((unsigned char *) where);
1533
 
1534
  switch (fixP->fx_r_type)
1535
    {
1536
    case BFD_RELOC_D10V_10_PCREL_L:
1537
    case BFD_RELOC_D10V_10_PCREL_R:
1538
    case BFD_RELOC_D10V_18_PCREL:
1539
      /* If the fix is relative to a global symbol, not a section
1540
         symbol, then ignore the offset.
1541
         XXX - Do we have to worry about branches to a symbol + offset ?  */
1542
      if (fixP->fx_addsy != NULL
1543
          && S_IS_EXTERNAL (fixP->fx_addsy) )
1544
        {
1545
          segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
1546
          segment_info_type *segf = seg_info(fseg);
1547
 
1548
          if ( segf && segf->sym != fixP->fx_addsy)
1549
            value = 0;
1550
        }
1551
      /* Drop through.  */
1552
    case BFD_RELOC_D10V_18:
1553
      /* Instruction addresses are always right-shifted by 2.  */
1554
      value >>= AT_WORD_RIGHT_SHIFT;
1555
      if (fixP->fx_size == 2)
1556
        bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1557
      else
1558
        {
1559
          struct d10v_opcode *rep, *repi;
1560
 
1561
          rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1562
          repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1563
          if ((insn & FM11) == FM11
1564
              && ((repi != NULL
1565
                   && (insn & repi->mask) == (unsigned) repi->opcode)
1566
                  || (rep != NULL
1567
                      && (insn & rep->mask) == (unsigned) rep->opcode))
1568
              && value < 4)
1569
            as_fatal
1570
              (_("line %d: rep or repi must include at least 4 instructions"),
1571
               fixP->fx_line);
1572
          insn =
1573
            d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
1574
          bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1575
        }
1576
      break;
1577
    case BFD_RELOC_32:
1578
      bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1579
      break;
1580
    case BFD_RELOC_16:
1581
      bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1582
      break;
1583
 
1584
    case BFD_RELOC_VTABLE_INHERIT:
1585
    case BFD_RELOC_VTABLE_ENTRY:
1586
      fixP->fx_done = 0;
1587
      return;
1588
 
1589
    default:
1590
      as_fatal (_("line %d: unknown relocation type: 0x%x"),
1591
                fixP->fx_line, fixP->fx_r_type);
1592
    }
1593
}
1594
 
1595
/* d10v_cleanup() is called after the assembler has finished parsing
1596
   the input file, when a label is read from the input file, or when a
1597
   stab directive is output.  Because the D10V assembler sometimes
1598
   saves short instructions to see if it can package them with the
1599
   next instruction, there may be a short instruction that still needs
1600
   to be written.
1601
 
1602
   NOTE: accesses a global, etype.
1603
   NOTE: invoked by various macros such as md_cleanup: see.  */
1604
 
1605
int
1606
d10v_cleanup (void)
1607
{
1608
  segT seg;
1609
  subsegT subseg;
1610
 
1611
  /* If cleanup was invoked because the assembler encountered, e.g., a
1612
     user label, we write out the pending instruction, if any.  If it
1613
     was invoked because the assembler is outputting a piece of line
1614
     debugging information, though, we write out the pending
1615
     instruction only if the --no-gstabs-packing command line switch
1616
     has been specified.  */
1617
  if (prev_opcode
1618
      && etype == PACK_UNSPEC
1619
      && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1620
    {
1621
      seg = now_seg;
1622
      subseg = now_subseg;
1623
 
1624
      if (prev_seg)
1625
        subseg_set (prev_seg, prev_subseg);
1626
 
1627
      write_1_short (prev_opcode, prev_insn, fixups->next);
1628
      subseg_set (seg, subseg);
1629
      prev_opcode = NULL;
1630
    }
1631
  return 1;
1632
}
1633
 
1634
void
1635
d10v_frob_label (symbolS *lab)
1636
{
1637
  d10v_cleanup ();
1638
  symbol_set_frag (lab, frag_now);
1639
  S_SET_VALUE (lab, (valueT) frag_now_fix ());
1640
  dwarf2_emit_label (lab);
1641
}
1642
 
1643
/* Like normal .word, except support @word.
1644
   Clobbers input_line_pointer, checks end-of-line.  */
1645
 
1646
static void
1647
d10v_dot_word (int dummy ATTRIBUTE_UNUSED)
1648
{
1649
  expressionS exp;
1650
  char *p;
1651
 
1652
  if (is_it_end_of_statement ())
1653
    {
1654
      demand_empty_rest_of_line ();
1655
      return;
1656
    }
1657
 
1658
  do
1659
    {
1660
      expression (&exp);
1661
      if (!strncasecmp (input_line_pointer, "@word", 5))
1662
        {
1663
          exp.X_add_number = 0;
1664
          input_line_pointer += 5;
1665
 
1666
          p = frag_more (2);
1667
          fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1668
                       &exp, 0, BFD_RELOC_D10V_18);
1669
        }
1670
      else
1671
        emit_expr (&exp, 2);
1672
    }
1673
  while (*input_line_pointer++ == ',');
1674
 
1675
  input_line_pointer--;         /* Put terminator back into stream.  */
1676
  demand_empty_rest_of_line ();
1677
}
1678
 
1679
/* Mitsubishi asked that we support some old syntax that apparently
1680
   had immediate operands starting with '#'.  This is in some of their
1681
   sample code but is not documented (although it appears in some
1682
   examples in their assembler manual). For now, we'll solve this
1683
   compatibility problem by simply ignoring any '#' at the beginning
1684
   of an operand.  */
1685
 
1686
/* Operands that begin with '#' should fall through to here.
1687
   From expr.c.  */
1688
 
1689
void
1690
md_operand (expressionS *expressionP)
1691
{
1692
  if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1693
    {
1694
      input_line_pointer++;
1695
      expression (expressionP);
1696
    }
1697
}
1698
 
1699
bfd_boolean
1700
d10v_fix_adjustable (fixS *fixP)
1701
{
1702
  /* We need the symbol name for the VTABLE entries.  */
1703
  if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1704
      || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1705
    return 0;
1706
 
1707
  return 1;
1708
}
1709
 
1710
/* The target specific pseudo-ops which we support.  */
1711
const pseudo_typeS md_pseudo_table[] =
1712
{
1713
  { "word",     d10v_dot_word,  2 },
1714
  { NULL,       NULL,           0 }
1715
};
1716
 
1717
void
1718
md_assemble (char *str)
1719
{
1720
  /* etype is saved extype.  For multi-line instructions.  */
1721
  packing_type extype = PACK_UNSPEC;            /* Parallel, etc.  */
1722
  struct d10v_opcode *opcode;
1723
  unsigned long insn;
1724
  char *str2;
1725
 
1726
  if (etype == PACK_UNSPEC)
1727
    {
1728
      /* Look for the special multiple instruction separators.  */
1729
      str2 = strstr (str, "||");
1730
      if (str2)
1731
        extype = PACK_PARALLEL;
1732
      else
1733
        {
1734
          str2 = strstr (str, "->");
1735
          if (str2)
1736
            extype = PACK_LEFT_RIGHT;
1737
          else
1738
            {
1739
              str2 = strstr (str, "<-");
1740
              if (str2)
1741
                extype = PACK_RIGHT_LEFT;
1742
            }
1743
        }
1744
 
1745
      /* str2 points to the separator, if there is one.  */
1746
      if (str2)
1747
        {
1748
          *str2 = 0;
1749
 
1750
          /* If two instructions are present and we already have one saved,
1751
             then first write out the saved one.  */
1752
          d10v_cleanup ();
1753
 
1754
          /* Assemble first instruction and save it.  */
1755
          prev_insn = do_assemble (str, &prev_opcode);
1756
          prev_seg = now_seg;
1757
          prev_subseg = now_subseg;
1758
          if (prev_insn == (unsigned long) -1)
1759
            as_fatal (_("can't find previous opcode "));
1760
          fixups = fixups->next;
1761
          str = str2 + 2;
1762
        }
1763
    }
1764
 
1765
  insn = do_assemble (str, &opcode);
1766
  if (insn == (unsigned long) -1)
1767
    {
1768
      if (extype != PACK_UNSPEC)
1769
        etype = extype;
1770
      else
1771
        as_bad (_("could not assemble: %s"), str);
1772
      return;
1773
    }
1774
 
1775
  if (etype != PACK_UNSPEC)
1776
    {
1777
      extype = etype;
1778
      etype = PACK_UNSPEC;
1779
    }
1780
 
1781
  /* If this is a long instruction, write it and any previous short
1782
     instruction.  */
1783
  if (opcode->format & LONG_OPCODE)
1784
    {
1785
      if (extype != PACK_UNSPEC)
1786
        as_fatal (_("Unable to mix instructions as specified"));
1787
      d10v_cleanup ();
1788
      write_long (insn, fixups);
1789
      prev_opcode = NULL;
1790
      return;
1791
    }
1792
 
1793
  if (prev_opcode
1794
      && prev_seg
1795
      && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1796
    d10v_cleanup ();
1797
 
1798
  if (prev_opcode
1799
      && (0 == write_2_short (prev_opcode, prev_insn, opcode, insn, extype,
1800
                              fixups)))
1801
    {
1802
      /* No instructions saved.  */
1803
      prev_opcode = NULL;
1804
    }
1805
  else
1806
    {
1807
      if (extype != PACK_UNSPEC)
1808
        as_fatal (_("Unable to mix instructions as specified"));
1809
      /* Save last instruction so it may be packed on next pass.  */
1810
      prev_opcode = opcode;
1811
      prev_insn = insn;
1812
      prev_seg = now_seg;
1813
      prev_subseg = now_subseg;
1814
      fixups = fixups->next;
1815
    }
1816
}
1817
 

powered by: WebSVN 2.1.0

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