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