bfd/
[binutils.git] / gas / config / tc-h8300.c
blob92c0d576027bf956121194d8d829a6903ea584ec
1 /* tc-h8300.c -- Assemble code for the Renesas H8/300
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 /* Written By Steve Chamberlain <sac@cygnus.com>. */
25 #include "as.h"
26 #include "subsegs.h"
27 #include "dwarf2dbg.h"
29 #define DEFINE_TABLE
30 #define h8_opcodes ops
31 #include "opcode/h8300.h"
32 #include "safe-ctype.h"
34 #ifdef OBJ_ELF
35 #include "elf/h8.h"
36 #endif
38 const char comment_chars[] = ";";
39 const char line_comment_chars[] = "#";
40 const char line_separator_chars[] = "";
42 static void sbranch (int);
43 static void h8300hmode (int);
44 static void h8300smode (int);
45 static void h8300hnmode (int);
46 static void h8300snmode (int);
47 static void h8300sxmode (int);
48 static void h8300sxnmode (int);
49 static void pint (int);
51 int Hmode;
52 int Smode;
53 int Nmode;
54 int SXmode;
56 #define PSIZE (Hmode && !Nmode ? L_32 : L_16)
58 static int bsize = L_8; /* Default branch displacement. */
60 struct h8_instruction
62 int length;
63 int noperands;
64 int idx;
65 int size;
66 const struct h8_opcode *opcode;
69 static struct h8_instruction *h8_instructions;
71 static void
72 h8300hmode (int arg ATTRIBUTE_UNUSED)
74 Hmode = 1;
75 Smode = 0;
76 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h))
77 as_warn (_("could not set architecture and machine"));
80 static void
81 h8300smode (int arg ATTRIBUTE_UNUSED)
83 Smode = 1;
84 Hmode = 1;
85 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s))
86 as_warn (_("could not set architecture and machine"));
89 static void
90 h8300hnmode (int arg ATTRIBUTE_UNUSED)
92 Hmode = 1;
93 Smode = 0;
94 Nmode = 1;
95 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn))
96 as_warn (_("could not set architecture and machine"));
99 static void
100 h8300snmode (int arg ATTRIBUTE_UNUSED)
102 Smode = 1;
103 Hmode = 1;
104 Nmode = 1;
105 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn))
106 as_warn (_("could not set architecture and machine"));
109 static void
110 h8300sxmode (int arg ATTRIBUTE_UNUSED)
112 Smode = 1;
113 Hmode = 1;
114 SXmode = 1;
115 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx))
116 as_warn (_("could not set architecture and machine"));
119 static void
120 h8300sxnmode (int arg ATTRIBUTE_UNUSED)
122 Smode = 1;
123 Hmode = 1;
124 SXmode = 1;
125 Nmode = 1;
126 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn))
127 as_warn (_("could not set architecture and machine"));
130 static void
131 sbranch (int size)
133 bsize = size;
136 static void
137 pint (int arg ATTRIBUTE_UNUSED)
139 cons (Hmode ? 4 : 2);
142 /* This table describes all the machine specific pseudo-ops the assembler
143 has to support. The fields are:
144 pseudo-op name without dot
145 function to call to execute this pseudo-op
146 Integer arg to pass to the function. */
148 const pseudo_typeS md_pseudo_table[] =
150 {"h8300h", h8300hmode, 0},
151 {"h8300hn", h8300hnmode, 0},
152 {"h8300s", h8300smode, 0},
153 {"h8300sn", h8300snmode, 0},
154 {"h8300sx", h8300sxmode, 0},
155 {"h8300sxn", h8300sxnmode, 0},
156 {"sbranch", sbranch, L_8},
157 {"lbranch", sbranch, L_16},
159 {"int", pint, 0},
160 {"data.b", cons, 1},
161 {"data.w", cons, 2},
162 {"data.l", cons, 4},
163 {"form", listing_psize, 0},
164 {"heading", listing_title, 0},
165 {"import", s_ignore, 0},
166 {"page", listing_eject, 0},
167 {"program", s_ignore, 0},
168 {0, 0, 0}
171 const char EXP_CHARS[] = "eE";
173 /* Chars that mean this number is a floating point constant
174 As in 0f12.456
175 or 0d1.2345e12. */
176 const char FLT_CHARS[] = "rRsSfFdDxXpP";
178 static struct hash_control *opcode_hash_control; /* Opcode mnemonics. */
180 /* This function is called once, at assembler startup time. This
181 should set up all the tables, etc. that the MD part of the assembler
182 needs. */
184 void
185 md_begin (void)
187 unsigned int nopcodes;
188 struct h8_opcode *p, *p1;
189 struct h8_instruction *pi;
190 char prev_buffer[100];
191 int idx = 0;
193 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300))
194 as_warn (_("could not set architecture and machine"));
196 opcode_hash_control = hash_new ();
197 prev_buffer[0] = 0;
199 nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode);
201 h8_instructions = (struct h8_instruction *)
202 xmalloc (nopcodes * sizeof (struct h8_instruction));
204 pi = h8_instructions;
205 p1 = h8_opcodes;
206 /* We do a minimum amount of sorting on the opcode table; this is to
207 make it easy to describe the mova instructions without unnecessary
208 code duplication.
209 Sorting only takes place inside blocks of instructions of the form
210 X/Y, so for example mova/b, mova/w and mova/l can be intermixed. */
211 while (p1)
213 struct h8_opcode *first_skipped = 0;
214 int len, cmplen = 0;
215 char *src = p1->name;
216 char *dst, *buffer;
218 if (p1->name == 0)
219 break;
220 /* Strip off any . part when inserting the opcode and only enter
221 unique codes into the hash table. */
222 dst = buffer = malloc (strlen (src) + 1);
223 while (*src)
225 if (*src == '.')
227 src++;
228 break;
230 if (*src == '/')
231 cmplen = src - p1->name + 1;
232 *dst++ = *src++;
234 *dst = 0;
235 len = dst - buffer;
236 if (cmplen == 0)
237 cmplen = len;
238 hash_insert (opcode_hash_control, buffer, (char *) pi);
239 strcpy (prev_buffer, buffer);
240 idx++;
242 for (p = p1; p->name; p++)
244 /* A negative TIME is used to indicate that we've added this opcode
245 already. */
246 if (p->time == -1)
247 continue;
248 if (strncmp (p->name, buffer, cmplen) != 0
249 || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
250 && p->name[cmplen - 1] != '/'))
252 if (first_skipped == 0)
253 first_skipped = p;
254 break;
256 if (strncmp (p->name, buffer, len) != 0)
258 if (first_skipped == 0)
259 first_skipped = p;
260 continue;
263 p->time = -1;
264 pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
265 pi->idx = idx;
267 /* Find the number of operands. */
268 pi->noperands = 0;
269 while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
270 pi->noperands++;
272 /* Find the length of the opcode in bytes. */
273 pi->length = 0;
274 while (p->data.nib[pi->length * 2] != (op_type) E)
275 pi->length++;
277 pi->opcode = p;
278 pi++;
280 p1 = first_skipped;
283 /* Add entry for the NULL vector terminator. */
284 pi->length = 0;
285 pi->noperands = 0;
286 pi->idx = 0;
287 pi->size = 0;
288 pi->opcode = 0;
290 linkrelax = 1;
293 struct h8_op
295 op_type mode;
296 unsigned reg;
297 expressionS exp;
300 static void clever_message (const struct h8_instruction *, struct h8_op *);
301 static void fix_operand_size (struct h8_op *, int);
302 static void build_bytes (const struct h8_instruction *, struct h8_op *);
303 static void do_a_fix_imm (int, int, struct h8_op *, int, const struct h8_instruction *);
304 static void check_operand (struct h8_op *, unsigned int, char *);
305 static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
306 static char *get_operands (unsigned, char *, struct h8_op *);
307 static void get_operand (char **, struct h8_op *, int);
308 static int parse_reg (char *, op_type *, unsigned *, int);
309 static char *skip_colonthing (char *, int *);
310 static char *parse_exp (char *, struct h8_op *);
312 static int constant_fits_width_p (struct h8_op *, unsigned int);
313 static int constant_fits_size_p (struct h8_op *, int, int);
316 parse operands
317 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
318 r0l,r0h,..r7l,r7h
319 @WREG
320 @WREG+
321 @-WREG
322 #const
326 /* Try to parse a reg name. Return the number of chars consumed. */
328 static int
329 parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
331 char *end;
332 int len;
334 /* Cribbed from get_symbol_end. */
335 if (!is_name_beginner (*src) || *src == '\001')
336 return 0;
337 end = src + 1;
338 while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
339 end++;
340 len = end - src;
342 if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
344 *mode = PSIZE | REG | direction;
345 *reg = 7;
346 return len;
348 if (len == 3 &&
349 TOLOWER (src[0]) == 'c' &&
350 TOLOWER (src[1]) == 'c' &&
351 TOLOWER (src[2]) == 'r')
353 *mode = CCR;
354 *reg = 0;
355 return len;
357 if (len == 3 &&
358 TOLOWER (src[0]) == 'e' &&
359 TOLOWER (src[1]) == 'x' &&
360 TOLOWER (src[2]) == 'r')
362 *mode = EXR;
363 *reg = 1;
364 return len;
366 if (len == 3 &&
367 TOLOWER (src[0]) == 'v' &&
368 TOLOWER (src[1]) == 'b' &&
369 TOLOWER (src[2]) == 'r')
371 *mode = VBR;
372 *reg = 6;
373 return len;
375 if (len == 3 &&
376 TOLOWER (src[0]) == 's' &&
377 TOLOWER (src[1]) == 'b' &&
378 TOLOWER (src[2]) == 'r')
380 *mode = SBR;
381 *reg = 7;
382 return len;
384 if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
386 *mode = PSIZE | REG | direction;
387 *reg = 6;
388 return len;
390 if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
391 src[2] >= '0' && src[2] <= '7')
393 *mode = L_32 | REG | direction;
394 *reg = src[2] - '0';
395 if (!Hmode)
396 as_warn (_("Reg not valid for H8/300"));
397 return len;
399 if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
401 *mode = L_16 | REG | direction;
402 *reg = src[1] - '0' + 8;
403 if (!Hmode)
404 as_warn (_("Reg not valid for H8/300"));
405 return len;
408 if (TOLOWER (src[0]) == 'r')
410 if (src[1] >= '0' && src[1] <= '7')
412 if (len == 3 && TOLOWER (src[2]) == 'l')
414 *mode = L_8 | REG | direction;
415 *reg = (src[1] - '0') + 8;
416 return len;
418 if (len == 3 && TOLOWER (src[2]) == 'h')
420 *mode = L_8 | REG | direction;
421 *reg = (src[1] - '0');
422 return len;
424 if (len == 2)
426 *mode = L_16 | REG | direction;
427 *reg = (src[1] - '0');
428 return len;
433 return 0;
437 /* Parse an immediate or address-related constant and store it in OP.
438 If the user also specifies the operand's size, store that size
439 in OP->MODE, otherwise leave it for later code to decide. */
441 static char *
442 parse_exp (char *src, struct h8_op *op)
444 char *save;
446 save = input_line_pointer;
447 input_line_pointer = src;
448 expression (&op->exp);
449 if (op->exp.X_op == O_absent)
450 as_bad (_("missing operand"));
451 src = input_line_pointer;
452 input_line_pointer = save;
454 return skip_colonthing (src, &op->mode);
458 /* If SRC starts with an explicit operand size, skip it and store the size
459 in *MODE. Leave *MODE unchanged otherwise. */
461 static char *
462 skip_colonthing (char *src, int *mode)
464 if (*src == ':')
466 src++;
467 *mode &= ~SIZE;
468 if (src[0] == '8' && !ISDIGIT (src[1]))
469 *mode |= L_8;
470 else if (src[0] == '2' && !ISDIGIT (src[1]))
471 *mode |= L_2;
472 else if (src[0] == '3' && !ISDIGIT (src[1]))
473 *mode |= L_3;
474 else if (src[0] == '4' && !ISDIGIT (src[1]))
475 *mode |= L_4;
476 else if (src[0] == '5' && !ISDIGIT (src[1]))
477 *mode |= L_5;
478 else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2]))
479 *mode |= L_24;
480 else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2]))
481 *mode |= L_32;
482 else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2]))
483 *mode |= L_16;
484 else
485 as_bad (_("invalid operand size requested"));
487 while (ISDIGIT (*src))
488 src++;
490 return src;
493 /* The many forms of operand:
495 Rn Register direct
496 @Rn Register indirect
497 @(exp[:16], Rn) Register indirect with displacement
498 @Rn+
499 @-Rn
500 @aa:8 absolute 8 bit
501 @aa:16 absolute 16 bit
502 @aa absolute 16 bit
504 #xx[:size] immediate data
505 @(exp:[8], pc) pc rel
506 @@aa[:8] memory indirect. */
508 static int
509 constant_fits_width_p (struct h8_op *operand, unsigned int width)
511 return ((operand->exp.X_add_number & ~width) == 0
512 || (operand->exp.X_add_number | width) == (unsigned)(~0));
515 static int
516 constant_fits_size_p (struct h8_op *operand, int size, int no_symbols)
518 offsetT num = operand->exp.X_add_number;
519 if (no_symbols
520 && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
521 return 0;
522 switch (size)
524 case L_2:
525 return (num & ~3) == 0;
526 case L_3:
527 return (num & ~7) == 0;
528 case L_3NZ:
529 return num >= 1 && num < 8;
530 case L_4:
531 return (num & ~15) == 0;
532 case L_5:
533 return num >= 1 && num < 32;
534 case L_8:
535 return (num & ~0xFF) == 0 || ((unsigned)num | 0x7F) == ~0u;
536 case L_8U:
537 return (num & ~0xFF) == 0;
538 case L_16:
539 return (num & ~0xFFFF) == 0 || ((unsigned)num | 0x7FFF) == ~0u;
540 case L_16U:
541 return (num & ~0xFFFF) == 0;
542 case L_32:
543 return 1;
544 default:
545 abort ();
549 static void
550 get_operand (char **ptr, struct h8_op *op, int direction)
552 char *src = *ptr;
553 op_type mode;
554 unsigned int num;
555 unsigned int len;
557 op->mode = 0;
559 /* Check for '(' and ')' for instructions ldm and stm. */
560 if (src[0] == '(' && src[8] == ')')
561 ++ src;
563 /* Gross. Gross. ldm and stm have a format not easily handled
564 by get_operand. We deal with it explicitly here. */
565 if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
566 ISDIGIT (src[2]) && src[3] == '-' &&
567 TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
569 int low, high;
571 low = src[2] - '0';
572 high = src[6] - '0';
574 /* Check register pair's validity as per tech note TN-H8*-193A/E
575 from Renesas for H8S and H8SX hardware manual. */
576 if ( !(low == 0 && (high == 1 || high == 2 || high == 3))
577 && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode)
578 && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode)))
579 && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode)
580 && !(low == 4 && (high == 5 || high == 6))
581 && !(low == 4 && high == 7 && SXmode)
582 && !(low == 5 && (high == 6 || high == 7) && SXmode)
583 && !(low == 6 && high == 7 && SXmode))
584 as_bad (_("Invalid register list for ldm/stm\n"));
586 /* Even sicker. We encode two registers into op->reg. One
587 for the low register to save, the other for the high
588 register to save; we also set the high bit in op->reg
589 so we know this is "very special". */
590 op->reg = 0x80000000 | (high << 8) | low;
591 op->mode = REG;
592 if (src[7] == ')')
593 *ptr = src + 8;
594 else
595 *ptr = src + 7;
596 return;
599 len = parse_reg (src, &op->mode, &op->reg, direction);
600 if (len)
602 src += len;
603 if (*src == '.')
605 int size = op->mode & SIZE;
606 switch (src[1])
608 case 'l': case 'L':
609 if (size != L_32)
610 as_warn (_("mismatch between register and suffix"));
611 op->mode = (op->mode & ~MODE) | LOWREG;
612 break;
613 case 'w': case 'W':
614 if (size != L_32 && size != L_16)
615 as_warn (_("mismatch between register and suffix"));
616 op->mode = (op->mode & ~MODE) | LOWREG;
617 op->mode = (op->mode & ~SIZE) | L_16;
618 break;
619 case 'b': case 'B':
620 op->mode = (op->mode & ~MODE) | LOWREG;
621 if (size != L_32 && size != L_8)
622 as_warn (_("mismatch between register and suffix"));
623 op->mode = (op->mode & ~MODE) | LOWREG;
624 op->mode = (op->mode & ~SIZE) | L_8;
625 break;
626 default:
627 as_warn (_("invalid suffix after register."));
628 break;
630 src += 2;
632 *ptr = src;
633 return;
636 if (*src == '@')
638 src++;
639 if (*src == '@')
641 *ptr = parse_exp (src + 1, op);
642 if (op->exp.X_add_number >= 0x100)
644 int divisor = 1;
646 op->mode = VECIND;
647 /* FIXME : 2? or 4? */
648 if (op->exp.X_add_number >= 0x400)
649 as_bad (_("address too high for vector table jmp/jsr"));
650 else if (op->exp.X_add_number >= 0x200)
651 divisor = 4;
652 else
653 divisor = 2;
655 op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
657 else
658 op->mode = MEMIND;
659 return;
662 if (*src == '-' || *src == '+')
664 len = parse_reg (src + 1, &mode, &num, direction);
665 if (len == 0)
667 /* Oops, not a reg after all, must be ordinary exp. */
668 op->mode = ABS | direction;
669 *ptr = parse_exp (src, op);
670 return;
673 if (((mode & SIZE) != PSIZE)
674 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
675 && (!Nmode || ((mode & SIZE) != L_32)))
676 as_bad (_("Wrong size pointer register for architecture."));
678 op->mode = src[0] == '-' ? RDPREDEC : RDPREINC;
679 op->reg = num;
680 *ptr = src + 1 + len;
681 return;
683 if (*src == '(')
685 src++;
687 /* See if this is @(ERn.x, PC). */
688 len = parse_reg (src, &mode, &op->reg, direction);
689 if (len != 0 && (mode & MODE) == REG && src[len] == '.')
691 switch (TOLOWER (src[len + 1]))
693 case 'b':
694 mode = PCIDXB | direction;
695 break;
696 case 'w':
697 mode = PCIDXW | direction;
698 break;
699 case 'l':
700 mode = PCIDXL | direction;
701 break;
702 default:
703 mode = 0;
704 break;
706 if (mode
707 && src[len + 2] == ','
708 && TOLOWER (src[len + 3]) != 'p'
709 && TOLOWER (src[len + 4]) != 'c'
710 && src[len + 5] != ')')
712 *ptr = src + len + 6;
713 op->mode |= mode;
714 return;
716 /* Fall through into disp case - the grammar is somewhat
717 ambiguous, so we should try whether it's a DISP operand
718 after all ("ER3.L" might be a poorly named label...). */
721 /* Disp. */
723 /* Start off assuming a 16 bit offset. */
725 src = parse_exp (src, op);
726 if (*src == ')')
728 op->mode |= ABS | direction;
729 *ptr = src + 1;
730 return;
733 if (*src != ',')
735 as_bad (_("expected @(exp, reg16)"));
736 return;
738 src++;
740 len = parse_reg (src, &mode, &op->reg, direction);
741 if (len == 0 || (mode & MODE) != REG)
743 as_bad (_("expected @(exp, reg16)"));
744 return;
746 src += len;
747 if (src[0] == '.')
749 switch (TOLOWER (src[1]))
751 case 'b':
752 op->mode |= INDEXB | direction;
753 break;
754 case 'w':
755 op->mode |= INDEXW | direction;
756 break;
757 case 'l':
758 op->mode |= INDEXL | direction;
759 break;
760 default:
761 as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
763 src += 2;
764 op->reg &= 7;
766 else
767 op->mode |= DISP | direction;
768 src = skip_colonthing (src, &op->mode);
770 if (*src != ')' && '(')
772 as_bad (_("expected @(exp, reg16)"));
773 return;
775 *ptr = src + 1;
776 return;
778 len = parse_reg (src, &mode, &num, direction);
780 if (len)
782 src += len;
783 if (*src == '+' || *src == '-')
785 if (((mode & SIZE) != PSIZE)
786 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
787 && (!Nmode || ((mode & SIZE) != L_32)))
788 as_bad (_("Wrong size pointer register for architecture."));
789 op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
790 op->reg = num;
791 src++;
792 *ptr = src;
793 return;
795 if (((mode & SIZE) != PSIZE)
796 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
797 && (!Nmode || ((mode & SIZE) != L_32)))
798 as_bad (_("Wrong size pointer register for architecture."));
800 op->mode = direction | IND | PSIZE;
801 op->reg = num;
802 *ptr = src;
804 return;
806 else
808 /* must be a symbol */
810 op->mode = ABS | direction;
811 *ptr = parse_exp (src, op);
812 return;
816 if (*src == '#')
818 op->mode = IMM;
819 *ptr = parse_exp (src + 1, op);
820 return;
822 else if (strncmp (src, "mach", 4) == 0 ||
823 strncmp (src, "macl", 4) == 0 ||
824 strncmp (src, "MACH", 4) == 0 ||
825 strncmp (src, "MACL", 4) == 0)
827 op->reg = TOLOWER (src[3]) == 'l';
828 op->mode = MACREG;
829 *ptr = src + 4;
830 return;
832 else
834 op->mode = PCREL;
835 *ptr = parse_exp (src, op);
839 static char *
840 get_operands (unsigned int noperands, char *op_end, struct h8_op *operand)
842 char *ptr = op_end;
844 switch (noperands)
846 case 0:
847 break;
849 case 1:
850 ptr++;
851 get_operand (&ptr, operand + 0, SRC);
852 if (*ptr == ',')
854 ptr++;
855 get_operand (&ptr, operand + 1, DST);
857 break;
859 case 2:
860 ptr++;
861 get_operand (&ptr, operand + 0, SRC);
862 if (*ptr == ',')
863 ptr++;
864 get_operand (&ptr, operand + 1, DST);
865 break;
867 case 3:
868 ptr++;
869 get_operand (&ptr, operand + 0, SRC);
870 if (*ptr == ',')
871 ptr++;
872 get_operand (&ptr, operand + 1, DST);
873 if (*ptr == ',')
874 ptr++;
875 get_operand (&ptr, operand + 2, OP3);
876 break;
878 default:
879 abort ();
882 return ptr;
885 /* MOVA has special requirements. Rather than adding twice the amount of
886 addressing modes, we simply special case it a bit. */
887 static void
888 get_mova_operands (char *op_end, struct h8_op *operand)
890 char *ptr = op_end;
892 if (ptr[1] != '@' || ptr[2] != '(')
893 goto error;
894 ptr += 3;
895 operand[0].mode = 0;
896 ptr = parse_exp (ptr, &operand[0]);
898 if (*ptr !=',')
899 goto error;
900 ptr++;
901 get_operand (&ptr, operand + 1, DST);
903 if (*ptr =='.')
905 ptr++;
906 switch (*ptr++)
908 case 'b': case 'B':
909 operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
910 break;
911 case 'w': case 'W':
912 operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
913 break;
914 case 'l': case 'L':
915 operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
916 break;
917 default:
918 goto error;
921 else if ((operand[1].mode & MODE) == LOWREG)
923 switch (operand[1].mode & SIZE)
925 case L_8:
926 operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
927 break;
928 case L_16:
929 operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
930 break;
931 case L_32:
932 operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
933 break;
934 default:
935 goto error;
938 else
939 goto error;
941 if (*ptr++ != ')' || *ptr++ != ',')
942 goto error;
943 get_operand (&ptr, operand + 2, OP3);
944 /* See if we can use the short form of MOVA. */
945 if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
946 && (operand[2].mode & MODE) == REG
947 && (operand[1].reg & 7) == (operand[2].reg & 7))
949 operand[1].mode = operand[2].mode = 0;
950 operand[0].reg = operand[2].reg & 7;
952 return;
954 error:
955 as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
958 static void
959 get_rtsl_operands (char *ptr, struct h8_op *operand)
961 int mode, len, type = 0;
962 unsigned int num, num2;
964 ptr++;
965 if (*ptr == '(')
967 ptr++;
968 type = 1;
970 len = parse_reg (ptr, &mode, &num, SRC);
971 if (len == 0 || (mode & MODE) != REG)
973 as_bad (_("expected register"));
974 return;
976 ptr += len;
977 if (*ptr == '-')
979 len = parse_reg (++ptr, &mode, &num2, SRC);
980 if (len == 0 || (mode & MODE) != REG)
982 as_bad (_("expected register"));
983 return;
985 ptr += len;
986 /* CONST_xxx are used as placeholders in the opcode table. */
987 num = num2 - num;
988 if (num > 3)
990 as_bad (_("invalid register list"));
991 return;
994 else
995 num2 = num, num = 0;
996 if (type == 1 && *ptr++ != ')')
998 as_bad (_("expected closing paren"));
999 return;
1001 operand[0].mode = RS32;
1002 operand[1].mode = RD32;
1003 operand[0].reg = num;
1004 operand[1].reg = num2;
1007 /* Passed a pointer to a list of opcodes which use different
1008 addressing modes, return the opcode which matches the opcodes
1009 provided. */
1011 static const struct h8_instruction *
1012 get_specific (const struct h8_instruction *instruction,
1013 struct h8_op *operands, int size)
1015 const struct h8_instruction *this_try = instruction;
1016 const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1017 int found = 0;
1018 int this_index = instruction->idx;
1019 int noperands = 0;
1021 /* There's only one ldm/stm and it's easier to just
1022 get out quick for them. */
1023 if (OP_KIND (instruction->opcode->how) == O_LDM
1024 || OP_KIND (instruction->opcode->how) == O_STM)
1025 return this_try;
1027 while (noperands < 3 && operands[noperands].mode != 0)
1028 noperands++;
1030 while (this_index == instruction->idx && !found)
1032 int this_size;
1034 found = 1;
1035 this_try = instruction++;
1036 this_size = this_try->opcode->how & SN;
1038 if (this_try->noperands != noperands)
1039 found = 0;
1040 else if (this_try->noperands > 0)
1042 int i;
1044 for (i = 0; i < this_try->noperands && found; i++)
1046 op_type op = this_try->opcode->args.nib[i];
1047 int op_mode = op & MODE;
1048 int op_size = op & SIZE;
1049 int x = operands[i].mode;
1050 int x_mode = x & MODE;
1051 int x_size = x & SIZE;
1053 if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1055 if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1056 || (x_size == L_16 && (operands[i].reg & 8) == 8))
1057 as_warn (_("can't use high part of register in operand %d"), i);
1059 if (x_size != op_size)
1060 found = 0;
1062 else if (op_mode == REG)
1064 if (x_mode == LOWREG)
1065 x_mode = REG;
1066 if (x_mode != REG)
1067 found = 0;
1069 if (x_size == L_P)
1070 x_size = (Hmode ? L_32 : L_16);
1071 if (op_size == L_P)
1072 op_size = (Hmode ? L_32 : L_16);
1074 /* The size of the reg is v important. */
1075 if (op_size != x_size)
1076 found = 0;
1078 else if (op_mode & CTRL) /* control register */
1080 if (!(x_mode & CTRL))
1081 found = 0;
1083 switch (x_mode)
1085 case CCR:
1086 if (op_mode != CCR &&
1087 op_mode != CCR_EXR &&
1088 op_mode != CC_EX_VB_SB)
1089 found = 0;
1090 break;
1091 case EXR:
1092 if (op_mode != EXR &&
1093 op_mode != CCR_EXR &&
1094 op_mode != CC_EX_VB_SB)
1095 found = 0;
1096 break;
1097 case MACH:
1098 if (op_mode != MACH &&
1099 op_mode != MACREG)
1100 found = 0;
1101 break;
1102 case MACL:
1103 if (op_mode != MACL &&
1104 op_mode != MACREG)
1105 found = 0;
1106 break;
1107 case VBR:
1108 if (op_mode != VBR &&
1109 op_mode != VBR_SBR &&
1110 op_mode != CC_EX_VB_SB)
1111 found = 0;
1112 break;
1113 case SBR:
1114 if (op_mode != SBR &&
1115 op_mode != VBR_SBR &&
1116 op_mode != CC_EX_VB_SB)
1117 found = 0;
1118 break;
1121 else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1123 operands[i].mode &= ~MODE;
1124 operands[i].mode |= ABSJMP;
1125 /* But it may not be 24 bits long. */
1126 if (x_mode == ABS && !Hmode)
1128 operands[i].mode &= ~SIZE;
1129 operands[i].mode |= L_16;
1131 if ((operands[i].mode & SIZE) == L_32
1132 && (op_mode & SIZE) != L_32)
1133 found = 0;
1135 else if (x_mode == IMM && op_mode != IMM)
1137 offsetT num = operands[i].exp.X_add_number;
1138 if (op_mode == KBIT || op_mode == DBIT)
1139 /* This is ok if the immediate value is sensible. */;
1140 else if (op_mode == CONST_2)
1141 found = num == 2;
1142 else if (op_mode == CONST_4)
1143 found = num == 4;
1144 else if (op_mode == CONST_8)
1145 found = num == 8;
1146 else if (op_mode == CONST_16)
1147 found = num == 16;
1148 else
1149 found = 0;
1151 else if (op_mode == PCREL && op_mode == x_mode)
1153 /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1154 If x_size is L_8, promote it. */
1155 if (OP_KIND (this_try->opcode->how) == O_MOVSD
1156 || OP_KIND (this_try->opcode->how) == O_BSRBC
1157 || OP_KIND (this_try->opcode->how) == O_BSRBS)
1158 if (x_size == L_8)
1159 x_size = L_16;
1161 /* The size of the displacement is important. */
1162 if (op_size != x_size)
1163 found = 0;
1165 else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1166 || op_mode == INDEXB || op_mode == INDEXW
1167 || op_mode == INDEXL)
1168 && op_mode == x_mode)
1170 /* Promote a L_24 to L_32 if it makes us match. */
1171 if (x_size == L_24 && op_size == L_32)
1173 x &= ~SIZE;
1174 x |= x_size = L_32;
1177 if (((x_size == L_16 && op_size == L_16U)
1178 || (x_size == L_8 && op_size == L_8U)
1179 || (x_size == L_3 && op_size == L_3NZ))
1180 /* We're deliberately more permissive for ABS modes. */
1181 && (op_mode == ABS
1182 || constant_fits_size_p (operands + i, op_size,
1183 op & NO_SYMBOLS)))
1184 x_size = op_size;
1186 if (x_size != 0 && op_size != x_size)
1187 found = 0;
1188 else if (x_size == 0
1189 && ! constant_fits_size_p (operands + i, op_size,
1190 op & NO_SYMBOLS))
1191 found = 0;
1193 else if (op_mode != x_mode)
1195 found = 0;
1199 if (found)
1201 if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1202 || (this_try->opcode->available == AV_H8S && ! Smode)
1203 || (this_try->opcode->available == AV_H8H && ! Hmode))
1204 found = 0, found_other = this_try;
1205 else if (this_size != size && (this_size != SN && size != SN))
1206 found_mismatched = this_try, found = 0;
1210 if (found)
1211 return this_try;
1212 if (found_other)
1214 as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1215 found_other->opcode->name,
1216 (! Hmode && ! Smode ? "H8/300"
1217 : SXmode ? "H8sx"
1218 : Smode ? "H8/300S"
1219 : "H8/300H"));
1221 else if (found_mismatched)
1223 as_warn (_("mismatch between opcode size and operand size"));
1224 return found_mismatched;
1226 return 0;
1229 static void
1230 check_operand (struct h8_op *operand, unsigned int width, char *string)
1232 if (operand->exp.X_add_symbol == 0
1233 && operand->exp.X_op_symbol == 0)
1235 /* No symbol involved, let's look at offset, it's dangerous if
1236 any of the high bits are not 0 or ff's, find out by oring or
1237 anding with the width and seeing if the answer is 0 or all
1238 fs. */
1240 if (! constant_fits_width_p (operand, width))
1242 if (width == 255
1243 && (operand->exp.X_add_number & 0xff00) == 0xff00)
1245 /* Just ignore this one - which happens when trying to
1246 fit a 16 bit address truncated into an 8 bit address
1247 of something like bset. */
1249 else if (strcmp (string, "@") == 0
1250 && width == 0xffff
1251 && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1253 /* Just ignore this one - which happens when trying to
1254 fit a 24 bit address truncated into a 16 bit address
1255 of something like mov.w. */
1257 else
1259 as_warn (_("operand %s0x%lx out of range."), string,
1260 (unsigned long) operand->exp.X_add_number);
1266 /* RELAXMODE has one of 3 values:
1268 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1270 1 Output a relaxable 24bit absolute mov.w address relocation
1271 (may relax into a 16bit absolute address).
1273 2 Output a relaxable 16/24 absolute mov.b address relocation
1274 (may relax into an 8bit absolute address). */
1276 static void
1277 do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, const struct h8_instruction *this_try)
1279 int idx;
1280 int size;
1281 int where;
1282 char *bytes = frag_now->fr_literal + offset;
1284 char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1286 if (operand->exp.X_add_symbol == 0)
1288 switch (operand->mode & SIZE)
1290 case L_2:
1291 check_operand (operand, 0x3, t);
1292 bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1293 break;
1294 case L_3:
1295 case L_3NZ:
1296 check_operand (operand, 0x7, t);
1297 bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1298 break;
1299 case L_4:
1300 check_operand (operand, 0xF, t);
1301 bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1302 break;
1303 case L_5:
1304 check_operand (operand, 0x1F, t);
1305 bytes[0] |= operand->exp.X_add_number & 31;
1306 break;
1307 case L_8:
1308 case L_8U:
1309 check_operand (operand, 0xff, t);
1310 bytes[0] |= operand->exp.X_add_number;
1311 break;
1312 case L_16:
1313 case L_16U:
1314 check_operand (operand, 0xffff, t);
1315 bytes[0] |= operand->exp.X_add_number >> 8;
1316 bytes[1] |= operand->exp.X_add_number >> 0;
1317 #ifdef OBJ_ELF
1318 /* MOVA needs both relocs to relax the second operand properly. */
1319 if (relaxmode != 0
1320 && (OP_KIND(this_try->opcode->how) == O_MOVAB
1321 || OP_KIND(this_try->opcode->how) == O_MOVAW
1322 || OP_KIND(this_try->opcode->how) == O_MOVAL))
1324 idx = BFD_RELOC_16;
1325 fix_new_exp (frag_now, offset, 2, &operand->exp, 0, idx);
1327 #endif
1328 break;
1329 case L_24:
1330 check_operand (operand, 0xffffff, t);
1331 bytes[0] |= operand->exp.X_add_number >> 16;
1332 bytes[1] |= operand->exp.X_add_number >> 8;
1333 bytes[2] |= operand->exp.X_add_number >> 0;
1334 break;
1336 case L_32:
1337 /* This should be done with bfd. */
1338 bytes[0] |= operand->exp.X_add_number >> 24;
1339 bytes[1] |= operand->exp.X_add_number >> 16;
1340 bytes[2] |= operand->exp.X_add_number >> 8;
1341 bytes[3] |= operand->exp.X_add_number >> 0;
1342 if (relaxmode != 0)
1344 idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1345 fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1347 break;
1350 else
1352 switch (operand->mode & SIZE)
1354 case L_24:
1355 case L_32:
1356 size = 4;
1357 where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1358 if (relaxmode == 2)
1359 idx = R_MOV24B1;
1360 else if (relaxmode == 1)
1361 idx = R_MOVL1;
1362 else
1363 idx = R_RELLONG;
1364 break;
1365 default:
1366 as_bad (_("Can't work out size of operand.\n"));
1367 case L_16:
1368 case L_16U:
1369 size = 2;
1370 where = 0;
1371 if (relaxmode == 2)
1372 idx = R_MOV16B1;
1373 else
1374 idx = R_RELWORD;
1375 operand->exp.X_add_number =
1376 ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1377 operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1378 break;
1379 case L_8:
1380 size = 1;
1381 where = 0;
1382 idx = R_RELBYTE;
1383 operand->exp.X_add_number =
1384 ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1385 operand->exp.X_add_number |= bytes[0];
1388 fix_new_exp (frag_now,
1389 offset + where,
1390 size,
1391 &operand->exp,
1393 idx);
1397 /* Now we know what sort of opcodes it is, let's build the bytes. */
1399 static void
1400 build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1402 int i;
1403 char *output = frag_more (this_try->length);
1404 const op_type *nibble_ptr = this_try->opcode->data.nib;
1405 op_type c;
1406 unsigned int nibble_count = 0;
1407 int op_at[3];
1408 int nib = 0;
1409 int movb = 0;
1410 char asnibbles[100];
1411 char *p = asnibbles;
1412 int high, low;
1414 if (!Hmode && this_try->opcode->available != AV_H8)
1415 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1416 this_try->opcode->name);
1417 else if (!Smode
1418 && this_try->opcode->available != AV_H8
1419 && this_try->opcode->available != AV_H8H)
1420 as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1421 this_try->opcode->name);
1422 else if (!SXmode
1423 && this_try->opcode->available != AV_H8
1424 && this_try->opcode->available != AV_H8H
1425 && this_try->opcode->available != AV_H8S)
1426 as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1427 this_try->opcode->name);
1429 while (*nibble_ptr != (op_type) E)
1431 int d;
1433 nib = 0;
1434 c = *nibble_ptr++;
1436 d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1438 if (c < 16)
1439 nib = c;
1440 else
1442 int c2 = c & MODE;
1444 if (c2 == REG || c2 == LOWREG
1445 || c2 == IND || c2 == PREINC || c2 == PREDEC
1446 || c2 == POSTINC || c2 == POSTDEC)
1448 nib = operand[d].reg;
1449 if (c2 == LOWREG)
1450 nib &= 7;
1453 else if (c & CTRL) /* Control reg operand. */
1454 nib = operand[d].reg;
1456 else if ((c & DISPREG) == (DISPREG))
1458 nib = operand[d].reg;
1460 else if (c2 == ABS)
1462 operand[d].mode = c;
1463 op_at[d] = nibble_count;
1464 nib = 0;
1466 else if (c2 == IMM || c2 == PCREL || c2 == ABS
1467 || (c & ABSJMP) || c2 == DISP)
1469 operand[d].mode = c;
1470 op_at[d] = nibble_count;
1471 nib = 0;
1473 else if ((c & IGNORE) || (c & DATA))
1474 nib = 0;
1476 else if (c2 == DBIT)
1478 switch (operand[0].exp.X_add_number)
1480 case 1:
1481 nib = c;
1482 break;
1483 case 2:
1484 nib = 0x8 | c;
1485 break;
1486 default:
1487 as_bad (_("Need #1 or #2 here"));
1490 else if (c2 == KBIT)
1492 switch (operand[0].exp.X_add_number)
1494 case 1:
1495 nib = 0;
1496 break;
1497 case 2:
1498 nib = 8;
1499 break;
1500 case 4:
1501 if (!Hmode)
1502 as_warn (_("#4 not valid on H8/300."));
1503 nib = 9;
1504 break;
1506 default:
1507 as_bad (_("Need #1 or #2 here"));
1508 break;
1510 /* Stop it making a fix. */
1511 operand[0].mode = 0;
1514 if (c & MEMRELAX)
1515 operand[d].mode |= MEMRELAX;
1517 if (c & B31)
1518 nib |= 0x8;
1520 if (c & B21)
1521 nib |= 0x4;
1523 if (c & B11)
1524 nib |= 0x2;
1526 if (c & B01)
1527 nib |= 0x1;
1529 if (c2 == MACREG)
1531 if (operand[0].mode == MACREG)
1532 /* stmac has mac[hl] as the first operand. */
1533 nib = 2 + operand[0].reg;
1534 else
1535 /* ldmac has mac[hl] as the second operand. */
1536 nib = 2 + operand[1].reg;
1539 nibble_count++;
1541 *p++ = nib;
1544 /* Disgusting. Why, oh why didn't someone ask us for advice
1545 on the assembler format. */
1546 if (OP_KIND (this_try->opcode->how) == O_LDM)
1548 high = (operand[1].reg >> 8) & 0xf;
1549 low = (operand[1].reg) & 0xf;
1550 asnibbles[2] = high - low;
1551 asnibbles[7] = high;
1553 else if (OP_KIND (this_try->opcode->how) == O_STM)
1555 high = (operand[0].reg >> 8) & 0xf;
1556 low = (operand[0].reg) & 0xf;
1557 asnibbles[2] = high - low;
1558 asnibbles[7] = low;
1561 for (i = 0; i < this_try->length; i++)
1562 output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1564 /* Note if this is a movb or a bit manipulation instruction
1565 there is a special relaxation which only applies. */
1566 if ( this_try->opcode->how == O (O_MOV, SB)
1567 || this_try->opcode->how == O (O_BCLR, SB)
1568 || this_try->opcode->how == O (O_BAND, SB)
1569 || this_try->opcode->how == O (O_BIAND, SB)
1570 || this_try->opcode->how == O (O_BILD, SB)
1571 || this_try->opcode->how == O (O_BIOR, SB)
1572 || this_try->opcode->how == O (O_BIST, SB)
1573 || this_try->opcode->how == O (O_BIXOR, SB)
1574 || this_try->opcode->how == O (O_BLD, SB)
1575 || this_try->opcode->how == O (O_BNOT, SB)
1576 || this_try->opcode->how == O (O_BOR, SB)
1577 || this_try->opcode->how == O (O_BSET, SB)
1578 || this_try->opcode->how == O (O_BST, SB)
1579 || this_try->opcode->how == O (O_BTST, SB)
1580 || this_try->opcode->how == O (O_BXOR, SB))
1581 movb = 1;
1583 /* Output any fixes. */
1584 for (i = 0; i < this_try->noperands; i++)
1586 int x = operand[i].mode;
1587 int x_mode = x & MODE;
1589 if (x_mode == IMM || x_mode == DISP)
1590 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1591 op_at[i] & 1, operand + i, (x & MEMRELAX) != 0,
1592 this_try);
1594 else if (x_mode == ABS)
1595 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1596 op_at[i] & 1, operand + i,
1597 (x & MEMRELAX) ? movb + 1 : 0,
1598 this_try);
1600 else if (x_mode == PCREL)
1602 int size16 = (x & SIZE) == L_16;
1603 int size = size16 ? 2 : 1;
1604 int type = size16 ? R_PCRWORD : R_PCRBYTE;
1605 fixS *fixP;
1607 check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1609 if (operand[i].exp.X_add_number & 1)
1610 as_warn (_("branch operand has odd offset (%lx)\n"),
1611 (unsigned long) operand->exp.X_add_number);
1612 #ifndef OBJ_ELF
1613 /* The COFF port has always been off by one, changing it
1614 now would be an incompatible change, so we leave it as-is.
1616 We don't want to do this for ELF as we want to be
1617 compatible with the proposed ELF format from Hitachi. */
1618 operand[i].exp.X_add_number -= 1;
1619 #endif
1620 if (size16)
1622 operand[i].exp.X_add_number =
1623 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1625 else
1627 operand[i].exp.X_add_number =
1628 ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1631 /* For BRA/S. */
1632 if (! size16)
1633 operand[i].exp.X_add_number |= output[op_at[i] / 2];
1635 fixP = fix_new_exp (frag_now,
1636 output - frag_now->fr_literal + op_at[i] / 2,
1637 size,
1638 &operand[i].exp,
1640 type);
1641 fixP->fx_signed = 1;
1643 else if (x_mode == MEMIND)
1645 check_operand (operand + i, 0xff, "@@");
1646 fix_new_exp (frag_now,
1647 output - frag_now->fr_literal + 1,
1649 &operand[i].exp,
1651 R_MEM_INDIRECT);
1653 else if (x_mode == VECIND)
1655 check_operand (operand + i, 0x7f, "@@");
1656 /* FIXME: approximating the effect of "B31" here...
1657 This is very hackish, and ought to be done a better way. */
1658 operand[i].exp.X_add_number |= 0x80;
1659 fix_new_exp (frag_now,
1660 output - frag_now->fr_literal + 1,
1662 &operand[i].exp,
1664 R_MEM_INDIRECT);
1666 else if (x & ABSJMP)
1668 int where = 0;
1669 bfd_reloc_code_real_type reloc_type = R_JMPL1;
1671 #ifdef OBJ_ELF
1672 /* To be compatible with the proposed H8 ELF format, we
1673 want the relocation's offset to point to the first byte
1674 that will be modified, not to the start of the instruction. */
1676 if ((operand->mode & SIZE) == L_32)
1678 where = 2;
1679 reloc_type = R_RELLONG;
1681 else
1682 where = 1;
1683 #endif
1685 /* This jmp may be a jump or a branch. */
1687 check_operand (operand + i,
1688 SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1689 "@");
1691 if (operand[i].exp.X_add_number & 1)
1692 as_warn (_("branch operand has odd offset (%lx)\n"),
1693 (unsigned long) operand->exp.X_add_number);
1695 if (!Hmode)
1696 operand[i].exp.X_add_number =
1697 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1698 fix_new_exp (frag_now,
1699 output - frag_now->fr_literal + where,
1701 &operand[i].exp,
1703 reloc_type);
1708 /* Try to give an intelligent error message for common and simple to
1709 detect errors. */
1711 static void
1712 clever_message (const struct h8_instruction *instruction,
1713 struct h8_op *operand)
1715 /* Find out if there was more than one possible opcode. */
1717 if ((instruction + 1)->idx != instruction->idx)
1719 int argn;
1721 /* Only one opcode of this flavour, try to guess which operand
1722 didn't match. */
1723 for (argn = 0; argn < instruction->noperands; argn++)
1725 switch (instruction->opcode->args.nib[argn])
1727 case RD16:
1728 if (operand[argn].mode != RD16)
1730 as_bad (_("destination operand must be 16 bit register"));
1731 return;
1734 break;
1736 case RS8:
1737 if (operand[argn].mode != RS8)
1739 as_bad (_("source operand must be 8 bit register"));
1740 return;
1742 break;
1744 case ABS16DST:
1745 if (operand[argn].mode != ABS16DST)
1747 as_bad (_("destination operand must be 16bit absolute address"));
1748 return;
1750 break;
1751 case RD8:
1752 if (operand[argn].mode != RD8)
1754 as_bad (_("destination operand must be 8 bit register"));
1755 return;
1757 break;
1759 case ABS16SRC:
1760 if (operand[argn].mode != ABS16SRC)
1762 as_bad (_("source operand must be 16bit absolute address"));
1763 return;
1765 break;
1770 as_bad (_("invalid operands"));
1774 /* If OPERAND is part of an address, adjust its size and value given
1775 that it addresses SIZE bytes.
1777 This function decides how big non-immediate constants are when no
1778 size was explicitly given. It also scales down the assembly-level
1779 displacement in an @(d:2,ERn) operand. */
1781 static void
1782 fix_operand_size (struct h8_op *operand, int size)
1784 if (SXmode && (operand->mode & MODE) == DISP)
1786 /* If the user didn't specify an operand width, see if we
1787 can use @(d:2,ERn). */
1788 if ((operand->mode & SIZE) == 0
1789 && operand->exp.X_add_symbol == 0
1790 && operand->exp.X_op_symbol == 0
1791 && (operand->exp.X_add_number == size
1792 || operand->exp.X_add_number == size * 2
1793 || operand->exp.X_add_number == size * 3))
1794 operand->mode |= L_2;
1796 /* Scale down the displacement in an @(d:2,ERn) operand.
1797 X_add_number then contains the desired field value. */
1798 if ((operand->mode & SIZE) == L_2)
1800 if (operand->exp.X_add_number % size != 0)
1801 as_warn (_("operand/size mis-match"));
1802 operand->exp.X_add_number /= size;
1806 if ((operand->mode & SIZE) == 0)
1807 switch (operand->mode & MODE)
1809 case DISP:
1810 case INDEXB:
1811 case INDEXW:
1812 case INDEXL:
1813 case ABS:
1814 /* Pick a 24-bit address unless we know that a 16-bit address
1815 is safe. get_specific() will relax L_24 into L_32 where
1816 necessary. */
1817 if (Hmode
1818 && !Nmode
1819 && (operand->exp.X_add_number < -32768
1820 || operand->exp.X_add_number > 32767
1821 || operand->exp.X_add_symbol != 0
1822 || operand->exp.X_op_symbol != 0))
1823 operand->mode |= L_24;
1824 else
1825 operand->mode |= L_16;
1826 break;
1828 case PCREL:
1829 /* This condition is long standing, though somewhat suspect. */
1830 if (operand->exp.X_add_number > -128
1831 && operand->exp.X_add_number < 127)
1833 if (operand->exp.X_add_symbol != NULL)
1834 operand->mode |= bsize;
1835 else
1836 operand->mode |= L_8;
1838 else
1839 operand->mode |= L_16;
1840 break;
1845 /* This is the guts of the machine-dependent assembler. STR points to
1846 a machine dependent instruction. This function is supposed to emit
1847 the frags/bytes it assembles. */
1849 void
1850 md_assemble (char *str)
1852 char *op_start;
1853 char *op_end;
1854 struct h8_op operand[3];
1855 const struct h8_instruction *instruction;
1856 const struct h8_instruction *prev_instruction;
1858 char *dot = 0;
1859 char *slash = 0;
1860 char c;
1861 int size, i;
1863 /* Drop leading whitespace. */
1864 while (*str == ' ')
1865 str++;
1867 /* Find the op code end. */
1868 for (op_start = op_end = str;
1869 *op_end != 0 && *op_end != ' ';
1870 op_end++)
1872 if (*op_end == '.')
1874 dot = op_end + 1;
1875 *op_end = 0;
1876 op_end += 2;
1877 break;
1879 else if (*op_end == '/' && ! slash)
1880 slash = op_end;
1883 if (op_end == op_start)
1885 as_bad (_("can't find opcode "));
1887 c = *op_end;
1889 *op_end = 0;
1891 /* The assembler stops scanning the opcode at slashes, so it fails
1892 to make characters following them lower case. Fix them. */
1893 if (slash)
1894 while (*++slash)
1895 *slash = TOLOWER (*slash);
1897 instruction = (const struct h8_instruction *)
1898 hash_find (opcode_hash_control, op_start);
1900 if (instruction == NULL)
1902 as_bad (_("unknown opcode"));
1903 return;
1906 /* We used to set input_line_pointer to the result of get_operands,
1907 but that is wrong. Our caller assumes we don't change it. */
1909 operand[0].mode = 0;
1910 operand[1].mode = 0;
1911 operand[2].mode = 0;
1913 if (OP_KIND (instruction->opcode->how) == O_MOVAB
1914 || OP_KIND (instruction->opcode->how) == O_MOVAW
1915 || OP_KIND (instruction->opcode->how) == O_MOVAL)
1916 get_mova_operands (op_end, operand);
1917 else if (OP_KIND (instruction->opcode->how) == O_RTEL
1918 || OP_KIND (instruction->opcode->how) == O_RTSL)
1919 get_rtsl_operands (op_end, operand);
1920 else
1921 get_operands (instruction->noperands, op_end, operand);
1923 *op_end = c;
1924 prev_instruction = instruction;
1926 /* Now we have operands from instruction.
1927 Let's check them out for ldm and stm. */
1928 if (OP_KIND (instruction->opcode->how) == O_LDM)
1930 /* The first operand must be @er7+, and the
1931 second operand must be a register pair. */
1932 if ((operand[0].mode != RSINC)
1933 || (operand[0].reg != 7)
1934 || ((operand[1].reg & 0x80000000) == 0))
1935 as_bad (_("invalid operand in ldm"));
1937 else if (OP_KIND (instruction->opcode->how) == O_STM)
1939 /* The first operand must be a register pair,
1940 and the second operand must be @-er7. */
1941 if (((operand[0].reg & 0x80000000) == 0)
1942 || (operand[1].mode != RDDEC)
1943 || (operand[1].reg != 7))
1944 as_bad (_("invalid operand in stm"));
1947 size = SN;
1948 if (dot)
1950 switch (TOLOWER (*dot))
1952 case 'b':
1953 size = SB;
1954 break;
1956 case 'w':
1957 size = SW;
1958 break;
1960 case 'l':
1961 size = SL;
1962 break;
1965 if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
1966 OP_KIND (instruction->opcode->how) == O_MOVAW ||
1967 OP_KIND (instruction->opcode->how) == O_MOVAL)
1969 switch (operand[0].mode & MODE)
1971 case INDEXB:
1972 default:
1973 fix_operand_size (&operand[1], 1);
1974 break;
1975 case INDEXW:
1976 fix_operand_size (&operand[1], 2);
1977 break;
1978 case INDEXL:
1979 fix_operand_size (&operand[1], 4);
1980 break;
1983 else
1985 for (i = 0; i < 3 && operand[i].mode != 0; i++)
1986 switch (size)
1988 case SN:
1989 case SB:
1990 default:
1991 fix_operand_size (&operand[i], 1);
1992 break;
1993 case SW:
1994 fix_operand_size (&operand[i], 2);
1995 break;
1996 case SL:
1997 fix_operand_size (&operand[i], 4);
1998 break;
2002 instruction = get_specific (instruction, operand, size);
2004 if (instruction == 0)
2006 /* Couldn't find an opcode which matched the operands. */
2007 char *where = frag_more (2);
2009 where[0] = 0x0;
2010 where[1] = 0x0;
2011 clever_message (prev_instruction, operand);
2013 return;
2016 build_bytes (instruction, operand);
2018 dwarf2_emit_insn (instruction->length);
2021 symbolS *
2022 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2024 return 0;
2027 /* Various routines to kill one day. */
2029 char *
2030 md_atof (int type, char *litP, int *sizeP)
2032 return ieee_md_atof (type, litP, sizeP, TRUE);
2035 #define OPTION_H_TICK_HEX (OPTION_MD_BASE)
2037 const char *md_shortopts = "";
2038 struct option md_longopts[] = {
2039 { "h-tick-hex", no_argument, NULL, OPTION_H_TICK_HEX },
2040 {NULL, no_argument, NULL, 0}
2043 size_t md_longopts_size = sizeof (md_longopts);
2046 md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
2048 switch (c)
2050 case OPTION_H_TICK_HEX:
2051 enable_h_tick_hex = 1;
2052 break;
2054 default:
2055 return 0;
2057 return 1;
2060 void
2061 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
2065 void tc_aout_fix_to_chars (void);
2067 void
2068 tc_aout_fix_to_chars (void)
2070 printf (_("call to tc_aout_fix_to_chars \n"));
2071 abort ();
2074 void
2075 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
2076 segT seg ATTRIBUTE_UNUSED,
2077 fragS *fragP ATTRIBUTE_UNUSED)
2079 printf (_("call to md_convert_frag \n"));
2080 abort ();
2083 valueT
2084 md_section_align (segT segment, valueT size)
2086 int align = bfd_get_section_alignment (stdoutput, segment);
2087 return ((size + (1 << align) - 1) & (-1 << align));
2090 void
2091 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2093 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2094 long val = *valP;
2096 switch (fixP->fx_size)
2098 case 1:
2099 *buf++ = val;
2100 break;
2101 case 2:
2102 *buf++ = (val >> 8);
2103 *buf++ = val;
2104 break;
2105 case 4:
2106 *buf++ = (val >> 24);
2107 *buf++ = (val >> 16);
2108 *buf++ = (val >> 8);
2109 *buf++ = val;
2110 break;
2111 case 8:
2112 /* This can arise when the .quad or .8byte pseudo-ops are used.
2113 Returning here (without setting fx_done) will cause the code
2114 to attempt to generate a reloc which will then fail with the
2115 slightly more helpful error message: "Cannot represent
2116 relocation type BFD_RELOC_64". */
2117 return;
2118 default:
2119 abort ();
2122 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2123 fixP->fx_done = 1;
2127 md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED,
2128 segT segment_type ATTRIBUTE_UNUSED)
2130 printf (_("call to md_estimate_size_before_relax \n"));
2131 abort ();
2134 /* Put number into target byte order. */
2135 void
2136 md_number_to_chars (char *ptr, valueT use, int nbytes)
2138 number_to_chars_bigendian (ptr, use, nbytes);
2141 long
2142 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2144 abort ();
2147 arelent *
2148 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2150 arelent *rel;
2151 bfd_reloc_code_real_type r_type;
2153 if (fixp->fx_addsy && fixp->fx_subsy)
2155 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2156 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2158 as_bad_where (fixp->fx_file, fixp->fx_line,
2159 _("Difference of symbols in different sections is not supported"));
2160 return NULL;
2164 rel = xmalloc (sizeof (arelent));
2165 rel->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
2166 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2167 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2168 rel->addend = fixp->fx_offset;
2170 r_type = fixp->fx_r_type;
2172 #define DEBUG 0
2173 #if DEBUG
2174 fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2175 fflush (stderr);
2176 #endif
2177 rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2178 if (rel->howto == NULL)
2180 as_bad_where (fixp->fx_file, fixp->fx_line,
2181 _("Cannot represent relocation type %s"),
2182 bfd_get_reloc_code_name (r_type));
2183 return NULL;
2186 return rel;