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