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