xref: /netbsd-src/external/gpl3/binutils/dist/gas/config/tc-h8300.c (revision 9573673d78c64ea1eac42d7f2e9521be89932ae5)
1 /* tc-h8300.c -- Assemble code for the Renesas H8/300
2    Copyright (C) 1991-2015 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   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 = (struct h8_instruction *)
256     xmalloc (nopcodes * sizeof (struct h8_instruction));
257 
258   pi = h8_instructions;
259   p1 = h8_opcodes;
260   /* We do a minimum amount of sorting on the opcode table; this is to
261      make it easy to describe the mova instructions without unnecessary
262      code duplication.
263      Sorting only takes place inside blocks of instructions of the form
264      X/Y, so for example mova/b, mova/w and mova/l can be intermixed.  */
265   while (p1)
266     {
267       struct h8_opcode *first_skipped = 0;
268       int len, cmplen = 0;
269       char *src = p1->name;
270       char *dst, *buffer;
271 
272       if (p1->name == 0)
273 	break;
274       /* Strip off any . part when inserting the opcode and only enter
275 	 unique codes into the hash table.  */
276       dst = buffer = malloc (strlen (src) + 1);
277       while (*src)
278 	{
279 	  if (*src == '.')
280 	    {
281 	      src++;
282 	      break;
283 	    }
284 	  if (*src == '/')
285 	    cmplen = src - p1->name + 1;
286 	  *dst++ = *src++;
287 	}
288       *dst = 0;
289       len = dst - buffer;
290       if (cmplen == 0)
291 	cmplen = len;
292       hash_insert (opcode_hash_control, buffer, (char *) pi);
293       strcpy (prev_buffer, buffer);
294       idx++;
295 
296       for (p = p1; p->name; p++)
297 	{
298 	  /* A negative TIME is used to indicate that we've added this opcode
299 	     already.  */
300 	  if (p->time == -1)
301 	    continue;
302 	  if (strncmp (p->name, buffer, cmplen) != 0
303 	      || (p->name[cmplen] != '\0' && p->name[cmplen] != '.'
304 		  && p->name[cmplen - 1] != '/'))
305 	    {
306 	      if (first_skipped == 0)
307 		first_skipped = p;
308 	      break;
309 	    }
310 	  if (strncmp (p->name, buffer, len) != 0)
311 	    {
312 	      if (first_skipped == 0)
313 		first_skipped = p;
314 	      continue;
315 	    }
316 
317 	  p->time = -1;
318 	  pi->size = p->name[len] == '.' ? p->name[len + 1] : 0;
319 	  pi->idx = idx;
320 
321 	  /* Find the number of operands.  */
322 	  pi->noperands = 0;
323 	  while (pi->noperands < 3 && p->args.nib[pi->noperands] != (op_type) E)
324 	    pi->noperands++;
325 
326 	  /* Find the length of the opcode in bytes.  */
327 	  pi->length = 0;
328 	  while (p->data.nib[pi->length * 2] != (op_type) E)
329 	    pi->length++;
330 
331 	  pi->opcode = p;
332 	  pi++;
333 	}
334       p1 = first_skipped;
335     }
336 
337   /* Add entry for the NULL vector terminator.  */
338   pi->length = 0;
339   pi->noperands = 0;
340   pi->idx = 0;
341   pi->size = 0;
342   pi->opcode = 0;
343 
344   linkrelax = 1;
345 }
346 
347 struct h8_op
348 {
349   op_type mode;
350   unsigned reg;
351   expressionS exp;
352 };
353 
354 static void clever_message (const struct h8_instruction *, struct h8_op *);
355 static void fix_operand_size (struct h8_op *, int);
356 static void build_bytes (const struct h8_instruction *, struct h8_op *);
357 static void do_a_fix_imm (int, int, struct h8_op *, int, const struct h8_instruction *);
358 static void check_operand (struct h8_op *, unsigned int, char *);
359 static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
360 static char *get_operands (unsigned, char *, struct h8_op *);
361 static void get_operand (char **, struct h8_op *, int);
362 static int parse_reg (char *, op_type *, unsigned *, int);
363 static char *skip_colonthing (char *, int *);
364 static char *parse_exp (char *, struct h8_op *);
365 
366 static int constant_fits_size_p (struct h8_op *, int, int);
367 
368 /*
369   parse operands
370   WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp
371   r0l,r0h,..r7l,r7h
372   @WREG
373   @WREG+
374   @-WREG
375   #const
376   ccr
377 */
378 
379 /* Try to parse a reg name.  Return the number of chars consumed.  */
380 
381 static int
382 parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
383 {
384   char *end;
385   int len;
386 
387   /* Cribbed from get_symbol_name.  */
388   if (!is_name_beginner (*src) || *src == '\001')
389     return 0;
390   end = src + 1;
391   while ((is_part_of_name (*end) && *end != '.') || *end == '\001')
392     end++;
393   len = end - src;
394 
395   if (len == 2 && TOLOWER (src[0]) == 's' && TOLOWER (src[1]) == 'p')
396     {
397       *mode = PSIZE | REG | direction;
398       *reg = 7;
399       return len;
400     }
401   if (len == 3 &&
402       TOLOWER (src[0]) == 'c' &&
403       TOLOWER (src[1]) == 'c' &&
404       TOLOWER (src[2]) == 'r')
405     {
406       *mode = CCR;
407       *reg = 0;
408       return len;
409     }
410   if (len == 3 &&
411       TOLOWER (src[0]) == 'e' &&
412       TOLOWER (src[1]) == 'x' &&
413       TOLOWER (src[2]) == 'r')
414     {
415       *mode = EXR;
416       *reg = 1;
417       return len;
418     }
419   if (len == 3 &&
420       TOLOWER (src[0]) == 'v' &&
421       TOLOWER (src[1]) == 'b' &&
422       TOLOWER (src[2]) == 'r')
423     {
424       *mode = VBR;
425       *reg = 6;
426       return len;
427     }
428   if (len == 3 &&
429       TOLOWER (src[0]) == 's' &&
430       TOLOWER (src[1]) == 'b' &&
431       TOLOWER (src[2]) == 'r')
432     {
433       *mode = SBR;
434       *reg = 7;
435       return len;
436     }
437   if (len == 2 && TOLOWER (src[0]) == 'f' && TOLOWER (src[1]) == 'p')
438     {
439       *mode = PSIZE | REG | direction;
440       *reg = 6;
441       return len;
442     }
443   if (len == 3 && TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
444       src[2] >= '0' && src[2] <= '7')
445     {
446       *mode = L_32 | REG | direction;
447       *reg = src[2] - '0';
448       if (!Hmode)
449 	as_warn (_("Reg not valid for H8/300"));
450       return len;
451     }
452   if (len == 2 && TOLOWER (src[0]) == 'e' && src[1] >= '0' && src[1] <= '7')
453     {
454       *mode = L_16 | REG | direction;
455       *reg = src[1] - '0' + 8;
456       if (!Hmode)
457 	as_warn (_("Reg not valid for H8/300"));
458       return len;
459     }
460 
461   if (TOLOWER (src[0]) == 'r')
462     {
463       if (src[1] >= '0' && src[1] <= '7')
464 	{
465 	  if (len == 3 && TOLOWER (src[2]) == 'l')
466 	    {
467 	      *mode = L_8 | REG | direction;
468 	      *reg = (src[1] - '0') + 8;
469 	      return len;
470 	    }
471 	  if (len == 3 && TOLOWER (src[2]) == 'h')
472 	    {
473 	      *mode = L_8 | REG | direction;
474 	      *reg = (src[1] - '0');
475 	      return len;
476 	    }
477 	  if (len == 2)
478 	    {
479 	      *mode = L_16 | REG | direction;
480 	      *reg = (src[1] - '0');
481 	      return len;
482 	    }
483 	}
484     }
485 
486   return 0;
487 }
488 
489 
490 /* Parse an immediate or address-related constant and store it in OP.
491    If the user also specifies the operand's size, store that size
492    in OP->MODE, otherwise leave it for later code to decide.  */
493 
494 static char *
495 parse_exp (char *src, struct h8_op *op)
496 {
497   char *save;
498 
499   save = input_line_pointer;
500   input_line_pointer = src;
501   expression (&op->exp);
502   if (op->exp.X_op == O_absent)
503     as_bad (_("missing operand"));
504   src = input_line_pointer;
505   input_line_pointer = save;
506 
507   return skip_colonthing (src, &op->mode);
508 }
509 
510 
511 /* If SRC starts with an explicit operand size, skip it and store the size
512    in *MODE.  Leave *MODE unchanged otherwise.  */
513 
514 static char *
515 skip_colonthing (char *src, int *mode)
516 {
517   if (*src == ':')
518     {
519       src++;
520       *mode &= ~SIZE;
521       if (src[0] == '8' && !ISDIGIT (src[1]))
522 	*mode |= L_8;
523       else if (src[0] == '2' && !ISDIGIT (src[1]))
524 	*mode |= L_2;
525       else if (src[0] == '3' && !ISDIGIT (src[1]))
526 	*mode |= L_3;
527       else if (src[0] == '4' && !ISDIGIT (src[1]))
528 	*mode |= L_4;
529       else if (src[0] == '5' && !ISDIGIT (src[1]))
530 	*mode |= L_5;
531       else if (src[0] == '2' && src[1] == '4' && !ISDIGIT (src[2]))
532 	*mode |= L_24;
533       else if (src[0] == '3' && src[1] == '2' && !ISDIGIT (src[2]))
534 	*mode |= L_32;
535       else if (src[0] == '1' && src[1] == '6' && !ISDIGIT (src[2]))
536 	*mode |= L_16;
537       else
538 	as_bad (_("invalid operand size requested"));
539 
540       while (ISDIGIT (*src))
541 	src++;
542     }
543   return src;
544 }
545 
546 /* The many forms of operand:
547 
548    Rn			Register direct
549    @Rn			Register indirect
550    @(exp[:16], Rn)	Register indirect with displacement
551    @Rn+
552    @-Rn
553    @aa:8		absolute 8 bit
554    @aa:16		absolute 16 bit
555    @aa			absolute 16 bit
556 
557    #xx[:size]		immediate data
558    @(exp:[8], pc)	pc rel
559    @@aa[:8]		memory indirect.  */
560 
561 static int
562 constant_fits_width_p (struct h8_op *operand, offsetT width)
563 {
564   offsetT num;
565 
566   num = ((operand->exp.X_add_number & 0xffffffff) ^ 0x80000000) - 0x80000000;
567   return (num & ~width) == 0 || (num | width) == ~0;
568 }
569 
570 static int
571 constant_fits_size_p (struct h8_op *operand, int size, int no_symbols)
572 {
573   offsetT num;
574 
575   if (no_symbols
576       && (operand->exp.X_add_symbol != 0 || operand->exp.X_op_symbol != 0))
577     return 0;
578   num = operand->exp.X_add_number & 0xffffffff;
579   switch (size)
580     {
581     case L_2:
582       return (num & ~3) == 0;
583     case L_3:
584       return (num & ~7) == 0;
585     case L_3NZ:
586       return num >= 1 && num < 8;
587     case L_4:
588       return (num & ~15) == 0;
589     case L_5:
590       return num >= 1 && num < 32;
591     case L_8:
592       num = (num ^ 0x80000000) - 0x80000000;
593       return (num & ~0xFF) == 0 || (num | 0x7F) == ~0;
594     case L_8U:
595       return (num & ~0xFF) == 0;
596     case L_16:
597       num = (num ^ 0x80000000) - 0x80000000;
598       return (num & ~0xFFFF) == 0 || (num | 0x7FFF) == ~0;
599     case L_16U:
600       return (num & ~0xFFFF) == 0;
601     case L_32:
602       return 1;
603     default:
604       abort ();
605     }
606 }
607 
608 static void
609 get_operand (char **ptr, struct h8_op *op, int direction)
610 {
611   char *src = *ptr;
612   op_type mode;
613   unsigned int num;
614   unsigned int len;
615 
616   op->mode = 0;
617 
618   /* Check for '(' and ')' for instructions ldm and stm.  */
619   if (src[0] == '(' && src[8] == ')')
620     ++ src;
621 
622   /* Gross.  Gross.  ldm and stm have a format not easily handled
623      by get_operand.  We deal with it explicitly here.  */
624   if (TOLOWER (src[0]) == 'e' && TOLOWER (src[1]) == 'r' &&
625       ISDIGIT (src[2]) && src[3] == '-' &&
626       TOLOWER (src[4]) == 'e' && TOLOWER (src[5]) == 'r' && ISDIGIT (src[6]))
627     {
628       int low, high;
629 
630       low = src[2] - '0';
631       high = src[6] - '0';
632 
633        /* Check register pair's validity as per tech note TN-H8*-193A/E
634 	  from Renesas for H8S and H8SX hardware manual.  */
635       if (   !(low == 0 && (high == 1 || high == 2 || high == 3))
636           && !(low == 1 && (high == 2 || high == 3 || high == 4) && SXmode)
637           && !(low == 2 && (high == 3 || ((high == 4 || high == 5) && SXmode)))
638           && !(low == 3 && (high == 4 || high == 5 || high == 6) && SXmode)
639           && !(low == 4 && (high == 5 || high == 6))
640           && !(low == 4 && high == 7 && SXmode)
641           && !(low == 5 && (high == 6 || high == 7) && SXmode)
642           && !(low == 6 && high == 7 && SXmode))
643 	as_bad (_("Invalid register list for ldm/stm\n"));
644 
645       /* Even sicker.  We encode two registers into op->reg.  One
646 	 for the low register to save, the other for the high
647 	 register to save;  we also set the high bit in op->reg
648 	 so we know this is "very special".  */
649       op->reg = 0x80000000 | (high << 8) | low;
650       op->mode = REG;
651       if (src[7] == ')')
652 	*ptr = src + 8;
653       else
654 	*ptr = src + 7;
655       return;
656     }
657 
658   len = parse_reg (src, &op->mode, &op->reg, direction);
659   if (len)
660     {
661       src += len;
662       if (*src == '.')
663 	{
664 	  int size = op->mode & SIZE;
665 	  switch (src[1])
666 	    {
667 	    case 'l': case 'L':
668 	      if (size != L_32)
669 		as_warn (_("mismatch between register and suffix"));
670 	      op->mode = (op->mode & ~MODE) | LOWREG;
671 	      break;
672 	    case 'w': case 'W':
673 	      if (size != L_32 && size != L_16)
674 		as_warn (_("mismatch between register and suffix"));
675 	      op->mode = (op->mode & ~MODE) | LOWREG;
676 	      op->mode = (op->mode & ~SIZE) | L_16;
677 	      break;
678 	    case 'b': case 'B':
679 	      op->mode = (op->mode & ~MODE) | LOWREG;
680 	      if (size != L_32 && size != L_8)
681 		as_warn (_("mismatch between register and suffix"));
682 	      op->mode = (op->mode & ~MODE) | LOWREG;
683 	      op->mode = (op->mode & ~SIZE) | L_8;
684 	      break;
685 	    default:
686 	      as_warn (_("invalid suffix after register."));
687 	      break;
688 	    }
689 	  src += 2;
690 	}
691       *ptr = src;
692       return;
693     }
694 
695   if (*src == '@')
696     {
697       src++;
698       if (*src == '@')
699 	{
700 	  *ptr = parse_exp (src + 1, op);
701 	  if (op->exp.X_add_number >= 0x100)
702 	    {
703 	      int divisor = 1;
704 
705 	      op->mode = VECIND;
706 	      /* FIXME : 2?  or 4?  */
707 	      if (op->exp.X_add_number >= 0x400)
708 		as_bad (_("address too high for vector table jmp/jsr"));
709 	      else if (op->exp.X_add_number >= 0x200)
710 		divisor = 4;
711 	      else
712 		divisor = 2;
713 
714 	      op->exp.X_add_number = op->exp.X_add_number / divisor - 0x80;
715 	    }
716 	  else
717 	    op->mode = MEMIND;
718 	  return;
719 	}
720 
721       if (*src == '-' || *src == '+')
722 	{
723 	  len = parse_reg (src + 1, &mode, &num, direction);
724 	  if (len == 0)
725 	    {
726 	      /* Oops, not a reg after all, must be ordinary exp.  */
727 	      op->mode = ABS | direction;
728 	      *ptr = parse_exp (src, op);
729 	      return;
730 	    }
731 
732 	  if (((mode & SIZE) != PSIZE)
733 	      /* For Normal mode accept 16 bit and 32 bit pointer registers.  */
734 	      && (!Nmode || ((mode & SIZE) != L_32)))
735 	    as_bad (_("Wrong size pointer register for architecture."));
736 
737 	  op->mode = src[0] == '-' ? RDPREDEC : RDPREINC;
738 	  op->reg = num;
739 	  *ptr = src + 1 + len;
740 	  return;
741 	}
742       if (*src == '(')
743 	{
744 	  src++;
745 
746 	  /* See if this is @(ERn.x, PC).  */
747 	  len = parse_reg (src, &mode, &op->reg, direction);
748 	  if (len != 0 && (mode & MODE) == REG && src[len] == '.')
749 	    {
750 	      switch (TOLOWER (src[len + 1]))
751 		{
752 		case 'b':
753 		  mode = PCIDXB | direction;
754 		  break;
755 		case 'w':
756 		  mode = PCIDXW | direction;
757 		  break;
758 		case 'l':
759 		  mode = PCIDXL | direction;
760 		  break;
761 		default:
762 		  mode = 0;
763 		  break;
764 		}
765 	      if (mode
766 		  && src[len + 2] == ','
767 		  && TOLOWER (src[len + 3]) != 'p'
768 		  && TOLOWER (src[len + 4]) != 'c'
769 		  && src[len + 5] != ')')
770 		{
771 		  *ptr = src + len + 6;
772 		  op->mode |= mode;
773 		  return;
774 		}
775 	      /* Fall through into disp case - the grammar is somewhat
776 		 ambiguous, so we should try whether it's a DISP operand
777 		 after all ("ER3.L" might be a poorly named label...).  */
778 	    }
779 
780 	  /* Disp.  */
781 
782 	  /* Start off assuming a 16 bit offset.  */
783 
784 	  src = parse_exp (src, op);
785 	  if (*src == ')')
786 	    {
787 	      op->mode |= ABS | direction;
788 	      *ptr = src + 1;
789 	      return;
790 	    }
791 
792 	  if (*src != ',')
793 	    {
794 	      as_bad (_("expected @(exp, reg16)"));
795 	      return;
796 	    }
797 	  src++;
798 
799 	  len = parse_reg (src, &mode, &op->reg, direction);
800 	  if (len == 0 || (mode & MODE) != REG)
801 	    {
802 	      as_bad (_("expected @(exp, reg16)"));
803 	      return;
804 	    }
805 	  src += len;
806 	  if (src[0] == '.')
807 	    {
808 	      switch (TOLOWER (src[1]))
809 		{
810 		case 'b':
811 		  op->mode |= INDEXB | direction;
812 		  break;
813 		case 'w':
814 		  op->mode |= INDEXW | direction;
815 		  break;
816 		case 'l':
817 		  op->mode |= INDEXL | direction;
818 		  break;
819 		default:
820 		  as_bad (_("expected .L, .W or .B for register in indexed addressing mode"));
821 		}
822 	      src += 2;
823 	      op->reg &= 7;
824 	    }
825 	  else
826 	    op->mode |= DISP | direction;
827 	  src = skip_colonthing (src, &op->mode);
828 
829 	  if (*src != ')' && '(')
830 	    {
831 	      as_bad (_("expected @(exp, reg16)"));
832 	      return;
833 	    }
834 	  *ptr = src + 1;
835 	  return;
836 	}
837       len = parse_reg (src, &mode, &num, direction);
838 
839       if (len)
840 	{
841 	  src += len;
842 	  if (*src == '+' || *src == '-')
843 	    {
844 	      if (((mode & SIZE) != PSIZE)
845 		  /* For Normal mode accept 16 bit and 32 bit pointer registers.  */
846 		  && (!Nmode || ((mode & SIZE) != L_32)))
847 		as_bad (_("Wrong size pointer register for architecture."));
848 	      op->mode = *src == '+' ? RSPOSTINC : RSPOSTDEC;
849 	      op->reg = num;
850 	      src++;
851 	      *ptr = src;
852 	      return;
853 	    }
854 	  if (((mode & SIZE) != PSIZE)
855 	      /* For Normal mode accept 16 bit and 32 bit pointer registers.  */
856 	      && (!Nmode || ((mode & SIZE) != L_32)))
857 	    as_bad (_("Wrong size pointer register for architecture."));
858 
859 	  op->mode = direction | IND | PSIZE;
860 	  op->reg = num;
861 	  *ptr = src;
862 
863 	  return;
864 	}
865       else
866 	{
867 	  /* must be a symbol */
868 
869 	  op->mode = ABS | direction;
870 	  *ptr = parse_exp (src, op);
871 	  return;
872 	}
873     }
874 
875   if (*src == '#')
876     {
877       op->mode = IMM;
878       *ptr = parse_exp (src + 1, op);
879       return;
880     }
881   else if (strncmp (src, "mach", 4) == 0 ||
882 	   strncmp (src, "macl", 4) == 0 ||
883 	   strncmp (src, "MACH", 4) == 0 ||
884 	   strncmp (src, "MACL", 4) == 0)
885     {
886       op->reg = TOLOWER (src[3]) == 'l';
887       op->mode = MACREG;
888       *ptr = src + 4;
889       return;
890     }
891   else
892     {
893       op->mode = PCREL;
894       *ptr = parse_exp (src, op);
895     }
896 }
897 
898 static char *
899 get_operands (unsigned int noperands, char *op_end, struct h8_op *operand)
900 {
901   char *ptr = op_end;
902 
903   switch (noperands)
904     {
905     case 0:
906       break;
907 
908     case 1:
909       ptr++;
910       get_operand (&ptr, operand + 0, SRC);
911       if (*ptr == ',')
912 	{
913 	  ptr++;
914 	  get_operand (&ptr, operand + 1, DST);
915 	}
916       break;
917 
918     case 2:
919       ptr++;
920       get_operand (&ptr, operand + 0, SRC);
921       if (*ptr == ',')
922 	ptr++;
923       get_operand (&ptr, operand + 1, DST);
924       break;
925 
926     case 3:
927       ptr++;
928       get_operand (&ptr, operand + 0, SRC);
929       if (*ptr == ',')
930 	ptr++;
931       get_operand (&ptr, operand + 1, DST);
932       if (*ptr == ',')
933 	ptr++;
934       get_operand (&ptr, operand + 2, OP3);
935       break;
936 
937     default:
938       abort ();
939     }
940 
941   return ptr;
942 }
943 
944 /* MOVA has special requirements.  Rather than adding twice the amount of
945    addressing modes, we simply special case it a bit.  */
946 static void
947 get_mova_operands (char *op_end, struct h8_op *operand)
948 {
949   char *ptr = op_end;
950 
951   if (ptr[1] != '@' || ptr[2] != '(')
952     goto error;
953   ptr += 3;
954   operand[0].mode = 0;
955   ptr = parse_exp (ptr, &operand[0]);
956 
957   if (*ptr !=',')
958     goto error;
959   ptr++;
960   get_operand (&ptr, operand + 1, DST);
961 
962   if (*ptr =='.')
963     {
964       ptr++;
965       switch (*ptr++)
966 	{
967 	case 'b': case 'B':
968 	  operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
969 	  break;
970 	case 'w': case 'W':
971 	  operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
972 	  break;
973 	case 'l': case 'L':
974 	  operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
975 	  break;
976 	default:
977 	  goto error;
978 	}
979     }
980   else if ((operand[1].mode & MODE) == LOWREG)
981     {
982       switch (operand[1].mode & SIZE)
983 	{
984 	case L_8:
985 	  operand[0].mode = (operand[0].mode & ~MODE) | INDEXB;
986 	  break;
987 	case L_16:
988 	  operand[0].mode = (operand[0].mode & ~MODE) | INDEXW;
989 	  break;
990 	case L_32:
991 	  operand[0].mode = (operand[0].mode & ~MODE) | INDEXL;
992 	  break;
993 	default:
994 	  goto error;
995 	}
996     }
997   else
998     goto error;
999 
1000   if (*ptr++ != ')' || *ptr++ != ',')
1001     goto error;
1002   get_operand (&ptr, operand + 2, OP3);
1003   /* See if we can use the short form of MOVA.  */
1004   if (((operand[1].mode & MODE) == REG || (operand[1].mode & MODE) == LOWREG)
1005       && (operand[2].mode & MODE) == REG
1006       && (operand[1].reg & 7) == (operand[2].reg & 7))
1007     {
1008       operand[1].mode = operand[2].mode = 0;
1009       operand[0].reg = operand[2].reg & 7;
1010     }
1011   return;
1012 
1013  error:
1014   as_bad (_("expected valid addressing mode for mova: \"@(disp, ea.sz),ERn\""));
1015 }
1016 
1017 static void
1018 get_rtsl_operands (char *ptr, struct h8_op *operand)
1019 {
1020   int mode, len, type = 0;
1021   unsigned int num, num2;
1022 
1023   ptr++;
1024   if (*ptr == '(')
1025     {
1026       ptr++;
1027       type = 1;
1028     }
1029   len = parse_reg (ptr, &mode, &num, SRC);
1030   if (len == 0 || (mode & MODE) != REG)
1031     {
1032       as_bad (_("expected register"));
1033       return;
1034     }
1035   ptr += len;
1036   if (*ptr == '-')
1037     {
1038       len = parse_reg (++ptr, &mode, &num2, SRC);
1039       if (len == 0 || (mode & MODE) != REG)
1040 	{
1041 	  as_bad (_("expected register"));
1042 	  return;
1043 	}
1044       ptr += len;
1045       /* CONST_xxx are used as placeholders in the opcode table.  */
1046       num = num2 - num;
1047       if (num > 3)
1048 	{
1049 	  as_bad (_("invalid register list"));
1050 	  return;
1051 	}
1052     }
1053   else
1054     num2 = num, num = 0;
1055   if (type == 1 && *ptr++ != ')')
1056     {
1057       as_bad (_("expected closing paren"));
1058       return;
1059     }
1060   operand[0].mode = RS32;
1061   operand[1].mode = RD32;
1062   operand[0].reg = num;
1063   operand[1].reg = num2;
1064 }
1065 
1066 /* Passed a pointer to a list of opcodes which use different
1067    addressing modes, return the opcode which matches the opcodes
1068    provided.  */
1069 
1070 static const struct h8_instruction *
1071 get_specific (const struct h8_instruction *instruction,
1072 	      struct h8_op *operands, int size)
1073 {
1074   const struct h8_instruction *this_try = instruction;
1075   const struct h8_instruction *found_other = 0, *found_mismatched = 0;
1076   int found = 0;
1077   int this_index = instruction->idx;
1078   int noperands = 0;
1079 
1080   /* There's only one ldm/stm and it's easier to just
1081      get out quick for them.  */
1082   if (OP_KIND (instruction->opcode->how) == O_LDM
1083       || OP_KIND (instruction->opcode->how) == O_STM)
1084     return this_try;
1085 
1086   while (noperands < 3 && operands[noperands].mode != 0)
1087     noperands++;
1088 
1089   while (this_index == instruction->idx && !found)
1090     {
1091       int this_size;
1092 
1093       found = 1;
1094       this_try = instruction++;
1095       this_size = this_try->opcode->how & SN;
1096 
1097       if (this_try->noperands != noperands)
1098 	found = 0;
1099       else if (this_try->noperands > 0)
1100 	{
1101 	  int i;
1102 
1103 	  for (i = 0; i < this_try->noperands && found; i++)
1104 	    {
1105 	      op_type op = this_try->opcode->args.nib[i];
1106 	      int op_mode = op & MODE;
1107 	      int op_size = op & SIZE;
1108 	      int x = operands[i].mode;
1109 	      int x_mode = x & MODE;
1110 	      int x_size = x & SIZE;
1111 
1112 	      if (op_mode == LOWREG && (x_mode == REG || x_mode == LOWREG))
1113 		{
1114 		  if ((x_size == L_8 && (operands[i].reg & 8) == 0)
1115 		      || (x_size == L_16 && (operands[i].reg & 8) == 8))
1116 		    as_warn (_("can't use high part of register in operand %d"), i);
1117 
1118 		  if (x_size != op_size)
1119 		    found = 0;
1120 		}
1121 	      else if (op_mode == REG)
1122 		{
1123 		  if (x_mode == LOWREG)
1124 		    x_mode = REG;
1125 		  if (x_mode != REG)
1126 		    found = 0;
1127 
1128 		  if (x_size == L_P)
1129 		    x_size = (Hmode ? L_32 : L_16);
1130 		  if (op_size == L_P)
1131 		    op_size = (Hmode ? L_32 : L_16);
1132 
1133 		  /* The size of the reg is v important.  */
1134 		  if (op_size != x_size)
1135 		    found = 0;
1136 		}
1137 	      else if (op_mode & CTRL)	/* control register */
1138 		{
1139 		  if (!(x_mode & CTRL))
1140 		    found = 0;
1141 
1142 		  switch (x_mode)
1143 		    {
1144 		    case CCR:
1145 		      if (op_mode != CCR &&
1146 			  op_mode != CCR_EXR &&
1147 			  op_mode != CC_EX_VB_SB)
1148 			found = 0;
1149 		      break;
1150 		    case EXR:
1151 		      if (op_mode != EXR &&
1152 			  op_mode != CCR_EXR &&
1153 			  op_mode != CC_EX_VB_SB)
1154 			found = 0;
1155 		      break;
1156 		    case MACH:
1157 		      if (op_mode != MACH &&
1158 			  op_mode != MACREG)
1159 			found = 0;
1160 		      break;
1161 		    case MACL:
1162 		      if (op_mode != MACL &&
1163 			  op_mode != MACREG)
1164 			found = 0;
1165 		      break;
1166 		    case VBR:
1167 		      if (op_mode != VBR &&
1168 			  op_mode != VBR_SBR &&
1169 			  op_mode != CC_EX_VB_SB)
1170 			found = 0;
1171 		      break;
1172 		    case SBR:
1173 		      if (op_mode != SBR &&
1174 			  op_mode != VBR_SBR &&
1175 			  op_mode != CC_EX_VB_SB)
1176 			found = 0;
1177 		      break;
1178 		    }
1179 		}
1180 	      else if ((op & ABSJMP) && (x_mode == ABS || x_mode == PCREL))
1181 		{
1182 		  operands[i].mode &= ~MODE;
1183 		  operands[i].mode |= ABSJMP;
1184 		  /* But it may not be 24 bits long.  */
1185 		  if (x_mode == ABS && !Hmode)
1186 		    {
1187 		      operands[i].mode &= ~SIZE;
1188 		      operands[i].mode |= L_16;
1189 		    }
1190 		  if ((operands[i].mode & SIZE) == L_32
1191 		      && (op_mode & SIZE) != L_32)
1192 		   found = 0;
1193 		}
1194 	      else if (x_mode == IMM && op_mode != IMM)
1195 		{
1196 		  offsetT num = operands[i].exp.X_add_number & 0xffffffff;
1197 		  if (op_mode == KBIT || op_mode == DBIT)
1198 		    /* This is ok if the immediate value is sensible.  */;
1199 		  else if (op_mode == CONST_2)
1200 		    found = num == 2;
1201 		  else if (op_mode == CONST_4)
1202 		    found = num == 4;
1203 		  else if (op_mode == CONST_8)
1204 		    found = num == 8;
1205 		  else if (op_mode == CONST_16)
1206 		    found = num == 16;
1207 		  else
1208 		    found = 0;
1209 		}
1210 	      else if (op_mode == PCREL && op_mode == x_mode)
1211 		{
1212 		  /* movsd, bsr/bc and bsr/bs only come in PCREL16 flavour:
1213 		     If x_size is L_8, promote it.  */
1214 		  if (OP_KIND (this_try->opcode->how) == O_MOVSD
1215 		      || OP_KIND (this_try->opcode->how) == O_BSRBC
1216 		      || OP_KIND (this_try->opcode->how) == O_BSRBS)
1217 		    if (x_size == L_8)
1218 		      x_size = L_16;
1219 
1220 		  /* The size of the displacement is important.  */
1221 		  if (op_size != x_size)
1222 		    found = 0;
1223 		}
1224 	      else if ((op_mode == DISP || op_mode == IMM || op_mode == ABS
1225 			|| op_mode == INDEXB || op_mode == INDEXW
1226 			|| op_mode == INDEXL)
1227 		       && op_mode == x_mode)
1228 		{
1229 		  /* Promote a L_24 to L_32 if it makes us match.  */
1230 		  if (x_size == L_24 && op_size == L_32)
1231 		    {
1232 		      x &= ~SIZE;
1233 		      x |= x_size = L_32;
1234 		    }
1235 
1236 		  if (((x_size == L_16 && op_size == L_16U)
1237 		       || (x_size == L_8 && op_size == L_8U)
1238 		       || (x_size == L_3 && op_size == L_3NZ))
1239 		      /* We're deliberately more permissive for ABS modes.  */
1240 		      && (op_mode == ABS
1241 			  || constant_fits_size_p (operands + i, op_size,
1242 						   op & NO_SYMBOLS)))
1243 		    x_size = op_size;
1244 
1245 		  if (x_size != 0 && op_size != x_size)
1246 		    found = 0;
1247 		  else if (x_size == 0
1248 			   && ! constant_fits_size_p (operands + i, op_size,
1249 						      op & NO_SYMBOLS))
1250 		    found = 0;
1251 		}
1252 	      else if (op_mode != x_mode)
1253 		{
1254 		  found = 0;
1255 		}
1256 	    }
1257 	}
1258       if (found)
1259 	{
1260 	  if ((this_try->opcode->available == AV_H8SX && ! SXmode)
1261 	      || (this_try->opcode->available == AV_H8S && ! Smode)
1262 	      || (this_try->opcode->available == AV_H8H && ! Hmode))
1263 	    found = 0, found_other = this_try;
1264 	  else if (this_size != size && (this_size != SN && size != SN))
1265 	    found_mismatched = this_try, found = 0;
1266 
1267 	}
1268     }
1269   if (found)
1270     return this_try;
1271   if (found_other)
1272     {
1273       as_warn (_("Opcode `%s' with these operand types not available in %s mode"),
1274 	       found_other->opcode->name,
1275 	       (! Hmode && ! Smode ? "H8/300"
1276 		: SXmode ? "H8sx"
1277 		: Smode ? "H8/300S"
1278 		: "H8/300H"));
1279     }
1280   else if (found_mismatched)
1281     {
1282       as_warn (_("mismatch between opcode size and operand size"));
1283       return found_mismatched;
1284     }
1285   return 0;
1286 }
1287 
1288 static void
1289 check_operand (struct h8_op *operand, unsigned int width, char *string)
1290 {
1291   if (operand->exp.X_add_symbol == 0
1292       && operand->exp.X_op_symbol == 0)
1293     {
1294       /* No symbol involved, let's look at offset, it's dangerous if
1295 	 any of the high bits are not 0 or ff's, find out by oring or
1296 	 anding with the width and seeing if the answer is 0 or all
1297 	 fs.  */
1298 
1299       if (! constant_fits_width_p (operand, width))
1300 	{
1301 	  if (width == 255
1302 	      && (operand->exp.X_add_number & 0xff00) == 0xff00)
1303 	    {
1304 	      /* Just ignore this one - which happens when trying to
1305 		 fit a 16 bit address truncated into an 8 bit address
1306 		 of something like bset.  */
1307 	    }
1308 	  else if (strcmp (string, "@") == 0
1309 		   && width == 0xffff
1310 		   && (operand->exp.X_add_number & 0xff8000) == 0xff8000)
1311 	    {
1312 	      /* Just ignore this one - which happens when trying to
1313 		 fit a 24 bit address truncated into a 16 bit address
1314 		 of something like mov.w.  */
1315 	    }
1316 	  else
1317 	    {
1318 	      as_warn (_("operand %s0x%lx out of range."), string,
1319 		       (unsigned long) operand->exp.X_add_number);
1320 	    }
1321 	}
1322     }
1323 }
1324 
1325 /* RELAXMODE has one of 3 values:
1326 
1327    0 Output a "normal" reloc, no relaxing possible for this insn/reloc
1328 
1329    1 Output a relaxable 24bit absolute mov.w address relocation
1330      (may relax into a 16bit absolute address).
1331 
1332    2 Output a relaxable 16/24 absolute mov.b address relocation
1333      (may relax into an 8bit absolute address).  */
1334 
1335 static void
1336 do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, const struct h8_instruction *this_try)
1337 {
1338   int idx;
1339   int size;
1340   int where;
1341   char *bytes = frag_now->fr_literal + offset;
1342 
1343   char *t = ((operand->mode & MODE) == IMM) ? "#" : "@";
1344 
1345   if (operand->exp.X_add_symbol == 0)
1346     {
1347       switch (operand->mode & SIZE)
1348 	{
1349 	case L_2:
1350 	  check_operand (operand, 0x3, t);
1351 	  bytes[0] |= (operand->exp.X_add_number & 3) << (nibble ? 0 : 4);
1352 	  break;
1353 	case L_3:
1354 	case L_3NZ:
1355 	  check_operand (operand, 0x7, t);
1356 	  bytes[0] |= (operand->exp.X_add_number & 7) << (nibble ? 0 : 4);
1357 	  break;
1358 	case L_4:
1359 	  check_operand (operand, 0xF, t);
1360 	  bytes[0] |= (operand->exp.X_add_number & 15) << (nibble ? 0 : 4);
1361 	  break;
1362 	case L_5:
1363 	  check_operand (operand, 0x1F, t);
1364 	  bytes[0] |= operand->exp.X_add_number & 31;
1365 	  break;
1366 	case L_8:
1367 	case L_8U:
1368 	  check_operand (operand, 0xff, t);
1369 	  bytes[0] |= operand->exp.X_add_number;
1370 	  break;
1371 	case L_16:
1372 	case L_16U:
1373 	  check_operand (operand, 0xffff, t);
1374 	  bytes[0] |= operand->exp.X_add_number >> 8;
1375 	  bytes[1] |= operand->exp.X_add_number >> 0;
1376 #ifdef OBJ_ELF
1377 	  /* MOVA needs both relocs to relax the second operand properly.  */
1378 	  if (relaxmode != 0
1379 	      && (OP_KIND(this_try->opcode->how) == O_MOVAB
1380 		  || OP_KIND(this_try->opcode->how) == O_MOVAW
1381 		  || OP_KIND(this_try->opcode->how) == O_MOVAL))
1382 	    {
1383 	      idx = BFD_RELOC_16;
1384 	      fix_new_exp (frag_now, offset, 2, &operand->exp, 0, idx);
1385 	    }
1386 #endif
1387 	  break;
1388 	case L_24:
1389 	  check_operand (operand, 0xffffff, t);
1390 	  bytes[0] |= operand->exp.X_add_number >> 16;
1391 	  bytes[1] |= operand->exp.X_add_number >> 8;
1392 	  bytes[2] |= operand->exp.X_add_number >> 0;
1393 	  break;
1394 
1395 	case L_32:
1396 	  /* This should be done with bfd.  */
1397 	  bytes[0] |= operand->exp.X_add_number >> 24;
1398 	  bytes[1] |= operand->exp.X_add_number >> 16;
1399 	  bytes[2] |= operand->exp.X_add_number >> 8;
1400 	  bytes[3] |= operand->exp.X_add_number >> 0;
1401 	  if (relaxmode != 0)
1402 	    {
1403 #ifdef OBJ_ELF
1404 	      if ((operand->mode & MODE) == DISP && relaxmode == 1)
1405 		idx = BFD_RELOC_H8_DISP32A16;
1406 	      else
1407 #endif
1408 		idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
1409 	      fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
1410 	    }
1411 	  break;
1412 	}
1413     }
1414   else
1415     {
1416       switch (operand->mode & SIZE)
1417 	{
1418 	case L_24:
1419 	case L_32:
1420 	  size = 4;
1421 	  where = (operand->mode & SIZE) == L_24 ? -1 : 0;
1422 #ifdef OBJ_ELF
1423 	  if ((operand->mode & MODE) == DISP && relaxmode == 1)
1424 	    idx = BFD_RELOC_H8_DISP32A16;
1425 	  else
1426 #endif
1427 	  if (relaxmode == 2)
1428 	    idx = R_MOV24B1;
1429 	  else if (relaxmode == 1)
1430 	    idx = R_MOVL1;
1431 	  else
1432 	    idx = R_RELLONG;
1433 	  break;
1434 	default:
1435 	  as_bad (_("Can't work out size of operand.\n"));
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 char *
2105 md_atof (int type, char *litP, int *sizeP)
2106 {
2107   return ieee_md_atof (type, litP, sizeP, TRUE);
2108 }
2109 
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, 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 
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 = xmalloc (sizeof (arelent));
2339   rel->sym_ptr_ptr = xmalloc (sizeof (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 }
2362