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