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