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