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