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