3906b627362af3eb1126bedbb9c986321d7a50a3
[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 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 return;
977 }
978
979 static void
980 get_rtsl_operands (char *ptr, struct h8_op *operand)
981 {
982 int mode, num, num2, len, type = 0;
983
984 ptr++;
985 if (*ptr == '(')
986 {
987 ptr++;
988 type = 1;
989 }
990 len = parse_reg (ptr, &mode, &num, SRC);
991 if (len == 0 || (mode & MODE) != REG)
992 {
993 as_bad (_("expected register"));
994 return;
995 }
996 ptr += len;
997 if (*ptr == '-')
998 {
999 len = parse_reg (++ptr, &mode, &num2, SRC);
1000 if (len == 0 || (mode & MODE) != REG)
1001 {
1002 as_bad (_("expected register"));
1003 return;
1004 }
1005 ptr += len;
1006 /* CONST_xxx are used as placeholders in the opcode table. */
1007 num = num2 - num;
1008 if (num < 0 || num > 3)
1009 {
1010 as_bad (_("invalid register list"));
1011 return;
1012 }
1013 }
1014 else
1015 num2 = num, num = 0;
1016 if (type == 1 && *ptr++ != ')')
1017 {
1018 as_bad (_("expected closing paren"));
1019 return;
1020 }
1021 operand[0].mode = RS32;
1022 operand[1].mode = RD32;
1023 operand[0].reg = num;
1024 operand[1].reg = num2;
1025 }
1026
1027 /* Passed a pointer to a list of opcodes which use different
1028 addressing modes, return the opcode which matches the opcodes
1029 provided. */
1030
1031 static const struct h8_instruction *
1032 get_specific (const struct h8_instruction *instruction,
1033 struct h8_op *operands, int size)
1034 {
1035 const struct h8_instruction *this_try = instruction;
1036 const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1037 int found = 0;
1038 int this_index = instruction->idx;
1039 int noperands = 0;
1040
1041 /* There's only one ldm/stm and it's easier to just
1042 get out quick for them. */
1043 if (OP_KIND (instruction->opcode->how) == O_LDM
1044 || OP_KIND (instruction->opcode->how) == O_STM)
1045 return this_try;
1046
1047 while (noperands < 3 && operands[noperands].mode != 0)
1048 noperands++;
1049
1050 while (this_index == instruction->idx && !found)
1051 {
1052 int this_size;
1053
1054 found = 1;
1055 this_try = instruction++;
1056 this_size = this_try->opcode->how & SN;
1057
1058 if (this_try->noperands != noperands)
1059 found = 0;
1060 else if (this_try->noperands > 0)
1061 {
1062 int i;
1063
1064 for (i = 0; i < this_try->noperands && found; i++)
1065 {
1066 op_type op = this_try->opcode->args.nib[i];
1067 int op_mode = op & MODE;
1068 int op_size = op & SIZE;
1069 int x = operands[i].mode;
1070 int x_mode = x & MODE;
1071 int x_size = x & SIZE;
1072
1073 if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1074 {
1075 if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1076 || (x_size == L_16 && (operands[i].reg & 8) == 8))
1077 as_warn (_("can't use high part of register in operand %d"), i);
1078
1079 if (x_size != op_size)
1080 found = 0;
1081 }
1082 else if (op_mode == REG)
1083 {
1084 if (x_mode == LOWREG)
1085 x_mode = REG;
1086 if (x_mode != REG)
1087 found = 0;
1088
1089 if (x_size == L_P)
1090 x_size = (Hmode ? L_32 : L_16);
1091 if (op_size == L_P)
1092 op_size = (Hmode ? L_32 : L_16);
1093
1094 /* The size of the reg is v important. */
1095 if (op_size != x_size)
1096 found = 0;
1097 }
1098 else if (op_mode & CTRL) /* control register */
1099 {
1100 if (!(x_mode & CTRL))
1101 found = 0;
1102
1103 switch (x_mode)
1104 {
1105 case CCR:
1106 if (op_mode != CCR &&
1107 op_mode != CCR_EXR &&
1108 op_mode != CC_EX_VB_SB)
1109 found = 0;
1110 break;
1111 case EXR:
1112 if (op_mode != EXR &&
1113 op_mode != CCR_EXR &&
1114 op_mode != CC_EX_VB_SB)
1115 found = 0;
1116 break;
1117 case MACH:
1118 if (op_mode != MACH &&
1119 op_mode != MACREG)
1120 found = 0;
1121 break;
1122 case MACL:
1123 if (op_mode != MACL &&
1124 op_mode != MACREG)
1125 found = 0;
1126 break;
1127 case VBR:
1128 if (op_mode != VBR &&
1129 op_mode != VBR_SBR &&
1130 op_mode != CC_EX_VB_SB)
1131 found = 0;
1132 break;
1133 case SBR:
1134 if (op_mode != SBR &&
1135 op_mode != VBR_SBR &&
1136 op_mode != CC_EX_VB_SB)
1137 found = 0;
1138 break;
1139 }
1140 }
1141 else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1142 {
1143 operands[i].mode &= ~MODE;
1144 operands[i].mode |= ABSJMP;
1145 /* But it may not be 24 bits long. */
1146 if (x_mode == ABS && !Hmode)
1147 {
1148 operands[i].mode &= ~SIZE;
1149 operands[i].mode |= L_16;
1150 }
1151 if ((operands[i].mode & SIZE) == L_32
1152 && (op_mode & SIZE) != L_32)
1153 found = 0;
1154 }
1155 else if (x_mode == IMM && op_mode != IMM)
1156 {
1157 offsetT num = operands[i].exp.X_add_number;
1158 if (op_mode == KBIT || op_mode == DBIT)
1159 /* This is ok if the immediate value is sensible. */;
1160 else if (op_mode == CONST_2)
1161 found = num == 2;
1162 else if (op_mode == CONST_4)
1163 found = num == 4;
1164 else if (op_mode == CONST_8)
1165 found = num == 8;
1166 else if (op_mode == CONST_16)
1167 found = num == 16;
1168 else
1169 found = 0;
1170 }
1171 else if (op_mode == PCREL && op_mode == x_mode)
1172 {
1173 /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1174 If x_size is L_8, promote it. */
1175 if (OP_KIND (this_try->opcode->how) == O_MOVSD
1176 || OP_KIND (this_try->opcode->how) == O_BSRBC
1177 || OP_KIND (this_try->opcode->how) == O_BSRBS)
1178 if (x_size == L_8)
1179 x_size = L_16;
1180
1181 /* The size of the displacement is important. */
1182 if (op_size != x_size)
1183 found = 0;
1184 }
1185 else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1186 || op_mode == INDEXB || op_mode == INDEXW
1187 || op_mode == INDEXL)
1188 && op_mode == x_mode)
1189 {
1190 /* Promote a L_24 to L_32 if it makes us match. */
1191 if (x_size == L_24 && op_size == L_32)
1192 {
1193 x &= ~SIZE;
1194 x |= x_size = L_32;
1195 }
1196
1197 #if 0 /* ??? */
1198 /* Promote an L8 to L_16 if it makes us match. */
1199 if ((op_mode == ABS || op_mode == DISP) && x_size == L_8)
1200 {
1201 if (op_size == L_16)
1202 x_size = L_16;
1203 }
1204 #endif
1205
1206 if (((x_size == L_16 && op_size == L_16U)
1207 || (x_size == L_8 && op_size == L_8U)
1208 || (x_size == L_3 && op_size == L_3NZ))
1209 /* We're deliberately more permissive for ABS modes. */
1210 && (op_mode == ABS
1211 || constant_fits_size_p (operands + i, op_size,
1212 op & NO_SYMBOLS)))
1213 x_size = op_size;
1214
1215 if (x_size != 0 && op_size != x_size)
1216 found = 0;
1217 else if (x_size == 0
1218 && ! constant_fits_size_p (operands + i, op_size,
1219 op & NO_SYMBOLS))
1220 found = 0;
1221 }
1222 else if (op_mode != x_mode)
1223 {
1224 found = 0;
1225 }
1226 }
1227 }
1228 if (found)
1229 {
1230 if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1231 || (this_try->opcode->available == AV_H8S && ! Smode)
1232 || (this_try->opcode->available == AV_H8H && ! Hmode))
1233 found = 0, found_other = this_try;
1234 else if (this_size != size && (this_size != SN && size != SN))
1235 found_mismatched = this_try, found = 0;
1236
1237 }
1238 }
1239 if (found)
1240 return this_try;
1241 if (found_other)
1242 {
1243 as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1244 found_other->opcode->name,
1245 (! Hmode && ! Smode ? "H8/300"
1246 : SXmode ? "H8sx"
1247 : Smode ? "H8/300S"
1248 : "H8/300H"));
1249 }
1250 else if (found_mismatched)
1251 {
1252 as_warn (_("mismatch between opcode size and operand size"));
1253 return found_mismatched;
1254 }
1255 return 0;
1256 }
1257
1258 static void
1259 check_operand (struct h8_op *operand, unsigned int width, char *string)
1260 {
1261 if (operand->exp.X_add_symbol == 0
1262 && operand->exp.X_op_symbol == 0)
1263 {
1264 /* No symbol involved, let's look at offset, it's dangerous if
1265 any of the high bits are not 0 or ff's, find out by oring or
1266 anding with the width and seeing if the answer is 0 or all
1267 fs. */
1268
1269 if (! constant_fits_width_p (operand, width))
1270 {
1271 if (width == 255
1272 && (operand->exp.X_add_number & 0xff00) == 0xff00)
1273 {
1274 /* Just ignore this one - which happens when trying to
1275 fit a 16 bit address truncated into an 8 bit address
1276 of something like bset. */
1277 }
1278 else if (strcmp (string, "@") == 0
1279 && width == 0xffff
1280 && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1281 {
1282 /* Just ignore this one - which happens when trying to
1283 fit a 24 bit address truncated into a 16 bit address
1284 of something like mov.w. */
1285 }
1286 else
1287 {
1288 as_warn (_("operand %s0x%lx out of range."), string,
1289 (unsigned long) operand->exp.X_add_number);
1290 }
1291 }
1292 }
1293 }
1294
1295 /* RELAXMODE has one of 3 values:
1296
1297 0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1298
1299 1 Output a relaxable 24bit absolute mov.w address relocation
1300 (may relax into a 16bit absolute address).
1301
1302 2 Output a relaxable 16/24 absolute mov.b address relocation
1303 (may relax into an 8bit absolute address). */
1304
1305 static void
1306 do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode)
1307 {
1308 int idx;
1309 int size;
1310 int where;
1311 char *bytes = frag_now->fr_literal + offset;
1312
1313 char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1314
1315 if (operand->exp.X_add_symbol == 0)
1316 {
1317 switch (operand->mode & SIZE)
1318 {
1319 case L_2:
1320 check_operand (operand, 0x3, t);
1321 bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1322 break;
1323 case L_3:
1324 case L_3NZ:
1325 check_operand (operand, 0x7, t);
1326 bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1327 break;
1328 case L_4:
1329 check_operand (operand, 0xF, t);
1330 bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1331 break;
1332 case L_5:
1333 check_operand (operand, 0x1F, t);
1334 bytes[0] |= operand->exp.X_add_number & 31;
1335 break;
1336 case L_8:
1337 case L_8U:
1338 check_operand (operand, 0xff, t);
1339 bytes[0] |= operand->exp.X_add_number;
1340 break;
1341 case L_16:
1342 case L_16U:
1343 check_operand (operand, 0xffff, t);
1344 bytes[0] |= operand->exp.X_add_number >> 8;
1345 bytes[1] |= operand->exp.X_add_number >> 0;
1346 break;
1347 case L_24:
1348 check_operand (operand, 0xffffff, t);
1349 bytes[0] |= operand->exp.X_add_number >> 16;
1350 bytes[1] |= operand->exp.X_add_number >> 8;
1351 bytes[2] |= operand->exp.X_add_number >> 0;
1352 break;
1353
1354 case L_32:
1355 /* This should be done with bfd. */
1356 bytes[0] |= operand->exp.X_add_number >> 24;
1357 bytes[1] |= operand->exp.X_add_number >> 16;
1358 bytes[2] |= operand->exp.X_add_number >> 8;
1359 bytes[3] |= operand->exp.X_add_number >> 0;
1360 if (relaxmode != 0)
1361 {
1362 idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1363 fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1364 }
1365 break;
1366 }
1367 }
1368 else
1369 {
1370 switch (operand->mode & SIZE)
1371 {
1372 case L_24:
1373 case L_32:
1374 size = 4;
1375 where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1376 if (relaxmode == 2)
1377 idx = R_MOV24B1;
1378 else if (relaxmode == 1)
1379 idx = R_MOVL1;
1380 else
1381 idx = R_RELLONG;
1382 break;
1383 default:
1384 as_bad (_("Can't work out size of operand.\n"));
1385 case L_16:
1386 case L_16U:
1387 size = 2;
1388 where = 0;
1389 if (relaxmode == 2)
1390 idx = R_MOV16B1;
1391 else
1392 idx = R_RELWORD;
1393 operand->exp.X_add_number =
1394 ((operand->exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1395 operand->exp.X_add_number |= (bytes[0] << 8) | bytes[1];
1396 break;
1397 case L_8:
1398 size = 1;
1399 where = 0;
1400 idx = R_RELBYTE;
1401 operand->exp.X_add_number =
1402 ((operand->exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1403 operand->exp.X_add_number |= bytes[0];
1404 }
1405
1406 fix_new_exp (frag_now,
1407 offset + where,
1408 size,
1409 &operand->exp,
1410 0,
1411 idx);
1412 }
1413 }
1414
1415 /* Now we know what sort of opcodes it is, let's build the bytes. */
1416
1417 static void
1418 build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
1419 {
1420 int i;
1421 char *output = frag_more (this_try->length);
1422 op_type *nibble_ptr = this_try->opcode->data.nib;
1423 op_type c;
1424 unsigned int nibble_count = 0;
1425 int op_at[3];
1426 int nib = 0;
1427 int movb = 0;
1428 char asnibbles[100];
1429 char *p = asnibbles;
1430 int high, low;
1431
1432 if (!Hmode && this_try->opcode->available != AV_H8)
1433 as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"),
1434 this_try->opcode->name);
1435 else if (!Smode
1436 && this_try->opcode->available != AV_H8
1437 && this_try->opcode->available != AV_H8H)
1438 as_warn (_("Opcode `%s' with these operand types not available in H8/300H mode"),
1439 this_try->opcode->name);
1440 else if (!SXmode
1441 && this_try->opcode->available != AV_H8
1442 && this_try->opcode->available != AV_H8H
1443 && this_try->opcode->available != AV_H8S)
1444 as_warn (_("Opcode `%s' with these operand types not available in H8/300S mode"),
1445 this_try->opcode->name);
1446
1447 while (*nibble_ptr != (op_type) E)
1448 {
1449 int d;
1450
1451 nib = 0;
1452 c = *nibble_ptr++;
1453
1454 d = (c & OP3) == OP3 ? 2 : (c & DST) == DST ? 1 : 0;
1455
1456 if (c < 16)
1457 nib = c;
1458 else
1459 {
1460 int c2 = c & MODE;
1461
1462 if (c2 == REG || c2 == LOWREG
1463 || c2 == IND || c2 == PREINC || c2 == PREDEC
1464 || c2 == POSTINC || c2 == POSTDEC)
1465 {
1466 nib = operand[d].reg;
1467 if (c2 == LOWREG)
1468 nib &= 7;
1469 }
1470
1471 else if (c & CTRL) /* Control reg operand. */
1472 nib = operand[d].reg;
1473
1474 else if ((c & DISPREG) == (DISPREG))
1475 {
1476 nib = operand[d].reg;
1477 }
1478 else if (c2 == ABS)
1479 {
1480 operand[d].mode = c;
1481 op_at[d] = nibble_count;
1482 nib = 0;
1483 }
1484 else if (c2 == IMM || c2 == PCREL || c2 == ABS
1485 || (c & ABSJMP) || c2 == DISP)
1486 {
1487 operand[d].mode = c;
1488 op_at[d] = nibble_count;
1489 nib = 0;
1490 }
1491 else if ((c & IGNORE) || (c & DATA))
1492 nib = 0;
1493
1494 else if (c2 == DBIT)
1495 {
1496 switch (operand[0].exp.X_add_number)
1497 {
1498 case 1:
1499 nib = c;
1500 break;
1501 case 2:
1502 nib = 0x8 | c;
1503 break;
1504 default:
1505 as_bad (_("Need #1 or #2 here"));
1506 }
1507 }
1508 else if (c2 == KBIT)
1509 {
1510 switch (operand[0].exp.X_add_number)
1511 {
1512 case 1:
1513 nib = 0;
1514 break;
1515 case 2:
1516 nib = 8;
1517 break;
1518 case 4:
1519 if (!Hmode)
1520 as_warn (_("#4 not valid on H8/300."));
1521 nib = 9;
1522 break;
1523
1524 default:
1525 as_bad (_("Need #1 or #2 here"));
1526 break;
1527 }
1528 /* Stop it making a fix. */
1529 operand[0].mode = 0;
1530 }
1531
1532 if (c & MEMRELAX)
1533 operand[d].mode |= MEMRELAX;
1534
1535 if (c & B31)
1536 nib |= 0x8;
1537
1538 if (c & B21)
1539 nib |= 0x4;
1540
1541 if (c & B11)
1542 nib |= 0x2;
1543
1544 if (c & B01)
1545 nib |= 0x1;
1546
1547 if (c2 == MACREG)
1548 {
1549 if (operand[0].mode == MACREG)
1550 /* stmac has mac[hl] as the first operand. */
1551 nib = 2 + operand[0].reg;
1552 else
1553 /* ldmac has mac[hl] as the second operand. */
1554 nib = 2 + operand[1].reg;
1555 }
1556 }
1557 nibble_count++;
1558
1559 *p++ = nib;
1560 }
1561
1562 /* Disgusting. Why, oh why didn't someone ask us for advice
1563 on the assembler format. */
1564 if (OP_KIND (this_try->opcode->how) == O_LDM)
1565 {
1566 high = (operand[1].reg >> 8) & 0xf;
1567 low = (operand[1].reg) & 0xf;
1568 asnibbles[2] = high - low;
1569 asnibbles[7] = high;
1570 }
1571 else if (OP_KIND (this_try->opcode->how) == O_STM)
1572 {
1573 high = (operand[0].reg >> 8) & 0xf;
1574 low = (operand[0].reg) & 0xf;
1575 asnibbles[2] = high - low;
1576 asnibbles[7] = low;
1577 }
1578
1579 for (i = 0; i < this_try->length; i++)
1580 output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
1581
1582 /* Note if this is a movb instruction -- there's a special relaxation
1583 which only applies to them. */
1584 if (this_try->opcode->how == O (O_MOV, SB))
1585 movb = 1;
1586
1587 /* Output any fixes. */
1588 for (i = 0; i < this_try->noperands; i++)
1589 {
1590 int x = operand[i].mode;
1591 int x_mode = x & MODE;
1592
1593 if (x_mode == IMM || x_mode == DISP)
1594 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1595 op_at[i] & 1, operand + i, (x & MEMRELAX) != 0);
1596
1597 else if (x_mode == ABS)
1598 do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
1599 op_at[i] & 1, operand + i,
1600 (x & MEMRELAX) ? movb + 1 : 0);
1601
1602 else if (x_mode == PCREL)
1603 {
1604 int size16 = (x & SIZE) == L_16;
1605 int size = size16 ? 2 : 1;
1606 int type = size16 ? R_PCRWORD : R_PCRBYTE;
1607 fixS *fixP;
1608
1609 check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@");
1610
1611 if (operand[i].exp.X_add_number & 1)
1612 as_warn (_("branch operand has odd offset (%lx)\n"),
1613 (unsigned long) operand->exp.X_add_number);
1614 #ifndef OBJ_ELF
1615 /* The COFF port has always been off by one, changing it
1616 now would be an incompatible change, so we leave it as-is.
1617
1618 We don't want to do this for ELF as we want to be
1619 compatible with the proposed ELF format from Hitachi. */
1620 operand[i].exp.X_add_number -= 1;
1621 #endif
1622 if (size16)
1623 {
1624 operand[i].exp.X_add_number =
1625 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1626 }
1627 else
1628 {
1629 operand[i].exp.X_add_number =
1630 ((operand[i].exp.X_add_number & 0xff) ^ 0x80) - 0x80;
1631 }
1632
1633 /* For BRA/S. */
1634 if (! size16)
1635 operand[i].exp.X_add_number |= output[op_at[i] / 2];
1636
1637 fixP = fix_new_exp (frag_now,
1638 output - frag_now->fr_literal + op_at[i] / 2,
1639 size,
1640 &operand[i].exp,
1641 1,
1642 type);
1643 fixP->fx_signed = 1;
1644 }
1645 else if (x_mode == MEMIND)
1646 {
1647 check_operand (operand + i, 0xff, "@@");
1648 fix_new_exp (frag_now,
1649 output - frag_now->fr_literal + 1,
1650 1,
1651 &operand[i].exp,
1652 0,
1653 R_MEM_INDIRECT);
1654 }
1655 else if (x_mode == VECIND)
1656 {
1657 check_operand (operand + i, 0x7f, "@@");
1658 /* FIXME: approximating the effect of "B31" here...
1659 This is very hackish, and ought to be done a better way. */
1660 operand[i].exp.X_add_number |= 0x80;
1661 fix_new_exp (frag_now,
1662 output - frag_now->fr_literal + 1,
1663 1,
1664 &operand[i].exp,
1665 0,
1666 R_MEM_INDIRECT);
1667 }
1668 else if (x & ABSJMP)
1669 {
1670 int where = 0;
1671 bfd_reloc_code_real_type reloc_type = R_JMPL1;
1672
1673 #ifdef OBJ_ELF
1674 /* To be compatible with the proposed H8 ELF format, we
1675 want the relocation's offset to point to the first byte
1676 that will be modified, not to the start of the instruction. */
1677
1678 if ((operand->mode & SIZE) == L_32)
1679 {
1680 where = 2;
1681 reloc_type = R_RELLONG;
1682 }
1683 else
1684 where = 1;
1685 #endif
1686
1687 /* This jmp may be a jump or a branch. */
1688
1689 check_operand (operand + i,
1690 SXmode ? 0xffffffff : Hmode ? 0xffffff : 0xffff,
1691 "@");
1692
1693 if (operand[i].exp.X_add_number & 1)
1694 as_warn (_("branch operand has odd offset (%lx)\n"),
1695 (unsigned long) operand->exp.X_add_number);
1696
1697 if (!Hmode)
1698 operand[i].exp.X_add_number =
1699 ((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1700 fix_new_exp (frag_now,
1701 output - frag_now->fr_literal + where,
1702 4,
1703 &operand[i].exp,
1704 0,
1705 reloc_type);
1706 }
1707 }
1708 }
1709
1710 /* Try to give an intelligent error message for common and simple to
1711 detect errors. */
1712
1713 static void
1714 clever_message (const struct h8_instruction *instruction,
1715 struct h8_op *operand)
1716 {
1717 /* Find out if there was more than one possible opcode. */
1718
1719 if ((instruction + 1)->idx != instruction->idx)
1720 {
1721 int argn;
1722
1723 /* Only one opcode of this flavour, try to guess which operand
1724 didn't match. */
1725 for (argn = 0; argn < instruction->noperands; argn++)
1726 {
1727 switch (instruction->opcode->args.nib[argn])
1728 {
1729 case RD16:
1730 if (operand[argn].mode != RD16)
1731 {
1732 as_bad (_("destination operand must be 16 bit register"));
1733 return;
1734
1735 }
1736 break;
1737
1738 case RS8:
1739 if (operand[argn].mode != RS8)
1740 {
1741 as_bad (_("source operand must be 8 bit register"));
1742 return;
1743 }
1744 break;
1745
1746 case ABS16DST:
1747 if (operand[argn].mode != ABS16DST)
1748 {
1749 as_bad (_("destination operand must be 16bit absolute address"));
1750 return;
1751 }
1752 break;
1753 case RD8:
1754 if (operand[argn].mode != RD8)
1755 {
1756 as_bad (_("destination operand must be 8 bit register"));
1757 return;
1758 }
1759 break;
1760
1761 case ABS16SRC:
1762 if (operand[argn].mode != ABS16SRC)
1763 {
1764 as_bad (_("source operand must be 16bit absolute address"));
1765 return;
1766 }
1767 break;
1768
1769 }
1770 }
1771 }
1772 as_bad (_("invalid operands"));
1773 }
1774
1775
1776 /* If OPERAND is part of an address, adjust its size and value given
1777 that it addresses SIZE bytes.
1778
1779 This function decides how big non-immediate constants are when no
1780 size was explicitly given. It also scales down the assembly-level
1781 displacement in an @(d:2,ERn) operand. */
1782
1783 static void
1784 fix_operand_size (struct h8_op *operand, int size)
1785 {
1786 if (SXmode && (operand->mode & MODE) == DISP)
1787 {
1788 /* If the user didn't specify an operand width, see if we
1789 can use @(d:2,ERn). */
1790 if ((operand->mode & SIZE) == 0
1791 && operand->exp.X_add_symbol == 0
1792 && operand->exp.X_op_symbol == 0
1793 && (operand->exp.X_add_number == size
1794 || operand->exp.X_add_number == size * 2
1795 || operand->exp.X_add_number == size * 3))
1796 operand->mode |= L_2;
1797
1798 /* Scale down the displacement in an @(d:2,ERn) operand.
1799 X_add_number then contains the desired field value. */
1800 if ((operand->mode & SIZE) == L_2)
1801 {
1802 if (operand->exp.X_add_number % size != 0)
1803 as_warn (_("operand/size mis-match"));
1804 operand->exp.X_add_number /= size;
1805 }
1806 }
1807
1808 if ((operand->mode & SIZE) == 0)
1809 switch (operand->mode & MODE)
1810 {
1811 case DISP:
1812 case INDEXB:
1813 case INDEXW:
1814 case INDEXL:
1815 case ABS:
1816 /* Pick a 24-bit address unless we know that a 16-bit address
1817 is safe. get_specific() will relax L_24 into L_32 where
1818 necessary. */
1819 if (Hmode
1820 && !Nmode
1821 && (operand->exp.X_add_number < -32768
1822 || operand->exp.X_add_number > 32767
1823 || operand->exp.X_add_symbol != 0
1824 || operand->exp.X_op_symbol != 0))
1825 operand->mode |= L_24;
1826 else
1827 operand->mode |= L_16;
1828 break;
1829
1830 case PCREL:
1831 /* This condition is long standing, though somewhat suspect. */
1832 if (operand->exp.X_add_number > -128
1833 && operand->exp.X_add_number < 127)
1834 operand->mode |= L_8;
1835 else
1836 operand->mode |= L_16;
1837 break;
1838 }
1839 }
1840
1841
1842 /* This is the guts of the machine-dependent assembler. STR points to
1843 a machine dependent instruction. This function is supposed to emit
1844 the frags/bytes it assembles. */
1845
1846 void
1847 md_assemble (char *str)
1848 {
1849 char *op_start;
1850 char *op_end;
1851 struct h8_op operand[3];
1852 const struct h8_instruction *instruction;
1853 const struct h8_instruction *prev_instruction;
1854
1855 char *dot = 0;
1856 char *slash = 0;
1857 char c;
1858 int size, i;
1859
1860 /* Drop leading whitespace. */
1861 while (*str == ' ')
1862 str++;
1863
1864 /* Find the op code end. */
1865 for (op_start = op_end = str;
1866 *op_end != 0 && *op_end != ' ';
1867 op_end++)
1868 {
1869 if (*op_end == '.')
1870 {
1871 dot = op_end + 1;
1872 *op_end = 0;
1873 op_end += 2;
1874 break;
1875 }
1876 else if (*op_end == '/' && ! slash)
1877 slash = op_end;
1878 }
1879
1880 if (op_end == op_start)
1881 {
1882 as_bad (_("can't find opcode "));
1883 }
1884 c = *op_end;
1885
1886 *op_end = 0;
1887
1888 /* The assembler stops scanning the opcode at slashes, so it fails
1889 to make characters following them lower case. Fix them. */
1890 if (slash)
1891 while (*++slash)
1892 *slash = TOLOWER (*slash);
1893
1894 instruction = (const struct h8_instruction *)
1895 hash_find (opcode_hash_control, op_start);
1896
1897 if (instruction == NULL)
1898 {
1899 as_bad (_("unknown opcode"));
1900 return;
1901 }
1902
1903 /* We used to set input_line_pointer to the result of get_operands,
1904 but that is wrong. Our caller assumes we don't change it. */
1905
1906 operand[0].mode = 0;
1907 operand[1].mode = 0;
1908 operand[2].mode = 0;
1909
1910 if (OP_KIND (instruction->opcode->how) == O_MOVAB
1911 || OP_KIND (instruction->opcode->how) == O_MOVAW
1912 || OP_KIND (instruction->opcode->how) == O_MOVAL)
1913 get_mova_operands (op_end, operand);
1914 else if (OP_KIND (instruction->opcode->how) == O_RTEL
1915 || OP_KIND (instruction->opcode->how) == O_RTSL)
1916 get_rtsl_operands (op_end, operand);
1917 else
1918 get_operands (instruction->noperands, op_end, operand);
1919
1920 *op_end = c;
1921 prev_instruction = instruction;
1922
1923 /* Now we have operands from instruction.
1924 Let's check them out for ldm and stm. */
1925 if (OP_KIND (instruction->opcode->how) == O_LDM)
1926 {
1927 /* The first operand must be @er7+, and the
1928 second operand must be a register pair. */
1929 if ((operand[0].mode != RSINC)
1930 || (operand[0].reg != 7)
1931 || ((operand[1].reg & 0x80000000) == 0))
1932 as_bad (_("invalid operand in ldm"));
1933 }
1934 else if (OP_KIND (instruction->opcode->how) == O_STM)
1935 {
1936 /* The first operand must be a register pair,
1937 and the second operand must be @-er7. */
1938 if (((operand[0].reg & 0x80000000) == 0)
1939 || (operand[1].mode != RDDEC)
1940 || (operand[1].reg != 7))
1941 as_bad (_("invalid operand in stm"));
1942 }
1943
1944 size = SN;
1945 if (dot)
1946 {
1947 switch (TOLOWER (*dot))
1948 {
1949 case 'b':
1950 size = SB;
1951 break;
1952
1953 case 'w':
1954 size = SW;
1955 break;
1956
1957 case 'l':
1958 size = SL;
1959 break;
1960 }
1961 }
1962 if (OP_KIND (instruction->opcode->how) == O_MOVAB ||
1963 OP_KIND (instruction->opcode->how) == O_MOVAW ||
1964 OP_KIND (instruction->opcode->how) == O_MOVAL)
1965 {
1966 switch (operand[0].mode & MODE)
1967 {
1968 case INDEXB:
1969 default:
1970 fix_operand_size (&operand[1], 1);
1971 break;
1972 case INDEXW:
1973 fix_operand_size (&operand[1], 2);
1974 break;
1975 case INDEXL:
1976 fix_operand_size (&operand[1], 4);
1977 break;
1978 }
1979 }
1980 else
1981 {
1982 for (i = 0; i < 3 && operand[i].mode != 0; i++)
1983 switch (size)
1984 {
1985 case SN:
1986 case SB:
1987 default:
1988 fix_operand_size (&operand[i], 1);
1989 break;
1990 case SW:
1991 fix_operand_size (&operand[i], 2);
1992 break;
1993 case SL:
1994 fix_operand_size (&operand[i], 4);
1995 break;
1996 }
1997 }
1998
1999 instruction = get_specific (instruction, operand, size);
2000
2001 if (instruction == 0)
2002 {
2003 /* Couldn't find an opcode which matched the operands. */
2004 char *where = frag_more (2);
2005
2006 where[0] = 0x0;
2007 where[1] = 0x0;
2008 clever_message (prev_instruction, operand);
2009
2010 return;
2011 }
2012
2013 build_bytes (instruction, operand);
2014
2015 #ifdef BFD_ASSEMBLER
2016 dwarf2_emit_insn (instruction->length);
2017 #endif
2018 }
2019
2020 #ifndef BFD_ASSEMBLER
2021 void
2022 tc_crawl_symbol_chain (object_headers *headers ATTRIBUTE_UNUSED)
2023 {
2024 printf (_("call to tc_crawl_symbol_chain \n"));
2025 }
2026 #endif
2027
2028 symbolS *
2029 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2030 {
2031 return 0;
2032 }
2033
2034 #ifndef BFD_ASSEMBLER
2035 void
2036 tc_headers_hook (object_headers *headers ATTRIBUTE_UNUSED)
2037 {
2038 printf (_("call to tc_headers_hook \n"));
2039 }
2040 #endif
2041
2042 /* Various routines to kill one day */
2043 /* Equal to MAX_PRECISION in atof-ieee.c */
2044 #define MAX_LITTLENUMS 6
2045
2046 /* Turn a string in input_line_pointer into a floating point constant
2047 of type TYPE, and store the appropriate bytes in *LITP. The number
2048 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2049 returned, or NULL on OK. */
2050
2051 char *
2052 md_atof (int type, char *litP, int *sizeP)
2053 {
2054 int prec;
2055 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2056 LITTLENUM_TYPE *wordP;
2057 char *t;
2058
2059 switch (type)
2060 {
2061 case 'f':
2062 case 'F':
2063 case 's':
2064 case 'S':
2065 prec = 2;
2066 break;
2067
2068 case 'd':
2069 case 'D':
2070 case 'r':
2071 case 'R':
2072 prec = 4;
2073 break;
2074
2075 case 'x':
2076 case 'X':
2077 prec = 6;
2078 break;
2079
2080 case 'p':
2081 case 'P':
2082 prec = 6;
2083 break;
2084
2085 default:
2086 *sizeP = 0;
2087 return _("Bad call to MD_ATOF()");
2088 }
2089 t = atof_ieee (input_line_pointer, type, words);
2090 if (t)
2091 input_line_pointer = t;
2092
2093 *sizeP = prec * sizeof (LITTLENUM_TYPE);
2094 for (wordP = words; prec--;)
2095 {
2096 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
2097 litP += sizeof (LITTLENUM_TYPE);
2098 }
2099 return 0;
2100 }
2101 \f
2102 const char *md_shortopts = "";
2103 struct option md_longopts[] = {
2104 {NULL, no_argument, NULL, 0}
2105 };
2106
2107 size_t md_longopts_size = sizeof (md_longopts);
2108
2109 int
2110 md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
2111 {
2112 return 0;
2113 }
2114
2115 void
2116 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
2117 {
2118 }
2119 \f
2120 void tc_aout_fix_to_chars (void);
2121
2122 void
2123 tc_aout_fix_to_chars (void)
2124 {
2125 printf (_("call to tc_aout_fix_to_chars \n"));
2126 abort ();
2127 }
2128
2129 void
2130 md_convert_frag (
2131 #ifdef BFD_ASSEMBLER
2132 bfd *headers ATTRIBUTE_UNUSED,
2133 #else
2134 object_headers *headers ATTRIBUTE_UNUSED,
2135 #endif
2136 segT seg ATTRIBUTE_UNUSED,
2137 fragS *fragP ATTRIBUTE_UNUSED)
2138 {
2139 printf (_("call to md_convert_frag \n"));
2140 abort ();
2141 }
2142
2143 #ifdef BFD_ASSEMBLER
2144 valueT
2145 md_section_align (segT segment, valueT size)
2146 {
2147 int align = bfd_get_section_alignment (stdoutput, segment);
2148 return ((size + (1 << align) - 1) & (-1 << align));
2149 }
2150 #else
2151 valueT
2152 md_section_align (segT seg, valueT size)
2153 {
2154 return ((size + (1 << section_alignment[(int) seg]) - 1)
2155 & (-1 << section_alignment[(int) seg]));
2156 }
2157 #endif
2158
2159
2160 void
2161 md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2162 {
2163 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2164 long val = *valP;
2165
2166 switch (fixP->fx_size)
2167 {
2168 case 1:
2169 *buf++ = val;
2170 break;
2171 case 2:
2172 *buf++ = (val >> 8);
2173 *buf++ = val;
2174 break;
2175 case 4:
2176 *buf++ = (val >> 24);
2177 *buf++ = (val >> 16);
2178 *buf++ = (val >> 8);
2179 *buf++ = val;
2180 break;
2181 default:
2182 abort ();
2183 }
2184
2185 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
2186 fixP->fx_done = 1;
2187 }
2188
2189 int
2190 md_estimate_size_before_relax (register fragS *fragP ATTRIBUTE_UNUSED,
2191 register segT segment_type ATTRIBUTE_UNUSED)
2192 {
2193 printf (_("call tomd_estimate_size_before_relax \n"));
2194 abort ();
2195 }
2196
2197 /* Put number into target byte order. */
2198 void
2199 md_number_to_chars (char *ptr, valueT use, int nbytes)
2200 {
2201 number_to_chars_bigendian (ptr, use, nbytes);
2202 }
2203
2204 long
2205 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
2206 {
2207 abort ();
2208 }
2209
2210 #ifndef BFD_ASSEMBLER
2211 void
2212 tc_reloc_mangle (fixS *fix_ptr, struct internal_reloc *intr, bfd_vma base)
2213 {
2214 symbolS *symbol_ptr;
2215
2216 symbol_ptr = fix_ptr->fx_addsy;
2217
2218 /* If this relocation is attached to a symbol then it's ok
2219 to output it. */
2220 if (fix_ptr->fx_r_type == TC_CONS_RELOC)
2221 {
2222 /* cons likes to create reloc32's whatever the size of the reloc..
2223 */
2224 switch (fix_ptr->fx_size)
2225 {
2226 case 4:
2227 intr->r_type = R_RELLONG;
2228 break;
2229 case 2:
2230 intr->r_type = R_RELWORD;
2231 break;
2232 case 1:
2233 intr->r_type = R_RELBYTE;
2234 break;
2235 default:
2236 abort ();
2237 }
2238 }
2239 else
2240 {
2241 intr->r_type = fix_ptr->fx_r_type;
2242 }
2243
2244 intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
2245 intr->r_offset = fix_ptr->fx_offset;
2246
2247 if (symbol_ptr)
2248 {
2249 if (symbol_ptr->sy_number != -1)
2250 intr->r_symndx = symbol_ptr->sy_number;
2251 else
2252 {
2253 symbolS *segsym;
2254
2255 /* This case arises when a reference is made to `.'. */
2256 segsym = seg_info (S_GET_SEGMENT (symbol_ptr))->dot;
2257 if (segsym == NULL)
2258 intr->r_symndx = -1;
2259 else
2260 {
2261 intr->r_symndx = segsym->sy_number;
2262 intr->r_offset += S_GET_VALUE (symbol_ptr);
2263 }
2264 }
2265 }
2266 else
2267 intr->r_symndx = -1;
2268 }
2269 #else /* BFD_ASSEMBLER */
2270 arelent *
2271 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2272 {
2273 arelent *rel;
2274 bfd_reloc_code_real_type r_type;
2275
2276 if (fixp->fx_addsy && fixp->fx_subsy)
2277 {
2278 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2279 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2280 {
2281 as_bad_where (fixp->fx_file, fixp->fx_line,
2282 "Difference of symbols in different sections is not supported");
2283 return NULL;
2284 }
2285 }
2286
2287 rel = (arelent *) xmalloc (sizeof (arelent));
2288 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2289 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2290 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2291 rel->addend = fixp->fx_offset;
2292
2293 r_type = fixp->fx_r_type;
2294
2295 #define DEBUG 0
2296 #if DEBUG
2297 fprintf (stderr, "%s\n", bfd_get_reloc_code_name (r_type));
2298 fflush(stderr);
2299 #endif
2300 rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
2301 if (rel->howto == NULL)
2302 {
2303 as_bad_where (fixp->fx_file, fixp->fx_line,
2304 _("Cannot represent relocation type %s"),
2305 bfd_get_reloc_code_name (r_type));
2306 return NULL;
2307 }
2308
2309 return rel;
2310 }
2311 #endif