* config/atof-ieee.c, config/obj-coff.c, config/obj-elf.c,
[deliverable/binutils-gdb.git] / gas / config / tc-h8300.c
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 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
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)
10 any later version.
11
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.
16
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
20 02111-1307, USA. */
21
22 /* Written By Steve Chamberlain <sac@cygnus.com>. */
23
24 #include <stdio.h>
25 #include "as.h"
26 #include "subsegs.h"
27 #include "bfd.h"
28
29 #ifdef BFD_ASSEMBLER
30 #include "dwarf2dbg.h"
31 #endif
32
33 #define DEFINE_TABLE
34 #define h8_opcodes ops
35 #include "opcode/h8300.h"
36 #include "safe-ctype.h"
37
38 #ifdef OBJ_ELF
39 #include "elf/h8.h"
40 #endif
41
42 const char comment_chars[] = ";";
43 const char line_comment_chars[] = "#";
44 const char line_separator_chars[] = "";
45
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);
54
55 int Hmode;
56 int Smode;
57 int Nmode;
58 int SXmode;
59
60 #define PSIZE (Hmode && !Nmode ? L_32 : L_16)
61
62 static int bsize = L_8; /* Default branch displacement. */
63
64 struct h8_instruction
65 {
66 int length;
67 int noperands;
68 int idx;
69 int size;
70 const struct h8_opcode *opcode;
71 };
72
73 static struct h8_instruction *h8_instructions;
74
75 static void
76 h8300hmode (int arg ATTRIBUTE_UNUSED)
77 {
78 Hmode = 1;
79 Smode = 0;
80 #ifdef BFD_ASSEMBLER
81 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300h))
82 as_warn (_("could not set architecture and machine"));
83 #endif
84 }
85
86 static void
87 h8300smode (int arg ATTRIBUTE_UNUSED)
88 {
89 Smode = 1;
90 Hmode = 1;
91 #ifdef BFD_ASSEMBLER
92 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300s))
93 as_warn (_("could not set architecture and machine"));
94 #endif
95 }
96
97 static void
98 h8300hnmode (int arg ATTRIBUTE_UNUSED)
99 {
100 Hmode = 1;
101 Smode = 0;
102 Nmode = 1;
103 #ifdef BFD_ASSEMBLER
104 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300hn))
105 as_warn (_("could not set architecture and machine"));
106 #endif
107 }
108
109 static void
110 h8300snmode (int arg ATTRIBUTE_UNUSED)
111 {
112 Smode = 1;
113 Hmode = 1;
114 Nmode = 1;
115 #ifdef BFD_ASSEMBLER
116 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sn))
117 as_warn (_("could not set architecture and machine"));
118 #endif
119 }
120
121 static void
122 h8300sxmode (int arg ATTRIBUTE_UNUSED)
123 {
124 Smode = 1;
125 Hmode = 1;
126 SXmode = 1;
127 #ifdef BFD_ASSEMBLER
128 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sx))
129 as_warn (_("could not set architecture and machine"));
130 #endif
131 }
132
133 static void
134 h8300sxnmode (int arg ATTRIBUTE_UNUSED)
135 {
136 Smode = 1;
137 Hmode = 1;
138 SXmode = 1;
139 Nmode = 1;
140 #ifdef BFD_ASSEMBLER
141 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300sxn))
142 as_warn (_("could not set architecture and machine"));
143 #endif
144 }
145
146 static void
147 sbranch (int size)
148 {
149 bsize = size;
150 }
151
152 static void
153 pint (int arg ATTRIBUTE_UNUSED)
154 {
155 cons (Hmode ? 4 : 2);
156 }
157
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. */
163
164 const pseudo_typeS md_pseudo_table[] =
165 {
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},
174
175 {"int", pint, 0},
176 {"data.b", cons, 1},
177 {"data.w", cons, 2},
178 {"data.l", cons, 4},
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},
184 {0, 0, 0}
185 };
186
187 const int md_reloc_size;
188
189 const char EXP_CHARS[] = "eE";
190
191 /* Chars that mean this number is a floating point constant
192 As in 0f12.456
193 or 0d1.2345e12. */
194 const char FLT_CHARS[] = "rRsSfFdDxXpP";
195
196 static struct hash_control *opcode_hash_control; /* Opcode mnemonics. */
197
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
200 needs. */
201
202 void
203 md_begin (void)
204 {
205 unsigned int nopcodes;
206 struct h8_opcode *p, *p1;
207 struct h8_instruction *pi;
208 char prev_buffer[100];
209 int idx = 0;
210
211 #ifdef BFD_ASSEMBLER
212 if (!bfd_set_arch_mach (stdoutput, bfd_arch_h8300, bfd_mach_h8300))
213 as_warn (_("could not set architecture and machine"));
214 #endif
215
216 opcode_hash_control = hash_new ();
217 prev_buffer[0] = 0;
218
219 nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode);
220
221 h8_instructions = (struct h8_instruction *)
222 xmalloc (nopcodes * sizeof (struct h8_instruction));
223
224 pi = h8_instructions;
225 p1 = h8_opcodes;
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
228 code duplication.
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. */
231 while (p1)
232 {
233 struct h8_opcode *first_skipped = 0;
234 int len, cmplen = 0;
235 char *src = p1->name;
236 char *dst, *buffer;
237
238 if (p1->name == 0)
239 break;
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);
243 while (*src)
244 {
245 if (*src == '.')
246 {
247 src++;
248 break;
249 }
250 if (*src == '/')
251 cmplen = src - p1->name + 1;
252 *dst++ = *src++;
253 }
254 *dst = 0;
255 len = dst - buffer;
256 if (cmplen == 0)
257 cmplen = len;
258 hash_insert (opcode_hash_control, buffer, (char *) pi);
259 strcpy (prev_buffer, buffer);
260 idx++;
261
262 for (p = p1; p->name; p++)
263 {
264 /* A negative TIME is used to indicate that we've added this opcode
265 already. */
266 if (p->time == -1)
267 continue;
268 if (strncmp (p->name, buffer, cmplen) != 0
269 || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
270 && p->name[cmplen - 1] != '/'))
271 {
272 if (first_skipped == 0)
273 first_skipped = p;
274 break;
275 }
276 if (strncmp (p->name, buffer, len) != 0)
277 {
278 if (first_skipped == 0)
279 first_skipped = p;
280 continue;
281 }
282
283 p->time = -1;
284 pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
285 pi->idx = idx;
286
287 /* Find the number of operands. */
288 pi->noperands = 0;
289 while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
290 pi->noperands++;
291
292 /* Find the length of the opcode in bytes. */
293 pi->length = 0;
294 while (p->data.nib[pi->length * 2] != (op_type) E)
295 pi->length++;
296
297 pi->opcode = p;
298 pi++;
299 }
300 p1 = first_skipped;
301 }
302
303 /* Add entry for the NULL vector terminator. */
304 pi->length = 0;
305 pi->noperands = 0;
306 pi->idx = 0;
307 pi->size = 0;
308 pi->opcode = 0;
309
310 linkrelax = 1;
311 }
312
313 struct h8_op
314 {
315 op_type mode;
316 unsigned reg;
317 expressionS exp;
318 };
319
320 static void clever_message (const struct h8_instruction *, struct h8_op *);
321 static void fix_operand_size (struct h8_op *, int);
322 static void build_bytes (const struct h8_instruction *, struct h8_op *);
323 static void do_a_fix_imm (int, int, struct h8_op *, int);
324 static void check_operand (struct h8_op *, unsigned int, char *);
325 static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
326 static char *get_operands (unsigned, char *, struct h8_op *);
327 static void get_operand (char **, struct h8_op *, int);
328 static int parse_reg (char *, op_type *, unsigned *, int);
329 static char *skip_colonthing (char *, int *);
330 static char *parse_exp (char *, struct h8_op *);
331
332 static int constant_fits_width_p (struct h8_op *, unsigned int);
333 static int constant_fits_size_p (struct h8_op *, int, int);
334
335 /*
336 parse operands
337 WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
338 r0l,r0h,..r7l,r7h
339 @WREG
340 @WREG+
341 @-WREG
342 #const
343 ccr
344 */
345
346 /* Try to parse a reg name. Return the number of chars consumed. */
347
348 static int
349 parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
350 {
351 char *end;
352 int len;
353
354 /* Cribbed from get_symbol_end. */
355 if (!is_name_beginner (*src) || *src == '\001')
356 return 0;
357 end = src + 1;
358 while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
359 end++;
360 len = end - src;
361
362 if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
363 {
364 *mode = PSIZE | REG | direction;
365 *reg = 7;
366 return len;
367 }
368 if (len == 3 &&
369 TOLOWER (src[0]) == 'c' &&
370 TOLOWER (src[1]) == 'c' &&
371 TOLOWER (src[2]) == 'r')
372 {
373 *mode = CCR;
374 *reg = 0;
375 return len;
376 }
377 if (len == 3 &&
378 TOLOWER (src[0]) == 'e' &&
379 TOLOWER (src[1]) == 'x' &&
380 TOLOWER (src[2]) == 'r')
381 {
382 *mode = EXR;
383 *reg = 1;
384 return len;
385 }
386 if (len == 3 &&
387 TOLOWER (src[0]) == 'v' &&
388 TOLOWER (src[1]) == 'b' &&
389 TOLOWER (src[2]) == 'r')
390 {
391 *mode = VBR;
392 *reg = 6;
393 return len;
394 }
395 if (len == 3 &&
396 TOLOWER (src[0]) == 's' &&
397 TOLOWER (src[1]) == 'b' &&
398 TOLOWER (src[2]) == 'r')
399 {
400 *mode = SBR;
401 *reg = 7;
402 return len;
403 }
404 if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
405 {
406 *mode = PSIZE | REG | direction;
407 *reg = 6;
408 return len;
409 }
410 if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
411 src[2] >= '0' && src[2] <= '7')
412 {
413 *mode = L_32 | REG | direction;
414 *reg = src[2] - '0';
415 if (!Hmode)
416 as_warn (_("Reg not valid for H8/300"));
417 return len;
418 }
419 if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
420 {
421 *mode = L_16 | REG | direction;
422 *reg = src[1] - '0' + 8;
423 if (!Hmode)
424 as_warn (_("Reg not valid for H8/300"));
425 return len;
426 }
427
428 if (TOLOWER (src[0]) == 'r')
429 {
430 if (src[1] >= '0' && src[1] <= '7')
431 {
432 if (len == 3 && TOLOWER (src[2]) == 'l')
433 {
434 *mode = L_8 | REG | direction;
435 *reg = (src[1] - '0') + 8;
436 return len;
437 }
438 if (len == 3 && TOLOWER (src[2]) == 'h')
439 {
440 *mode = L_8 | REG | direction;
441 *reg = (src[1] - '0');
442 return len;
443 }
444 if (len == 2)
445 {
446 *mode = L_16 | REG | direction;
447 *reg = (src[1] - '0');
448 return len;
449 }
450 }
451 }
452
453 return 0;
454 }
455
456
457 /* Parse an immediate or address-related constant and store it in OP.
458 If the user also specifies the operand's size, store that size
459 in OP->MODE, otherwise leave it for later code to decide. */
460
461 static char *
462 parse_exp (char *src, struct h8_op *op)
463 {
464 char *save;
465
466 save = input_line_pointer;
467 input_line_pointer = src;
468 expression (&op->exp);
469 if (op->exp.X_op == O_absent)
470 as_bad (_("missing operand"));
471 src = input_line_pointer;
472 input_line_pointer = save;
473
474 return skip_colonthing (src, &op->mode);
475 }
476
477
478 /* If SRC starts with an explicit operand size, skip it and store the size
479 in *MODE. Leave *MODE unchanged otherwise. */
480
481 static char *
482 skip_colonthing (char *src, int *mode)
483 {
484 if (*src == ':')
485 {
486 src++;
487 *mode &= ~SIZE;
488 if (src[0] == '8' && !ISDIGIT (src[1]))
489 *mode |= L_8;
490 else if (src[0] == '2' && !ISDIGIT (src[1]))
491 *mode |= L_2;
492 else if (src[0] == '3' && !ISDIGIT (src[1]))
493 *mode |= L_3;
494 else if (src[0] == '4' && !ISDIGIT (src[1]))
495 *mode |= L_4;
496 else if (src[0] == '5' && !ISDIGIT (src[1]))
497 *mode |= L_5;
498 else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2]))
499 *mode |= L_24;
500 else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2]))
501 *mode |= L_32;
502 else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2]))
503 *mode |= L_16;
504 else
505 as_bad (_("invalid operand size requested"));
506
507 while (ISDIGIT (*src))
508 src++;
509 }
510 return src;
511 }
512
513 /* The many forms of operand:
514
515 Rn Register direct
516 @Rn Register indirect
517 @(exp[:16], Rn) Register indirect with displacement
518 @Rn+
519 @-Rn
520 @aa:8 absolute 8 bit
521 @aa:16 absolute 16 bit
522 @aa absolute 16 bit
523
524 #xx[:size] immediate data
525 @(exp:[8], pc) pc rel
526 @@aa[:8] memory indirect. */
527
528 static int
529 constant_fits_width_p (struct h8_op *operand, unsigned int width)
530 {
531 return ((operand->exp.X_add_number & ~width) == 0
532 || (operand->exp.X_add_number | width) == (unsigned)(~0));
533 }
534
535 static int
536 constant_fits_size_p (struct h8_op *operand, int size, int no_symbols)
537 {
538 offsetT num = operand->exp.X_add_number;
539 if (no_symbols
540 && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
541 return 0;
542 switch (size)
543 {
544 case L_2:
545 return (num & ~3) == 0;
546 case L_3:
547 return (num & ~7) == 0;
548 case L_3NZ:
549 return num >= 1 && num < 8;
550 case L_4:
551 return (num & ~15) == 0;
552 case L_5:
553 return num >= 1 && num < 32;
554 case L_8:
555 return (num & ~0xFF) == 0 || ((unsigned)num | 0x7F) == ~0u;
556 case L_8U:
557 return (num & ~0xFF) == 0;
558 case L_16:
559 return (num & ~0xFFFF) == 0 || ((unsigned)num | 0x7FFF) == ~0u;
560 case L_16U:
561 return (num & ~0xFFFF) == 0;
562 case L_32:
563 return 1;
564 default:
565 abort ();
566 }
567 }
568
569 static void
570 get_operand (char **ptr, struct h8_op *op, int direction)
571 {
572 char *src = *ptr;
573 op_type mode;
574 unsigned int num;
575 unsigned int len;
576
577 op->mode = 0;
578
579 /* Check for '(' and ')' for instructions ldm and stm. */
580 if (src[0] == '(' && src[8] == ')')
581 ++ src;
582
583 /* Gross. Gross. ldm and stm have a format not easily handled
584 by get_operand. We deal with it explicitly here. */
585 if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
586 ISDIGIT (src[2]) && src[3] == '-' &&
587 TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
588 {
589 int low, high;
590
591 low = src[2] - '0';
592 high = src[6] - '0';
593
594 /* Check register pair's validity as per tech note TN-H8*-193A/E
595 from Renesas for H8S and H8SX hardware manual. */
596 if ( !(low == 0 && (high == 1 || high == 2 || high == 3))
597 && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode)
598 && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode)))
599 && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode)
600 && !(low == 4 && (high == 5 || high == 6))
601 && !(low == 4 && high == 7 && SXmode)
602 && !(low == 5 && (high == 6 || high == 7) && SXmode)
603 && !(low == 6 && high == 7 && SXmode))
604 as_bad (_("Invalid register list for ldm/stm\n"));
605
606 /* Even sicker. We encode two registers into op->reg. One
607 for the low register to save, the other for the high
608 register to save; we also set the high bit in op->reg
609 so we know this is "very special". */
610 op->reg = 0x80000000 | (high << 8) | low;
611 op->mode = REG;
612 if (src[7] == ')')
613 *ptr = src + 8;
614 else
615 *ptr = src + 7;
616 return;
617 }
618
619 len = parse_reg (src, &op->mode, &op->reg, direction);
620 if (len)
621 {
622 src += len;
623 if (*src == '.')
624 {
625 int size = op->mode & SIZE;
626 switch (src[1])
627 {
628 case 'l': case 'L':
629 if (size != L_32)
630 as_warn (_("mismatch between register and suffix"));
631 op->mode = (op->mode & ~MODE) | LOWREG;
632 break;
633 case 'w': case 'W':
634 if (size != L_32 && size != L_16)
635 as_warn (_("mismatch between register and suffix"));
636 op->mode = (op->mode & ~MODE) | LOWREG;
637 op->mode = (op->mode & ~SIZE) | L_16;
638 break;
639 case 'b': case 'B':
640 op->mode = (op->mode & ~MODE) | LOWREG;
641 if (size != L_32 && size != L_8)
642 as_warn (_("mismatch between register and suffix"));
643 op->mode = (op->mode & ~MODE) | LOWREG;
644 op->mode = (op->mode & ~SIZE) | L_8;
645 break;
646 default:
647 as_warn ("invalid suffix after register.");
648 break;
649 }
650 src += 2;
651 }
652 *ptr = src;
653 return;
654 }
655
656 if (*src == '@')
657 {
658 src++;
659 if (*src == '@')
660 {
661 *ptr = parse_exp (src + 1, op);
662 if (op->exp.X_add_number >= 0x100)
663 {
664 int divisor = 1;
665
666 op->mode = VECIND;
667 /* FIXME : 2? or 4? */
668 if (op->exp.X_add_number >= 0x400)
669 as_bad (_("address too high for vector table jmp/jsr"));
670 else if (op->exp.X_add_number >= 0x200)
671 divisor = 4;
672 else
673 divisor = 2;
674
675 op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
676 }
677 else
678 op->mode = MEMIND;
679 return;
680 }
681
682 if (*src == '-' || *src == '+')
683 {
684 len = parse_reg (src + 1, &mode, &num, direction);
685 if (len == 0)
686 {
687 /* Oops, not a reg after all, must be ordinary exp. */
688 op->mode = ABS | direction;
689 *ptr = parse_exp (src, op);
690 return;
691 }
692
693 if (((mode & SIZE) != PSIZE)
694 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
695 && (!Nmode || ((mode & SIZE) != L_32)))
696 as_bad (_("Wrong size pointer register for architecture."));
697
698 op->mode = src[0] == '-' ? RDPREDEC : RDPREINC;
699 op->reg = num;
700 *ptr = src + 1 + len;
701 return;
702 }
703 if (*src == '(')
704 {
705 src++;
706
707 /* See if this is @(ERn.x, PC). */
708 len = parse_reg (src, &mode, &op->reg, direction);
709 if (len != 0 && (mode & MODE) == REG && src[len] == '.')
710 {
711 switch (TOLOWER (src[len + 1]))
712 {
713 case 'b':
714 mode = PCIDXB | direction;
715 break;
716 case 'w':
717 mode = PCIDXW | direction;
718 break;
719 case 'l':
720 mode = PCIDXL | direction;
721 break;
722 default:
723 mode = 0;
724 break;
725 }
726 if (mode
727 && src[len + 2] == ','
728 && TOLOWER (src[len + 3]) != 'p'
729 && TOLOWER (src[len + 4]) != 'c'
730 && src[len + 5] != ')')
731 {
732 *ptr = src + len + 6;
733 op->mode |= mode;
734 return;
735 }
736 /* Fall through into disp case - the grammar is somewhat
737 ambiguous, so we should try whether it's a DISP operand
738 after all ("ER3.L" might be a poorly named label...). */
739 }
740
741 /* Disp. */
742
743 /* Start off assuming a 16 bit offset. */
744
745 src = parse_exp (src, op);
746 if (*src == ')')
747 {
748 op->mode |= ABS | direction;
749 *ptr = src + 1;
750 return;
751 }
752
753 if (*src != ',')
754 {
755 as_bad (_("expected @(exp, reg16)"));
756 return;
757 }
758 src++;
759
760 len = parse_reg (src, &mode, &op->reg, direction);
761 if (len == 0 || (mode & MODE) != REG)
762 {
763 as_bad (_("expected @(exp, reg16)"));
764 return;
765 }
766 src += len;
767 if (src[0] == '.')
768 {
769 switch (TOLOWER (src[1]))
770 {
771 case 'b':
772 op->mode |= INDEXB | direction;
773 break;
774 case 'w':
775 op->mode |= INDEXW | direction;
776 break;
777 case 'l':
778 op->mode |= INDEXL | direction;
779 break;
780 default:
781 as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
782 }
783 src += 2;
784 op->reg &= 7;
785 }
786 else
787 op->mode |= DISP | direction;
788 src = skip_colonthing (src, &op->mode);
789
790 if (*src != ')' && '(')
791 {
792 as_bad (_("expected @(exp, reg16)"));
793 return;
794 }
795 *ptr = src + 1;
796 return;
797 }
798 len = parse_reg (src, &mode, &num, direction);
799
800 if (len)
801 {
802 src += len;
803 if (*src == '+' || *src == '-')
804 {
805 if (((mode & SIZE) != PSIZE)
806 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
807 && (!Nmode || ((mode & SIZE) != L_32)))
808 as_bad (_("Wrong size pointer register for architecture."));
809 op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
810 op->reg = num;
811 src++;
812 *ptr = src;
813 return;
814 }
815 if (((mode & SIZE) != PSIZE)
816 /* For Normal mode accept 16 bit and 32 bit pointer registers. */
817 && (!Nmode || ((mode & SIZE) != L_32)))
818 as_bad (_("Wrong size pointer register for architecture."));
819
820 op->mode = direction | IND | PSIZE;
821 op->reg = num;
822 *ptr = src;
823
824 return;
825 }
826 else
827 {
828 /* must be a symbol */
829
830 op->mode = ABS | direction;
831 *ptr = parse_exp (src, op);
832 return;
833 }
834 }
835
836 if (*src == '#')
837 {
838 op->mode = IMM;
839 *ptr = parse_exp (src + 1, op);
840 return;
841 }
842 else if (strncmp (src, "mach", 4) == 0 ||
843 strncmp (src, "macl", 4) == 0 ||
844 strncmp (src, "MACH", 4) == 0 ||
845 strncmp (src, "MACL", 4) == 0)
846 {
847 op->reg = TOLOWER (src[3]) == 'l';
848 op->mode = MACREG;
849 *ptr = src + 4;
850 return;
851 }
852 else
853 {
854 op->mode = PCREL;
855 *ptr = parse_exp (src, op);
856 }
857 }
858
859 static char *
860 get_operands (unsigned int noperands, char *op_end, struct h8_op *operand)
861 {
862 char *ptr = op_end;
863
864 switch (noperands)
865 {
866 case 0:
867 break;
868
869 case 1:
870 ptr++;
871 get_operand (&ptr, operand + 0, SRC);
872 if (*ptr == ',')
873 {
874 ptr++;
875 get_operand (&ptr, operand + 1, DST);
876 }
877 break;
878
879 case 2:
880 ptr++;
881 get_operand (&ptr, operand + 0, SRC);
882 if (*ptr == ',')
883 ptr++;
884 get_operand (&ptr, operand + 1, DST);
885 break;
886
887 case 3:
888 ptr++;
889 get_operand (&ptr, operand + 0, SRC);
890 if (*ptr == ',')
891 ptr++;
892 get_operand (&ptr, operand + 1, DST);
893 if (*ptr == ',')
894 ptr++;
895 get_operand (&ptr, operand + 2, OP3);
896 break;
897
898 default:
899 abort ();
900 }
901
902 return ptr;
903 }
904
905 /* MOVA has special requirements. Rather than adding twice the amount of
906 addressing modes, we simply special case it a bit. */
907 static void
908 get_mova_operands (char *op_end, struct h8_op *operand)
909 {
910 char *ptr = op_end;
911
912 if (ptr[1] != '@' || ptr[2] != '(')
913 goto error;
914 ptr += 3;
915 operand[0].mode = 0;
916 ptr = parse_exp (ptr, &operand[0]);
917
918 if (*ptr !=',')
919 goto error;
920 ptr++;
921 get_operand (&ptr, operand + 1, DST);
922
923 if (*ptr =='.')
924 {
925 ptr++;
926 switch (*ptr++)
927 {
928 case 'b': case 'B':
929 operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
930 break;
931 case 'w': case 'W':
932 operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
933 break;
934 case 'l': case 'L':
935 operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
936 break;
937 default:
938 goto error;
939 }
940 }
941 else if ((operand[1].mode & MODE) == LOWREG)
942 {
943 switch (operand[1].mode & SIZE)
944 {
945 case L_8:
946 operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
947 break;
948 case L_16:
949 operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
950 break;
951 case L_32:
952 operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
953 break;
954 default:
955 goto error;
956 }
957 }
958 else
959 goto error;
960
961 if (*ptr++ != ')' || *ptr++ != ',')
962 goto error;
963 get_operand (&ptr, operand + 2, OP3);
964 /* See if we can use the short form of MOVA. */
965 if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
966 && (operand[2].mode & MODE) == REG
967 && (operand[1].reg & 7) == (operand[2].reg & 7))
968 {
969 operand[1].mode = operand[2].mode = 0;
970 operand[0].reg = operand[2].reg & 7;
971 }
972 return;
973
974 error:
975 as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
976 }
977
978 static void
979 get_rtsl_operands (char *ptr, struct h8_op *operand)
980 {
981 int mode, num, num2, len, type = 0;
982
983 ptr++;
984 if (*ptr == '(')
985 {
986 ptr++;
987 type = 1;
988 }
989 len = parse_reg (ptr, &mode, &num, SRC);
990 if (len == 0 || (mode & MODE) != REG)
991 {
992 as_bad (_("expected register"));
993 return;
994 }
995 ptr += len;
996 if (*ptr == '-')
997 {
998 len = parse_reg (++ptr, &mode, &num2, SRC);
999 if (len == 0 || (mode & MODE) != REG)
1000 {
1001 as_bad (_("expected register"));
1002 return;
1003 }
1004 ptr += len;
1005 /* CONST_xxx are used as placeholders in the opcode table. */
1006 num = num2 - num;
1007 if (num < 0 || num > 3)
1008 {
1009 as_bad (_("invalid register list"));
1010 return;
1011 }
1012 }
1013 else
1014 num2 = num, num = 0;
1015 if (type == 1 && *ptr++ != ')')
1016 {
1017 as_bad (_("expected closing paren"));
1018 return;
1019 }
1020 operand[0].mode = RS32;
1021 operand[1].mode = RD32;
1022 operand[0].reg = num;
1023 operand[1].reg = num2;
1024 }
1025
1026 /* Passed a pointer to a list of opcodes which use different
1027 addressing modes, return the opcode which matches the opcodes
1028 provided. */
1029
1030 static const struct h8_instruction *
1031 get_specific (const struct h8_instruction *instruction,
1032 struct h8_op *operands, int size)
1033 {
1034 const struct h8_instruction *this_try = instruction;
1035 const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1036 int found = 0;
1037 int this_index = instruction->idx;
1038 int noperands = 0;
1039
1040 /* There's only one ldm/stm and it's easier to just
1041 get out quick for them. */
1042 if (OP_KIND (instruction->opcode->how) == O_LDM
1043 || OP_KIND (instruction->opcode->how) == O_STM)
1044 return this_try;
1045
1046 while (noperands < 3 && operands[noperands].mode != 0)
1047 noperands++;
1048
1049 while (this_index == instruction->idx && !found)
1050 {
1051 int this_size;
1052
1053 found = 1;
1054 this_try = instruction++;
1055 this_size = this_try->opcode->how & SN;
1056
1057 if (this_try->noperands != noperands)
1058 found = 0;
1059 else if (this_try->noperands > 0)
1060 {
1061 int i;
1062
1063 for (i = 0; i < this_try->noperands && found; i++)
1064 {
1065 op_type op = this_try->opcode->args.nib[i];
1066 int op_mode = op & MODE;
1067 int op_size = op & SIZE;
1068 int x = operands[i].mode;
1069 int x_mode = x & MODE;
1070 int x_size = x & SIZE;
1071
1072 if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1073 {
1074 if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1075 || (x_size == L_16 && (operands[i].reg & 8) == 8))
1076 as_warn (_("can't use high part of register in operand %d"), i);
1077
1078 if (x_size != op_size)
1079 found = 0;
1080 }
1081 else if (op_mode == REG)
1082 {
1083 if (x_mode == LOWREG)
1084 x_mode = REG;
1085 if (x_mode != REG)
1086 found = 0;
1087
1088 if (x_size == L_P)
1089 x_size = (Hmode ? L_32 : L_16);
1090 if (op_size == L_P)
1091 op_size = (Hmode ? L_32 : L_16);
1092
1093 /* The size of the reg is v important. */
1094 if (op_size != x_size)
1095 found = 0;
1096 }
1097 else if (op_mode & CTRL) /* control register */
1098 {
1099 if (!(x_mode & CTRL))
1100 found = 0;
1101
1102 switch (x_mode)
1103 {
1104 case CCR:
1105 if (op_mode != CCR &&
1106 op_mode != CCR_EXR &&
1107 op_mode != CC_EX_VB_SB)
1108 found = 0;
1109 break;
1110 case EXR:
1111 if (op_mode != EXR &&
1112 op_mode != CCR_EXR &&
1113 op_mode != CC_EX_VB_SB)
1114 found = 0;
1115 break;
1116 case MACH:
1117 if (op_mode != MACH &&
1118 op_mode != MACREG)
1119 found = 0;
1120 break;
1121 case MACL:
1122 if (op_mode != MACL &&
1123 op_mode != MACREG)
1124 found = 0;
1125 break;
1126 case VBR:
1127 if (op_mode != VBR &&
1128 op_mode != VBR_SBR &&
1129 op_mode != CC_EX_VB_SB)
1130 found = 0;
1131 break;
1132 case SBR:
1133 if (op_mode != SBR &&
1134 op_mode != VBR_SBR &&
1135 op_mode != CC_EX_VB_SB)
1136 found = 0;
1137 break;
1138 }
1139 }
1140 else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1141 {
1142 operands[i].mode &= ~MODE;
1143 operands[i].mode |= ABSJMP;
1144 /* But it may not be 24 bits long. */
1145 if (x_mode == ABS && !Hmode)
1146 {
1147 operands[i].mode &= ~SIZE;
1148 operands[i].mode |= L_16;
1149 }
1150 if ((operands[i].mode & SIZE) == L_32
1151 && (op_mode & SIZE) != L_32)
1152 found = 0;
1153 }
1154 else if (x_mode == IMM && op_mode != IMM)
1155 {
1156 offsetT num = operands[i].exp.X_add_number;
1157 if (op_mode == KBIT || op_mode == DBIT)
1158 /* This is ok if the immediate value is sensible. */;
1159 else if (op_mode == CONST_2)
1160 found = num == 2;
1161 else if (op_mode == CONST_4)
1162 found = num == 4;
1163 else if (op_mode == CONST_8)
1164 found = num == 8;
1165 else if (op_mode == CONST_16)
1166 found = num == 16;
1167 else
1168 found = 0;
1169 }
1170 else if (op_mode == PCREL && op_mode == x_mode)
1171 {
1172 /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1173 If x_size is L_8, promote it. */
1174 if (OP_KIND (this_try->opcode->how) == O_MOVSD
1175 || OP_KIND (this_try->opcode->how) == O_BSRBC
1176 || OP_KIND (this_try->opcode->how) == O_BSRBS)
1177 if (x_size == L_8)
1178 x_size = L_16;
1179
1180 /* The size of the displacement is important. */
1181 if (op_size != x_size)
1182 found = 0;
1183 }
1184 else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1185 || op_mode == INDEXB || op_mode == INDEXW
1186 || op_mode == INDEXL)
1187 && op_mode == x_mode)
1188 {
1189 /* Promote a L_24 to L_32 if it makes us match. */
1190 if (x_size == L_24 && op_size == L_32)
1191 {
1192 x &= ~SIZE;
1193 x |= x_size = L_32;
1194 }
1195
1196 if (((x_size == L_16 && op_size == L_16U)
1197 || (x_size == L_8 && op_size == L_8U)
1198 || (x_size == L_3 && op_size == L_3NZ))
1199 /* We're deliberately more permissive for ABS modes. */
1200 && (op_mode == ABS
1201 || constant_fits_size_p (operands + i, op_size,
1202 op & NO_SYMBOLS)))
1203 x_size = op_size;
1204
1205 if (x_size != 0 && op_size != x_size)
1206 found = 0;
1207 else if (x_size == 0
1208 && ! constant_fits_size_p (operands + i, op_size,
1209 op & NO_SYMBOLS))
1210 found = 0;
1211 }
1212 else if (op_mode != x_mode)
1213 {
1214 found = 0;
1215 }
1216 }
1217 }
1218 if (found)
1219 {
1220 if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1221 || (this_try->opcode->available == AV_H8S && ! Smode)
1222 || (this_try->opcode->available == AV_H8H && ! Hmode))
1223 found = 0, found_other = this_try;
1224 else if (this_size != size && (this_size != SN && size != SN))
1225 found_mismatched = this_try, found = 0;
1226
1227 }
1228 }
1229 if (found)
1230 return this_try;
1231 if (found_other)
1232 {
1233 as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1234 found_other->opcode->name,
1235 (! Hmode && ! Smode ? "H8/300"
1236 : SXmode ? "H8sx"
1237 : Smode ? "H8/300S"
1238 : "H8/300H"));
1239 }
1240 else if (found_mismatched)
1241 {
1242 as_warn (_("mismatch between opcode size and operand size"));
1243 return found_mismatched;
1244 }
1245 return 0;
1246 }
1247
1248 static void
1249 check_operand (struct h8_op *operand, unsigned int width, char *string)
1250 {
1251 if (operand->exp.X_add_symbol == 0
1252 && operand->exp.X_op_symbol == 0)
1253 {
1254 /* No symbol involved, let's look at offset, it's dangerous if
1255 any of the high bits are not 0 or ff's, find out by oring or
1256 anding with the width and seeing if the answer is 0 or all
1257 fs. */
1258
1259 if (! constant_fits_width_p (operand, width))
1260 {
1261 if (width == 255
1262 && (operand->exp.X_add_number & 0xff00) == 0xff00)
1263 {
1264 /* Just ignore this one - which happens when trying to
1265 fit a 16 bit address truncated into an 8 bit address
1266 of something like bset. */
1267 }
1268 else if (strcmp (string, "@") == 0
1269 && width == 0xffff
1270 && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1271 {
1272 /* Just ignore this one - which happens when trying to
1273 fit a 24 bit address truncated into a 16 bit address
1274 of something like mov.w. */
1275 }
1276 else
1277 {
1278 as_warn (_("operand %s0x%lx out of range."), string,
1279 (unsigned long) operand->exp.X_add_number);
1280 }
1281 }
1282 }
1283 }
1284
1285 /* RELAXMODE has one of 3 values:
1286
1287 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1288
1289 1 Output a relaxable 24bit absolute mov.w address relocation
1290 (may relax into a 16bit absolute address).
1291
1292 2 Output a relaxable 16/24 absolute mov.b address relocation
1293 (may relax into an 8bit absolute address). */
1294
1295 static void
1296 do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode)
1297 {
1298 int idx;
1299 int size;
1300 int where;
1301 char *bytes = frag_now->fr_literal + offset;
1302
1303 char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1304
1305 if (operand->exp.X_add_symbol == 0)
1306 {
1307 switch (operand->mode & SIZE)
1308 {
1309 case L_2:
1310 check_operand (operand, 0x3, t);
1311 bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1312 break;
1313 case L_3:
1314 case L_3NZ:
1315 check_operand (operand, 0x7, t);
1316 bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1317 break;
1318 case L_4:
1319 check_operand (operand, 0xF, t);
1320 bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1321 break;
1322 case L_5:
1323 check_operand (operand, 0x1F, t);
1324 bytes[0] |= operand->exp.X_add_number & 31;
1325 break;
1326 case L_8:
1327 case L_8U:
1328 check_operand (operand, 0xff, t);
1329 bytes[0] |= operand->exp.X_add_number;
1330 break;
1331 case L_16:
1332 case L_16U:
1333 check_operand (operand, 0xffff, t);
1334 bytes[0] |= operand->exp.X_add_number >> 8;
1335 bytes[1] |= operand->exp.X_add_number >> 0;
1336 break;
1337 case L_24:
1338 check_operand (operand, 0xffffff, t);
1339 bytes[0] |= operand->exp.X_add_number >> 16;
1340 bytes[1] |= operand->exp.X_add_number >> 8;
1341 bytes[2] |= operand->exp.X_add_number >> 0;
1342 break;
1343
1344 case L_32:
1345 /* This should be done with bfd. */
1346 bytes[0] |= operand->exp.X_add_number >> 24;
1347 bytes[1] |= operand->exp.X_add_number >> 16;
1348 bytes[2] |= operand->exp.X_add_number >> 8;
1349 bytes[3] |= operand->exp.X_add_number >> 0;
1350 if (relaxmode != 0)
1351 {
1352 idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1353 fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1354 }
1355 break;
1356 }
1357 }
1358 else
1359 {
1360 switch (operand->mode & SIZE)
1361 {
1362 case L_24:
1363 case L_32:
1364 size = 4;
1365 where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1366 if (relaxmode == 2)
1367 idx = R_MOV24B1;
1368 else if (relaxmode == 1)
1369 idx = R_MOVL1;
1370 else
1371 idx = R_RELLONG;
1372 break;
1373 default:
1374 as_bad (_("Can't work out size of operand.\n"));
1375 case L_16:
1376 case L_16U:
1377 size = 2;
1378 where = 0;
1379 if (relaxmode == 2)
1380 idx = R_MOV16B1;
1381 else
1382 idx = R_RELWORD;
1383 operand->exp.X_add_number =
1384 ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1385 operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1386 break;
1387 case L_8:
1388 size = 1;
1389 where = 0;
1390 idx = R_RELBYTE;
1391 operand->exp.X_add_number =
1392 ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1393 operand->exp.X_add_number |= bytes[0];
1394 }
1395
1396 fix_new_exp (frag_now,
1397 offset + where,
1398 size,
1399 &operand->exp,
1400 0,
1401 idx);
1402 }
1403 }
1404
1405 /* Now we know what sort of opcodes it is, let's build the bytes. */
1406
1407 static void
1408 build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1409 {
1410 int i;
1411 char *output = frag_more (this_try->length);
1412 op_type *nibble_ptr = this_try->opcode->data.nib;
1413 op_type c;
1414 unsigned int nibble_count = 0;
1415 int op_at[3];
1416 int nib = 0;
1417 int movb = 0;
1418 char asnibbles[100];
1419 char *p = asnibbles;
1420 int high, low;
1421
1422 if (!Hmode && this_try->opcode->available != AV_H8)
1423 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1424 this_try->opcode->name);
1425 else if (!Smode
1426 && this_try->opcode->available != AV_H8
1427 && this_try->opcode->available != AV_H8H)
1428 as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1429 this_try->opcode->name);
1430 else if (!SXmode
1431 && this_try->opcode->available != AV_H8
1432 && this_try->opcode->available != AV_H8H
1433 && this_try->opcode->available != AV_H8S)
1434 as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1435 this_try->opcode->name);
1436
1437 while (*nibble_ptr != (op_type) E)
1438 {
1439 int d;
1440
1441 nib = 0;
1442 c = *nibble_ptr++;
1443
1444 d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1445
1446 if (c < 16)
1447 nib = c;
1448 else
1449 {
1450 int c2 = c & MODE;
1451
1452 if (c2 == REG || c2 == LOWREG
1453 || c2 == IND || c2 == PREINC || c2 == PREDEC
1454 || c2 == POSTINC || c2 == POSTDEC)
1455 {
1456 nib = operand[d].reg;
1457 if (c2 == LOWREG)
1458 nib &= 7;
1459 }
1460
1461 else if (c & CTRL) /* Control reg operand. */
1462 nib = operand[d].reg;
1463
1464 else if ((c & DISPREG) == (DISPREG))
1465 {
1466 nib = operand[d].reg;
1467 }
1468 else if (c2 == ABS)
1469 {
1470 operand[d].mode = c;
1471 op_at[d] = nibble_count;
1472 nib = 0;
1473 }
1474 else if (c2 == IMM || c2 == PCREL || c2 == ABS
1475 || (c & ABSJMP) || c2 == DISP)
1476 {
1477 operand[d].mode = c;
1478 op_at[d] = nibble_count;
1479 nib = 0;
1480 }
1481 else if ((c & IGNORE) || (c & DATA))
1482 nib = 0;
1483
1484 else if (c2 == DBIT)
1485 {
1486 switch (operand[0].exp.X_add_number)
1487 {
1488 case 1:
1489 nib = c;
1490 break;
1491 case 2:
1492 nib = 0x8 | c;
1493 break;
1494 default:
1495 as_bad (_("Need #1 or #2 here"));
1496 }
1497 }
1498 else if (c2 == KBIT)
1499 {
1500 switch (operand[0].exp.X_add_number)
1501 {
1502 case 1:
1503 nib = 0;
1504 break;
1505 case 2:
1506 nib = 8;
1507 break;
1508 case 4:
1509 if (!Hmode)
1510 as_warn (_("#4 not valid on H8/300."));
1511 nib = 9;
1512 break;
1513
1514 default:
1515 as_bad (_("Need #1 or #2 here"));
1516 break;
1517 }
1518 /* Stop it making a fix. */
1519 operand[0].mode = 0;
1520 }
1521
1522 if (c & MEMRELAX)
1523 operand[d].mode |= MEMRELAX;
1524
1525 if (c & B31)
1526 nib |= 0x8;
1527
1528 if (c & B21)
1529 nib |= 0x4;
1530
1531 if (c & B11)
1532 nib |= 0x2;
1533
1534 if (c & B01)
1535 nib |= 0x1;
1536
1537 if (c2 == MACREG)
1538 {
1539 if (operand[0].mode == MACREG)
1540 /* stmac has mac[hl] as the first operand. */
1541 nib = 2 + operand[0].reg;
1542 else
1543 /* ldmac has mac[hl] as the second operand. */
1544 nib = 2 + operand[1].reg;
1545 }
1546 }
1547 nibble_count++;
1548
1549 *p++ = nib;
1550 }
1551
1552 /* Disgusting. Why, oh why didn't someone ask us for advice
1553 on the assembler format. */
1554 if (OP_KIND (this_try->opcode->how) == O_LDM)
1555 {
1556 high = (operand[1].reg >> 8) & 0xf;
1557 low = (operand[1].reg) & 0xf;
1558 asnibbles[2] = high - low;
1559 asnibbles[7] = high;
1560 }
1561 else if (OP_KIND (this_try->opcode->how) == O_STM)
1562 {
1563 high = (operand[0].reg >> 8) & 0xf;
1564 low = (operand[0].reg) & 0xf;
1565 asnibbles[2] = high - low;
1566 asnibbles[7] = low;
1567 }
1568
1569 for (i = 0; i < this_try->length; i++)
1570 output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1571
1572 /* Note if this is a movb or a bit manipulation instruction
1573 there is a special relaxation which only applies. */
1574 if ( this_try->opcode->how == O (O_MOV, SB)
1575 || this_try->opcode->how == O (O_BCLR, SB)
1576 || this_try->opcode->how == O (O_BAND, SB)
1577 || this_try->opcode->how == O (O_BIAND, SB)
1578 || this_try->opcode->how == O (O_BILD, SB)
1579 || this_try->opcode->how == O (O_BIOR, SB)
1580 || this_try->opcode->how == O (O_BIST, SB)
1581 || this_try->opcode->how == O (O_BIXOR, SB)
1582 || this_try->opcode->how == O (O_BLD, SB)
1583 || this_try->opcode->how == O (O_BNOT, SB)
1584 || this_try->opcode->how == O (O_BOR, SB)
1585 || this_try->opcode->how == O (O_BSET, SB)
1586 || this_try->opcode->how == O (O_BST, SB)
1587 || this_try->opcode->how == O (O_BTST, SB)
1588 || this_try->opcode->how == O (O_BXOR, SB))
1589 movb = 1;
1590
1591 /* Output any fixes. */
1592 for (i = 0; i < this_try->noperands; i++)
1593 {
1594 int x = operand[i].mode;
1595 int x_mode = x & MODE;
1596
1597 if (x_mode == IMM || x_mode == DISP)
1598 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1599 op_at[i] & 1, operand + i, (x & MEMRELAX) != 0);
1600
1601 else if (x_mode == ABS)
1602 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1603 op_at[i] & 1, operand + i,
1604 (x & MEMRELAX) ? movb + 1 : 0);
1605
1606 else if (x_mode == PCREL)
1607 {
1608 int size16 = (x & SIZE) == L_16;
1609 int size = size16 ? 2 : 1;
1610 int type = size16 ? R_PCRWORD : R_PCRBYTE;
1611 fixS *fixP;
1612
1613 check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1614
1615 if (operand[i].exp.X_add_number & 1)
1616 as_warn (_("branch operand has odd offset (%lx)\n"),
1617 (unsigned long) operand->exp.X_add_number);
1618 #ifndef OBJ_ELF
1619 /* The COFF port has always been off by one, changing it
1620 now would be an incompatible change, so we leave it as-is.
1621
1622 We don't want to do this for ELF as we want to be
1623 compatible with the proposed ELF format from Hitachi. */
1624 operand[i].exp.X_add_number -= 1;
1625 #endif
1626 if (size16)
1627 {
1628 operand[i].exp.X_add_number =
1629 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1630 }
1631 else
1632 {
1633 operand[i].exp.X_add_number =
1634 ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1635 }
1636
1637 /* For BRA/S. */
1638 if (! size16)
1639 operand[i].exp.X_add_number |= output[op_at[i] / 2];
1640
1641 fixP = fix_new_exp (frag_now,
1642 output - frag_now->fr_literal + op_at[i] / 2,
1643 size,
1644 &operand[i].exp,
1645 1,
1646 type);
1647 fixP->fx_signed = 1;
1648 }
1649 else if (x_mode == MEMIND)
1650 {
1651 check_operand (operand + i, 0xff, "@@");
1652 fix_new_exp (frag_now,
1653 output - frag_now->fr_literal + 1,
1654 1,
1655 &operand[i].exp,
1656 0,
1657 R_MEM_INDIRECT);
1658 }
1659 else if (x_mode == VECIND)
1660 {
1661 check_operand (operand + i, 0x7f, "@@");
1662 /* FIXME: approximating the effect of "B31" here...
1663 This is very hackish, and ought to be done a better way. */
1664 operand[i].exp.X_add_number |= 0x80;
1665 fix_new_exp (frag_now,
1666 output - frag_now->fr_literal + 1,
1667 1,
1668 &operand[i].exp,
1669 0,
1670 R_MEM_INDIRECT);
1671 }
1672 else if (x & ABSJMP)
1673 {
1674 int where = 0;
1675 bfd_reloc_code_real_type reloc_type = R_JMPL1;
1676
1677 #ifdef OBJ_ELF
1678 /* To be compatible with the proposed H8 ELF format, we
1679 want the relocation's offset to point to the first byte
1680 that will be modified, not to the start of the instruction. */
1681
1682 if ((operand->mode & SIZE) == L_32)
1683 {
1684 where = 2;
1685 reloc_type = R_RELLONG;
1686 }
1687 else
1688 where = 1;
1689 #endif
1690
1691 /* This jmp may be a jump or a branch. */
1692
1693 check_operand (operand + i,
1694 SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1695 "@");
1696
1697 if (operand[i].exp.X_add_number & 1)
1698 as_warn (_("branch operand has odd offset (%lx)\n"),
1699 (unsigned long) operand->exp.X_add_number);
1700
1701 if (!Hmode)
1702 operand[i].exp.X_add_number =
1703 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1704 fix_new_exp (frag_now,
1705 output - frag_now->fr_literal + where,
1706 4,
1707 &operand[i].exp,
1708 0,
1709 reloc_type);
1710 }
1711 }
1712 }
1713
1714 /* Try to give an intelligent error message for common and simple to
1715 detect errors. */
1716
1717 static void
1718 clever_message (const struct h8_instruction *instruction,
1719 struct h8_op *operand)
1720 {
1721 /* Find out if there was more than one possible opcode. */
1722
1723 if ((instruction + 1)->idx != instruction->idx)
1724 {
1725 int argn;
1726
1727 /* Only one opcode of this flavour, try to guess which operand
1728 didn't match. */
1729 for (argn = 0; argn < instruction->noperands; argn++)
1730 {
1731 switch (instruction->opcode->args.nib[argn])
1732 {
1733 case RD16:
1734 if (operand[argn].mode != RD16)
1735 {
1736 as_bad (_("destination operand must be 16 bit register"));
1737 return;
1738
1739 }
1740 break;
1741
1742 case RS8:
1743 if (operand[argn].mode != RS8)
1744 {
1745 as_bad (_("source operand must be 8 bit register"));
1746 return;
1747 }
1748 break;
1749
1750 case ABS16DST:
1751 if (operand[argn].mode != ABS16DST)
1752 {
1753 as_bad (_("destination operand must be 16bit absolute address"));
1754 return;
1755 }
1756 break;
1757 case RD8:
1758 if (operand[argn].mode != RD8)
1759 {
1760 as_bad (_("destination operand must be 8 bit register"));
1761 return;
1762 }
1763 break;
1764
1765 case ABS16SRC:
1766 if (operand[argn].mode != ABS16SRC)
1767 {
1768 as_bad (_("source operand must be 16bit absolute address"));
1769 return;
1770 }
1771 break;
1772
1773 }
1774 }
1775 }
1776 as_bad (_("invalid operands"));
1777 }
1778
1779
1780 /* If OPERAND is part of an address, adjust its size and value given
1781 that it addresses SIZE bytes.
1782
1783 This function decides how big non-immediate constants are when no
1784 size was explicitly given. It also scales down the assembly-level
1785 displacement in an @(d:2,ERn) operand. */
1786
1787 static void
1788 fix_operand_size (struct h8_op *operand, int size)
1789 {
1790 if (SXmode && (operand->mode & MODE) == DISP)
1791 {
1792 /* If the user didn't specify an operand width, see if we
1793 can use @(d:2,ERn). */
1794 if ((operand->mode & SIZE) == 0
1795 && operand->exp.X_add_symbol == 0
1796 && operand->exp.X_op_symbol == 0
1797 && (operand->exp.X_add_number == size
1798 || operand->exp.X_add_number == size * 2
1799 || operand->exp.X_add_number == size * 3))
1800 operand->mode |= L_2;
1801
1802 /* Scale down the displacement in an @(d:2,ERn) operand.
1803 X_add_number then contains the desired field value. */
1804 if ((operand->mode & SIZE) == L_2)
1805 {
1806 if (operand->exp.X_add_number % size != 0)
1807 as_warn (_("operand/size mis-match"));
1808 operand->exp.X_add_number /= size;
1809 }
1810 }
1811
1812 if ((operand->mode & SIZE) == 0)
1813 switch (operand->mode & MODE)
1814 {
1815 case DISP:
1816 case INDEXB:
1817 case INDEXW:
1818 case INDEXL:
1819 case ABS:
1820 /* Pick a 24-bit address unless we know that a 16-bit address
1821 is safe. get_specific() will relax L_24 into L_32 where
1822 necessary. */
1823 if (Hmode
1824 && !Nmode
1825 && (operand->exp.X_add_number < -32768
1826 || operand->exp.X_add_number > 32767
1827 || operand->exp.X_add_symbol != 0
1828 || operand->exp.X_op_symbol != 0))
1829 operand->mode |= L_24;
1830 else
1831 operand->mode |= L_16;
1832 break;
1833
1834 case PCREL:
1835 /* This condition is long standing, though somewhat suspect. */
1836 if (operand->exp.X_add_number > -128
1837 && operand->exp.X_add_number < 127)
1838 operand->mode |= L_8;
1839 else
1840 operand->mode |= L_16;
1841 break;
1842 }
1843 }
1844
1845
1846 /* This is the guts of the machine-dependent assembler. STR points to
1847 a machine dependent instruction. This function is supposed to emit
1848 the frags/bytes it assembles. */
1849
1850 void
1851 md_assemble (char *str)
1852 {
1853 char *op_start;
1854 char *op_end;
1855 struct h8_op operand[3];
1856 const struct h8_instruction *instruction;
1857 const struct h8_instruction *prev_instruction;
1858
1859 char *dot = 0;
1860 char *slash = 0;
1861 char c;
1862 int size, i;
1863
1864 /* Drop leading whitespace. */
1865 while (*str == ' ')
1866 str++;
1867
1868 /* Find the op code end. */
1869 for (op_start = op_end = str;
1870 *op_end != 0 && *op_end != ' ';
1871 op_end++)
1872 {
1873 if (*op_end == '.')
1874 {
1875 dot = op_end + 1;
1876 *op_end = 0;
1877 op_end += 2;
1878 break;
1879 }
1880 else if (*op_end == '/' && ! slash)
1881 slash = op_end;
1882 }
1883
1884 if (op_end == op_start)
1885 {
1886 as_bad (_("can't find opcode "));
1887 }
1888 c = *op_end;
1889
1890 *op_end = 0;
1891
1892 /* The assembler stops scanning the opcode at slashes, so it fails
1893 to make characters following them lower case. Fix them. */
1894 if (slash)
1895 while (*++slash)
1896 *slash = TOLOWER (*slash);
1897
1898 instruction = (const struct h8_instruction *)
1899 hash_find (opcode_hash_control, op_start);
1900
1901 if (instruction == NULL)
1902 {
1903 as_bad (_("unknown opcode"));
1904 return;
1905 }
1906
1907 /* We used to set input_line_pointer to the result of get_operands,
1908 but that is wrong. Our caller assumes we don't change it. */
1909
1910 operand[0].mode = 0;
1911 operand[1].mode = 0;
1912 operand[2].mode = 0;
1913
1914 if (OP_KIND (instruction->opcode->how) == O_MOVAB
1915 || OP_KIND (instruction->opcode->how) == O_MOVAW
1916 || OP_KIND (instruction->opcode->how) == O_MOVAL)
1917 get_mova_operands (op_end, operand);
1918 else if (OP_KIND (instruction->opcode->how) == O_RTEL
1919 || OP_KIND (instruction->opcode->how) == O_RTSL)
1920 get_rtsl_operands (op_end, operand);
1921 else
1922 get_operands (instruction->noperands, op_end, operand);
1923
1924 *op_end = c;
1925 prev_instruction = instruction;
1926
1927 /* Now we have operands from instruction.
1928 Let's check them out for ldm and stm. */
1929 if (OP_KIND (instruction->opcode->how) == O_LDM)
1930 {
1931 /* The first operand must be @er7+, and the
1932 second operand must be a register pair. */
1933 if ((operand[0].mode != RSINC)
1934 || (operand[0].reg != 7)
1935 || ((operand[1].reg & 0x80000000) == 0))
1936 as_bad (_("invalid operand in ldm"));
1937 }
1938 else if (OP_KIND (instruction->opcode->how) == O_STM)
1939 {
1940 /* The first operand must be a register pair,
1941 and the second operand must be @-er7. */
1942 if (((operand[0].reg & 0x80000000) == 0)
1943 || (operand[1].mode != RDDEC)
1944 || (operand[1].reg != 7))
1945 as_bad (_("invalid operand in stm"));
1946 }
1947
1948 size = SN;
1949 if (dot)
1950 {
1951 switch (TOLOWER (*dot))
1952 {
1953 case 'b':
1954 size = SB;
1955 break;
1956
1957 case 'w':
1958 size = SW;
1959 break;
1960
1961 case 'l':
1962 size = SL;
1963 break;
1964 }
1965 }
1966 if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
1967 OP_KIND (instruction->opcode->how) == O_MOVAW ||
1968 OP_KIND (instruction->opcode->how) == O_MOVAL)
1969 {
1970 switch (operand[0].mode & MODE)
1971 {
1972 case INDEXB:
1973 default:
1974 fix_operand_size (&operand[1], 1);
1975 break;
1976 case INDEXW:
1977 fix_operand_size (&operand[1], 2);
1978 break;
1979 case INDEXL:
1980 fix_operand_size (&operand[1], 4);
1981 break;
1982 }
1983 }
1984 else
1985 {
1986 for (i = 0; i < 3 && operand[i].mode != 0; i++)
1987 switch (size)
1988 {
1989 case SN:
1990 case SB:
1991 default:
1992 fix_operand_size (&operand[i], 1);
1993 break;
1994 case SW:
1995 fix_operand_size (&operand[i], 2);
1996 break;
1997 case SL:
1998 fix_operand_size (&operand[i], 4);
1999 break;
2000 }
2001 }
2002
2003 instruction = get_specific (instruction, operand, size);
2004
2005 if (instruction == 0)
2006 {
2007 /* Couldn't find an opcode which matched the operands. */
2008 char *where = frag_more (2);
2009
2010 where[0] = 0x0;
2011 where[1] = 0x0;
2012 clever_message (prev_instruction, operand);
2013
2014 return;
2015 }
2016
2017 build_bytes (instruction, operand);
2018
2019 #ifdef BFD_ASSEMBLER
2020 dwarf2_emit_insn (instruction->length);
2021 #endif
2022 }
2023
2024 #ifndef BFD_ASSEMBLER
2025 void
2026 tc_crawl_symbol_chain (object_headers *headers ATTRIBUTE_UNUSED)
2027 {
2028 printf (_("call to tc_crawl_symbol_chain \n"));
2029 }
2030 #endif
2031
2032 symbolS *
2033 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2034 {
2035 return 0;
2036 }
2037
2038 #ifndef BFD_ASSEMBLER
2039 void
2040 tc_headers_hook (object_headers *headers ATTRIBUTE_UNUSED)
2041 {
2042 printf (_("call to tc_headers_hook \n"));
2043 }
2044 #endif
2045
2046 /* Various routines to kill one day */
2047 /* Equal to MAX_PRECISION in atof-ieee.c */
2048 #define MAX_LITTLENUMS 6
2049
2050 /* Turn a string in input_line_pointer into a floating point constant
2051 of type TYPE, and store the appropriate bytes in *LITP. The number
2052 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2053 returned, or NULL on OK. */
2054
2055 char *
2056 md_atof (int type, char *litP, int *sizeP)
2057 {
2058 int prec;
2059 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2060 LITTLENUM_TYPE *wordP;
2061 char *t;
2062
2063 switch (type)
2064 {
2065 case 'f':
2066 case 'F':
2067 case 's':
2068 case 'S':
2069 prec = 2;
2070 break;
2071
2072 case 'd':
2073 case 'D':
2074 case 'r':
2075 case 'R':
2076 prec = 4;
2077 break;
2078
2079 case 'x':
2080 case 'X':
2081 prec = 6;
2082 break;
2083
2084 case 'p':
2085 case 'P':
2086 prec = 6;
2087 break;
2088
2089 default:
2090 *sizeP = 0;
2091 return _("Bad call to MD_ATOF()");
2092 }
2093 t = atof_ieee (input_line_pointer, type, words);
2094 if (t)
2095 input_line_pointer = t;
2096
2097 *sizeP = prec * sizeof (LITTLENUM_TYPE);
2098 for (wordP = words; prec--;)
2099 {
2100 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
2101 litP += sizeof (LITTLENUM_TYPE);
2102 }
2103 return 0;
2104 }
2105 \f
2106 const char *md_shortopts = "";
2107 struct option md_longopts[] = {
2108 {NULL, no_argument, NULL, 0}
2109 };
2110
2111 size_t md_longopts_size = sizeof (md_longopts);
2112
2113 int
2114 md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
2115 {
2116 return 0;
2117 }
2118
2119 void
2120 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
2121 {
2122 }
2123 \f
2124 void tc_aout_fix_to_chars (void);
2125
2126 void
2127 tc_aout_fix_to_chars (void)
2128 {
2129 printf (_("call to tc_aout_fix_to_chars \n"));
2130 abort ();
2131 }
2132
2133 void
2134 md_convert_frag (
2135 #ifdef BFD_ASSEMBLER
2136 bfd *headers ATTRIBUTE_UNUSED,
2137 #else
2138 object_headers *headers ATTRIBUTE_UNUSED,
2139 #endif
2140 segT seg ATTRIBUTE_UNUSED,
2141 fragS *fragP ATTRIBUTE_UNUSED)
2142 {
2143 printf (_("call to md_convert_frag \n"));
2144 abort ();
2145 }
2146
2147 #ifdef BFD_ASSEMBLER
2148 valueT
2149 md_section_align (segT segment, valueT size)
2150 {
2151 int align = bfd_get_section_alignment (stdoutput, segment);
2152 return ((size + (1 << align) - 1) & (-1 << align));
2153 }
2154 #else
2155 valueT
2156 md_section_align (segT seg, valueT size)
2157 {
2158 return ((size + (1 << section_alignment[(int) seg]) - 1)
2159 & (-1 << section_alignment[(int) seg]));
2160 }
2161 #endif
2162
2163
2164 void
2165 md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2166 {
2167 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2168 long val = *valP;
2169
2170 switch (fixP->fx_size)
2171 {
2172 case 1:
2173 *buf++ = val;
2174 break;
2175 case 2:
2176 *buf++ = (val >> 8);
2177 *buf++ = val;
2178 break;
2179 case 4:
2180 *buf++ = (val >> 24);
2181 *buf++ = (val >> 16);
2182 *buf++ = (val >> 8);
2183 *buf++ = val;
2184 break;
2185 default:
2186 abort ();
2187 }
2188
2189 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2190 fixP->fx_done = 1;
2191 }
2192
2193 int
2194 md_estimate_size_before_relax (register fragS *fragP ATTRIBUTE_UNUSED,
2195 register segT segment_type ATTRIBUTE_UNUSED)
2196 {
2197 printf (_("call tomd_estimate_size_before_relax \n"));
2198 abort ();
2199 }
2200
2201 /* Put number into target byte order. */
2202 void
2203 md_number_to_chars (char *ptr, valueT use, int nbytes)
2204 {
2205 number_to_chars_bigendian (ptr, use, nbytes);
2206 }
2207
2208 long
2209 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2210 {
2211 abort ();
2212 }
2213
2214 #ifndef BFD_ASSEMBLER
2215 void
2216 tc_reloc_mangle (fixS *fix_ptr, struct internal_reloc *intr, bfd_vma base)
2217 {
2218 symbolS *symbol_ptr;
2219
2220 symbol_ptr = fix_ptr->fx_addsy;
2221
2222 /* If this relocation is attached to a symbol then it's ok
2223 to output it. */
2224 if (fix_ptr->fx_r_type == TC_CONS_RELOC)
2225 {
2226 /* cons likes to create reloc32's whatever the size of the reloc..
2227 */
2228 switch (fix_ptr->fx_size)
2229 {
2230 case 4:
2231 intr->r_type = R_RELLONG;
2232 break;
2233 case 2:
2234 intr->r_type = R_RELWORD;
2235 break;
2236 case 1:
2237 intr->r_type = R_RELBYTE;
2238 break;
2239 default:
2240 abort ();
2241 }
2242 }
2243 else
2244 {
2245 intr->r_type = fix_ptr->fx_r_type;
2246 }
2247
2248 intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
2249 intr->r_offset = fix_ptr->fx_offset;
2250
2251 if (symbol_ptr)
2252 {
2253 if (symbol_ptr->sy_number != -1)
2254 intr->r_symndx = symbol_ptr->sy_number;
2255 else
2256 {
2257 symbolS *segsym;
2258
2259 /* This case arises when a reference is made to `.'. */
2260 segsym = seg_info (S_GET_SEGMENT (symbol_ptr))->dot;
2261 if (segsym == NULL)
2262 intr->r_symndx = -1;
2263 else
2264 {
2265 intr->r_symndx = segsym->sy_number;
2266 intr->r_offset += S_GET_VALUE (symbol_ptr);
2267 }
2268 }
2269 }
2270 else
2271 intr->r_symndx = -1;
2272 }
2273 #else /* BFD_ASSEMBLER */
2274 arelent *
2275 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2276 {
2277 arelent *rel;
2278 bfd_reloc_code_real_type r_type;
2279
2280 if (fixp->fx_addsy && fixp->fx_subsy)
2281 {
2282 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2283 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2284 {
2285 as_bad_where (fixp->fx_file, fixp->fx_line,
2286 "Difference of symbols in different sections is not supported");
2287 return NULL;
2288 }
2289 }
2290
2291 rel = (arelent *) xmalloc (sizeof (arelent));
2292 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2293 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2294 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2295 rel->addend = fixp->fx_offset;
2296
2297 r_type = fixp->fx_r_type;
2298
2299 #define DEBUG 0
2300 #if DEBUG
2301 fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2302 fflush(stderr);
2303 #endif
2304 rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2305 if (rel->howto == NULL)
2306 {
2307 as_bad_where (fixp->fx_file, fixp->fx_line,
2308 _("Cannot represent relocation type %s"),
2309 bfd_get_reloc_code_name (r_type));
2310 return NULL;
2311 }
2312
2313 return rel;
2314 }
2315 #endif
This page took 0.075686 seconds and 5 git commands to generate.