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 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 2, or (at your option)
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, 59 Temple Place - Suite 330, Boston, MA
22 /* Written By Steve Chamberlain <sac@cygnus.com>. */
30 #include "dwarf2dbg.h"
34 #define h8_opcodes ops
35 #include "opcode/h8300.h"
36 #include "safe-ctype.h"
42 const char comment_chars[] = ";";
43 const char line_comment_chars[] = "#";
44 const char line_separator_chars[] = "";
46 static void sbranch (int);
47 static void h8300hmode (int);
48 static void h8300smode (int);
49 static void h8300hnmode (int);
50 static void h8300snmode (int);
51 static void h8300sxmode (int);
52 static void h8300sxnmode (int);
53 static void pint (int);
60 #define PSIZE (Hmode && !Nmode ? L_32 : L_16)
62 static int bsize = L_8; /* Default branch displacement. */
70 const struct h8_opcode *opcode;
73 static struct h8_instruction *h8_instructions;
76 h8300hmode (int arg ATTRIBUTE_UNUSED)
81 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h))
82 as_warn (_("could not set architecture and machine"));
87 h8300smode (int arg ATTRIBUTE_UNUSED)
92 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s))
93 as_warn (_("could not set architecture and machine"));
98 h8300hnmode (int arg ATTRIBUTE_UNUSED)
104 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn))
105 as_warn (_("could not set architecture and machine"));
110 h8300snmode (int arg ATTRIBUTE_UNUSED)
116 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn))
117 as_warn (_("could not set architecture and machine"));
122 h8300sxmode (int arg ATTRIBUTE_UNUSED)
128 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx))
129 as_warn (_("could not set architecture and machine"));
134 h8300sxnmode (int arg ATTRIBUTE_UNUSED)
141 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn))
142 as_warn (_("could not set architecture and machine"));
153 pint (int arg ATTRIBUTE_UNUSED)
155 cons (Hmode ? 4 : 2);
158 /* This table describes all the machine specific pseudo-ops the assembler
159 has to support. The fields are:
160 pseudo-op name without dot
161 function to call to execute this pseudo-op
162 Integer arg to pass to the function. */
164 const pseudo_typeS md_pseudo_table[] =
166 {"h8300h", h8300hmode, 0},
167 {"h8300hn", h8300hnmode, 0},
168 {"h8300s", h8300smode, 0},
169 {"h8300sn", h8300snmode, 0},
170 {"h8300sx", h8300sxmode, 0},
171 {"h8300sxn", h8300sxnmode, 0},
172 {"sbranch", sbranch, L_8},
173 {"lbranch", sbranch, L_16},
179 {"form", listing_psize, 0},
180 {"heading", listing_title, 0},
181 {"import", s_ignore, 0},
182 {"page", listing_eject, 0},
183 {"program", s_ignore, 0},
187 const int md_reloc_size;
189 const char EXP_CHARS[] = "eE";
191 /* Chars that mean this number is a floating point constant
194 const char FLT_CHARS[] = "rRsSfFdDxXpP";
196 static struct hash_control *opcode_hash_control; /* Opcode mnemonics. */
198 /* This function is called once, at assembler startup time. This
199 should set up all the tables, etc. that the MD part of the assembler
205 unsigned int nopcodes;
206 struct h8_opcode *p, *p1;
207 struct h8_instruction *pi;
208 char prev_buffer[100];
212 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300))
213 as_warn (_("could not set architecture and machine"));
216 opcode_hash_control = hash_new ();
219 nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode);
221 h8_instructions = (struct h8_instruction *)
222 xmalloc (nopcodes * sizeof (struct h8_instruction));
224 pi = h8_instructions;
226 /* We do a minimum amount of sorting on the opcode table; this is to
227 make it easy to describe the mova instructions without unnecessary
229 Sorting only takes place inside blocks of instructions of the form
230 X/Y, so for example mova/b, mova/w and mova/l can be intermixed. */
233 struct h8_opcode *first_skipped = 0;
235 char *src = p1->name;
240 /* Strip off any . part when inserting the opcode and only enter
241 unique codes into the hash table. */
242 dst = buffer = malloc (strlen (src) + 1);
251 cmplen = src - p1->name + 1;
258 hash_insert (opcode_hash_control, buffer, (char *) pi);
259 strcpy (prev_buffer, buffer);
262 for (p = p1; p->name; p++)
264 /* A negative TIME is used to indicate that we've added this opcode
268 if (strncmp (p->name, buffer, cmplen) != 0
269 || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
270 && p->name[cmplen - 1] != '/'))
272 if (first_skipped == 0)
276 if (strncmp (p->name, buffer, len) != 0)
278 if (first_skipped == 0)
284 pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
287 /* Find the number of operands. */
289 while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
292 /* Find the length of the opcode in bytes. */
294 while (p->data.nib[pi->length * 2] != (op_type) E)
303 /* Add entry for the NULL vector terminator. */
327 static void clever_message (const struct h8_instruction *, struct h8_op *);
328 static void fix_operand_size (struct h8_op *, int);
329 static void build_bytes (const struct h8_instruction *, struct h8_op *);
330 static void do_a_fix_imm (int, int, struct h8_op *, int);
331 static void check_operand (struct h8_op *, unsigned int, char *);
332 static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
333 static char *get_operands (unsigned, char *, struct h8_op *);
334 static void get_operand (char **, struct h8_op *, int);
335 static int parse_reg (char *, op_type *, unsigned *, int);
336 static char *skip_colonthing (char *, int *);
337 static char *parse_exp (char *, struct h8_op *);
339 static int constant_fits_width_p (struct h8_op *, unsigned int);
340 static int constant_fits_size_p (struct h8_op *, int, int);
344 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
353 /* Try to parse a reg name. Return the number of chars consumed. */
356 parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
361 /* Cribbed from get_symbol_end. */
362 if (!is_name_beginner (*src) || *src == '\001')
365 while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
369 if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
371 *mode = PSIZE | REG | direction;
376 TOLOWER (src[0]) == 'c' &&
377 TOLOWER (src[1]) == 'c' &&
378 TOLOWER (src[2]) == 'r')
385 TOLOWER (src[0]) == 'e' &&
386 TOLOWER (src[1]) == 'x' &&
387 TOLOWER (src[2]) == 'r')
394 TOLOWER (src[0]) == 'v' &&
395 TOLOWER (src[1]) == 'b' &&
396 TOLOWER (src[2]) == 'r')
403 TOLOWER (src[0]) == 's' &&
404 TOLOWER (src[1]) == 'b' &&
405 TOLOWER (src[2]) == 'r')
411 if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
413 *mode = PSIZE | REG | direction;
417 if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
418 src[2] >= '0' && src[2] <= '7')
420 *mode = L_32 | REG | direction;
423 as_warn (_("Reg not valid for H8/300"));
426 if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
428 *mode = L_16 | REG | direction;
429 *reg = src[1] - '0' + 8;
431 as_warn (_("Reg not valid for H8/300"));
435 if (TOLOWER (src[0]) == 'r')
437 if (src[1] >= '0' && src[1] <= '7')
439 if (len == 3 && TOLOWER (src[2]) == 'l')
441 *mode = L_8 | REG | direction;
442 *reg = (src[1] - '0') + 8;
445 if (len == 3 && TOLOWER (src[2]) == 'h')
447 *mode = L_8 | REG | direction;
448 *reg = (src[1] - '0');
453 *mode = L_16 | REG | direction;
454 *reg = (src[1] - '0');
464 /* Parse an immediate or address-related constant and store it in OP.
465 If the user also specifies the operand's size, store that size
466 in OP->MODE, otherwise leave it for later code to decide. */
469 parse_exp (char *src, struct h8_op *op)
473 save = input_line_pointer;
474 input_line_pointer = src;
475 expression (&op->exp);
476 if (op->exp.X_op == O_absent)
477 as_bad (_("missing operand"));
478 src = input_line_pointer;
479 input_line_pointer = save;
481 return skip_colonthing (src, &op->mode);
485 /* If SRC starts with an explicit operand size, skip it and store the size
486 in *MODE. Leave *MODE unchanged otherwise. */
489 skip_colonthing (char *src, int *mode)
495 if (src[0] == '8' && !ISDIGIT (src[1]))
497 else if (src[0] == '2' && !ISDIGIT (src[1]))
499 else if (src[0] == '3' && !ISDIGIT (src[1]))
501 else if (src[0] == '4' && !ISDIGIT (src[1]))
503 else if (src[0] == '5' && !ISDIGIT (src[1]))
505 else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2]))
507 else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2]))
509 else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2]))
512 as_bad (_("invalid operand size requested"));
514 while (ISDIGIT (*src))
520 /* The many forms of operand:
523 @Rn Register indirect
524 @(exp[:16], Rn) Register indirect with displacement
528 @aa:16 absolute 16 bit
531 #xx[:size] immediate data
532 @(exp:[8], pc) pc rel
533 @@aa[:8] memory indirect. */
536 constant_fits_width_p (struct h8_op *operand, unsigned int width)
538 return ((operand->exp.X_add_number & ~width) == 0
539 || (operand->exp.X_add_number | width) == (unsigned)(~0));
543 constant_fits_size_p (struct h8_op *operand, int size, int no_symbols)
545 offsetT num = operand->exp.X_add_number;
547 && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
552 return (num & ~3) == 0;
554 return (num & ~7) == 0;
556 return num >= 1 && num < 8;
558 return (num & ~15) == 0;
560 return num >= 1 && num < 32;
562 return (num & ~0xFF) == 0 || ((unsigned)num | 0x7F) == ~0u;
564 return (num & ~0xFF) == 0;
566 return (num & ~0xFFFF) == 0 || ((unsigned)num | 0x7FFF) == ~0u;
568 return (num & ~0xFFFF) == 0;
577 get_operand (char **ptr, struct h8_op *op, int direction)
586 /* Check for '(' and ')' for instructions ldm and stm. */
587 if (src[0] == '(' && src[8] == ')')
590 /* Gross. Gross. ldm and stm have a format not easily handled
591 by get_operand. We deal with it explicitly here. */
592 if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
593 ISDIGIT (src[2]) && src[3] == '-' &&
594 TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
601 /* Check register pair's validity as per tech note TN-H8*-193A/E
602 from Renesas for H8S and H8SX hardware manual. */
603 if ( !(low == 0 && (high == 1 || high == 2 || high == 3))
604 && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode)
605 && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode)))
606 && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode)
607 && !(low == 4 && (high == 5 || high == 6))
608 && !(low == 5 && (high == 6 || high == 7) && SXmode)
609 && !(low == 6 && high == 7 && SXmode))
610 as_bad (_("Invalid register list for ldm/stm\n"));
612 /* Even sicker. We encode two registers into op->reg. One
613 for the low register to save, the other for the high
614 register to save; we also set the high bit in op->reg
615 so we know this is "very special". */
616 op->reg = 0x80000000 | (high << 8) | low;
625 len = parse_reg (src, &op->mode, &op->reg, direction);
631 int size = op->mode & SIZE;
636 as_warn (_("mismatch between register and suffix"));
637 op->mode = (op->mode & ~MODE) | LOWREG;
640 if (size != L_32 && size != L_16)
641 as_warn (_("mismatch between register and suffix"));
642 op->mode = (op->mode & ~MODE) | LOWREG;
643 op->mode = (op->mode & ~SIZE) | L_16;
646 op->mode = (op->mode & ~MODE) | LOWREG;
647 if (size != L_32 && size != L_8)
648 as_warn (_("mismatch between register and suffix"));
649 op->mode = (op->mode & ~MODE) | LOWREG;
650 op->mode = (op->mode & ~SIZE) | L_8;
653 as_warn ("invalid suffix after register.");
667 *ptr = parse_exp (src + 1, op);
668 if (op->exp.X_add_number >= 0x100)
673 /* FIXME : 2? or 4? */
674 if (op->exp.X_add_number >= 0x400)
675 as_bad (_("address too high for vector table jmp/jsr"));
676 else if (op->exp.X_add_number >= 0x200)
681 op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
688 if (*src == '-' || *src == '+')
690 len = parse_reg (src + 1, &mode, &num, direction);
693 /* Oops, not a reg after all, must be ordinary exp. */
694 op->mode = ABS | direction;
695 *ptr = parse_exp (src, op);
699 if (((mode & SIZE) != PSIZE)
700 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
701 && (!Nmode || ((mode & SIZE) != L_32)))
702 as_bad (_("Wrong size pointer register for architecture."));
704 op->mode = src[0] == '-' ? RDPREDEC : RDPREINC;
706 *ptr = src + 1 + len;
713 /* See if this is @(ERn.x, PC). */
714 len = parse_reg (src, &mode, &op->reg, direction);
715 if (len != 0 && (mode & MODE) == REG && src[len] == '.')
717 switch (TOLOWER (src[len + 1]))
720 mode = PCIDXB | direction;
723 mode = PCIDXW | direction;
726 mode = PCIDXL | direction;
733 && src[len + 2] == ','
734 && TOLOWER (src[len + 3]) != 'p'
735 && TOLOWER (src[len + 4]) != 'c'
736 && src[len + 5] != ')')
738 *ptr = src + len + 6;
742 /* Fall through into disp case - the grammar is somewhat
743 ambiguous, so we should try whether it's a DISP operand
744 after all ("ER3.L" might be a poorly named label...). */
749 /* Start off assuming a 16 bit offset. */
751 src = parse_exp (src, op);
754 op->mode |= ABS | direction;
761 as_bad (_("expected @(exp, reg16)"));
766 len = parse_reg (src, &mode, &op->reg, direction);
767 if (len == 0 || (mode & MODE) != REG)
769 as_bad (_("expected @(exp, reg16)"));
775 switch (TOLOWER (src[1]))
778 op->mode |= INDEXB | direction;
781 op->mode |= INDEXW | direction;
784 op->mode |= INDEXL | direction;
787 as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
793 op->mode |= DISP | direction;
794 src = skip_colonthing (src, &op->mode);
796 if (*src != ')' && '(')
798 as_bad (_("expected @(exp, reg16)"));
804 len = parse_reg (src, &mode, &num, direction);
809 if (*src == '+' || *src == '-')
811 if (((mode & SIZE) != PSIZE)
812 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
813 && (!Nmode || ((mode & SIZE) != L_32)))
814 as_bad (_("Wrong size pointer register for architecture."));
815 op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
821 if (((mode & SIZE) != PSIZE)
822 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
823 && (!Nmode || ((mode & SIZE) != L_32)))
824 as_bad (_("Wrong size pointer register for architecture."));
826 op->mode = direction | IND | PSIZE;
834 /* must be a symbol */
836 op->mode = ABS | direction;
837 *ptr = parse_exp (src, op);
845 *ptr = parse_exp (src + 1, op);
848 else if (strncmp (src, "mach", 4) == 0 ||
849 strncmp (src, "macl", 4) == 0 ||
850 strncmp (src, "MACH", 4) == 0 ||
851 strncmp (src, "MACL", 4) == 0)
853 op->reg = TOLOWER (src[3]) == 'l';
861 *ptr = parse_exp (src, op);
866 get_operands (unsigned int noperands, char *op_end, struct h8_op *operand)
877 get_operand (&ptr, operand + 0, SRC);
881 get_operand (&ptr, operand + 1, DST);
887 get_operand (&ptr, operand + 0, SRC);
890 get_operand (&ptr, operand + 1, DST);
895 get_operand (&ptr, operand + 0, SRC);
898 get_operand (&ptr, operand + 1, DST);
901 get_operand (&ptr, operand + 2, OP3);
911 /* MOVA has special requirements. Rather than adding twice the amount of
912 addressing modes, we simply special case it a bit. */
914 get_mova_operands (char *op_end, struct h8_op *operand)
918 if (ptr[1] != '@' || ptr[2] != '(')
922 ptr = parse_exp (ptr, &operand[0]);
927 get_operand (&ptr, operand + 1, DST);
935 operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
938 operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
941 operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
947 else if ((operand[1].mode & MODE) == LOWREG)
949 switch (operand[1].mode & SIZE)
952 operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
955 operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
958 operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
967 if (*ptr++ != ')' || *ptr++ != ',')
969 get_operand (&ptr, operand + 2, OP3);
970 /* See if we can use the short form of MOVA. */
971 if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
972 && (operand[2].mode & MODE) == REG
973 && (operand[1].reg & 7) == (operand[2].reg & 7))
975 operand[1].mode = operand[2].mode = 0;
976 operand[0].reg = operand[2].reg & 7;
981 as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
986 get_rtsl_operands (char *ptr, struct h8_op *operand)
988 int mode, num, num2, len, type = 0;
996 len = parse_reg (ptr, &mode, &num, SRC);
997 if (len == 0 || (mode & MODE) != REG)
999 as_bad (_("expected register"));
1005 len = parse_reg (++ptr, &mode, &num2, SRC);
1006 if (len == 0 || (mode & MODE) != REG)
1008 as_bad (_("expected register"));
1012 /* CONST_xxx are used as placeholders in the opcode table. */
1014 if (num < 0 || num > 3)
1016 as_bad (_("invalid register list"));
1021 num2 = num, num = 0;
1022 if (type == 1 && *ptr++ != ')')
1024 as_bad (_("expected closing paren"));
1027 operand[0].mode = RS32;
1028 operand[1].mode = RD32;
1029 operand[0].reg = num;
1030 operand[1].reg = num2;
1033 /* Passed a pointer to a list of opcodes which use different
1034 addressing modes, return the opcode which matches the opcodes
1037 static const struct h8_instruction *
1038 get_specific (const struct h8_instruction *instruction,
1039 struct h8_op *operands, int size)
1041 const struct h8_instruction *this_try = instruction;
1042 const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1044 int this_index = instruction->idx;
1047 /* There's only one ldm/stm and it's easier to just
1048 get out quick for them. */
1049 if (OP_KIND (instruction->opcode->how) == O_LDM
1050 || OP_KIND (instruction->opcode->how) == O_STM)
1053 while (noperands < 3 && operands[noperands].mode != 0)
1056 while (this_index == instruction->idx && !found)
1061 this_try = instruction++;
1062 this_size = this_try->opcode->how & SN;
1064 if (this_try->noperands != noperands)
1066 else if (this_try->noperands > 0)
1070 for (i = 0; i < this_try->noperands && found; i++)
1072 op_type op = this_try->opcode->args.nib[i];
1073 int op_mode = op & MODE;
1074 int op_size = op & SIZE;
1075 int x = operands[i].mode;
1076 int x_mode = x & MODE;
1077 int x_size = x & SIZE;
1079 if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1081 if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1082 || (x_size == L_16 && (operands[i].reg & 8) == 8))
1083 as_warn (_("can't use high part of register in operand %d"), i);
1085 if (x_size != op_size)
1088 else if (op_mode == REG)
1090 if (x_mode == LOWREG)
1096 x_size = (Hmode ? L_32 : L_16);
1098 op_size = (Hmode ? L_32 : L_16);
1100 /* The size of the reg is v important. */
1101 if (op_size != x_size)
1104 else if (op_mode & CTRL) /* control register */
1106 if (!(x_mode & CTRL))
1112 if (op_mode != CCR &&
1113 op_mode != CCR_EXR &&
1114 op_mode != CC_EX_VB_SB)
1118 if (op_mode != EXR &&
1119 op_mode != CCR_EXR &&
1120 op_mode != CC_EX_VB_SB)
1124 if (op_mode != MACH &&
1129 if (op_mode != MACL &&
1134 if (op_mode != VBR &&
1135 op_mode != VBR_SBR &&
1136 op_mode != CC_EX_VB_SB)
1140 if (op_mode != SBR &&
1141 op_mode != VBR_SBR &&
1142 op_mode != CC_EX_VB_SB)
1147 else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1149 operands[i].mode &= ~MODE;
1150 operands[i].mode |= ABSJMP;
1151 /* But it may not be 24 bits long. */
1152 if (x_mode == ABS && !Hmode)
1154 operands[i].mode &= ~SIZE;
1155 operands[i].mode |= L_16;
1157 if ((operands[i].mode & SIZE) == L_32
1158 && (op_mode & SIZE) != L_32)
1161 else if (x_mode == IMM && op_mode != IMM)
1163 offsetT num = operands[i].exp.X_add_number;
1164 if (op_mode == KBIT || op_mode == DBIT)
1165 /* This is ok if the immediate value is sensible. */;
1166 else if (op_mode == CONST_2)
1168 else if (op_mode == CONST_4)
1170 else if (op_mode == CONST_8)
1172 else if (op_mode == CONST_16)
1177 else if (op_mode == PCREL && op_mode == x_mode)
1179 /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1180 If x_size is L_8, promote it. */
1181 if (OP_KIND (this_try->opcode->how) == O_MOVSD
1182 || OP_KIND (this_try->opcode->how) == O_BSRBC
1183 || OP_KIND (this_try->opcode->how) == O_BSRBS)
1187 /* The size of the displacement is important. */
1188 if (op_size != x_size)
1191 else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1192 || op_mode == INDEXB || op_mode == INDEXW
1193 || op_mode == INDEXL)
1194 && op_mode == x_mode)
1196 /* Promote a L_24 to L_32 if it makes us match. */
1197 if (x_size == L_24 && op_size == L_32)
1204 /* Promote an L8 to L_16 if it makes us match. */
1205 if ((op_mode == ABS || op_mode == DISP) && x_size == L_8)
1207 if (op_size == L_16)
1212 if (((x_size == L_16 && op_size == L_16U)
1213 || (x_size == L_8 && op_size == L_8U)
1214 || (x_size == L_3 && op_size == L_3NZ))
1215 /* We're deliberately more permissive for ABS modes. */
1217 || constant_fits_size_p (operands + i, op_size,
1221 if (x_size != 0 && op_size != x_size)
1223 else if (x_size == 0
1224 && ! constant_fits_size_p (operands + i, op_size,
1228 else if (op_mode != x_mode)
1236 if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1237 || (this_try->opcode->available == AV_H8S && ! Smode)
1238 || (this_try->opcode->available == AV_H8H && ! Hmode))
1239 found = 0, found_other = this_try;
1240 else if (this_size != size && (this_size != SN && size != SN))
1241 found_mismatched = this_try, found = 0;
1249 as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1250 found_other->opcode->name,
1251 (! Hmode && ! Smode ? "H8/300"
1256 else if (found_mismatched)
1258 as_warn (_("mismatch between opcode size and operand size"));
1259 return found_mismatched;
1265 check_operand (struct h8_op *operand, unsigned int width, char *string)
1267 if (operand->exp.X_add_symbol == 0
1268 && operand->exp.X_op_symbol == 0)
1270 /* No symbol involved, let's look at offset, it's dangerous if
1271 any of the high bits are not 0 or ff's, find out by oring or
1272 anding with the width and seeing if the answer is 0 or all
1275 if (! constant_fits_width_p (operand, width))
1278 && (operand->exp.X_add_number & 0xff00) == 0xff00)
1280 /* Just ignore this one - which happens when trying to
1281 fit a 16 bit address truncated into an 8 bit address
1282 of something like bset. */
1284 else if (strcmp (string, "@") == 0
1286 && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1288 /* Just ignore this one - which happens when trying to
1289 fit a 24 bit address truncated into a 16 bit address
1290 of something like mov.w. */
1294 as_warn (_("operand %s0x%lx out of range."), string,
1295 (unsigned long) operand->exp.X_add_number);
1301 /* RELAXMODE has one of 3 values:
1303 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1305 1 Output a relaxable 24bit absolute mov.w address relocation
1306 (may relax into a 16bit absolute address).
1308 2 Output a relaxable 16/24 absolute mov.b address relocation
1309 (may relax into an 8bit absolute address). */
1312 do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode)
1317 char *bytes = frag_now->fr_literal + offset;
1319 char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1321 if (operand->exp.X_add_symbol == 0)
1323 switch (operand->mode & SIZE)
1326 check_operand (operand, 0x3, t);
1327 bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1331 check_operand (operand, 0x7, t);
1332 bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1335 check_operand (operand, 0xF, t);
1336 bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1339 check_operand (operand, 0x1F, t);
1340 bytes[0] |= operand->exp.X_add_number & 31;
1344 check_operand (operand, 0xff, t);
1345 bytes[0] |= operand->exp.X_add_number;
1349 check_operand (operand, 0xffff, t);
1350 bytes[0] |= operand->exp.X_add_number >> 8;
1351 bytes[1] |= operand->exp.X_add_number >> 0;
1354 check_operand (operand, 0xffffff, t);
1355 bytes[0] |= operand->exp.X_add_number >> 16;
1356 bytes[1] |= operand->exp.X_add_number >> 8;
1357 bytes[2] |= operand->exp.X_add_number >> 0;
1361 /* This should be done with bfd. */
1362 bytes[0] |= operand->exp.X_add_number >> 24;
1363 bytes[1] |= operand->exp.X_add_number >> 16;
1364 bytes[2] |= operand->exp.X_add_number >> 8;
1365 bytes[3] |= operand->exp.X_add_number >> 0;
1368 idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1369 fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1376 switch (operand->mode & SIZE)
1381 where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1384 else if (relaxmode == 1)
1390 as_bad (_("Can't work out size of operand.\n"));
1399 operand->exp.X_add_number =
1400 ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1401 operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1407 operand->exp.X_add_number =
1408 ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1409 operand->exp.X_add_number |= bytes[0];
1412 fix_new_exp (frag_now,
1421 /* Now we know what sort of opcodes it is, let's build the bytes. */
1424 build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1427 char *output = frag_more (this_try->length);
1428 op_type *nibble_ptr = this_try->opcode->data.nib;
1430 unsigned int nibble_count = 0;
1434 char asnibbles[100];
1435 char *p = asnibbles;
1438 if (!Hmode && this_try->opcode->available != AV_H8)
1439 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1440 this_try->opcode->name);
1442 && this_try->opcode->available != AV_H8
1443 && this_try->opcode->available != AV_H8H)
1444 as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1445 this_try->opcode->name);
1447 && this_try->opcode->available != AV_H8
1448 && this_try->opcode->available != AV_H8H
1449 && this_try->opcode->available != AV_H8S)
1450 as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1451 this_try->opcode->name);
1453 while (*nibble_ptr != (op_type) E)
1460 d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1468 if (c2 == REG || c2 == LOWREG
1469 || c2 == IND || c2 == PREINC || c2 == PREDEC
1470 || c2 == POSTINC || c2 == POSTDEC)
1472 nib = operand[d].reg;
1477 else if (c & CTRL) /* Control reg operand. */
1478 nib = operand[d].reg;
1480 else if ((c & DISPREG) == (DISPREG))
1482 nib = operand[d].reg;
1486 operand[d].mode = c;
1487 op_at[d] = nibble_count;
1490 else if (c2 == IMM || c2 == PCREL || c2 == ABS
1491 || (c & ABSJMP) || c2 == DISP)
1493 operand[d].mode = c;
1494 op_at[d] = nibble_count;
1497 else if ((c & IGNORE) || (c & DATA))
1500 else if (c2 == DBIT)
1502 switch (operand[0].exp.X_add_number)
1511 as_bad (_("Need #1 or #2 here"));
1514 else if (c2 == KBIT)
1516 switch (operand[0].exp.X_add_number)
1526 as_warn (_("#4 not valid on H8/300."));
1531 as_bad (_("Need #1 or #2 here"));
1534 /* Stop it making a fix. */
1535 operand[0].mode = 0;
1539 operand[d].mode |= MEMRELAX;
1555 if (operand[0].mode == MACREG)
1556 /* stmac has mac[hl] as the first operand. */
1557 nib = 2 + operand[0].reg;
1559 /* ldmac has mac[hl] as the second operand. */
1560 nib = 2 + operand[1].reg;
1568 /* Disgusting. Why, oh why didn't someone ask us for advice
1569 on the assembler format. */
1570 if (OP_KIND (this_try->opcode->how) == O_LDM)
1572 high = (operand[1].reg >> 8) & 0xf;
1573 low = (operand[1].reg) & 0xf;
1574 asnibbles[2] = high - low;
1575 asnibbles[7] = high;
1577 else if (OP_KIND (this_try->opcode->how) == O_STM)
1579 high = (operand[0].reg >> 8) & 0xf;
1580 low = (operand[0].reg) & 0xf;
1581 asnibbles[2] = high - low;
1585 for (i = 0; i < this_try->length; i++)
1586 output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1588 /* Note if this is a movb instruction -- there's a special relaxation
1589 which only applies to them. */
1590 if (this_try->opcode->how == O (O_MOV, SB))
1593 /* Output any fixes. */
1594 for (i = 0; i < this_try->noperands; i++)
1596 int x = operand[i].mode;
1597 int x_mode = x & MODE;
1599 if (x_mode == IMM || x_mode == DISP)
1600 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1601 op_at[i] & 1, operand + i, (x & MEMRELAX) != 0);
1603 else if (x_mode == ABS)
1604 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1605 op_at[i] & 1, operand + i,
1606 (x & MEMRELAX) ? movb + 1 : 0);
1608 else if (x_mode == PCREL)
1610 int size16 = (x & SIZE) == L_16;
1611 int size = size16 ? 2 : 1;
1612 int type = size16 ? R_PCRWORD : R_PCRBYTE;
1615 check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1617 if (operand[i].exp.X_add_number & 1)
1618 as_warn (_("branch operand has odd offset (%lx)\n"),
1619 (unsigned long) operand->exp.X_add_number);
1621 /* The COFF port has always been off by one, changing it
1622 now would be an incompatible change, so we leave it as-is.
1624 We don't want to do this for ELF as we want to be
1625 compatible with the proposed ELF format from Hitachi. */
1626 operand[i].exp.X_add_number -= 1;
1630 operand[i].exp.X_add_number =
1631 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1635 operand[i].exp.X_add_number =
1636 ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1641 operand[i].exp.X_add_number |= output[op_at[i] / 2];
1643 fixP = fix_new_exp (frag_now,
1644 output - frag_now->fr_literal + op_at[i] / 2,
1649 fixP->fx_signed = 1;
1651 else if (x_mode == MEMIND)
1653 check_operand (operand + i, 0xff, "@@");
1654 fix_new_exp (frag_now,
1655 output - frag_now->fr_literal + 1,
1661 else if (x_mode == VECIND)
1663 check_operand (operand + i, 0x7f, "@@");
1664 /* FIXME: approximating the effect of "B31" here...
1665 This is very hackish, and ought to be done a better way. */
1666 operand[i].exp.X_add_number |= 0x80;
1667 fix_new_exp (frag_now,
1668 output - frag_now->fr_literal + 1,
1674 else if (x & ABSJMP)
1677 bfd_reloc_code_real_type reloc_type = R_JMPL1;
1680 /* To be compatible with the proposed H8 ELF format, we
1681 want the relocation's offset to point to the first byte
1682 that will be modified, not to the start of the instruction. */
1684 if ((operand->mode & SIZE) == L_32)
1687 reloc_type = R_RELLONG;
1693 /* This jmp may be a jump or a branch. */
1695 check_operand (operand + i,
1696 SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1699 if (operand[i].exp.X_add_number & 1)
1700 as_warn (_("branch operand has odd offset (%lx)\n"),
1701 (unsigned long) operand->exp.X_add_number);
1704 operand[i].exp.X_add_number =
1705 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1706 fix_new_exp (frag_now,
1707 output - frag_now->fr_literal + where,
1716 /* Try to give an intelligent error message for common and simple to
1720 clever_message (const struct h8_instruction *instruction,
1721 struct h8_op *operand)
1723 /* Find out if there was more than one possible opcode. */
1725 if ((instruction + 1)->idx != instruction->idx)
1729 /* Only one opcode of this flavour, try to guess which operand
1731 for (argn = 0; argn < instruction->noperands; argn++)
1733 switch (instruction->opcode->args.nib[argn])
1736 if (operand[argn].mode != RD16)
1738 as_bad (_("destination operand must be 16 bit register"));
1745 if (operand[argn].mode != RS8)
1747 as_bad (_("source operand must be 8 bit register"));
1753 if (operand[argn].mode != ABS16DST)
1755 as_bad (_("destination operand must be 16bit absolute address"));
1760 if (operand[argn].mode != RD8)
1762 as_bad (_("destination operand must be 8 bit register"));
1768 if (operand[argn].mode != ABS16SRC)
1770 as_bad (_("source operand must be 16bit absolute address"));
1778 as_bad (_("invalid operands"));
1782 /* If OPERAND is part of an address, adjust its size and value given
1783 that it addresses SIZE bytes.
1785 This function decides how big non-immediate constants are when no
1786 size was explicitly given. It also scales down the assembly-level
1787 displacement in an @(d:2,ERn) operand. */
1790 fix_operand_size (struct h8_op *operand, int size)
1792 if (SXmode && (operand->mode & MODE) == DISP)
1794 /* If the user didn't specify an operand width, see if we
1795 can use @(d:2,ERn). */
1796 if ((operand->mode & SIZE) == 0
1797 && operand->exp.X_add_symbol == 0
1798 && operand->exp.X_op_symbol == 0
1799 && (operand->exp.X_add_number == size
1800 || operand->exp.X_add_number == size * 2
1801 || operand->exp.X_add_number == size * 3))
1802 operand->mode |= L_2;
1804 /* Scale down the displacement in an @(d:2,ERn) operand.
1805 X_add_number then contains the desired field value. */
1806 if ((operand->mode & SIZE) == L_2)
1808 if (operand->exp.X_add_number % size != 0)
1809 as_warn (_("operand/size mis-match"));
1810 operand->exp.X_add_number /= size;
1814 if ((operand->mode & SIZE) == 0)
1815 switch (operand->mode & MODE)
1822 /* Pick a 24-bit address unless we know that a 16-bit address
1823 is safe. get_specific() will relax L_24 into L_32 where
1827 && (operand->exp.X_add_number < -32768
1828 || operand->exp.X_add_number > 32767
1829 || operand->exp.X_add_symbol != 0
1830 || operand->exp.X_op_symbol != 0))
1831 operand->mode |= L_24;
1833 operand->mode |= L_16;
1837 /* This condition is long standing, though somewhat suspect. */
1838 if (operand->exp.X_add_number > -128
1839 && operand->exp.X_add_number < 127)
1840 operand->mode |= L_8;
1842 operand->mode |= L_16;
1848 /* This is the guts of the machine-dependent assembler. STR points to
1849 a machine dependent instruction. This function is supposed to emit
1850 the frags/bytes it assembles. */
1853 md_assemble (char *str)
1857 struct h8_op operand[3];
1858 const struct h8_instruction *instruction;
1859 const struct h8_instruction *prev_instruction;
1866 /* Drop leading whitespace. */
1870 /* Find the op code end. */
1871 for (op_start = op_end = str;
1872 *op_end != 0 && *op_end != ' ';
1882 else if (*op_end == '/' && ! slash)
1886 if (op_end == op_start)
1888 as_bad (_("can't find opcode "));
1894 /* The assembler stops scanning the opcode at slashes, so it fails
1895 to make characters following them lower case. Fix them. */
1898 *slash = TOLOWER (*slash);
1900 instruction = (const struct h8_instruction *)
1901 hash_find (opcode_hash_control, op_start);
1903 if (instruction == NULL)
1905 as_bad (_("unknown opcode"));
1909 /* We used to set input_line_pointer to the result of get_operands,
1910 but that is wrong. Our caller assumes we don't change it. */
1912 operand[0].mode = 0;
1913 operand[1].mode = 0;
1914 operand[2].mode = 0;
1916 if (OP_KIND (instruction->opcode->how) == O_MOVAB
1917 || OP_KIND (instruction->opcode->how) == O_MOVAW
1918 || OP_KIND (instruction->opcode->how) == O_MOVAL)
1919 get_mova_operands (op_end, operand);
1920 else if (OP_KIND (instruction->opcode->how) == O_RTEL
1921 || OP_KIND (instruction->opcode->how) == O_RTSL)
1922 get_rtsl_operands (op_end, operand);
1924 get_operands (instruction->noperands, op_end, operand);
1927 prev_instruction = instruction;
1929 /* Now we have operands from instruction.
1930 Let's check them out for ldm and stm. */
1931 if (OP_KIND (instruction->opcode->how) == O_LDM)
1933 /* The first operand must be @er7+, and the
1934 second operand must be a register pair. */
1935 if ((operand[0].mode != RSINC)
1936 || (operand[0].reg != 7)
1937 || ((operand[1].reg & 0x80000000) == 0))
1938 as_bad (_("invalid operand in ldm"));
1940 else if (OP_KIND (instruction->opcode->how) == O_STM)
1942 /* The first operand must be a register pair,
1943 and the second operand must be @-er7. */
1944 if (((operand[0].reg & 0x80000000) == 0)
1945 || (operand[1].mode != RDDEC)
1946 || (operand[1].reg != 7))
1947 as_bad (_("invalid operand in stm"));
1953 switch (TOLOWER (*dot))
1968 if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
1969 OP_KIND (instruction->opcode->how) == O_MOVAW ||
1970 OP_KIND (instruction->opcode->how) == O_MOVAL)
1972 switch (operand[0].mode & MODE)
1976 fix_operand_size (&operand[1], 1);
1979 fix_operand_size (&operand[1], 2);
1982 fix_operand_size (&operand[1], 4);
1988 for (i = 0; i < 3 && operand[i].mode != 0; i++)
1994 fix_operand_size (&operand[i], 1);
1997 fix_operand_size (&operand[i], 2);
2000 fix_operand_size (&operand[i], 4);
2005 instruction = get_specific (instruction, operand, size);
2007 if (instruction == 0)
2009 /* Couldn't find an opcode which matched the operands. */
2010 char *where = frag_more (2);
2014 clever_message (prev_instruction, operand);
2019 build_bytes (instruction, operand);
2021 #ifdef BFD_ASSEMBLER
2022 dwarf2_emit_insn (instruction->length);
2026 #ifndef BFD_ASSEMBLER
2028 tc_crawl_symbol_chain (object_headers *headers ATTRIBUTE_UNUSED)
2030 printf (_("call to tc_crawl_symbol_chain \n"));
2035 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2040 #ifndef BFD_ASSEMBLER
2042 tc_headers_hook (object_headers *headers ATTRIBUTE_UNUSED)
2044 printf (_("call to tc_headers_hook \n"));
2048 /* Various routines to kill one day */
2049 /* Equal to MAX_PRECISION in atof-ieee.c */
2050 #define MAX_LITTLENUMS 6
2052 /* Turn a string in input_line_pointer into a floating point constant
2053 of type TYPE, and store the appropriate bytes in *LITP. The number
2054 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2055 returned, or NULL on OK. */
2058 md_atof (int type, char *litP, int *sizeP)
2061 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2062 LITTLENUM_TYPE *wordP;
2093 return _("Bad call to MD_ATOF()");
2095 t = atof_ieee (input_line_pointer, type, words);
2097 input_line_pointer = t;
2099 *sizeP = prec * sizeof (LITTLENUM_TYPE);
2100 for (wordP = words; prec--;)
2102 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
2103 litP += sizeof (LITTLENUM_TYPE);
2108 const char *md_shortopts = "";
2109 struct option md_longopts[] = {
2110 {NULL, no_argument, NULL, 0}
2113 size_t md_longopts_size = sizeof (md_longopts);
2116 md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
2122 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
2126 void tc_aout_fix_to_chars (void);
2129 tc_aout_fix_to_chars (void)
2131 printf (_("call to tc_aout_fix_to_chars \n"));
2137 #ifdef BFD_ASSEMBLER
2138 bfd *headers ATTRIBUTE_UNUSED,
2140 object_headers *headers ATTRIBUTE_UNUSED,
2142 segT seg ATTRIBUTE_UNUSED,
2143 fragS *fragP ATTRIBUTE_UNUSED)
2145 printf (_("call to md_convert_frag \n"));
2149 #ifdef BFD_ASSEMBLER
2151 md_section_align (segT segment, valueT size)
2153 int align = bfd_get_section_alignment (stdoutput, segment);
2154 return ((size + (1 << align) - 1) & (-1 << align));
2158 md_section_align (segT seg, valueT size)
2160 return ((size + (1 << section_alignment[(int) seg]) - 1)
2161 & (-1 << section_alignment[(int) seg]));
2167 md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2169 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2172 switch (fixP->fx_size)
2178 *buf++ = (val >> 8);
2182 *buf++ = (val >> 24);
2183 *buf++ = (val >> 16);
2184 *buf++ = (val >> 8);
2191 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2196 md_estimate_size_before_relax (register fragS *fragP ATTRIBUTE_UNUSED,
2197 register segT segment_type ATTRIBUTE_UNUSED)
2199 printf (_("call tomd_estimate_size_before_relax \n"));
2203 /* Put number into target byte order. */
2205 md_number_to_chars (char *ptr, valueT use, int nbytes)
2207 number_to_chars_bigendian (ptr, use, nbytes);
2211 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2216 #ifndef BFD_ASSEMBLER
2218 tc_reloc_mangle (fixS *fix_ptr, struct internal_reloc *intr, bfd_vma base)
2220 symbolS *symbol_ptr;
2222 symbol_ptr = fix_ptr->fx_addsy;
2224 /* If this relocation is attached to a symbol then it's ok
2226 if (fix_ptr->fx_r_type == TC_CONS_RELOC)
2228 /* cons likes to create reloc32's whatever the size of the reloc..
2230 switch (fix_ptr->fx_size)
2233 intr->r_type = R_RELLONG;
2236 intr->r_type = R_RELWORD;
2239 intr->r_type = R_RELBYTE;
2247 intr->r_type = fix_ptr->fx_r_type;
2250 intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
2251 intr->r_offset = fix_ptr->fx_offset;
2255 if (symbol_ptr->sy_number != -1)
2256 intr->r_symndx = symbol_ptr->sy_number;
2261 /* This case arises when a reference is made to `.'. */
2262 segsym = seg_info (S_GET_SEGMENT (symbol_ptr))->dot;
2264 intr->r_symndx = -1;
2267 intr->r_symndx = segsym->sy_number;
2268 intr->r_offset += S_GET_VALUE (symbol_ptr);
2273 intr->r_symndx = -1;
2275 #else /* BFD_ASSEMBLER */
2277 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2280 bfd_reloc_code_real_type r_type;
2282 if (fixp->fx_addsy && fixp->fx_subsy)
2284 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2285 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2287 as_bad_where (fixp->fx_file, fixp->fx_line,
2288 "Difference of symbols in different sections is not supported");
2293 rel = (arelent *) xmalloc (sizeof (arelent));
2294 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2295 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2296 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2297 rel->addend = fixp->fx_offset;
2299 r_type = fixp->fx_r_type;
2303 fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2306 rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2307 if (rel->howto == NULL)
2309 as_bad_where (fixp->fx_file, fixp->fx_line,
2310 _("Cannot represent relocation type %s"),
2311 bfd_get_reloc_code_name (r_type));