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

Subversion Repositories open8_urisc

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

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

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

powered by: WebSVN 2.1.0

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