1 /* tc-h8300.c -- Assemble code for the Renesas H8/300
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 /* Written By Steve Chamberlain <sac@cygnus.com>. */
25 #include "dwarf2dbg.h"
28 #define h8_opcodes ops
29 #include "opcode/h8300.h"
30 #include "safe-ctype.h"
33 const char comment_chars
[] = ";";
34 const char line_comment_chars
[] = "#";
36 const char line_separator_chars
[] = "!";
38 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);
55 static int default_mach
= bfd_mach_h8300
;
57 #define PSIZE (Hmode && !Nmode ? L_32 : L_16)
59 static int bsize
= L_8
; /* Default branch displacement. */
67 const struct h8_opcode
*opcode
;
70 static struct h8_instruction
*h8_instructions
;
73 h8300hmode (int arg ATTRIBUTE_UNUSED
)
77 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300h
))
78 as_warn (_("could not set architecture and machine"));
82 h8300smode (int arg ATTRIBUTE_UNUSED
)
86 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300s
))
87 as_warn (_("could not set architecture and machine"));
91 h8300hnmode (int arg ATTRIBUTE_UNUSED
)
96 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300hn
))
97 as_warn (_("could not set architecture and machine"));
101 h8300snmode (int arg ATTRIBUTE_UNUSED
)
106 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300sn
))
107 as_warn (_("could not set architecture and machine"));
111 h8300sxmode (int arg ATTRIBUTE_UNUSED
)
116 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300sx
))
117 as_warn (_("could not set architecture and machine"));
121 h8300sxnmode (int arg ATTRIBUTE_UNUSED
)
127 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300sxn
))
128 as_warn (_("could not set architecture and machine"));
138 pint (int arg ATTRIBUTE_UNUSED
)
140 cons (Hmode
? 4 : 2);
143 /* Like obj_elf_section, but issues a warning for new
144 sections which do not have an attribute specification. */
147 h8300_elf_section (int push
)
149 static const char * known_data_sections
[] = { ".rodata", ".tdata", ".tbss" };
150 static const char * known_data_prefixes
[] = { ".debug", ".zdebug", ".gnu.warning" };
151 char * saved_ilp
= input_line_pointer
;
154 name
= obj_elf_section_name ();
158 if (* input_line_pointer
!= ','
159 && bfd_get_section_by_name (stdoutput
, name
) == NULL
)
163 /* Ignore this warning for well known data sections. */
164 for (i
= ARRAY_SIZE (known_data_sections
); i
--;)
165 if (strcmp (name
, known_data_sections
[i
]) == 0)
169 for (i
= ARRAY_SIZE (known_data_prefixes
); i
--;)
170 if (strncmp (name
, known_data_prefixes
[i
],
171 strlen (known_data_prefixes
[i
])) == 0)
175 as_warn (_("new section '%s' defined without attributes - this might cause problems"), name
);
178 /* FIXME: We ought to free the memory allocated by obj_elf_section_name()
179 for 'name', but we do not know if it was taken from the obstack, via
180 demand_copy_C_string(), or xmalloc()ed. */
181 input_line_pointer
= saved_ilp
;
182 obj_elf_section (push
);
185 /* This table describes all the machine specific pseudo-ops the assembler
186 has to support. The fields are:
187 pseudo-op name without dot
188 function to call to execute this pseudo-op
189 Integer arg to pass to the function. */
191 const pseudo_typeS md_pseudo_table
[] =
193 {"h8300h", h8300hmode
, 0},
194 {"h8300hn", h8300hnmode
, 0},
195 {"h8300s", h8300smode
, 0},
196 {"h8300sn", h8300snmode
, 0},
197 {"h8300sx", h8300sxmode
, 0},
198 {"h8300sxn", h8300sxnmode
, 0},
199 {"sbranch", sbranch
, L_8
},
200 {"lbranch", sbranch
, L_16
},
206 {"form", listing_psize
, 0},
207 {"heading", listing_title
, 0},
208 {"import", s_ignore
, 0},
209 {"page", listing_eject
, 0},
210 {"program", s_ignore
, 0},
212 {"section", h8300_elf_section
, 0},
213 {"section.s", h8300_elf_section
, 0},
214 {"sect", h8300_elf_section
, 0},
215 {"sect.s", h8300_elf_section
, 0},
220 const char EXP_CHARS
[] = "eE";
222 /* Chars that mean this number is a floating point constant
225 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
227 static struct hash_control
*opcode_hash_control
; /* Opcode mnemonics. */
229 /* This function is called once, at assembler startup time. This
230 should set up all the tables, etc. that the MD part of the assembler
236 unsigned int nopcodes
;
237 struct h8_opcode
*p
, *p1
;
238 struct h8_instruction
*pi
;
239 char prev_buffer
[100];
242 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, default_mach
))
243 as_warn (_("could not set architecture and machine"));
245 opcode_hash_control
= hash_new ();
248 nopcodes
= sizeof (h8_opcodes
) / sizeof (struct h8_opcode
);
250 h8_instructions
= XNEWVEC (struct h8_instruction
, nopcodes
);
252 pi
= h8_instructions
;
254 /* We do a minimum amount of sorting on the opcode table; this is to
255 make it easy to describe the mova instructions without unnecessary
257 Sorting only takes place inside blocks of instructions of the form
258 X/Y, so for example mova/b, mova/w and mova/l can be intermixed. */
261 struct h8_opcode
*first_skipped
= 0;
263 const char *src
= p1
->name
;
268 /* Strip off any . part when inserting the opcode and only enter
269 unique codes into the hash table. */
270 dst
= buffer
= XNEWVEC (char, strlen (src
) + 1);
279 cmplen
= src
- p1
->name
+ 1;
286 hash_insert (opcode_hash_control
, buffer
, (char *) pi
);
287 strcpy (prev_buffer
, buffer
);
290 for (p
= p1
; p
->name
; p
++)
292 /* A negative TIME is used to indicate that we've added this opcode
296 if (strncmp (p
->name
, buffer
, cmplen
) != 0
297 || (p
->name
[cmplen
] != '\0' && p
->name
[cmplen
] != '.'
298 && p
->name
[cmplen
- 1] != '/'))
300 if (first_skipped
== 0)
304 if (strncmp (p
->name
, buffer
, len
) != 0)
306 if (first_skipped
== 0)
312 pi
->size
= p
->name
[len
] == '.' ? p
->name
[len
+ 1] : 0;
315 /* Find the number of operands. */
317 while (pi
->noperands
< 3 && p
->args
.nib
[pi
->noperands
] != (op_type
) E
)
320 /* Find the length of the opcode in bytes. */
322 while (p
->data
.nib
[pi
->length
* 2] != (op_type
) E
)
331 /* Add entry for the NULL vector terminator. */
348 static void clever_message (const struct h8_instruction
*, struct h8_op
*);
349 static void fix_operand_size (struct h8_op
*, int);
350 static void build_bytes (const struct h8_instruction
*, struct h8_op
*);
351 static void do_a_fix_imm (int, int, struct h8_op
*, int, const struct h8_instruction
*);
352 static void check_operand (struct h8_op
*, unsigned int, const char *);
353 static const struct h8_instruction
* get_specific (const struct h8_instruction
*, struct h8_op
*, int) ;
354 static char *get_operands (unsigned, char *, struct h8_op
*);
355 static void get_operand (char **, struct h8_op
*, int);
356 static int parse_reg (char *, op_type
*, unsigned *, int);
357 static char *skip_colonthing (char *, int *);
358 static char *parse_exp (char *, struct h8_op
*);
360 static int constant_fits_size_p (struct h8_op
*, int, int);
364 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
373 /* Try to parse a reg name. Return the number of chars consumed. */
376 parse_reg (char *src
, op_type
*mode
, unsigned int *reg
, int direction
)
381 /* Cribbed from get_symbol_name. */
382 if (!is_name_beginner (*src
) || *src
== '\001')
385 while ((is_part_of_name (*end
) && *end
!= '.') || *end
== '\001')
389 if (len
== 2 && TOLOWER (src
[0]) == 's' && TOLOWER (src
[1]) == 'p')
391 *mode
= PSIZE
| REG
| direction
;
396 TOLOWER (src
[0]) == 'c' &&
397 TOLOWER (src
[1]) == 'c' &&
398 TOLOWER (src
[2]) == 'r')
405 TOLOWER (src
[0]) == 'e' &&
406 TOLOWER (src
[1]) == 'x' &&
407 TOLOWER (src
[2]) == 'r')
414 TOLOWER (src
[0]) == 'v' &&
415 TOLOWER (src
[1]) == 'b' &&
416 TOLOWER (src
[2]) == 'r')
423 TOLOWER (src
[0]) == 's' &&
424 TOLOWER (src
[1]) == 'b' &&
425 TOLOWER (src
[2]) == 'r')
431 if (len
== 2 && TOLOWER (src
[0]) == 'f' && TOLOWER (src
[1]) == 'p')
433 *mode
= PSIZE
| REG
| direction
;
437 if (len
== 3 && TOLOWER (src
[0]) == 'e' && TOLOWER (src
[1]) == 'r' &&
438 src
[2] >= '0' && src
[2] <= '7')
440 *mode
= L_32
| REG
| direction
;
443 as_warn (_("Reg not valid for H8/300"));
446 if (len
== 2 && TOLOWER (src
[0]) == 'e' && src
[1] >= '0' && src
[1] <= '7')
448 *mode
= L_16
| REG
| direction
;
449 *reg
= src
[1] - '0' + 8;
451 as_warn (_("Reg not valid for H8/300"));
455 if (TOLOWER (src
[0]) == 'r')
457 if (src
[1] >= '0' && src
[1] <= '7')
459 if (len
== 3 && TOLOWER (src
[2]) == 'l')
461 *mode
= L_8
| REG
| direction
;
462 *reg
= (src
[1] - '0') + 8;
465 if (len
== 3 && TOLOWER (src
[2]) == 'h')
467 *mode
= L_8
| REG
| direction
;
468 *reg
= (src
[1] - '0');
473 *mode
= L_16
| REG
| direction
;
474 *reg
= (src
[1] - '0');
484 /* Parse an immediate or address-related constant and store it in OP.
485 If the user also specifies the operand's size, store that size
486 in OP->MODE, otherwise leave it for later code to decide. */
489 parse_exp (char *src
, struct h8_op
*op
)
493 save
= input_line_pointer
;
494 input_line_pointer
= src
;
495 expression (&op
->exp
);
496 if (op
->exp
.X_op
== O_absent
)
497 as_bad (_("missing operand"));
498 src
= input_line_pointer
;
499 input_line_pointer
= save
;
501 return skip_colonthing (src
, &op
->mode
);
505 /* If SRC starts with an explicit operand size, skip it and store the size
506 in *MODE. Leave *MODE unchanged otherwise. */
509 skip_colonthing (char *src
, int *mode
)
515 if (src
[0] == '8' && !ISDIGIT (src
[1]))
517 else if (src
[0] == '2' && !ISDIGIT (src
[1]))
519 else if (src
[0] == '3' && !ISDIGIT (src
[1]))
521 else if (src
[0] == '4' && !ISDIGIT (src
[1]))
523 else if (src
[0] == '5' && !ISDIGIT (src
[1]))
525 else if (src
[0] == '2' && src
[1] == '4' && !ISDIGIT (src
[2]))
527 else if (src
[0] == '3' && src
[1] == '2' && !ISDIGIT (src
[2]))
529 else if (src
[0] == '1' && src
[1] == '6' && !ISDIGIT (src
[2]))
532 as_bad (_("invalid operand size requested"));
534 while (ISDIGIT (*src
))
540 /* The many forms of operand:
543 @Rn Register indirect
544 @(exp[:16], Rn) Register indirect with displacement
548 @aa:16 absolute 16 bit
551 #xx[:size] immediate data
552 @(exp:[8], pc) pc rel
553 @@aa[:8] memory indirect. */
556 constant_fits_width_p (struct h8_op
*operand
, offsetT width
)
560 num
= ((operand
->exp
.X_add_number
& 0xffffffff) ^ 0x80000000) - 0x80000000;
561 return (num
& ~width
) == 0 || (num
| width
) == ~0;
565 constant_fits_size_p (struct h8_op
*operand
, int size
, int no_symbols
)
570 && (operand
->exp
.X_add_symbol
!= 0 || operand
->exp
.X_op_symbol
!= 0))
572 num
= operand
->exp
.X_add_number
& 0xffffffff;
576 return (num
& ~3) == 0;
578 return (num
& ~7) == 0;
580 return num
>= 1 && num
< 8;
582 return (num
& ~15) == 0;
584 return num
>= 1 && num
< 32;
586 num
= (num
^ 0x80000000) - 0x80000000;
587 return (num
& ~0xFF) == 0 || (num
| 0x7F) == ~0;
589 return (num
& ~0xFF) == 0;
591 num
= (num
^ 0x80000000) - 0x80000000;
592 return (num
& ~0xFFFF) == 0 || (num
| 0x7FFF) == ~0;
594 return (num
& ~0xFFFF) == 0;
603 get_operand (char **ptr
, struct h8_op
*op
, int direction
)
612 /* Check for '(' and ')' for instructions ldm and stm. */
613 if (src
[0] == '(' && src
[8] == ')')
616 /* Gross. Gross. ldm and stm have a format not easily handled
617 by get_operand. We deal with it explicitly here. */
618 if (TOLOWER (src
[0]) == 'e' && TOLOWER (src
[1]) == 'r' &&
619 ISDIGIT (src
[2]) && src
[3] == '-' &&
620 TOLOWER (src
[4]) == 'e' && TOLOWER (src
[5]) == 'r' && ISDIGIT (src
[6]))
627 /* Check register pair's validity as per tech note TN-H8*-193A/E
628 from Renesas for H8S and H8SX hardware manual. */
629 if ( !(low
== 0 && (high
== 1 || high
== 2 || high
== 3))
630 && !(low
== 1 && (high
== 2 || high
== 3 || high
== 4) && SXmode
)
631 && !(low
== 2 && (high
== 3 || ((high
== 4 || high
== 5) && SXmode
)))
632 && !(low
== 3 && (high
== 4 || high
== 5 || high
== 6) && SXmode
)
633 && !(low
== 4 && (high
== 5 || high
== 6))
634 && !(low
== 4 && high
== 7 && SXmode
)
635 && !(low
== 5 && (high
== 6 || high
== 7) && SXmode
)
636 && !(low
== 6 && high
== 7 && SXmode
))
637 as_bad (_("Invalid register list for ldm/stm\n"));
639 /* Even sicker. We encode two registers into op->reg. One
640 for the low register to save, the other for the high
641 register to save; we also set the high bit in op->reg
642 so we know this is "very special". */
643 op
->reg
= 0x80000000 | (high
<< 8) | low
;
652 len
= parse_reg (src
, &op
->mode
, &op
->reg
, direction
);
658 int size
= op
->mode
& SIZE
;
663 as_warn (_("mismatch between register and suffix"));
664 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
667 if (size
!= L_32
&& size
!= L_16
)
668 as_warn (_("mismatch between register and suffix"));
669 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
670 op
->mode
= (op
->mode
& ~SIZE
) | L_16
;
673 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
674 if (size
!= L_32
&& size
!= L_8
)
675 as_warn (_("mismatch between register and suffix"));
676 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
677 op
->mode
= (op
->mode
& ~SIZE
) | L_8
;
680 as_warn (_("invalid suffix after register."));
694 *ptr
= parse_exp (src
+ 1, op
);
695 if (op
->exp
.X_add_number
>= 0x100)
700 /* FIXME : 2? or 4? */
701 if (op
->exp
.X_add_number
>= 0x400)
702 as_bad (_("address too high for vector table jmp/jsr"));
703 else if (op
->exp
.X_add_number
>= 0x200)
708 op
->exp
.X_add_number
= op
->exp
.X_add_number
/ divisor
- 0x80;
715 if (*src
== '-' || *src
== '+')
717 len
= parse_reg (src
+ 1, &mode
, &num
, direction
);
720 /* Oops, not a reg after all, must be ordinary exp. */
721 op
->mode
= ABS
| direction
;
722 *ptr
= parse_exp (src
, op
);
726 if (((mode
& SIZE
) != PSIZE
)
727 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
728 && (!Nmode
|| ((mode
& SIZE
) != L_32
)))
729 as_bad (_("Wrong size pointer register for architecture."));
731 op
->mode
= src
[0] == '-' ? RDPREDEC
: RDPREINC
;
733 *ptr
= src
+ 1 + len
;
740 /* See if this is @(ERn.x, PC). */
741 len
= parse_reg (src
, &mode
, &op
->reg
, direction
);
742 if (len
!= 0 && (mode
& MODE
) == REG
&& src
[len
] == '.')
744 switch (TOLOWER (src
[len
+ 1]))
747 mode
= PCIDXB
| direction
;
750 mode
= PCIDXW
| direction
;
753 mode
= PCIDXL
| direction
;
760 && src
[len
+ 2] == ','
761 && TOLOWER (src
[len
+ 3]) != 'p'
762 && TOLOWER (src
[len
+ 4]) != 'c'
763 && src
[len
+ 5] != ')')
765 *ptr
= src
+ len
+ 6;
769 /* Fall through into disp case - the grammar is somewhat
770 ambiguous, so we should try whether it's a DISP operand
771 after all ("ER3.L" might be a poorly named label...). */
776 /* Start off assuming a 16 bit offset. */
778 src
= parse_exp (src
, op
);
781 op
->mode
|= ABS
| direction
;
788 as_bad (_("expected @(exp, reg16)"));
793 len
= parse_reg (src
, &mode
, &op
->reg
, direction
);
794 if (len
== 0 || (mode
& MODE
) != REG
)
796 as_bad (_("expected @(exp, reg16)"));
802 switch (TOLOWER (src
[1]))
805 op
->mode
|= INDEXB
| direction
;
808 op
->mode
|= INDEXW
| direction
;
811 op
->mode
|= INDEXL
| direction
;
814 as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
820 op
->mode
|= DISP
| direction
;
821 src
= skip_colonthing (src
, &op
->mode
);
825 as_bad (_("expected @(exp, reg16)"));
831 len
= parse_reg (src
, &mode
, &num
, direction
);
836 if (*src
== '+' || *src
== '-')
838 if (((mode
& SIZE
) != PSIZE
)
839 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
840 && (!Nmode
|| ((mode
& SIZE
) != L_32
)))
841 as_bad (_("Wrong size pointer register for architecture."));
842 op
->mode
= *src
== '+' ? RSPOSTINC
: RSPOSTDEC
;
848 if (((mode
& SIZE
) != PSIZE
)
849 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
850 && (!Nmode
|| ((mode
& SIZE
) != L_32
)))
851 as_bad (_("Wrong size pointer register for architecture."));
853 op
->mode
= direction
| IND
| PSIZE
;
861 /* must be a symbol */
863 op
->mode
= ABS
| direction
;
864 *ptr
= parse_exp (src
, op
);
872 *ptr
= parse_exp (src
+ 1, op
);
875 else if (strncmp (src
, "mach", 4) == 0 ||
876 strncmp (src
, "macl", 4) == 0 ||
877 strncmp (src
, "MACH", 4) == 0 ||
878 strncmp (src
, "MACL", 4) == 0)
880 op
->reg
= TOLOWER (src
[3]) == 'l';
888 *ptr
= parse_exp (src
, op
);
893 get_operands (unsigned int noperands
, char *op_end
, struct h8_op
*operand
)
904 get_operand (&ptr
, operand
+ 0, SRC
);
908 get_operand (&ptr
, operand
+ 1, DST
);
914 get_operand (&ptr
, operand
+ 0, SRC
);
917 get_operand (&ptr
, operand
+ 1, DST
);
922 get_operand (&ptr
, operand
+ 0, SRC
);
925 get_operand (&ptr
, operand
+ 1, DST
);
928 get_operand (&ptr
, operand
+ 2, OP3
);
938 /* MOVA has special requirements. Rather than adding twice the amount of
939 addressing modes, we simply special case it a bit. */
941 get_mova_operands (char *op_end
, struct h8_op
*operand
)
945 if (ptr
[1] != '@' || ptr
[2] != '(')
949 ptr
= parse_exp (ptr
, &operand
[0]);
954 get_operand (&ptr
, operand
+ 1, DST
);
962 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXB
;
965 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXW
;
968 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXL
;
974 else if ((operand
[1].mode
& MODE
) == LOWREG
)
976 switch (operand
[1].mode
& SIZE
)
979 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXB
;
982 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXW
;
985 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXL
;
994 if (*ptr
++ != ')' || *ptr
++ != ',')
996 get_operand (&ptr
, operand
+ 2, OP3
);
997 /* See if we can use the short form of MOVA. */
998 if (((operand
[1].mode
& MODE
) == REG
|| (operand
[1].mode
& MODE
) == LOWREG
)
999 && (operand
[2].mode
& MODE
) == REG
1000 && (operand
[1].reg
& 7) == (operand
[2].reg
& 7))
1002 operand
[1].mode
= operand
[2].mode
= 0;
1003 operand
[0].reg
= operand
[2].reg
& 7;
1008 as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
1012 get_rtsl_operands (char *ptr
, struct h8_op
*operand
)
1014 int mode
, len
, type
= 0;
1015 unsigned int num
, num2
;
1023 len
= parse_reg (ptr
, &mode
, &num
, SRC
);
1024 if (len
== 0 || (mode
& MODE
) != REG
)
1026 as_bad (_("expected register"));
1032 len
= parse_reg (++ptr
, &mode
, &num2
, SRC
);
1033 if (len
== 0 || (mode
& MODE
) != REG
)
1035 as_bad (_("expected register"));
1039 /* CONST_xxx are used as placeholders in the opcode table. */
1043 as_bad (_("invalid register list"));
1048 num2
= num
, num
= 0;
1049 if (type
== 1 && *ptr
++ != ')')
1051 as_bad (_("expected closing paren"));
1054 operand
[0].mode
= RS32
;
1055 operand
[1].mode
= RD32
;
1056 operand
[0].reg
= num
;
1057 operand
[1].reg
= num2
;
1060 /* Passed a pointer to a list of opcodes which use different
1061 addressing modes, return the opcode which matches the opcodes
1064 static const struct h8_instruction
*
1065 get_specific (const struct h8_instruction
*instruction
,
1066 struct h8_op
*operands
, int size
)
1068 const struct h8_instruction
*this_try
= instruction
;
1069 const struct h8_instruction
*found_other
= 0, *found_mismatched
= 0;
1071 int this_index
= instruction
->idx
;
1074 /* There's only one ldm/stm and it's easier to just
1075 get out quick for them. */
1076 if (OP_KIND (instruction
->opcode
->how
) == O_LDM
1077 || OP_KIND (instruction
->opcode
->how
) == O_STM
)
1080 while (noperands
< 3 && operands
[noperands
].mode
!= 0)
1083 while (this_index
== instruction
->idx
&& !found
)
1088 this_try
= instruction
++;
1089 this_size
= this_try
->opcode
->how
& SN
;
1091 if (this_try
->noperands
!= noperands
)
1093 else if (this_try
->noperands
> 0)
1097 for (i
= 0; i
< this_try
->noperands
&& found
; i
++)
1099 op_type op
= this_try
->opcode
->args
.nib
[i
];
1100 int op_mode
= op
& MODE
;
1101 int op_size
= op
& SIZE
;
1102 int x
= operands
[i
].mode
;
1103 int x_mode
= x
& MODE
;
1104 int x_size
= x
& SIZE
;
1106 if (op_mode
== LOWREG
&& (x_mode
== REG
|| x_mode
== LOWREG
))
1108 if ((x_size
== L_8
&& (operands
[i
].reg
& 8) == 0)
1109 || (x_size
== L_16
&& (operands
[i
].reg
& 8) == 8))
1110 as_warn (_("can't use high part of register in operand %d"), i
);
1112 if (x_size
!= op_size
)
1115 else if (op_mode
== REG
)
1117 if (x_mode
== LOWREG
)
1123 x_size
= (Hmode
? L_32
: L_16
);
1125 op_size
= (Hmode
? L_32
: L_16
);
1127 /* The size of the reg is v important. */
1128 if (op_size
!= x_size
)
1131 else if (op_mode
& CTRL
) /* control register */
1133 if (!(x_mode
& CTRL
))
1139 if (op_mode
!= CCR
&&
1140 op_mode
!= CCR_EXR
&&
1141 op_mode
!= CC_EX_VB_SB
)
1145 if (op_mode
!= EXR
&&
1146 op_mode
!= CCR_EXR
&&
1147 op_mode
!= CC_EX_VB_SB
)
1151 if (op_mode
!= MACH
&&
1156 if (op_mode
!= MACL
&&
1161 if (op_mode
!= VBR
&&
1162 op_mode
!= VBR_SBR
&&
1163 op_mode
!= CC_EX_VB_SB
)
1167 if (op_mode
!= SBR
&&
1168 op_mode
!= VBR_SBR
&&
1169 op_mode
!= CC_EX_VB_SB
)
1174 else if ((op
& ABSJMP
) && (x_mode
== ABS
|| x_mode
== PCREL
))
1176 operands
[i
].mode
&= ~MODE
;
1177 operands
[i
].mode
|= ABSJMP
;
1178 /* But it may not be 24 bits long. */
1179 if (x_mode
== ABS
&& !Hmode
)
1181 operands
[i
].mode
&= ~SIZE
;
1182 operands
[i
].mode
|= L_16
;
1184 if ((operands
[i
].mode
& SIZE
) == L_32
1185 && (op_mode
& SIZE
) != L_32
)
1188 else if (x_mode
== IMM
&& op_mode
!= IMM
)
1190 offsetT num
= operands
[i
].exp
.X_add_number
& 0xffffffff;
1191 if (op_mode
== KBIT
|| op_mode
== DBIT
)
1192 /* This is ok if the immediate value is sensible. */;
1193 else if (op_mode
== CONST_2
)
1195 else if (op_mode
== CONST_4
)
1197 else if (op_mode
== CONST_8
)
1199 else if (op_mode
== CONST_16
)
1204 else if (op_mode
== PCREL
&& op_mode
== x_mode
)
1206 /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1207 If x_size is L_8, promote it. */
1208 if (OP_KIND (this_try
->opcode
->how
) == O_MOVSD
1209 || OP_KIND (this_try
->opcode
->how
) == O_BSRBC
1210 || OP_KIND (this_try
->opcode
->how
) == O_BSRBS
)
1214 /* The size of the displacement is important. */
1215 if (op_size
!= x_size
)
1218 else if ((op_mode
== DISP
|| op_mode
== IMM
|| op_mode
== ABS
1219 || op_mode
== INDEXB
|| op_mode
== INDEXW
1220 || op_mode
== INDEXL
)
1221 && op_mode
== x_mode
)
1223 /* Promote a L_24 to L_32 if it makes us match. */
1224 if (x_size
== L_24
&& op_size
== L_32
)
1230 if (((x_size
== L_16
&& op_size
== L_16U
)
1231 || (x_size
== L_8
&& op_size
== L_8U
)
1232 || (x_size
== L_3
&& op_size
== L_3NZ
))
1233 /* We're deliberately more permissive for ABS modes. */
1235 || constant_fits_size_p (operands
+ i
, op_size
,
1239 if (x_size
!= 0 && op_size
!= x_size
)
1241 else if (x_size
== 0
1242 && ! constant_fits_size_p (operands
+ i
, op_size
,
1246 else if (op_mode
!= x_mode
)
1254 if ((this_try
->opcode
->available
== AV_H8SX
&& ! SXmode
)
1255 || (this_try
->opcode
->available
== AV_H8S
&& ! Smode
)
1256 || (this_try
->opcode
->available
== AV_H8H
&& ! Hmode
))
1257 found
= 0, found_other
= this_try
;
1258 else if (this_size
!= size
&& (this_size
!= SN
&& size
!= SN
))
1259 found_mismatched
= this_try
, found
= 0;
1267 as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1268 found_other
->opcode
->name
,
1269 (! Hmode
&& ! Smode
? "H8/300"
1274 else if (found_mismatched
)
1276 as_warn (_("mismatch between opcode size and operand size"));
1277 return found_mismatched
;
1283 check_operand (struct h8_op
*operand
, unsigned int width
, const char *string
)
1285 if (operand
->exp
.X_add_symbol
== 0
1286 && operand
->exp
.X_op_symbol
== 0)
1288 /* No symbol involved, let's look at offset, it's dangerous if
1289 any of the high bits are not 0 or ff's, find out by oring or
1290 anding with the width and seeing if the answer is 0 or all
1293 if (! constant_fits_width_p (operand
, width
))
1296 && (operand
->exp
.X_add_number
& 0xff00) == 0xff00)
1298 /* Just ignore this one - which happens when trying to
1299 fit a 16 bit address truncated into an 8 bit address
1300 of something like bset. */
1302 else if (strcmp (string
, "@") == 0
1304 && (operand
->exp
.X_add_number
& 0xff8000) == 0xff8000)
1306 /* Just ignore this one - which happens when trying to
1307 fit a 24 bit address truncated into a 16 bit address
1308 of something like mov.w. */
1312 as_warn (_("operand %s0x%lx out of range."), string
,
1313 (unsigned long) operand
->exp
.X_add_number
);
1319 /* RELAXMODE has one of 3 values:
1321 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1323 1 Output a relaxable 24bit absolute mov.w address relocation
1324 (may relax into a 16bit absolute address).
1326 2 Output a relaxable 16/24 absolute mov.b address relocation
1327 (may relax into an 8bit absolute address). */
1330 do_a_fix_imm (int offset
, int nibble
, struct h8_op
*operand
, int relaxmode
, const struct h8_instruction
*this_try
)
1335 char *bytes
= frag_now
->fr_literal
+ offset
;
1337 const char *t
= ((operand
->mode
& MODE
) == IMM
) ? "#" : "@";
1339 if (operand
->exp
.X_add_symbol
== 0)
1341 switch (operand
->mode
& SIZE
)
1344 check_operand (operand
, 0x3, t
);
1345 bytes
[0] |= (operand
->exp
.X_add_number
& 3) << (nibble
? 0 : 4);
1349 check_operand (operand
, 0x7, t
);
1350 bytes
[0] |= (operand
->exp
.X_add_number
& 7) << (nibble
? 0 : 4);
1353 check_operand (operand
, 0xF, t
);
1354 bytes
[0] |= (operand
->exp
.X_add_number
& 15) << (nibble
? 0 : 4);
1357 check_operand (operand
, 0x1F, t
);
1358 bytes
[0] |= operand
->exp
.X_add_number
& 31;
1362 check_operand (operand
, 0xff, t
);
1363 bytes
[0] |= operand
->exp
.X_add_number
;
1367 check_operand (operand
, 0xffff, t
);
1368 bytes
[0] |= operand
->exp
.X_add_number
>> 8;
1369 bytes
[1] |= operand
->exp
.X_add_number
>> 0;
1370 /* MOVA needs both relocs to relax the second operand properly. */
1372 && (OP_KIND(this_try
->opcode
->how
) == O_MOVAB
1373 || OP_KIND(this_try
->opcode
->how
) == O_MOVAW
1374 || OP_KIND(this_try
->opcode
->how
) == O_MOVAL
))
1377 fix_new_exp (frag_now
, offset
, 2, &operand
->exp
, 0, idx
);
1381 check_operand (operand
, 0xffffff, t
);
1382 bytes
[0] |= operand
->exp
.X_add_number
>> 16;
1383 bytes
[1] |= operand
->exp
.X_add_number
>> 8;
1384 bytes
[2] |= operand
->exp
.X_add_number
>> 0;
1388 /* This should be done with bfd. */
1389 bytes
[0] |= operand
->exp
.X_add_number
>> 24;
1390 bytes
[1] |= operand
->exp
.X_add_number
>> 16;
1391 bytes
[2] |= operand
->exp
.X_add_number
>> 8;
1392 bytes
[3] |= operand
->exp
.X_add_number
>> 0;
1395 if ((operand
->mode
& MODE
) == DISP
&& relaxmode
== 1)
1396 idx
= BFD_RELOC_H8_DISP32A16
;
1398 idx
= (relaxmode
== 2) ? R_MOV24B1
: R_MOVL1
;
1399 fix_new_exp (frag_now
, offset
, 4, &operand
->exp
, 0, idx
);
1406 switch (operand
->mode
& SIZE
)
1411 where
= (operand
->mode
& SIZE
) == L_24
? -1 : 0;
1412 if ((operand
->mode
& MODE
) == DISP
&& relaxmode
== 1)
1413 idx
= BFD_RELOC_H8_DISP32A16
;
1414 else if (relaxmode
== 2)
1416 else if (relaxmode
== 1)
1422 as_bad (_("Can't work out size of operand.\n"));
1432 operand
->exp
.X_add_number
=
1433 ((operand
->exp
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1434 operand
->exp
.X_add_number
|= (bytes
[0] << 8) | bytes
[1];
1440 operand
->exp
.X_add_number
=
1441 ((operand
->exp
.X_add_number
& 0xff) ^ 0x80) - 0x80;
1442 operand
->exp
.X_add_number
|= bytes
[0];
1445 fix_new_exp (frag_now
,
1454 /* Now we know what sort of opcodes it is, let's build the bytes. */
1457 build_bytes (const struct h8_instruction
*this_try
, struct h8_op
*operand
)
1460 char *output
= frag_more (this_try
->length
);
1461 const op_type
*nibble_ptr
= this_try
->opcode
->data
.nib
;
1463 unsigned int nibble_count
= 0;
1467 char asnibbles
[100];
1468 char *p
= asnibbles
;
1471 if (!Hmode
&& this_try
->opcode
->available
!= AV_H8
)
1472 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1473 this_try
->opcode
->name
);
1475 && this_try
->opcode
->available
!= AV_H8
1476 && this_try
->opcode
->available
!= AV_H8H
)
1477 as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1478 this_try
->opcode
->name
);
1480 && this_try
->opcode
->available
!= AV_H8
1481 && this_try
->opcode
->available
!= AV_H8H
1482 && this_try
->opcode
->available
!= AV_H8S
)
1483 as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1484 this_try
->opcode
->name
);
1486 while (*nibble_ptr
!= (op_type
) E
)
1493 d
= (c
& OP3
) == OP3
? 2 : (c
& DST
) == DST
? 1 : 0;
1501 if (c2
== REG
|| c2
== LOWREG
1502 || c2
== IND
|| c2
== PREINC
|| c2
== PREDEC
1503 || c2
== POSTINC
|| c2
== POSTDEC
)
1505 nib
= operand
[d
].reg
;
1510 else if (c
& CTRL
) /* Control reg operand. */
1511 nib
= operand
[d
].reg
;
1513 else if ((c
& DISPREG
) == (DISPREG
))
1515 nib
= operand
[d
].reg
;
1519 operand
[d
].mode
= c
;
1520 op_at
[d
] = nibble_count
;
1523 else if (c2
== IMM
|| c2
== PCREL
|| c2
== ABS
1524 || (c
& ABSJMP
) || c2
== DISP
)
1526 operand
[d
].mode
= c
;
1527 op_at
[d
] = nibble_count
;
1530 else if ((c
& IGNORE
) || (c
& DATA
))
1533 else if (c2
== DBIT
)
1535 switch (operand
[0].exp
.X_add_number
)
1544 as_bad (_("Need #1 or #2 here"));
1547 else if (c2
== KBIT
)
1549 switch (operand
[0].exp
.X_add_number
)
1559 as_warn (_("#4 not valid on H8/300."));
1564 as_bad (_("Need #1 or #2 here"));
1567 /* Stop it making a fix. */
1568 operand
[0].mode
= 0;
1572 operand
[d
].mode
|= MEMRELAX
;
1588 if (operand
[0].mode
== MACREG
)
1589 /* stmac has mac[hl] as the first operand. */
1590 nib
= 2 + operand
[0].reg
;
1592 /* ldmac has mac[hl] as the second operand. */
1593 nib
= 2 + operand
[1].reg
;
1601 /* Disgusting. Why, oh why didn't someone ask us for advice
1602 on the assembler format. */
1603 if (OP_KIND (this_try
->opcode
->how
) == O_LDM
)
1605 high
= (operand
[1].reg
>> 8) & 0xf;
1606 low
= (operand
[1].reg
) & 0xf;
1607 asnibbles
[2] = high
- low
;
1608 asnibbles
[7] = high
;
1610 else if (OP_KIND (this_try
->opcode
->how
) == O_STM
)
1612 high
= (operand
[0].reg
>> 8) & 0xf;
1613 low
= (operand
[0].reg
) & 0xf;
1614 asnibbles
[2] = high
- low
;
1618 for (i
= 0; i
< this_try
->length
; i
++)
1619 output
[i
] = (asnibbles
[i
* 2] << 4) | asnibbles
[i
* 2 + 1];
1621 /* Note if this is a mov.b or a bit manipulation instruction
1622 there is a special relaxation which only applies. */
1623 if ( this_try
->opcode
->how
== O (O_MOV
, SB
)
1624 || this_try
->opcode
->how
== O (O_BCLR
, SB
)
1625 || this_try
->opcode
->how
== O (O_BAND
, SB
)
1626 || this_try
->opcode
->how
== O (O_BIAND
, SB
)
1627 || this_try
->opcode
->how
== O (O_BILD
, SB
)
1628 || this_try
->opcode
->how
== O (O_BIOR
, SB
)
1629 || this_try
->opcode
->how
== O (O_BIST
, SB
)
1630 || this_try
->opcode
->how
== O (O_BIXOR
, SB
)
1631 || this_try
->opcode
->how
== O (O_BLD
, SB
)
1632 || this_try
->opcode
->how
== O (O_BNOT
, SB
)
1633 || this_try
->opcode
->how
== O (O_BOR
, SB
)
1634 || this_try
->opcode
->how
== O (O_BSET
, SB
)
1635 || this_try
->opcode
->how
== O (O_BST
, SB
)
1636 || this_try
->opcode
->how
== O (O_BTST
, SB
)
1637 || this_try
->opcode
->how
== O (O_BXOR
, SB
))
1640 /* Output any fixes. */
1641 for (i
= 0; i
< this_try
->noperands
; i
++)
1643 int x
= operand
[i
].mode
;
1644 int x_mode
= x
& MODE
;
1646 if (x_mode
== IMM
|| x_mode
== DISP
)
1647 do_a_fix_imm (output
- frag_now
->fr_literal
+ op_at
[i
] / 2,
1648 op_at
[i
] & 1, operand
+ i
, (x
& MEMRELAX
) != 0,
1650 else if (x_mode
== ABS
)
1651 do_a_fix_imm (output
- frag_now
->fr_literal
+ op_at
[i
] / 2,
1652 op_at
[i
] & 1, operand
+ i
,
1653 (x
& MEMRELAX
) ? movb
+ 1 : 0,
1656 else if (x_mode
== PCREL
)
1658 int size16
= (x
& SIZE
) == L_16
;
1659 int size
= size16
? 2 : 1;
1660 int type
= size16
? R_PCRWORD
: R_PCRBYTE
;
1663 check_operand (operand
+ i
, size16
? 0x7fff : 0x7f, "@");
1665 if (operand
[i
].exp
.X_add_number
& 1)
1666 as_warn (_("branch operand has odd offset (%lx)\n"),
1667 (unsigned long) operand
->exp
.X_add_number
);
1670 operand
[i
].exp
.X_add_number
=
1671 ((operand
[i
].exp
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1675 operand
[i
].exp
.X_add_number
=
1676 ((operand
[i
].exp
.X_add_number
& 0xff) ^ 0x80) - 0x80;
1681 operand
[i
].exp
.X_add_number
|= output
[op_at
[i
] / 2];
1683 fixP
= fix_new_exp (frag_now
,
1684 output
- frag_now
->fr_literal
+ op_at
[i
] / 2,
1689 fixP
->fx_signed
= 1;
1691 else if (x_mode
== MEMIND
)
1693 check_operand (operand
+ i
, 0xff, "@@");
1694 fix_new_exp (frag_now
,
1695 output
- frag_now
->fr_literal
+ 1,
1701 else if (x_mode
== VECIND
)
1703 check_operand (operand
+ i
, 0x7f, "@@");
1704 /* FIXME: approximating the effect of "B31" here...
1705 This is very hackish, and ought to be done a better way. */
1706 operand
[i
].exp
.X_add_number
|= 0x80;
1707 fix_new_exp (frag_now
,
1708 output
- frag_now
->fr_literal
+ 1,
1714 else if (x
& ABSJMP
)
1717 bfd_reloc_code_real_type reloc_type
= R_JMPL1
;
1719 /* To be compatible with the proposed H8 ELF format, we
1720 want the relocation's offset to point to the first byte
1721 that will be modified, not to the start of the instruction. */
1723 if ((operand
->mode
& SIZE
) == L_32
)
1726 reloc_type
= R_RELLONG
;
1731 /* This jmp may be a jump or a branch. */
1733 check_operand (operand
+ i
,
1734 SXmode
? 0xffffffff : Hmode
? 0xffffff : 0xffff,
1737 if (operand
[i
].exp
.X_add_number
& 1)
1738 as_warn (_("branch operand has odd offset (%lx)\n"),
1739 (unsigned long) operand
->exp
.X_add_number
);
1742 operand
[i
].exp
.X_add_number
=
1743 ((operand
[i
].exp
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1744 fix_new_exp (frag_now
,
1745 output
- frag_now
->fr_literal
+ where
,
1754 /* Try to give an intelligent error message for common and simple to
1758 clever_message (const struct h8_instruction
*instruction
,
1759 struct h8_op
*operand
)
1761 /* Find out if there was more than one possible opcode. */
1763 if ((instruction
+ 1)->idx
!= instruction
->idx
)
1767 /* Only one opcode of this flavour, try to guess which operand
1769 for (argn
= 0; argn
< instruction
->noperands
; argn
++)
1771 switch (instruction
->opcode
->args
.nib
[argn
])
1774 if (operand
[argn
].mode
!= RD16
)
1776 as_bad (_("destination operand must be 16 bit register"));
1783 if (operand
[argn
].mode
!= RS8
)
1785 as_bad (_("source operand must be 8 bit register"));
1791 if (operand
[argn
].mode
!= ABS16DST
)
1793 as_bad (_("destination operand must be 16bit absolute address"));
1798 if (operand
[argn
].mode
!= RD8
)
1800 as_bad (_("destination operand must be 8 bit register"));
1806 if (operand
[argn
].mode
!= ABS16SRC
)
1808 as_bad (_("source operand must be 16bit absolute address"));
1816 as_bad (_("invalid operands"));
1820 /* If OPERAND is part of an address, adjust its size and value given
1821 that it addresses SIZE bytes.
1823 This function decides how big non-immediate constants are when no
1824 size was explicitly given. It also scales down the assembly-level
1825 displacement in an @(d:2,ERn) operand. */
1828 fix_operand_size (struct h8_op
*operand
, int size
)
1830 if (SXmode
&& (operand
->mode
& MODE
) == DISP
)
1832 /* If the user didn't specify an operand width, see if we
1833 can use @(d:2,ERn). */
1834 if ((operand
->mode
& SIZE
) == 0
1835 && operand
->exp
.X_add_symbol
== 0
1836 && operand
->exp
.X_op_symbol
== 0
1837 && (operand
->exp
.X_add_number
== size
1838 || operand
->exp
.X_add_number
== size
* 2
1839 || operand
->exp
.X_add_number
== size
* 3))
1840 operand
->mode
|= L_2
;
1842 /* Scale down the displacement in an @(d:2,ERn) operand.
1843 X_add_number then contains the desired field value. */
1844 if ((operand
->mode
& SIZE
) == L_2
)
1846 if (operand
->exp
.X_add_number
% size
!= 0)
1847 as_warn (_("operand/size mis-match"));
1848 operand
->exp
.X_add_number
/= size
;
1852 if ((operand
->mode
& SIZE
) == 0)
1853 switch (operand
->mode
& MODE
)
1860 /* Pick a 24-bit address unless we know that a 16-bit address
1861 is safe. get_specific() will relax L_24 into L_32 where
1865 && ((((addressT
) operand
->exp
.X_add_number
+ 0x8000)
1866 & 0xffffffff) > 0xffff
1867 || operand
->exp
.X_add_symbol
!= 0
1868 || operand
->exp
.X_op_symbol
!= 0))
1869 operand
->mode
|= L_24
;
1871 operand
->mode
|= L_16
;
1875 if ((((addressT
) operand
->exp
.X_add_number
+ 0x80)
1876 & 0xffffffff) <= 0xff)
1878 if (operand
->exp
.X_add_symbol
!= NULL
)
1879 operand
->mode
|= bsize
;
1881 operand
->mode
|= L_8
;
1884 operand
->mode
|= L_16
;
1890 /* This is the guts of the machine-dependent assembler. STR points to
1891 a machine dependent instruction. This function is supposed to emit
1892 the frags/bytes it assembles. */
1895 md_assemble (char *str
)
1899 struct h8_op operand
[3];
1900 const struct h8_instruction
*instruction
;
1901 const struct h8_instruction
*prev_instruction
;
1908 /* Drop leading whitespace. */
1912 /* Find the op code end. */
1913 for (op_start
= op_end
= str
;
1914 *op_end
!= 0 && *op_end
!= ' ';
1924 else if (*op_end
== '/' && ! slash
)
1928 if (op_end
== op_start
)
1930 as_bad (_("can't find opcode "));
1936 /* The assembler stops scanning the opcode at slashes, so it fails
1937 to make characters following them lower case. Fix them. */
1940 *slash
= TOLOWER (*slash
);
1942 instruction
= (const struct h8_instruction
*)
1943 hash_find (opcode_hash_control
, op_start
);
1945 if (instruction
== NULL
)
1947 as_bad (_("unknown opcode"));
1951 /* We used to set input_line_pointer to the result of get_operands,
1952 but that is wrong. Our caller assumes we don't change it. */
1954 operand
[0].mode
= 0;
1955 operand
[1].mode
= 0;
1956 operand
[2].mode
= 0;
1958 if (OP_KIND (instruction
->opcode
->how
) == O_MOVAB
1959 || OP_KIND (instruction
->opcode
->how
) == O_MOVAW
1960 || OP_KIND (instruction
->opcode
->how
) == O_MOVAL
)
1961 get_mova_operands (op_end
, operand
);
1962 else if (OP_KIND (instruction
->opcode
->how
) == O_RTEL
1963 || OP_KIND (instruction
->opcode
->how
) == O_RTSL
)
1964 get_rtsl_operands (op_end
, operand
);
1966 get_operands (instruction
->noperands
, op_end
, operand
);
1969 prev_instruction
= instruction
;
1971 /* Now we have operands from instruction.
1972 Let's check them out for ldm and stm. */
1973 if (OP_KIND (instruction
->opcode
->how
) == O_LDM
)
1975 /* The first operand must be @er7+, and the
1976 second operand must be a register pair. */
1977 if ((operand
[0].mode
!= RSINC
)
1978 || (operand
[0].reg
!= 7)
1979 || ((operand
[1].reg
& 0x80000000) == 0))
1980 as_bad (_("invalid operand in ldm"));
1982 else if (OP_KIND (instruction
->opcode
->how
) == O_STM
)
1984 /* The first operand must be a register pair,
1985 and the second operand must be @-er7. */
1986 if (((operand
[0].reg
& 0x80000000) == 0)
1987 || (operand
[1].mode
!= RDDEC
)
1988 || (operand
[1].reg
!= 7))
1989 as_bad (_("invalid operand in stm"));
1995 switch (TOLOWER (*dot
))
2010 if (OP_KIND (instruction
->opcode
->how
) == O_MOVAB
||
2011 OP_KIND (instruction
->opcode
->how
) == O_MOVAW
||
2012 OP_KIND (instruction
->opcode
->how
) == O_MOVAL
)
2014 switch (operand
[0].mode
& MODE
)
2018 fix_operand_size (&operand
[1], 1);
2021 fix_operand_size (&operand
[1], 2);
2024 fix_operand_size (&operand
[1], 4);
2030 for (i
= 0; i
< 3 && operand
[i
].mode
!= 0; i
++)
2036 fix_operand_size (&operand
[i
], 1);
2039 fix_operand_size (&operand
[i
], 2);
2042 fix_operand_size (&operand
[i
], 4);
2047 instruction
= get_specific (instruction
, operand
, size
);
2049 if (instruction
== 0)
2051 /* Couldn't find an opcode which matched the operands. */
2052 char *where
= frag_more (2);
2056 clever_message (prev_instruction
, operand
);
2061 build_bytes (instruction
, operand
);
2063 dwarf2_emit_insn (instruction
->length
);
2067 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
2072 /* Various routines to kill one day. */
2075 md_atof (int type
, char *litP
, int *sizeP
)
2077 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
2080 #define OPTION_H_TICK_HEX (OPTION_MD_BASE)
2081 #define OPTION_MACH (OPTION_MD_BASE+1)
2083 const char *md_shortopts
= "";
2084 struct option md_longopts
[] =
2086 { "h-tick-hex", no_argument
, NULL
, OPTION_H_TICK_HEX
},
2087 { "mach", required_argument
, NULL
, OPTION_MACH
},
2088 {NULL
, no_argument
, NULL
, 0}
2091 size_t md_longopts_size
= sizeof (md_longopts
);
2096 void (*func
) (void);
2106 default_mach
= bfd_mach_h8300h
;
2116 default_mach
= bfd_mach_h8300hn
;
2126 default_mach
= bfd_mach_h8300s
;
2136 default_mach
= bfd_mach_h8300sn
;
2146 default_mach
= bfd_mach_h8300sx
;
2150 mach_h8300sxn (void)
2156 default_mach
= bfd_mach_h8300sxn
;
2159 const struct mach_func mach_table
[] =
2161 {"h8300h", mach_h8300h
},
2162 {"h8300hn", mach_h8300hn
},
2163 {"h8300s", mach_h8300s
},
2164 {"h8300sn", mach_h8300sn
},
2165 {"h8300sx", mach_h8300sx
},
2166 {"h8300sxn", mach_h8300sxn
}
2170 md_parse_option (int c ATTRIBUTE_UNUSED
, const char *arg ATTRIBUTE_UNUSED
)
2175 case OPTION_H_TICK_HEX
:
2176 enable_h_tick_hex
= 1;
2179 for (i
= 0; i
< sizeof(mach_table
) / sizeof(struct mach_func
); i
++)
2181 if (strcasecmp (arg
, mach_table
[i
].name
) == 0)
2183 mach_table
[i
].func();
2187 if (i
>= sizeof(mach_table
) / sizeof(struct mach_func
))
2188 as_bad (_("Invalid argument to --mach option: %s"), arg
);
2197 md_show_usage (FILE *stream
)
2199 fprintf (stream
, _(" H8300-specific assembler options:\n"));
2200 fprintf (stream
, _("\
2201 -mach=<name> Set the H8300 machine type to one of:\n\
2202 h8300h, h8300hn, h8300s, h8300sn, h8300sx, h8300sxn\n"));
2203 fprintf (stream
, _("\
2204 -h-tick-hex Support H'00 style hex constants\n"));
2207 void tc_aout_fix_to_chars (void);
2210 tc_aout_fix_to_chars (void)
2212 printf (_("call to tc_aout_fix_to_chars \n"));
2217 md_convert_frag (bfd
*headers ATTRIBUTE_UNUSED
,
2218 segT seg ATTRIBUTE_UNUSED
,
2219 fragS
*fragP ATTRIBUTE_UNUSED
)
2221 printf (_("call to md_convert_frag \n"));
2226 md_section_align (segT segment
, valueT size
)
2228 int align
= bfd_get_section_alignment (stdoutput
, segment
);
2229 return ((size
+ (1 << align
) - 1) & (-1U << align
));
2233 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
2235 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
2238 switch (fixP
->fx_size
)
2244 *buf
++ = (val
>> 8);
2248 *buf
++ = (val
>> 24);
2249 *buf
++ = (val
>> 16);
2250 *buf
++ = (val
>> 8);
2254 /* This can arise when the .quad or .8byte pseudo-ops are used.
2255 Returning here (without setting fx_done) will cause the code
2256 to attempt to generate a reloc which will then fail with the
2257 slightly more helpful error message: "Cannot represent
2258 relocation type BFD_RELOC_64". */
2264 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
2269 md_estimate_size_before_relax (fragS
*fragP ATTRIBUTE_UNUSED
,
2270 segT segment_type ATTRIBUTE_UNUSED
)
2272 printf (_("call to md_estimate_size_before_relax \n"));
2276 /* Put number into target byte order. */
2278 md_number_to_chars (char *ptr
, valueT use
, int nbytes
)
2280 number_to_chars_bigendian (ptr
, use
, nbytes
);
2284 md_pcrel_from (fixS
*fixp
)
2286 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2287 _("Unexpected reference to a symbol in a non-code section"));
2292 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
2295 bfd_reloc_code_real_type r_type
;
2297 if (fixp
->fx_addsy
&& fixp
->fx_subsy
)
2299 if ((S_GET_SEGMENT (fixp
->fx_addsy
) != S_GET_SEGMENT (fixp
->fx_subsy
))
2300 || S_GET_SEGMENT (fixp
->fx_addsy
) == undefined_section
)
2302 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2303 _("Difference of symbols in different sections is not supported"));
2308 rel
= XNEW (arelent
);
2309 rel
->sym_ptr_ptr
= XNEW (asymbol
*);
2310 *rel
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
2311 rel
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2312 rel
->addend
= fixp
->fx_offset
;
2314 r_type
= fixp
->fx_r_type
;
2318 fprintf (stderr
, "%s\n", bfd_get_reloc_code_name (r_type
));
2321 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, r_type
);
2322 if (rel
->howto
== NULL
)
2324 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2325 _("Cannot represent relocation type %s"),
2326 bfd_get_reloc_code_name (r_type
));