1/* tc-h8300.c -- Assemble code for the Renesas H8/300
2   Copyright (C) 1991-2017 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
36const char comment_chars[] = ";";
37const char line_comment_chars[] = "#";
38#ifdef TE_LINUX
39const char line_separator_chars[] = "!";
40#else
41const char line_separator_chars[] = "";
42#endif
43
44static void sbranch (int);
45static void h8300hmode (int);
46static void h8300smode (int);
47static void h8300hnmode (int);
48static void h8300snmode (int);
49static void h8300sxmode (int);
50static void h8300sxnmode (int);
51static void pint (int);
52
53int Hmode;
54int Smode;
55int Nmode;
56int SXmode;
57
58static int default_mach = bfd_mach_h8300;
59
60#define PSIZE (Hmode && !Nmode ? L_32 : L_16)
61
62static int bsize = L_8;		/* Default branch displacement.  */
63
64struct h8_instruction
65{
66  int length;
67  int noperands;
68  int idx;
69  int size;
70  const struct h8_opcode *opcode;
71};
72
73static struct h8_instruction *h8_instructions;
74
75static void
76h8300hmode (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
84static void
85h8300smode (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
93static void
94h8300hnmode (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
103static void
104h8300snmode (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
113static void
114h8300sxmode (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
123static void
124h8300sxnmode (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
134static void
135sbranch (int size)
136{
137  bsize = size;
138}
139
140static void
141pint (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
149static void
150h8300_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
194const 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
225const 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.  */
230const char FLT_CHARS[] = "rRsSfFdDxXpP";
231
232static 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
238void
239md_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
346struct h8_op
347{
348  op_type mode;
349  unsigned reg;
350  expressionS exp;
351};
352
353static void clever_message (const struct h8_instruction *, struct h8_op *);
354static void fix_operand_size (struct h8_op *, int);
355static void build_bytes (const struct h8_instruction *, struct h8_op *);
356static void do_a_fix_imm (int, int, struct h8_op *, int, const struct h8_instruction *);
357static void check_operand (struct h8_op *, unsigned int, const char *);
358static const struct h8_instruction * get_specific (const struct h8_instruction *, struct h8_op *, int) ;
359static char *get_operands (unsigned, char *, struct h8_op *);
360static void get_operand (char **, struct h8_op *, int);
361static int parse_reg (char *, op_type *, unsigned *, int);
362static char *skip_colonthing (char *, int *);
363static char *parse_exp (char *, struct h8_op *);
364
365static 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
380static int
381parse_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
493static char *
494parse_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
513static char *
514skip_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
560static int
561constant_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
569static int
570constant_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
607static void
608get_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
897static char *
898get_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.  */
945static void
946get_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
1016static void
1017get_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
1069static const struct h8_instruction *
1070get_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
1287static void
1288check_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
1334static void
1335do_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
1468static void
1469build_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
1787static void
1788clever_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
1857static void
1858fix_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
1924void
1925md_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
2096symbolS *
2097md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2098{
2099  return 0;
2100}
2101
2102/* Various routines to kill one day.  */
2103
2104const char *
2105md_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
2113const char *md_shortopts = "";
2114struct 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
2121size_t md_longopts_size = sizeof (md_longopts);
2122
2123struct mach_func
2124{
2125  const char *name;
2126  void (*func) (void);
2127};
2128
2129static void
2130mach_h8300h (void)
2131{
2132  Hmode = 1;
2133  Smode = 0;
2134  Nmode = 0;
2135  SXmode = 0;
2136  default_mach = bfd_mach_h8300h;
2137}
2138
2139static void
2140mach_h8300hn (void)
2141{
2142  Hmode = 1;
2143  Smode = 0;
2144  Nmode = 1;
2145  SXmode = 0;
2146  default_mach = bfd_mach_h8300hn;
2147}
2148
2149static void
2150mach_h8300s (void)
2151{
2152  Hmode = 1;
2153  Smode = 1;
2154  Nmode = 0;
2155  SXmode = 0;
2156  default_mach = bfd_mach_h8300s;
2157}
2158
2159static void
2160mach_h8300sn (void)
2161{
2162  Hmode = 1;
2163  Smode = 1;
2164  Nmode = 1;
2165  SXmode = 0;
2166  default_mach = bfd_mach_h8300sn;
2167}
2168
2169static void
2170mach_h8300sx (void)
2171{
2172  Hmode = 1;
2173  Smode = 1;
2174  Nmode = 0;
2175  SXmode = 1;
2176  default_mach = bfd_mach_h8300sx;
2177}
2178
2179static void
2180mach_h8300sxn (void)
2181{
2182  Hmode = 1;
2183  Smode = 1;
2184  Nmode = 1;
2185  SXmode = 1;
2186  default_mach = bfd_mach_h8300sxn;
2187}
2188
2189const 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
2199int
2200md_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
2226void
2227md_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
2237void tc_aout_fix_to_chars (void);
2238
2239void
2240tc_aout_fix_to_chars (void)
2241{
2242  printf (_("call to tc_aout_fix_to_chars \n"));
2243  abort ();
2244}
2245
2246void
2247md_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
2255valueT
2256md_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
2262void
2263md_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
2298int
2299md_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.  */
2307void
2308md_number_to_chars (char *ptr, valueT use, int nbytes)
2309{
2310  number_to_chars_bigendian (ptr, use, nbytes);
2311}
2312
2313long
2314md_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
2321arelent *
2322tc_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}
2362