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-h8300.c] - Blame information for rev 237

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

Line No. Rev Author Line
1 205 julius
/* tc-h8300.c -- Assemble code for the Renesas H8/300
2
   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3
   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 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 the Free
20
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21
   02110-1301, USA.  */
22
 
23
/* Written By Steve Chamberlain <sac@cygnus.com>.  */
24
 
25
#include "as.h"
26
#include "subsegs.h"
27
#include "dwarf2dbg.h"
28
 
29
#define DEFINE_TABLE
30
#define h8_opcodes ops
31
#include "opcode/h8300.h"
32
#include "safe-ctype.h"
33
 
34
#ifdef OBJ_ELF
35
#include "elf/h8.h"
36
#endif
37
 
38
const char comment_chars[] = ";";
39
const char line_comment_chars[] = "#";
40
const char line_separator_chars[] = "";
41
 
42
static void sbranch (int);
43
static void h8300hmode (int);
44
static void h8300smode (int);
45
static void h8300hnmode (int);
46
static void h8300snmode (int);
47
static void h8300sxmode (int);
48
static void h8300sxnmode (int);
49
static void pint (int);
50
 
51
int Hmode;
52
int Smode;
53
int Nmode;
54
int SXmode;
55
 
56
#define PSIZE (Hmode && !Nmode ? L_32 : L_16)
57
 
58
static int bsize = L_8;         /* Default branch displacement.  */
59
 
60
struct h8_instruction
61
{
62
  int length;
63
  int noperands;
64
  int idx;
65
  int size;
66
  const struct h8_opcode *opcode;
67
};
68
 
69
static struct h8_instruction *h8_instructions;
70
 
71
static void
72
h8300hmode (int arg ATTRIBUTE_UNUSED)
73
{
74
  Hmode = 1;
75
  Smode = 0;
76
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h))
77
    as_warn (_("could not set architecture and machine"));
78
}
79
 
80
static void
81
h8300smode (int arg ATTRIBUTE_UNUSED)
82
{
83
  Smode = 1;
84
  Hmode = 1;
85
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s))
86
    as_warn (_("could not set architecture and machine"));
87
}
88
 
89
static void
90
h8300hnmode (int arg ATTRIBUTE_UNUSED)
91
{
92
  Hmode = 1;
93
  Smode = 0;
94
  Nmode = 1;
95
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn))
96
    as_warn (_("could not set architecture and machine"));
97
}
98
 
99
static void
100
h8300snmode (int arg ATTRIBUTE_UNUSED)
101
{
102
  Smode = 1;
103
  Hmode = 1;
104
  Nmode = 1;
105
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn))
106
    as_warn (_("could not set architecture and machine"));
107
}
108
 
109
static void
110
h8300sxmode (int arg ATTRIBUTE_UNUSED)
111
{
112
  Smode = 1;
113
  Hmode = 1;
114
  SXmode = 1;
115
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx))
116
    as_warn (_("could not set architecture and machine"));
117
}
118
 
119
static void
120
h8300sxnmode (int arg ATTRIBUTE_UNUSED)
121
{
122
  Smode = 1;
123
  Hmode = 1;
124
  SXmode = 1;
125
  Nmode = 1;
126
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn))
127
    as_warn (_("could not set architecture and machine"));
128
}
129
 
130
static void
131
sbranch (int size)
132
{
133
  bsize = size;
134
}
135
 
136
static void
137
pint (int arg ATTRIBUTE_UNUSED)
138
{
139
  cons (Hmode ? 4 : 2);
140
}
141
 
142
/* This table describes all the machine specific pseudo-ops the assembler
143
   has to support.  The fields are:
144
   pseudo-op name without dot
145
   function to call to execute this pseudo-op
146
   Integer arg to pass to the function.  */
147
 
148
const pseudo_typeS md_pseudo_table[] =
149
{
150
  {"h8300h",  h8300hmode,  0},
151
  {"h8300hn", h8300hnmode, 0},
152
  {"h8300s",  h8300smode,  0},
153
  {"h8300sn", h8300snmode, 0},
154
  {"h8300sx", h8300sxmode, 0},
155
  {"h8300sxn", h8300sxnmode, 0},
156
  {"sbranch", sbranch, L_8},
157
  {"lbranch", sbranch, L_16},
158
 
159
  {"int", pint, 0},
160
  {"data.b", cons, 1},
161
  {"data.w", cons, 2},
162
  {"data.l", cons, 4},
163
  {"form", listing_psize, 0},
164
  {"heading", listing_title, 0},
165
  {"import",  s_ignore, 0},
166
  {"page",    listing_eject, 0},
167
  {"program", s_ignore, 0},
168
  {0, 0, 0}
169
};
170
 
171
const char EXP_CHARS[] = "eE";
172
 
173
/* Chars that mean this number is a floating point constant
174
   As in 0f12.456
175
   or    0d1.2345e12.  */
176
const char FLT_CHARS[] = "rRsSfFdDxXpP";
177
 
178
static struct hash_control *opcode_hash_control;        /* Opcode mnemonics.  */
179
 
180
/* This function is called once, at assembler startup time.  This
181
   should set up all the tables, etc. that the MD part of the assembler
182
   needs.  */
183
 
184
void
185
md_begin (void)
186
{
187
  unsigned int nopcodes;
188
  struct h8_opcode *p, *p1;
189
  struct h8_instruction *pi;
190
  char prev_buffer[100];
191
  int idx = 0;
192
 
193
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300))
194
    as_warn (_("could not set architecture and machine"));
195
 
196
  opcode_hash_control = hash_new ();
197
  prev_buffer[0] = 0;
198
 
199
  nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode);
200
 
201
  h8_instructions = (struct h8_instruction *)
202
    xmalloc (nopcodes * sizeof (struct h8_instruction));
203
 
204
  pi = h8_instructions;
205
  p1 = h8_opcodes;
206
  /* We do a minimum amount of sorting on the opcode table; this is to
207
     make it easy to describe the mova instructions without unnecessary
208
     code duplication.
209
     Sorting only takes place inside blocks of instructions of the form
210
     X/Y, so for example mova/b, mova/w and mova/l can be intermixed.  */
211
  while (p1)
212
    {
213
      struct h8_opcode *first_skipped = 0;
214
      int len, cmplen = 0;
215
      char *src = p1->name;
216
      char *dst, *buffer;
217
 
218
      if (p1->name == 0)
219
        break;
220
      /* Strip off any . part when inserting the opcode and only enter
221
         unique codes into the hash table.  */
222
      dst = buffer = malloc (strlen (src) + 1);
223
      while (*src)
224
        {
225
          if (*src == '.')
226
            {
227
              src++;
228
              break;
229
            }
230
          if (*src == '/')
231
            cmplen = src - p1->name + 1;
232
          *dst++ = *src++;
233
        }
234
      *dst = 0;
235
      len = dst - buffer;
236
      if (cmplen == 0)
237
        cmplen = len;
238
      hash_insert (opcode_hash_control, buffer, (char *) pi);
239
      strcpy (prev_buffer, buffer);
240
      idx++;
241
 
242
      for (p = p1; p->name; p++)
243
        {
244
          /* A negative TIME is used to indicate that we've added this opcode
245
             already.  */
246
          if (p->time == -1)
247
            continue;
248
          if (strncmp (p->name, buffer, cmplen) != 0
249
              || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
250
                  && p->name[cmplen - 1] != '/'))
251
            {
252
              if (first_skipped == 0)
253
                first_skipped = p;
254
              break;
255
            }
256
          if (strncmp (p->name, buffer, len) != 0)
257
            {
258
              if (first_skipped == 0)
259
                first_skipped = p;
260
              continue;
261
            }
262
 
263
          p->time = -1;
264
          pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
265
          pi->idx = idx;
266
 
267
          /* Find the number of operands.  */
268
          pi->noperands = 0;
269
          while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
270
            pi->noperands++;
271
 
272
          /* Find the length of the opcode in bytes.  */
273
          pi->length = 0;
274
          while (p->data.nib[pi->length * 2] != (op_type) E)
275
            pi->length++;
276
 
277
          pi->opcode = p;
278
          pi++;
279
        }
280
      p1 = first_skipped;
281
    }
282
 
283
  /* Add entry for the NULL vector terminator.  */
284
  pi->length = 0;
285
  pi->noperands = 0;
286
  pi->idx = 0;
287
  pi->size = 0;
288
  pi->opcode = 0;
289
 
290
  linkrelax = 1;
291
}
292
 
293
struct h8_op
294
{
295
  op_type mode;
296
  unsigned reg;
297
  expressionS exp;
298
};
299
 
300
static void clever_message (const struct h8_instruction *, struct h8_op *);
301
static void fix_operand_size (struct h8_op *, int);
302
static void build_bytes (const struct h8_instruction *, struct h8_op *);
303
static void do_a_fix_imm (int, int, struct h8_op *, int, const struct h8_instruction *);
304
static void check_operand (struct h8_op *, unsigned int, char *);
305
static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
306
static char *get_operands (unsigned, char *, struct h8_op *);
307
static void get_operand (char **, struct h8_op *, int);
308
static int parse_reg (char *, op_type *, unsigned *, int);
309
static char *skip_colonthing (char *, int *);
310
static char *parse_exp (char *, struct h8_op *);
311
 
312
static int constant_fits_width_p (struct h8_op *, unsigned int);
313
static int constant_fits_size_p (struct h8_op *, int, int);
314
 
315
/*
316
  parse operands
317
  WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
318
  r0l,r0h,..r7l,r7h
319
  @WREG
320
  @WREG+
321
  @-WREG
322
  #const
323
  ccr
324
*/
325
 
326
/* Try to parse a reg name.  Return the number of chars consumed.  */
327
 
328
static int
329
parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
330
{
331
  char *end;
332
  int len;
333
 
334
  /* Cribbed from get_symbol_end.  */
335
  if (!is_name_beginner (*src) || *src == '\001')
336
    return 0;
337
  end = src + 1;
338
  while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
339
    end++;
340
  len = end - src;
341
 
342
  if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
343
    {
344
      *mode = PSIZE | REG | direction;
345
      *reg = 7;
346
      return len;
347
    }
348
  if (len == 3 &&
349
      TOLOWER (src[0]) == 'c' &&
350
      TOLOWER (src[1]) == 'c' &&
351
      TOLOWER (src[2]) == 'r')
352
    {
353
      *mode = CCR;
354
      *reg = 0;
355
      return len;
356
    }
357
  if (len == 3 &&
358
      TOLOWER (src[0]) == 'e' &&
359
      TOLOWER (src[1]) == 'x' &&
360
      TOLOWER (src[2]) == 'r')
361
    {
362
      *mode = EXR;
363
      *reg = 1;
364
      return len;
365
    }
366
  if (len == 3 &&
367
      TOLOWER (src[0]) == 'v' &&
368
      TOLOWER (src[1]) == 'b' &&
369
      TOLOWER (src[2]) == 'r')
370
    {
371
      *mode = VBR;
372
      *reg = 6;
373
      return len;
374
    }
375
  if (len == 3 &&
376
      TOLOWER (src[0]) == 's' &&
377
      TOLOWER (src[1]) == 'b' &&
378
      TOLOWER (src[2]) == 'r')
379
    {
380
      *mode = SBR;
381
      *reg = 7;
382
      return len;
383
    }
384
  if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
385
    {
386
      *mode = PSIZE | REG | direction;
387
      *reg = 6;
388
      return len;
389
    }
390
  if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
391
      src[2] >= '0' && src[2] <= '7')
392
    {
393
      *mode = L_32 | REG | direction;
394
      *reg = src[2] - '0';
395
      if (!Hmode)
396
        as_warn (_("Reg not valid for H8/300"));
397
      return len;
398
    }
399
  if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
400
    {
401
      *mode = L_16 | REG | direction;
402
      *reg = src[1] - '0' + 8;
403
      if (!Hmode)
404
        as_warn (_("Reg not valid for H8/300"));
405
      return len;
406
    }
407
 
408
  if (TOLOWER (src[0]) == 'r')
409
    {
410
      if (src[1] >= '0' && src[1] <= '7')
411
        {
412
          if (len == 3 && TOLOWER (src[2]) == 'l')
413
            {
414
              *mode = L_8 | REG | direction;
415
              *reg = (src[1] - '0') + 8;
416
              return len;
417
            }
418
          if (len == 3 && TOLOWER (src[2]) == 'h')
419
            {
420
              *mode = L_8 | REG | direction;
421
              *reg = (src[1] - '0');
422
              return len;
423
            }
424
          if (len == 2)
425
            {
426
              *mode = L_16 | REG | direction;
427
              *reg = (src[1] - '0');
428
              return len;
429
            }
430
        }
431
    }
432
 
433
  return 0;
434
}
435
 
436
 
437
/* Parse an immediate or address-related constant and store it in OP.
438
   If the user also specifies the operand's size, store that size
439
   in OP->MODE, otherwise leave it for later code to decide.  */
440
 
441
static char *
442
parse_exp (char *src, struct h8_op *op)
443
{
444
  char *save;
445
 
446
  save = input_line_pointer;
447
  input_line_pointer = src;
448
  expression (&op->exp);
449
  if (op->exp.X_op == O_absent)
450
    as_bad (_("missing operand"));
451
  src = input_line_pointer;
452
  input_line_pointer = save;
453
 
454
  return skip_colonthing (src, &op->mode);
455
}
456
 
457
 
458
/* If SRC starts with an explicit operand size, skip it and store the size
459
   in *MODE.  Leave *MODE unchanged otherwise.  */
460
 
461
static char *
462
skip_colonthing (char *src, int *mode)
463
{
464
  if (*src == ':')
465
    {
466
      src++;
467
      *mode &= ~SIZE;
468
      if (src[0] == '8' && !ISDIGIT (src[1]))
469
        *mode |= L_8;
470
      else if (src[0] == '2' && !ISDIGIT (src[1]))
471
        *mode |= L_2;
472
      else if (src[0] == '3' && !ISDIGIT (src[1]))
473
        *mode |= L_3;
474
      else if (src[0] == '4' && !ISDIGIT (src[1]))
475
        *mode |= L_4;
476
      else if (src[0] == '5' && !ISDIGIT (src[1]))
477
        *mode |= L_5;
478
      else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2]))
479
        *mode |= L_24;
480
      else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2]))
481
        *mode |= L_32;
482
      else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2]))
483
        *mode |= L_16;
484
      else
485
        as_bad (_("invalid operand size requested"));
486
 
487
      while (ISDIGIT (*src))
488
        src++;
489
    }
490
  return src;
491
}
492
 
493
/* The many forms of operand:
494
 
495
   Rn                   Register direct
496
   @Rn                  Register indirect
497
   @(exp[:16], Rn)      Register indirect with displacement
498
   @Rn+
499
   @-Rn
500
   @aa:8                absolute 8 bit
501
   @aa:16               absolute 16 bit
502
   @aa                  absolute 16 bit
503
 
504
   #xx[:size]           immediate data
505
   @(exp:[8], pc)       pc rel
506
   @@aa[:8]             memory indirect.  */
507
 
508
static int
509
constant_fits_width_p (struct h8_op *operand, unsigned int width)
510
{
511
  return ((operand->exp.X_add_number & ~width) == 0
512
          || (operand->exp.X_add_number | width) == (unsigned)(~0));
513
}
514
 
515
static int
516
constant_fits_size_p (struct h8_op *operand, int size, int no_symbols)
517
{
518
  offsetT num = operand->exp.X_add_number;
519
  if (no_symbols
520
      && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
521
    return 0;
522
  switch (size)
523
    {
524
    case L_2:
525
      return (num & ~3) == 0;
526
    case L_3:
527
      return (num & ~7) == 0;
528
    case L_3NZ:
529
      return num >= 1 && num < 8;
530
    case L_4:
531
      return (num & ~15) == 0;
532
    case L_5:
533
      return num >= 1 && num < 32;
534
    case L_8:
535
      return (num & ~0xFF) == 0 || ((unsigned)num | 0x7F) == ~0u;
536
    case L_8U:
537
      return (num & ~0xFF) == 0;
538
    case L_16:
539
      return (num & ~0xFFFF) == 0 || ((unsigned)num | 0x7FFF) == ~0u;
540
    case L_16U:
541
      return (num & ~0xFFFF) == 0;
542
    case L_32:
543
      return 1;
544
    default:
545
      abort ();
546
    }
547
}
548
 
549
static void
550
get_operand (char **ptr, struct h8_op *op, int direction)
551
{
552
  char *src = *ptr;
553
  op_type mode;
554
  unsigned int num;
555
  unsigned int len;
556
 
557
  op->mode = 0;
558
 
559
  /* Check for '(' and ')' for instructions ldm and stm.  */
560
  if (src[0] == '(' && src[8] == ')')
561
    ++ src;
562
 
563
  /* Gross.  Gross.  ldm and stm have a format not easily handled
564
     by get_operand.  We deal with it explicitly here.  */
565
  if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
566
      ISDIGIT (src[2]) && src[3] == '-' &&
567
      TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
568
    {
569
      int low, high;
570
 
571
      low = src[2] - '0';
572
      high = src[6] - '0';
573
 
574
       /* Check register pair's validity as per tech note TN-H8*-193A/E
575
          from Renesas for H8S and H8SX hardware manual.  */
576
      if (   !(low == 0 && (high == 1 || high == 2 || high == 3))
577
          && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode)
578
          && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode)))
579
          && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode)
580
          && !(low == 4 && (high == 5 || high == 6))
581
          && !(low == 4 && high == 7 && SXmode)
582
          && !(low == 5 && (high == 6 || high == 7) && SXmode)
583
          && !(low == 6 && high == 7 && SXmode))
584
        as_bad (_("Invalid register list for ldm/stm\n"));
585
 
586
      /* Even sicker.  We encode two registers into op->reg.  One
587
         for the low register to save, the other for the high
588
         register to save;  we also set the high bit in op->reg
589
         so we know this is "very special".  */
590
      op->reg = 0x80000000 | (high << 8) | low;
591
      op->mode = REG;
592
      if (src[7] == ')')
593
        *ptr = src + 8;
594
      else
595
        *ptr = src + 7;
596
      return;
597
    }
598
 
599
  len = parse_reg (src, &op->mode, &op->reg, direction);
600
  if (len)
601
    {
602
      src += len;
603
      if (*src == '.')
604
        {
605
          int size = op->mode & SIZE;
606
          switch (src[1])
607
            {
608
            case 'l': case 'L':
609
              if (size != L_32)
610
                as_warn (_("mismatch between register and suffix"));
611
              op->mode = (op->mode & ~MODE) | LOWREG;
612
              break;
613
            case 'w': case 'W':
614
              if (size != L_32 && size != L_16)
615
                as_warn (_("mismatch between register and suffix"));
616
              op->mode = (op->mode & ~MODE) | LOWREG;
617
              op->mode = (op->mode & ~SIZE) | L_16;
618
              break;
619
            case 'b': case 'B':
620
              op->mode = (op->mode & ~MODE) | LOWREG;
621
              if (size != L_32 && size != L_8)
622
                as_warn (_("mismatch between register and suffix"));
623
              op->mode = (op->mode & ~MODE) | LOWREG;
624
              op->mode = (op->mode & ~SIZE) | L_8;
625
              break;
626
            default:
627
              as_warn (_("invalid suffix after register."));
628
              break;
629
            }
630
          src += 2;
631
        }
632
      *ptr = src;
633
      return;
634
    }
635
 
636
  if (*src == '@')
637
    {
638
      src++;
639
      if (*src == '@')
640
        {
641
          *ptr = parse_exp (src + 1, op);
642
          if (op->exp.X_add_number >= 0x100)
643
            {
644
              int divisor = 1;
645
 
646
              op->mode = VECIND;
647
              /* FIXME : 2?  or 4?  */
648
              if (op->exp.X_add_number >= 0x400)
649
                as_bad (_("address too high for vector table jmp/jsr"));
650
              else if (op->exp.X_add_number >= 0x200)
651
                divisor = 4;
652
              else
653
                divisor = 2;
654
 
655
              op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
656
            }
657
          else
658
            op->mode = MEMIND;
659
          return;
660
        }
661
 
662
      if (*src == '-' || *src == '+')
663
        {
664
          len = parse_reg (src + 1, &mode, &num, direction);
665
          if (len == 0)
666
            {
667
              /* Oops, not a reg after all, must be ordinary exp.  */
668
              op->mode = ABS | direction;
669
              *ptr = parse_exp (src, op);
670
              return;
671
            }
672
 
673
          if (((mode & SIZE) != PSIZE)
674
              /* For Normal mode accept 16 bit and 32 bit pointer registers.  */
675
              && (!Nmode || ((mode & SIZE) != L_32)))
676
            as_bad (_("Wrong size pointer register for architecture."));
677
 
678
          op->mode = src[0] == '-' ? RDPREDEC : RDPREINC;
679
          op->reg = num;
680
          *ptr = src + 1 + len;
681
          return;
682
        }
683
      if (*src == '(')
684
        {
685
          src++;
686
 
687
          /* See if this is @(ERn.x, PC).  */
688
          len = parse_reg (src, &mode, &op->reg, direction);
689
          if (len != 0 && (mode & MODE) == REG && src[len] == '.')
690
            {
691
              switch (TOLOWER (src[len + 1]))
692
                {
693
                case 'b':
694
                  mode = PCIDXB | direction;
695
                  break;
696
                case 'w':
697
                  mode = PCIDXW | direction;
698
                  break;
699
                case 'l':
700
                  mode = PCIDXL | direction;
701
                  break;
702
                default:
703
                  mode = 0;
704
                  break;
705
                }
706
              if (mode
707
                  && src[len + 2] == ','
708
                  && TOLOWER (src[len + 3]) != 'p'
709
                  && TOLOWER (src[len + 4]) != 'c'
710
                  && src[len + 5] != ')')
711
                {
712
                  *ptr = src + len + 6;
713
                  op->mode |= mode;
714
                  return;
715
                }
716
              /* Fall through into disp case - the grammar is somewhat
717
                 ambiguous, so we should try whether it's a DISP operand
718
                 after all ("ER3.L" might be a poorly named label...).  */
719
            }
720
 
721
          /* Disp.  */
722
 
723
          /* Start off assuming a 16 bit offset.  */
724
 
725
          src = parse_exp (src, op);
726
          if (*src == ')')
727
            {
728
              op->mode |= ABS | direction;
729
              *ptr = src + 1;
730
              return;
731
            }
732
 
733
          if (*src != ',')
734
            {
735
              as_bad (_("expected @(exp, reg16)"));
736
              return;
737
            }
738
          src++;
739
 
740
          len = parse_reg (src, &mode, &op->reg, direction);
741
          if (len == 0 || (mode & MODE) != REG)
742
            {
743
              as_bad (_("expected @(exp, reg16)"));
744
              return;
745
            }
746
          src += len;
747
          if (src[0] == '.')
748
            {
749
              switch (TOLOWER (src[1]))
750
                {
751
                case 'b':
752
                  op->mode |= INDEXB | direction;
753
                  break;
754
                case 'w':
755
                  op->mode |= INDEXW | direction;
756
                  break;
757
                case 'l':
758
                  op->mode |= INDEXL | direction;
759
                  break;
760
                default:
761
                  as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
762
                }
763
              src += 2;
764
              op->reg &= 7;
765
            }
766
          else
767
            op->mode |= DISP | direction;
768
          src = skip_colonthing (src, &op->mode);
769
 
770
          if (*src != ')' && '(')
771
            {
772
              as_bad (_("expected @(exp, reg16)"));
773
              return;
774
            }
775
          *ptr = src + 1;
776
          return;
777
        }
778
      len = parse_reg (src, &mode, &num, direction);
779
 
780
      if (len)
781
        {
782
          src += len;
783
          if (*src == '+' || *src == '-')
784
            {
785
              if (((mode & SIZE) != PSIZE)
786
                  /* For Normal mode accept 16 bit and 32 bit pointer registers.  */
787
                  && (!Nmode || ((mode & SIZE) != L_32)))
788
                as_bad (_("Wrong size pointer register for architecture."));
789
              op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
790
              op->reg = num;
791
              src++;
792
              *ptr = src;
793
              return;
794
            }
795
          if (((mode & SIZE) != PSIZE)
796
              /* For Normal mode accept 16 bit and 32 bit pointer registers.  */
797
              && (!Nmode || ((mode & SIZE) != L_32)))
798
            as_bad (_("Wrong size pointer register for architecture."));
799
 
800
          op->mode = direction | IND | PSIZE;
801
          op->reg = num;
802
          *ptr = src;
803
 
804
          return;
805
        }
806
      else
807
        {
808
          /* must be a symbol */
809
 
810
          op->mode = ABS | direction;
811
          *ptr = parse_exp (src, op);
812
          return;
813
        }
814
    }
815
 
816
  if (*src == '#')
817
    {
818
      op->mode = IMM;
819
      *ptr = parse_exp (src + 1, op);
820
      return;
821
    }
822
  else if (strncmp (src, "mach", 4) == 0 ||
823
           strncmp (src, "macl", 4) == 0 ||
824
           strncmp (src, "MACH", 4) == 0 ||
825
           strncmp (src, "MACL", 4) == 0)
826
    {
827
      op->reg = TOLOWER (src[3]) == 'l';
828
      op->mode = MACREG;
829
      *ptr = src + 4;
830
      return;
831
    }
832
  else
833
    {
834
      op->mode = PCREL;
835
      *ptr = parse_exp (src, op);
836
    }
837
}
838
 
839
static char *
840
get_operands (unsigned int noperands, char *op_end, struct h8_op *operand)
841
{
842
  char *ptr = op_end;
843
 
844
  switch (noperands)
845
    {
846
    case 0:
847
      break;
848
 
849
    case 1:
850
      ptr++;
851
      get_operand (&ptr, operand + 0, SRC);
852
      if (*ptr == ',')
853
        {
854
          ptr++;
855
          get_operand (&ptr, operand + 1, DST);
856
        }
857
      break;
858
 
859
    case 2:
860
      ptr++;
861
      get_operand (&ptr, operand + 0, SRC);
862
      if (*ptr == ',')
863
        ptr++;
864
      get_operand (&ptr, operand + 1, DST);
865
      break;
866
 
867
    case 3:
868
      ptr++;
869
      get_operand (&ptr, operand + 0, SRC);
870
      if (*ptr == ',')
871
        ptr++;
872
      get_operand (&ptr, operand + 1, DST);
873
      if (*ptr == ',')
874
        ptr++;
875
      get_operand (&ptr, operand + 2, OP3);
876
      break;
877
 
878
    default:
879
      abort ();
880
    }
881
 
882
  return ptr;
883
}
884
 
885
/* MOVA has special requirements.  Rather than adding twice the amount of
886
   addressing modes, we simply special case it a bit.  */
887
static void
888
get_mova_operands (char *op_end, struct h8_op *operand)
889
{
890
  char *ptr = op_end;
891
 
892
  if (ptr[1] != '@' || ptr[2] != '(')
893
    goto error;
894
  ptr += 3;
895
  operand[0].mode = 0;
896
  ptr = parse_exp (ptr, &operand[0]);
897
 
898
  if (*ptr !=',')
899
    goto error;
900
  ptr++;
901
  get_operand (&ptr, operand + 1, DST);
902
 
903
  if (*ptr =='.')
904
    {
905
      ptr++;
906
      switch (*ptr++)
907
        {
908
        case 'b': case 'B':
909
          operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
910
          break;
911
        case 'w': case 'W':
912
          operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
913
          break;
914
        case 'l': case 'L':
915
          operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
916
          break;
917
        default:
918
          goto error;
919
        }
920
    }
921
  else if ((operand[1].mode & MODE) == LOWREG)
922
    {
923
      switch (operand[1].mode & SIZE)
924
        {
925
        case L_8:
926
          operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
927
          break;
928
        case L_16:
929
          operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
930
          break;
931
        case L_32:
932
          operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
933
          break;
934
        default:
935
          goto error;
936
        }
937
    }
938
  else
939
    goto error;
940
 
941
  if (*ptr++ != ')' || *ptr++ != ',')
942
    goto error;
943
  get_operand (&ptr, operand + 2, OP3);
944
  /* See if we can use the short form of MOVA.  */
945
  if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
946
      && (operand[2].mode & MODE) == REG
947
      && (operand[1].reg & 7) == (operand[2].reg & 7))
948
    {
949
      operand[1].mode = operand[2].mode = 0;
950
      operand[0].reg = operand[2].reg & 7;
951
    }
952
  return;
953
 
954
 error:
955
  as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
956
}
957
 
958
static void
959
get_rtsl_operands (char *ptr, struct h8_op *operand)
960
{
961
  int mode, len, type = 0;
962
  unsigned int num, num2;
963
 
964
  ptr++;
965
  if (*ptr == '(')
966
    {
967
      ptr++;
968
      type = 1;
969
    }
970
  len = parse_reg (ptr, &mode, &num, SRC);
971
  if (len == 0 || (mode & MODE) != REG)
972
    {
973
      as_bad (_("expected register"));
974
      return;
975
    }
976
  ptr += len;
977
  if (*ptr == '-')
978
    {
979
      len = parse_reg (++ptr, &mode, &num2, SRC);
980
      if (len == 0 || (mode & MODE) != REG)
981
        {
982
          as_bad (_("expected register"));
983
          return;
984
        }
985
      ptr += len;
986
      /* CONST_xxx are used as placeholders in the opcode table.  */
987
      num = num2 - num;
988
      if (num > 3)
989
        {
990
          as_bad (_("invalid register list"));
991
          return;
992
        }
993
    }
994
  else
995
    num2 = num, num = 0;
996
  if (type == 1 && *ptr++ != ')')
997
    {
998
      as_bad (_("expected closing paren"));
999
      return;
1000
    }
1001
  operand[0].mode = RS32;
1002
  operand[1].mode = RD32;
1003
  operand[0].reg = num;
1004
  operand[1].reg = num2;
1005
}
1006
 
1007
/* Passed a pointer to a list of opcodes which use different
1008
   addressing modes, return the opcode which matches the opcodes
1009
   provided.  */
1010
 
1011
static const struct h8_instruction *
1012
get_specific (const struct h8_instruction *instruction,
1013
              struct h8_op *operands, int size)
1014
{
1015
  const struct h8_instruction *this_try = instruction;
1016
  const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1017
  int found = 0;
1018
  int this_index = instruction->idx;
1019
  int noperands = 0;
1020
 
1021
  /* There's only one ldm/stm and it's easier to just
1022
     get out quick for them.  */
1023
  if (OP_KIND (instruction->opcode->how) == O_LDM
1024
      || OP_KIND (instruction->opcode->how) == O_STM)
1025
    return this_try;
1026
 
1027
  while (noperands < 3 && operands[noperands].mode != 0)
1028
    noperands++;
1029
 
1030
  while (this_index == instruction->idx && !found)
1031
    {
1032
      int this_size;
1033
 
1034
      found = 1;
1035
      this_try = instruction++;
1036
      this_size = this_try->opcode->how & SN;
1037
 
1038
      if (this_try->noperands != noperands)
1039
        found = 0;
1040
      else if (this_try->noperands > 0)
1041
        {
1042
          int i;
1043
 
1044
          for (i = 0; i < this_try->noperands && found; i++)
1045
            {
1046
              op_type op = this_try->opcode->args.nib[i];
1047
              int op_mode = op & MODE;
1048
              int op_size = op & SIZE;
1049
              int x = operands[i].mode;
1050
              int x_mode = x & MODE;
1051
              int x_size = x & SIZE;
1052
 
1053
              if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1054
                {
1055
                  if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1056
                      || (x_size == L_16 && (operands[i].reg & 8) == 8))
1057
                    as_warn (_("can't use high part of register in operand %d"), i);
1058
 
1059
                  if (x_size != op_size)
1060
                    found = 0;
1061
                }
1062
              else if (op_mode == REG)
1063
                {
1064
                  if (x_mode == LOWREG)
1065
                    x_mode = REG;
1066
                  if (x_mode != REG)
1067
                    found = 0;
1068
 
1069
                  if (x_size == L_P)
1070
                    x_size = (Hmode ? L_32 : L_16);
1071
                  if (op_size == L_P)
1072
                    op_size = (Hmode ? L_32 : L_16);
1073
 
1074
                  /* The size of the reg is v important.  */
1075
                  if (op_size != x_size)
1076
                    found = 0;
1077
                }
1078
              else if (op_mode & CTRL)  /* control register */
1079
                {
1080
                  if (!(x_mode & CTRL))
1081
                    found = 0;
1082
 
1083
                  switch (x_mode)
1084
                    {
1085
                    case CCR:
1086
                      if (op_mode != CCR &&
1087
                          op_mode != CCR_EXR &&
1088
                          op_mode != CC_EX_VB_SB)
1089
                        found = 0;
1090
                      break;
1091
                    case EXR:
1092
                      if (op_mode != EXR &&
1093
                          op_mode != CCR_EXR &&
1094
                          op_mode != CC_EX_VB_SB)
1095
                        found = 0;
1096
                      break;
1097
                    case MACH:
1098
                      if (op_mode != MACH &&
1099
                          op_mode != MACREG)
1100
                        found = 0;
1101
                      break;
1102
                    case MACL:
1103
                      if (op_mode != MACL &&
1104
                          op_mode != MACREG)
1105
                        found = 0;
1106
                      break;
1107
                    case VBR:
1108
                      if (op_mode != VBR &&
1109
                          op_mode != VBR_SBR &&
1110
                          op_mode != CC_EX_VB_SB)
1111
                        found = 0;
1112
                      break;
1113
                    case SBR:
1114
                      if (op_mode != SBR &&
1115
                          op_mode != VBR_SBR &&
1116
                          op_mode != CC_EX_VB_SB)
1117
                        found = 0;
1118
                      break;
1119
                    }
1120
                }
1121
              else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1122
                {
1123
                  operands[i].mode &= ~MODE;
1124
                  operands[i].mode |= ABSJMP;
1125
                  /* But it may not be 24 bits long.  */
1126
                  if (x_mode == ABS && !Hmode)
1127
                    {
1128
                      operands[i].mode &= ~SIZE;
1129
                      operands[i].mode |= L_16;
1130
                    }
1131
                  if ((operands[i].mode & SIZE) == L_32
1132
                      && (op_mode & SIZE) != L_32)
1133
                   found = 0;
1134
                }
1135
              else if (x_mode == IMM && op_mode != IMM)
1136
                {
1137
                  offsetT num = operands[i].exp.X_add_number;
1138
                  if (op_mode == KBIT || op_mode == DBIT)
1139
                    /* This is ok if the immediate value is sensible.  */;
1140
                  else if (op_mode == CONST_2)
1141
                    found = num == 2;
1142
                  else if (op_mode == CONST_4)
1143
                    found = num == 4;
1144
                  else if (op_mode == CONST_8)
1145
                    found = num == 8;
1146
                  else if (op_mode == CONST_16)
1147
                    found = num == 16;
1148
                  else
1149
                    found = 0;
1150
                }
1151
              else if (op_mode == PCREL && op_mode == x_mode)
1152
                {
1153
                  /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1154
                     If x_size is L_8, promote it.  */
1155
                  if (OP_KIND (this_try->opcode->how) == O_MOVSD
1156
                      || OP_KIND (this_try->opcode->how) == O_BSRBC
1157
                      || OP_KIND (this_try->opcode->how) == O_BSRBS)
1158
                    if (x_size == L_8)
1159
                      x_size = L_16;
1160
 
1161
                  /* The size of the displacement is important.  */
1162
                  if (op_size != x_size)
1163
                    found = 0;
1164
                }
1165
              else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1166
                        || op_mode == INDEXB || op_mode == INDEXW
1167
                        || op_mode == INDEXL)
1168
                       && op_mode == x_mode)
1169
                {
1170
                  /* Promote a L_24 to L_32 if it makes us match.  */
1171
                  if (x_size == L_24 && op_size == L_32)
1172
                    {
1173
                      x &= ~SIZE;
1174
                      x |= x_size = L_32;
1175
                    }
1176
 
1177
                  if (((x_size == L_16 && op_size == L_16U)
1178
                       || (x_size == L_8 && op_size == L_8U)
1179
                       || (x_size == L_3 && op_size == L_3NZ))
1180
                      /* We're deliberately more permissive for ABS modes.  */
1181
                      && (op_mode == ABS
1182
                          || constant_fits_size_p (operands + i, op_size,
1183
                                                   op & NO_SYMBOLS)))
1184
                    x_size = op_size;
1185
 
1186
                  if (x_size != 0 && op_size != x_size)
1187
                    found = 0;
1188
                  else if (x_size == 0
1189
                           && ! constant_fits_size_p (operands + i, op_size,
1190
                                                      op & NO_SYMBOLS))
1191
                    found = 0;
1192
                }
1193
              else if (op_mode != x_mode)
1194
                {
1195
                  found = 0;
1196
                }
1197
            }
1198
        }
1199
      if (found)
1200
        {
1201
          if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1202
              || (this_try->opcode->available == AV_H8S && ! Smode)
1203
              || (this_try->opcode->available == AV_H8H && ! Hmode))
1204
            found = 0, found_other = this_try;
1205
          else if (this_size != size && (this_size != SN && size != SN))
1206
            found_mismatched = this_try, found = 0;
1207
 
1208
        }
1209
    }
1210
  if (found)
1211
    return this_try;
1212
  if (found_other)
1213
    {
1214
      as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1215
               found_other->opcode->name,
1216
               (! Hmode && ! Smode ? "H8/300"
1217
                : SXmode ? "H8sx"
1218
                : Smode ? "H8/300S"
1219
                : "H8/300H"));
1220
    }
1221
  else if (found_mismatched)
1222
    {
1223
      as_warn (_("mismatch between opcode size and operand size"));
1224
      return found_mismatched;
1225
    }
1226
  return 0;
1227
}
1228
 
1229
static void
1230
check_operand (struct h8_op *operand, unsigned int width, char *string)
1231
{
1232
  if (operand->exp.X_add_symbol == 0
1233
      && operand->exp.X_op_symbol == 0)
1234
    {
1235
      /* No symbol involved, let's look at offset, it's dangerous if
1236
         any of the high bits are not 0 or ff's, find out by oring or
1237
         anding with the width and seeing if the answer is 0 or all
1238
         fs.  */
1239
 
1240
      if (! constant_fits_width_p (operand, width))
1241
        {
1242
          if (width == 255
1243
              && (operand->exp.X_add_number & 0xff00) == 0xff00)
1244
            {
1245
              /* Just ignore this one - which happens when trying to
1246
                 fit a 16 bit address truncated into an 8 bit address
1247
                 of something like bset.  */
1248
            }
1249
          else if (strcmp (string, "@") == 0
1250
                   && width == 0xffff
1251
                   && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1252
            {
1253
              /* Just ignore this one - which happens when trying to
1254
                 fit a 24 bit address truncated into a 16 bit address
1255
                 of something like mov.w.  */
1256
            }
1257
          else
1258
            {
1259
              as_warn (_("operand %s0x%lx out of range."), string,
1260
                       (unsigned long) operand->exp.X_add_number);
1261
            }
1262
        }
1263
    }
1264
}
1265
 
1266
/* RELAXMODE has one of 3 values:
1267
 
1268
 
1269
 
1270
   1 Output a relaxable 24bit absolute mov.w address relocation
1271
     (may relax into a 16bit absolute address).
1272
 
1273
   2 Output a relaxable 16/24 absolute mov.b address relocation
1274
     (may relax into an 8bit absolute address).  */
1275
 
1276
static void
1277
do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, const struct h8_instruction *this_try)
1278
{
1279
  int idx;
1280
  int size;
1281
  int where;
1282
  char *bytes = frag_now->fr_literal + offset;
1283
 
1284
  char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1285
 
1286
  if (operand->exp.X_add_symbol == 0)
1287
    {
1288
      switch (operand->mode & SIZE)
1289
        {
1290
        case L_2:
1291
          check_operand (operand, 0x3, t);
1292
          bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1293
          break;
1294
        case L_3:
1295
        case L_3NZ:
1296
          check_operand (operand, 0x7, t);
1297
          bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1298
          break;
1299
        case L_4:
1300
          check_operand (operand, 0xF, t);
1301
          bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1302
          break;
1303
        case L_5:
1304
          check_operand (operand, 0x1F, t);
1305
          bytes[0] |= operand->exp.X_add_number & 31;
1306
          break;
1307
        case L_8:
1308
        case L_8U:
1309
          check_operand (operand, 0xff, t);
1310
          bytes[0] |= operand->exp.X_add_number;
1311
          break;
1312
        case L_16:
1313
        case L_16U:
1314
          check_operand (operand, 0xffff, t);
1315
          bytes[0] |= operand->exp.X_add_number >> 8;
1316
          bytes[1] |= operand->exp.X_add_number >> 0;
1317
#ifdef OBJ_ELF
1318
          /* MOVA needs both relocs to relax the second operand properly.  */
1319
          if (relaxmode != 0
1320
              && (OP_KIND(this_try->opcode->how) == O_MOVAB
1321
                  || OP_KIND(this_try->opcode->how) == O_MOVAW
1322
                  || OP_KIND(this_try->opcode->how) == O_MOVAL))
1323
            {
1324
              idx = BFD_RELOC_16;
1325
              fix_new_exp (frag_now, offset, 2, &operand->exp, 0, idx);
1326
            }
1327
#endif
1328
          break;
1329
        case L_24:
1330
          check_operand (operand, 0xffffff, t);
1331
          bytes[0] |= operand->exp.X_add_number >> 16;
1332
          bytes[1] |= operand->exp.X_add_number >> 8;
1333
          bytes[2] |= operand->exp.X_add_number >> 0;
1334
          break;
1335
 
1336
        case L_32:
1337
          /* This should be done with bfd.  */
1338
          bytes[0] |= operand->exp.X_add_number >> 24;
1339
          bytes[1] |= operand->exp.X_add_number >> 16;
1340
          bytes[2] |= operand->exp.X_add_number >> 8;
1341
          bytes[3] |= operand->exp.X_add_number >> 0;
1342
          if (relaxmode != 0)
1343
            {
1344
              idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1345
              fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1346
            }
1347
          break;
1348
        }
1349
    }
1350
  else
1351
    {
1352
      switch (operand->mode & SIZE)
1353
        {
1354
        case L_24:
1355
        case L_32:
1356
          size = 4;
1357
          where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1358
          if (relaxmode == 2)
1359
            idx = R_MOV24B1;
1360
          else if (relaxmode == 1)
1361
            idx = R_MOVL1;
1362
          else
1363
            idx = R_RELLONG;
1364
          break;
1365
        default:
1366
          as_bad (_("Can't work out size of operand.\n"));
1367
        case L_16:
1368
        case L_16U:
1369
          size = 2;
1370
          where = 0;
1371
          if (relaxmode == 2)
1372
            idx = R_MOV16B1;
1373
          else
1374
            idx = R_RELWORD;
1375
          operand->exp.X_add_number =
1376
            ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1377
          operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1378
          break;
1379
        case L_8:
1380
          size = 1;
1381
          where = 0;
1382
          idx = R_RELBYTE;
1383
          operand->exp.X_add_number =
1384
            ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1385
          operand->exp.X_add_number |= bytes[0];
1386
        }
1387
 
1388
      fix_new_exp (frag_now,
1389
                   offset + where,
1390
                   size,
1391
                   &operand->exp,
1392
                   0,
1393
                   idx);
1394
    }
1395
}
1396
 
1397
/* Now we know what sort of opcodes it is, let's build the bytes.  */
1398
 
1399
static void
1400
build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1401
{
1402
  int i;
1403
  char *output = frag_more (this_try->length);
1404
  const op_type *nibble_ptr = this_try->opcode->data.nib;
1405
  op_type c;
1406
  unsigned int nibble_count = 0;
1407
  int op_at[3];
1408
  int nib = 0;
1409
  int movb = 0;
1410
  char asnibbles[100];
1411
  char *p = asnibbles;
1412
  int high, low;
1413
 
1414
  if (!Hmode && this_try->opcode->available != AV_H8)
1415
    as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1416
             this_try->opcode->name);
1417
  else if (!Smode
1418
           && this_try->opcode->available != AV_H8
1419
           && this_try->opcode->available != AV_H8H)
1420
    as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1421
             this_try->opcode->name);
1422
  else if (!SXmode
1423
           && this_try->opcode->available != AV_H8
1424
           && this_try->opcode->available != AV_H8H
1425
           && this_try->opcode->available != AV_H8S)
1426
    as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1427
             this_try->opcode->name);
1428
 
1429
  while (*nibble_ptr != (op_type) E)
1430
    {
1431
      int d;
1432
 
1433
      nib = 0;
1434
      c = *nibble_ptr++;
1435
 
1436
      d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1437
 
1438
      if (c < 16)
1439
        nib = c;
1440
      else
1441
        {
1442
          int c2 = c & MODE;
1443
 
1444
          if (c2 == REG || c2 == LOWREG
1445
              || c2 == IND || c2 == PREINC || c2 == PREDEC
1446
              || c2 == POSTINC || c2 == POSTDEC)
1447
            {
1448
              nib = operand[d].reg;
1449
              if (c2 == LOWREG)
1450
                nib &= 7;
1451
            }
1452
 
1453
          else if (c & CTRL)    /* Control reg operand.  */
1454
            nib = operand[d].reg;
1455
 
1456
          else if ((c & DISPREG) == (DISPREG))
1457
            {
1458
              nib = operand[d].reg;
1459
            }
1460
          else if (c2 == ABS)
1461
            {
1462
              operand[d].mode = c;
1463
              op_at[d] = nibble_count;
1464
              nib = 0;
1465
            }
1466
          else if (c2 == IMM || c2 == PCREL || c2 == ABS
1467
                   || (c & ABSJMP) || c2 == DISP)
1468
            {
1469
              operand[d].mode = c;
1470
              op_at[d] = nibble_count;
1471
              nib = 0;
1472
            }
1473
          else if ((c & IGNORE) || (c & DATA))
1474
            nib = 0;
1475
 
1476
          else if (c2 == DBIT)
1477
            {
1478
              switch (operand[0].exp.X_add_number)
1479
                {
1480
                case 1:
1481
                  nib = c;
1482
                  break;
1483
                case 2:
1484
                  nib = 0x8 | c;
1485
                  break;
1486
                default:
1487
                  as_bad (_("Need #1 or #2 here"));
1488
                }
1489
            }
1490
          else if (c2 == KBIT)
1491
            {
1492
              switch (operand[0].exp.X_add_number)
1493
                {
1494
                case 1:
1495
                  nib = 0;
1496
                  break;
1497
                case 2:
1498
                  nib = 8;
1499
                  break;
1500
                case 4:
1501
                  if (!Hmode)
1502
                    as_warn (_("#4 not valid on H8/300."));
1503
                  nib = 9;
1504
                  break;
1505
 
1506
                default:
1507
                  as_bad (_("Need #1 or #2 here"));
1508
                  break;
1509
                }
1510
              /* Stop it making a fix.  */
1511
              operand[0].mode = 0;
1512
            }
1513
 
1514
          if (c & MEMRELAX)
1515
            operand[d].mode |= MEMRELAX;
1516
 
1517
          if (c & B31)
1518
            nib |= 0x8;
1519
 
1520
          if (c & B21)
1521
            nib |= 0x4;
1522
 
1523
          if (c & B11)
1524
            nib |= 0x2;
1525
 
1526
          if (c & B01)
1527
            nib |= 0x1;
1528
 
1529
          if (c2 == MACREG)
1530
            {
1531
              if (operand[0].mode == MACREG)
1532
                /* stmac has mac[hl] as the first operand.  */
1533
                nib = 2 + operand[0].reg;
1534
              else
1535
                /* ldmac has mac[hl] as the second operand.  */
1536
                nib = 2 + operand[1].reg;
1537
            }
1538
        }
1539
      nibble_count++;
1540
 
1541
      *p++ = nib;
1542
    }
1543
 
1544
  /* Disgusting.  Why, oh why didn't someone ask us for advice
1545
     on the assembler format.  */
1546
  if (OP_KIND (this_try->opcode->how) == O_LDM)
1547
    {
1548
      high = (operand[1].reg >> 8) & 0xf;
1549
      low  = (operand[1].reg) & 0xf;
1550
      asnibbles[2] = high - low;
1551
      asnibbles[7] = high;
1552
    }
1553
  else if (OP_KIND (this_try->opcode->how) == O_STM)
1554
    {
1555
      high = (operand[0].reg >> 8) & 0xf;
1556
      low  = (operand[0].reg) & 0xf;
1557
      asnibbles[2] = high - low;
1558
      asnibbles[7] = low;
1559
    }
1560
 
1561
  for (i = 0; i < this_try->length; i++)
1562
    output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1563
 
1564
  /* Note if this is a movb or a bit manipulation instruction
1565
     there is a special relaxation which only applies.  */
1566
  if (   this_try->opcode->how == O (O_MOV,   SB)
1567
      || this_try->opcode->how == O (O_BCLR,  SB)
1568
      || this_try->opcode->how == O (O_BAND,  SB)
1569
      || this_try->opcode->how == O (O_BIAND, SB)
1570
      || this_try->opcode->how == O (O_BILD,  SB)
1571
      || this_try->opcode->how == O (O_BIOR,  SB)
1572
      || this_try->opcode->how == O (O_BIST,  SB)
1573
      || this_try->opcode->how == O (O_BIXOR, SB)
1574
      || this_try->opcode->how == O (O_BLD,   SB)
1575
      || this_try->opcode->how == O (O_BNOT,  SB)
1576
      || this_try->opcode->how == O (O_BOR,   SB)
1577
      || this_try->opcode->how == O (O_BSET,  SB)
1578
      || this_try->opcode->how == O (O_BST,   SB)
1579
      || this_try->opcode->how == O (O_BTST,  SB)
1580
      || this_try->opcode->how == O (O_BXOR,  SB))
1581
    movb = 1;
1582
 
1583
  /* Output any fixes.  */
1584
  for (i = 0; i < this_try->noperands; i++)
1585
    {
1586
      int x = operand[i].mode;
1587
      int x_mode = x & MODE;
1588
 
1589
      if (x_mode == IMM || x_mode == DISP)
1590
        do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1591
                      op_at[i] & 1, operand + i, (x & MEMRELAX) != 0,
1592
                      this_try);
1593
 
1594
      else if (x_mode == ABS)
1595
        do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1596
                      op_at[i] & 1, operand + i,
1597
                      (x & MEMRELAX) ? movb + 1 : 0,
1598
                      this_try);
1599
 
1600
      else if (x_mode == PCREL)
1601
        {
1602
          int size16 = (x & SIZE) == L_16;
1603
          int size = size16 ? 2 : 1;
1604
          int type = size16 ? R_PCRWORD : R_PCRBYTE;
1605
          fixS *fixP;
1606
 
1607
          check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1608
 
1609
          if (operand[i].exp.X_add_number & 1)
1610
            as_warn (_("branch operand has odd offset (%lx)\n"),
1611
                     (unsigned long) operand->exp.X_add_number);
1612
#ifndef OBJ_ELF
1613
          /* The COFF port has always been off by one, changing it
1614
             now would be an incompatible change, so we leave it as-is.
1615
 
1616
             We don't want to do this for ELF as we want to be
1617
             compatible with the proposed ELF format from Hitachi.  */
1618
          operand[i].exp.X_add_number -= 1;
1619
#endif
1620
          if (size16)
1621
            {
1622
              operand[i].exp.X_add_number =
1623
                ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1624
            }
1625
          else
1626
            {
1627
              operand[i].exp.X_add_number =
1628
                ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1629
            }
1630
 
1631
          /* For BRA/S.  */
1632
          if (! size16)
1633
            operand[i].exp.X_add_number |= output[op_at[i] / 2];
1634
 
1635
          fixP = fix_new_exp (frag_now,
1636
                              output - frag_now->fr_literal + op_at[i] / 2,
1637
                              size,
1638
                              &operand[i].exp,
1639
                              1,
1640
                              type);
1641
          fixP->fx_signed = 1;
1642
        }
1643
      else if (x_mode == MEMIND)
1644
        {
1645
          check_operand (operand + i, 0xff, "@@");
1646
          fix_new_exp (frag_now,
1647
                       output - frag_now->fr_literal + 1,
1648
                       1,
1649
                       &operand[i].exp,
1650
                       0,
1651
                       R_MEM_INDIRECT);
1652
        }
1653
      else if (x_mode == VECIND)
1654
        {
1655
          check_operand (operand + i, 0x7f, "@@");
1656
          /* FIXME: approximating the effect of "B31" here...
1657
             This is very hackish, and ought to be done a better way.  */
1658
          operand[i].exp.X_add_number |= 0x80;
1659
          fix_new_exp (frag_now,
1660
                       output - frag_now->fr_literal + 1,
1661
                       1,
1662
                       &operand[i].exp,
1663
                       0,
1664
                       R_MEM_INDIRECT);
1665
        }
1666
      else if (x & ABSJMP)
1667
        {
1668
          int where = 0;
1669
          bfd_reloc_code_real_type reloc_type = R_JMPL1;
1670
 
1671
#ifdef OBJ_ELF
1672
          /* To be compatible with the proposed H8 ELF format, we
1673
             want the relocation's offset to point to the first byte
1674
             that will be modified, not to the start of the instruction.  */
1675
 
1676
          if ((operand->mode & SIZE) == L_32)
1677
            {
1678
              where = 2;
1679
              reloc_type = R_RELLONG;
1680
            }
1681
          else
1682
            where = 1;
1683
#endif
1684
 
1685
          /* This jmp may be a jump or a branch.  */
1686
 
1687
          check_operand (operand + i,
1688
                         SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1689
                         "@");
1690
 
1691
          if (operand[i].exp.X_add_number & 1)
1692
            as_warn (_("branch operand has odd offset (%lx)\n"),
1693
                     (unsigned long) operand->exp.X_add_number);
1694
 
1695
          if (!Hmode)
1696
            operand[i].exp.X_add_number =
1697
              ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1698
          fix_new_exp (frag_now,
1699
                       output - frag_now->fr_literal + where,
1700
                       4,
1701
                       &operand[i].exp,
1702
                       0,
1703
                       reloc_type);
1704
        }
1705
    }
1706
}
1707
 
1708
/* Try to give an intelligent error message for common and simple to
1709
   detect errors.  */
1710
 
1711
static void
1712
clever_message (const struct h8_instruction *instruction,
1713
                struct h8_op *operand)
1714
{
1715
  /* Find out if there was more than one possible opcode.  */
1716
 
1717
  if ((instruction + 1)->idx != instruction->idx)
1718
    {
1719
      int argn;
1720
 
1721
      /* Only one opcode of this flavour, try to guess which operand
1722
         didn't match.  */
1723
      for (argn = 0; argn < instruction->noperands; argn++)
1724
        {
1725
          switch (instruction->opcode->args.nib[argn])
1726
            {
1727
            case RD16:
1728
              if (operand[argn].mode != RD16)
1729
                {
1730
                  as_bad (_("destination operand must be 16 bit register"));
1731
                  return;
1732
 
1733
                }
1734
              break;
1735
 
1736
            case RS8:
1737
              if (operand[argn].mode != RS8)
1738
                {
1739
                  as_bad (_("source operand must be 8 bit register"));
1740
                  return;
1741
                }
1742
              break;
1743
 
1744
            case ABS16DST:
1745
              if (operand[argn].mode != ABS16DST)
1746
                {
1747
                  as_bad (_("destination operand must be 16bit absolute address"));
1748
                  return;
1749
                }
1750
              break;
1751
            case RD8:
1752
              if (operand[argn].mode != RD8)
1753
                {
1754
                  as_bad (_("destination operand must be 8 bit register"));
1755
                  return;
1756
                }
1757
              break;
1758
 
1759
            case ABS16SRC:
1760
              if (operand[argn].mode != ABS16SRC)
1761
                {
1762
                  as_bad (_("source operand must be 16bit absolute address"));
1763
                  return;
1764
                }
1765
              break;
1766
 
1767
            }
1768
        }
1769
    }
1770
  as_bad (_("invalid operands"));
1771
}
1772
 
1773
 
1774
/* If OPERAND is part of an address, adjust its size and value given
1775
   that it addresses SIZE bytes.
1776
 
1777
   This function decides how big non-immediate constants are when no
1778
   size was explicitly given.  It also scales down the assembly-level
1779
   displacement in an @(d:2,ERn) operand.  */
1780
 
1781
static void
1782
fix_operand_size (struct h8_op *operand, int size)
1783
{
1784
  if (SXmode && (operand->mode & MODE) == DISP)
1785
    {
1786
      /* If the user didn't specify an operand width, see if we
1787
         can use @(d:2,ERn).  */
1788
      if ((operand->mode & SIZE) == 0
1789
          && operand->exp.X_add_symbol == 0
1790
          && operand->exp.X_op_symbol == 0
1791
          && (operand->exp.X_add_number == size
1792
              || operand->exp.X_add_number == size * 2
1793
              || operand->exp.X_add_number == size * 3))
1794
        operand->mode |= L_2;
1795
 
1796
      /* Scale down the displacement in an @(d:2,ERn) operand.
1797
         X_add_number then contains the desired field value.  */
1798
      if ((operand->mode & SIZE) == L_2)
1799
        {
1800
          if (operand->exp.X_add_number % size != 0)
1801
            as_warn (_("operand/size mis-match"));
1802
          operand->exp.X_add_number /= size;
1803
        }
1804
    }
1805
 
1806
  if ((operand->mode & SIZE) == 0)
1807
    switch (operand->mode & MODE)
1808
      {
1809
      case DISP:
1810
      case INDEXB:
1811
      case INDEXW:
1812
      case INDEXL:
1813
      case ABS:
1814
        /* Pick a 24-bit address unless we know that a 16-bit address
1815
           is safe.  get_specific() will relax L_24 into L_32 where
1816
           necessary.  */
1817
        if (Hmode
1818
            && !Nmode
1819
            && (operand->exp.X_add_number < -32768
1820
                || operand->exp.X_add_number > 32767
1821
                || operand->exp.X_add_symbol != 0
1822
                || operand->exp.X_op_symbol != 0))
1823
          operand->mode |= L_24;
1824
        else
1825
          operand->mode |= L_16;
1826
        break;
1827
 
1828
      case PCREL:
1829
        /* This condition is long standing, though somewhat suspect.  */
1830
        if (operand->exp.X_add_number > -128
1831
            && operand->exp.X_add_number < 127)
1832
          {
1833
            if (operand->exp.X_add_symbol != NULL)
1834
              operand->mode |= bsize;
1835
            else
1836
              operand->mode |= L_8;
1837
          }
1838
        else
1839
          operand->mode |= L_16;
1840
        break;
1841
      }
1842
}
1843
 
1844
 
1845
/* This is the guts of the machine-dependent assembler.  STR points to
1846
   a machine dependent instruction.  This function is supposed to emit
1847
   the frags/bytes it assembles.  */
1848
 
1849
void
1850
md_assemble (char *str)
1851
{
1852
  char *op_start;
1853
  char *op_end;
1854
  struct h8_op operand[3];
1855
  const struct h8_instruction *instruction;
1856
  const struct h8_instruction *prev_instruction;
1857
 
1858
  char *dot = 0;
1859
  char *slash = 0;
1860
  char c;
1861
  int size, i;
1862
 
1863
  /* Drop leading whitespace.  */
1864
  while (*str == ' ')
1865
    str++;
1866
 
1867
  /* Find the op code end.  */
1868
  for (op_start = op_end = str;
1869
       *op_end != 0 && *op_end != ' ';
1870
       op_end++)
1871
    {
1872
      if (*op_end == '.')
1873
        {
1874
          dot = op_end + 1;
1875
          *op_end = 0;
1876
          op_end += 2;
1877
          break;
1878
        }
1879
      else if (*op_end == '/' && ! slash)
1880
        slash = op_end;
1881
    }
1882
 
1883
  if (op_end == op_start)
1884
    {
1885
      as_bad (_("can't find opcode "));
1886
    }
1887
  c = *op_end;
1888
 
1889
  *op_end = 0;
1890
 
1891
  /* The assembler stops scanning the opcode at slashes, so it fails
1892
     to make characters following them lower case.  Fix them.  */
1893
  if (slash)
1894
    while (*++slash)
1895
      *slash = TOLOWER (*slash);
1896
 
1897
  instruction = (const struct h8_instruction *)
1898
    hash_find (opcode_hash_control, op_start);
1899
 
1900
  if (instruction == NULL)
1901
    {
1902
      as_bad (_("unknown opcode"));
1903
      return;
1904
    }
1905
 
1906
  /* We used to set input_line_pointer to the result of get_operands,
1907
     but that is wrong.  Our caller assumes we don't change it.  */
1908
 
1909
  operand[0].mode = 0;
1910
  operand[1].mode = 0;
1911
  operand[2].mode = 0;
1912
 
1913
  if (OP_KIND (instruction->opcode->how) == O_MOVAB
1914
      || OP_KIND (instruction->opcode->how) == O_MOVAW
1915
      || OP_KIND (instruction->opcode->how) == O_MOVAL)
1916
    get_mova_operands (op_end, operand);
1917
  else if (OP_KIND (instruction->opcode->how) == O_RTEL
1918
           || OP_KIND (instruction->opcode->how) == O_RTSL)
1919
    get_rtsl_operands (op_end, operand);
1920
  else
1921
    get_operands (instruction->noperands, op_end, operand);
1922
 
1923
  *op_end = c;
1924
  prev_instruction = instruction;
1925
 
1926
  /* Now we have operands from instruction.
1927
     Let's check them out for ldm and stm.  */
1928
  if (OP_KIND (instruction->opcode->how) == O_LDM)
1929
    {
1930
      /* The first operand must be @er7+, and the
1931
         second operand must be a register pair.  */
1932
      if ((operand[0].mode != RSINC)
1933
           || (operand[0].reg != 7)
1934
           || ((operand[1].reg & 0x80000000) == 0))
1935
        as_bad (_("invalid operand in ldm"));
1936
    }
1937
  else if (OP_KIND (instruction->opcode->how) == O_STM)
1938
    {
1939
      /* The first operand must be a register pair,
1940
         and the second operand must be @-er7.  */
1941
      if (((operand[0].reg & 0x80000000) == 0)
1942
            || (operand[1].mode != RDDEC)
1943
            || (operand[1].reg != 7))
1944
        as_bad (_("invalid operand in stm"));
1945
    }
1946
 
1947
  size = SN;
1948
  if (dot)
1949
    {
1950
      switch (TOLOWER (*dot))
1951
        {
1952
        case 'b':
1953
          size = SB;
1954
          break;
1955
 
1956
        case 'w':
1957
          size = SW;
1958
          break;
1959
 
1960
        case 'l':
1961
          size = SL;
1962
          break;
1963
        }
1964
    }
1965
  if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
1966
      OP_KIND (instruction->opcode->how) == O_MOVAW ||
1967
      OP_KIND (instruction->opcode->how) == O_MOVAL)
1968
    {
1969
      switch (operand[0].mode & MODE)
1970
        {
1971
        case INDEXB:
1972
        default:
1973
          fix_operand_size (&operand[1], 1);
1974
          break;
1975
        case INDEXW:
1976
          fix_operand_size (&operand[1], 2);
1977
          break;
1978
        case INDEXL:
1979
          fix_operand_size (&operand[1], 4);
1980
          break;
1981
        }
1982
    }
1983
  else
1984
    {
1985
      for (i = 0; i < 3 && operand[i].mode != 0; i++)
1986
        switch (size)
1987
          {
1988
          case SN:
1989
          case SB:
1990
          default:
1991
            fix_operand_size (&operand[i], 1);
1992
            break;
1993
          case SW:
1994
            fix_operand_size (&operand[i], 2);
1995
            break;
1996
          case SL:
1997
            fix_operand_size (&operand[i], 4);
1998
            break;
1999
          }
2000
    }
2001
 
2002
  instruction = get_specific (instruction, operand, size);
2003
 
2004
  if (instruction == 0)
2005
    {
2006
      /* Couldn't find an opcode which matched the operands.  */
2007
      char *where = frag_more (2);
2008
 
2009
      where[0] = 0x0;
2010
      where[1] = 0x0;
2011
      clever_message (prev_instruction, operand);
2012
 
2013
      return;
2014
    }
2015
 
2016
  build_bytes (instruction, operand);
2017
 
2018
  dwarf2_emit_insn (instruction->length);
2019
}
2020
 
2021
symbolS *
2022
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2023
{
2024
  return 0;
2025
}
2026
 
2027
/* Various routines to kill one day.  */
2028
 
2029
char *
2030
md_atof (int type, char *litP, int *sizeP)
2031
{
2032
  return ieee_md_atof (type, litP, sizeP, TRUE);
2033
}
2034
 
2035
#define OPTION_H_TICK_HEX      (OPTION_MD_BASE)
2036
 
2037
const char *md_shortopts = "";
2038
struct option md_longopts[] = {
2039
  { "h-tick-hex", no_argument,        NULL, OPTION_H_TICK_HEX  },
2040
  {NULL, no_argument, NULL, 0}
2041
};
2042
 
2043
size_t md_longopts_size = sizeof (md_longopts);
2044
 
2045
int
2046
md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
2047
{
2048
  switch (c)
2049
    {
2050
    case OPTION_H_TICK_HEX:
2051
      enable_h_tick_hex = 1;
2052
      break;
2053
 
2054
    default:
2055
      return 0;
2056
    }
2057
  return 1;
2058
}
2059
 
2060
void
2061
md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
2062
{
2063
}
2064
 
2065
void tc_aout_fix_to_chars (void);
2066
 
2067
void
2068
tc_aout_fix_to_chars (void)
2069
{
2070
  printf (_("call to tc_aout_fix_to_chars \n"));
2071
  abort ();
2072
}
2073
 
2074
void
2075
md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
2076
                 segT seg ATTRIBUTE_UNUSED,
2077
                 fragS *fragP ATTRIBUTE_UNUSED)
2078
{
2079
  printf (_("call to md_convert_frag \n"));
2080
  abort ();
2081
}
2082
 
2083
valueT
2084
md_section_align (segT segment, valueT size)
2085
{
2086
  int align = bfd_get_section_alignment (stdoutput, segment);
2087
  return ((size + (1 << align) - 1) & (-1 << align));
2088
}
2089
 
2090
void
2091
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2092
{
2093
  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2094
  long val = *valP;
2095
 
2096
  switch (fixP->fx_size)
2097
    {
2098
    case 1:
2099
      *buf++ = val;
2100
      break;
2101
    case 2:
2102
      *buf++ = (val >> 8);
2103
      *buf++ = val;
2104
      break;
2105
    case 4:
2106
      *buf++ = (val >> 24);
2107
      *buf++ = (val >> 16);
2108
      *buf++ = (val >> 8);
2109
      *buf++ = val;
2110
      break;
2111
    case 8:
2112
      /* This can arise when the .quad or .8byte pseudo-ops are used.
2113
         Returning here (without setting fx_done) will cause the code
2114
         to attempt to generate a reloc which will then fail with the
2115
         slightly more helpful error message: "Cannot represent
2116
         relocation type BFD_RELOC_64".  */
2117
      return;
2118
    default:
2119
      abort ();
2120
    }
2121
 
2122
  if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2123
    fixP->fx_done = 1;
2124
}
2125
 
2126
int
2127
md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED,
2128
                               segT segment_type ATTRIBUTE_UNUSED)
2129
{
2130
  printf (_("call to md_estimate_size_before_relax \n"));
2131
  abort ();
2132
}
2133
 
2134
/* Put number into target byte order.  */
2135
void
2136
md_number_to_chars (char *ptr, valueT use, int nbytes)
2137
{
2138
  number_to_chars_bigendian (ptr, use, nbytes);
2139
}
2140
 
2141
long
2142
md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2143
{
2144
  abort ();
2145
}
2146
 
2147
arelent *
2148
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2149
{
2150
  arelent *rel;
2151
  bfd_reloc_code_real_type r_type;
2152
 
2153
  if (fixp->fx_addsy && fixp->fx_subsy)
2154
    {
2155
      if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2156
          || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2157
        {
2158
          as_bad_where (fixp->fx_file, fixp->fx_line,
2159
                        _("Difference of symbols in different sections is not supported"));
2160
          return NULL;
2161
        }
2162
    }
2163
 
2164
  rel = xmalloc (sizeof (arelent));
2165
  rel->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
2166
  *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2167
  rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2168
  rel->addend = fixp->fx_offset;
2169
 
2170
  r_type = fixp->fx_r_type;
2171
 
2172
#define DEBUG 0
2173
#if DEBUG
2174
  fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2175
  fflush (stderr);
2176
#endif
2177
  rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2178
  if (rel->howto == NULL)
2179
    {
2180
      as_bad_where (fixp->fx_file, fixp->fx_line,
2181
                    _("Cannot represent relocation type %s"),
2182
                    bfd_get_reloc_code_name (r_type));
2183
      return NULL;
2184
    }
2185
 
2186
  return rel;
2187
}

powered by: WebSVN 2.1.0

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