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