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