1 /* tc-h8300.c -- Assemble code for the Renesas H8/300
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 /* Written By Steve Chamberlain <sac@cygnus.com>. */
27 #include "dwarf2dbg.h"
30 #define h8_opcodes ops
31 #include "opcode/h8300.h"
32 #include "safe-ctype.h"
38 const char comment_chars
[] = ";";
39 const char line_comment_chars
[] = "#";
40 const char line_separator_chars
[] = "";
42 static void sbranch (int);
43 static void h8300hmode (int);
44 static void h8300smode (int);
45 static void h8300hnmode (int);
46 static void h8300snmode (int);
47 static void h8300sxmode (int);
48 static void h8300sxnmode (int);
49 static void pint (int);
56 #define PSIZE (Hmode && !Nmode ? L_32 : L_16)
58 static int bsize
= L_8
; /* Default branch displacement. */
66 const struct h8_opcode
*opcode
;
69 static struct h8_instruction
*h8_instructions
;
72 h8300hmode (int arg ATTRIBUTE_UNUSED
)
76 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300h
))
77 as_warn (_("could not set architecture and machine"));
81 h8300smode (int arg ATTRIBUTE_UNUSED
)
85 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300s
))
86 as_warn (_("could not set architecture and machine"));
90 h8300hnmode (int arg ATTRIBUTE_UNUSED
)
95 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300hn
))
96 as_warn (_("could not set architecture and machine"));
100 h8300snmode (int arg ATTRIBUTE_UNUSED
)
105 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300sn
))
106 as_warn (_("could not set architecture and machine"));
110 h8300sxmode (int arg ATTRIBUTE_UNUSED
)
115 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300sx
))
116 as_warn (_("could not set architecture and machine"));
120 h8300sxnmode (int arg ATTRIBUTE_UNUSED
)
126 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300sxn
))
127 as_warn (_("could not set architecture and machine"));
137 pint (int arg ATTRIBUTE_UNUSED
)
139 cons (Hmode
? 4 : 2);
142 /* This table describes all the machine specific pseudo-ops the assembler
143 has to support. The fields are:
144 pseudo-op name without dot
145 function to call to execute this pseudo-op
146 Integer arg to pass to the function. */
148 const pseudo_typeS md_pseudo_table
[] =
150 {"h8300h", h8300hmode
, 0},
151 {"h8300hn", h8300hnmode
, 0},
152 {"h8300s", h8300smode
, 0},
153 {"h8300sn", h8300snmode
, 0},
154 {"h8300sx", h8300sxmode
, 0},
155 {"h8300sxn", h8300sxnmode
, 0},
156 {"sbranch", sbranch
, L_8
},
157 {"lbranch", sbranch
, L_16
},
163 {"form", listing_psize
, 0},
164 {"heading", listing_title
, 0},
165 {"import", s_ignore
, 0},
166 {"page", listing_eject
, 0},
167 {"program", s_ignore
, 0},
171 const char EXP_CHARS
[] = "eE";
173 /* Chars that mean this number is a floating point constant
176 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
178 static struct hash_control
*opcode_hash_control
; /* Opcode mnemonics. */
180 /* This function is called once, at assembler startup time. This
181 should set up all the tables, etc. that the MD part of the assembler
187 unsigned int nopcodes
;
188 struct h8_opcode
*p
, *p1
;
189 struct h8_instruction
*pi
;
190 char prev_buffer
[100];
193 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_h8300
, bfd_mach_h8300
))
194 as_warn (_("could not set architecture and machine"));
196 opcode_hash_control
= hash_new ();
199 nopcodes
= sizeof (h8_opcodes
) / sizeof (struct h8_opcode
);
201 h8_instructions
= (struct h8_instruction
*)
202 xmalloc (nopcodes
* sizeof (struct h8_instruction
));
204 pi
= h8_instructions
;
206 /* We do a minimum amount of sorting on the opcode table; this is to
207 make it easy to describe the mova instructions without unnecessary
209 Sorting only takes place inside blocks of instructions of the form
210 X/Y, so for example mova/b, mova/w and mova/l can be intermixed. */
213 struct h8_opcode
*first_skipped
= 0;
215 char *src
= p1
->name
;
220 /* Strip off any . part when inserting the opcode and only enter
221 unique codes into the hash table. */
222 dst
= buffer
= malloc (strlen (src
) + 1);
231 cmplen
= src
- p1
->name
+ 1;
238 hash_insert (opcode_hash_control
, buffer
, (char *) pi
);
239 strcpy (prev_buffer
, buffer
);
242 for (p
= p1
; p
->name
; p
++)
244 /* A negative TIME is used to indicate that we've added this opcode
248 if (strncmp (p
->name
, buffer
, cmplen
) != 0
249 || (p
->name
[cmplen
] != '\0' && p
->name
[cmplen
] != '.'
250 && p
->name
[cmplen
- 1] != '/'))
252 if (first_skipped
== 0)
256 if (strncmp (p
->name
, buffer
, len
) != 0)
258 if (first_skipped
== 0)
264 pi
->size
= p
->name
[len
] == '.' ? p
->name
[len
+ 1] : 0;
267 /* Find the number of operands. */
269 while (pi
->noperands
< 3 && p
->args
.nib
[pi
->noperands
] != (op_type
) E
)
272 /* Find the length of the opcode in bytes. */
274 while (p
->data
.nib
[pi
->length
* 2] != (op_type
) E
)
283 /* Add entry for the NULL vector terminator. */
300 static void clever_message (const struct h8_instruction
*, struct h8_op
*);
301 static void fix_operand_size (struct h8_op
*, int);
302 static void build_bytes (const struct h8_instruction
*, struct h8_op
*);
303 static void do_a_fix_imm (int, int, struct h8_op
*, int, const struct h8_instruction
*);
304 static void check_operand (struct h8_op
*, unsigned int, char *);
305 static const struct h8_instruction
* get_specific (const struct h8_instruction
*, struct h8_op
*, int) ;
306 static char *get_operands (unsigned, char *, struct h8_op
*);
307 static void get_operand (char **, struct h8_op
*, int);
308 static int parse_reg (char *, op_type
*, unsigned *, int);
309 static char *skip_colonthing (char *, int *);
310 static char *parse_exp (char *, struct h8_op
*);
312 static int constant_fits_width_p (struct h8_op
*, unsigned int);
313 static int constant_fits_size_p (struct h8_op
*, int, int);
317 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
326 /* Try to parse a reg name. Return the number of chars consumed. */
329 parse_reg (char *src
, op_type
*mode
, unsigned int *reg
, int direction
)
334 /* Cribbed from get_symbol_end. */
335 if (!is_name_beginner (*src
) || *src
== '\001')
338 while ((is_part_of_name (*end
) && *end
!= '.') || *end
== '\001')
342 if (len
== 2 && TOLOWER (src
[0]) == 's' && TOLOWER (src
[1]) == 'p')
344 *mode
= PSIZE
| REG
| direction
;
349 TOLOWER (src
[0]) == 'c' &&
350 TOLOWER (src
[1]) == 'c' &&
351 TOLOWER (src
[2]) == 'r')
358 TOLOWER (src
[0]) == 'e' &&
359 TOLOWER (src
[1]) == 'x' &&
360 TOLOWER (src
[2]) == 'r')
367 TOLOWER (src
[0]) == 'v' &&
368 TOLOWER (src
[1]) == 'b' &&
369 TOLOWER (src
[2]) == 'r')
376 TOLOWER (src
[0]) == 's' &&
377 TOLOWER (src
[1]) == 'b' &&
378 TOLOWER (src
[2]) == 'r')
384 if (len
== 2 && TOLOWER (src
[0]) == 'f' && TOLOWER (src
[1]) == 'p')
386 *mode
= PSIZE
| REG
| direction
;
390 if (len
== 3 && TOLOWER (src
[0]) == 'e' && TOLOWER (src
[1]) == 'r' &&
391 src
[2] >= '0' && src
[2] <= '7')
393 *mode
= L_32
| REG
| direction
;
396 as_warn (_("Reg not valid for H8/300"));
399 if (len
== 2 && TOLOWER (src
[0]) == 'e' && src
[1] >= '0' && src
[1] <= '7')
401 *mode
= L_16
| REG
| direction
;
402 *reg
= src
[1] - '0' + 8;
404 as_warn (_("Reg not valid for H8/300"));
408 if (TOLOWER (src
[0]) == 'r')
410 if (src
[1] >= '0' && src
[1] <= '7')
412 if (len
== 3 && TOLOWER (src
[2]) == 'l')
414 *mode
= L_8
| REG
| direction
;
415 *reg
= (src
[1] - '0') + 8;
418 if (len
== 3 && TOLOWER (src
[2]) == 'h')
420 *mode
= L_8
| REG
| direction
;
421 *reg
= (src
[1] - '0');
426 *mode
= L_16
| REG
| direction
;
427 *reg
= (src
[1] - '0');
437 /* Parse an immediate or address-related constant and store it in OP.
438 If the user also specifies the operand's size, store that size
439 in OP->MODE, otherwise leave it for later code to decide. */
442 parse_exp (char *src
, struct h8_op
*op
)
446 save
= input_line_pointer
;
447 input_line_pointer
= src
;
448 expression (&op
->exp
);
449 if (op
->exp
.X_op
== O_absent
)
450 as_bad (_("missing operand"));
451 src
= input_line_pointer
;
452 input_line_pointer
= save
;
454 return skip_colonthing (src
, &op
->mode
);
458 /* If SRC starts with an explicit operand size, skip it and store the size
459 in *MODE. Leave *MODE unchanged otherwise. */
462 skip_colonthing (char *src
, int *mode
)
468 if (src
[0] == '8' && !ISDIGIT (src
[1]))
470 else if (src
[0] == '2' && !ISDIGIT (src
[1]))
472 else if (src
[0] == '3' && !ISDIGIT (src
[1]))
474 else if (src
[0] == '4' && !ISDIGIT (src
[1]))
476 else if (src
[0] == '5' && !ISDIGIT (src
[1]))
478 else if (src
[0] == '2' && src
[1] == '4' && !ISDIGIT (src
[2]))
480 else if (src
[0] == '3' && src
[1] == '2' && !ISDIGIT (src
[2]))
482 else if (src
[0] == '1' && src
[1] == '6' && !ISDIGIT (src
[2]))
485 as_bad (_("invalid operand size requested"));
487 while (ISDIGIT (*src
))
493 /* The many forms of operand:
496 @Rn Register indirect
497 @(exp[:16], Rn) Register indirect with displacement
501 @aa:16 absolute 16 bit
504 #xx[:size] immediate data
505 @(exp:[8], pc) pc rel
506 @@aa[:8] memory indirect. */
509 constant_fits_width_p (struct h8_op
*operand
, unsigned int width
)
511 return ((operand
->exp
.X_add_number
& ~width
) == 0
512 || (operand
->exp
.X_add_number
| width
) == (unsigned)(~0));
516 constant_fits_size_p (struct h8_op
*operand
, int size
, int no_symbols
)
518 offsetT num
= operand
->exp
.X_add_number
;
520 && (operand
->exp
.X_add_symbol
!= 0 || operand
->exp
.X_op_symbol
!= 0))
525 return (num
& ~3) == 0;
527 return (num
& ~7) == 0;
529 return num
>= 1 && num
< 8;
531 return (num
& ~15) == 0;
533 return num
>= 1 && num
< 32;
535 return (num
& ~0xFF) == 0 || ((unsigned)num
| 0x7F) == ~0u;
537 return (num
& ~0xFF) == 0;
539 return (num
& ~0xFFFF) == 0 || ((unsigned)num
| 0x7FFF) == ~0u;
541 return (num
& ~0xFFFF) == 0;
550 get_operand (char **ptr
, struct h8_op
*op
, int direction
)
559 /* Check for '(' and ')' for instructions ldm and stm. */
560 if (src
[0] == '(' && src
[8] == ')')
563 /* Gross. Gross. ldm and stm have a format not easily handled
564 by get_operand. We deal with it explicitly here. */
565 if (TOLOWER (src
[0]) == 'e' && TOLOWER (src
[1]) == 'r' &&
566 ISDIGIT (src
[2]) && src
[3] == '-' &&
567 TOLOWER (src
[4]) == 'e' && TOLOWER (src
[5]) == 'r' && ISDIGIT (src
[6]))
574 /* Check register pair's validity as per tech note TN-H8*-193A/E
575 from Renesas for H8S and H8SX hardware manual. */
576 if ( !(low
== 0 && (high
== 1 || high
== 2 || high
== 3))
577 && !(low
== 1 && (high
== 2 || high
== 3 || high
== 4) && SXmode
)
578 && !(low
== 2 && (high
== 3 || ((high
== 4 || high
== 5) && SXmode
)))
579 && !(low
== 3 && (high
== 4 || high
== 5 || high
== 6) && SXmode
)
580 && !(low
== 4 && (high
== 5 || high
== 6))
581 && !(low
== 4 && high
== 7 && SXmode
)
582 && !(low
== 5 && (high
== 6 || high
== 7) && SXmode
)
583 && !(low
== 6 && high
== 7 && SXmode
))
584 as_bad (_("Invalid register list for ldm/stm\n"));
586 /* Even sicker. We encode two registers into op->reg. One
587 for the low register to save, the other for the high
588 register to save; we also set the high bit in op->reg
589 so we know this is "very special". */
590 op
->reg
= 0x80000000 | (high
<< 8) | low
;
599 len
= parse_reg (src
, &op
->mode
, &op
->reg
, direction
);
605 int size
= op
->mode
& SIZE
;
610 as_warn (_("mismatch between register and suffix"));
611 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
614 if (size
!= L_32
&& size
!= L_16
)
615 as_warn (_("mismatch between register and suffix"));
616 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
617 op
->mode
= (op
->mode
& ~SIZE
) | L_16
;
620 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
621 if (size
!= L_32
&& size
!= L_8
)
622 as_warn (_("mismatch between register and suffix"));
623 op
->mode
= (op
->mode
& ~MODE
) | LOWREG
;
624 op
->mode
= (op
->mode
& ~SIZE
) | L_8
;
627 as_warn (_("invalid suffix after register."));
641 *ptr
= parse_exp (src
+ 1, op
);
642 if (op
->exp
.X_add_number
>= 0x100)
647 /* FIXME : 2? or 4? */
648 if (op
->exp
.X_add_number
>= 0x400)
649 as_bad (_("address too high for vector table jmp/jsr"));
650 else if (op
->exp
.X_add_number
>= 0x200)
655 op
->exp
.X_add_number
= op
->exp
.X_add_number
/ divisor
- 0x80;
662 if (*src
== '-' || *src
== '+')
664 len
= parse_reg (src
+ 1, &mode
, &num
, direction
);
667 /* Oops, not a reg after all, must be ordinary exp. */
668 op
->mode
= ABS
| direction
;
669 *ptr
= parse_exp (src
, op
);
673 if (((mode
& SIZE
) != PSIZE
)
674 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
675 && (!Nmode
|| ((mode
& SIZE
) != L_32
)))
676 as_bad (_("Wrong size pointer register for architecture."));
678 op
->mode
= src
[0] == '-' ? RDPREDEC
: RDPREINC
;
680 *ptr
= src
+ 1 + len
;
687 /* See if this is @(ERn.x, PC). */
688 len
= parse_reg (src
, &mode
, &op
->reg
, direction
);
689 if (len
!= 0 && (mode
& MODE
) == REG
&& src
[len
] == '.')
691 switch (TOLOWER (src
[len
+ 1]))
694 mode
= PCIDXB
| direction
;
697 mode
= PCIDXW
| direction
;
700 mode
= PCIDXL
| direction
;
707 && src
[len
+ 2] == ','
708 && TOLOWER (src
[len
+ 3]) != 'p'
709 && TOLOWER (src
[len
+ 4]) != 'c'
710 && src
[len
+ 5] != ')')
712 *ptr
= src
+ len
+ 6;
716 /* Fall through into disp case - the grammar is somewhat
717 ambiguous, so we should try whether it's a DISP operand
718 after all ("ER3.L" might be a poorly named label...). */
723 /* Start off assuming a 16 bit offset. */
725 src
= parse_exp (src
, op
);
728 op
->mode
|= ABS
| direction
;
735 as_bad (_("expected @(exp, reg16)"));
740 len
= parse_reg (src
, &mode
, &op
->reg
, direction
);
741 if (len
== 0 || (mode
& MODE
) != REG
)
743 as_bad (_("expected @(exp, reg16)"));
749 switch (TOLOWER (src
[1]))
752 op
->mode
|= INDEXB
| direction
;
755 op
->mode
|= INDEXW
| direction
;
758 op
->mode
|= INDEXL
| direction
;
761 as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
767 op
->mode
|= DISP
| direction
;
768 src
= skip_colonthing (src
, &op
->mode
);
770 if (*src
!= ')' && '(')
772 as_bad (_("expected @(exp, reg16)"));
778 len
= parse_reg (src
, &mode
, &num
, direction
);
783 if (*src
== '+' || *src
== '-')
785 if (((mode
& SIZE
) != PSIZE
)
786 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
787 && (!Nmode
|| ((mode
& SIZE
) != L_32
)))
788 as_bad (_("Wrong size pointer register for architecture."));
789 op
->mode
= *src
== '+' ? RSPOSTINC
: RSPOSTDEC
;
795 if (((mode
& SIZE
) != PSIZE
)
796 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
797 && (!Nmode
|| ((mode
& SIZE
) != L_32
)))
798 as_bad (_("Wrong size pointer register for architecture."));
800 op
->mode
= direction
| IND
| PSIZE
;
808 /* must be a symbol */
810 op
->mode
= ABS
| direction
;
811 *ptr
= parse_exp (src
, op
);
819 *ptr
= parse_exp (src
+ 1, op
);
822 else if (strncmp (src
, "mach", 4) == 0 ||
823 strncmp (src
, "macl", 4) == 0 ||
824 strncmp (src
, "MACH", 4) == 0 ||
825 strncmp (src
, "MACL", 4) == 0)
827 op
->reg
= TOLOWER (src
[3]) == 'l';
835 *ptr
= parse_exp (src
, op
);
840 get_operands (unsigned int noperands
, char *op_end
, struct h8_op
*operand
)
851 get_operand (&ptr
, operand
+ 0, SRC
);
855 get_operand (&ptr
, operand
+ 1, DST
);
861 get_operand (&ptr
, operand
+ 0, SRC
);
864 get_operand (&ptr
, operand
+ 1, DST
);
869 get_operand (&ptr
, operand
+ 0, SRC
);
872 get_operand (&ptr
, operand
+ 1, DST
);
875 get_operand (&ptr
, operand
+ 2, OP3
);
885 /* MOVA has special requirements. Rather than adding twice the amount of
886 addressing modes, we simply special case it a bit. */
888 get_mova_operands (char *op_end
, struct h8_op
*operand
)
892 if (ptr
[1] != '@' || ptr
[2] != '(')
896 ptr
= parse_exp (ptr
, &operand
[0]);
901 get_operand (&ptr
, operand
+ 1, DST
);
909 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXB
;
912 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXW
;
915 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXL
;
921 else if ((operand
[1].mode
& MODE
) == LOWREG
)
923 switch (operand
[1].mode
& SIZE
)
926 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXB
;
929 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXW
;
932 operand
[0].mode
= (operand
[0].mode
& ~MODE
) | INDEXL
;
941 if (*ptr
++ != ')' || *ptr
++ != ',')
943 get_operand (&ptr
, operand
+ 2, OP3
);
944 /* See if we can use the short form of MOVA. */
945 if (((operand
[1].mode
& MODE
) == REG
|| (operand
[1].mode
& MODE
) == LOWREG
)
946 && (operand
[2].mode
& MODE
) == REG
947 && (operand
[1].reg
& 7) == (operand
[2].reg
& 7))
949 operand
[1].mode
= operand
[2].mode
= 0;
950 operand
[0].reg
= operand
[2].reg
& 7;
955 as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
959 get_rtsl_operands (char *ptr
, struct h8_op
*operand
)
961 int mode
, len
, type
= 0;
962 unsigned int num
, num2
;
970 len
= parse_reg (ptr
, &mode
, &num
, SRC
);
971 if (len
== 0 || (mode
& MODE
) != REG
)
973 as_bad (_("expected register"));
979 len
= parse_reg (++ptr
, &mode
, &num2
, SRC
);
980 if (len
== 0 || (mode
& MODE
) != REG
)
982 as_bad (_("expected register"));
986 /* CONST_xxx are used as placeholders in the opcode table. */
990 as_bad (_("invalid register list"));
996 if (type
== 1 && *ptr
++ != ')')
998 as_bad (_("expected closing paren"));
1001 operand
[0].mode
= RS32
;
1002 operand
[1].mode
= RD32
;
1003 operand
[0].reg
= num
;
1004 operand
[1].reg
= num2
;
1007 /* Passed a pointer to a list of opcodes which use different
1008 addressing modes, return the opcode which matches the opcodes
1011 static const struct h8_instruction
*
1012 get_specific (const struct h8_instruction
*instruction
,
1013 struct h8_op
*operands
, int size
)
1015 const struct h8_instruction
*this_try
= instruction
;
1016 const struct h8_instruction
*found_other
= 0, *found_mismatched
= 0;
1018 int this_index
= instruction
->idx
;
1021 /* There's only one ldm/stm and it's easier to just
1022 get out quick for them. */
1023 if (OP_KIND (instruction
->opcode
->how
) == O_LDM
1024 || OP_KIND (instruction
->opcode
->how
) == O_STM
)
1027 while (noperands
< 3 && operands
[noperands
].mode
!= 0)
1030 while (this_index
== instruction
->idx
&& !found
)
1035 this_try
= instruction
++;
1036 this_size
= this_try
->opcode
->how
& SN
;
1038 if (this_try
->noperands
!= noperands
)
1040 else if (this_try
->noperands
> 0)
1044 for (i
= 0; i
< this_try
->noperands
&& found
; i
++)
1046 op_type op
= this_try
->opcode
->args
.nib
[i
];
1047 int op_mode
= op
& MODE
;
1048 int op_size
= op
& SIZE
;
1049 int x
= operands
[i
].mode
;
1050 int x_mode
= x
& MODE
;
1051 int x_size
= x
& SIZE
;
1053 if (op_mode
== LOWREG
&& (x_mode
== REG
|| x_mode
== LOWREG
))
1055 if ((x_size
== L_8
&& (operands
[i
].reg
& 8) == 0)
1056 || (x_size
== L_16
&& (operands
[i
].reg
& 8) == 8))
1057 as_warn (_("can't use high part of register in operand %d"), i
);
1059 if (x_size
!= op_size
)
1062 else if (op_mode
== REG
)
1064 if (x_mode
== LOWREG
)
1070 x_size
= (Hmode
? L_32
: L_16
);
1072 op_size
= (Hmode
? L_32
: L_16
);
1074 /* The size of the reg is v important. */
1075 if (op_size
!= x_size
)
1078 else if (op_mode
& CTRL
) /* control register */
1080 if (!(x_mode
& CTRL
))
1086 if (op_mode
!= CCR
&&
1087 op_mode
!= CCR_EXR
&&
1088 op_mode
!= CC_EX_VB_SB
)
1092 if (op_mode
!= EXR
&&
1093 op_mode
!= CCR_EXR
&&
1094 op_mode
!= CC_EX_VB_SB
)
1098 if (op_mode
!= MACH
&&
1103 if (op_mode
!= MACL
&&
1108 if (op_mode
!= VBR
&&
1109 op_mode
!= VBR_SBR
&&
1110 op_mode
!= CC_EX_VB_SB
)
1114 if (op_mode
!= SBR
&&
1115 op_mode
!= VBR_SBR
&&
1116 op_mode
!= CC_EX_VB_SB
)
1121 else if ((op
& ABSJMP
) && (x_mode
== ABS
|| x_mode
== PCREL
))
1123 operands
[i
].mode
&= ~MODE
;
1124 operands
[i
].mode
|= ABSJMP
;
1125 /* But it may not be 24 bits long. */
1126 if (x_mode
== ABS
&& !Hmode
)
1128 operands
[i
].mode
&= ~SIZE
;
1129 operands
[i
].mode
|= L_16
;
1131 if ((operands
[i
].mode
& SIZE
) == L_32
1132 && (op_mode
& SIZE
) != L_32
)
1135 else if (x_mode
== IMM
&& op_mode
!= IMM
)
1137 offsetT num
= operands
[i
].exp
.X_add_number
;
1138 if (op_mode
== KBIT
|| op_mode
== DBIT
)
1139 /* This is ok if the immediate value is sensible. */;
1140 else if (op_mode
== CONST_2
)
1142 else if (op_mode
== CONST_4
)
1144 else if (op_mode
== CONST_8
)
1146 else if (op_mode
== CONST_16
)
1151 else if (op_mode
== PCREL
&& op_mode
== x_mode
)
1153 /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1154 If x_size is L_8, promote it. */
1155 if (OP_KIND (this_try
->opcode
->how
) == O_MOVSD
1156 || OP_KIND (this_try
->opcode
->how
) == O_BSRBC
1157 || OP_KIND (this_try
->opcode
->how
) == O_BSRBS
)
1161 /* The size of the displacement is important. */
1162 if (op_size
!= x_size
)
1165 else if ((op_mode
== DISP
|| op_mode
== IMM
|| op_mode
== ABS
1166 || op_mode
== INDEXB
|| op_mode
== INDEXW
1167 || op_mode
== INDEXL
)
1168 && op_mode
== x_mode
)
1170 /* Promote a L_24 to L_32 if it makes us match. */
1171 if (x_size
== L_24
&& op_size
== L_32
)
1177 if (((x_size
== L_16
&& op_size
== L_16U
)
1178 || (x_size
== L_8
&& op_size
== L_8U
)
1179 || (x_size
== L_3
&& op_size
== L_3NZ
))
1180 /* We're deliberately more permissive for ABS modes. */
1182 || constant_fits_size_p (operands
+ i
, op_size
,
1186 if (x_size
!= 0 && op_size
!= x_size
)
1188 else if (x_size
== 0
1189 && ! constant_fits_size_p (operands
+ i
, op_size
,
1193 else if (op_mode
!= x_mode
)
1201 if ((this_try
->opcode
->available
== AV_H8SX
&& ! SXmode
)
1202 || (this_try
->opcode
->available
== AV_H8S
&& ! Smode
)
1203 || (this_try
->opcode
->available
== AV_H8H
&& ! Hmode
))
1204 found
= 0, found_other
= this_try
;
1205 else if (this_size
!= size
&& (this_size
!= SN
&& size
!= SN
))
1206 found_mismatched
= this_try
, found
= 0;
1214 as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1215 found_other
->opcode
->name
,
1216 (! Hmode
&& ! Smode
? "H8/300"
1221 else if (found_mismatched
)
1223 as_warn (_("mismatch between opcode size and operand size"));
1224 return found_mismatched
;
1230 check_operand (struct h8_op
*operand
, unsigned int width
, char *string
)
1232 if (operand
->exp
.X_add_symbol
== 0
1233 && operand
->exp
.X_op_symbol
== 0)
1235 /* No symbol involved, let's look at offset, it's dangerous if
1236 any of the high bits are not 0 or ff's, find out by oring or
1237 anding with the width and seeing if the answer is 0 or all
1240 if (! constant_fits_width_p (operand
, width
))
1243 && (operand
->exp
.X_add_number
& 0xff00) == 0xff00)
1245 /* Just ignore this one - which happens when trying to
1246 fit a 16 bit address truncated into an 8 bit address
1247 of something like bset. */
1249 else if (strcmp (string
, "@") == 0
1251 && (operand
->exp
.X_add_number
& 0xff8000) == 0xff8000)
1253 /* Just ignore this one - which happens when trying to
1254 fit a 24 bit address truncated into a 16 bit address
1255 of something like mov.w. */
1259 as_warn (_("operand %s0x%lx out of range."), string
,
1260 (unsigned long) operand
->exp
.X_add_number
);
1266 /* RELAXMODE has one of 3 values:
1268 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1270 1 Output a relaxable 24bit absolute mov.w address relocation
1271 (may relax into a 16bit absolute address).
1273 2 Output a relaxable 16/24 absolute mov.b address relocation
1274 (may relax into an 8bit absolute address). */
1277 do_a_fix_imm (int offset
, int nibble
, struct h8_op
*operand
, int relaxmode
, const struct h8_instruction
*this_try
)
1282 char *bytes
= frag_now
->fr_literal
+ offset
;
1284 char *t
= ((operand
->mode
& MODE
) == IMM
) ? "#" : "@";
1286 if (operand
->exp
.X_add_symbol
== 0)
1288 switch (operand
->mode
& SIZE
)
1291 check_operand (operand
, 0x3, t
);
1292 bytes
[0] |= (operand
->exp
.X_add_number
& 3) << (nibble
? 0 : 4);
1296 check_operand (operand
, 0x7, t
);
1297 bytes
[0] |= (operand
->exp
.X_add_number
& 7) << (nibble
? 0 : 4);
1300 check_operand (operand
, 0xF, t
);
1301 bytes
[0] |= (operand
->exp
.X_add_number
& 15) << (nibble
? 0 : 4);
1304 check_operand (operand
, 0x1F, t
);
1305 bytes
[0] |= operand
->exp
.X_add_number
& 31;
1309 check_operand (operand
, 0xff, t
);
1310 bytes
[0] |= operand
->exp
.X_add_number
;
1314 check_operand (operand
, 0xffff, t
);
1315 bytes
[0] |= operand
->exp
.X_add_number
>> 8;
1316 bytes
[1] |= operand
->exp
.X_add_number
>> 0;
1318 /* MOVA needs both relocs to relax the second operand properly. */
1320 && (OP_KIND(this_try
->opcode
->how
) == O_MOVAB
1321 || OP_KIND(this_try
->opcode
->how
) == O_MOVAW
1322 || OP_KIND(this_try
->opcode
->how
) == O_MOVAL
))
1325 fix_new_exp (frag_now
, offset
, 2, &operand
->exp
, 0, idx
);
1330 check_operand (operand
, 0xffffff, t
);
1331 bytes
[0] |= operand
->exp
.X_add_number
>> 16;
1332 bytes
[1] |= operand
->exp
.X_add_number
>> 8;
1333 bytes
[2] |= operand
->exp
.X_add_number
>> 0;
1337 /* This should be done with bfd. */
1338 bytes
[0] |= operand
->exp
.X_add_number
>> 24;
1339 bytes
[1] |= operand
->exp
.X_add_number
>> 16;
1340 bytes
[2] |= operand
->exp
.X_add_number
>> 8;
1341 bytes
[3] |= operand
->exp
.X_add_number
>> 0;
1344 idx
= (relaxmode
== 2) ? R_MOV24B1
: R_MOVL1
;
1345 fix_new_exp (frag_now
, offset
, 4, &operand
->exp
, 0, idx
);
1352 switch (operand
->mode
& SIZE
)
1357 where
= (operand
->mode
& SIZE
) == L_24
? -1 : 0;
1360 else if (relaxmode
== 1)
1366 as_bad (_("Can't work out size of operand.\n"));
1375 operand
->exp
.X_add_number
=
1376 ((operand
->exp
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1377 operand
->exp
.X_add_number
|= (bytes
[0] << 8) | bytes
[1];
1383 operand
->exp
.X_add_number
=
1384 ((operand
->exp
.X_add_number
& 0xff) ^ 0x80) - 0x80;
1385 operand
->exp
.X_add_number
|= bytes
[0];
1388 fix_new_exp (frag_now
,
1397 /* Now we know what sort of opcodes it is, let's build the bytes. */
1400 build_bytes (const struct h8_instruction
*this_try
, struct h8_op
*operand
)
1403 char *output
= frag_more (this_try
->length
);
1404 const op_type
*nibble_ptr
= this_try
->opcode
->data
.nib
;
1406 unsigned int nibble_count
= 0;
1410 char asnibbles
[100];
1411 char *p
= asnibbles
;
1414 if (!Hmode
&& this_try
->opcode
->available
!= AV_H8
)
1415 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1416 this_try
->opcode
->name
);
1418 && this_try
->opcode
->available
!= AV_H8
1419 && this_try
->opcode
->available
!= AV_H8H
)
1420 as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1421 this_try
->opcode
->name
);
1423 && this_try
->opcode
->available
!= AV_H8
1424 && this_try
->opcode
->available
!= AV_H8H
1425 && this_try
->opcode
->available
!= AV_H8S
)
1426 as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1427 this_try
->opcode
->name
);
1429 while (*nibble_ptr
!= (op_type
) E
)
1436 d
= (c
& OP3
) == OP3
? 2 : (c
& DST
) == DST
? 1 : 0;
1444 if (c2
== REG
|| c2
== LOWREG
1445 || c2
== IND
|| c2
== PREINC
|| c2
== PREDEC
1446 || c2
== POSTINC
|| c2
== POSTDEC
)
1448 nib
= operand
[d
].reg
;
1453 else if (c
& CTRL
) /* Control reg operand. */
1454 nib
= operand
[d
].reg
;
1456 else if ((c
& DISPREG
) == (DISPREG
))
1458 nib
= operand
[d
].reg
;
1462 operand
[d
].mode
= c
;
1463 op_at
[d
] = nibble_count
;
1466 else if (c2
== IMM
|| c2
== PCREL
|| c2
== ABS
1467 || (c
& ABSJMP
) || c2
== DISP
)
1469 operand
[d
].mode
= c
;
1470 op_at
[d
] = nibble_count
;
1473 else if ((c
& IGNORE
) || (c
& DATA
))
1476 else if (c2
== DBIT
)
1478 switch (operand
[0].exp
.X_add_number
)
1487 as_bad (_("Need #1 or #2 here"));
1490 else if (c2
== KBIT
)
1492 switch (operand
[0].exp
.X_add_number
)
1502 as_warn (_("#4 not valid on H8/300."));
1507 as_bad (_("Need #1 or #2 here"));
1510 /* Stop it making a fix. */
1511 operand
[0].mode
= 0;
1515 operand
[d
].mode
|= MEMRELAX
;
1531 if (operand
[0].mode
== MACREG
)
1532 /* stmac has mac[hl] as the first operand. */
1533 nib
= 2 + operand
[0].reg
;
1535 /* ldmac has mac[hl] as the second operand. */
1536 nib
= 2 + operand
[1].reg
;
1544 /* Disgusting. Why, oh why didn't someone ask us for advice
1545 on the assembler format. */
1546 if (OP_KIND (this_try
->opcode
->how
) == O_LDM
)
1548 high
= (operand
[1].reg
>> 8) & 0xf;
1549 low
= (operand
[1].reg
) & 0xf;
1550 asnibbles
[2] = high
- low
;
1551 asnibbles
[7] = high
;
1553 else if (OP_KIND (this_try
->opcode
->how
) == O_STM
)
1555 high
= (operand
[0].reg
>> 8) & 0xf;
1556 low
= (operand
[0].reg
) & 0xf;
1557 asnibbles
[2] = high
- low
;
1561 for (i
= 0; i
< this_try
->length
; i
++)
1562 output
[i
] = (asnibbles
[i
* 2] << 4) | asnibbles
[i
* 2 + 1];
1564 /* Note if this is a movb or a bit manipulation instruction
1565 there is a special relaxation which only applies. */
1566 if ( this_try
->opcode
->how
== O (O_MOV
, SB
)
1567 || this_try
->opcode
->how
== O (O_BCLR
, SB
)
1568 || this_try
->opcode
->how
== O (O_BAND
, SB
)
1569 || this_try
->opcode
->how
== O (O_BIAND
, SB
)
1570 || this_try
->opcode
->how
== O (O_BILD
, SB
)
1571 || this_try
->opcode
->how
== O (O_BIOR
, SB
)
1572 || this_try
->opcode
->how
== O (O_BIST
, SB
)
1573 || this_try
->opcode
->how
== O (O_BIXOR
, SB
)
1574 || this_try
->opcode
->how
== O (O_BLD
, SB
)
1575 || this_try
->opcode
->how
== O (O_BNOT
, SB
)
1576 || this_try
->opcode
->how
== O (O_BOR
, SB
)
1577 || this_try
->opcode
->how
== O (O_BSET
, SB
)
1578 || this_try
->opcode
->how
== O (O_BST
, SB
)
1579 || this_try
->opcode
->how
== O (O_BTST
, SB
)
1580 || this_try
->opcode
->how
== O (O_BXOR
, SB
))
1583 /* Output any fixes. */
1584 for (i
= 0; i
< this_try
->noperands
; i
++)
1586 int x
= operand
[i
].mode
;
1587 int x_mode
= x
& MODE
;
1589 if (x_mode
== IMM
|| x_mode
== DISP
)
1590 do_a_fix_imm (output
- frag_now
->fr_literal
+ op_at
[i
] / 2,
1591 op_at
[i
] & 1, operand
+ i
, (x
& MEMRELAX
) != 0,
1594 else if (x_mode
== ABS
)
1595 do_a_fix_imm (output
- frag_now
->fr_literal
+ op_at
[i
] / 2,
1596 op_at
[i
] & 1, operand
+ i
,
1597 (x
& MEMRELAX
) ? movb
+ 1 : 0,
1600 else if (x_mode
== PCREL
)
1602 int size16
= (x
& SIZE
) == L_16
;
1603 int size
= size16
? 2 : 1;
1604 int type
= size16
? R_PCRWORD
: R_PCRBYTE
;
1607 check_operand (operand
+ i
, size16
? 0x7fff : 0x7f, "@");
1609 if (operand
[i
].exp
.X_add_number
& 1)
1610 as_warn (_("branch operand has odd offset (%lx)\n"),
1611 (unsigned long) operand
->exp
.X_add_number
);
1613 /* The COFF port has always been off by one, changing it
1614 now would be an incompatible change, so we leave it as-is.
1616 We don't want to do this for ELF as we want to be
1617 compatible with the proposed ELF format from Hitachi. */
1618 operand
[i
].exp
.X_add_number
-= 1;
1622 operand
[i
].exp
.X_add_number
=
1623 ((operand
[i
].exp
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1627 operand
[i
].exp
.X_add_number
=
1628 ((operand
[i
].exp
.X_add_number
& 0xff) ^ 0x80) - 0x80;
1633 operand
[i
].exp
.X_add_number
|= output
[op_at
[i
] / 2];
1635 fixP
= fix_new_exp (frag_now
,
1636 output
- frag_now
->fr_literal
+ op_at
[i
] / 2,
1641 fixP
->fx_signed
= 1;
1643 else if (x_mode
== MEMIND
)
1645 check_operand (operand
+ i
, 0xff, "@@");
1646 fix_new_exp (frag_now
,
1647 output
- frag_now
->fr_literal
+ 1,
1653 else if (x_mode
== VECIND
)
1655 check_operand (operand
+ i
, 0x7f, "@@");
1656 /* FIXME: approximating the effect of "B31" here...
1657 This is very hackish, and ought to be done a better way. */
1658 operand
[i
].exp
.X_add_number
|= 0x80;
1659 fix_new_exp (frag_now
,
1660 output
- frag_now
->fr_literal
+ 1,
1666 else if (x
& ABSJMP
)
1669 bfd_reloc_code_real_type reloc_type
= R_JMPL1
;
1672 /* To be compatible with the proposed H8 ELF format, we
1673 want the relocation's offset to point to the first byte
1674 that will be modified, not to the start of the instruction. */
1676 if ((operand
->mode
& SIZE
) == L_32
)
1679 reloc_type
= R_RELLONG
;
1685 /* This jmp may be a jump or a branch. */
1687 check_operand (operand
+ i
,
1688 SXmode
? 0xffffffff : Hmode
? 0xffffff : 0xffff,
1691 if (operand
[i
].exp
.X_add_number
& 1)
1692 as_warn (_("branch operand has odd offset (%lx)\n"),
1693 (unsigned long) operand
->exp
.X_add_number
);
1696 operand
[i
].exp
.X_add_number
=
1697 ((operand
[i
].exp
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1698 fix_new_exp (frag_now
,
1699 output
- frag_now
->fr_literal
+ where
,
1708 /* Try to give an intelligent error message for common and simple to
1712 clever_message (const struct h8_instruction
*instruction
,
1713 struct h8_op
*operand
)
1715 /* Find out if there was more than one possible opcode. */
1717 if ((instruction
+ 1)->idx
!= instruction
->idx
)
1721 /* Only one opcode of this flavour, try to guess which operand
1723 for (argn
= 0; argn
< instruction
->noperands
; argn
++)
1725 switch (instruction
->opcode
->args
.nib
[argn
])
1728 if (operand
[argn
].mode
!= RD16
)
1730 as_bad (_("destination operand must be 16 bit register"));
1737 if (operand
[argn
].mode
!= RS8
)
1739 as_bad (_("source operand must be 8 bit register"));
1745 if (operand
[argn
].mode
!= ABS16DST
)
1747 as_bad (_("destination operand must be 16bit absolute address"));
1752 if (operand
[argn
].mode
!= RD8
)
1754 as_bad (_("destination operand must be 8 bit register"));
1760 if (operand
[argn
].mode
!= ABS16SRC
)
1762 as_bad (_("source operand must be 16bit absolute address"));
1770 as_bad (_("invalid operands"));
1774 /* If OPERAND is part of an address, adjust its size and value given
1775 that it addresses SIZE bytes.
1777 This function decides how big non-immediate constants are when no
1778 size was explicitly given. It also scales down the assembly-level
1779 displacement in an @(d:2,ERn) operand. */
1782 fix_operand_size (struct h8_op
*operand
, int size
)
1784 if (SXmode
&& (operand
->mode
& MODE
) == DISP
)
1786 /* If the user didn't specify an operand width, see if we
1787 can use @(d:2,ERn). */
1788 if ((operand
->mode
& SIZE
) == 0
1789 && operand
->exp
.X_add_symbol
== 0
1790 && operand
->exp
.X_op_symbol
== 0
1791 && (operand
->exp
.X_add_number
== size
1792 || operand
->exp
.X_add_number
== size
* 2
1793 || operand
->exp
.X_add_number
== size
* 3))
1794 operand
->mode
|= L_2
;
1796 /* Scale down the displacement in an @(d:2,ERn) operand.
1797 X_add_number then contains the desired field value. */
1798 if ((operand
->mode
& SIZE
) == L_2
)
1800 if (operand
->exp
.X_add_number
% size
!= 0)
1801 as_warn (_("operand/size mis-match"));
1802 operand
->exp
.X_add_number
/= size
;
1806 if ((operand
->mode
& SIZE
) == 0)
1807 switch (operand
->mode
& MODE
)
1814 /* Pick a 24-bit address unless we know that a 16-bit address
1815 is safe. get_specific() will relax L_24 into L_32 where
1819 && (operand
->exp
.X_add_number
< -32768
1820 || operand
->exp
.X_add_number
> 32767
1821 || operand
->exp
.X_add_symbol
!= 0
1822 || operand
->exp
.X_op_symbol
!= 0))
1823 operand
->mode
|= L_24
;
1825 operand
->mode
|= L_16
;
1829 /* This condition is long standing, though somewhat suspect. */
1830 if (operand
->exp
.X_add_number
> -128
1831 && operand
->exp
.X_add_number
< 127)
1833 if (operand
->exp
.X_add_symbol
!= NULL
)
1834 operand
->mode
|= bsize
;
1836 operand
->mode
|= L_8
;
1839 operand
->mode
|= L_16
;
1845 /* This is the guts of the machine-dependent assembler. STR points to
1846 a machine dependent instruction. This function is supposed to emit
1847 the frags/bytes it assembles. */
1850 md_assemble (char *str
)
1854 struct h8_op operand
[3];
1855 const struct h8_instruction
*instruction
;
1856 const struct h8_instruction
*prev_instruction
;
1863 /* Drop leading whitespace. */
1867 /* Find the op code end. */
1868 for (op_start
= op_end
= str
;
1869 *op_end
!= 0 && *op_end
!= ' ';
1879 else if (*op_end
== '/' && ! slash
)
1883 if (op_end
== op_start
)
1885 as_bad (_("can't find opcode "));
1891 /* The assembler stops scanning the opcode at slashes, so it fails
1892 to make characters following them lower case. Fix them. */
1895 *slash
= TOLOWER (*slash
);
1897 instruction
= (const struct h8_instruction
*)
1898 hash_find (opcode_hash_control
, op_start
);
1900 if (instruction
== NULL
)
1902 as_bad (_("unknown opcode"));
1906 /* We used to set input_line_pointer to the result of get_operands,
1907 but that is wrong. Our caller assumes we don't change it. */
1909 operand
[0].mode
= 0;
1910 operand
[1].mode
= 0;
1911 operand
[2].mode
= 0;
1913 if (OP_KIND (instruction
->opcode
->how
) == O_MOVAB
1914 || OP_KIND (instruction
->opcode
->how
) == O_MOVAW
1915 || OP_KIND (instruction
->opcode
->how
) == O_MOVAL
)
1916 get_mova_operands (op_end
, operand
);
1917 else if (OP_KIND (instruction
->opcode
->how
) == O_RTEL
1918 || OP_KIND (instruction
->opcode
->how
) == O_RTSL
)
1919 get_rtsl_operands (op_end
, operand
);
1921 get_operands (instruction
->noperands
, op_end
, operand
);
1924 prev_instruction
= instruction
;
1926 /* Now we have operands from instruction.
1927 Let's check them out for ldm and stm. */
1928 if (OP_KIND (instruction
->opcode
->how
) == O_LDM
)
1930 /* The first operand must be @er7+, and the
1931 second operand must be a register pair. */
1932 if ((operand
[0].mode
!= RSINC
)
1933 || (operand
[0].reg
!= 7)
1934 || ((operand
[1].reg
& 0x80000000) == 0))
1935 as_bad (_("invalid operand in ldm"));
1937 else if (OP_KIND (instruction
->opcode
->how
) == O_STM
)
1939 /* The first operand must be a register pair,
1940 and the second operand must be @-er7. */
1941 if (((operand
[0].reg
& 0x80000000) == 0)
1942 || (operand
[1].mode
!= RDDEC
)
1943 || (operand
[1].reg
!= 7))
1944 as_bad (_("invalid operand in stm"));
1950 switch (TOLOWER (*dot
))
1965 if (OP_KIND (instruction
->opcode
->how
) == O_MOVAB
||
1966 OP_KIND (instruction
->opcode
->how
) == O_MOVAW
||
1967 OP_KIND (instruction
->opcode
->how
) == O_MOVAL
)
1969 switch (operand
[0].mode
& MODE
)
1973 fix_operand_size (&operand
[1], 1);
1976 fix_operand_size (&operand
[1], 2);
1979 fix_operand_size (&operand
[1], 4);
1985 for (i
= 0; i
< 3 && operand
[i
].mode
!= 0; i
++)
1991 fix_operand_size (&operand
[i
], 1);
1994 fix_operand_size (&operand
[i
], 2);
1997 fix_operand_size (&operand
[i
], 4);
2002 instruction
= get_specific (instruction
, operand
, size
);
2004 if (instruction
== 0)
2006 /* Couldn't find an opcode which matched the operands. */
2007 char *where
= frag_more (2);
2011 clever_message (prev_instruction
, operand
);
2016 build_bytes (instruction
, operand
);
2018 dwarf2_emit_insn (instruction
->length
);
2022 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
2027 /* Various routines to kill one day. */
2030 md_atof (int type
, char *litP
, int *sizeP
)
2032 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
2035 #define OPTION_H_TICK_HEX (OPTION_MD_BASE)
2037 const char *md_shortopts
= "";
2038 struct option md_longopts
[] = {
2039 { "h-tick-hex", no_argument
, NULL
, OPTION_H_TICK_HEX
},
2040 {NULL
, no_argument
, NULL
, 0}
2043 size_t md_longopts_size
= sizeof (md_longopts
);
2046 md_parse_option (int c ATTRIBUTE_UNUSED
, char *arg ATTRIBUTE_UNUSED
)
2050 case OPTION_H_TICK_HEX
:
2051 enable_h_tick_hex
= 1;
2061 md_show_usage (FILE *stream ATTRIBUTE_UNUSED
)
2065 void tc_aout_fix_to_chars (void);
2068 tc_aout_fix_to_chars (void)
2070 printf (_("call to tc_aout_fix_to_chars \n"));
2075 md_convert_frag (bfd
*headers ATTRIBUTE_UNUSED
,
2076 segT seg ATTRIBUTE_UNUSED
,
2077 fragS
*fragP ATTRIBUTE_UNUSED
)
2079 printf (_("call to md_convert_frag \n"));
2084 md_section_align (segT segment
, valueT size
)
2086 int align
= bfd_get_section_alignment (stdoutput
, segment
);
2087 return ((size
+ (1 << align
) - 1) & (-1 << align
));
2091 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
2093 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
2096 switch (fixP
->fx_size
)
2102 *buf
++ = (val
>> 8);
2106 *buf
++ = (val
>> 24);
2107 *buf
++ = (val
>> 16);
2108 *buf
++ = (val
>> 8);
2112 /* This can arise when the .quad or .8byte pseudo-ops are used.
2113 Returning here (without setting fx_done) will cause the code
2114 to attempt to generate a reloc which will then fail with the
2115 slightly more helpful error message: "Cannot represent
2116 relocation type BFD_RELOC_64". */
2122 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
2127 md_estimate_size_before_relax (fragS
*fragP ATTRIBUTE_UNUSED
,
2128 segT segment_type ATTRIBUTE_UNUSED
)
2130 printf (_("call to md_estimate_size_before_relax \n"));
2134 /* Put number into target byte order. */
2136 md_number_to_chars (char *ptr
, valueT use
, int nbytes
)
2138 number_to_chars_bigendian (ptr
, use
, nbytes
);
2142 md_pcrel_from (fixS
*fixP ATTRIBUTE_UNUSED
)
2148 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
2151 bfd_reloc_code_real_type r_type
;
2153 if (fixp
->fx_addsy
&& fixp
->fx_subsy
)
2155 if ((S_GET_SEGMENT (fixp
->fx_addsy
) != S_GET_SEGMENT (fixp
->fx_subsy
))
2156 || S_GET_SEGMENT (fixp
->fx_addsy
) == undefined_section
)
2158 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2159 _("Difference of symbols in different sections is not supported"));
2164 rel
= xmalloc (sizeof (arelent
));
2165 rel
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
2166 *rel
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
2167 rel
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2168 rel
->addend
= fixp
->fx_offset
;
2170 r_type
= fixp
->fx_r_type
;
2174 fprintf (stderr
, "%s\n", bfd_get_reloc_code_name (r_type
));
2177 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, r_type
);
2178 if (rel
->howto
== NULL
)
2180 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2181 _("Cannot represent relocation type %s"),
2182 bfd_get_reloc_code_name (r_type
));