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