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-d30v.c] - Blame information for rev 307

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

Line No. Rev Author Line
1 205 julius
/* tc-d30v.c -- Assembler code for the Mitsubishi D30V
2
   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008,
3
   2009 Free Software Foundation, Inc.
4
 
5
   This file is part of GAS, the GNU Assembler.
6
 
7
   GAS is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
 
12
   GAS is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with GAS; see the file COPYING.  If not, write to
19
   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20
   Boston, MA 02110-1301, USA.  */
21
 
22
#include "as.h"
23
#include "safe-ctype.h"
24
#include "subsegs.h"
25
#include "opcode/d30v.h"
26
#include "dwarf2dbg.h"
27
 
28
const char comment_chars[]        = ";";
29
const char line_comment_chars[]   = "#";
30
const char line_separator_chars[] = "";
31
const char *md_shortopts          = "OnNcC";
32
const char EXP_CHARS[]            = "eE";
33
const char FLT_CHARS[]            = "dD";
34
 
35
#if HAVE_LIMITS_H
36
#include <limits.h>
37
#endif
38
 
39
#ifndef CHAR_BIT
40
#define CHAR_BIT 8
41
#endif
42
 
43
#define NOP_MULTIPLY 1
44
#define NOP_ALL 2
45
static int warn_nops = 0;
46
static int Optimizing = 0;
47
static int warn_register_name_conflicts = 1;
48
 
49
#define FORCE_SHORT     1
50
#define FORCE_LONG      2
51
 
52
/* EXEC types.  */
53
typedef enum _exec_type
54
{
55
  EXEC_UNKNOWN,                 /* No order specified.  */
56
  EXEC_PARALLEL,                /* Done in parallel (FM=00).  */
57
  EXEC_SEQ,                     /* Sequential (FM=01).  */
58
  EXEC_REVSEQ                   /* Reverse sequential (FM=10).  */
59
} exec_type_enum;
60
 
61
/* Fixups.  */
62
#define MAX_INSN_FIXUPS  5
63
 
64
struct d30v_fixup
65
{
66
  expressionS exp;
67
  int operand;
68
  int pcrel;
69
  int size;
70
  bfd_reloc_code_real_type reloc;
71
};
72
 
73
typedef struct _fixups
74
{
75
  int fc;
76
  struct d30v_fixup fix[MAX_INSN_FIXUPS];
77
  struct _fixups *next;
78
} Fixups;
79
 
80
static Fixups FixUps[2];
81
static Fixups *fixups;
82
 
83
/* Whether current and previous instruction are word multiply insns.  */
84
static int cur_mul32_p = 0;
85
static int prev_mul32_p = 0;
86
 
87
/*  The flag_explicitly_parallel is true iff the instruction being assembled
88
    has been explicitly written as a parallel short-instruction pair by the
89
    human programmer.  It is used in parallel_ok () to distinguish between
90
    those dangerous parallelizations attempted by the human, which are to be
91
    allowed, and those attempted by the assembler, which are not.  It is set
92
    from md_assemble ().  */
93
static int flag_explicitly_parallel = 0;
94
static int flag_xp_state = 0;
95
 
96
/* Whether current and previous left sub-instruction disables
97
   execution of right sub-instruction.  */
98
static int cur_left_kills_right_p = 0;
99
static int prev_left_kills_right_p = 0;
100
 
101
/* The known current alignment of the current section.  */
102
static int d30v_current_align;
103
static segT d30v_current_align_seg;
104
 
105
/* The last seen label in the current section.  This is used to auto-align
106
   labels preceding instructions.  */
107
static symbolS *d30v_last_label;
108
 
109
/* Two nops.  */
110
#define NOP_LEFT   ((long long) NOP << 32)
111
#define NOP_RIGHT  ((long long) NOP)
112
#define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT)
113
 
114
struct option md_longopts[] =
115
{
116
  {NULL, no_argument, NULL, 0}
117
};
118
 
119
size_t md_longopts_size = sizeof (md_longopts);
120
 
121
/* Opcode hash table.  */
122
static struct hash_control *d30v_hash;
123
 
124
/* Do a binary search of the pre_defined_registers array to see if
125
   NAME is a valid regiter name.  Return the register number from the
126
   array on success, or -1 on failure.  */
127
 
128
static int
129
reg_name_search (char *name)
130
{
131
  int middle, low, high;
132
  int cmp;
133
 
134
  low = 0;
135
  high = reg_name_cnt () - 1;
136
 
137
  do
138
    {
139
      middle = (low + high) / 2;
140
      cmp = strcasecmp (name, pre_defined_registers[middle].name);
141
      if (cmp < 0)
142
        high = middle - 1;
143
      else if (cmp > 0)
144
        low = middle + 1;
145
      else
146
        {
147
          if (symbol_find (name) != NULL)
148
            {
149
              if (warn_register_name_conflicts)
150
                as_warn (_("Register name %s conflicts with symbol of the same name"),
151
                         name);
152
            }
153
 
154
          return pre_defined_registers[middle].value;
155
        }
156
    }
157
  while (low <= high);
158
 
159
  return -1;
160
}
161
 
162
/* Check the string at input_line_pointer to see if it is a valid
163
   register name.  */
164
 
165
static int
166
register_name (expressionS *expressionP)
167
{
168
  int reg_number;
169
  char c, *p = input_line_pointer;
170
 
171
  while (*p && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
172
    p++;
173
 
174
  c = *p;
175
  if (c)
176
    *p++ = 0;
177
 
178
  /* Look to see if it's in the register table.  */
179
  reg_number = reg_name_search (input_line_pointer);
180
  if (reg_number >= 0)
181
    {
182
      expressionP->X_op = O_register;
183
      /* Temporarily store a pointer to the string here.  */
184
      expressionP->X_op_symbol = (symbolS *) input_line_pointer;
185
      expressionP->X_add_number = reg_number;
186
      input_line_pointer = p;
187
      return 1;
188
    }
189
  if (c)
190
    *(p - 1) = c;
191
  return 0;
192
}
193
 
194
static int
195
check_range (unsigned long num, int bits, int flags)
196
{
197
  long min, max;
198
 
199
  /* Don't bother checking 32-bit values.  */
200
  if (bits == 32)
201
    {
202
      if (sizeof (unsigned long) * CHAR_BIT == 32)
203
        return 0;
204
 
205
      /* We don't record signed or unsigned for 32-bit quantities.
206
         Allow either.  */
207
      min = -((unsigned long) 1 << (bits - 1));
208
      max = ((unsigned long) 1 << bits) - 1;
209
      return (long) num < min || (long) num > max;
210
    }
211
 
212
  if (flags & OPERAND_SHIFT)
213
    {
214
      /* We know that all shifts are right by three bits.  */
215
      num >>= 3;
216
 
217
      if (flags & OPERAND_SIGNED)
218
        {
219
          unsigned long sign_bit = ((unsigned long) -1L >> 4) + 1;
220
          num = (num ^ sign_bit) - sign_bit;
221
        }
222
    }
223
 
224
  if (flags & OPERAND_SIGNED)
225
    {
226
      max = ((unsigned long) 1 << (bits - 1)) - 1;
227
      min = - ((unsigned long) 1 << (bits - 1));
228
      return (long) num > max || (long) num < min;
229
    }
230
  else
231
    {
232
      max = ((unsigned long) 1 << bits) - 1;
233
      return num > (unsigned long) max;
234
    }
235
}
236
 
237
void
238
md_show_usage (FILE *stream)
239
{
240
  fprintf (stream, _("\nD30V options:\n\
241
-O                      Make adjacent short instructions parallel if possible.\n\
242
-n                      Warn about all NOPs inserted by the assembler.\n\
243
-N                      Warn about NOPs inserted after word multiplies.\n\
244
-c                      Warn about symbols whoes names match register names.\n\
245
-C                      Opposite of -C.  -c is the default.\n"));
246
}
247
 
248
int
249
md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
250
{
251
  switch (c)
252
    {
253
      /* Optimize.  Will attempt to parallelize operations.  */
254
    case 'O':
255
      Optimizing = 1;
256
      break;
257
 
258
      /* Warn about all NOPS that the assembler inserts.  */
259
    case 'n':
260
      warn_nops = NOP_ALL;
261
      break;
262
 
263
      /* Warn about the NOPS that the assembler inserts because of the
264
         multiply hazard.  */
265
    case 'N':
266
      warn_nops = NOP_MULTIPLY;
267
      break;
268
 
269
    case 'c':
270
      warn_register_name_conflicts = 1;
271
      break;
272
 
273
    case 'C':
274
      warn_register_name_conflicts = 0;
275
      break;
276
 
277
    default:
278
      return 0;
279
    }
280
  return 1;
281
}
282
 
283
symbolS *
284
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
285
{
286
  return 0;
287
}
288
 
289
char *
290
md_atof (int type, char *litP, int *sizeP)
291
{
292
  return ieee_md_atof (type, litP, sizeP, TRUE);
293
}
294
 
295
void
296
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
297
                 asection *sec ATTRIBUTE_UNUSED,
298
                 fragS *fragP ATTRIBUTE_UNUSED)
299
{
300
  abort ();
301
}
302
 
303
valueT
304
md_section_align (asection *seg, valueT addr)
305
{
306
  int align = bfd_get_section_alignment (stdoutput, seg);
307
  return ((addr + (1 << align) - 1) & (-1 << align));
308
}
309
 
310
void
311
md_begin (void)
312
{
313
  struct d30v_opcode *opcode;
314
  d30v_hash = hash_new ();
315
 
316
  /* Insert opcode names into a hash table.  */
317
  for (opcode = (struct d30v_opcode *) d30v_opcode_table; opcode->name; opcode++)
318
      hash_insert (d30v_hash, opcode->name, (char *) opcode);
319
 
320
  fixups = &FixUps[0];
321
  FixUps[0].next = &FixUps[1];
322
  FixUps[1].next = &FixUps[0];
323
 
324
  d30v_current_align_seg = now_seg;
325
}
326
 
327
/* Remove the postincrement or postdecrement operator ( '+' or '-' )
328
   from an expression.  */
329
 
330
static int
331
postfix (char *p)
332
{
333
  while (*p != '-' && *p != '+')
334
    {
335
      if (*p == 0 || *p == '\n' || *p == '\r' || *p == ' ' || *p == ',')
336
        break;
337
      p++;
338
    }
339
 
340
  if (*p == '-')
341
    {
342
      *p = ' ';
343
      return -1;
344
    }
345
 
346
  if (*p == '+')
347
    {
348
      *p = ' ';
349
      return 1;
350
    }
351
 
352
  return 0;
353
}
354
 
355
static bfd_reloc_code_real_type
356
get_reloc (const struct d30v_operand *op, int rel_flag)
357
{
358
  switch (op->bits)
359
    {
360
    case 6:
361
      if (op->flags & OPERAND_SHIFT)
362
        return BFD_RELOC_D30V_9_PCREL;
363
      else
364
        return BFD_RELOC_D30V_6;
365
      break;
366
    case 12:
367
      if (!(op->flags & OPERAND_SHIFT))
368
        as_warn (_("unexpected 12-bit reloc type"));
369
      if (rel_flag == RELOC_PCREL)
370
        return BFD_RELOC_D30V_15_PCREL;
371
      else
372
        return BFD_RELOC_D30V_15;
373
    case 18:
374
      if (!(op->flags & OPERAND_SHIFT))
375
        as_warn (_("unexpected 18-bit reloc type"));
376
      if (rel_flag == RELOC_PCREL)
377
        return BFD_RELOC_D30V_21_PCREL;
378
      else
379
        return BFD_RELOC_D30V_21;
380
    case 32:
381
      if (rel_flag == RELOC_PCREL)
382
        return BFD_RELOC_D30V_32_PCREL;
383
      else
384
        return BFD_RELOC_D30V_32;
385
    default:
386
      return 0;
387
    }
388
}
389
 
390
/* Parse a string of operands and return an array of expressions.  */
391
 
392
static int
393
get_operands (expressionS exp[], int cmp_hack)
394
{
395
  char *p = input_line_pointer;
396
  int numops = 0;
397
  int post = 0;
398
 
399
  if (cmp_hack)
400
    {
401
      exp[numops].X_op = O_absent;
402
      exp[numops++].X_add_number = cmp_hack - 1;
403
    }
404
 
405
  while (*p)
406
    {
407
      while (*p == ' ' || *p == '\t' || *p == ',')
408
        p++;
409
 
410
      if (*p == 0 || *p == '\n' || *p == '\r')
411
        break;
412
 
413
      if (*p == '@')
414
        {
415
          p++;
416
          exp[numops].X_op = O_absent;
417
          if (*p == '(')
418
            {
419
              p++;
420
              exp[numops].X_add_number = OPERAND_ATPAR;
421
              post = postfix (p);
422
            }
423
          else if (*p == '-')
424
            {
425
              p++;
426
              exp[numops].X_add_number = OPERAND_ATMINUS;
427
            }
428
          else
429
            {
430
              exp[numops].X_add_number = OPERAND_ATSIGN;
431
              post = postfix (p);
432
            }
433
          numops++;
434
          continue;
435
        }
436
 
437
      if (*p == ')')
438
        {
439
          /* Just skip the trailing paren.  */
440
          p++;
441
          continue;
442
        }
443
 
444
      input_line_pointer = p;
445
 
446
      /* Check to see if it might be a register name.  */
447
      if (!register_name (&exp[numops]))
448
        {
449
          /* Parse as an expression.  */
450
          expression (&exp[numops]);
451
        }
452
 
453
      if (exp[numops].X_op == O_illegal)
454
        as_bad (_("illegal operand"));
455
      else if (exp[numops].X_op == O_absent)
456
        as_bad (_("missing operand"));
457
 
458
      numops++;
459
      p = input_line_pointer;
460
 
461
      switch (post)
462
        {
463
        case -1:
464
          /* Postdecrement mode.  */
465
          exp[numops].X_op = O_absent;
466
          exp[numops++].X_add_number = OPERAND_MINUS;
467
          break;
468
        case 1:
469
          /* Postincrement mode.  */
470
          exp[numops].X_op = O_absent;
471
          exp[numops++].X_add_number = OPERAND_PLUS;
472
          break;
473
        }
474
      post = 0;
475
    }
476
 
477
  exp[numops].X_op = 0;
478
 
479
  return numops;
480
}
481
 
482
/* Generate the instruction.
483
   It does everything but write the FM bits.  */
484
 
485
static long long
486
build_insn (struct d30v_insn *opcode, expressionS *opers)
487
{
488
  int i, length, bits, shift, flags;
489
  unsigned long number, id = 0;
490
  long long insn;
491
  struct d30v_opcode *op = opcode->op;
492
  struct d30v_format *form = opcode->form;
493
 
494
  insn =
495
    opcode->ecc << 28 | op->op1 << 25 | op->op2 << 20 | form->modifier << 18;
496
 
497
  for (i = 0; form->operands[i]; i++)
498
    {
499
      flags = d30v_operand_table[form->operands[i]].flags;
500
 
501
      /* Must be a register or number.  */
502
      if (!(flags & OPERAND_REG) && !(flags & OPERAND_NUM)
503
          && !(flags & OPERAND_NAME) && !(flags & OPERAND_SPECIAL))
504
        continue;
505
 
506
      bits = d30v_operand_table[form->operands[i]].bits;
507
      if (flags & OPERAND_SHIFT)
508
        bits += 3;
509
 
510
      length = d30v_operand_table[form->operands[i]].length;
511
      shift = 12 - d30v_operand_table[form->operands[i]].position;
512
      if (opers[i].X_op != O_symbol)
513
        number = opers[i].X_add_number;
514
      else
515
        number = 0;
516
      if (flags & OPERAND_REG)
517
        {
518
          /* Check for mvfsys or mvtsys control registers.  */
519
          if (flags & OPERAND_CONTROL && (number & 0x7f) > MAX_CONTROL_REG)
520
            {
521
              /* PSWL or PSWH.  */
522
              id = (number & 0x7f) - MAX_CONTROL_REG;
523
              number = 0;
524
            }
525
          else if (number & OPERAND_FLAG)
526
            /* NUMBER is a flag register.  */
527
            id = 3;
528
 
529
          number &= 0x7F;
530
        }
531
      else if (flags & OPERAND_SPECIAL)
532
        number = id;
533
 
534
      if (opers[i].X_op != O_register && opers[i].X_op != O_constant
535
          && !(flags & OPERAND_NAME))
536
        {
537
          /* Now create a fixup.  */
538
          if (fixups->fc >= MAX_INSN_FIXUPS)
539
            as_fatal (_("too many fixups"));
540
 
541
          fixups->fix[fixups->fc].reloc =
542
            get_reloc (d30v_operand_table + form->operands[i], op->reloc_flag);
543
          fixups->fix[fixups->fc].size = 4;
544
          fixups->fix[fixups->fc].exp = opers[i];
545
          fixups->fix[fixups->fc].operand = form->operands[i];
546
          if (fixups->fix[fixups->fc].reloc == BFD_RELOC_D30V_9_PCREL)
547
            fixups->fix[fixups->fc].pcrel = RELOC_PCREL;
548
          else
549
            fixups->fix[fixups->fc].pcrel = op->reloc_flag;
550
          (fixups->fc)++;
551
        }
552
 
553
      /* Truncate to the proper number of bits.  */
554
      if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
555
        as_bad (_("operand out of range: %ld"), number);
556
      if (bits < 31)
557
        number &= 0x7FFFFFFF >> (31 - bits);
558
      if (flags & OPERAND_SHIFT)
559
        number >>= 3;
560
      if (bits == 32)
561
        {
562
          /* It's a LONG instruction.  */
563
          insn |= ((number & 0xffffffff) >> 26);        /* Top 6 bits.  */
564
          insn <<= 32;                  /* Shift the first word over.  */
565
          insn |= ((number & 0x03FC0000) << 2);         /* Next 8 bits.  */
566
          insn |= number & 0x0003FFFF;                  /* Bottom 18 bits.  */
567
        }
568
      else
569
        insn |= number << shift;
570
    }
571
 
572
  return insn;
573
}
574
 
575
static void
576
d30v_number_to_chars (char *buf,        /* Return 'nbytes' of chars here.  */
577
                      long long value,  /* The value of the bits.  */
578
                      int n)            /* Number of bytes in the output.  */
579
{
580
  while (n--)
581
    {
582
      buf[n] = value & 0xff;
583
      value >>= 8;
584
    }
585
}
586
 
587
/* Write out a long form instruction.  */
588
 
589
static void
590
write_long (struct d30v_insn *opcode ATTRIBUTE_UNUSED,
591
            long long insn,
592
            Fixups *fx)
593
{
594
  int i, where;
595
  char *f = frag_more (8);
596
 
597
  dwarf2_emit_insn (8);
598
  insn |= FM11;
599
  d30v_number_to_chars (f, insn, 8);
600
 
601
  for (i = 0; i < fx->fc; i++)
602
    {
603
      if (fx->fix[i].reloc)
604
        {
605
          where = f - frag_now->fr_literal;
606
          fix_new_exp (frag_now, where, fx->fix[i].size, &(fx->fix[i].exp),
607
                       fx->fix[i].pcrel, fx->fix[i].reloc);
608
        }
609
    }
610
 
611
  fx->fc = 0;
612
}
613
 
614
/* Write out a short form instruction by itself.  */
615
 
616
static void
617
write_1_short (struct d30v_insn *opcode,
618
               long long insn,
619
               Fixups *fx,
620
               int use_sequential)
621
{
622
  char *f = frag_more (8);
623
  int i, where;
624
 
625
  dwarf2_emit_insn (8);
626
  if (warn_nops == NOP_ALL)
627
    as_warn (_("%s NOP inserted"), use_sequential ?
628
             _("sequential") : _("parallel"));
629
 
630
  /* The other container needs to be NOP.  */
631
  if (use_sequential)
632
    {
633
      /* Use a sequential NOP rather than a parallel one,
634
         as the current instruction is a FLAG_MUL32 type one
635
         and the next instruction is a load.  */
636
 
637
      /* According to 4.3.1: for FM=01, sub-instructions performed
638
         only by IU cannot be encoded in L-container.  */
639
      if (opcode->op->unit == IU)
640
        /* Right then left.  */
641
        insn |= FM10 | NOP_LEFT;
642
      else
643
        /* Left then right.  */
644
        insn = FM01 | (insn << 32) | NOP_RIGHT;
645
    }
646
  else
647
    {
648
      /* According to 4.3.1: for FM=00, sub-instructions performed
649
         only by IU cannot be encoded in L-container.  */
650
      if (opcode->op->unit == IU)
651
        /* Right container.  */
652
        insn |= FM00 | NOP_LEFT;
653
      else
654
        /* Left container.  */
655
        insn = FM00 | (insn << 32) | NOP_RIGHT;
656
    }
657
 
658
  d30v_number_to_chars (f, insn, 8);
659
 
660
  for (i = 0; i < fx->fc; i++)
661
    {
662
      if (fx->fix[i].reloc)
663
        {
664
          where = f - frag_now->fr_literal;
665
          fix_new_exp (frag_now,
666
                       where,
667
                       fx->fix[i].size,
668
                       &(fx->fix[i].exp),
669
                       fx->fix[i].pcrel,
670
                       fx->fix[i].reloc);
671
        }
672
    }
673
 
674
  fx->fc = 0;
675
}
676
 
677
/* Check 2 instructions and determine if they can be safely
678
   executed in parallel.  Return 1 if they can be.  */
679
 
680
static int
681
parallel_ok (struct d30v_insn *op1,
682
             unsigned long insn1,
683
             struct d30v_insn *op2,
684
             unsigned long insn2,
685
             exec_type_enum exec_type)
686
{
687
  int i, j, shift, regno, bits, ecc;
688
  unsigned long flags, mask, flags_set1, flags_set2, flags_used1, flags_used2;
689
  unsigned long ins, mod_reg[2][3], used_reg[2][3], flag_reg[2];
690
  struct d30v_format *f;
691
  struct d30v_opcode *op;
692
 
693
  /* Section 4.3: Both instructions must not be IU or MU only.  */
694
  if ((op1->op->unit == IU && op2->op->unit == IU)
695
      || (op1->op->unit == MU && op2->op->unit == MU))
696
    return 0;
697
 
698
  /* First instruction must not be a jump to safely optimize, unless this
699
     is an explicit parallel operation.  */
700
  if (exec_type != EXEC_PARALLEL
701
      && (op1->op->flags_used & (FLAG_JMP | FLAG_JSR)))
702
    return 0;
703
 
704
  /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
705
     then it is safe to allow the two to be done as parallel ops, since only
706
     one will ever be executed at a time.  */
707
  if ((op1->ecc == ECC_TX && op2->ecc == ECC_FX)
708
      || (op1->ecc == ECC_FX && op2->ecc == ECC_TX)
709
      || (op1->ecc == ECC_XT && op2->ecc == ECC_XF)
710
      || (op1->ecc == ECC_XF && op2->ecc == ECC_XT))
711
    return 1;
712
 
713
  /* [0] r0-r31
714
     [1] r32-r63
715
     [2] a0, a1, flag registers.  */
716
  for (j = 0; j < 2; j++)
717
    {
718
      if (j == 0)
719
        {
720
          f = op1->form;
721
          op = op1->op;
722
          ecc = op1->ecc;
723
          ins = insn1;
724
        }
725
      else
726
        {
727
          f = op2->form;
728
          op = op2->op;
729
          ecc = op2->ecc;
730
          ins = insn2;
731
        }
732
 
733
      flag_reg[j] = 0;
734
      mod_reg[j][0] = mod_reg[j][1] = 0;
735
      used_reg[j][0] = used_reg[j][1] = 0;
736
 
737
      if (flag_explicitly_parallel)
738
        {
739
          /* For human specified parallel instructions we have been asked
740
             to ignore the possibility that both instructions could modify
741
             bits in the PSW, so we initialise the mod & used arrays to 0.
742
             We have been asked, however, to refuse to allow parallel
743
             instructions which explicitly set the same flag register,
744
             eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
745
             for the use of a flag register and set a bit in the mod or used
746
             array appropriately.  */
747
          mod_reg[j][2]  = 0;
748
          used_reg[j][2] = 0;
749
        }
750
      else
751
        {
752
          mod_reg[j][2] = (op->flags_set & FLAG_ALL);
753
          used_reg[j][2] = (op->flags_used & FLAG_ALL);
754
        }
755
 
756
      /* BSR/JSR always sets R62.  */
757
      if (op->flags_used & FLAG_JSR)
758
        mod_reg[j][1] = (1L << (62 - 32));
759
 
760
      /* Conditional execution affects the flags_used.  */
761
      switch (ecc)
762
        {
763
        case ECC_TX:
764
        case ECC_FX:
765
          used_reg[j][2] |= flag_reg[j] = FLAG_0;
766
          break;
767
 
768
        case ECC_XT:
769
        case ECC_XF:
770
          used_reg[j][2] |= flag_reg[j] = FLAG_1;
771
          break;
772
 
773
        case ECC_TT:
774
        case ECC_TF:
775
          used_reg[j][2] |= flag_reg[j] = (FLAG_0 | FLAG_1);
776
          break;
777
        }
778
 
779
      for (i = 0; f->operands[i]; i++)
780
        {
781
          flags = d30v_operand_table[f->operands[i]].flags;
782
          shift = 12 - d30v_operand_table[f->operands[i]].position;
783
          bits = d30v_operand_table[f->operands[i]].bits;
784
          if (bits == 32)
785
            mask = 0xffffffff;
786
          else
787
            mask = 0x7FFFFFFF >> (31 - bits);
788
 
789
          if ((flags & OPERAND_PLUS) || (flags & OPERAND_MINUS))
790
            {
791
              /* This is a post-increment or post-decrement.
792
                 The previous register needs to be marked as modified.  */
793
              shift = 12 - d30v_operand_table[f->operands[i - 1]].position;
794
              regno = (ins >> shift) & 0x3f;
795
              if (regno >= 32)
796
                mod_reg[j][1] |= 1L << (regno - 32);
797
              else
798
                mod_reg[j][0] |= 1L << regno;
799
            }
800
          else if (flags & OPERAND_REG)
801
            {
802
              regno = (ins >> shift) & mask;
803
              /* The memory write functions don't have a destination
804
                 register.  */
805
              if ((flags & OPERAND_DEST) && !(op->flags_set & FLAG_MEM))
806
                {
807
                  /* MODIFIED registers and flags.  */
808
                  if (flags & OPERAND_ACC)
809
                    {
810
                      if (regno == 0)
811
                        mod_reg[j][2] |= FLAG_A0;
812
                      else if (regno == 1)
813
                        mod_reg[j][2] |= FLAG_A1;
814
                      else
815
                        abort ();
816
                    }
817
                  else if (flags & OPERAND_FLAG)
818
                    mod_reg[j][2] |= 1L << regno;
819
                  else if (!(flags & OPERAND_CONTROL))
820
                    {
821
                      int r, z;
822
 
823
                      /* Need to check if there are two destination
824
                         registers, for example ld2w.  */
825
                      if (flags & OPERAND_2REG)
826
                        z = 1;
827
                      else
828
                        z = 0;
829
 
830
                      for (r = regno; r <= regno + z; r++)
831
                        {
832
                          if (r >= 32)
833
                            mod_reg[j][1] |= 1L << (r - 32);
834
                          else
835
                            mod_reg[j][0] |= 1L << r;
836
                        }
837
                    }
838
                }
839
              else
840
                {
841
                  /* USED, but not modified registers and flags.  */
842
                  if (flags & OPERAND_ACC)
843
                    {
844
                      if (regno == 0)
845
                        used_reg[j][2] |= FLAG_A0;
846
                      else if (regno == 1)
847
                        used_reg[j][2] |= FLAG_A1;
848
                      else
849
                        abort ();
850
                    }
851
                  else if (flags & OPERAND_FLAG)
852
                    used_reg[j][2] |= 1L << regno;
853
                  else if (!(flags & OPERAND_CONTROL))
854
                    {
855
                      int r, z;
856
 
857
                      /* Need to check if there are two source
858
                         registers, for example st2w.  */
859
                      if (flags & OPERAND_2REG)
860
                        z = 1;
861
                      else
862
                        z = 0;
863
 
864
                      for (r = regno; r <= regno + z; r++)
865
                        {
866
                          if (r >= 32)
867
                            used_reg[j][1] |= 1L << (r - 32);
868
                          else
869
                            used_reg[j][0] |= 1L << r;
870
                        }
871
                    }
872
                }
873
            }
874
        }
875
    }
876
 
877
  flags_set1 = op1->op->flags_set;
878
  flags_set2 = op2->op->flags_set;
879
  flags_used1 = op1->op->flags_used;
880
  flags_used2 = op2->op->flags_used;
881
 
882
  /* Check for illegal combinations with ADDppp/SUBppp.  */
883
  if (((flags_set1 & FLAG_NOT_WITH_ADDSUBppp) != 0
884
       && (flags_used2 & FLAG_ADDSUBppp) != 0)
885
      || ((flags_set2 & FLAG_NOT_WITH_ADDSUBppp) != 0
886
          && (flags_used1 & FLAG_ADDSUBppp) != 0))
887
    return 0;
888
 
889
  /* Load instruction combined with half-word multiply is illegal.  */
890
  if (((flags_used1 & FLAG_MEM) != 0 && (flags_used2 & FLAG_MUL16))
891
      || ((flags_used2 & FLAG_MEM) != 0 && (flags_used1 & FLAG_MUL16)))
892
    return 0;
893
 
894
  /* Specifically allow add || add by removing carry, overflow bits dependency.
895
     This is safe, even if an addc follows since the IU takes the argument in
896
     the right container, and it writes its results last.
897
     However, don't paralellize add followed by addc or sub followed by
898
     subb.  */
899
  if (mod_reg[0][2] == FLAG_CVVA && mod_reg[1][2] == FLAG_CVVA
900
      && (used_reg[0][2] & ~flag_reg[0]) == 0
901
      && (used_reg[1][2] & ~flag_reg[1]) == 0
902
      && op1->op->unit == EITHER && op2->op->unit == EITHER)
903
    {
904
      mod_reg[0][2] = mod_reg[1][2] = 0;
905
    }
906
 
907
  for (j = 0; j < 3; j++)
908
    {
909
      /* If the second instruction depends on the first, we obviously
910
         cannot parallelize.  Note, the mod flag implies use, so
911
         check that as well.  */
912
      /* If flag_explicitly_parallel is set, then the case of the
913
         second instruction using a register the first instruction
914
         modifies is assumed to be okay; we trust the human.  We
915
         don't trust the human if both instructions modify the same
916
         register but we do trust the human if they modify the same
917
         flags.  */
918
      /* We have now been requested not to trust the human if the
919
         instructions modify the same flag registers either.  */
920
      if (flag_explicitly_parallel)
921
        {
922
          if ((mod_reg[0][j] & mod_reg[1][j]) != 0)
923
            return 0;
924
        }
925
      else
926
        if ((mod_reg[0][j] & (mod_reg[1][j] | used_reg[1][j])) != 0)
927
          return 0;
928
    }
929
 
930
  return 1;
931
}
932
 
933
/* Write out a short form instruction if possible.
934
   Return number of instructions not written out.  */
935
 
936
static int
937
write_2_short (struct d30v_insn *opcode1,
938
               long long insn1,
939
               struct d30v_insn *opcode2,
940
               long long insn2,
941
               exec_type_enum exec_type,
942
               Fixups *fx)
943
{
944
  long long insn = NOP2;
945
  char *f;
946
  int i, j, where;
947
 
948
  if (exec_type == EXEC_SEQ
949
      && (opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR))
950
      && ((opcode1->op->flags_used & FLAG_DELAY) == 0)
951
      && ((opcode1->ecc == ECC_AL) || ! Optimizing))
952
    {
953
      /* Unconditional, non-delayed branches kill instructions in
954
         the right bin.  Conditional branches don't always but if
955
         we are not optimizing, then we have been asked to produce
956
         an error about such constructs.  For the purposes of this
957
         test, subroutine calls are considered to be branches.  */
958
      write_1_short (opcode1, insn1, fx->next, FALSE);
959
      return 1;
960
    }
961
 
962
  /* Note: we do not have to worry about subroutine calls occurring
963
     in the right hand container.  The return address is always
964
     aligned to the next 64 bit boundary, be that 64 or 32 bit away.  */
965
  switch (exec_type)
966
    {
967
    case EXEC_UNKNOWN:  /* Order not specified.  */
968
      if (Optimizing
969
          && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)
970
          && ! (   (opcode1->op->unit == EITHER_BUT_PREFER_MU
971
                 || opcode1->op->unit == MU)
972
                &&
973
                (   opcode2->op->unit == EITHER_BUT_PREFER_MU
974
                 || opcode2->op->unit == MU)))
975
        {
976
          /* Parallel.  */
977
          exec_type = EXEC_PARALLEL;
978
 
979
          if (opcode1->op->unit == IU
980
              || opcode2->op->unit == MU
981
              || opcode2->op->unit == EITHER_BUT_PREFER_MU)
982
            insn = FM00 | (insn2 << 32) | insn1;
983
          else
984
            {
985
              insn = FM00 | (insn1 << 32) | insn2;
986
              fx = fx->next;
987
            }
988
        }
989
      else if ((opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR)
990
                && ((opcode1->op->flags_used & FLAG_DELAY) == 0))
991
               || opcode1->op->flags_used & FLAG_RP)
992
        {
993
          /* We must emit (non-delayed) branch type instructions
994
             on their own with nothing in the right container.  */
995
          /* We must treat repeat instructions likewise, since the
996
             following instruction has to be separate from the repeat
997
             in order to be repeated.  */
998
          write_1_short (opcode1, insn1, fx->next, FALSE);
999
          return 1;
1000
        }
1001
      else if (prev_left_kills_right_p)
1002
        {
1003
          /* The left instruction kils the right slot, so we
1004
             must leave it empty.  */
1005
          write_1_short (opcode1, insn1, fx->next, FALSE);
1006
          return 1;
1007
        }
1008
      else if (opcode1->op->unit == IU)
1009
        {
1010
          if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1011
            {
1012
              /* Case 103810 is a request from Mitsubishi that opcodes
1013
                 with EITHER_BUT_PREFER_MU should not be executed in
1014
                 reverse sequential order.  */
1015
              write_1_short (opcode1, insn1, fx->next, FALSE);
1016
              return 1;
1017
            }
1018
 
1019
          /* Reverse sequential.  */
1020
          insn = FM10 | (insn2 << 32) | insn1;
1021
          exec_type = EXEC_REVSEQ;
1022
        }
1023
      else
1024
        {
1025
          /* Sequential.  */
1026
          insn = FM01 | (insn1 << 32) | insn2;
1027
          fx = fx->next;
1028
          exec_type = EXEC_SEQ;
1029
        }
1030
      break;
1031
 
1032
    case EXEC_PARALLEL: /* Parallel.  */
1033
      flag_explicitly_parallel = flag_xp_state;
1034
      if (! parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
1035
        as_bad (_("Instructions may not be executed in parallel"));
1036
      else if (opcode1->op->unit == IU)
1037
        {
1038
          if (opcode2->op->unit == IU)
1039
            as_bad (_("Two IU instructions may not be executed in parallel"));
1040
          as_warn (_("Swapping instruction order"));
1041
          insn = FM00 | (insn2 << 32) | insn1;
1042
        }
1043
      else if (opcode2->op->unit == MU)
1044
        {
1045
          if (opcode1->op->unit == MU)
1046
            as_bad (_("Two MU instructions may not be executed in parallel"));
1047
          else if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
1048
            as_warn (_("Executing %s in IU may not work"), opcode1->op->name);
1049
          as_warn (_("Swapping instruction order"));
1050
          insn = FM00 | (insn2 << 32) | insn1;
1051
        }
1052
      else
1053
        {
1054
          if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1055
            as_warn (_("Executing %s in IU may not work in parallel execution"),
1056
                     opcode2->op->name);
1057
 
1058
          insn = FM00 | (insn1 << 32) | insn2;
1059
          fx = fx->next;
1060
        }
1061
      flag_explicitly_parallel = 0;
1062
      break;
1063
 
1064
    case EXEC_SEQ:      /* Sequential.  */
1065
      if (opcode1->op->unit == IU)
1066
        as_bad (_("IU instruction may not be in the left container"));
1067
      if (prev_left_kills_right_p)
1068
        as_bad (_("special left instruction `%s' kills instruction "
1069
                  "`%s' in right container"),
1070
                opcode1->op->name, opcode2->op->name);
1071
      insn = FM01 | (insn1 << 32) | insn2;
1072
      fx = fx->next;
1073
      break;
1074
 
1075
    case EXEC_REVSEQ:   /* Reverse sequential.  */
1076
      if (opcode2->op->unit == MU)
1077
        as_bad (_("MU instruction may not be in the right container"));
1078
      if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
1079
        as_warn (_("Executing %s in reverse serial with %s may not work"),
1080
                 opcode1->op->name, opcode2->op->name);
1081
      else if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1082
        as_warn (_("Executing %s in IU in reverse serial may not work"),
1083
                 opcode2->op->name);
1084
      insn = FM10 | (insn1 << 32) | insn2;
1085
      fx = fx->next;
1086
      break;
1087
 
1088
    default:
1089
      as_fatal (_("unknown execution type passed to write_2_short()"));
1090
    }
1091
 
1092
  f = frag_more (8);
1093
  dwarf2_emit_insn (8);
1094
  d30v_number_to_chars (f, insn, 8);
1095
 
1096
  /* If the previous instruction was a 32-bit multiply but it is put into a
1097
     parallel container, mark the current instruction as being a 32-bit
1098
     multiply.  */
1099
  if (prev_mul32_p && exec_type == EXEC_PARALLEL)
1100
    cur_mul32_p = 1;
1101
 
1102
  for (j = 0; j < 2; j++)
1103
    {
1104
      for (i = 0; i < fx->fc; i++)
1105
        {
1106
          if (fx->fix[i].reloc)
1107
            {
1108
              where = (f - frag_now->fr_literal) + 4 * j;
1109
 
1110
              fix_new_exp (frag_now,
1111
                           where,
1112
                           fx->fix[i].size,
1113
                           &(fx->fix[i].exp),
1114
                           fx->fix[i].pcrel,
1115
                           fx->fix[i].reloc);
1116
            }
1117
        }
1118
 
1119
      fx->fc = 0;
1120
      fx = fx->next;
1121
    }
1122
 
1123
  return 0;
1124
}
1125
 
1126
/* Get a pointer to an entry in the format table.
1127
   It must look at all formats for an opcode and use the operands
1128
   to choose the correct one.  Return NULL on error.  */
1129
 
1130
static struct d30v_format *
1131
find_format (struct d30v_opcode *opcode,
1132
             expressionS myops[],
1133
             int fsize,
1134
             int cmp_hack)
1135
{
1136
  int numops, match, index, i = 0, j, k;
1137
  struct d30v_format *fm;
1138
 
1139
  if (opcode == NULL)
1140
    return NULL;
1141
 
1142
  /* Get all the operands and save them as expressions.  */
1143
  numops = get_operands (myops, cmp_hack);
1144
 
1145
  while ((index = opcode->format[i++]) != 0)
1146
    {
1147
      if (fsize == FORCE_SHORT && index >= LONG)
1148
        continue;
1149
 
1150
      if (fsize == FORCE_LONG && index < LONG)
1151
        continue;
1152
 
1153
      fm = (struct d30v_format *) &d30v_format_table[index];
1154
      k = index;
1155
      while (fm->form == index)
1156
        {
1157
          match = 1;
1158
          /* Now check the operands for compatibility.  */
1159
          for (j = 0; match && fm->operands[j]; j++)
1160
            {
1161
              int flags = d30v_operand_table[fm->operands[j]].flags;
1162
              int bits = d30v_operand_table[fm->operands[j]].bits;
1163
              int X_op = myops[j].X_op;
1164
              int num = myops[j].X_add_number;
1165
 
1166
              if (flags & OPERAND_SPECIAL)
1167
                break;
1168
              else if (X_op == O_illegal)
1169
                match = 0;
1170
              else if (flags & OPERAND_REG)
1171
                {
1172
                  if (X_op != O_register
1173
                      || ((flags & OPERAND_ACC) && !(num & OPERAND_ACC))
1174
                      || (!(flags & OPERAND_ACC) && (num & OPERAND_ACC))
1175
                      || ((flags & OPERAND_FLAG) && !(num & OPERAND_FLAG))
1176
                      || (!(flags & (OPERAND_FLAG | OPERAND_CONTROL)) && (num & OPERAND_FLAG))
1177
                      || ((flags & OPERAND_CONTROL)
1178
                          && !(num & (OPERAND_CONTROL | OPERAND_FLAG))))
1179
                    match = 0;
1180
                }
1181
              else if (((flags & OPERAND_MINUS)
1182
                        && (X_op != O_absent || num != OPERAND_MINUS))
1183
                       || ((flags & OPERAND_PLUS)
1184
                           && (X_op != O_absent || num != OPERAND_PLUS))
1185
                       || ((flags & OPERAND_ATMINUS)
1186
                           && (X_op != O_absent || num != OPERAND_ATMINUS))
1187
                       || ((flags & OPERAND_ATPAR)
1188
                           && (X_op != O_absent || num != OPERAND_ATPAR))
1189
                       || ((flags & OPERAND_ATSIGN)
1190
                           && (X_op != O_absent || num != OPERAND_ATSIGN)))
1191
                match = 0;
1192
              else if (flags & OPERAND_NUM)
1193
                {
1194
                  /* A number can be a constant or symbol expression.  */
1195
 
1196
                  /* If we have found a register name, but that name
1197
                     also matches a symbol, then re-parse the name as
1198
                     an expression.  */
1199
                  if (X_op == O_register
1200
                      && symbol_find ((char *) myops[j].X_op_symbol))
1201
                    {
1202
                      input_line_pointer = (char *) myops[j].X_op_symbol;
1203
                      expression (&myops[j]);
1204
                    }
1205
 
1206
                  /* Turn an expression into a symbol for later resolution.  */
1207
                  if (X_op != O_absent && X_op != O_constant
1208
                      && X_op != O_symbol && X_op != O_register
1209
                      && X_op != O_big)
1210
                    {
1211
                      symbolS *sym = make_expr_symbol (&myops[j]);
1212
                      myops[j].X_op = X_op = O_symbol;
1213
                      myops[j].X_add_symbol = sym;
1214
                      myops[j].X_add_number = num = 0;
1215
                    }
1216
 
1217
                  if (fm->form >= LONG)
1218
                    {
1219
                      /* If we're testing for a LONG format, either fits.  */
1220
                      if (X_op != O_constant && X_op != O_symbol)
1221
                        match = 0;
1222
                    }
1223
                  else if (fm->form < LONG
1224
                           && ((fsize == FORCE_SHORT && X_op == O_symbol)
1225
                               || (fm->form == SHORT_D2 && j == 0)))
1226
                    match = 1;
1227
 
1228
                  /* This is the tricky part.  Will the constant or symbol
1229
                     fit into the space in the current format?  */
1230
                  else if (X_op == O_constant)
1231
                    {
1232
                      if (check_range (num, bits, flags))
1233
                        match = 0;
1234
                    }
1235
                  else if (X_op == O_symbol
1236
                           && S_IS_DEFINED (myops[j].X_add_symbol)
1237
                           && S_GET_SEGMENT (myops[j].X_add_symbol) == now_seg
1238
                           && opcode->reloc_flag == RELOC_PCREL)
1239
                    {
1240
                      /* If the symbol is defined, see if the value will fit
1241
                         into the form we're considering.  */
1242
                      fragS *f;
1243
                      long value;
1244
 
1245
                      /* Calculate the current address by running through the
1246
                         previous frags and adding our current offset.  */
1247
                      value = 0;
1248
                      for (f = frchain_now->frch_root; f; f = f->fr_next)
1249
                        value += f->fr_fix + f->fr_offset;
1250
                      value = (S_GET_VALUE (myops[j].X_add_symbol) - value
1251
                               - (obstack_next_free (&frchain_now->frch_obstack)
1252
                                  - frag_now->fr_literal));
1253
                      if (check_range (value, bits, flags))
1254
                        match = 0;
1255
                    }
1256
                  else
1257
                    match = 0;
1258
                }
1259
            }
1260
          /* We're only done if the operands matched so far AND there
1261
             are no more to check.  */
1262
          if (match && myops[j].X_op == 0)
1263
            {
1264
              /* Final check - issue a warning if an odd numbered register
1265
                 is used as the first register in an instruction that reads
1266
                 or writes 2 registers.  */
1267
 
1268
              for (j = 0; fm->operands[j]; j++)
1269
                if (myops[j].X_op == O_register
1270
                    && (myops[j].X_add_number & 1)
1271
                    && (d30v_operand_table[fm->operands[j]].flags & OPERAND_2REG))
1272
                  as_warn (_("Odd numbered register used as target of multi-register instruction"));
1273
 
1274
              return fm;
1275
            }
1276
          fm = (struct d30v_format *) &d30v_format_table[++k];
1277
        }
1278
    }
1279
  return NULL;
1280
}
1281
 
1282
/* Assemble a single instruction and return an opcode.
1283
   Return -1 (an invalid opcode) on error.  */
1284
 
1285
#define NAME_BUF_LEN    20
1286
 
1287
static long long
1288
do_assemble (char *str,
1289
             struct d30v_insn *opcode,
1290
             int shortp,
1291
             int is_parallel)
1292
{
1293
  char *op_start;
1294
  char *save;
1295
  char *op_end;
1296
  char           name[NAME_BUF_LEN];
1297
  int            cmp_hack;
1298
  int            nlen = 0;
1299
  int            fsize = (shortp ? FORCE_SHORT : 0);
1300
  expressionS    myops[6];
1301
  long long      insn;
1302
 
1303
  /* Drop leading whitespace.  */
1304
  while (*str == ' ')
1305
    str++;
1306
 
1307
  /* Find the opcode end.  */
1308
  for (op_start = op_end = str;
1309
       *op_end
1310
       && nlen < (NAME_BUF_LEN - 1)
1311
       && *op_end != '/'
1312
       && !is_end_of_line[(unsigned char) *op_end] && *op_end != ' ';
1313
       op_end++)
1314
    {
1315
      name[nlen] = TOLOWER (op_start[nlen]);
1316
      nlen++;
1317
    }
1318
 
1319
  if (nlen == 0)
1320
    return -1;
1321
 
1322
  name[nlen] = 0;
1323
 
1324
  /* If there is an execution condition code, handle it.  */
1325
  if (*op_end == '/')
1326
    {
1327
      int i = 0;
1328
      while ((i < ECC_MAX) && strncasecmp (d30v_ecc_names[i], op_end + 1, 2))
1329
        i++;
1330
 
1331
      if (i == ECC_MAX)
1332
        {
1333
          char tmp[4];
1334
          strncpy (tmp, op_end + 1, 2);
1335
          tmp[2] = 0;
1336
          as_bad (_("unknown condition code: %s"), tmp);
1337
          return -1;
1338
        }
1339
      opcode->ecc = i;
1340
      op_end += 3;
1341
    }
1342
  else
1343
    opcode->ecc = ECC_AL;
1344
 
1345
  /* CMP and CMPU change their name based on condition codes.  */
1346
  if (!strncmp (name, "cmp", 3))
1347
    {
1348
      int p, i;
1349
      char **str = (char **) d30v_cc_names;
1350
      if (name[3] == 'u')
1351
        p = 4;
1352
      else
1353
        p = 3;
1354
 
1355
      for (i = 1; *str && strncmp (*str, &name[p], 2); i++, str++)
1356
        ;
1357
 
1358
      /* cmpu only supports some condition codes.  */
1359
      if (p == 4)
1360
        {
1361
          if (i < 3 || i > 6)
1362
            {
1363
              name[p + 2] = 0;
1364
              as_bad (_("cmpu doesn't support condition code %s"), &name[p]);
1365
            }
1366
        }
1367
 
1368
      if (!*str)
1369
        {
1370
          name[p + 2] = 0;
1371
          as_bad (_("unknown condition code: %s"), &name[p]);
1372
        }
1373
 
1374
      cmp_hack = i;
1375
      name[p] = 0;
1376
    }
1377
  else
1378
    cmp_hack = 0;
1379
 
1380
  /* Need to look for .s or .l.  */
1381
  if (name[nlen - 2] == '.')
1382
    {
1383
      switch (name[nlen - 1])
1384
        {
1385
        case 's':
1386
          fsize = FORCE_SHORT;
1387
          break;
1388
        case 'l':
1389
          fsize = FORCE_LONG;
1390
          break;
1391
        }
1392
      name[nlen - 2] = 0;
1393
    }
1394
 
1395
  /* Find the first opcode with the proper name.  */
1396
  opcode->op = (struct d30v_opcode *) hash_find (d30v_hash, name);
1397
  if (opcode->op == NULL)
1398
    {
1399
      as_bad (_("unknown opcode: %s"), name);
1400
      return -1;
1401
    }
1402
 
1403
  save = input_line_pointer;
1404
  input_line_pointer = op_end;
1405
  while (!(opcode->form = find_format (opcode->op, myops, fsize, cmp_hack)))
1406
    {
1407
      opcode->op++;
1408
      if (opcode->op->name == NULL || strcmp (opcode->op->name, name))
1409
        {
1410
          as_bad (_("operands for opcode `%s' do not match any valid format"),
1411
                  name);
1412
          return -1;
1413
        }
1414
    }
1415
  input_line_pointer = save;
1416
 
1417
  insn = build_insn (opcode, myops);
1418
 
1419
  /* Propagate multiply status.  */
1420
  if (insn != -1)
1421
    {
1422
      if (is_parallel && prev_mul32_p)
1423
        cur_mul32_p = 1;
1424
      else
1425
        {
1426
          prev_mul32_p = cur_mul32_p;
1427
          cur_mul32_p  = (opcode->op->flags_used & FLAG_MUL32) != 0;
1428
        }
1429
    }
1430
 
1431
  /* Propagate left_kills_right status.  */
1432
  if (insn != -1)
1433
    {
1434
      prev_left_kills_right_p = cur_left_kills_right_p;
1435
 
1436
      if (opcode->op->flags_set & FLAG_LKR)
1437
        {
1438
          cur_left_kills_right_p = 1;
1439
 
1440
          if (strcmp (opcode->op->name, "mvtsys") == 0)
1441
            {
1442
              /* Left kills right for only mvtsys only for
1443
                 PSW/PSWH/PSWL/flags target.  */
1444
              if ((myops[0].X_op == O_register) &&
1445
                  ((myops[0].X_add_number == OPERAND_CONTROL) || /* psw */
1446
                   (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+2) || /* pswh */
1447
                   (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+1) || /* pswl */
1448
                   (myops[0].X_add_number == OPERAND_FLAG+0) || /* f0 */
1449
                   (myops[0].X_add_number == OPERAND_FLAG+1) || /* f1 */
1450
                   (myops[0].X_add_number == OPERAND_FLAG+2) || /* f2 */
1451
                   (myops[0].X_add_number == OPERAND_FLAG+3) || /* f3 */
1452
                   (myops[0].X_add_number == OPERAND_FLAG+4) || /* f4 */
1453
                   (myops[0].X_add_number == OPERAND_FLAG+5) || /* f5 */
1454
                   (myops[0].X_add_number == OPERAND_FLAG+6) || /* f6 */
1455
                   (myops[0].X_add_number == OPERAND_FLAG+7))) /* f7 */
1456
                {
1457
                  cur_left_kills_right_p = 1;
1458
                }
1459
              else
1460
                {
1461
                  /* Other mvtsys target registers don't kill right
1462
                     instruction.  */
1463
                  cur_left_kills_right_p = 0;
1464
                }
1465
            } /* mvtsys */
1466
        }
1467
      else
1468
        cur_left_kills_right_p = 0;
1469
    }
1470
 
1471
  return insn;
1472
}
1473
 
1474
/* Called internally to handle all alignment needs.  This takes care
1475
   of eliding calls to frag_align if'n the cached current alignment
1476
   says we've already got it, as well as taking care of the auto-aligning
1477
   labels wrt code.  */
1478
 
1479
static void
1480
d30v_align (int n, char *pfill, symbolS *label)
1481
{
1482
  /* The front end is prone to changing segments out from under us
1483
     temporarily when -g is in effect.  */
1484
  int switched_seg_p = (d30v_current_align_seg != now_seg);
1485
 
1486
  /* Do not assume that if 'd30v_current_align >= n' and
1487
     '! switched_seg_p' that it is safe to avoid performing
1488
     this alignment request.  The alignment of the current frag
1489
     can be changed under our feet, for example by a .ascii
1490
     directive in the source code.  cf testsuite/gas/d30v/reloc.s  */
1491
  d30v_cleanup (FALSE);
1492
 
1493
  if (pfill == NULL)
1494
    {
1495
      if (n > 2
1496
          && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
1497
        {
1498
          static char const nop[4] = { 0x00, 0xf0, 0x00, 0x00 };
1499
 
1500
          /* First, make sure we're on a four-byte boundary, in case
1501
             someone has been putting .byte values the text section.  */
1502
          if (d30v_current_align < 2 || switched_seg_p)
1503
            frag_align (2, 0, 0);
1504
          frag_align_pattern (n, nop, sizeof nop, 0);
1505
        }
1506
      else
1507
        frag_align (n, 0, 0);
1508
    }
1509
  else
1510
    frag_align (n, *pfill, 0);
1511
 
1512
  if (!switched_seg_p)
1513
    d30v_current_align = n;
1514
 
1515
  if (label != NULL)
1516
    {
1517
      symbolS     *sym;
1518
      int          label_seen = FALSE;
1519
      struct frag *old_frag;
1520
      valueT       old_value;
1521
      valueT       new_value;
1522
 
1523
      gas_assert (S_GET_SEGMENT (label) == now_seg);
1524
 
1525
      old_frag  = symbol_get_frag (label);
1526
      old_value = S_GET_VALUE (label);
1527
      new_value = (valueT) frag_now_fix ();
1528
 
1529
      /* It is possible to have more than one label at a particular
1530
         address, especially if debugging is enabled, so we must
1531
         take care to adjust all the labels at this address in this
1532
         fragment.  To save time we search from the end of the symbol
1533
         list, backwards, since the symbols we are interested in are
1534
         almost certainly the ones that were most recently added.
1535
         Also to save time we stop searching once we have seen at least
1536
         one matching label, and we encounter a label that is no longer
1537
         in the target fragment.  Note, this search is guaranteed to
1538
         find at least one match when sym == label, so no special case
1539
         code is necessary.  */
1540
      for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
1541
        {
1542
          if (symbol_get_frag (sym) == old_frag
1543
              && S_GET_VALUE (sym) == old_value)
1544
            {
1545
              label_seen = TRUE;
1546
              symbol_set_frag (sym, frag_now);
1547
              S_SET_VALUE (sym, new_value);
1548
            }
1549
          else if (label_seen && symbol_get_frag (sym) != old_frag)
1550
            break;
1551
        }
1552
    }
1553
 
1554
  record_alignment (now_seg, n);
1555
}
1556
 
1557
/* This is the main entry point for the machine-dependent assembler.
1558
   STR points to a machine-dependent instruction.  This function is
1559
   supposed to emit the frags/bytes it assembles to.  For the D30V, it
1560
   mostly handles the special VLIW parsing and packing and leaves the
1561
   difficult stuff to do_assemble ().  */
1562
 
1563
static long long prev_insn = -1;
1564
static struct d30v_insn prev_opcode;
1565
static subsegT prev_subseg;
1566
static segT prev_seg = 0;
1567
 
1568
void
1569
md_assemble (char *str)
1570
{
1571
  struct d30v_insn opcode;
1572
  long long insn;
1573
  /* Execution type; parallel, etc.  */
1574
  exec_type_enum extype = EXEC_UNKNOWN;
1575
  /* Saved extype.  Used for multiline instructions.  */
1576
  static exec_type_enum etype = EXEC_UNKNOWN;
1577
  char *str2;
1578
 
1579
  if ((prev_insn != -1) && prev_seg
1580
      && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1581
    d30v_cleanup (FALSE);
1582
 
1583
  if (d30v_current_align < 3)
1584
    d30v_align (3, NULL, d30v_last_label);
1585
  else if (d30v_current_align > 3)
1586
    d30v_current_align = 3;
1587
  d30v_last_label = NULL;
1588
 
1589
  flag_explicitly_parallel = 0;
1590
  flag_xp_state = 0;
1591
  if (etype == EXEC_UNKNOWN)
1592
    {
1593
      /* Look for the special multiple instruction separators.  */
1594
      str2 = strstr (str, "||");
1595
      if (str2)
1596
        {
1597
          extype = EXEC_PARALLEL;
1598
          flag_xp_state = 1;
1599
        }
1600
      else
1601
        {
1602
          str2 = strstr (str, "->");
1603
          if (str2)
1604
            extype = EXEC_SEQ;
1605
          else
1606
            {
1607
              str2 = strstr (str, "<-");
1608
              if (str2)
1609
                extype = EXEC_REVSEQ;
1610
            }
1611
        }
1612
 
1613
      /* STR2 points to the separator, if one.  */
1614
      if (str2)
1615
        {
1616
          *str2 = 0;
1617
 
1618
          /* If two instructions are present and we already have one saved,
1619
             then first write it out.  */
1620
          d30v_cleanup (FALSE);
1621
 
1622
          /* Assemble first instruction and save it.  */
1623
          prev_insn = do_assemble (str, &prev_opcode, 1, 0);
1624
          if (prev_insn == -1)
1625
            as_bad (_("Cannot assemble instruction"));
1626
          if (prev_opcode.form != NULL && prev_opcode.form->form >= LONG)
1627
            as_bad (_("First opcode is long.  Unable to mix instructions as specified."));
1628
          fixups = fixups->next;
1629
          str = str2 + 2;
1630
          prev_seg = now_seg;
1631
          prev_subseg = now_subseg;
1632
        }
1633
    }
1634
 
1635
  insn = do_assemble (str, &opcode,
1636
                      (extype != EXEC_UNKNOWN || etype != EXEC_UNKNOWN),
1637
                      extype == EXEC_PARALLEL);
1638
  if (insn == -1)
1639
    {
1640
      if (extype != EXEC_UNKNOWN)
1641
        etype = extype;
1642
      as_bad (_("Cannot assemble instruction"));
1643
      return;
1644
    }
1645
 
1646
  if (etype != EXEC_UNKNOWN)
1647
    {
1648
      extype = etype;
1649
      etype = EXEC_UNKNOWN;
1650
    }
1651
 
1652
  /* Word multiply instructions must not be followed by either a load or a
1653
     16-bit multiply instruction in the next cycle.  */
1654
  if (   (extype != EXEC_REVSEQ)
1655
      && prev_mul32_p
1656
      && (opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1657
    {
1658
      /* However, load and multiply should able to be combined in a parallel
1659
         operation, so check for that first.  */
1660
      if (prev_insn != -1
1661
          && (opcode.op->flags_used & FLAG_MEM)
1662
          && opcode.form->form < LONG
1663
          && (extype == EXEC_PARALLEL || (Optimizing && extype == EXEC_UNKNOWN))
1664
          && parallel_ok (&prev_opcode, (long) prev_insn,
1665
                          &opcode, (long) insn, extype)
1666
          && write_2_short (&prev_opcode, (long) prev_insn,
1667
                            &opcode, (long) insn, extype, fixups) == 0)
1668
        {
1669
          /* No instructions saved.  */
1670
          prev_insn = -1;
1671
          return;
1672
        }
1673
      else
1674
        {
1675
          /* Can't parallelize, flush previous instruction and emit a
1676
             word of NOPS, unless the previous instruction is a NOP,
1677
             in which case just flush it, as this will generate a word
1678
             of NOPs for us.  */
1679
 
1680
          if (prev_insn != -1 && (strcmp (prev_opcode.op->name, "nop") == 0))
1681
            d30v_cleanup (FALSE);
1682
          else
1683
            {
1684
              char *f;
1685
 
1686
              if (prev_insn != -1)
1687
                d30v_cleanup (TRUE);
1688
              else
1689
                {
1690
                  f = frag_more (8);
1691
                  dwarf2_emit_insn (8);
1692
                  d30v_number_to_chars (f, NOP2, 8);
1693
 
1694
                  if (warn_nops == NOP_ALL || warn_nops == NOP_MULTIPLY)
1695
                    {
1696
                      if (opcode.op->flags_used & FLAG_MEM)
1697
                        as_warn (_("word of NOPs added between word multiply and load"));
1698
                      else
1699
                        as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
1700
                    }
1701
                }
1702
            }
1703
 
1704
          extype = EXEC_UNKNOWN;
1705
        }
1706
    }
1707
  else if (   (extype == EXEC_REVSEQ)
1708
           && cur_mul32_p
1709
           && (prev_opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1710
    {
1711
      /* Can't parallelize, flush current instruction and add a
1712
         sequential NOP.  */
1713
      write_1_short (&opcode, (long) insn, fixups->next->next, TRUE);
1714
 
1715
      /* Make the previous instruction the current one.  */
1716
      extype = EXEC_UNKNOWN;
1717
      insn = prev_insn;
1718
      now_seg = prev_seg;
1719
      now_subseg = prev_subseg;
1720
      prev_insn = -1;
1721
      cur_mul32_p = prev_mul32_p;
1722
      prev_mul32_p = 0;
1723
      memcpy (&opcode, &prev_opcode, sizeof (prev_opcode));
1724
    }
1725
 
1726
  /* If this is a long instruction, write it and any previous short
1727
     instruction.  */
1728
  if (opcode.form->form >= LONG)
1729
    {
1730
      if (extype != EXEC_UNKNOWN)
1731
        as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1732
      d30v_cleanup (FALSE);
1733
      write_long (&opcode, insn, fixups);
1734
      prev_insn = -1;
1735
    }
1736
  else if ((prev_insn != -1)
1737
           && (write_2_short
1738
               (&prev_opcode, (long) prev_insn, &opcode,
1739
                (long) insn, extype, fixups) == 0))
1740
    {
1741
      /* No instructions saved.  */
1742
      prev_insn = -1;
1743
    }
1744
  else
1745
    {
1746
      if (extype != EXEC_UNKNOWN)
1747
        as_bad (_("Unable to mix instructions as specified"));
1748
 
1749
      /* Save off last instruction so it may be packed on next pass.  */
1750
      memcpy (&prev_opcode, &opcode, sizeof (prev_opcode));
1751
      prev_insn = insn;
1752
      prev_seg = now_seg;
1753
      prev_subseg = now_subseg;
1754
      fixups = fixups->next;
1755
      prev_mul32_p = cur_mul32_p;
1756
    }
1757
}
1758
 
1759
/* If while processing a fixup, a reloc really needs to be created,
1760
   then it is done here.  */
1761
 
1762
arelent *
1763
tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1764
{
1765
  arelent *reloc;
1766
  reloc = xmalloc (sizeof (arelent));
1767
  reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1768
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1769
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1770
  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1771
  if (reloc->howto == NULL)
1772
    {
1773
      as_bad_where (fixp->fx_file, fixp->fx_line,
1774
                    _("reloc %d not supported by object file format"),
1775
                    (int) fixp->fx_r_type);
1776
      return NULL;
1777
    }
1778
 
1779
  reloc->addend = 0;
1780
  return reloc;
1781
}
1782
 
1783
int
1784
md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1785
                               asection *seg ATTRIBUTE_UNUSED)
1786
{
1787
  abort ();
1788
  return 0;
1789
}
1790
 
1791
long
1792
md_pcrel_from_section (fixS *fixp, segT sec)
1793
{
1794
  if (fixp->fx_addsy != (symbolS *) NULL
1795
      && (!S_IS_DEFINED (fixp->fx_addsy)
1796
          || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1797
    return 0;
1798
  return fixp->fx_frag->fr_address + fixp->fx_where;
1799
}
1800
 
1801
/* Called after the assembler has finished parsing the input file or
1802
   after a label is defined.  Because the D30V assembler sometimes
1803
   saves short instructions to see if it can package them with the
1804
   next instruction, there may be a short instruction that still needs
1805
   written.  */
1806
 
1807
int
1808
d30v_cleanup (int use_sequential)
1809
{
1810
  segT seg;
1811
  subsegT subseg;
1812
 
1813
  if (prev_insn != -1)
1814
    {
1815
      seg = now_seg;
1816
      subseg = now_subseg;
1817
      subseg_set (prev_seg, prev_subseg);
1818
      write_1_short (&prev_opcode, (long) prev_insn, fixups->next,
1819
                     use_sequential);
1820
      subseg_set (seg, subseg);
1821
      prev_insn = -1;
1822
      if (use_sequential)
1823
        prev_mul32_p = FALSE;
1824
    }
1825
 
1826
  return 1;
1827
}
1828
 
1829
/* This function is called at the start of every line.  It checks to
1830
   see if the first character is a '.', which indicates the start of a
1831
   pseudo-op.  If it is, then write out any unwritten instructions.  */
1832
 
1833
void
1834
d30v_start_line (void)
1835
{
1836
  char *c = input_line_pointer;
1837
 
1838
  while (ISSPACE (*c))
1839
    c++;
1840
 
1841
  if (*c == '.')
1842
    d30v_cleanup (FALSE);
1843
}
1844
 
1845
static void
1846
check_size (long value, int bits, char *file, int line)
1847
{
1848
  int tmp, max;
1849
 
1850
  if (value < 0)
1851
    tmp = ~value;
1852
  else
1853
    tmp = value;
1854
 
1855
  max = (1 << (bits - 1)) - 1;
1856
 
1857
  if (tmp > max)
1858
    as_bad_where (file, line, _("value too large to fit in %d bits"), bits);
1859
}
1860
 
1861
/* d30v_frob_label() is called when after a label is recognized.  */
1862
 
1863
void
1864
d30v_frob_label (symbolS *lab)
1865
{
1866
  /* Emit any pending instructions.  */
1867
  d30v_cleanup (FALSE);
1868
 
1869
  /* Update the label's address with the current output pointer.  */
1870
  symbol_set_frag (lab, frag_now);
1871
  S_SET_VALUE (lab, (valueT) frag_now_fix ());
1872
 
1873
  /* Record this label for future adjustment after we find out what
1874
     kind of data it references, and the required alignment therewith.  */
1875
  d30v_last_label = lab;
1876
 
1877
  dwarf2_emit_label (lab);
1878
}
1879
 
1880
/* Hook into cons for capturing alignment changes.  */
1881
 
1882
void
1883
d30v_cons_align (int size)
1884
{
1885
  int log_size;
1886
 
1887
  log_size = 0;
1888
  while ((size >>= 1) != 0)
1889
    ++log_size;
1890
 
1891
  if (d30v_current_align < log_size)
1892
    d30v_align (log_size, (char *) NULL, NULL);
1893
  else if (d30v_current_align > log_size)
1894
    d30v_current_align = log_size;
1895
  d30v_last_label = NULL;
1896
}
1897
 
1898
void
1899
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1900
{
1901
  char *where;
1902
  unsigned long insn, insn2;
1903
  long value = *valP;
1904
 
1905
  if (fixP->fx_addsy == (symbolS *) NULL)
1906
    fixP->fx_done = 1;
1907
 
1908
  /* We don't support subtracting a symbol.  */
1909
  if (fixP->fx_subsy != (symbolS *) NULL)
1910
    as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1911
 
1912
  /* Fetch the instruction, insert the fully resolved operand
1913
     value, and stuff the instruction back again.  */
1914
  where = fixP->fx_frag->fr_literal + fixP->fx_where;
1915
  insn = bfd_getb32 ((unsigned char *) where);
1916
 
1917
  switch (fixP->fx_r_type)
1918
    {
1919
    case BFD_RELOC_8:  /* Check for a bad .byte directive.  */
1920
      if (fixP->fx_addsy != NULL)
1921
        as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
1922
                fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1923
      else if (((unsigned)value) > 0xff)
1924
        as_bad (_("line %d: unable to place value %lx into a byte"),
1925
                fixP->fx_line, value);
1926
      else
1927
        *(unsigned char *) where = value;
1928
      break;
1929
 
1930
    case BFD_RELOC_16:  /* Check for a bad .short directive.  */
1931
      if (fixP->fx_addsy != NULL)
1932
        as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
1933
                fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1934
      else if (((unsigned)value) > 0xffff)
1935
        as_bad (_("line %d: unable to place value %lx into a short"),
1936
                fixP->fx_line, value);
1937
      else
1938
        bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1939
      break;
1940
 
1941
    case BFD_RELOC_64:  /* Check for a bad .quad directive.  */
1942
      if (fixP->fx_addsy != NULL)
1943
        as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
1944
                fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1945
      else
1946
        {
1947
          bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1948
          bfd_putb32 (0, ((unsigned char *) where) + 4);
1949
        }
1950
      break;
1951
 
1952
    case BFD_RELOC_D30V_6:
1953
      check_size (value, 6, fixP->fx_file, fixP->fx_line);
1954
      insn |= value & 0x3F;
1955
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1956
      break;
1957
 
1958
    case BFD_RELOC_D30V_9_PCREL:
1959
      if (fixP->fx_where & 0x7)
1960
        {
1961
          if (fixP->fx_done)
1962
            value += 4;
1963
          else
1964
            fixP->fx_r_type = BFD_RELOC_D30V_9_PCREL_R;
1965
        }
1966
      check_size (value, 9, fixP->fx_file, fixP->fx_line);
1967
      insn |= ((value >> 3) & 0x3F) << 12;
1968
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1969
      break;
1970
 
1971
    case BFD_RELOC_D30V_15:
1972
      check_size (value, 15, fixP->fx_file, fixP->fx_line);
1973
      insn |= (value >> 3) & 0xFFF;
1974
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1975
      break;
1976
 
1977
    case BFD_RELOC_D30V_15_PCREL:
1978
      if (fixP->fx_where & 0x7)
1979
        {
1980
          if (fixP->fx_done)
1981
            value += 4;
1982
          else
1983
            fixP->fx_r_type = BFD_RELOC_D30V_15_PCREL_R;
1984
        }
1985
      check_size (value, 15, fixP->fx_file, fixP->fx_line);
1986
      insn |= (value >> 3) & 0xFFF;
1987
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1988
      break;
1989
 
1990
    case BFD_RELOC_D30V_21:
1991
      check_size (value, 21, fixP->fx_file, fixP->fx_line);
1992
      insn |= (value >> 3) & 0x3FFFF;
1993
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1994
      break;
1995
 
1996
    case BFD_RELOC_D30V_21_PCREL:
1997
      if (fixP->fx_where & 0x7)
1998
        {
1999
          if (fixP->fx_done)
2000
            value += 4;
2001
          else
2002
            fixP->fx_r_type = BFD_RELOC_D30V_21_PCREL_R;
2003
        }
2004
      check_size (value, 21, fixP->fx_file, fixP->fx_line);
2005
      insn |= (value >> 3) & 0x3FFFF;
2006
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2007
      break;
2008
 
2009
    case BFD_RELOC_D30V_32:
2010
      insn2 = bfd_getb32 ((unsigned char *) where + 4);
2011
      insn |= (value >> 26) & 0x3F;             /* Top 6 bits.  */
2012
      insn2 |= ((value & 0x03FC0000) << 2);     /* Next 8 bits.  */
2013
      insn2 |= value & 0x0003FFFF;              /* Bottom 18 bits.  */
2014
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2015
      bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
2016
      break;
2017
 
2018
    case BFD_RELOC_D30V_32_PCREL:
2019
      insn2 = bfd_getb32 ((unsigned char *) where + 4);
2020
      insn |= (value >> 26) & 0x3F;             /* Top 6 bits.  */
2021
      insn2 |= ((value & 0x03FC0000) << 2);     /* Next 8 bits.  */
2022
      insn2 |= value & 0x0003FFFF;              /* Bottom 18 bits.  */
2023
      bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2024
      bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
2025
      break;
2026
 
2027
    case BFD_RELOC_32:
2028
      bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
2029
      break;
2030
 
2031
    default:
2032
      as_bad (_("line %d: unknown relocation type: 0x%x"),
2033
              fixP->fx_line, fixP->fx_r_type);
2034
    }
2035
}
2036
 
2037
/* Handle the .align pseudo-op.  This aligns to a power of two.  We
2038
   hook here to latch the current alignment.  */
2039
 
2040
static void
2041
s_d30v_align (int ignore ATTRIBUTE_UNUSED)
2042
{
2043
  int align;
2044
  char fill, *pfill = NULL;
2045
  long max_alignment = 15;
2046
 
2047
  align = get_absolute_expression ();
2048
  if (align > max_alignment)
2049
    {
2050
      align = max_alignment;
2051
      as_warn (_("Alignment too large: %d assumed"), align);
2052
    }
2053
  else if (align < 0)
2054
    {
2055
      as_warn (_("Alignment negative: 0 assumed"));
2056
      align = 0;
2057
    }
2058
 
2059
  if (*input_line_pointer == ',')
2060
    {
2061
      input_line_pointer++;
2062
      fill = get_absolute_expression ();
2063
      pfill = &fill;
2064
    }
2065
 
2066
  d30v_last_label = NULL;
2067
  d30v_align (align, pfill, NULL);
2068
 
2069
  demand_empty_rest_of_line ();
2070
}
2071
 
2072
/* Handle the .text pseudo-op.  This is like the usual one, but it
2073
   clears the saved last label and resets known alignment.  */
2074
 
2075
static void
2076
s_d30v_text (int i)
2077
 
2078
{
2079
  s_text (i);
2080
  d30v_last_label = NULL;
2081
  d30v_current_align = 0;
2082
  d30v_current_align_seg = now_seg;
2083
}
2084
 
2085
/* Handle the .data pseudo-op.  This is like the usual one, but it
2086
   clears the saved last label and resets known alignment.  */
2087
 
2088
static void
2089
s_d30v_data (int i)
2090
{
2091
  s_data (i);
2092
  d30v_last_label = NULL;
2093
  d30v_current_align = 0;
2094
  d30v_current_align_seg = now_seg;
2095
}
2096
 
2097
/* Handle the .section pseudo-op.  This is like the usual one, but it
2098
   clears the saved last label and resets known alignment.  */
2099
 
2100
static void
2101
s_d30v_section (int ignore)
2102
{
2103
  obj_elf_section (ignore);
2104
  d30v_last_label = NULL;
2105
  d30v_current_align = 0;
2106
  d30v_current_align_seg = now_seg;
2107
}
2108
 
2109
/* The target specific pseudo-ops which we support.  */
2110
const pseudo_typeS md_pseudo_table[] =
2111
{
2112
  { "word", cons, 4 },
2113
  { "hword", cons, 2 },
2114
  { "align", s_d30v_align, 0 },
2115
  { "text", s_d30v_text, 0 },
2116
  { "data", s_d30v_data, 0 },
2117
  { "section", s_d30v_section, 0 },
2118
  { "section.s", s_d30v_section, 0 },
2119
  { "sect", s_d30v_section, 0 },
2120
  { "sect.s", s_d30v_section, 0 },
2121
  { NULL, NULL, 0 }
2122
};

powered by: WebSVN 2.1.0

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