Home | History | Annotate | Line # | Download | only in config
      1   1.1  christos /* tc-sh.c -- Assemble code for the Renesas / SuperH SH
      2  1.10  christos    Copyright (C) 1993-2025 Free Software Foundation, Inc.
      3   1.1  christos 
      4   1.1  christos    This file is part of GAS, the GNU Assembler.
      5   1.1  christos 
      6   1.1  christos    GAS is free software; you can redistribute it and/or modify
      7   1.1  christos    it under the terms of the GNU General Public License as published by
      8   1.1  christos    the Free Software Foundation; either version 3, or (at your option)
      9   1.1  christos    any later version.
     10   1.1  christos 
     11   1.1  christos    GAS is distributed in the hope that it will be useful,
     12   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14   1.1  christos    GNU General Public License for more details.
     15   1.1  christos 
     16   1.1  christos    You should have received a copy of the GNU General Public License
     17   1.1  christos    along with GAS; see the file COPYING.  If not, write to
     18   1.1  christos    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
     19   1.1  christos    Boston, MA 02110-1301, USA.  */
     20   1.1  christos 
     21   1.1  christos /* Written By Steve Chamberlain <sac (at) cygnus.com>  */
     22   1.1  christos 
     23   1.1  christos #include "as.h"
     24   1.1  christos #include "subsegs.h"
     25   1.1  christos #define DEFINE_TABLE
     26   1.1  christos #include "opcodes/sh-opc.h"
     27   1.1  christos #include "safe-ctype.h"
     28   1.1  christos 
     29   1.1  christos #ifdef OBJ_ELF
     30   1.1  christos #include "elf/sh.h"
     31   1.1  christos #endif
     32   1.1  christos 
     33   1.1  christos #include "dwarf2dbg.h"
     34   1.1  christos #include "dw2gencfi.h"
     35   1.1  christos 
     36   1.1  christos typedef struct
     37   1.1  christos   {
     38   1.1  christos     sh_arg_type type;
     39   1.1  christos     int reg;
     40   1.1  christos     expressionS immediate;
     41   1.1  christos   }
     42   1.1  christos sh_operand_info;
     43   1.1  christos 
     44   1.1  christos const char comment_chars[] = "!";
     45   1.1  christos const char line_separator_chars[] = ";";
     46   1.1  christos const char line_comment_chars[] = "!#";
     47   1.1  christos 
     48   1.1  christos static void s_uses (int);
     49   1.1  christos static void s_uacons (int);
     50   1.1  christos 
     51   1.1  christos #ifdef OBJ_ELF
     52   1.1  christos static void sh_elf_cons (int);
     53   1.1  christos 
     54   1.1  christos symbolS *GOT_symbol;		/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
     55   1.1  christos #endif
     56   1.1  christos 
     57   1.1  christos static void
     58   1.1  christos big (int ignore ATTRIBUTE_UNUSED)
     59   1.1  christos {
     60   1.1  christos   if (! target_big_endian)
     61   1.1  christos     as_bad (_("directive .big encountered when option -big required"));
     62   1.1  christos 
     63   1.1  christos   /* Stop further messages.  */
     64   1.1  christos   target_big_endian = 1;
     65   1.1  christos }
     66   1.1  christos 
     67   1.1  christos static void
     68   1.1  christos little (int ignore ATTRIBUTE_UNUSED)
     69   1.1  christos {
     70   1.1  christos   if (target_big_endian)
     71   1.1  christos     as_bad (_("directive .little encountered when option -little required"));
     72   1.1  christos 
     73   1.1  christos   /* Stop further messages.  */
     74   1.1  christos   target_big_endian = 0;
     75   1.1  christos }
     76   1.1  christos 
     77   1.1  christos /* This table describes all the machine specific pseudo-ops the assembler
     78   1.1  christos    has to support.  The fields are:
     79   1.1  christos    pseudo-op name without dot
     80   1.1  christos    function to call to execute this pseudo-op
     81   1.1  christos    Integer arg to pass to the function.  */
     82   1.1  christos 
     83   1.1  christos const pseudo_typeS md_pseudo_table[] =
     84   1.1  christos {
     85   1.1  christos #ifdef OBJ_ELF
     86   1.1  christos   {"long", sh_elf_cons, 4},
     87   1.1  christos   {"int", sh_elf_cons, 4},
     88   1.1  christos   {"word", sh_elf_cons, 2},
     89   1.1  christos   {"short", sh_elf_cons, 2},
     90   1.1  christos #else
     91   1.1  christos   {"int", cons, 4},
     92   1.1  christos   {"word", cons, 2},
     93   1.1  christos #endif /* OBJ_ELF */
     94   1.1  christos   {"big", big, 0},
     95   1.1  christos   {"form", listing_psize, 0},
     96   1.1  christos   {"little", little, 0},
     97   1.1  christos   {"heading", listing_title, 0},
     98   1.1  christos   {"import", s_ignore, 0},
     99   1.1  christos   {"page", listing_eject, 0},
    100   1.1  christos   {"program", s_ignore, 0},
    101   1.1  christos   {"uses", s_uses, 0},
    102   1.1  christos   {"uaword", s_uacons, 2},
    103   1.1  christos   {"ualong", s_uacons, 4},
    104   1.1  christos   {"uaquad", s_uacons, 8},
    105   1.1  christos   {"2byte", s_uacons, 2},
    106   1.1  christos   {"4byte", s_uacons, 4},
    107   1.1  christos   {"8byte", s_uacons, 8},
    108   1.1  christos   {0, 0, 0}
    109   1.1  christos };
    110   1.1  christos 
    111   1.1  christos int sh_relax;		/* set if -relax seen */
    112   1.1  christos 
    113   1.1  christos /* Whether -small was seen.  */
    114   1.1  christos 
    115   1.1  christos int sh_small;
    116   1.1  christos 
    117   1.1  christos /* Flag to generate relocations against symbol values for local symbols.  */
    118   1.1  christos 
    119   1.1  christos static int dont_adjust_reloc_32;
    120   1.1  christos 
    121   1.1  christos /* Flag to indicate that '$' is allowed as a register prefix.  */
    122   1.1  christos 
    123   1.1  christos static int allow_dollar_register_prefix;
    124   1.1  christos 
    125   1.1  christos /* Preset architecture set, if given; zero otherwise.  */
    126   1.1  christos 
    127   1.1  christos static unsigned int preset_target_arch;
    128   1.1  christos 
    129   1.1  christos /* The bit mask of architectures that could
    130   1.1  christos    accommodate the insns seen so far.  */
    131   1.1  christos static unsigned int valid_arch;
    132   1.1  christos 
    133   1.1  christos #ifdef OBJ_ELF
    134   1.1  christos /* Whether --fdpic was given.  */
    135   1.1  christos static int sh_fdpic;
    136   1.1  christos #endif
    137   1.1  christos 
    138   1.1  christos const char EXP_CHARS[] = "eE";
    139   1.1  christos 
    140   1.1  christos /* Chars that mean this number is a floating point constant.  */
    141   1.1  christos /* As in 0f12.456 */
    142   1.1  christos /* or    0d1.2345e12 */
    143   1.1  christos const char FLT_CHARS[] = "rRsSfFdDxXpP";
    144   1.1  christos 
    145   1.1  christos #define C(a,b) ENCODE_RELAX(a,b)
    146   1.1  christos 
    147   1.1  christos #define ENCODE_RELAX(what,length) (((what) << 4) + (length))
    148   1.1  christos #define GET_WHAT(x) ((x>>4))
    149   1.1  christos 
    150   1.1  christos /* These are the three types of relaxable instruction.  */
    151   1.1  christos /* These are the types of relaxable instructions; except for END which is
    152   1.1  christos    a marker.  */
    153   1.1  christos #define COND_JUMP 1
    154   1.1  christos #define COND_JUMP_DELAY 2
    155   1.1  christos #define UNCOND_JUMP  3
    156   1.1  christos 
    157   1.1  christos #define END 4
    158   1.1  christos 
    159   1.1  christos #define UNDEF_DISP 0
    160   1.1  christos #define COND8  1
    161   1.1  christos #define COND12 2
    162   1.1  christos #define COND32 3
    163   1.1  christos #define UNDEF_WORD_DISP 4
    164   1.1  christos 
    165   1.1  christos #define UNCOND12 1
    166   1.1  christos #define UNCOND32 2
    167   1.1  christos 
    168   1.1  christos /* Branch displacements are from the address of the branch plus
    169   1.1  christos    four, thus all minimum and maximum values have 4 added to them.  */
    170   1.1  christos #define COND8_F 258
    171   1.1  christos #define COND8_M -252
    172   1.1  christos #define COND8_LENGTH 2
    173   1.1  christos 
    174   1.1  christos /* There is one extra instruction before the branch, so we must add
    175   1.1  christos    two more bytes to account for it.  */
    176   1.1  christos #define COND12_F 4100
    177   1.1  christos #define COND12_M -4090
    178   1.1  christos #define COND12_LENGTH 6
    179   1.1  christos 
    180   1.1  christos #define COND12_DELAY_LENGTH 4
    181   1.1  christos 
    182   1.1  christos /* ??? The minimum and maximum values are wrong, but this does not matter
    183   1.1  christos    since this relocation type is not supported yet.  */
    184   1.1  christos #define COND32_F (1<<30)
    185   1.1  christos #define COND32_M -(1<<30)
    186   1.1  christos #define COND32_LENGTH 14
    187   1.1  christos 
    188   1.1  christos #define UNCOND12_F 4098
    189   1.1  christos #define UNCOND12_M -4092
    190   1.1  christos #define UNCOND12_LENGTH 2
    191   1.1  christos 
    192   1.1  christos /* ??? The minimum and maximum values are wrong, but this does not matter
    193   1.1  christos    since this relocation type is not supported yet.  */
    194   1.1  christos #define UNCOND32_F (1<<30)
    195   1.1  christos #define UNCOND32_M -(1<<30)
    196   1.1  christos #define UNCOND32_LENGTH 14
    197   1.1  christos 
    198   1.1  christos #define EMPTY { 0, 0, 0, 0 }
    199   1.1  christos 
    200   1.1  christos const relax_typeS md_relax_table[C (END, 0)] = {
    201   1.1  christos   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    202   1.1  christos   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    203   1.1  christos 
    204   1.1  christos   EMPTY,
    205   1.1  christos   /* C (COND_JUMP, COND8) */
    206   1.1  christos   { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP, COND12) },
    207   1.1  christos   /* C (COND_JUMP, COND12) */
    208   1.1  christos   { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), },
    209   1.1  christos   /* C (COND_JUMP, COND32) */
    210   1.1  christos   { COND32_F, COND32_M, COND32_LENGTH, 0, },
    211   1.1  christos   /* C (COND_JUMP, UNDEF_WORD_DISP) */
    212   1.1  christos   { 0, 0, COND32_LENGTH, 0, },
    213   1.1  christos   EMPTY, EMPTY, EMPTY,
    214   1.1  christos   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    215   1.1  christos 
    216   1.1  christos   EMPTY,
    217   1.1  christos   /* C (COND_JUMP_DELAY, COND8) */
    218   1.1  christos   { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP_DELAY, COND12) },
    219   1.1  christos   /* C (COND_JUMP_DELAY, COND12) */
    220   1.1  christos   { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), },
    221   1.1  christos   /* C (COND_JUMP_DELAY, COND32) */
    222   1.1  christos   { COND32_F, COND32_M, COND32_LENGTH, 0, },
    223   1.1  christos   /* C (COND_JUMP_DELAY, UNDEF_WORD_DISP) */
    224   1.1  christos   { 0, 0, COND32_LENGTH, 0, },
    225   1.1  christos   EMPTY, EMPTY, EMPTY,
    226   1.1  christos   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    227   1.1  christos 
    228   1.1  christos   EMPTY,
    229   1.1  christos   /* C (UNCOND_JUMP, UNCOND12) */
    230   1.1  christos   { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), },
    231   1.1  christos   /* C (UNCOND_JUMP, UNCOND32) */
    232   1.1  christos   { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, },
    233   1.1  christos   EMPTY,
    234   1.1  christos   /* C (UNCOND_JUMP, UNDEF_WORD_DISP) */
    235   1.1  christos   { 0, 0, UNCOND32_LENGTH, 0, },
    236   1.1  christos   EMPTY, EMPTY, EMPTY,
    237   1.1  christos   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
    238   1.1  christos 
    239   1.1  christos };
    240   1.1  christos 
    241   1.1  christos #undef EMPTY
    242   1.1  christos 
    243   1.8  christos static htab_t opcode_hash_control;	/* Opcode mnemonics */
    244   1.1  christos 
    245   1.1  christos 
    246   1.1  christos #ifdef OBJ_ELF
    248   1.1  christos /* Determine whether the symbol needs any kind of PIC relocation.  */
    249   1.1  christos 
    250   1.1  christos inline static int
    251   1.1  christos sh_PIC_related_p (symbolS *sym)
    252   1.1  christos {
    253   1.1  christos   expressionS *exp;
    254   1.1  christos 
    255   1.1  christos   if (! sym)
    256   1.1  christos     return 0;
    257   1.1  christos 
    258   1.1  christos   if (sym == GOT_symbol)
    259   1.1  christos     return 1;
    260   1.1  christos 
    261   1.1  christos   exp = symbol_get_value_expression (sym);
    262   1.1  christos 
    263   1.1  christos   return (exp->X_op == O_PIC_reloc
    264   1.1  christos 	  || sh_PIC_related_p (exp->X_add_symbol)
    265   1.1  christos 	  || sh_PIC_related_p (exp->X_op_symbol));
    266   1.1  christos }
    267   1.1  christos 
    268   1.1  christos /* Determine the relocation type to be used to represent the
    269   1.1  christos    expression, that may be rearranged.  */
    270   1.1  christos 
    271   1.1  christos static int
    272   1.1  christos sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p)
    273   1.1  christos {
    274   1.1  christos   expressionS *exp = main_exp;
    275   1.1  christos 
    276   1.1  christos   /* This is here for backward-compatibility only.  GCC used to generated:
    277   1.1  christos 
    278   1.1  christos 	f@PLT + . - (.LPCS# + 2)
    279   1.1  christos 
    280   1.1  christos      but we'd rather be able to handle this as a PIC-related reference
    281   1.1  christos      plus/minus a symbol.  However, gas' parser gives us:
    282   1.1  christos 
    283   1.1  christos 	O_subtract (O_add (f@PLT, .), .LPCS#+2)
    284   1.1  christos 
    285   1.1  christos      so we attempt to transform this into:
    286   1.1  christos 
    287   1.1  christos         O_subtract (f@PLT, O_subtract (.LPCS#+2, .))
    288   1.1  christos 
    289   1.1  christos      which we can handle simply below.  */
    290   1.1  christos   if (exp->X_op == O_subtract)
    291   1.1  christos     {
    292   1.1  christos       if (sh_PIC_related_p (exp->X_op_symbol))
    293   1.1  christos 	return 1;
    294   1.1  christos 
    295   1.1  christos       exp = symbol_get_value_expression (exp->X_add_symbol);
    296   1.1  christos 
    297   1.1  christos       if (exp && sh_PIC_related_p (exp->X_op_symbol))
    298   1.1  christos 	return 1;
    299   1.1  christos 
    300   1.1  christos       if (exp && exp->X_op == O_add
    301   1.1  christos 	  && sh_PIC_related_p (exp->X_add_symbol))
    302   1.1  christos 	{
    303   1.1  christos 	  symbolS *sym = exp->X_add_symbol;
    304   1.1  christos 
    305   1.1  christos 	  exp->X_op = O_subtract;
    306   1.1  christos 	  exp->X_add_symbol = main_exp->X_op_symbol;
    307   1.1  christos 
    308   1.1  christos 	  main_exp->X_op_symbol = main_exp->X_add_symbol;
    309   1.1  christos 	  main_exp->X_add_symbol = sym;
    310   1.1  christos 
    311   1.1  christos 	  main_exp->X_add_number += exp->X_add_number;
    312   1.1  christos 	  exp->X_add_number = 0;
    313   1.1  christos 	}
    314   1.1  christos 
    315   1.1  christos       exp = main_exp;
    316   1.1  christos     }
    317   1.1  christos   else if (exp->X_op == O_add && sh_PIC_related_p (exp->X_op_symbol))
    318   1.1  christos     return 1;
    319   1.1  christos 
    320   1.1  christos   if (exp->X_op == O_symbol || exp->X_op == O_add || exp->X_op == O_subtract)
    321   1.1  christos     {
    322   1.1  christos       if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
    323   1.1  christos 	{
    324   1.1  christos 	  *r_type_p = BFD_RELOC_SH_GOTPC;
    325   1.1  christos 	  return 0;
    326   1.1  christos 	}
    327   1.1  christos       exp = symbol_get_value_expression (exp->X_add_symbol);
    328   1.1  christos       if (! exp)
    329   1.1  christos 	return 0;
    330   1.1  christos     }
    331   1.1  christos 
    332   1.1  christos   if (exp->X_op == O_PIC_reloc)
    333   1.1  christos     {
    334   1.1  christos       switch (*r_type_p)
    335   1.1  christos 	{
    336   1.1  christos 	case BFD_RELOC_NONE:
    337   1.1  christos 	case BFD_RELOC_UNUSED:
    338   1.1  christos 	  *r_type_p = exp->X_md;
    339   1.1  christos 	  break;
    340   1.1  christos 
    341   1.1  christos 	case BFD_RELOC_SH_DISP20:
    342   1.1  christos 	  switch (exp->X_md)
    343   1.1  christos 	    {
    344   1.1  christos 	    case BFD_RELOC_32_GOT_PCREL:
    345   1.1  christos 	      *r_type_p = BFD_RELOC_SH_GOT20;
    346   1.1  christos 	      break;
    347   1.1  christos 
    348   1.1  christos 	    case BFD_RELOC_32_GOTOFF:
    349   1.1  christos 	      *r_type_p = BFD_RELOC_SH_GOTOFF20;
    350   1.1  christos 	      break;
    351   1.1  christos 
    352   1.1  christos 	    case BFD_RELOC_SH_GOTFUNCDESC:
    353   1.1  christos 	      *r_type_p = BFD_RELOC_SH_GOTFUNCDESC20;
    354   1.1  christos 	      break;
    355   1.1  christos 
    356   1.1  christos 	    case BFD_RELOC_SH_GOTOFFFUNCDESC:
    357   1.1  christos 	      *r_type_p = BFD_RELOC_SH_GOTOFFFUNCDESC20;
    358   1.1  christos 	      break;
    359   1.1  christos 
    360   1.1  christos 	    default:
    361   1.1  christos 	      abort ();
    362   1.1  christos 	    }
    363   1.1  christos 	  break;
    364   1.1  christos 
    365   1.1  christos 	default:
    366   1.1  christos 	  abort ();
    367   1.1  christos 	}
    368   1.1  christos       if (exp == main_exp)
    369   1.1  christos 	exp->X_op = O_symbol;
    370   1.1  christos       else
    371   1.1  christos 	{
    372   1.1  christos 	  main_exp->X_add_symbol = exp->X_add_symbol;
    373   1.1  christos 	  main_exp->X_add_number += exp->X_add_number;
    374   1.1  christos 	}
    375   1.1  christos     }
    376   1.1  christos   else
    377   1.1  christos     return (sh_PIC_related_p (exp->X_add_symbol)
    378   1.1  christos 	    || sh_PIC_related_p (exp->X_op_symbol));
    379   1.1  christos 
    380   1.1  christos   return 0;
    381   1.1  christos }
    382   1.1  christos 
    383   1.1  christos /* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG.  */
    384   1.1  christos 
    385   1.3  christos void
    386   1.3  christos sh_cons_fix_new (fragS *frag, int off, int size, expressionS *exp,
    387   1.1  christos 		 bfd_reloc_code_real_type r_type)
    388   1.3  christos {
    389   1.1  christos   r_type = BFD_RELOC_UNUSED;
    390   1.1  christos 
    391   1.1  christos   if (sh_check_fixup (exp, &r_type))
    392   1.1  christos     as_bad (_("Invalid PIC expression."));
    393   1.1  christos 
    394   1.1  christos   if (r_type == BFD_RELOC_UNUSED)
    395   1.1  christos     switch (size)
    396   1.1  christos       {
    397   1.1  christos       case 1:
    398   1.1  christos 	r_type = BFD_RELOC_8;
    399   1.1  christos 	break;
    400   1.1  christos 
    401   1.1  christos       case 2:
    402   1.1  christos 	r_type = BFD_RELOC_16;
    403   1.1  christos 	break;
    404   1.1  christos 
    405   1.1  christos       case 4:
    406   1.1  christos 	r_type = BFD_RELOC_32;
    407   1.1  christos 	break;
    408   1.1  christos 
    409   1.1  christos       case 8:
    410   1.1  christos 	r_type = BFD_RELOC_64;
    411   1.1  christos 	break;
    412   1.1  christos 
    413   1.1  christos       default:
    414   1.1  christos 	goto error;
    415   1.1  christos       }
    416   1.1  christos   else if (size != 4)
    417   1.1  christos     {
    418   1.1  christos     error:
    419   1.1  christos       as_bad (_("unsupported BFD relocation size %u"), size);
    420   1.1  christos       r_type = BFD_RELOC_UNUSED;
    421   1.1  christos     }
    422   1.1  christos 
    423   1.1  christos   fix_new_exp (frag, off, size, exp, 0, r_type);
    424   1.1  christos }
    425   1.1  christos 
    426   1.1  christos /* The regular cons() function, that reads constants, doesn't support
    427   1.1  christos    suffixes such as @GOT, @GOTOFF and @PLT, that generate
    428   1.1  christos    machine-specific relocation types.  So we must define it here.  */
    429   1.1  christos /* Clobbers input_line_pointer, checks end-of-line.  */
    430   1.1  christos /* NBYTES 1=.byte, 2=.word, 4=.long */
    431   1.3  christos static void
    432   1.1  christos sh_elf_cons (int nbytes)
    433   1.1  christos {
    434   1.1  christos   expressionS exp;
    435   1.1  christos 
    436   1.1  christos   if (is_it_end_of_statement ())
    437   1.1  christos     {
    438   1.1  christos       demand_empty_rest_of_line ();
    439   1.1  christos       return;
    440   1.1  christos     }
    441   1.1  christos 
    442   1.1  christos #ifdef md_cons_align
    443   1.1  christos   md_cons_align (nbytes);
    444   1.1  christos #endif
    445   1.1  christos 
    446   1.1  christos   do
    447   1.1  christos     {
    448  1.10  christos       expression (&exp);
    449   1.1  christos       emit_expr (&exp, nbytes);
    450   1.1  christos     }
    451   1.1  christos   while (*input_line_pointer++ == ',');
    452   1.1  christos 
    453   1.1  christos   input_line_pointer--;		/* Put terminator back into stream.  */
    454   1.1  christos   if (*input_line_pointer == '#' || *input_line_pointer == '!')
    455  1.10  christos     {
    456   1.1  christos        while (! is_end_of_stmt (*input_line_pointer++));
    457   1.1  christos     }
    458   1.1  christos   else
    459   1.1  christos     demand_empty_rest_of_line ();
    460   1.1  christos }
    461   1.1  christos 
    462   1.1  christos /* The regular frag_offset_fixed_p doesn't work for rs_align_test
    463   1.1  christos    frags.  */
    464   1.8  christos 
    465   1.1  christos static bool
    466   1.1  christos align_test_frag_offset_fixed_p (const fragS *frag1, const fragS *frag2,
    467   1.1  christos 				bfd_vma *offset)
    468   1.1  christos {
    469   1.1  christos   const fragS *frag;
    470   1.1  christos   bfd_vma off;
    471   1.1  christos 
    472   1.1  christos   /* Start with offset initialised to difference between the two frags.
    473   1.1  christos      Prior to assigning frag addresses this will be zero.  */
    474   1.1  christos   off = frag1->fr_address - frag2->fr_address;
    475   1.1  christos   if (frag1 == frag2)
    476   1.1  christos     {
    477   1.8  christos       *offset = off;
    478   1.1  christos       return true;
    479   1.1  christos     }
    480   1.1  christos 
    481   1.1  christos   /* Maybe frag2 is after frag1.  */
    482   1.1  christos   frag = frag1;
    483   1.1  christos   while (frag->fr_type == rs_fill
    484   1.1  christos 	 || frag->fr_type == rs_align_test)
    485   1.1  christos     {
    486   1.1  christos       if (frag->fr_type == rs_fill)
    487   1.1  christos 	off += frag->fr_fix + frag->fr_offset * frag->fr_var;
    488   1.1  christos       else
    489   1.1  christos 	off += frag->fr_fix;
    490   1.1  christos       frag = frag->fr_next;
    491   1.1  christos       if (frag == NULL)
    492   1.1  christos 	break;
    493   1.1  christos       if (frag == frag2)
    494   1.1  christos 	{
    495   1.8  christos 	  *offset = off;
    496   1.1  christos 	  return true;
    497   1.1  christos 	}
    498   1.1  christos     }
    499   1.1  christos 
    500   1.1  christos   /* Maybe frag1 is after frag2.  */
    501   1.1  christos   off = frag1->fr_address - frag2->fr_address;
    502   1.1  christos   frag = frag2;
    503   1.1  christos   while (frag->fr_type == rs_fill
    504   1.1  christos 	 || frag->fr_type == rs_align_test)
    505   1.1  christos     {
    506   1.1  christos       if (frag->fr_type == rs_fill)
    507   1.1  christos 	off -= frag->fr_fix + frag->fr_offset * frag->fr_var;
    508   1.1  christos       else
    509   1.1  christos 	off -= frag->fr_fix;
    510   1.1  christos       frag = frag->fr_next;
    511   1.1  christos       if (frag == NULL)
    512   1.1  christos 	break;
    513   1.1  christos       if (frag == frag1)
    514   1.1  christos 	{
    515   1.8  christos 	  *offset = off;
    516   1.1  christos 	  return true;
    517   1.1  christos 	}
    518   1.1  christos     }
    519   1.8  christos 
    520   1.1  christos   return false;
    521   1.1  christos }
    522   1.1  christos 
    523   1.1  christos /* Optimize a difference of symbols which have rs_align_test frag if
    524   1.1  christos    possible.  */
    525   1.1  christos 
    526   1.1  christos int
    527   1.1  christos sh_optimize_expr (expressionS *l, operatorT op, expressionS *r)
    528   1.1  christos {
    529   1.1  christos   bfd_vma frag_off;
    530   1.1  christos 
    531   1.1  christos   if (op == O_subtract
    532   1.1  christos       && l->X_op == O_symbol
    533   1.1  christos       && r->X_op == O_symbol
    534   1.1  christos       && S_GET_SEGMENT (l->X_add_symbol) == S_GET_SEGMENT (r->X_add_symbol)
    535   1.1  christos       && (SEG_NORMAL (S_GET_SEGMENT (l->X_add_symbol))
    536   1.1  christos 	  || r->X_add_symbol == l->X_add_symbol)
    537   1.1  christos       && align_test_frag_offset_fixed_p (symbol_get_frag (l->X_add_symbol),
    538   1.1  christos 					 symbol_get_frag (r->X_add_symbol),
    539   1.1  christos 					 &frag_off))
    540   1.3  christos     {
    541   1.3  christos       offsetT symval_diff = S_GET_VALUE (l->X_add_symbol)
    542   1.3  christos 			    - S_GET_VALUE (r->X_add_symbol);
    543   1.3  christos       subtract_from_result (l, r->X_add_number, r->X_extrabit);
    544   1.3  christos       subtract_from_result (l, frag_off / OCTETS_PER_BYTE, 0);
    545   1.1  christos       add_to_result (l, symval_diff, symval_diff < 0);
    546   1.1  christos       l->X_op = O_constant;
    547  1.10  christos       l->X_add_symbol = 0;
    548   1.1  christos       l->X_unsigned = 0;
    549   1.1  christos       return 1;
    550   1.1  christos     }
    551   1.1  christos   return 0;
    552   1.1  christos }
    553   1.1  christos #endif /* OBJ_ELF */
    554   1.1  christos 
    555   1.1  christos /* This function is called once, at assembler startup time.  This should
    557   1.1  christos    set up all the tables, etc that the MD part of the assembler needs.  */
    558   1.1  christos 
    559   1.1  christos void
    560   1.1  christos md_begin (void)
    561   1.5  christos {
    562   1.1  christos   const sh_opcode_info *opcode;
    563   1.1  christos   const char *prev_name = "";
    564   1.1  christos   unsigned int target_arch;
    565   1.1  christos 
    566   1.1  christos   target_arch
    567   1.1  christos     = preset_target_arch ? preset_target_arch : arch_sh_up & ~arch_sh_has_dsp;
    568   1.8  christos   valid_arch = target_arch;
    569   1.1  christos 
    570   1.1  christos   opcode_hash_control = str_htab_create ();
    571   1.1  christos 
    572   1.1  christos   /* Insert unique names into hash table.  */
    573   1.1  christos   for (opcode = sh_table; opcode->name; opcode++)
    574   1.1  christos     {
    575   1.1  christos       if (strcmp (prev_name, opcode->name) != 0)
    576   1.1  christos 	{
    577   1.1  christos 	  if (!SH_MERGE_ARCH_SET_VALID (opcode->arch, target_arch))
    578   1.8  christos 	    continue;
    579   1.1  christos 	  prev_name = opcode->name;
    580   1.1  christos 	  str_hash_insert (opcode_hash_control, opcode->name, opcode, 0);
    581   1.1  christos 	}
    582   1.1  christos     }
    583   1.1  christos }
    584   1.1  christos 
    585   1.1  christos static int reg_m;
    586   1.1  christos static int reg_n;
    587   1.1  christos static int reg_x, reg_y;
    588   1.1  christos static int reg_efg;
    589   1.1  christos static int reg_b;
    590   1.1  christos 
    591   1.1  christos #define IDENT_CHAR(c) (ISALNUM (c) || (c) == '_')
    592   1.1  christos 
    593   1.1  christos /* Try to parse a reg name.  Return the number of chars consumed.  */
    594   1.5  christos 
    595   1.1  christos static unsigned int
    596   1.1  christos parse_reg_without_prefix (char *src, sh_arg_type *mode, int *reg)
    597   1.1  christos {
    598   1.1  christos   char l0 = TOLOWER (src[0]);
    599   1.1  christos   char l1 = l0 ? TOLOWER (src[1]) : 0;
    600   1.1  christos 
    601   1.1  christos   /* We use ! IDENT_CHAR for the next character after the register name, to
    602   1.1  christos      make sure that we won't accidentally recognize a symbol name such as
    603   1.1  christos      'sram' or sr_ram as being a reference to the register 'sr'.  */
    604   1.1  christos 
    605   1.1  christos   if (l0 == 'r')
    606   1.1  christos     {
    607   1.1  christos       if (l1 == '1')
    608  1.10  christos 	{
    609   1.1  christos 	  if (src[2] >= '0' && src[2] <= '5'
    610   1.1  christos 	      && ! IDENT_CHAR (src[3]))
    611   1.1  christos 	    {
    612   1.1  christos 	      *mode = A_REG_N;
    613   1.1  christos 	      *reg = 10 + src[2] - '0';
    614   1.1  christos 	      return 3;
    615   1.1  christos 	    }
    616  1.10  christos 	}
    617   1.1  christos       if (l1 >= '0' && l1 <= '9'
    618   1.1  christos 	  && ! IDENT_CHAR (src[2]))
    619   1.1  christos 	{
    620   1.1  christos 	  *mode = A_REG_N;
    621   1.1  christos 	  *reg = (l1 - '0');
    622   1.1  christos 	  return 2;
    623  1.10  christos 	}
    624   1.1  christos       if (l1 >= '0' && l1 <= '7' && strncasecmp (&src[2], "_bank", 5) == 0
    625   1.1  christos 	  && ! IDENT_CHAR (src[7]))
    626   1.1  christos 	{
    627   1.1  christos 	  *mode = A_REG_B;
    628   1.1  christos 	  *reg  = (l1 - '0');
    629   1.1  christos 	  return 7;
    630  1.10  christos 	}
    631   1.1  christos 
    632   1.1  christos       if (l1 == 'e' && ! IDENT_CHAR (src[2]))
    633   1.1  christos 	{
    634   1.1  christos 	  *mode = A_RE;
    635  1.10  christos 	  return 2;
    636   1.1  christos 	}
    637   1.1  christos       if (l1 == 's' && ! IDENT_CHAR (src[2]))
    638   1.1  christos 	{
    639   1.1  christos 	  *mode = A_RS;
    640   1.1  christos 	  return 2;
    641   1.1  christos 	}
    642   1.1  christos     }
    643   1.1  christos 
    644   1.1  christos   if (l0 == 'a')
    645   1.1  christos     {
    646  1.10  christos       if (l1 == '0')
    647   1.1  christos 	{
    648   1.1  christos 	  if (! IDENT_CHAR (src[2]))
    649   1.1  christos 	    {
    650   1.1  christos 	      *mode = DSP_REG_N;
    651   1.1  christos 	      *reg = A_A0_NUM;
    652  1.10  christos 	      return 2;
    653   1.1  christos 	    }
    654   1.1  christos 	  if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR (src[3]))
    655   1.1  christos 	    {
    656   1.1  christos 	      *mode = DSP_REG_N;
    657   1.1  christos 	      *reg = A_A0G_NUM;
    658   1.1  christos 	      return 3;
    659   1.1  christos 	    }
    660   1.1  christos 	}
    661  1.10  christos       if (l1 == '1')
    662   1.1  christos 	{
    663   1.1  christos 	  if (! IDENT_CHAR (src[2]))
    664   1.1  christos 	    {
    665   1.1  christos 	      *mode = DSP_REG_N;
    666   1.1  christos 	      *reg = A_A1_NUM;
    667  1.10  christos 	      return 2;
    668   1.1  christos 	    }
    669   1.1  christos 	  if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR (src[3]))
    670   1.1  christos 	    {
    671   1.1  christos 	      *mode = DSP_REG_N;
    672   1.1  christos 	      *reg = A_A1G_NUM;
    673   1.1  christos 	      return 3;
    674   1.1  christos 	    }
    675   1.1  christos 	}
    676  1.10  christos 
    677   1.1  christos       if (l1 == 'x' && src[2] >= '0' && src[2] <= '1'
    678   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    679   1.1  christos 	{
    680   1.1  christos 	  *mode = A_REG_N;
    681   1.1  christos 	  *reg = 4 + (l1 - '0');
    682   1.1  christos 	  return 3;
    683  1.10  christos 	}
    684   1.1  christos       if (l1 == 'y' && src[2] >= '0' && src[2] <= '1'
    685   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    686   1.1  christos 	{
    687   1.1  christos 	  *mode = A_REG_N;
    688   1.1  christos 	  *reg = 6 + (l1 - '0');
    689   1.1  christos 	  return 3;
    690  1.10  christos 	}
    691   1.1  christos       if (l1 == 's' && src[2] >= '0' && src[2] <= '3'
    692   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    693   1.1  christos 	{
    694   1.1  christos 	  int n = l1 - '0';
    695   1.1  christos 
    696   1.1  christos 	  *mode = A_REG_N;
    697   1.1  christos 	  *reg = n | ((~n & 2) << 1);
    698   1.1  christos 	  return 3;
    699   1.1  christos 	}
    700  1.10  christos     }
    701   1.1  christos 
    702   1.1  christos   if (l0 == 'i' && l1 && ! IDENT_CHAR (src[2]))
    703   1.1  christos     {
    704   1.1  christos       if (l1 == 's')
    705   1.1  christos 	{
    706   1.1  christos 	  *mode = A_REG_N;
    707   1.1  christos 	  *reg = 8;
    708   1.1  christos 	  return 2;
    709   1.1  christos 	}
    710   1.1  christos       if (l1 == 'x')
    711   1.1  christos 	{
    712   1.1  christos 	  *mode = A_REG_N;
    713   1.1  christos 	  *reg = 8;
    714   1.1  christos 	  return 2;
    715   1.1  christos 	}
    716   1.1  christos       if (l1 == 'y')
    717   1.1  christos 	{
    718   1.1  christos 	  *mode = A_REG_N;
    719   1.1  christos 	  *reg = 9;
    720   1.1  christos 	  return 2;
    721   1.1  christos 	}
    722   1.1  christos     }
    723  1.10  christos 
    724   1.1  christos   if (l0 == 'x' && l1 >= '0' && l1 <= '1'
    725   1.1  christos       && ! IDENT_CHAR (src[2]))
    726   1.1  christos     {
    727   1.1  christos       *mode = DSP_REG_N;
    728   1.1  christos       *reg = A_X0_NUM + l1 - '0';
    729   1.1  christos       return 2;
    730   1.1  christos     }
    731  1.10  christos 
    732   1.1  christos   if (l0 == 'y' && l1 >= '0' && l1 <= '1'
    733   1.1  christos       && ! IDENT_CHAR (src[2]))
    734   1.1  christos     {
    735   1.1  christos       *mode = DSP_REG_N;
    736   1.1  christos       *reg = A_Y0_NUM + l1 - '0';
    737   1.1  christos       return 2;
    738   1.1  christos     }
    739  1.10  christos 
    740   1.1  christos   if (l0 == 'm' && l1 >= '0' && l1 <= '1'
    741   1.1  christos       && ! IDENT_CHAR (src[2]))
    742   1.1  christos     {
    743   1.1  christos       *mode = DSP_REG_N;
    744   1.1  christos       *reg = l1 == '0' ? A_M0_NUM : A_M1_NUM;
    745   1.1  christos       return 2;
    746   1.1  christos     }
    747   1.1  christos 
    748  1.10  christos   if (l0 == 's'
    749   1.1  christos       && l1 == 's'
    750   1.1  christos       && TOLOWER (src[2]) == 'r' && ! IDENT_CHAR (src[3]))
    751   1.1  christos     {
    752   1.1  christos       *mode = A_SSR;
    753   1.1  christos       return 3;
    754   1.1  christos     }
    755  1.10  christos 
    756   1.1  christos   if (l0 == 's' && l1 == 'p' && TOLOWER (src[2]) == 'c'
    757   1.1  christos       && ! IDENT_CHAR (src[3]))
    758   1.1  christos     {
    759   1.1  christos       *mode = A_SPC;
    760   1.1  christos       return 3;
    761   1.1  christos     }
    762  1.10  christos 
    763   1.1  christos   if (l0 == 's' && l1 == 'g' && TOLOWER (src[2]) == 'r'
    764   1.1  christos       && ! IDENT_CHAR (src[3]))
    765   1.1  christos     {
    766   1.1  christos       *mode = A_SGR;
    767   1.1  christos       return 3;
    768   1.1  christos     }
    769  1.10  christos 
    770   1.1  christos   if (l0 == 'd' && l1 == 's' && TOLOWER (src[2]) == 'r'
    771   1.1  christos       && ! IDENT_CHAR (src[3]))
    772   1.1  christos     {
    773   1.1  christos       *mode = A_DSR;
    774   1.1  christos       return 3;
    775   1.1  christos     }
    776  1.10  christos 
    777   1.1  christos   if (l0 == 'd' && l1 == 'b' && TOLOWER (src[2]) == 'r'
    778   1.1  christos       && ! IDENT_CHAR (src[3]))
    779   1.1  christos     {
    780   1.1  christos       *mode = A_DBR;
    781   1.1  christos       return 3;
    782  1.10  christos     }
    783   1.1  christos 
    784   1.1  christos   if (l0 == 's' && l1 == 'r' && ! IDENT_CHAR (src[2]))
    785   1.1  christos     {
    786   1.1  christos       *mode = A_SR;
    787   1.1  christos       return 2;
    788  1.10  christos     }
    789   1.1  christos 
    790   1.1  christos   if (l0 == 's' && l1 == 'p' && ! IDENT_CHAR (src[2]))
    791   1.1  christos     {
    792   1.1  christos       *mode = A_REG_N;
    793   1.1  christos       *reg = 15;
    794   1.1  christos       return 2;
    795  1.10  christos     }
    796   1.1  christos 
    797   1.1  christos   if (l0 == 'p' && l1 == 'r' && ! IDENT_CHAR (src[2]))
    798   1.1  christos     {
    799   1.1  christos       *mode = A_PR;
    800  1.10  christos       return 2;
    801   1.1  christos     }
    802   1.1  christos   if (l0 == 'p' && l1 == 'c' && ! IDENT_CHAR (src[2]))
    803   1.1  christos     {
    804   1.1  christos       /* Don't use A_DISP_PC here - that would accept stuff like 'mova pc,r0'
    805   1.1  christos          and use an uninitialized immediate.  */
    806   1.1  christos       *mode = A_PC;
    807   1.1  christos       return 2;
    808  1.10  christos     }
    809   1.1  christos   if (l0 == 'g' && l1 == 'b' && TOLOWER (src[2]) == 'r'
    810   1.1  christos       && ! IDENT_CHAR (src[3]))
    811   1.1  christos     {
    812   1.1  christos       *mode = A_GBR;
    813   1.1  christos       return 3;
    814  1.10  christos     }
    815   1.1  christos   if (l0 == 'v' && l1 == 'b' && TOLOWER (src[2]) == 'r'
    816   1.1  christos       && ! IDENT_CHAR (src[3]))
    817   1.1  christos     {
    818   1.1  christos       *mode = A_VBR;
    819   1.1  christos       return 3;
    820   1.1  christos     }
    821  1.10  christos 
    822   1.1  christos   if (l0 == 't' && l1 == 'b' && TOLOWER (src[2]) == 'r'
    823   1.1  christos       && ! IDENT_CHAR (src[3]))
    824   1.1  christos     {
    825   1.1  christos       *mode = A_TBR;
    826   1.1  christos       return 3;
    827  1.10  christos     }
    828   1.1  christos   if (l0 == 'm' && l1 == 'a' && TOLOWER (src[2]) == 'c'
    829   1.1  christos       && ! IDENT_CHAR (src[4]))
    830   1.1  christos     {
    831   1.1  christos       if (TOLOWER (src[3]) == 'l')
    832   1.1  christos 	{
    833   1.1  christos 	  *mode = A_MACL;
    834   1.1  christos 	  return 4;
    835   1.1  christos 	}
    836   1.1  christos       if (TOLOWER (src[3]) == 'h')
    837   1.1  christos 	{
    838   1.1  christos 	  *mode = A_MACH;
    839   1.1  christos 	  return 4;
    840   1.1  christos 	}
    841  1.10  christos     }
    842   1.1  christos   if (l0 == 'm' && l1 == 'o' && TOLOWER (src[2]) == 'd'
    843   1.1  christos       && ! IDENT_CHAR (src[3]))
    844   1.1  christos     {
    845   1.1  christos       *mode = A_MOD;
    846   1.1  christos       return 3;
    847   1.1  christos     }
    848   1.1  christos   if (l0 == 'f' && l1 == 'r')
    849   1.1  christos     {
    850   1.1  christos       if (src[2] == '1')
    851  1.10  christos 	{
    852   1.1  christos 	  if (src[3] >= '0' && src[3] <= '5'
    853   1.1  christos 	      && ! IDENT_CHAR (src[4]))
    854   1.1  christos 	    {
    855   1.1  christos 	      *mode = F_REG_N;
    856   1.1  christos 	      *reg = 10 + src[3] - '0';
    857   1.1  christos 	      return 4;
    858   1.1  christos 	    }
    859  1.10  christos 	}
    860   1.1  christos       if (src[2] >= '0' && src[2] <= '9'
    861   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    862   1.1  christos 	{
    863   1.1  christos 	  *mode = F_REG_N;
    864   1.1  christos 	  *reg = (src[2] - '0');
    865   1.1  christos 	  return 3;
    866   1.1  christos 	}
    867   1.1  christos     }
    868   1.1  christos   if (l0 == 'd' && l1 == 'r')
    869   1.1  christos     {
    870   1.1  christos       if (src[2] == '1')
    871  1.10  christos 	{
    872   1.1  christos 	  if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
    873   1.1  christos 	      && ! IDENT_CHAR (src[4]))
    874   1.1  christos 	    {
    875   1.1  christos 	      *mode = D_REG_N;
    876   1.1  christos 	      *reg = 10 + src[3] - '0';
    877   1.1  christos 	      return 4;
    878   1.1  christos 	    }
    879  1.10  christos 	}
    880   1.1  christos       if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
    881   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    882   1.1  christos 	{
    883   1.1  christos 	  *mode = D_REG_N;
    884   1.1  christos 	  *reg = (src[2] - '0');
    885   1.1  christos 	  return 3;
    886   1.1  christos 	}
    887   1.1  christos     }
    888   1.1  christos   if (l0 == 'x' && l1 == 'd')
    889   1.1  christos     {
    890   1.1  christos       if (src[2] == '1')
    891  1.10  christos 	{
    892   1.1  christos 	  if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
    893   1.1  christos 	      && ! IDENT_CHAR (src[4]))
    894   1.1  christos 	    {
    895   1.1  christos 	      *mode = X_REG_N;
    896   1.1  christos 	      *reg = 11 + src[3] - '0';
    897   1.1  christos 	      return 4;
    898   1.1  christos 	    }
    899  1.10  christos 	}
    900   1.1  christos       if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
    901   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    902   1.1  christos 	{
    903   1.1  christos 	  *mode = X_REG_N;
    904   1.1  christos 	  *reg = (src[2] - '0') + 1;
    905   1.1  christos 	  return 3;
    906   1.1  christos 	}
    907   1.1  christos     }
    908  1.10  christos   if (l0 == 'f' && l1 == 'v')
    909   1.1  christos     {
    910   1.1  christos       if (src[2] == '1'&& src[3] == '2' && ! IDENT_CHAR (src[4]))
    911   1.1  christos 	{
    912   1.1  christos 	  *mode = V_REG_N;
    913   1.1  christos 	  *reg = 12;
    914   1.1  christos 	  return 4;
    915  1.10  christos 	}
    916   1.1  christos       if ((src[2] == '0' || src[2] == '4' || src[2] == '8')
    917   1.1  christos 	  && ! IDENT_CHAR (src[3]))
    918   1.1  christos 	{
    919   1.1  christos 	  *mode = V_REG_N;
    920   1.1  christos 	  *reg = (src[2] - '0');
    921   1.1  christos 	  return 3;
    922   1.1  christos 	}
    923   1.1  christos     }
    924  1.10  christos   if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 'u'
    925   1.1  christos       && TOLOWER (src[3]) == 'l'
    926   1.1  christos       && ! IDENT_CHAR (src[4]))
    927   1.1  christos     {
    928   1.1  christos       *mode = FPUL_N;
    929   1.1  christos       return 4;
    930   1.1  christos     }
    931   1.1  christos 
    932  1.10  christos   if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 's'
    933   1.1  christos       && TOLOWER (src[3]) == 'c'
    934   1.1  christos       && TOLOWER (src[4]) == 'r' && ! IDENT_CHAR (src[5]))
    935   1.1  christos     {
    936   1.1  christos       *mode = FPSCR_N;
    937   1.1  christos       return 5;
    938   1.1  christos     }
    939   1.1  christos 
    940  1.10  christos   if (l0 == 'x' && l1 == 'm' && TOLOWER (src[2]) == 't'
    941   1.1  christos       && TOLOWER (src[3]) == 'r'
    942   1.1  christos       && TOLOWER (src[4]) == 'x' && ! IDENT_CHAR (src[5]))
    943   1.1  christos     {
    944   1.1  christos       *mode = XMTRX_M4;
    945   1.1  christos       return 5;
    946   1.1  christos     }
    947   1.1  christos 
    948   1.1  christos   return 0;
    949   1.1  christos }
    950   1.1  christos 
    951   1.1  christos /* Like parse_reg_without_prefix, but this version supports
    952   1.1  christos    $-prefixed register names if enabled by the user.  */
    953   1.5  christos 
    954   1.1  christos static unsigned int
    955   1.1  christos parse_reg (char *src, sh_arg_type *mode, int *reg)
    956   1.1  christos {
    957   1.1  christos   unsigned int prefix;
    958   1.1  christos   unsigned int consumed;
    959   1.1  christos 
    960   1.1  christos   if (src[0] == '$')
    961   1.1  christos     {
    962   1.1  christos       if (allow_dollar_register_prefix)
    963   1.1  christos 	{
    964   1.1  christos 	  src ++;
    965   1.1  christos 	  prefix = 1;
    966   1.1  christos 	}
    967   1.1  christos       else
    968   1.1  christos 	return 0;
    969   1.1  christos     }
    970   1.3  christos   else
    971   1.1  christos     prefix = 0;
    972   1.1  christos 
    973   1.1  christos   consumed = parse_reg_without_prefix (src, mode, reg);
    974   1.1  christos 
    975   1.1  christos   if (consumed == 0)
    976   1.1  christos     return 0;
    977   1.1  christos 
    978   1.1  christos   return consumed + prefix;
    979   1.1  christos }
    980   1.1  christos 
    981   1.1  christos static char *
    982   1.1  christos parse_exp (char *s, sh_operand_info *op)
    983   1.1  christos {
    984   1.1  christos   char *save;
    985   1.1  christos   char *new_pointer;
    986   1.1  christos 
    987   1.1  christos   save = input_line_pointer;
    988   1.1  christos   input_line_pointer = s;
    989   1.1  christos   expression (&op->immediate);
    990   1.1  christos   if (op->immediate.X_op == O_absent)
    991   1.1  christos     as_bad (_("missing operand"));
    992   1.1  christos   new_pointer = input_line_pointer;
    993   1.1  christos   input_line_pointer = save;
    994   1.1  christos   return new_pointer;
    995   1.1  christos }
    996   1.1  christos 
    997   1.1  christos /* The many forms of operand:
    998   1.1  christos 
    999   1.1  christos    Rn                   Register direct
   1000   1.1  christos    @Rn                  Register indirect
   1001   1.1  christos    @Rn+                 Autoincrement
   1002   1.1  christos    @-Rn                 Autodecrement
   1003   1.1  christos    @(disp:4,Rn)
   1004   1.1  christos    @(disp:8,GBR)
   1005   1.1  christos    @(disp:8,PC)
   1006   1.1  christos 
   1007   1.1  christos    @(R0,Rn)
   1008   1.1  christos    @(R0,GBR)
   1009   1.1  christos 
   1010   1.1  christos    disp:8
   1011   1.1  christos    disp:12
   1012   1.1  christos    #imm8
   1013   1.1  christos    pr, gbr, vbr, macl, mach
   1014   1.1  christos  */
   1015   1.1  christos 
   1016   1.1  christos static char *
   1017   1.1  christos parse_at (char *src, sh_operand_info *op)
   1018   1.5  christos {
   1019   1.1  christos   int len;
   1020   1.1  christos   sh_arg_type mode;
   1021   1.1  christos   src++;
   1022   1.1  christos   if (src[0] == '@')
   1023   1.1  christos     {
   1024   1.1  christos       src = parse_at (src, op);
   1025   1.1  christos       if (op->type == A_DISP_TBR)
   1026   1.1  christos 	op->type = A_DISP2_TBR;
   1027   1.1  christos       else
   1028   1.1  christos 	as_bad (_("illegal double indirection"));
   1029   1.1  christos     }
   1030   1.1  christos   else if (src[0] == '-')
   1031   1.1  christos     {
   1032   1.1  christos       /* Must be predecrement.  */
   1033   1.1  christos       src++;
   1034   1.1  christos 
   1035   1.1  christos       len = parse_reg (src, &mode, &(op->reg));
   1036   1.1  christos       if (mode != A_REG_N)
   1037   1.1  christos 	as_bad (_("illegal register after @-"));
   1038   1.1  christos 
   1039   1.1  christos       op->type = A_DEC_N;
   1040   1.1  christos       src += len;
   1041   1.1  christos     }
   1042   1.1  christos   else if (src[0] == '(')
   1043   1.1  christos     {
   1044   1.1  christos       /* Could be @(disp, rn), @(disp, gbr), @(disp, pc),  @(r0, gbr) or
   1045   1.1  christos          @(r0, rn).  */
   1046   1.1  christos       src++;
   1047   1.1  christos       len = parse_reg (src, &mode, &(op->reg));
   1048   1.1  christos       if (len && mode == A_REG_N)
   1049   1.1  christos 	{
   1050   1.1  christos 	  src += len;
   1051   1.1  christos 	  if (op->reg != 0)
   1052   1.1  christos 	    {
   1053   1.1  christos 	      as_bad (_("must be @(r0,...)"));
   1054   1.1  christos 	    }
   1055   1.1  christos 	  if (src[0] == ',')
   1056   1.1  christos 	    {
   1057   1.1  christos 	      src++;
   1058   1.1  christos 	      /* Now can be rn or gbr.  */
   1059   1.1  christos 	      len = parse_reg (src, &mode, &(op->reg));
   1060   1.1  christos 	    }
   1061   1.1  christos 	  else
   1062   1.1  christos 	    {
   1063   1.1  christos 	      len = 0;
   1064   1.1  christos 	    }
   1065   1.1  christos 	  if (len)
   1066   1.1  christos 	    {
   1067   1.1  christos 	      if (mode == A_GBR)
   1068   1.1  christos 		{
   1069   1.1  christos 		  op->type = A_R0_GBR;
   1070   1.1  christos 		}
   1071   1.1  christos 	      else if (mode == A_REG_N)
   1072   1.1  christos 		{
   1073   1.1  christos 		  op->type = A_IND_R0_REG_N;
   1074   1.1  christos 		}
   1075   1.1  christos 	      else
   1076   1.1  christos 		{
   1077   1.1  christos 		  as_bad (_("syntax error in @(r0,...)"));
   1078   1.1  christos 		}
   1079   1.1  christos 	    }
   1080   1.1  christos 	  else
   1081   1.1  christos 	    {
   1082   1.1  christos 	      as_bad (_("syntax error in @(r0...)"));
   1083   1.1  christos 	    }
   1084   1.1  christos 	}
   1085   1.1  christos       else
   1086   1.1  christos 	{
   1087   1.1  christos 	  /* Must be an @(disp,.. thing).  */
   1088   1.1  christos 	  src = parse_exp (src, op);
   1089   1.1  christos 	  if (src[0] == ',')
   1090   1.1  christos 	    src++;
   1091   1.1  christos 	  /* Now can be rn, gbr or pc.  */
   1092   1.1  christos 	  len = parse_reg (src, &mode, &op->reg);
   1093   1.1  christos 	  if (len)
   1094   1.1  christos 	    {
   1095   1.1  christos 	      if (mode == A_REG_N)
   1096   1.1  christos 		{
   1097   1.1  christos 		  op->type = A_DISP_REG_N;
   1098   1.1  christos 		}
   1099   1.1  christos 	      else if (mode == A_GBR)
   1100   1.1  christos 		{
   1101   1.1  christos 		  op->type = A_DISP_GBR;
   1102   1.1  christos 		}
   1103   1.1  christos 	      else if (mode == A_TBR)
   1104   1.1  christos 		{
   1105   1.1  christos 		  op->type = A_DISP_TBR;
   1106   1.1  christos 		}
   1107   1.1  christos 	      else if (mode == A_PC)
   1108   1.1  christos 		{
   1109   1.1  christos 		  /* We want @(expr, pc) to uniformly address . + expr,
   1110   1.1  christos 		     no matter if expr is a constant, or a more complex
   1111   1.1  christos 		     expression, e.g. sym-. or sym1-sym2.
   1112   1.1  christos 		     However, we also used to accept @(sym,pc)
   1113   1.1  christos 		     as addressing sym, i.e. meaning the same as plain sym.
   1114   1.1  christos 		     Some existing code does use the @(sym,pc) syntax, so
   1115   1.1  christos 		     we give it the old semantics for now, but warn about
   1116   1.1  christos 		     its use, so that users have some time to fix their code.
   1117   1.1  christos 
   1118   1.1  christos 		     Note that due to this backward compatibility hack,
   1119   1.1  christos 		     we'll get unexpected results when @(offset, pc) is used,
   1120   1.1  christos 		     and offset is a symbol that is set later to an an address
   1121   1.1  christos 		     difference, or an external symbol that is set to an
   1122   1.1  christos 		     address difference in another source file, so we want to
   1123   1.1  christos 		     eventually remove it.  */
   1124   1.1  christos 		  if (op->immediate.X_op == O_symbol)
   1125   1.1  christos 		    {
   1126   1.1  christos 		      op->type = A_DISP_PC;
   1127   1.1  christos 		      as_warn (_("Deprecated syntax."));
   1128   1.1  christos 		    }
   1129   1.1  christos 		  else
   1130   1.1  christos 		    {
   1131   1.1  christos 		      op->type = A_DISP_PC_ABS;
   1132   1.1  christos 		      /* Such operands don't get corrected for PC==.+4, so
   1133   1.1  christos 			 make the correction here.  */
   1134   1.1  christos 		      op->immediate.X_add_number -= 4;
   1135   1.1  christos 		    }
   1136   1.1  christos 		}
   1137   1.1  christos 	      else
   1138   1.1  christos 		{
   1139   1.1  christos 		  as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
   1140   1.1  christos 		}
   1141   1.1  christos 	    }
   1142   1.1  christos 	  else
   1143   1.1  christos 	    {
   1144   1.1  christos 	      as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
   1145   1.1  christos 	    }
   1146   1.1  christos 	}
   1147   1.1  christos       src += len;
   1148   1.1  christos       if (src[0] != ')')
   1149   1.1  christos 	as_bad (_("expecting )"));
   1150   1.1  christos       else
   1151   1.1  christos 	src++;
   1152   1.1  christos     }
   1153   1.1  christos   else
   1154   1.1  christos     {
   1155   1.1  christos       src += parse_reg (src, &mode, &(op->reg));
   1156   1.1  christos       if (mode != A_REG_N)
   1157   1.1  christos 	as_bad (_("illegal register after @"));
   1158   1.1  christos 
   1159   1.1  christos       if (src[0] == '+')
   1160   1.1  christos 	{
   1161   1.1  christos 	  char l0, l1;
   1162   1.1  christos 
   1163   1.1  christos 	  src++;
   1164   1.1  christos 	  l0 = TOLOWER (src[0]);
   1165   1.1  christos 	  l1 = TOLOWER (src[1]);
   1166   1.1  christos 
   1167   1.1  christos 	  if ((l0 == 'r' && l1 == '8')
   1168   1.1  christos 	      || (l0 == 'i' && (l1 == 'x' || l1 == 's')))
   1169   1.1  christos 	    {
   1170   1.1  christos 	      src += 2;
   1171   1.1  christos 	      op->type = AX_PMOD_N;
   1172   1.1  christos 	    }
   1173   1.1  christos 	  else if (   (l0 == 'r' && l1 == '9')
   1174   1.1  christos 		   || (l0 == 'i' && l1 == 'y'))
   1175   1.1  christos 	    {
   1176   1.1  christos 	      src += 2;
   1177   1.1  christos 	      op->type = AY_PMOD_N;
   1178   1.1  christos 	    }
   1179   1.1  christos 	  else
   1180   1.1  christos 	    op->type = A_INC_N;
   1181   1.1  christos 	}
   1182   1.1  christos       else
   1183   1.1  christos 	op->type = A_IND_N;
   1184   1.1  christos     }
   1185   1.1  christos   return src;
   1186   1.1  christos }
   1187   1.1  christos 
   1188   1.1  christos static void
   1189   1.1  christos get_operand (char **ptr, sh_operand_info *op)
   1190   1.5  christos {
   1191   1.1  christos   char *src = *ptr;
   1192   1.1  christos   sh_arg_type mode = (sh_arg_type) -1;
   1193   1.1  christos   unsigned int len;
   1194   1.1  christos 
   1195   1.1  christos   if (src[0] == '#')
   1196   1.1  christos     {
   1197   1.1  christos       src++;
   1198   1.1  christos       *ptr = parse_exp (src, op);
   1199   1.1  christos       op->type = A_IMM;
   1200   1.1  christos       return;
   1201   1.1  christos     }
   1202   1.1  christos 
   1203   1.1  christos   else if (src[0] == '@')
   1204   1.1  christos     {
   1205   1.1  christos       *ptr = parse_at (src, op);
   1206   1.1  christos       return;
   1207   1.1  christos     }
   1208   1.1  christos   len = parse_reg (src, &mode, &(op->reg));
   1209   1.1  christos   if (len)
   1210   1.1  christos     {
   1211   1.1  christos       *ptr = src + len;
   1212   1.1  christos       op->type = mode;
   1213   1.1  christos       return;
   1214   1.1  christos     }
   1215   1.1  christos   else
   1216   1.1  christos     {
   1217   1.1  christos       /* Not a reg, the only thing left is a displacement.  */
   1218   1.1  christos       *ptr = parse_exp (src, op);
   1219   1.1  christos       op->type = A_DISP_PC;
   1220   1.1  christos       return;
   1221   1.1  christos     }
   1222   1.1  christos }
   1223   1.1  christos 
   1224   1.1  christos static char *
   1225   1.1  christos get_operands (sh_opcode_info *info, char *args, sh_operand_info *operand)
   1226   1.9  christos {
   1227   1.9  christos   char *ptr = args;
   1228   1.9  christos 
   1229   1.9  christos   operand[0].type = 0;
   1230   1.1  christos   operand[1].type = 0;
   1231   1.1  christos   operand[2].type = 0;
   1232   1.1  christos   if (info->arg[0])
   1233   1.1  christos     {
   1234   1.1  christos       /* The pre-processor will eliminate whitespace in front of '@'
   1235  1.10  christos 	 after the first argument; we may be called multiple times
   1236   1.1  christos 	 from assemble_ppi, so don't insist on finding whitespace here.  */
   1237   1.1  christos       if (is_whitespace (*ptr))
   1238   1.1  christos 	ptr++;
   1239   1.1  christos 
   1240   1.1  christos       get_operand (&ptr, operand + 0);
   1241   1.1  christos       if (info->arg[1])
   1242   1.9  christos 	{
   1243   1.1  christos 	  if (*ptr == ',')
   1244   1.1  christos 	    ptr++;
   1245   1.1  christos 	  get_operand (&ptr, operand + 1);
   1246   1.1  christos 	  /* ??? Hack: psha/pshl have a varying operand number depending on
   1247   1.1  christos 	     the type of the first operand.  We handle this by having the
   1248   1.1  christos 	     three-operand version first and reducing the number of operands
   1249   1.1  christos 	     parsed to two if we see that the first operand is an immediate.
   1250   1.1  christos              This works because no insn with three operands has an immediate
   1251   1.1  christos 	     as first operand.  */
   1252   1.1  christos 	  if (info->arg[2] && operand[0].type != A_IMM)
   1253   1.9  christos 	    {
   1254   1.1  christos 	      if (*ptr == ',')
   1255   1.1  christos 		ptr++;
   1256   1.1  christos 	      get_operand (&ptr, operand + 2);
   1257   1.1  christos 	    }
   1258   1.1  christos 	}
   1259   1.1  christos     }
   1260   1.1  christos   return ptr;
   1261   1.1  christos }
   1262   1.1  christos 
   1263   1.1  christos /* Passed a pointer to a list of opcodes which use different
   1264   1.1  christos    addressing modes, return the opcode which matches the opcodes
   1265   1.1  christos    provided.  */
   1266   1.1  christos 
   1267   1.1  christos static sh_opcode_info *
   1268   1.1  christos get_specific (sh_opcode_info *opcode, sh_operand_info *operands)
   1269   1.5  christos {
   1270   1.1  christos   sh_opcode_info *this_try = opcode;
   1271   1.1  christos   const char *name = opcode->name;
   1272   1.1  christos   int n = 0;
   1273   1.1  christos 
   1274   1.1  christos   while (opcode->name)
   1275   1.1  christos     {
   1276   1.1  christos       this_try = opcode++;
   1277   1.1  christos       if ((this_try->name != name) && (strcmp (this_try->name, name) != 0))
   1278   1.1  christos 	{
   1279   1.1  christos 	  /* We've looked so far down the table that we've run out of
   1280   1.1  christos 	     opcodes with the same name.  */
   1281   1.1  christos 	  return 0;
   1282   1.1  christos 	}
   1283   1.1  christos 
   1284   1.1  christos       /* Look at both operands needed by the opcodes and provided by
   1285   1.1  christos          the user - since an arg test will often fail on the same arg
   1286   1.1  christos          again and again, we'll try and test the last failing arg the
   1287   1.1  christos          first on each opcode try.  */
   1288   1.1  christos       for (n = 0; this_try->arg[n]; n++)
   1289   1.1  christos 	{
   1290   1.1  christos 	  sh_operand_info *user = operands + n;
   1291   1.1  christos 	  sh_arg_type arg = this_try->arg[n];
   1292   1.1  christos 
   1293   1.1  christos 	  switch (arg)
   1294   1.1  christos 	    {
   1295   1.1  christos 	    case A_DISP_PC:
   1296   1.1  christos 	      if (user->type == A_DISP_PC_ABS)
   1297   1.1  christos 		break;
   1298   1.1  christos 	      /* Fall through.  */
   1299   1.1  christos 	    case A_IMM:
   1300   1.1  christos 	    case A_BDISP12:
   1301   1.1  christos 	    case A_BDISP8:
   1302   1.1  christos 	    case A_DISP_GBR:
   1303   1.1  christos 	    case A_DISP2_TBR:
   1304   1.1  christos 	    case A_MACH:
   1305   1.1  christos 	    case A_PR:
   1306   1.1  christos 	    case A_MACL:
   1307   1.1  christos 	      if (user->type != arg)
   1308   1.1  christos 		goto fail;
   1309   1.1  christos 	      break;
   1310   1.1  christos 	    case A_R0:
   1311   1.1  christos 	      /* opcode needs r0 */
   1312   1.1  christos 	      if (user->type != A_REG_N || user->reg != 0)
   1313   1.1  christos 		goto fail;
   1314   1.1  christos 	      break;
   1315   1.1  christos 	    case A_R0_GBR:
   1316   1.1  christos 	      if (user->type != A_R0_GBR || user->reg != 0)
   1317   1.1  christos 		goto fail;
   1318   1.1  christos 	      break;
   1319   1.1  christos 	    case F_FR0:
   1320   1.1  christos 	      if (user->type != F_REG_N || user->reg != 0)
   1321   1.1  christos 		goto fail;
   1322   1.1  christos 	      break;
   1323   1.1  christos 
   1324   1.1  christos 	    case A_REG_N:
   1325   1.1  christos 	    case A_INC_N:
   1326   1.1  christos 	    case A_DEC_N:
   1327   1.1  christos 	    case A_IND_N:
   1328   1.1  christos 	    case A_IND_R0_REG_N:
   1329   1.1  christos 	    case A_DISP_REG_N:
   1330   1.1  christos 	    case F_REG_N:
   1331   1.1  christos 	    case D_REG_N:
   1332   1.1  christos 	    case X_REG_N:
   1333   1.1  christos 	    case V_REG_N:
   1334   1.1  christos 	    case FPUL_N:
   1335   1.1  christos 	    case FPSCR_N:
   1336   1.1  christos 	    case DSP_REG_N:
   1337   1.1  christos 	      /* Opcode needs rn */
   1338   1.1  christos 	      if (user->type != arg)
   1339   1.1  christos 		goto fail;
   1340   1.1  christos 	      reg_n = user->reg;
   1341   1.1  christos 	      break;
   1342   1.1  christos 	    case DX_REG_N:
   1343   1.1  christos 	      if (user->type != D_REG_N && user->type != X_REG_N)
   1344   1.1  christos 		goto fail;
   1345   1.1  christos 	      reg_n = user->reg;
   1346   1.1  christos 	      break;
   1347   1.1  christos 	    case A_GBR:
   1348   1.1  christos 	    case A_TBR:
   1349   1.1  christos 	    case A_SR:
   1350   1.1  christos 	    case A_VBR:
   1351   1.1  christos 	    case A_DSR:
   1352   1.1  christos 	    case A_MOD:
   1353   1.1  christos 	    case A_RE:
   1354   1.1  christos 	    case A_RS:
   1355   1.1  christos 	    case A_SSR:
   1356   1.1  christos 	    case A_SPC:
   1357   1.1  christos 	    case A_SGR:
   1358   1.1  christos 	    case A_DBR:
   1359   1.1  christos 	      if (user->type != arg)
   1360   1.1  christos 		goto fail;
   1361   1.1  christos 	      break;
   1362   1.1  christos 
   1363   1.1  christos 	    case A_REG_B:
   1364   1.1  christos 	      if (user->type != arg)
   1365   1.1  christos 		goto fail;
   1366   1.1  christos 	      reg_b = user->reg;
   1367   1.1  christos 	      break;
   1368   1.1  christos 
   1369   1.1  christos 	    case A_INC_R15:
   1370   1.1  christos 	      if (user->type != A_INC_N)
   1371   1.1  christos 		goto fail;
   1372   1.1  christos 	      if (user->reg != 15)
   1373   1.1  christos 		goto fail;
   1374   1.1  christos 	      reg_n = user->reg;
   1375   1.1  christos 	      break;
   1376   1.1  christos 
   1377   1.1  christos 	    case A_DEC_R15:
   1378   1.1  christos 	      if (user->type != A_DEC_N)
   1379   1.1  christos 		goto fail;
   1380   1.1  christos 	      if (user->reg != 15)
   1381   1.1  christos 		goto fail;
   1382   1.1  christos 	      reg_n = user->reg;
   1383   1.1  christos 	      break;
   1384   1.1  christos 
   1385   1.1  christos 	    case A_REG_M:
   1386   1.1  christos 	    case A_INC_M:
   1387   1.1  christos 	    case A_DEC_M:
   1388   1.1  christos 	    case A_IND_M:
   1389   1.1  christos 	    case A_IND_R0_REG_M:
   1390   1.1  christos 	    case A_DISP_REG_M:
   1391   1.1  christos 	    case DSP_REG_M:
   1392   1.1  christos 	      /* Opcode needs rn */
   1393   1.1  christos 	      if (user->type != arg - A_REG_M + A_REG_N)
   1394   1.1  christos 		goto fail;
   1395   1.1  christos 	      reg_m = user->reg;
   1396   1.1  christos 	      break;
   1397   1.1  christos 
   1398   1.1  christos 	    case AS_DEC_N:
   1399   1.1  christos 	      if (user->type != A_DEC_N)
   1400   1.1  christos 		goto fail;
   1401   1.1  christos 	      if (user->reg < 2 || user->reg > 5)
   1402   1.1  christos 		goto fail;
   1403   1.1  christos 	      reg_n = user->reg;
   1404   1.1  christos 	      break;
   1405   1.1  christos 
   1406   1.1  christos 	    case AS_INC_N:
   1407   1.1  christos 	      if (user->type != A_INC_N)
   1408   1.1  christos 		goto fail;
   1409   1.1  christos 	      if (user->reg < 2 || user->reg > 5)
   1410   1.1  christos 		goto fail;
   1411   1.1  christos 	      reg_n = user->reg;
   1412   1.1  christos 	      break;
   1413   1.1  christos 
   1414   1.1  christos 	    case AS_IND_N:
   1415   1.1  christos 	      if (user->type != A_IND_N)
   1416   1.1  christos 		goto fail;
   1417   1.1  christos 	      if (user->reg < 2 || user->reg > 5)
   1418   1.1  christos 		goto fail;
   1419   1.1  christos 	      reg_n = user->reg;
   1420   1.1  christos 	      break;
   1421   1.1  christos 
   1422   1.1  christos 	    case AS_PMOD_N:
   1423   1.1  christos 	      if (user->type != AX_PMOD_N)
   1424   1.1  christos 		goto fail;
   1425   1.1  christos 	      if (user->reg < 2 || user->reg > 5)
   1426   1.1  christos 		goto fail;
   1427   1.1  christos 	      reg_n = user->reg;
   1428   1.1  christos 	      break;
   1429   1.1  christos 
   1430   1.1  christos 	    case AX_INC_N:
   1431   1.1  christos 	      if (user->type != A_INC_N)
   1432   1.1  christos 		goto fail;
   1433   1.1  christos 	      if (user->reg < 4 || user->reg > 5)
   1434   1.1  christos 		goto fail;
   1435   1.1  christos 	      reg_n = user->reg;
   1436   1.1  christos 	      break;
   1437   1.1  christos 
   1438   1.1  christos 	    case AX_IND_N:
   1439   1.1  christos 	      if (user->type != A_IND_N)
   1440   1.1  christos 		goto fail;
   1441   1.1  christos 	      if (user->reg < 4 || user->reg > 5)
   1442   1.1  christos 		goto fail;
   1443   1.1  christos 	      reg_n = user->reg;
   1444   1.1  christos 	      break;
   1445   1.1  christos 
   1446   1.1  christos 	    case AX_PMOD_N:
   1447   1.1  christos 	      if (user->type != AX_PMOD_N)
   1448   1.1  christos 		goto fail;
   1449   1.1  christos 	      if (user->reg < 4 || user->reg > 5)
   1450   1.1  christos 		goto fail;
   1451   1.1  christos 	      reg_n = user->reg;
   1452   1.1  christos 	      break;
   1453   1.1  christos 
   1454   1.1  christos 	    case AXY_INC_N:
   1455   1.1  christos 	      if (user->type != A_INC_N)
   1456   1.1  christos 		goto fail;
   1457   1.1  christos 	      if ((user->reg < 4 || user->reg > 5)
   1458   1.1  christos 		  && (user->reg < 0 || user->reg > 1))
   1459   1.1  christos 		goto fail;
   1460   1.1  christos 	      reg_n = user->reg;
   1461   1.1  christos 	      break;
   1462   1.1  christos 
   1463   1.1  christos 	    case AXY_IND_N:
   1464   1.1  christos 	      if (user->type != A_IND_N)
   1465   1.1  christos 		goto fail;
   1466   1.1  christos 	      if ((user->reg < 4 || user->reg > 5)
   1467   1.1  christos 		  && (user->reg < 0 || user->reg > 1))
   1468   1.1  christos 		goto fail;
   1469   1.1  christos 	      reg_n = user->reg;
   1470   1.1  christos 	      break;
   1471   1.1  christos 
   1472   1.1  christos 	    case AXY_PMOD_N:
   1473   1.1  christos 	      if (user->type != AX_PMOD_N)
   1474   1.1  christos 		goto fail;
   1475   1.1  christos 	      if ((user->reg < 4 || user->reg > 5)
   1476   1.1  christos 		  && (user->reg < 0 || user->reg > 1))
   1477   1.1  christos 		goto fail;
   1478   1.1  christos 	      reg_n = user->reg;
   1479   1.1  christos 	      break;
   1480   1.1  christos 
   1481   1.1  christos 	    case AY_INC_N:
   1482   1.1  christos 	      if (user->type != A_INC_N)
   1483   1.1  christos 		goto fail;
   1484   1.1  christos 	      if (user->reg < 6 || user->reg > 7)
   1485   1.1  christos 		goto fail;
   1486   1.1  christos 	      reg_n = user->reg;
   1487   1.1  christos 	      break;
   1488   1.1  christos 
   1489   1.1  christos 	    case AY_IND_N:
   1490   1.1  christos 	      if (user->type != A_IND_N)
   1491   1.1  christos 		goto fail;
   1492   1.1  christos 	      if (user->reg < 6 || user->reg > 7)
   1493   1.1  christos 		goto fail;
   1494   1.1  christos 	      reg_n = user->reg;
   1495   1.1  christos 	      break;
   1496   1.1  christos 
   1497   1.1  christos 	    case AY_PMOD_N:
   1498   1.1  christos 	      if (user->type != AY_PMOD_N)
   1499   1.1  christos 		goto fail;
   1500   1.1  christos 	      if (user->reg < 6 || user->reg > 7)
   1501   1.1  christos 		goto fail;
   1502   1.1  christos 	      reg_n = user->reg;
   1503   1.1  christos 	      break;
   1504   1.1  christos 
   1505   1.1  christos 	    case AYX_INC_N:
   1506   1.1  christos 	      if (user->type != A_INC_N)
   1507   1.1  christos 		goto fail;
   1508   1.1  christos 	      if ((user->reg < 6 || user->reg > 7)
   1509   1.1  christos 		  && (user->reg < 2 || user->reg > 3))
   1510   1.1  christos 		goto fail;
   1511   1.1  christos 	      reg_n = user->reg;
   1512   1.1  christos 	      break;
   1513   1.1  christos 
   1514   1.1  christos 	    case AYX_IND_N:
   1515   1.1  christos 	      if (user->type != A_IND_N)
   1516   1.1  christos 		goto fail;
   1517   1.1  christos 	      if ((user->reg < 6 || user->reg > 7)
   1518   1.1  christos 		  && (user->reg < 2 || user->reg > 3))
   1519   1.1  christos 		goto fail;
   1520   1.1  christos 	      reg_n = user->reg;
   1521   1.1  christos 	      break;
   1522   1.1  christos 
   1523   1.1  christos 	    case AYX_PMOD_N:
   1524   1.1  christos 	      if (user->type != AY_PMOD_N)
   1525   1.1  christos 		goto fail;
   1526   1.1  christos 	      if ((user->reg < 6 || user->reg > 7)
   1527   1.1  christos 		  && (user->reg < 2 || user->reg > 3))
   1528   1.1  christos 		goto fail;
   1529   1.1  christos 	      reg_n = user->reg;
   1530   1.1  christos 	      break;
   1531   1.1  christos 
   1532   1.1  christos 	    case DSP_REG_A_M:
   1533   1.1  christos 	      if (user->type != DSP_REG_N)
   1534   1.1  christos 		goto fail;
   1535   1.1  christos 	      if (user->reg != A_A0_NUM
   1536   1.1  christos 		  && user->reg != A_A1_NUM)
   1537   1.1  christos 		goto fail;
   1538   1.1  christos 	      reg_m = user->reg;
   1539   1.1  christos 	      break;
   1540   1.1  christos 
   1541   1.1  christos 	    case DSP_REG_AX:
   1542   1.1  christos 	      if (user->type != DSP_REG_N)
   1543   1.1  christos 		goto fail;
   1544   1.1  christos 	      switch (user->reg)
   1545   1.1  christos 		{
   1546   1.1  christos 		case A_A0_NUM:
   1547   1.1  christos 		  reg_x = 0;
   1548   1.1  christos 		  break;
   1549   1.1  christos 		case A_A1_NUM:
   1550   1.1  christos 		  reg_x = 2;
   1551   1.1  christos 		  break;
   1552   1.1  christos 		case A_X0_NUM:
   1553   1.1  christos 		  reg_x = 1;
   1554   1.1  christos 		  break;
   1555   1.1  christos 		case A_X1_NUM:
   1556   1.1  christos 		  reg_x = 3;
   1557   1.1  christos 		  break;
   1558   1.1  christos 		default:
   1559   1.1  christos 		  goto fail;
   1560   1.1  christos 		}
   1561   1.1  christos 	      break;
   1562   1.1  christos 
   1563   1.1  christos 	    case DSP_REG_XY:
   1564   1.1  christos 	      if (user->type != DSP_REG_N)
   1565   1.1  christos 		goto fail;
   1566   1.1  christos 	      switch (user->reg)
   1567   1.1  christos 		{
   1568   1.1  christos 		case A_X0_NUM:
   1569   1.1  christos 		  reg_x = 0;
   1570   1.1  christos 		  break;
   1571   1.1  christos 		case A_X1_NUM:
   1572   1.1  christos 		  reg_x = 2;
   1573   1.1  christos 		  break;
   1574   1.1  christos 		case A_Y0_NUM:
   1575   1.1  christos 		  reg_x = 1;
   1576   1.1  christos 		  break;
   1577   1.1  christos 		case A_Y1_NUM:
   1578   1.1  christos 		  reg_x = 3;
   1579   1.1  christos 		  break;
   1580   1.1  christos 		default:
   1581   1.1  christos 		  goto fail;
   1582   1.1  christos 		}
   1583   1.1  christos 	      break;
   1584   1.1  christos 
   1585   1.1  christos 	    case DSP_REG_AY:
   1586   1.1  christos 	      if (user->type != DSP_REG_N)
   1587   1.1  christos 		goto fail;
   1588   1.1  christos 	      switch (user->reg)
   1589   1.1  christos 		{
   1590   1.1  christos 		case A_A0_NUM:
   1591   1.1  christos 		  reg_y = 0;
   1592   1.1  christos 		  break;
   1593   1.1  christos 		case A_A1_NUM:
   1594   1.1  christos 		  reg_y = 1;
   1595   1.1  christos 		  break;
   1596   1.1  christos 		case A_Y0_NUM:
   1597   1.1  christos 		  reg_y = 2;
   1598   1.1  christos 		  break;
   1599   1.1  christos 		case A_Y1_NUM:
   1600   1.1  christos 		  reg_y = 3;
   1601   1.1  christos 		  break;
   1602   1.1  christos 		default:
   1603   1.1  christos 		  goto fail;
   1604   1.1  christos 		}
   1605   1.1  christos 	      break;
   1606   1.1  christos 
   1607   1.1  christos 	    case DSP_REG_YX:
   1608   1.1  christos 	      if (user->type != DSP_REG_N)
   1609   1.1  christos 		goto fail;
   1610   1.1  christos 	      switch (user->reg)
   1611   1.1  christos 		{
   1612   1.1  christos 		case A_Y0_NUM:
   1613   1.1  christos 		  reg_y = 0;
   1614   1.1  christos 		  break;
   1615   1.1  christos 		case A_Y1_NUM:
   1616   1.1  christos 		  reg_y = 1;
   1617   1.1  christos 		  break;
   1618   1.1  christos 		case A_X0_NUM:
   1619   1.1  christos 		  reg_y = 2;
   1620   1.1  christos 		  break;
   1621   1.1  christos 		case A_X1_NUM:
   1622   1.1  christos 		  reg_y = 3;
   1623   1.1  christos 		  break;
   1624   1.1  christos 		default:
   1625   1.1  christos 		  goto fail;
   1626   1.1  christos 		}
   1627   1.1  christos 	      break;
   1628   1.1  christos 
   1629   1.1  christos 	    case DSP_REG_X:
   1630   1.1  christos 	      if (user->type != DSP_REG_N)
   1631   1.1  christos 		goto fail;
   1632   1.1  christos 	      switch (user->reg)
   1633   1.1  christos 		{
   1634   1.1  christos 		case A_X0_NUM:
   1635   1.1  christos 		  reg_x = 0;
   1636   1.1  christos 		  break;
   1637   1.1  christos 		case A_X1_NUM:
   1638   1.1  christos 		  reg_x = 1;
   1639   1.1  christos 		  break;
   1640   1.1  christos 		case A_A0_NUM:
   1641   1.1  christos 		  reg_x = 2;
   1642   1.1  christos 		  break;
   1643   1.1  christos 		case A_A1_NUM:
   1644   1.1  christos 		  reg_x = 3;
   1645   1.1  christos 		  break;
   1646   1.1  christos 		default:
   1647   1.1  christos 		  goto fail;
   1648   1.1  christos 		}
   1649   1.1  christos 	      break;
   1650   1.1  christos 
   1651   1.1  christos 	    case DSP_REG_Y:
   1652   1.1  christos 	      if (user->type != DSP_REG_N)
   1653   1.1  christos 		goto fail;
   1654   1.1  christos 	      switch (user->reg)
   1655   1.1  christos 		{
   1656   1.1  christos 		case A_Y0_NUM:
   1657   1.1  christos 		  reg_y = 0;
   1658   1.1  christos 		  break;
   1659   1.1  christos 		case A_Y1_NUM:
   1660   1.1  christos 		  reg_y = 1;
   1661   1.1  christos 		  break;
   1662   1.1  christos 		case A_M0_NUM:
   1663   1.1  christos 		  reg_y = 2;
   1664   1.1  christos 		  break;
   1665   1.1  christos 		case A_M1_NUM:
   1666   1.1  christos 		  reg_y = 3;
   1667   1.1  christos 		  break;
   1668   1.1  christos 		default:
   1669   1.1  christos 		  goto fail;
   1670   1.1  christos 		}
   1671   1.1  christos 	      break;
   1672   1.1  christos 
   1673   1.1  christos 	    case DSP_REG_E:
   1674   1.1  christos 	      if (user->type != DSP_REG_N)
   1675   1.1  christos 		goto fail;
   1676   1.1  christos 	      switch (user->reg)
   1677   1.1  christos 		{
   1678   1.1  christos 		case A_X0_NUM:
   1679   1.1  christos 		  reg_efg = 0 << 10;
   1680   1.1  christos 		  break;
   1681   1.1  christos 		case A_X1_NUM:
   1682   1.1  christos 		  reg_efg = 1 << 10;
   1683   1.1  christos 		  break;
   1684   1.1  christos 		case A_Y0_NUM:
   1685   1.1  christos 		  reg_efg = 2 << 10;
   1686   1.1  christos 		  break;
   1687   1.1  christos 		case A_A1_NUM:
   1688   1.1  christos 		  reg_efg = 3 << 10;
   1689   1.1  christos 		  break;
   1690   1.1  christos 		default:
   1691   1.1  christos 		  goto fail;
   1692   1.1  christos 		}
   1693   1.1  christos 	      break;
   1694   1.1  christos 
   1695   1.1  christos 	    case DSP_REG_F:
   1696   1.1  christos 	      if (user->type != DSP_REG_N)
   1697   1.1  christos 		goto fail;
   1698   1.1  christos 	      switch (user->reg)
   1699   1.1  christos 		{
   1700   1.1  christos 		case A_Y0_NUM:
   1701   1.1  christos 		  reg_efg |= 0 << 8;
   1702   1.1  christos 		  break;
   1703   1.1  christos 		case A_Y1_NUM:
   1704   1.1  christos 		  reg_efg |= 1 << 8;
   1705   1.1  christos 		  break;
   1706   1.1  christos 		case A_X0_NUM:
   1707   1.1  christos 		  reg_efg |= 2 << 8;
   1708   1.1  christos 		  break;
   1709   1.1  christos 		case A_A1_NUM:
   1710   1.1  christos 		  reg_efg |= 3 << 8;
   1711   1.1  christos 		  break;
   1712   1.1  christos 		default:
   1713   1.1  christos 		  goto fail;
   1714   1.1  christos 		}
   1715   1.1  christos 	      break;
   1716   1.1  christos 
   1717   1.1  christos 	    case DSP_REG_G:
   1718   1.1  christos 	      if (user->type != DSP_REG_N)
   1719   1.1  christos 		goto fail;
   1720   1.1  christos 	      switch (user->reg)
   1721   1.1  christos 		{
   1722   1.1  christos 		case A_M0_NUM:
   1723   1.1  christos 		  reg_efg |= 0 << 2;
   1724   1.1  christos 		  break;
   1725   1.1  christos 		case A_M1_NUM:
   1726   1.1  christos 		  reg_efg |= 1 << 2;
   1727   1.1  christos 		  break;
   1728   1.1  christos 		case A_A0_NUM:
   1729   1.1  christos 		  reg_efg |= 2 << 2;
   1730   1.1  christos 		  break;
   1731   1.1  christos 		case A_A1_NUM:
   1732   1.1  christos 		  reg_efg |= 3 << 2;
   1733   1.1  christos 		  break;
   1734   1.1  christos 		default:
   1735   1.1  christos 		  goto fail;
   1736   1.1  christos 		}
   1737   1.1  christos 	      break;
   1738   1.1  christos 
   1739   1.1  christos 	    case A_A0:
   1740   1.1  christos 	      if (user->type != DSP_REG_N || user->reg != A_A0_NUM)
   1741   1.1  christos 		goto fail;
   1742   1.1  christos 	      break;
   1743   1.1  christos 	    case A_X0:
   1744   1.1  christos 	      if (user->type != DSP_REG_N || user->reg != A_X0_NUM)
   1745   1.1  christos 		goto fail;
   1746   1.1  christos 	      break;
   1747   1.1  christos 	    case A_X1:
   1748   1.1  christos 	      if (user->type != DSP_REG_N || user->reg != A_X1_NUM)
   1749   1.1  christos 		goto fail;
   1750   1.1  christos 	      break;
   1751   1.1  christos 	    case A_Y0:
   1752   1.1  christos 	      if (user->type != DSP_REG_N || user->reg != A_Y0_NUM)
   1753   1.1  christos 		goto fail;
   1754   1.1  christos 	      break;
   1755   1.1  christos 	    case A_Y1:
   1756   1.1  christos 	      if (user->type != DSP_REG_N || user->reg != A_Y1_NUM)
   1757   1.1  christos 		goto fail;
   1758   1.1  christos 	      break;
   1759   1.1  christos 
   1760   1.1  christos 	    case F_REG_M:
   1761   1.1  christos 	    case D_REG_M:
   1762   1.1  christos 	    case X_REG_M:
   1763   1.1  christos 	    case V_REG_M:
   1764   1.1  christos 	    case FPUL_M:
   1765   1.1  christos 	    case FPSCR_M:
   1766   1.1  christos 	      /* Opcode needs rn */
   1767   1.1  christos 	      if (user->type != arg - F_REG_M + F_REG_N)
   1768   1.1  christos 		goto fail;
   1769   1.1  christos 	      reg_m = user->reg;
   1770   1.1  christos 	      break;
   1771   1.1  christos 	    case DX_REG_M:
   1772   1.1  christos 	      if (user->type != D_REG_N && user->type != X_REG_N)
   1773   1.1  christos 		goto fail;
   1774   1.1  christos 	      reg_m = user->reg;
   1775   1.1  christos 	      break;
   1776   1.1  christos 	    case XMTRX_M4:
   1777   1.1  christos 	      if (user->type != XMTRX_M4)
   1778   1.1  christos 		goto fail;
   1779   1.1  christos 	      reg_m = 4;
   1780   1.1  christos 	      break;
   1781   1.1  christos 
   1782   1.1  christos 	    default:
   1783   1.1  christos 	      printf (_("unhandled %d\n"), arg);
   1784   1.1  christos 	      goto fail;
   1785   1.1  christos 	    }
   1786   1.1  christos 	  if (SH_MERGE_ARCH_SET_VALID (valid_arch, arch_sh2a_nofpu_up)
   1787   1.1  christos 	      && (   arg == A_DISP_REG_M
   1788   1.1  christos 		  || arg == A_DISP_REG_N))
   1789   1.1  christos 	    {
   1790   1.1  christos 	      /* Check a few key IMM* fields for overflow.  */
   1791   1.1  christos 	      int opf;
   1792   1.1  christos 	      long val = user->immediate.X_add_number;
   1793   1.1  christos 
   1794   1.1  christos 	      for (opf = 0; opf < 4; opf ++)
   1795   1.1  christos 		switch (this_try->nibbles[opf])
   1796   1.1  christos 		  {
   1797   1.1  christos 		  case IMM0_4:
   1798   1.1  christos 		  case IMM1_4:
   1799   1.1  christos 		    if (val < 0 || val > 15)
   1800   1.1  christos 		      goto fail;
   1801   1.1  christos 		    break;
   1802   1.1  christos 		  case IMM0_4BY2:
   1803   1.1  christos 		  case IMM1_4BY2:
   1804   1.1  christos 		    if (val < 0 || val > 15 * 2)
   1805   1.1  christos 		      goto fail;
   1806   1.1  christos 		    break;
   1807   1.1  christos 		  case IMM0_4BY4:
   1808   1.1  christos 		  case IMM1_4BY4:
   1809   1.1  christos 		    if (val < 0 || val > 15 * 4)
   1810   1.1  christos 		      goto fail;
   1811   1.1  christos 		    break;
   1812   1.1  christos 		  default:
   1813   1.1  christos 		    break;
   1814   1.1  christos 		  }
   1815   1.1  christos 	    }
   1816   1.1  christos 	}
   1817   1.1  christos       if ( !SH_MERGE_ARCH_SET_VALID (valid_arch, this_try->arch))
   1818   1.1  christos 	goto fail;
   1819   1.1  christos       valid_arch = SH_MERGE_ARCH_SET (valid_arch, this_try->arch);
   1820   1.1  christos       return this_try;
   1821   1.1  christos     fail:
   1822   1.1  christos       ;
   1823   1.1  christos     }
   1824   1.1  christos 
   1825   1.1  christos   return 0;
   1826   1.1  christos }
   1827   1.5  christos 
   1828   1.5  christos static void
   1829   1.1  christos insert (char *where, bfd_reloc_code_real_type how, int pcrel,
   1830   1.1  christos        	sh_operand_info *op)
   1831   1.1  christos {
   1832   1.1  christos   fix_new_exp (frag_now,
   1833   1.1  christos 	       where - frag_now->fr_literal,
   1834   1.1  christos 	       2,
   1835   1.1  christos 	       &op->immediate,
   1836   1.1  christos 	       pcrel,
   1837   1.1  christos 	       how);
   1838   1.1  christos }
   1839   1.5  christos 
   1840   1.5  christos static void
   1841   1.1  christos insert4 (char * where, bfd_reloc_code_real_type how, int pcrel,
   1842   1.1  christos 	 sh_operand_info * op)
   1843   1.1  christos {
   1844   1.1  christos   fix_new_exp (frag_now,
   1845   1.1  christos 	       where - frag_now->fr_literal,
   1846   1.1  christos 	       4,
   1847   1.1  christos 	       & op->immediate,
   1848   1.1  christos 	       pcrel,
   1849   1.1  christos 	       how);
   1850   1.1  christos }
   1851   1.1  christos static void
   1852   1.1  christos build_relax (sh_opcode_info *opcode, sh_operand_info *op)
   1853   1.1  christos {
   1854   1.1  christos   int high_byte = target_big_endian ? 0 : 1;
   1855   1.1  christos   char *p;
   1856   1.1  christos 
   1857   1.1  christos   if (opcode->arg[0] == A_BDISP8)
   1858   1.1  christos     {
   1859   1.1  christos       int what = (opcode->nibbles[1] & 4) ? COND_JUMP_DELAY : COND_JUMP;
   1860   1.1  christos       p = frag_var (rs_machine_dependent,
   1861   1.1  christos 		    md_relax_table[C (what, COND32)].rlx_length,
   1862   1.1  christos 		    md_relax_table[C (what, COND8)].rlx_length,
   1863   1.1  christos 		    C (what, 0),
   1864   1.1  christos 		    op->immediate.X_add_symbol,
   1865   1.1  christos 		    op->immediate.X_add_number,
   1866   1.1  christos 		    0);
   1867   1.1  christos       p[high_byte] = (opcode->nibbles[0] << 4) | (opcode->nibbles[1]);
   1868   1.1  christos     }
   1869   1.1  christos   else if (opcode->arg[0] == A_BDISP12)
   1870   1.1  christos     {
   1871   1.1  christos       p = frag_var (rs_machine_dependent,
   1872   1.1  christos 		    md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length,
   1873   1.1  christos 		    md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length,
   1874   1.1  christos 		    C (UNCOND_JUMP, 0),
   1875   1.1  christos 		    op->immediate.X_add_symbol,
   1876   1.1  christos 		    op->immediate.X_add_number,
   1877   1.1  christos 		    0);
   1878   1.1  christos       p[high_byte] = (opcode->nibbles[0] << 4);
   1879   1.1  christos     }
   1880   1.1  christos 
   1881   1.1  christos }
   1882   1.1  christos 
   1883   1.1  christos /* Insert ldrs & ldre with fancy relocations that relaxation can recognize.  */
   1884   1.1  christos 
   1885   1.1  christos static char *
   1886   1.1  christos insert_loop_bounds (char *output, sh_operand_info *operand)
   1887   1.1  christos {
   1888   1.1  christos   symbolS *end_sym;
   1889   1.1  christos 
   1890   1.1  christos   /* Since the low byte of the opcode will be overwritten by the reloc, we
   1891   1.1  christos      can just stash the high byte into both bytes and ignore endianness.  */
   1892   1.1  christos   output[0] = 0x8c;
   1893   1.1  christos   output[1] = 0x8c;
   1894   1.1  christos   insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
   1895   1.1  christos   insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
   1896   1.1  christos 
   1897   1.1  christos   if (sh_relax)
   1898   1.5  christos     {
   1899   1.7  christos       static int count = 0;
   1900   1.1  christos       char name[11];
   1901   1.1  christos       expressionS *symval;
   1902   1.1  christos 
   1903   1.1  christos       /* If the last loop insn is a two-byte-insn, it is in danger of being
   1904   1.1  christos 	 swapped with the insn after it.  To prevent this, create a new
   1905   1.1  christos 	 symbol - complete with SH_LABEL reloc - after the last loop insn.
   1906   1.1  christos 	 If the last loop insn is four bytes long, the symbol will be
   1907   1.1  christos 	 right in the middle, but four byte insns are not swapped anyways.  */
   1908   1.1  christos       /* A REPEAT takes 6 bytes.  The SH has a 32 bit address space.
   1909   1.8  christos 	 Hence a 9 digit number should be enough to count all REPEATs.  */
   1910   1.1  christos       sprintf (name, "_R%x", count++ & 0x3fffffff);
   1911   1.1  christos       end_sym = symbol_new (name, undefined_section, &zero_address_frag, 0);
   1912   1.1  christos       /* Make this a local symbol.  */
   1913   1.1  christos #ifdef OBJ_COFF
   1914   1.1  christos       SF_SET_LOCAL (end_sym);
   1915   1.7  christos #endif /* OBJ_COFF */
   1916   1.7  christos       symbol_table_insert (end_sym);
   1917   1.7  christos       symval = symbol_get_value_expression (end_sym);
   1918   1.1  christos       *symval = operand[1].immediate;
   1919   1.1  christos       symval->X_add_number += 2;
   1920   1.1  christos       fix_new (frag_now, frag_now_fix (), 2, end_sym, 0, 1, BFD_RELOC_SH_LABEL);
   1921   1.1  christos     }
   1922   1.1  christos 
   1923   1.1  christos   output = frag_more (2);
   1924   1.1  christos   output[0] = 0x8e;
   1925   1.1  christos   output[1] = 0x8e;
   1926   1.1  christos   insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
   1927   1.1  christos   insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
   1928   1.1  christos 
   1929   1.1  christos   return frag_more (2);
   1930   1.1  christos }
   1931   1.1  christos 
   1932   1.1  christos /* Now we know what sort of opcodes it is, let's build the bytes.  */
   1933   1.1  christos 
   1934   1.1  christos static unsigned int
   1935   1.1  christos build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand)
   1936   1.1  christos {
   1937   1.1  christos   int indx;
   1938   1.1  christos   char nbuf[8];
   1939   1.1  christos   char *output;
   1940   1.1  christos   unsigned int size = 2;
   1941   1.1  christos   int low_byte = target_big_endian ? 1 : 0;
   1942   1.1  christos   int max_index = 4;
   1943   1.1  christos   bfd_reloc_code_real_type r_type;
   1944   1.1  christos #ifdef OBJ_ELF
   1945   1.1  christos   int unhandled_pic = 0;
   1946   1.1  christos #endif
   1947   1.1  christos 
   1948   1.1  christos   nbuf[0] = 0;
   1949   1.1  christos   nbuf[1] = 0;
   1950   1.1  christos   nbuf[2] = 0;
   1951   1.1  christos   nbuf[3] = 0;
   1952   1.1  christos   nbuf[4] = 0;
   1953   1.1  christos   nbuf[5] = 0;
   1954   1.1  christos   nbuf[6] = 0;
   1955   1.1  christos   nbuf[7] = 0;
   1956   1.1  christos 
   1957   1.1  christos #ifdef OBJ_ELF
   1958   1.1  christos   for (indx = 0; indx < 3; indx++)
   1959   1.1  christos     if (opcode->arg[indx] == A_IMM
   1960   1.1  christos 	&& operand[indx].type == A_IMM
   1961   1.1  christos 	&& (operand[indx].immediate.X_op == O_PIC_reloc
   1962   1.1  christos 	    || sh_PIC_related_p (operand[indx].immediate.X_add_symbol)
   1963   1.1  christos 	    || sh_PIC_related_p (operand[indx].immediate.X_op_symbol)))
   1964   1.1  christos       unhandled_pic = 1;
   1965   1.1  christos #endif
   1966   1.1  christos 
   1967   1.1  christos   if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32))
   1968   1.1  christos     {
   1969   1.1  christos       output = frag_more (4);
   1970   1.1  christos       size = 4;
   1971   1.1  christos       max_index = 8;
   1972   1.1  christos     }
   1973   1.1  christos   else
   1974   1.1  christos     output = frag_more (2);
   1975   1.1  christos 
   1976   1.1  christos   for (indx = 0; indx < max_index; indx++)
   1977   1.1  christos     {
   1978   1.1  christos       sh_nibble_type i = opcode->nibbles[indx];
   1979   1.1  christos       if (i < 16)
   1980   1.1  christos 	{
   1981   1.1  christos 	  nbuf[indx] = i;
   1982   1.1  christos 	}
   1983   1.1  christos       else
   1984   1.1  christos 	{
   1985   1.1  christos 	  switch (i)
   1986   1.1  christos 	    {
   1987   1.1  christos 	    case REG_N:
   1988   1.1  christos 	    case REG_N_D:
   1989   1.1  christos 	      nbuf[indx] = reg_n;
   1990   1.1  christos 	      break;
   1991   1.1  christos 	    case REG_M:
   1992   1.1  christos 	      nbuf[indx] = reg_m;
   1993   1.1  christos 	      break;
   1994   1.1  christos 	    case SDT_REG_N:
   1995   1.1  christos 	      if (reg_n < 2 || reg_n > 5)
   1996   1.1  christos 		as_bad (_("Invalid register: 'r%d'"), reg_n);
   1997   1.1  christos 	      nbuf[indx] = (reg_n & 3) | 4;
   1998   1.1  christos 	      break;
   1999   1.1  christos 	    case REG_NM:
   2000   1.1  christos 	      nbuf[indx] = reg_n | (reg_m >> 2);
   2001   1.1  christos 	      break;
   2002   1.1  christos 	    case REG_B:
   2003   1.1  christos 	      nbuf[indx] = reg_b | 0x08;
   2004   1.1  christos 	      break;
   2005   1.1  christos 	    case REG_N_B01:
   2006   1.1  christos 	      nbuf[indx] = reg_n | 0x01;
   2007   1.1  christos 	      break;
   2008   1.6  christos 	    case IMM0_3s:
   2009   1.1  christos 	      nbuf[indx] |= 0x08;
   2010   1.1  christos 	      /* Fall through.  */
   2011   1.1  christos 	    case IMM0_3c:
   2012   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM3, 0, operand);
   2013   1.1  christos 	      break;
   2014   1.6  christos 	    case IMM0_3Us:
   2015   1.1  christos 	      nbuf[indx] |= 0x80;
   2016   1.1  christos 	      /* Fall through.  */
   2017   1.1  christos 	    case IMM0_3Uc:
   2018   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM3U, 0, operand);
   2019   1.1  christos 	      break;
   2020   1.1  christos 	    case DISP0_12:
   2021   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12, 0, operand);
   2022   1.1  christos 	      break;
   2023   1.1  christos 	    case DISP0_12BY2:
   2024   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12BY2, 0, operand);
   2025   1.1  christos 	      break;
   2026   1.1  christos 	    case DISP0_12BY4:
   2027   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12BY4, 0, operand);
   2028   1.1  christos 	      break;
   2029   1.1  christos 	    case DISP0_12BY8:
   2030   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12BY8, 0, operand);
   2031   1.1  christos 	      break;
   2032   1.1  christos 	    case DISP1_12:
   2033   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12, 0, operand+1);
   2034   1.1  christos 	      break;
   2035   1.1  christos 	    case DISP1_12BY2:
   2036   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12BY2, 0, operand+1);
   2037   1.1  christos 	      break;
   2038   1.1  christos 	    case DISP1_12BY4:
   2039   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12BY4, 0, operand+1);
   2040   1.1  christos 	      break;
   2041   1.1  christos 	    case DISP1_12BY8:
   2042   1.1  christos 	      insert (output + 2, BFD_RELOC_SH_DISP12BY8, 0, operand+1);
   2043   1.1  christos 	      break;
   2044   1.1  christos 	    case IMM0_20_4:
   2045   1.1  christos 	      break;
   2046   1.1  christos 	    case IMM0_20:
   2047   1.1  christos 	      r_type = BFD_RELOC_SH_DISP20;
   2048   1.1  christos #ifdef OBJ_ELF
   2049   1.1  christos 	      if (sh_check_fixup (&operand->immediate, &r_type))
   2050   1.1  christos 		as_bad (_("Invalid PIC expression."));
   2051   1.1  christos 	      unhandled_pic = 0;
   2052   1.1  christos #endif
   2053   1.1  christos 	      insert4 (output, r_type, 0, operand);
   2054   1.1  christos 	      break;
   2055   1.1  christos 	    case IMM0_20BY8:
   2056   1.1  christos 	      insert4 (output, BFD_RELOC_SH_DISP20BY8, 0, operand);
   2057   1.1  christos 	      break;
   2058   1.1  christos 	    case IMM0_4BY4:
   2059   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand);
   2060   1.1  christos 	      break;
   2061   1.1  christos 	    case IMM0_4BY2:
   2062   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand);
   2063   1.1  christos 	      break;
   2064   1.1  christos 	    case IMM0_4:
   2065   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand);
   2066   1.1  christos 	      break;
   2067   1.1  christos 	    case IMM1_4BY4:
   2068   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand + 1);
   2069   1.1  christos 	      break;
   2070   1.1  christos 	    case IMM1_4BY2:
   2071   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand + 1);
   2072   1.1  christos 	      break;
   2073   1.1  christos 	    case IMM1_4:
   2074   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand + 1);
   2075   1.1  christos 	      break;
   2076   1.1  christos 	    case IMM0_8BY4:
   2077   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand);
   2078   1.1  christos 	      break;
   2079   1.1  christos 	    case IMM0_8BY2:
   2080   1.8  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand);
   2081   1.8  christos 	      break;
   2082   1.1  christos 	    case IMM0_8U:
   2083   1.1  christos 	    case IMM0_8S:
   2084   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand);
   2085   1.1  christos 	      break;
   2086   1.1  christos 	    case IMM1_8BY4:
   2087   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand + 1);
   2088   1.1  christos 	      break;
   2089   1.1  christos 	    case IMM1_8BY2:
   2090   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand + 1);
   2091   1.1  christos 	      break;
   2092   1.1  christos 	    case IMM1_8:
   2093   1.1  christos 	      insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1);
   2094   1.1  christos 	      break;
   2095   1.1  christos 	    case PCRELIMM_8BY4:
   2096   1.1  christos 	      insert (output, BFD_RELOC_SH_PCRELIMM8BY4,
   2097   1.1  christos 		      operand->type != A_DISP_PC_ABS, operand);
   2098   1.1  christos 	      break;
   2099   1.1  christos 	    case PCRELIMM_8BY2:
   2100   1.1  christos 	      insert (output, BFD_RELOC_SH_PCRELIMM8BY2,
   2101   1.1  christos 		      operand->type != A_DISP_PC_ABS, operand);
   2102   1.1  christos 	      break;
   2103   1.1  christos 	    case REPEAT:
   2104   1.1  christos 	      output = insert_loop_bounds (output, operand);
   2105   1.1  christos 	      nbuf[indx] = opcode->nibbles[3];
   2106   1.1  christos 	      operand += 2;
   2107   1.1  christos 	      break;
   2108   1.1  christos 	    default:
   2109   1.1  christos 	      printf (_("failed for %d\n"), i);
   2110   1.1  christos 	    }
   2111   1.1  christos 	}
   2112   1.1  christos     }
   2113   1.1  christos #ifdef OBJ_ELF
   2114   1.1  christos   if (unhandled_pic)
   2115   1.1  christos     as_bad (_("misplaced PIC operand"));
   2116   1.1  christos #endif
   2117   1.1  christos   if (!target_big_endian)
   2118   1.1  christos     {
   2119   1.1  christos       output[1] = (nbuf[0] << 4) | (nbuf[1]);
   2120   1.1  christos       output[0] = (nbuf[2] << 4) | (nbuf[3]);
   2121   1.1  christos     }
   2122   1.1  christos   else
   2123   1.1  christos     {
   2124   1.1  christos       output[0] = (nbuf[0] << 4) | (nbuf[1]);
   2125   1.1  christos       output[1] = (nbuf[2] << 4) | (nbuf[3]);
   2126   1.1  christos     }
   2127   1.1  christos   if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32))
   2128   1.1  christos     {
   2129   1.1  christos       if (!target_big_endian)
   2130   1.1  christos 	{
   2131   1.1  christos 	  output[3] = (nbuf[4] << 4) | (nbuf[5]);
   2132   1.1  christos 	  output[2] = (nbuf[6] << 4) | (nbuf[7]);
   2133   1.1  christos 	}
   2134   1.1  christos       else
   2135   1.1  christos 	{
   2136   1.1  christos 	  output[2] = (nbuf[4] << 4) | (nbuf[5]);
   2137   1.1  christos 	  output[3] = (nbuf[6] << 4) | (nbuf[7]);
   2138   1.1  christos 	}
   2139   1.1  christos     }
   2140   1.1  christos   return size;
   2141   1.1  christos }
   2142   1.1  christos 
   2143   1.1  christos /* Find an opcode at the start of *STR_P in the hash table, and set
   2144   1.1  christos    *STR_P to the first character after the last one read.  */
   2145   1.1  christos 
   2146   1.1  christos static sh_opcode_info *
   2147   1.1  christos find_cooked_opcode (char **str_p)
   2148   1.1  christos {
   2149   1.1  christos   char *str = *str_p;
   2150   1.1  christos   unsigned char *op_start;
   2151   1.1  christos   unsigned char *op_end;
   2152   1.1  christos   char name[20];
   2153   1.1  christos   unsigned int nlen = 0;
   2154  1.10  christos 
   2155   1.1  christos   /* Drop leading whitespace.  */
   2156   1.1  christos   while (is_whitespace (*str))
   2157   1.1  christos     str++;
   2158   1.1  christos 
   2159   1.1  christos   /* Find the op code end.
   2160   1.1  christos      The pre-processor will eliminate whitespace in front of
   2161   1.1  christos      any '@' after the first argument; we may be called from
   2162  1.10  christos      assemble_ppi, so the opcode might be terminated by an '@'.  */
   2163  1.10  christos   for (op_start = op_end = (unsigned char *) str;
   2164   1.1  christos        nlen < sizeof (name) - 1
   2165   1.1  christos        && !is_end_of_stmt (*op_end) && !is_whitespace (*op_end) && *op_end != '@';
   2166   1.1  christos        op_end++)
   2167   1.1  christos     {
   2168   1.1  christos       unsigned char c = op_start[nlen];
   2169   1.1  christos 
   2170   1.1  christos       /* The machine independent code will convert CMP/EQ into cmp/EQ
   2171   1.1  christos 	 because it thinks the '/' is the end of the symbol.  Moreover,
   2172   1.1  christos 	 all but the first sub-insn is a parallel processing insn won't
   2173   1.1  christos 	 be capitalized.  Instead of hacking up the machine independent
   2174   1.1  christos 	 code, we just deal with it here.  */
   2175   1.1  christos       c = TOLOWER (c);
   2176   1.1  christos       name[nlen] = c;
   2177   1.1  christos       nlen++;
   2178   1.1  christos     }
   2179   1.1  christos 
   2180   1.1  christos   name[nlen] = 0;
   2181   1.1  christos   *str_p = (char *) op_end;
   2182   1.1  christos 
   2183   1.1  christos   if (nlen == 0)
   2184  1.10  christos     as_bad (_("can't find opcode "));
   2185   1.1  christos 
   2186   1.1  christos   return str_hash_find (opcode_hash_control, name);
   2187   1.1  christos }
   2188   1.1  christos 
   2189   1.1  christos /* Assemble a parallel processing insn.  */
   2190   1.1  christos #define DDT_BASE 0xf000 /* Base value for double data transfer insns */
   2191   1.1  christos 
   2192   1.1  christos static unsigned int
   2193   1.8  christos assemble_ppi (char *op_end, sh_opcode_info *opcode)
   2194   1.8  christos {
   2195   1.8  christos   unsigned int movx = 0;
   2196   1.8  christos   unsigned int movy = 0;
   2197   1.1  christos   unsigned int cond = 0;
   2198   1.8  christos   unsigned int field_b = 0;
   2199   1.1  christos   char *output;
   2200   1.1  christos   unsigned int move_code;
   2201   1.1  christos   unsigned int size;
   2202   1.1  christos 
   2203   1.1  christos   for (;;)
   2204   1.1  christos     {
   2205   1.1  christos       sh_operand_info operand[3];
   2206   1.1  christos 
   2207   1.1  christos       /* Some insn ignore one or more register fields, e.g. psts machl,a0.
   2208   1.1  christos 	 Make sure we encode a defined insn pattern.  */
   2209   1.1  christos       reg_x = 0;
   2210   1.1  christos       reg_y = 0;
   2211   1.1  christos       reg_n = 0;
   2212   1.1  christos 
   2213   1.1  christos       if (opcode->arg[0] != A_END)
   2214   1.1  christos 	op_end = get_operands (opcode, op_end, operand);
   2215   1.1  christos     try_another_opcode:
   2216   1.1  christos       opcode = get_specific (opcode, operand);
   2217   1.1  christos       if (opcode == 0)
   2218   1.1  christos 	{
   2219   1.1  christos 	  /* Couldn't find an opcode which matched the operands.  */
   2220   1.1  christos 	  char *where = frag_more (2);
   2221   1.1  christos 	  size = 2;
   2222   1.1  christos 
   2223   1.1  christos 	  where[0] = 0x0;
   2224   1.1  christos 	  where[1] = 0x0;
   2225   1.1  christos 	  as_bad (_("invalid operands for opcode"));
   2226   1.1  christos 	  return size;
   2227   1.1  christos 	}
   2228   1.1  christos 
   2229   1.1  christos       if (opcode->nibbles[0] != PPI)
   2230   1.1  christos 	as_bad (_("insn can't be combined with parallel processing insn"));
   2231   1.1  christos 
   2232   1.1  christos       switch (opcode->nibbles[1])
   2233   1.1  christos 	{
   2234   1.1  christos 
   2235   1.1  christos 	case NOPX:
   2236   1.1  christos 	  if (movx)
   2237   1.1  christos 	    as_bad (_("multiple movx specifications"));
   2238   1.1  christos 	  movx = DDT_BASE;
   2239   1.1  christos 	  break;
   2240   1.1  christos 	case NOPY:
   2241   1.1  christos 	  if (movy)
   2242   1.1  christos 	    as_bad (_("multiple movy specifications"));
   2243   1.1  christos 	  movy = DDT_BASE;
   2244   1.1  christos 	  break;
   2245   1.1  christos 
   2246   1.1  christos 	case MOVX_NOPY:
   2247   1.1  christos 	  if (movx)
   2248   1.1  christos 	    as_bad (_("multiple movx specifications"));
   2249   1.1  christos 	  if ((reg_n < 4 || reg_n > 5)
   2250   1.1  christos 	      && (reg_n < 0 || reg_n > 1))
   2251   1.1  christos 	    as_bad (_("invalid movx address register"));
   2252   1.1  christos 	  if (movy && movy != DDT_BASE)
   2253   1.1  christos 	    as_bad (_("insn cannot be combined with non-nopy"));
   2254   1.1  christos 	  movx = ((((reg_n & 1) != 0) << 9)
   2255   1.1  christos 		  + (((reg_n & 4) == 0) << 8)
   2256   1.1  christos 		  + (reg_x << 6)
   2257   1.1  christos 		  + (opcode->nibbles[2] << 4)
   2258   1.1  christos 		  + opcode->nibbles[3]
   2259   1.1  christos 		  + DDT_BASE);
   2260   1.1  christos 	  break;
   2261   1.1  christos 
   2262   1.1  christos 	case MOVY_NOPX:
   2263   1.1  christos 	  if (movy)
   2264   1.1  christos 	    as_bad (_("multiple movy specifications"));
   2265   1.1  christos 	  if ((reg_n < 6 || reg_n > 7)
   2266   1.1  christos 	      && (reg_n < 2 || reg_n > 3))
   2267   1.1  christos 	    as_bad (_("invalid movy address register"));
   2268   1.1  christos 	  if (movx && movx != DDT_BASE)
   2269   1.1  christos 	    as_bad (_("insn cannot be combined with non-nopx"));
   2270   1.1  christos 	  movy = ((((reg_n & 1) != 0) << 8)
   2271   1.1  christos 		  + (((reg_n & 4) == 0) << 9)
   2272   1.1  christos 		  + (reg_y << 6)
   2273   1.1  christos 		  + (opcode->nibbles[2] << 4)
   2274   1.1  christos 		  + opcode->nibbles[3]
   2275   1.1  christos 		  + DDT_BASE);
   2276   1.1  christos 	  break;
   2277   1.1  christos 
   2278   1.1  christos 	case MOVX:
   2279   1.1  christos 	  if (movx)
   2280   1.1  christos 	    as_bad (_("multiple movx specifications"));
   2281   1.1  christos 	  if (movy & 0x2ac)
   2282   1.1  christos 	    as_bad (_("previous movy requires nopx"));
   2283   1.1  christos 	  if (reg_n < 4 || reg_n > 5)
   2284   1.1  christos 	    as_bad (_("invalid movx address register"));
   2285   1.1  christos 	  if (opcode->nibbles[2] & 8)
   2286   1.1  christos 	    {
   2287   1.1  christos 	      if (reg_m == A_A1_NUM)
   2288   1.1  christos 		movx = 1 << 7;
   2289   1.1  christos 	      else if (reg_m != A_A0_NUM)
   2290   1.1  christos 		as_bad (_("invalid movx dsp register"));
   2291   1.1  christos 	    }
   2292   1.1  christos 	  else
   2293   1.1  christos 	    {
   2294   1.1  christos 	      if (reg_x > 1)
   2295   1.1  christos 		as_bad (_("invalid movx dsp register"));
   2296   1.1  christos 	      movx = reg_x << 7;
   2297   1.1  christos 	    }
   2298   1.1  christos 	  movx += ((reg_n - 4) << 9) + (opcode->nibbles[2] << 2) + DDT_BASE;
   2299   1.1  christos 	  break;
   2300   1.1  christos 
   2301   1.1  christos 	case MOVY:
   2302   1.1  christos 	  if (movy)
   2303   1.1  christos 	    as_bad (_("multiple movy specifications"));
   2304   1.1  christos 	  if (movx & 0x153)
   2305   1.1  christos 	    as_bad (_("previous movx requires nopy"));
   2306   1.1  christos 	  if (opcode->nibbles[2] & 8)
   2307   1.1  christos 	    {
   2308   1.1  christos 	      /* Bit 3 in nibbles[2] is intended for bit 4 of the opcode,
   2309   1.1  christos 		 so add 8 more.  */
   2310   1.1  christos 	      movy = 8;
   2311   1.1  christos 	      if (reg_m == A_A1_NUM)
   2312   1.1  christos 		movy += 1 << 6;
   2313   1.1  christos 	      else if (reg_m != A_A0_NUM)
   2314   1.1  christos 		as_bad (_("invalid movy dsp register"));
   2315   1.1  christos 	    }
   2316   1.1  christos 	  else
   2317   1.1  christos 	    {
   2318   1.1  christos 	      if (reg_y > 1)
   2319   1.1  christos 		as_bad (_("invalid movy dsp register"));
   2320   1.1  christos 	      movy = reg_y << 6;
   2321   1.1  christos 	    }
   2322   1.1  christos 	  if (reg_n < 6 || reg_n > 7)
   2323   1.1  christos 	    as_bad (_("invalid movy address register"));
   2324   1.1  christos 	  movy += ((reg_n - 6) << 8) + opcode->nibbles[2] + DDT_BASE;
   2325   1.1  christos 	  break;
   2326   1.1  christos 
   2327   1.1  christos 	case PSH:
   2328   1.1  christos 	  if (operand[0].immediate.X_op != O_constant)
   2329   1.1  christos 	    as_bad (_("dsp immediate shift value not constant"));
   2330   1.1  christos 	  field_b = ((opcode->nibbles[2] << 12)
   2331   1.1  christos 		     | (operand[0].immediate.X_add_number & 127) << 4
   2332   1.1  christos 		     | reg_n);
   2333   1.1  christos 	  break;
   2334   1.1  christos 	case PPI3NC:
   2335   1.1  christos 	  if (cond)
   2336   1.1  christos 	    {
   2337   1.1  christos 	      opcode++;
   2338   1.1  christos 	      goto try_another_opcode;
   2339   1.1  christos 	    }
   2340   1.1  christos 	  /* Fall through.  */
   2341   1.1  christos 	case PPI3:
   2342   1.1  christos 	  if (field_b)
   2343   1.1  christos 	    as_bad (_("multiple parallel processing specifications"));
   2344   1.1  christos 	  field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
   2345   1.1  christos 		     + (reg_x << 6) + (reg_y << 4) + reg_n);
   2346   1.1  christos 	  switch (opcode->nibbles[4])
   2347   1.1  christos 	    {
   2348   1.1  christos 	    case HEX_0:
   2349   1.1  christos 	    case HEX_XX00:
   2350   1.1  christos 	    case HEX_00YY:
   2351   1.1  christos 	      break;
   2352   1.1  christos 	    case HEX_1:
   2353   1.1  christos 	    case HEX_4:
   2354   1.1  christos 	      field_b += opcode->nibbles[4] << 4;
   2355   1.1  christos 	      break;
   2356   1.1  christos 	    default:
   2357   1.1  christos 	      abort ();
   2358   1.1  christos 	    }
   2359   1.1  christos 	  break;
   2360   1.1  christos 	case PDC:
   2361   1.1  christos 	  if (cond)
   2362   1.1  christos 	    as_bad (_("multiple condition specifications"));
   2363   1.1  christos 	  cond = opcode->nibbles[2] << 8;
   2364   1.1  christos 	  if (*op_end)
   2365   1.1  christos 	    goto skip_cond_check;
   2366   1.1  christos 	  break;
   2367   1.1  christos 	case PPIC:
   2368   1.1  christos 	  if (field_b)
   2369   1.1  christos 	    as_bad (_("multiple parallel processing specifications"));
   2370   1.1  christos 	  field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
   2371   1.1  christos 		     + cond + (reg_x << 6) + (reg_y << 4) + reg_n);
   2372   1.1  christos 	  cond = 0;
   2373   1.1  christos 	  switch (opcode->nibbles[4])
   2374   1.1  christos 	    {
   2375   1.1  christos 	    case HEX_0:
   2376   1.1  christos 	    case HEX_XX00:
   2377   1.1  christos 	    case HEX_00YY:
   2378   1.1  christos 	      break;
   2379   1.1  christos 	    case HEX_1:
   2380   1.1  christos 	    case HEX_4:
   2381   1.1  christos 	      field_b += opcode->nibbles[4] << 4;
   2382   1.1  christos 	      break;
   2383   1.1  christos 	    default:
   2384   1.1  christos 	      abort ();
   2385   1.1  christos 	    }
   2386   1.1  christos 	  break;
   2387   1.1  christos 	case PMUL:
   2388   1.1  christos 	  if (field_b)
   2389   1.1  christos 	    {
   2390   1.1  christos 	      if ((field_b & 0xef00) == 0xa100)
   2391   1.1  christos 		field_b -= 0x8100;
   2392   1.1  christos 	      /* pclr Dz pmuls Se,Sf,Dg */
   2393   1.1  christos 	      else if ((field_b & 0xff00) == 0x8d00
   2394   1.1  christos 		       && (SH_MERGE_ARCH_SET_VALID (valid_arch, arch_sh4al_dsp_up)))
   2395   1.1  christos 		{
   2396   1.1  christos 		  valid_arch = SH_MERGE_ARCH_SET (valid_arch, arch_sh4al_dsp_up);
   2397   1.1  christos 		  field_b -= 0x8cf0;
   2398   1.1  christos 		}
   2399   1.1  christos 	      else
   2400   1.1  christos 		as_bad (_("insn cannot be combined with pmuls"));
   2401   1.1  christos 	      switch (field_b & 0xf)
   2402   1.1  christos 		{
   2403   1.1  christos 		case A_X0_NUM:
   2404   1.1  christos 		  field_b += 0 - A_X0_NUM;
   2405   1.1  christos 		  break;
   2406   1.1  christos 		case A_Y0_NUM:
   2407   1.1  christos 		  field_b += 1 - A_Y0_NUM;
   2408   1.1  christos 		  break;
   2409   1.1  christos 		case A_A0_NUM:
   2410   1.1  christos 		  field_b += 2 - A_A0_NUM;
   2411   1.1  christos 		  break;
   2412   1.1  christos 		case A_A1_NUM:
   2413   1.1  christos 		  field_b += 3 - A_A1_NUM;
   2414   1.1  christos 		  break;
   2415   1.1  christos 		default:
   2416   1.1  christos 		  as_bad (_("bad combined pmuls output operand"));
   2417   1.1  christos 		}
   2418   1.1  christos 		/* Generate warning if the destination register for padd / psub
   2419   1.1  christos 		   and pmuls is the same ( only for A0 or A1 ).
   2420   1.1  christos 		   If the last nibble is 1010 then A0 is used in both
   2421   1.1  christos 		   padd / psub and pmuls. If it is 1111 then A1 is used
   2422   1.1  christos 		   as destination register in both padd / psub and pmuls.  */
   2423   1.1  christos 
   2424   1.1  christos 		if ((((field_b | reg_efg) & 0x000F) == 0x000A)
   2425   1.1  christos 		    || (((field_b | reg_efg) & 0x000F) == 0x000F))
   2426   1.1  christos 		  as_warn (_("destination register is same for parallel insns"));
   2427   1.1  christos 	    }
   2428   1.1  christos 	  field_b += 0x4000 + reg_efg;
   2429   1.1  christos 	  break;
   2430   1.1  christos 	default:
   2431   1.1  christos 	  abort ();
   2432   1.1  christos 	}
   2433   1.1  christos       if (cond)
   2434   1.1  christos 	{
   2435   1.1  christos 	  as_bad (_("condition not followed by conditionalizable insn"));
   2436   1.1  christos 	  cond = 0;
   2437   1.1  christos 	}
   2438   1.1  christos       if (! *op_end)
   2439   1.1  christos 	break;
   2440   1.1  christos     skip_cond_check:
   2441   1.1  christos       opcode = find_cooked_opcode (&op_end);
   2442   1.1  christos       if (opcode == NULL)
   2443   1.1  christos 	{
   2444   1.1  christos 	  (as_bad
   2445   1.1  christos 	   (_("unrecognized characters at end of parallel processing insn")));
   2446   1.1  christos 	  break;
   2447   1.1  christos 	}
   2448   1.1  christos     }
   2449   1.1  christos 
   2450   1.1  christos   move_code = movx | movy;
   2451   1.1  christos   if (field_b)
   2452   1.8  christos     {
   2453   1.1  christos       /* Parallel processing insn.  */
   2454   1.1  christos       unsigned int ppi_code = (movx | movy | 0xf800) << 16 | field_b;
   2455   1.1  christos 
   2456   1.1  christos       output = frag_more (4);
   2457   1.1  christos       size = 4;
   2458   1.1  christos       if (! target_big_endian)
   2459   1.1  christos 	{
   2460   1.1  christos 	  output[3] = ppi_code >> 8;
   2461   1.1  christos 	  output[2] = ppi_code;
   2462   1.1  christos 	}
   2463   1.1  christos       else
   2464   1.1  christos 	{
   2465   1.1  christos 	  output[2] = ppi_code >> 8;
   2466   1.1  christos 	  output[3] = ppi_code;
   2467   1.1  christos 	}
   2468   1.1  christos       move_code |= 0xf800;
   2469   1.1  christos     }
   2470   1.1  christos   else
   2471   1.1  christos     {
   2472   1.1  christos       /* Just a double data transfer.  */
   2473   1.1  christos       output = frag_more (2);
   2474   1.1  christos       size = 2;
   2475   1.1  christos     }
   2476   1.1  christos   if (! target_big_endian)
   2477   1.1  christos     {
   2478   1.1  christos       output[1] = move_code >> 8;
   2479   1.1  christos       output[0] = move_code;
   2480   1.1  christos     }
   2481   1.1  christos   else
   2482   1.1  christos     {
   2483   1.1  christos       output[0] = move_code >> 8;
   2484   1.1  christos       output[1] = move_code;
   2485   1.1  christos     }
   2486   1.1  christos   return size;
   2487   1.1  christos }
   2488   1.1  christos 
   2489   1.1  christos /* This is the guts of the machine-dependent assembler.  STR points to a
   2490   1.1  christos    machine dependent instruction.  This function is supposed to emit
   2491   1.1  christos    the frags/bytes it assembles to.  */
   2492   1.1  christos 
   2493   1.1  christos void
   2494   1.1  christos md_assemble (char *str)
   2495   1.1  christos {
   2496   1.1  christos   char *op_end;
   2497   1.1  christos   sh_operand_info operand[3];
   2498   1.1  christos   sh_opcode_info *opcode;
   2499   1.1  christos   unsigned int size = 0;
   2500   1.1  christos   char *initial_str = str;
   2501   1.1  christos 
   2502   1.1  christos   opcode = find_cooked_opcode (&str);
   2503   1.1  christos   op_end = str;
   2504   1.1  christos 
   2505   1.1  christos   if (opcode == NULL)
   2506   1.1  christos     {
   2507   1.1  christos       /* The opcode is not in the hash table.
   2508   1.1  christos 	 This means we definitely have an assembly failure,
   2509   1.1  christos 	 but the instruction may be valid in another CPU variant.
   2510   1.1  christos 	 In this case emit something better than 'unknown opcode'.
   2511   1.1  christos 	 Search the full table in sh-opc.h to check. */
   2512   1.1  christos 
   2513   1.1  christos       char *name = initial_str;
   2514   1.8  christos       int name_length = 0;
   2515   1.1  christos       const sh_opcode_info *op;
   2516   1.7  christos       bool found = false;
   2517  1.10  christos 
   2518   1.7  christos       /* Identify opcode in string.  */
   2519   1.7  christos       while (is_whitespace (*name))
   2520  1.10  christos 	name++;
   2521  1.10  christos 
   2522   1.7  christos       while (!is_end_of_stmt (name[name_length])
   2523   1.1  christos 	     && !is_whitespace (name[name_length]))
   2524   1.7  christos 	name_length++;
   2525   1.1  christos 
   2526   1.1  christos       /* Search for opcode in full list.  */
   2527   1.1  christos       for (op = sh_table; op->name; op++)
   2528   1.1  christos 	{
   2529   1.1  christos 	  if (strncasecmp (op->name, name, name_length) == 0
   2530   1.8  christos 	      && op->name[name_length] == '\0')
   2531   1.1  christos 	    {
   2532   1.1  christos 	      found = true;
   2533   1.1  christos 	      break;
   2534   1.1  christos 	    }
   2535   1.7  christos 	}
   2536   1.7  christos 
   2537   1.1  christos       if (found)
   2538   1.7  christos 	as_bad (_("opcode not valid for this cpu variant"));
   2539   1.7  christos       else
   2540   1.1  christos 	as_bad (_("unknown opcode"));
   2541   1.1  christos 
   2542   1.1  christos       return;
   2543   1.1  christos     }
   2544   1.1  christos 
   2545   1.1  christos   if (sh_relax
   2546   1.1  christos       && ! seg_info (now_seg)->tc_segment_info_data.in_code)
   2547   1.1  christos     {
   2548   1.1  christos       /* Output a CODE reloc to tell the linker that the following
   2549   1.1  christos          bytes are instructions, not data.  */
   2550   1.1  christos       fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
   2551   1.1  christos 	       BFD_RELOC_SH_CODE);
   2552   1.1  christos       seg_info (now_seg)->tc_segment_info_data.in_code = 1;
   2553   1.1  christos     }
   2554   1.1  christos 
   2555   1.1  christos   if (opcode->nibbles[0] == PPI)
   2556   1.1  christos     {
   2557   1.1  christos       size = assemble_ppi (op_end, opcode);
   2558   1.1  christos     }
   2559   1.1  christos   else
   2560   1.1  christos     {
   2561   1.1  christos       if (opcode->arg[0] == A_BDISP12
   2562   1.1  christos 	  || opcode->arg[0] == A_BDISP8)
   2563   1.1  christos 	{
   2564   1.1  christos 	  /* Since we skip get_specific here, we have to check & update
   2565   1.1  christos 	     valid_arch now.  */
   2566   1.1  christos 	  if (SH_MERGE_ARCH_SET_VALID (valid_arch, opcode->arch))
   2567   1.1  christos 	    valid_arch = SH_MERGE_ARCH_SET (valid_arch, opcode->arch);
   2568   1.1  christos 	  else
   2569   1.1  christos 	    as_bad (_("Delayed branches not available on SH1"));
   2570   1.1  christos 	  parse_exp (op_end + 1, &operand[0]);
   2571   1.1  christos 	  build_relax (opcode, &operand[0]);
   2572   1.1  christos 
   2573   1.1  christos 	  /* All branches are currently 16 bit.  */
   2574   1.1  christos 	  size = 2;
   2575   1.1  christos 	}
   2576   1.1  christos       else
   2577   1.1  christos 	{
   2578   1.1  christos 	  if (opcode->arg[0] == A_END)
   2579   1.1  christos 	    {
   2580  1.10  christos 	      /* Ignore trailing whitespace.  If there is any, it has already
   2581   1.1  christos 		 been compressed to a single space.  */
   2582   1.1  christos 	      if (is_whitespace (*op_end))
   2583   1.1  christos 		op_end++;
   2584   1.1  christos 	    }
   2585   1.1  christos 	  else
   2586   1.1  christos 	    {
   2587   1.1  christos 	      op_end = get_operands (opcode, op_end, operand);
   2588   1.1  christos 	    }
   2589   1.1  christos 	  opcode = get_specific (opcode, operand);
   2590   1.1  christos 
   2591   1.1  christos 	  if (opcode == 0)
   2592   1.1  christos 	    {
   2593   1.1  christos 	      /* Couldn't find an opcode which matched the operands.  */
   2594   1.1  christos 	      char *where = frag_more (2);
   2595   1.1  christos 	      size = 2;
   2596   1.1  christos 
   2597   1.1  christos 	      where[0] = 0x0;
   2598   1.1  christos 	      where[1] = 0x0;
   2599   1.1  christos 	      as_bad (_("invalid operands for opcode"));
   2600   1.1  christos 	    }
   2601   1.1  christos 	  else
   2602   1.1  christos 	    {
   2603   1.1  christos 	      if (*op_end)
   2604   1.1  christos 		as_bad (_("excess operands: '%s'"), op_end);
   2605   1.1  christos 
   2606   1.1  christos 	      size = build_Mytes (opcode, operand);
   2607   1.1  christos 	    }
   2608   1.1  christos 	}
   2609   1.1  christos     }
   2610   1.1  christos 
   2611   1.1  christos   dwarf2_emit_insn (size);
   2612   1.1  christos }
   2613   1.1  christos 
   2614   1.1  christos /* This routine is called each time a label definition is seen.  It
   2615   1.1  christos    emits a BFD_RELOC_SH_LABEL reloc if necessary.  */
   2616   1.1  christos 
   2617   1.1  christos void
   2618   1.1  christos sh_frob_label (symbolS *sym)
   2619   1.1  christos {
   2620   1.1  christos   static fragS *last_label_frag;
   2621   1.1  christos   static int last_label_offset;
   2622   1.1  christos 
   2623   1.1  christos   if (sh_relax
   2624   1.1  christos       && seg_info (now_seg)->tc_segment_info_data.in_code)
   2625   1.1  christos     {
   2626   1.1  christos       int offset;
   2627   1.1  christos 
   2628   1.1  christos       offset = frag_now_fix ();
   2629   1.1  christos       if (frag_now != last_label_frag
   2630   1.1  christos 	  || offset != last_label_offset)
   2631   1.1  christos 	{
   2632   1.1  christos 	  fix_new (frag_now, offset, 2, &abs_symbol, 0, 0, BFD_RELOC_SH_LABEL);
   2633   1.1  christos 	  last_label_frag = frag_now;
   2634   1.1  christos 	  last_label_offset = offset;
   2635   1.1  christos 	}
   2636   1.1  christos     }
   2637   1.1  christos 
   2638   1.1  christos   dwarf2_emit_label (sym);
   2639   1.1  christos }
   2640   1.1  christos 
   2641   1.1  christos /* This routine is called when the assembler is about to output some
   2642   1.1  christos    data.  It emits a BFD_RELOC_SH_DATA reloc if necessary.  */
   2643   1.1  christos 
   2644   1.1  christos void
   2645   1.1  christos sh_flush_pending_output (void)
   2646   1.1  christos {
   2647   1.1  christos   if (sh_relax
   2648   1.1  christos       && seg_info (now_seg)->tc_segment_info_data.in_code)
   2649   1.1  christos     {
   2650   1.1  christos       fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
   2651   1.1  christos 	       BFD_RELOC_SH_DATA);
   2652   1.1  christos       seg_info (now_seg)->tc_segment_info_data.in_code = 0;
   2653   1.1  christos     }
   2654   1.1  christos }
   2655   1.1  christos 
   2656   1.1  christos symbolS *
   2657   1.1  christos md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   2658   1.1  christos {
   2659   1.1  christos   return 0;
   2660   1.1  christos }
   2661   1.1  christos 
   2662   1.5  christos /* Various routines to kill one day.  */
   2663   1.1  christos 
   2664   1.1  christos const char *
   2665   1.1  christos md_atof (int type, char *litP, int *sizeP)
   2666   1.1  christos {
   2667   1.1  christos   return ieee_md_atof (type, litP, sizeP, target_big_endian);
   2668   1.1  christos }
   2669   1.1  christos 
   2670   1.1  christos /* Handle the .uses pseudo-op.  This pseudo-op is used just before a
   2671   1.1  christos    call instruction.  It refers to a label of the instruction which
   2672   1.1  christos    loads the register which the call uses.  We use it to generate a
   2673   1.1  christos    special reloc for the linker.  */
   2674   1.1  christos 
   2675   1.1  christos static void
   2676   1.1  christos s_uses (int ignore ATTRIBUTE_UNUSED)
   2677   1.1  christos {
   2678   1.1  christos   expressionS ex;
   2679   1.1  christos 
   2680   1.1  christos   if (! sh_relax)
   2681   1.1  christos     as_warn (_(".uses pseudo-op seen when not relaxing"));
   2682   1.1  christos 
   2683   1.1  christos   expression (&ex);
   2684   1.1  christos 
   2685   1.1  christos   if (ex.X_op != O_symbol || ex.X_add_number != 0)
   2686   1.1  christos     {
   2687   1.1  christos       as_bad (_("bad .uses format"));
   2688   1.1  christos       ignore_rest_of_line ();
   2689   1.1  christos       return;
   2690   1.1  christos     }
   2691   1.1  christos 
   2692   1.1  christos   fix_new_exp (frag_now, frag_now_fix (), 2, &ex, 1, BFD_RELOC_SH_USES);
   2693   1.1  christos 
   2694   1.1  christos   demand_empty_rest_of_line ();
   2695   1.1  christos }
   2696   1.1  christos 
   2697   1.1  christos enum options
   2699   1.1  christos {
   2700   1.1  christos   OPTION_RELAX = OPTION_MD_BASE,
   2701   1.1  christos   OPTION_BIG,
   2702   1.1  christos   OPTION_LITTLE,
   2703   1.1  christos   OPTION_SMALL,
   2704   1.1  christos   OPTION_DSP,
   2705   1.1  christos   OPTION_ISA,
   2706   1.1  christos   OPTION_RENESAS,
   2707   1.1  christos   OPTION_ALLOW_REG_PREFIX,
   2708   1.1  christos   OPTION_H_TICK_HEX,
   2709   1.1  christos #ifdef OBJ_ELF
   2710   1.1  christos   OPTION_FDPIC,
   2711   1.1  christos #endif
   2712  1.10  christos   OPTION_DUMMY  /* Not used.  This is just here to make it easy to add and subtract options from this enum.  */
   2713  1.10  christos };
   2714   1.1  christos 
   2715   1.1  christos const char md_shortopts[] = "";
   2716   1.1  christos const struct option md_longopts[] =
   2717   1.1  christos {
   2718   1.1  christos   {"relax", no_argument, NULL, OPTION_RELAX},
   2719   1.1  christos   {"big", no_argument, NULL, OPTION_BIG},
   2720   1.1  christos   {"little", no_argument, NULL, OPTION_LITTLE},
   2721   1.1  christos   /* The next two switches are here because the
   2722   1.1  christos      generic parts of the linker testsuite uses them.  */
   2723   1.1  christos   {"EB", no_argument, NULL, OPTION_BIG},
   2724   1.1  christos   {"EL", no_argument, NULL, OPTION_LITTLE},
   2725   1.1  christos   {"small", no_argument, NULL, OPTION_SMALL},
   2726   1.1  christos   {"dsp", no_argument, NULL, OPTION_DSP},
   2727   1.1  christos   {"isa", required_argument, NULL, OPTION_ISA},
   2728   1.1  christos   {"renesas", no_argument, NULL, OPTION_RENESAS},
   2729   1.1  christos   {"allow-reg-prefix", no_argument, NULL, OPTION_ALLOW_REG_PREFIX},
   2730   1.1  christos 
   2731   1.1  christos   { "h-tick-hex", no_argument,	      NULL, OPTION_H_TICK_HEX  },
   2732   1.1  christos 
   2733   1.1  christos #ifdef OBJ_ELF
   2734   1.1  christos   {"fdpic", no_argument, NULL, OPTION_FDPIC},
   2735   1.1  christos #endif
   2736  1.10  christos 
   2737   1.1  christos   {NULL, no_argument, NULL, 0}
   2738   1.1  christos };
   2739   1.5  christos const size_t md_longopts_size = sizeof (md_longopts);
   2740   1.1  christos 
   2741   1.1  christos int
   2742   1.1  christos md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
   2743   1.1  christos {
   2744   1.1  christos   switch (c)
   2745   1.1  christos     {
   2746   1.1  christos     case OPTION_RELAX:
   2747   1.1  christos       sh_relax = 1;
   2748   1.1  christos       break;
   2749   1.1  christos 
   2750   1.1  christos     case OPTION_BIG:
   2751   1.1  christos       target_big_endian = 1;
   2752   1.1  christos       break;
   2753   1.1  christos 
   2754   1.1  christos     case OPTION_LITTLE:
   2755   1.1  christos       target_big_endian = 0;
   2756   1.1  christos       break;
   2757   1.1  christos 
   2758   1.1  christos     case OPTION_SMALL:
   2759   1.1  christos       sh_small = 1;
   2760   1.1  christos       break;
   2761   1.1  christos 
   2762   1.1  christos     case OPTION_DSP:
   2763   1.1  christos       preset_target_arch = arch_sh_up & ~(arch_sh_sp_fpu|arch_sh_dp_fpu);
   2764   1.1  christos       break;
   2765   1.1  christos 
   2766   1.1  christos     case OPTION_RENESAS:
   2767   1.1  christos       dont_adjust_reloc_32 = 1;
   2768   1.1  christos       break;
   2769   1.1  christos 
   2770   1.1  christos     case OPTION_ALLOW_REG_PREFIX:
   2771   1.1  christos       allow_dollar_register_prefix = 1;
   2772   1.1  christos       break;
   2773   1.1  christos 
   2774   1.1  christos     case OPTION_ISA:
   2775   1.1  christos       if (strcasecmp (arg, "dsp") == 0)
   2776   1.1  christos 	preset_target_arch = arch_sh_up & ~(arch_sh_sp_fpu|arch_sh_dp_fpu);
   2777   1.1  christos       else if (strcasecmp (arg, "fp") == 0)
   2778   1.1  christos 	preset_target_arch = arch_sh_up & ~arch_sh_has_dsp;
   2779   1.1  christos       else if (strcasecmp (arg, "any") == 0)
   2780   1.1  christos 	preset_target_arch = arch_sh_up;
   2781   1.1  christos       else
   2782   1.1  christos 	{
   2783   1.1  christos 	  extern const bfd_arch_info_type bfd_sh_arch;
   2784   1.1  christos 	  bfd_arch_info_type const *bfd_arch = &bfd_sh_arch;
   2785   1.1  christos 
   2786   1.1  christos 	  preset_target_arch = 0;
   2787   1.3  christos 	  for (; bfd_arch; bfd_arch=bfd_arch->next)
   2788   1.1  christos 	    {
   2789   1.1  christos 	      int len = strlen(bfd_arch->printable_name);
   2790   1.1  christos 
   2791   1.1  christos 	      if (strncasecmp (bfd_arch->printable_name, arg, len) != 0)
   2792   1.1  christos 		continue;
   2793   1.1  christos 
   2794   1.1  christos 	      if (arg[len] == '\0')
   2795   1.1  christos 		preset_target_arch =
   2796   1.1  christos 		  sh_get_arch_from_bfd_mach (bfd_arch->mach);
   2797   1.1  christos 	      else if (strcasecmp(&arg[len], "-up") == 0)
   2798   1.1  christos 		preset_target_arch =
   2799   1.1  christos 		  sh_get_arch_up_from_bfd_mach (bfd_arch->mach);
   2800   1.1  christos 	      else
   2801   1.3  christos 		continue;
   2802   1.1  christos 	      break;
   2803   1.1  christos 	    }
   2804   1.1  christos 
   2805   1.1  christos 	  if (!preset_target_arch)
   2806   1.1  christos 	    as_bad (_("Invalid argument to --isa option: %s"), arg);
   2807   1.1  christos 	}
   2808   1.1  christos       break;
   2809   1.1  christos 
   2810   1.1  christos     case OPTION_H_TICK_HEX:
   2811   1.1  christos       enable_h_tick_hex = 1;
   2812   1.1  christos       break;
   2813   1.8  christos 
   2814   1.1  christos #ifdef OBJ_ELF
   2815   1.1  christos     case OPTION_FDPIC:
   2816   1.1  christos       sh_fdpic = true;
   2817   1.1  christos       break;
   2818   1.1  christos #endif /* OBJ_ELF */
   2819   1.1  christos 
   2820   1.1  christos     default:
   2821   1.1  christos       return 0;
   2822   1.1  christos     }
   2823   1.1  christos 
   2824   1.1  christos   return 1;
   2825   1.1  christos }
   2826   1.1  christos 
   2827   1.1  christos void
   2828   1.1  christos md_show_usage (FILE *stream)
   2829   1.1  christos {
   2830   1.1  christos   fprintf (stream, _("\
   2831   1.1  christos SH options:\n\
   2832   1.1  christos --little		generate little endian code\n\
   2833   1.1  christos --big			generate big endian code\n\
   2834   1.1  christos --relax			alter jump instructions for long displacements\n\
   2835   1.1  christos --renesas		disable optimization with section symbol for\n\
   2836   1.1  christos 			compatibility with Renesas assembler.\n\
   2837   1.1  christos --small			align sections to 4 byte boundaries, not 16\n\
   2838   1.1  christos --dsp			enable sh-dsp insns, and disable floating-point ISAs.\n\
   2839   1.1  christos --allow-reg-prefix	allow '$' as a register name prefix.\n\
   2840   1.1  christos --isa=[any		use most appropriate isa\n\
   2841   1.1  christos     | dsp               same as '-dsp'\n\
   2842   1.1  christos     | fp"));
   2843   1.1  christos   {
   2844   1.1  christos     extern const bfd_arch_info_type bfd_sh_arch;
   2845   1.6  christos     bfd_arch_info_type const *bfd_arch = &bfd_sh_arch;
   2846   1.6  christos 
   2847   1.6  christos     for (; bfd_arch; bfd_arch=bfd_arch->next)
   2848   1.6  christos       {
   2849   1.1  christos 	fprintf (stream, "\n    | %s", bfd_arch->printable_name);
   2850   1.1  christos 	fprintf (stream, "\n    | %s-up", bfd_arch->printable_name);
   2851   1.1  christos       }
   2852   1.1  christos   }
   2853   1.1  christos   fprintf (stream, "]\n");
   2854   1.1  christos #ifdef OBJ_ELF
   2855   1.1  christos   fprintf (stream, _("\
   2856   1.1  christos --fdpic			generate an FDPIC object file\n"));
   2857   1.1  christos #endif /* OBJ_ELF */
   2858   1.1  christos }
   2859   1.1  christos 
   2860   1.1  christos /* This struct is used to pass arguments to sh_count_relocs through
   2862   1.1  christos    bfd_map_over_sections.  */
   2863   1.1  christos 
   2864   1.1  christos struct sh_count_relocs
   2865   1.1  christos {
   2866   1.1  christos   /* Symbol we are looking for.  */
   2867   1.1  christos   symbolS *sym;
   2868   1.1  christos   /* Count of relocs found.  */
   2869   1.1  christos   int count;
   2870   1.1  christos };
   2871   1.1  christos 
   2872   1.1  christos /* Count the number of fixups in a section which refer to a particular
   2873   1.1  christos    symbol.  This is called via bfd_map_over_sections.  */
   2874  1.10  christos 
   2875   1.1  christos static void
   2876   1.1  christos sh_count_relocs (bfd *abfd ATTRIBUTE_UNUSED, segT sec, void *data)
   2877   1.1  christos {
   2878   1.1  christos   struct sh_count_relocs *info = data;
   2879   1.1  christos   segment_info_type *seginfo;
   2880   1.1  christos   symbolS *sym;
   2881   1.1  christos   fixS *fix;
   2882   1.1  christos 
   2883   1.1  christos   seginfo = seg_info (sec);
   2884   1.1  christos   if (seginfo == NULL)
   2885   1.1  christos     return;
   2886   1.1  christos 
   2887   1.1  christos   sym = info->sym;
   2888   1.1  christos   for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
   2889   1.1  christos     {
   2890   1.1  christos       if (fix->fx_addsy == sym)
   2891   1.1  christos 	{
   2892   1.1  christos 	  ++info->count;
   2893   1.1  christos 	  fix->fx_tcbit = 1;
   2894   1.1  christos 	}
   2895   1.1  christos     }
   2896   1.1  christos }
   2897   1.1  christos 
   2898   1.1  christos /* Handle the count relocs for a particular section.
   2899   1.1  christos    This is called via bfd_map_over_sections.  */
   2900   1.1  christos 
   2901   1.1  christos static void
   2902   1.1  christos sh_frob_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec,
   2903   1.1  christos 		 void *ignore ATTRIBUTE_UNUSED)
   2904   1.1  christos {
   2905   1.1  christos   segment_info_type *seginfo;
   2906   1.1  christos   fixS *fix;
   2907   1.1  christos 
   2908   1.1  christos   seginfo = seg_info (sec);
   2909   1.1  christos   if (seginfo == NULL)
   2910   1.1  christos     return;
   2911   1.1  christos 
   2912   1.1  christos   for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
   2913   1.1  christos     {
   2914   1.1  christos       symbolS *sym;
   2915   1.1  christos       bfd_vma val;
   2916   1.1  christos       fixS *fscan;
   2917   1.1  christos       struct sh_count_relocs info;
   2918   1.1  christos 
   2919   1.1  christos       if (fix->fx_r_type != BFD_RELOC_SH_USES)
   2920   1.1  christos 	continue;
   2921   1.1  christos 
   2922   1.1  christos       /* The BFD_RELOC_SH_USES reloc should refer to a defined local
   2923   1.1  christos 	 symbol in the same section.  */
   2924   1.1  christos       sym = fix->fx_addsy;
   2925   1.1  christos       if (sym == NULL
   2926   1.1  christos 	  || fix->fx_subsy != NULL
   2927   1.1  christos 	  || fix->fx_addnumber != 0
   2928   1.1  christos 	  || S_GET_SEGMENT (sym) != sec
   2929   1.1  christos 	  || S_IS_EXTERNAL (sym))
   2930   1.1  christos 	{
   2931   1.1  christos 	  as_warn_where (fix->fx_file, fix->fx_line,
   2932   1.1  christos 			 _(".uses does not refer to a local symbol in the same section"));
   2933   1.1  christos 	  continue;
   2934   1.1  christos 	}
   2935   1.1  christos 
   2936   1.1  christos       /* Look through the fixups again, this time looking for one
   2937   1.1  christos 	 at the same location as sym.  */
   2938   1.1  christos       val = S_GET_VALUE (sym);
   2939   1.1  christos       for (fscan = seginfo->fix_root;
   2940   1.1  christos 	   fscan != NULL;
   2941   1.1  christos 	   fscan = fscan->fx_next)
   2942   1.1  christos 	if (val == fscan->fx_frag->fr_address + fscan->fx_where
   2943   1.1  christos 	    && fscan->fx_r_type != BFD_RELOC_SH_ALIGN
   2944   1.1  christos 	    && fscan->fx_r_type != BFD_RELOC_SH_CODE
   2945   1.1  christos 	    && fscan->fx_r_type != BFD_RELOC_SH_DATA
   2946   1.1  christos 	    && fscan->fx_r_type != BFD_RELOC_SH_LABEL)
   2947   1.1  christos 	  break;
   2948   1.1  christos       if (fscan == NULL)
   2949   1.1  christos 	{
   2950   1.1  christos 	  as_warn_where (fix->fx_file, fix->fx_line,
   2951   1.1  christos 			 _("can't find fixup pointed to by .uses"));
   2952   1.1  christos 	  continue;
   2953   1.1  christos 	}
   2954   1.1  christos 
   2955   1.1  christos       if (fscan->fx_tcbit)
   2956   1.1  christos 	{
   2957   1.1  christos 	  /* We've already done this one.  */
   2958   1.1  christos 	  continue;
   2959   1.1  christos 	}
   2960   1.1  christos 
   2961   1.1  christos       /* The variable fscan should also be a fixup to a local symbol
   2962   1.1  christos 	 in the same section.  */
   2963   1.1  christos       sym = fscan->fx_addsy;
   2964   1.1  christos       if (sym == NULL
   2965   1.1  christos 	  || fscan->fx_subsy != NULL
   2966   1.1  christos 	  || fscan->fx_addnumber != 0
   2967   1.1  christos 	  || S_GET_SEGMENT (sym) != sec
   2968   1.1  christos 	  || S_IS_EXTERNAL (sym))
   2969   1.1  christos 	{
   2970   1.1  christos 	  as_warn_where (fix->fx_file, fix->fx_line,
   2971   1.1  christos 			 _(".uses target does not refer to a local symbol in the same section"));
   2972   1.1  christos 	  continue;
   2973   1.1  christos 	}
   2974   1.1  christos 
   2975   1.1  christos       /* Now we look through all the fixups of all the sections,
   2976   1.1  christos 	 counting the number of times we find a reference to sym.  */
   2977   1.1  christos       info.sym = sym;
   2978   1.1  christos       info.count = 0;
   2979   1.1  christos       bfd_map_over_sections (stdoutput, sh_count_relocs, &info);
   2980   1.1  christos 
   2981   1.1  christos       if (info.count < 1)
   2982   1.1  christos 	abort ();
   2983   1.1  christos 
   2984   1.1  christos       /* Generate a BFD_RELOC_SH_COUNT fixup at the location of sym.
   2985   1.1  christos 	 We have already adjusted the value of sym to include the
   2986   1.1  christos 	 fragment address, so we undo that adjustment here.  */
   2987   1.1  christos       subseg_change (sec, 0);
   2988   1.1  christos       fix_new (fscan->fx_frag,
   2989   1.1  christos 	       S_GET_VALUE (sym) - fscan->fx_frag->fr_address,
   2990   1.1  christos 	       4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT);
   2991   1.1  christos     }
   2992   1.1  christos }
   2993   1.1  christos 
   2994   1.1  christos /* This function is called after the symbol table has been completed,
   2995   1.1  christos    but before the relocs or section contents have been written out.
   2996   1.1  christos    If we have seen any .uses pseudo-ops, they point to an instruction
   2997   1.1  christos    which loads a register with the address of a function.  We look
   2998   1.1  christos    through the fixups to find where the function address is being
   2999   1.1  christos    loaded from.  We then generate a COUNT reloc giving the number of
   3000   1.1  christos    times that function address is referred to.  The linker uses this
   3001   1.1  christos    information when doing relaxing, to decide when it can eliminate
   3002   1.1  christos    the stored function address entirely.  */
   3003   1.1  christos 
   3004   1.1  christos void
   3005   1.1  christos sh_frob_file (void)
   3006   1.1  christos {
   3007   1.1  christos   if (! sh_relax)
   3008   1.1  christos     return;
   3009   1.1  christos 
   3010   1.1  christos   bfd_map_over_sections (stdoutput, sh_frob_section, NULL);
   3011   1.1  christos }
   3012   1.1  christos 
   3013   1.1  christos /* Called after relaxing.  Set the correct sizes of the fragments, and
   3014   1.1  christos    create relocs so that md_apply_fix will fill in the correct values.  */
   3015   1.1  christos 
   3016   1.1  christos void
   3017   1.1  christos md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT seg, fragS *fragP)
   3018   1.1  christos {
   3019   1.1  christos   int donerelax = 0;
   3020   1.1  christos 
   3021   1.1  christos   switch (fragP->fr_subtype)
   3022   1.1  christos     {
   3023   1.1  christos     case C (COND_JUMP, COND8):
   3024   1.1  christos     case C (COND_JUMP_DELAY, COND8):
   3025   1.1  christos       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
   3026   1.1  christos 	       1, BFD_RELOC_SH_PCDISP8BY2);
   3027   1.1  christos       fragP->fr_fix += 2;
   3028   1.1  christos       fragP->fr_var = 0;
   3029   1.1  christos       break;
   3030   1.1  christos 
   3031   1.1  christos     case C (UNCOND_JUMP, UNCOND12):
   3032   1.1  christos       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
   3033   1.1  christos 	       1, BFD_RELOC_SH_PCDISP12BY2);
   3034   1.1  christos       fragP->fr_fix += 2;
   3035   1.1  christos       fragP->fr_var = 0;
   3036   1.1  christos       break;
   3037   1.1  christos 
   3038   1.1  christos     case C (UNCOND_JUMP, UNCOND32):
   3039   1.1  christos     case C (UNCOND_JUMP, UNDEF_WORD_DISP):
   3040   1.1  christos       if (fragP->fr_symbol == NULL)
   3041   1.1  christos 	as_bad_where (fragP->fr_file, fragP->fr_line,
   3042   1.1  christos 		      _("displacement overflows 12-bit field"));
   3043   1.1  christos       else if (S_IS_DEFINED (fragP->fr_symbol))
   3044   1.1  christos 	as_bad_where (fragP->fr_file, fragP->fr_line,
   3045   1.1  christos 		      _("displacement to defined symbol %s overflows 12-bit field"),
   3046   1.1  christos 		      S_GET_NAME (fragP->fr_symbol));
   3047   1.1  christos       else
   3048   1.1  christos 	as_bad_where (fragP->fr_file, fragP->fr_line,
   3049   1.1  christos 		      _("displacement to undefined symbol %s overflows 12-bit field"),
   3050   1.1  christos 		      S_GET_NAME (fragP->fr_symbol));
   3051   1.1  christos       /* Stabilize this frag, so we don't trip an assert.  */
   3052   1.1  christos       fragP->fr_fix += fragP->fr_var;
   3053   1.1  christos       fragP->fr_var = 0;
   3054   1.1  christos       break;
   3055   1.1  christos 
   3056   1.1  christos     case C (COND_JUMP, COND12):
   3057   1.1  christos     case C (COND_JUMP_DELAY, COND12):
   3058   1.1  christos       /* A bcond won't fit, so turn it into a b!cond; bra disp; nop.  */
   3059   1.1  christos       /* I found that a relax failure for gcc.c-torture/execute/930628-1.c
   3060   1.1  christos 	 was due to gas incorrectly relaxing an out-of-range conditional
   3061   1.1  christos 	 branch with delay slot.  It turned:
   3062   1.1  christos                      bf.s    L6              (slot mov.l   r12,@(44,r0))
   3063   1.1  christos          into:
   3064   1.1  christos 
   3065   1.1  christos 2c:  8f 01 a0 8b     bf.s    32 <_main+32>   (slot bra       L6)
   3066   1.1  christos 30:  00 09           nop
   3067   1.1  christos 32:  10 cb           mov.l   r12,@(44,r0)
   3068   1.8  christos          Therefore, branches with delay slots have to be handled
   3069   1.1  christos 	 differently from ones without delay slots.  */
   3070   1.1  christos       {
   3071   1.1  christos 	unsigned char *buffer =
   3072   1.1  christos 	  (unsigned char *) (fragP->fr_fix + &fragP->fr_literal[0]);
   3073   1.1  christos 	int highbyte = target_big_endian ? 0 : 1;
   3074   1.1  christos 	int lowbyte = target_big_endian ? 1 : 0;
   3075   1.1  christos 	int delay = fragP->fr_subtype == C (COND_JUMP_DELAY, COND12);
   3076   1.1  christos 
   3077   1.1  christos 	/* Toggle the true/false bit of the bcond.  */
   3078   1.1  christos 	buffer[highbyte] ^= 0x2;
   3079   1.1  christos 
   3080   1.1  christos 	/* If this is a delayed branch, we may not put the bra in the
   3081   1.1  christos 	   slot.  So we change it to a non-delayed branch, like that:
   3082   1.1  christos 	   b! cond slot_label; bra disp; slot_label: slot_insn
   3083   1.1  christos 	   ??? We should try if swapping the conditional branch and
   3084   1.1  christos 	   its delay-slot insn already makes the branch reach.  */
   3085   1.1  christos 
   3086   1.1  christos 	/* Build a relocation to six / four bytes farther on.  */
   3087   1.1  christos 	fix_new (fragP, fragP->fr_fix, 2, section_symbol (seg),
   3088   1.1  christos 		 fragP->fr_address + fragP->fr_fix + (delay ? 4 : 6),
   3089   1.1  christos 		 1, BFD_RELOC_SH_PCDISP8BY2);
   3090   1.1  christos 
   3091   1.1  christos 	/* Set up a jump instruction.  */
   3092   1.1  christos 	buffer[highbyte + 2] = 0xa0;
   3093   1.1  christos 	buffer[lowbyte + 2] = 0;
   3094   1.1  christos 	fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
   3095   1.1  christos 		 fragP->fr_offset, 1, BFD_RELOC_SH_PCDISP12BY2);
   3096   1.1  christos 
   3097   1.1  christos 	if (delay)
   3098   1.1  christos 	  {
   3099   1.1  christos 	    buffer[highbyte] &= ~0x4; /* Removes delay slot from branch.  */
   3100   1.1  christos 	    fragP->fr_fix += 4;
   3101   1.1  christos 	  }
   3102   1.1  christos 	else
   3103   1.1  christos 	  {
   3104   1.1  christos 	    /* Fill in a NOP instruction.  */
   3105   1.1  christos 	    buffer[highbyte + 4] = 0x0;
   3106   1.1  christos 	    buffer[lowbyte + 4] = 0x9;
   3107   1.1  christos 
   3108   1.1  christos 	    fragP->fr_fix += 6;
   3109   1.1  christos 	  }
   3110   1.1  christos 	fragP->fr_var = 0;
   3111   1.1  christos 	donerelax = 1;
   3112   1.1  christos       }
   3113   1.1  christos       break;
   3114   1.1  christos 
   3115   1.1  christos     case C (COND_JUMP, COND32):
   3116   1.1  christos     case C (COND_JUMP_DELAY, COND32):
   3117   1.1  christos     case C (COND_JUMP, UNDEF_WORD_DISP):
   3118   1.1  christos     case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
   3119   1.1  christos       if (fragP->fr_symbol == NULL)
   3120   1.1  christos 	as_bad_where (fragP->fr_file, fragP->fr_line,
   3121   1.1  christos 		      _("displacement overflows 8-bit field"));
   3122   1.1  christos       else if (S_IS_DEFINED (fragP->fr_symbol))
   3123   1.1  christos 	as_bad_where (fragP->fr_file, fragP->fr_line,
   3124   1.1  christos 		      _("displacement to defined symbol %s overflows 8-bit field"),
   3125   1.1  christos 		      S_GET_NAME (fragP->fr_symbol));
   3126   1.1  christos       else
   3127   1.1  christos 	as_bad_where (fragP->fr_file, fragP->fr_line,
   3128   1.1  christos 		      _("displacement to undefined symbol %s overflows 8-bit field "),
   3129   1.1  christos 		      S_GET_NAME (fragP->fr_symbol));
   3130   1.1  christos       /* Stabilize this frag, so we don't trip an assert.  */
   3131   1.1  christos       fragP->fr_fix += fragP->fr_var;
   3132   1.1  christos       fragP->fr_var = 0;
   3133   1.1  christos       break;
   3134   1.1  christos 
   3135   1.1  christos     default:
   3136   1.1  christos       abort ();
   3137   1.1  christos     }
   3138   1.1  christos 
   3139   1.1  christos   if (donerelax && !sh_relax)
   3140   1.1  christos     as_warn_where (fragP->fr_file, fragP->fr_line,
   3141   1.1  christos 		   _("overflow in branch to %s; converted into longer instruction sequence"),
   3142   1.1  christos 		   (fragP->fr_symbol != NULL
   3143   1.1  christos 		    ? S_GET_NAME (fragP->fr_symbol)
   3144   1.1  christos 		    : ""));
   3145   1.1  christos }
   3146   1.1  christos 
   3147   1.1  christos valueT
   3148   1.1  christos md_section_align (segT seg ATTRIBUTE_UNUSED, valueT size)
   3149   1.7  christos {
   3150   1.7  christos #ifdef OBJ_ELF
   3151   1.1  christos   return size;
   3152   1.1  christos #else /* ! OBJ_ELF */
   3153   1.1  christos   return ((size + (1 << bfd_section_alignment (seg)) - 1)
   3154   1.1  christos 	  & -(1 << bfd_section_alignment (seg)));
   3155   1.1  christos #endif /* ! OBJ_ELF */
   3156   1.1  christos }
   3157   1.1  christos 
   3158   1.1  christos /* This static variable is set by s_uacons to tell sh_cons_align that
   3159   1.1  christos    the expression does not need to be aligned.  */
   3160   1.1  christos 
   3161   1.1  christos static int sh_no_align_cons = 0;
   3162   1.1  christos 
   3163   1.1  christos /* This handles the unaligned space allocation pseudo-ops, such as
   3164   1.1  christos    .uaword.  .uaword is just like .word, but the value does not need
   3165   1.1  christos    to be aligned.  */
   3166   1.1  christos 
   3167   1.1  christos static void
   3168   1.1  christos s_uacons (int bytes)
   3169   1.1  christos {
   3170   1.1  christos   /* Tell sh_cons_align not to align this value.  */
   3171   1.1  christos   sh_no_align_cons = 1;
   3172   1.1  christos   cons (bytes);
   3173   1.1  christos }
   3174   1.1  christos 
   3175   1.1  christos /* If a .word, et. al., pseud-op is seen, warn if the value is not
   3176   1.1  christos    aligned correctly.  Note that this can cause warnings to be issued
   3177   1.1  christos    when assembling initialized structured which were declared with the
   3178   1.1  christos    packed attribute.  FIXME: Perhaps we should require an option to
   3179   1.1  christos    enable this warning?  */
   3180   1.1  christos 
   3181   1.1  christos void
   3182   1.1  christos sh_cons_align (int nbytes)
   3183   1.1  christos {
   3184   1.1  christos   int nalign;
   3185   1.1  christos 
   3186   1.1  christos   if (sh_no_align_cons)
   3187   1.1  christos     {
   3188   1.1  christos       /* This is an unaligned pseudo-op.  */
   3189   1.1  christos       sh_no_align_cons = 0;
   3190   1.1  christos       return;
   3191   1.1  christos     }
   3192   1.1  christos 
   3193   1.1  christos   nalign = 0;
   3194   1.1  christos   while ((nbytes & 1) == 0)
   3195   1.1  christos     {
   3196   1.1  christos       ++nalign;
   3197   1.1  christos       nbytes >>= 1;
   3198   1.1  christos     }
   3199   1.1  christos 
   3200   1.1  christos   if (nalign == 0)
   3201   1.1  christos     return;
   3202   1.1  christos 
   3203   1.1  christos   if (now_seg == absolute_section)
   3204   1.1  christos     {
   3205   1.1  christos       if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
   3206  1.10  christos 	as_warn (_("misaligned data"));
   3207   1.1  christos       return;
   3208   1.1  christos     }
   3209   1.1  christos 
   3210   1.1  christos   frag_var (rs_align_test, 1, 1, 0, NULL, nalign, NULL);
   3211   1.1  christos 
   3212   1.1  christos   record_alignment (now_seg, nalign);
   3213   1.1  christos }
   3214   1.1  christos 
   3215   1.1  christos /* When relaxing, we need to output a reloc for any .align directive
   3216   1.1  christos    that requests alignment to a four byte boundary or larger.  This is
   3217   1.1  christos    also where we check for misaligned data.  */
   3218   1.1  christos 
   3219   1.1  christos void
   3220   1.1  christos sh_handle_align (fragS *frag)
   3221   1.1  christos {
   3222   1.1  christos   int bytes = frag->fr_next->fr_address - frag->fr_address - frag->fr_fix;
   3223   1.1  christos 
   3224   1.1  christos   if (frag->fr_type == rs_align_code)
   3225   1.1  christos     {
   3226   1.1  christos       static const unsigned char big_nop_pattern[] = { 0x00, 0x09 };
   3227   1.1  christos       static const unsigned char little_nop_pattern[] = { 0x09, 0x00 };
   3228   1.1  christos 
   3229   1.1  christos       char *p = frag->fr_literal + frag->fr_fix;
   3230   1.1  christos 
   3231   1.1  christos       if (bytes & 1)
   3232   1.1  christos 	{
   3233   1.1  christos 	  *p++ = 0;
   3234   1.1  christos 	  bytes--;
   3235   1.1  christos 	  frag->fr_fix += 1;
   3236   1.1  christos 	}
   3237   1.1  christos 
   3238   1.1  christos       if (target_big_endian)
   3239   1.1  christos 	{
   3240   1.1  christos 	  memcpy (p, big_nop_pattern, sizeof big_nop_pattern);
   3241   1.1  christos 	  frag->fr_var = sizeof big_nop_pattern;
   3242   1.1  christos 	}
   3243   1.1  christos       else
   3244   1.1  christos 	{
   3245   1.1  christos 	  memcpy (p, little_nop_pattern, sizeof little_nop_pattern);
   3246   1.1  christos 	  frag->fr_var = sizeof little_nop_pattern;
   3247   1.1  christos 	}
   3248   1.1  christos     }
   3249   1.1  christos   else if (frag->fr_type == rs_align_test)
   3250   1.1  christos     {
   3251   1.1  christos       if (bytes != 0)
   3252   1.1  christos 	as_bad_where (frag->fr_file, frag->fr_line, _("misaligned data"));
   3253   1.1  christos     }
   3254   1.1  christos 
   3255   1.1  christos   if (sh_relax
   3256   1.1  christos       && (frag->fr_type == rs_align
   3257   1.1  christos 	  || frag->fr_type == rs_align_code)
   3258   1.1  christos       && frag->fr_address + frag->fr_fix > 0
   3259   1.1  christos       && frag->fr_offset > 1
   3260   1.1  christos       && now_seg != bss_section)
   3261   1.1  christos     fix_new (frag, frag->fr_fix, 2, &abs_symbol, frag->fr_offset, 0,
   3262   1.1  christos 	     BFD_RELOC_SH_ALIGN);
   3263   1.8  christos }
   3264   1.1  christos 
   3265   1.1  christos /* See whether the relocation should be resolved locally.  */
   3266   1.1  christos 
   3267   1.1  christos static bool
   3268   1.1  christos sh_local_pcrel (fixS *fix)
   3269   1.1  christos {
   3270   1.1  christos   return (! sh_relax
   3271   1.1  christos 	  && (fix->fx_r_type == BFD_RELOC_SH_PCDISP8BY2
   3272   1.1  christos 	      || fix->fx_r_type == BFD_RELOC_SH_PCDISP12BY2
   3273   1.1  christos 	      || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY2
   3274   1.1  christos 	      || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY4
   3275   1.1  christos 	      || fix->fx_r_type == BFD_RELOC_8_PCREL
   3276   1.1  christos 	      || fix->fx_r_type == BFD_RELOC_SH_SWITCH16
   3277   1.1  christos 	      || fix->fx_r_type == BFD_RELOC_SH_SWITCH32));
   3278   1.1  christos }
   3279   1.1  christos 
   3280   1.1  christos /* See whether we need to force a relocation into the output file.
   3281   1.1  christos    This is used to force out switch and PC relative relocations when
   3282   1.1  christos    relaxing.  */
   3283   1.1  christos 
   3284   1.1  christos int
   3285   1.1  christos sh_force_relocation (fixS *fix)
   3286   1.1  christos {
   3287   1.1  christos   /* These relocations can't make it into a DSO, so no use forcing
   3288   1.1  christos      them for global symbols.  */
   3289   1.1  christos   if (sh_local_pcrel (fix))
   3290   1.1  christos     return 0;
   3291   1.1  christos 
   3292   1.1  christos   /* Make sure some relocations get emitted.  */
   3293   1.1  christos   if (fix->fx_r_type == BFD_RELOC_SH_LOOP_START
   3294   1.1  christos       || fix->fx_r_type == BFD_RELOC_SH_LOOP_END
   3295   1.1  christos       || fix->fx_r_type == BFD_RELOC_SH_TLS_GD_32
   3296   1.1  christos       || fix->fx_r_type == BFD_RELOC_SH_TLS_LD_32
   3297   1.1  christos       || fix->fx_r_type == BFD_RELOC_SH_TLS_IE_32
   3298   1.1  christos       || fix->fx_r_type == BFD_RELOC_SH_TLS_LDO_32
   3299   1.1  christos       || fix->fx_r_type == BFD_RELOC_SH_TLS_LE_32
   3300   1.1  christos       || generic_force_reloc (fix))
   3301   1.1  christos     return 1;
   3302   1.1  christos 
   3303   1.1  christos   if (! sh_relax)
   3304   1.1  christos     return 0;
   3305   1.1  christos 
   3306   1.1  christos   return (fix->fx_pcrel
   3307   1.1  christos 	  || SWITCH_TABLE (fix)
   3308   1.1  christos 	  || fix->fx_r_type == BFD_RELOC_SH_COUNT
   3309   1.1  christos 	  || fix->fx_r_type == BFD_RELOC_SH_ALIGN
   3310   1.1  christos 	  || fix->fx_r_type == BFD_RELOC_SH_CODE
   3311   1.1  christos 	  || fix->fx_r_type == BFD_RELOC_SH_DATA
   3312   1.8  christos 	  || fix->fx_r_type == BFD_RELOC_SH_LABEL);
   3313   1.1  christos }
   3314   1.1  christos 
   3315   1.1  christos #ifdef OBJ_ELF
   3316   1.1  christos bool
   3317   1.1  christos sh_fix_adjustable (fixS *fixP)
   3318   1.1  christos {
   3319   1.1  christos   if (fixP->fx_r_type == BFD_RELOC_32_PLT_PCREL
   3320   1.1  christos       || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
   3321   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_GOT20
   3322   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_GOTPC
   3323   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_GOTFUNCDESC
   3324   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_GOTFUNCDESC20
   3325   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_GOTOFFFUNCDESC
   3326   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_GOTOFFFUNCDESC20
   3327   1.1  christos       || fixP->fx_r_type == BFD_RELOC_SH_FUNCDESC
   3328   1.1  christos       || ((fixP->fx_r_type == BFD_RELOC_32) && dont_adjust_reloc_32)
   3329   1.1  christos       || fixP->fx_r_type == BFD_RELOC_RVA)
   3330   1.1  christos     return 0;
   3331   1.1  christos 
   3332   1.1  christos   /* We need the symbol name for the VTABLE entries */
   3333   1.1  christos   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   3334   1.1  christos       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   3335   1.1  christos     return 0;
   3336   1.1  christos 
   3337   1.1  christos   return 1;
   3338   1.1  christos }
   3339   1.1  christos 
   3340   1.1  christos void
   3341   1.1  christos sh_elf_final_processing (void)
   3342   1.1  christos {
   3343   1.6  christos   int val;
   3344   1.1  christos 
   3345   1.1  christos   /* Set file-specific flags to indicate if this code needs
   3346   1.1  christos      a processor with the sh-dsp / sh2e ISA to execute.  */
   3347   1.1  christos   val = sh_find_elf_flags (valid_arch);
   3348   1.1  christos 
   3349   1.1  christos   elf_elfheader (stdoutput)->e_flags &= ~EF_SH_MACH_MASK;
   3350   1.1  christos   elf_elfheader (stdoutput)->e_flags |= val;
   3351   1.1  christos 
   3352   1.1  christos   if (sh_fdpic)
   3353   1.1  christos     elf_elfheader (stdoutput)->e_flags |= EF_SH_FDPIC;
   3354   1.1  christos }
   3355   1.1  christos #endif
   3356   1.1  christos 
   3357   1.1  christos #ifdef TE_UCLINUX
   3358   1.1  christos /* Return the target format for uClinux.  */
   3359   1.1  christos 
   3360   1.1  christos const char *
   3361   1.1  christos sh_uclinux_target_format (void)
   3362   1.1  christos {
   3363   1.1  christos   if (sh_fdpic)
   3364   1.1  christos     return (!target_big_endian ? "elf32-sh-fdpic" : "elf32-shbig-fdpic");
   3365   1.1  christos   else
   3366   1.1  christos     return (!target_big_endian ? "elf32-shl" : "elf32-sh");
   3367   1.1  christos }
   3368   1.1  christos #endif
   3369   1.1  christos 
   3370   1.1  christos /* Apply fixup FIXP to SIZE-byte field BUF given that VAL is its
   3371   1.1  christos    assembly-time value.  If we're generating a reloc for FIXP,
   3372   1.1  christos    see whether the addend should be stored in-place or whether
   3373   1.1  christos    it should be in an ELF r_addend field.  */
   3374   1.1  christos 
   3375   1.1  christos static void
   3376   1.1  christos apply_full_field_fix (fixS *fixP, char *buf, bfd_vma val, int size)
   3377   1.1  christos {
   3378   1.1  christos   reloc_howto_type *howto;
   3379   1.1  christos 
   3380   1.1  christos   if (fixP->fx_addsy != NULL || fixP->fx_pcrel)
   3381   1.1  christos     {
   3382   1.1  christos       howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
   3383   1.1  christos       if (howto && !howto->partial_inplace)
   3384   1.1  christos 	{
   3385   1.1  christos 	  fixP->fx_addnumber = val;
   3386   1.1  christos 	  return;
   3387   1.1  christos 	}
   3388   1.1  christos     }
   3389   1.1  christos   md_number_to_chars (buf, val, size);
   3390   1.1  christos }
   3391   1.1  christos 
   3392   1.1  christos /* Apply a fixup to the object file.  */
   3393   1.1  christos 
   3394   1.1  christos void
   3395   1.1  christos md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
   3396  1.10  christos {
   3397   1.1  christos   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
   3398   1.1  christos   int lowbyte = target_big_endian ? 1 : 0;
   3399   1.1  christos   int highbyte = target_big_endian ? 0 : 1;
   3400   1.1  christos   long val = *valP;
   3401   1.1  christos   long max, min;
   3402   1.1  christos   int shift;
   3403   1.1  christos 
   3404   1.1  christos   /* A difference between two symbols, the second of which is in the
   3405   1.1  christos      current section, is transformed in a PC-relative relocation to
   3406   1.1  christos      the other symbol.  We have to adjust the relocation type here.  */
   3407   1.1  christos   if (fixP->fx_pcrel)
   3408   1.1  christos     {
   3409   1.1  christos       switch (fixP->fx_r_type)
   3410   1.1  christos 	{
   3411   1.1  christos 	default:
   3412   1.1  christos 	  break;
   3413   1.1  christos 
   3414   1.1  christos 	case BFD_RELOC_32:
   3415   1.1  christos 	  fixP->fx_r_type = BFD_RELOC_32_PCREL;
   3416   1.1  christos 	  break;
   3417   1.1  christos 
   3418   1.1  christos 	  /* Currently, we only support 32-bit PCREL relocations.
   3419   1.1  christos 	     We'd need a new reloc type to handle 16_PCREL, and
   3420   1.1  christos 	     8_PCREL is already taken for R_SH_SWITCH8, which
   3421   1.1  christos 	     apparently does something completely different than what
   3422   1.1  christos 	     we need.  FIXME.  */
   3423   1.1  christos 	case BFD_RELOC_16:
   3424   1.1  christos 	  bfd_set_error (bfd_error_bad_value);
   3425   1.1  christos 	  return;
   3426   1.1  christos 
   3427   1.1  christos 	case BFD_RELOC_8:
   3428   1.1  christos 	  bfd_set_error (bfd_error_bad_value);
   3429   1.1  christos 	  return;
   3430   1.1  christos 	}
   3431   1.1  christos     }
   3432   1.1  christos 
   3433   1.1  christos   /* The function adjust_reloc_syms won't convert a reloc against a weak
   3434   1.1  christos      symbol into a reloc against a section, but bfd_install_relocation
   3435   1.1  christos      will screw up if the symbol is defined, so we have to adjust val here
   3436   1.1  christos      to avoid the screw up later.
   3437   1.1  christos 
   3438   1.1  christos      For ordinary relocs, this does not happen for ELF, since for ELF,
   3439   1.1  christos      bfd_install_relocation uses the "special function" field of the
   3440   1.1  christos      howto, and does not execute the code that needs to be undone, as long
   3441   1.1  christos      as the special function does not return bfd_reloc_continue.
   3442   1.1  christos      It can happen for GOT- and PLT-type relocs the way they are
   3443   1.1  christos      described in elf32-sh.c as they use bfd_elf_generic_reloc, but it
   3444   1.1  christos      doesn't matter here since those relocs don't use VAL; see below.  */
   3445   1.1  christos   if (OUTPUT_FLAVOR != bfd_target_elf_flavour
   3446   1.1  christos       && fixP->fx_addsy != NULL
   3447   1.1  christos       && S_IS_WEAK (fixP->fx_addsy))
   3448   1.1  christos     val -= S_GET_VALUE  (fixP->fx_addsy);
   3449   1.1  christos 
   3450   1.1  christos   if (SWITCH_TABLE (fixP))
   3451   1.1  christos     val -= S_GET_VALUE  (fixP->fx_subsy);
   3452   1.1  christos 
   3453   1.1  christos   max = min = 0;
   3454   1.1  christos   shift = 0;
   3455   1.1  christos   switch (fixP->fx_r_type)
   3456   1.1  christos     {
   3457   1.1  christos     case BFD_RELOC_SH_IMM3:
   3458   1.1  christos       max = 0x7;
   3459   1.1  christos       * buf = (* buf & 0xf8) | (val & 0x7);
   3460   1.1  christos       break;
   3461   1.1  christos     case BFD_RELOC_SH_IMM3U:
   3462   1.1  christos       max = 0x7;
   3463   1.1  christos       * buf = (* buf & 0x8f) | ((val & 0x7) << 4);
   3464   1.1  christos       break;
   3465   1.1  christos     case BFD_RELOC_SH_DISP12:
   3466   1.1  christos       max = 0xfff;
   3467   1.1  christos       buf[lowbyte] = val & 0xff;
   3468   1.1  christos       buf[highbyte] |= (val >> 8) & 0x0f;
   3469   1.1  christos       break;
   3470   1.1  christos     case BFD_RELOC_SH_DISP12BY2:
   3471   1.1  christos       max = 0xfff;
   3472   1.1  christos       shift = 1;
   3473   1.1  christos       buf[lowbyte] = (val >> 1) & 0xff;
   3474   1.1  christos       buf[highbyte] |= (val >> 9) & 0x0f;
   3475   1.1  christos       break;
   3476   1.1  christos     case BFD_RELOC_SH_DISP12BY4:
   3477   1.1  christos       max = 0xfff;
   3478   1.1  christos       shift = 2;
   3479   1.1  christos       buf[lowbyte] = (val >> 2) & 0xff;
   3480   1.1  christos       buf[highbyte] |= (val >> 10) & 0x0f;
   3481   1.1  christos       break;
   3482   1.1  christos     case BFD_RELOC_SH_DISP12BY8:
   3483   1.1  christos       max = 0xfff;
   3484   1.1  christos       shift = 3;
   3485   1.1  christos       buf[lowbyte] = (val >> 3) & 0xff;
   3486   1.1  christos       buf[highbyte] |= (val >> 11) & 0x0f;
   3487   1.1  christos       break;
   3488   1.1  christos     case BFD_RELOC_SH_DISP20:
   3489   1.1  christos       if (! target_big_endian)
   3490   1.1  christos 	abort();
   3491   1.1  christos       max = 0x7ffff;
   3492   1.1  christos       min = -0x80000;
   3493   1.1  christos       buf[1] = (buf[1] & 0x0f) | ((val >> 12) & 0xf0);
   3494   1.1  christos       buf[2] = (val >> 8) & 0xff;
   3495   1.1  christos       buf[3] = val & 0xff;
   3496   1.1  christos       break;
   3497   1.1  christos     case BFD_RELOC_SH_DISP20BY8:
   3498   1.1  christos       if (!target_big_endian)
   3499   1.1  christos 	abort();
   3500   1.1  christos       max = 0x7ffff;
   3501   1.1  christos       min = -0x80000;
   3502   1.1  christos       shift = 8;
   3503   1.1  christos       buf[1] = (buf[1] & 0x0f) | ((val >> 20) & 0xf0);
   3504   1.1  christos       buf[2] = (val >> 16) & 0xff;
   3505   1.1  christos       buf[3] = (val >> 8) & 0xff;
   3506   1.1  christos       break;
   3507   1.1  christos 
   3508   1.1  christos     case BFD_RELOC_SH_IMM4:
   3509   1.1  christos       max = 0xf;
   3510   1.1  christos       *buf = (*buf & 0xf0) | (val & 0xf);
   3511   1.1  christos       break;
   3512   1.1  christos 
   3513   1.1  christos     case BFD_RELOC_SH_IMM4BY2:
   3514   1.1  christos       max = 0xf;
   3515   1.1  christos       shift = 1;
   3516   1.1  christos       *buf = (*buf & 0xf0) | ((val >> 1) & 0xf);
   3517   1.1  christos       break;
   3518   1.1  christos 
   3519   1.1  christos     case BFD_RELOC_SH_IMM4BY4:
   3520   1.1  christos       max = 0xf;
   3521   1.1  christos       shift = 2;
   3522   1.1  christos       *buf = (*buf & 0xf0) | ((val >> 2) & 0xf);
   3523   1.1  christos       break;
   3524   1.1  christos 
   3525   1.1  christos     case BFD_RELOC_SH_IMM8BY2:
   3526   1.1  christos       max = 0xff;
   3527   1.1  christos       shift = 1;
   3528   1.1  christos       *buf = val >> 1;
   3529   1.1  christos       break;
   3530   1.1  christos 
   3531   1.1  christos     case BFD_RELOC_SH_IMM8BY4:
   3532   1.1  christos       max = 0xff;
   3533   1.1  christos       shift = 2;
   3534   1.1  christos       *buf = val >> 2;
   3535   1.1  christos       break;
   3536   1.1  christos 
   3537   1.1  christos     case BFD_RELOC_8:
   3538   1.1  christos     case BFD_RELOC_SH_IMM8:
   3539   1.1  christos       /* Sometimes the 8 bit value is sign extended (e.g., add) and
   3540   1.1  christos          sometimes it is not (e.g., and).  We permit any 8 bit value.
   3541   1.1  christos          Note that adding further restrictions may invalidate
   3542   1.1  christos          reasonable looking assembly code, such as ``and -0x1,r0''.  */
   3543   1.1  christos       max = 0xff;
   3544   1.1  christos       min = -0xff;
   3545   1.1  christos       *buf++ = val;
   3546   1.1  christos       break;
   3547   1.1  christos 
   3548   1.1  christos     case BFD_RELOC_SH_PCRELIMM8BY4:
   3549   1.1  christos       /* If we are dealing with a known destination ... */
   3550   1.1  christos       if ((fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy))
   3551   1.1  christos 	  && (fixP->fx_subsy == NULL || S_IS_DEFINED (fixP->fx_addsy)))
   3552   1.1  christos       {
   3553   1.1  christos 	/* Don't silently move the destination due to misalignment.
   3554   1.1  christos 	   The absolute address is the fragment base plus the offset into
   3555   1.1  christos 	   the fragment plus the pc relative offset to the label.  */
   3556   1.1  christos 	if ((fixP->fx_frag->fr_address + fixP->fx_where + val) & 3)
   3557   1.1  christos 	  as_bad_where (fixP->fx_file, fixP->fx_line,
   3558   1.1  christos 			_("offset to unaligned destination"));
   3559   1.1  christos 
   3560   1.1  christos 	/* The displacement cannot be zero or backward even if aligned.
   3561   1.1  christos 	   Allow -2 because val has already been adjusted somewhere.  */
   3562   1.1  christos 	if (val < -2)
   3563   1.1  christos 	  as_bad_where (fixP->fx_file, fixP->fx_line, _("negative offset"));
   3564   1.1  christos       }
   3565   1.1  christos 
   3566   1.1  christos       /* The lower two bits of the PC are cleared before the
   3567   1.1  christos          displacement is added in.  We can assume that the destination
   3568   1.1  christos          is on a 4 byte boundary.  If this instruction is also on a 4
   3569   1.1  christos          byte boundary, then we want
   3570   1.1  christos 	   (target - here) / 4
   3571   1.1  christos 	 and target - here is a multiple of 4.
   3572   1.1  christos 	 Otherwise, we are on a 2 byte boundary, and we want
   3573   1.1  christos 	   (target - (here - 2)) / 4
   3574   1.1  christos 	 and target - here is not a multiple of 4.  Computing
   3575   1.1  christos 	   (target - (here - 2)) / 4 == (target - here + 2) / 4
   3576   1.1  christos 	 works for both cases, since in the first case the addition of
   3577   1.1  christos 	 2 will be removed by the division.  target - here is in the
   3578   1.1  christos 	 variable val.  */
   3579   1.1  christos       val = (val + 2) / 4;
   3580   1.1  christos       if (val & ~0xff)
   3581   1.1  christos 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
   3582   1.1  christos       buf[lowbyte] = val;
   3583   1.1  christos       break;
   3584   1.1  christos 
   3585   1.1  christos     case BFD_RELOC_SH_PCRELIMM8BY2:
   3586   1.1  christos       val /= 2;
   3587   1.1  christos       if (val & ~0xff)
   3588   1.1  christos 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
   3589   1.1  christos       buf[lowbyte] = val;
   3590   1.1  christos       break;
   3591   1.1  christos 
   3592   1.1  christos     case BFD_RELOC_SH_PCDISP8BY2:
   3593   1.1  christos       val /= 2;
   3594   1.1  christos       if (val < -0x80 || val > 0x7f)
   3595   1.1  christos 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
   3596   1.1  christos       buf[lowbyte] = val;
   3597   1.1  christos       break;
   3598   1.1  christos 
   3599   1.1  christos     case BFD_RELOC_SH_PCDISP12BY2:
   3600   1.1  christos       val /= 2;
   3601   1.1  christos       if (val < -0x800 || val > 0x7ff)
   3602   1.1  christos 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
   3603   1.1  christos       buf[lowbyte] = val & 0xff;
   3604   1.1  christos       buf[highbyte] |= (val >> 8) & 0xf;
   3605   1.1  christos       break;
   3606   1.1  christos 
   3607   1.1  christos     case BFD_RELOC_32:
   3608   1.1  christos     case BFD_RELOC_32_PCREL:
   3609   1.1  christos       apply_full_field_fix (fixP, buf, val, 4);
   3610   1.1  christos       break;
   3611   1.1  christos 
   3612   1.1  christos     case BFD_RELOC_16:
   3613   1.1  christos       apply_full_field_fix (fixP, buf, val, 2);
   3614   1.1  christos       break;
   3615   1.1  christos 
   3616   1.1  christos     case BFD_RELOC_SH_USES:
   3617   1.1  christos       /* Pass the value into sh_reloc().  */
   3618   1.1  christos       fixP->fx_addnumber = val;
   3619   1.1  christos       break;
   3620   1.1  christos 
   3621   1.1  christos     case BFD_RELOC_SH_COUNT:
   3622   1.1  christos     case BFD_RELOC_SH_ALIGN:
   3623   1.1  christos     case BFD_RELOC_SH_CODE:
   3624   1.1  christos     case BFD_RELOC_SH_DATA:
   3625   1.1  christos     case BFD_RELOC_SH_LABEL:
   3626   1.1  christos       /* Nothing to do here.  */
   3627   1.1  christos       break;
   3628   1.1  christos 
   3629   1.1  christos     case BFD_RELOC_SH_LOOP_START:
   3630   1.1  christos     case BFD_RELOC_SH_LOOP_END:
   3631   1.1  christos 
   3632   1.1  christos     case BFD_RELOC_VTABLE_INHERIT:
   3633   1.1  christos     case BFD_RELOC_VTABLE_ENTRY:
   3634   1.1  christos       fixP->fx_done = 0;
   3635   1.1  christos       return;
   3636   1.1  christos 
   3637   1.1  christos #ifdef OBJ_ELF
   3638   1.1  christos     case BFD_RELOC_32_PLT_PCREL:
   3639   1.1  christos       /* Make the jump instruction point to the address of the operand.  At
   3640   1.1  christos 	 runtime we merely add the offset to the actual PLT entry.  */
   3641   1.1  christos       * valP = 0xfffffffc;
   3642   1.1  christos       val = fixP->fx_offset;
   3643   1.1  christos       if (fixP->fx_subsy)
   3644   1.1  christos 	val -= S_GET_VALUE (fixP->fx_subsy);
   3645   1.1  christos       apply_full_field_fix (fixP, buf, val, 4);
   3646   1.1  christos       break;
   3647   1.1  christos 
   3648   1.1  christos     case BFD_RELOC_SH_GOTPC:
   3649   1.1  christos       /* This is tough to explain.  We end up with this one if we have
   3650   1.1  christos          operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]".
   3651   1.1  christos          The goal here is to obtain the absolute address of the GOT,
   3652   1.1  christos          and it is strongly preferable from a performance point of
   3653   1.1  christos          view to avoid using a runtime relocation for this.  There are
   3654   1.1  christos          cases where you have something like:
   3655   1.1  christos 
   3656   1.1  christos          .long	_GLOBAL_OFFSET_TABLE_+[.-.L66]
   3657   1.1  christos 
   3658   1.1  christos          and here no correction would be required.  Internally in the
   3659   1.1  christos          assembler we treat operands of this form as not being pcrel
   3660   1.1  christos          since the '.' is explicitly mentioned, and I wonder whether
   3661   1.1  christos          it would simplify matters to do it this way.  Who knows.  In
   3662   1.1  christos          earlier versions of the PIC patches, the pcrel_adjust field
   3663   1.1  christos          was used to store the correction, but since the expression is
   3664   1.1  christos          not pcrel, I felt it would be confusing to do it this way.  */
   3665   1.1  christos       * valP -= 1;
   3666   1.1  christos       apply_full_field_fix (fixP, buf, val, 4);
   3667   1.1  christos       break;
   3668   1.1  christos 
   3669   1.1  christos     case BFD_RELOC_SH_TLS_GD_32:
   3670   1.1  christos     case BFD_RELOC_SH_TLS_LD_32:
   3671   1.1  christos     case BFD_RELOC_SH_TLS_IE_32:
   3672   1.1  christos       S_SET_THREAD_LOCAL (fixP->fx_addsy);
   3673   1.1  christos       /* Fallthrough */
   3674   1.1  christos     case BFD_RELOC_32_GOT_PCREL:
   3675   1.1  christos     case BFD_RELOC_SH_GOT20:
   3676   1.1  christos     case BFD_RELOC_SH_GOTPLT32:
   3677   1.1  christos     case BFD_RELOC_SH_GOTFUNCDESC:
   3678   1.1  christos     case BFD_RELOC_SH_GOTFUNCDESC20:
   3679   1.1  christos     case BFD_RELOC_SH_GOTOFFFUNCDESC:
   3680   1.1  christos     case BFD_RELOC_SH_GOTOFFFUNCDESC20:
   3681   1.1  christos     case BFD_RELOC_SH_FUNCDESC:
   3682   1.1  christos       * valP = 0; /* Fully resolved at runtime.  No addend.  */
   3683   1.1  christos       apply_full_field_fix (fixP, buf, 0, 4);
   3684   1.1  christos       break;
   3685   1.1  christos 
   3686   1.1  christos     case BFD_RELOC_SH_TLS_LDO_32:
   3687   1.1  christos     case BFD_RELOC_SH_TLS_LE_32:
   3688   1.1  christos       S_SET_THREAD_LOCAL (fixP->fx_addsy);
   3689   1.1  christos       /* Fallthrough */
   3690   1.1  christos     case BFD_RELOC_32_GOTOFF:
   3691   1.1  christos     case BFD_RELOC_SH_GOTOFF20:
   3692   1.1  christos       apply_full_field_fix (fixP, buf, val, 4);
   3693   1.1  christos       break;
   3694   1.1  christos #endif
   3695   1.1  christos 
   3696   1.1  christos     default:
   3697   1.1  christos       abort ();
   3698   1.1  christos     }
   3699   1.1  christos 
   3700   1.1  christos   if (shift != 0)
   3701   1.1  christos     {
   3702   1.1  christos       if ((val & ((1 << shift) - 1)) != 0)
   3703  1.10  christos 	as_bad_where (fixP->fx_file, fixP->fx_line, _("misaligned offset"));
   3704   1.1  christos       if (val >= 0)
   3705   1.1  christos 	val >>= shift;
   3706   1.1  christos       else
   3707   1.1  christos 	val = (val >> shift) | (-1L & ~ (-1L >> shift));
   3708   1.1  christos     }
   3709   1.1  christos 
   3710   1.1  christos   /* Extend sign for 64-bit host.  */
   3711   1.6  christos   val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
   3712   1.1  christos   if (max != 0 && (val < min || val > max))
   3713   1.1  christos     as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
   3714   1.1  christos   else if (max != 0)
   3715   1.1  christos     /* Stop the generic code from trying to overflow check the value as well.
   3716   1.1  christos        It may not have the correct value anyway, as we do not store val back
   3717   1.1  christos        into *valP.  */
   3718   1.1  christos     fixP->fx_no_overflow = 1;
   3719   1.1  christos 
   3720   1.1  christos   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
   3721   1.1  christos     fixP->fx_done = 1;
   3722   1.1  christos }
   3723   1.1  christos 
   3724   1.1  christos /* Called just before address relaxation.  Return the length
   3725   1.1  christos    by which a fragment must grow to reach it's destination.  */
   3726   1.1  christos 
   3727   1.1  christos int
   3728   1.1  christos md_estimate_size_before_relax (fragS *fragP, segT segment_type)
   3729   1.1  christos {
   3730   1.1  christos   int what;
   3731   1.1  christos 
   3732   1.1  christos   switch (fragP->fr_subtype)
   3733   1.1  christos     {
   3734   1.1  christos     default:
   3735   1.1  christos       abort ();
   3736   1.1  christos 
   3737   1.1  christos     case C (UNCOND_JUMP, UNDEF_DISP):
   3738   1.1  christos       /* Used to be a branch to somewhere which was unknown.  */
   3739   1.1  christos       if (!fragP->fr_symbol)
   3740   1.1  christos 	{
   3741   1.1  christos 	  fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
   3742   1.1  christos 	}
   3743   1.1  christos       else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
   3744   1.1  christos 	{
   3745   1.1  christos 	  fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
   3746   1.1  christos 	}
   3747   1.1  christos       else
   3748   1.1  christos 	{
   3749   1.1  christos 	  fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
   3750   1.1  christos 	}
   3751   1.1  christos       break;
   3752   1.1  christos 
   3753   1.1  christos     case C (COND_JUMP, UNDEF_DISP):
   3754   1.1  christos     case C (COND_JUMP_DELAY, UNDEF_DISP):
   3755   1.1  christos       what = GET_WHAT (fragP->fr_subtype);
   3756   1.1  christos       /* Used to be a branch to somewhere which was unknown.  */
   3757   1.1  christos       if (fragP->fr_symbol
   3758   1.1  christos 	  && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
   3759   1.1  christos 	{
   3760   1.1  christos 	  /* Got a symbol and it's defined in this segment, become byte
   3761   1.1  christos 	     sized - maybe it will fix up.  */
   3762   1.6  christos 	  fragP->fr_subtype = C (what, COND8);
   3763   1.1  christos 	}
   3764   1.1  christos       else if (fragP->fr_symbol)
   3765   1.1  christos 	{
   3766   1.1  christos 	  /* It's got a segment, but it's not ours, so it will always be long.  */
   3767   1.1  christos 	  fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
   3768   1.1  christos 	}
   3769   1.1  christos       else
   3770   1.1  christos 	{
   3771   1.1  christos 	  /* We know the abs value.  */
   3772   1.1  christos 	  fragP->fr_subtype = C (what, COND8);
   3773   1.1  christos 	}
   3774   1.1  christos       break;
   3775   1.1  christos 
   3776   1.1  christos     case C (UNCOND_JUMP, UNCOND12):
   3777   1.1  christos     case C (UNCOND_JUMP, UNCOND32):
   3778   1.1  christos     case C (UNCOND_JUMP, UNDEF_WORD_DISP):
   3779   1.1  christos     case C (COND_JUMP, COND8):
   3780   1.1  christos     case C (COND_JUMP, COND12):
   3781   1.1  christos     case C (COND_JUMP, COND32):
   3782   1.1  christos     case C (COND_JUMP, UNDEF_WORD_DISP):
   3783   1.1  christos     case C (COND_JUMP_DELAY, COND8):
   3784   1.1  christos     case C (COND_JUMP_DELAY, COND12):
   3785   1.1  christos     case C (COND_JUMP_DELAY, COND32):
   3786   1.1  christos     case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
   3787   1.1  christos       /* When relaxing a section for the second time, we don't need to
   3788   1.1  christos 	 do anything besides return the current size.  */
   3789   1.1  christos       break;
   3790   1.1  christos     }
   3791   1.1  christos 
   3792   1.1  christos   fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
   3793   1.1  christos   return fragP->fr_var;
   3794   1.1  christos }
   3795   1.1  christos 
   3796   1.1  christos /* Put number into target byte order.  */
   3797   1.1  christos 
   3798   1.1  christos void
   3799   1.1  christos md_number_to_chars (char *ptr, valueT use, int nbytes)
   3800   1.1  christos {
   3801   1.1  christos   if (! target_big_endian)
   3802   1.1  christos     number_to_chars_littleendian (ptr, use, nbytes);
   3803   1.1  christos   else
   3804   1.1  christos     number_to_chars_bigendian (ptr, use, nbytes);
   3805   1.1  christos }
   3806   1.1  christos 
   3807   1.1  christos /* This version is used in obj-coff.c eg. for the sh-hms target.  */
   3808   1.1  christos 
   3809   1.1  christos long
   3810   1.1  christos md_pcrel_from (fixS *fixP)
   3811   1.1  christos {
   3812   1.1  christos   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address + 2;
   3813   1.1  christos }
   3814   1.1  christos 
   3815  1.10  christos long
   3816   1.1  christos md_pcrel_from_section (fixS *fixP, segT sec)
   3817   1.1  christos {
   3818   1.1  christos   if (! sh_local_pcrel (fixP)
   3819   1.1  christos       && fixP->fx_addsy != NULL
   3820   1.1  christos       && (generic_force_reloc (fixP)
   3821   1.1  christos 	  || S_GET_SEGMENT (fixP->fx_addsy) != sec))
   3822   1.1  christos     {
   3823   1.1  christos       /* The symbol is undefined (or is defined but not in this section,
   3824   1.1  christos 	 or we're not sure about it being the final definition).  Let the
   3825   1.1  christos 	 linker figure it out.  We need to adjust the subtraction of a
   3826   1.1  christos 	 symbol to the position of the relocated data, though.  */
   3827   1.1  christos       return fixP->fx_subsy ? fixP->fx_where + fixP->fx_frag->fr_address : 0;
   3828   1.1  christos     }
   3829   1.1  christos 
   3830   1.1  christos   return md_pcrel_from (fixP);
   3831   1.1  christos }
   3832   1.1  christos 
   3833   1.1  christos /* Create a reloc.  */
   3834   1.1  christos 
   3835   1.1  christos arelent *
   3836   1.1  christos tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
   3837  1.10  christos {
   3838  1.10  christos   arelent *rel;
   3839   1.1  christos   bfd_reloc_code_real_type r_type;
   3840   1.1  christos 
   3841   1.1  christos   rel = notes_alloc (sizeof (arelent));
   3842   1.1  christos   rel->sym_ptr_ptr = notes_alloc (sizeof (asymbol *));
   3843   1.1  christos   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   3844   1.1  christos   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
   3845   1.1  christos 
   3846   1.1  christos   r_type = fixp->fx_r_type;
   3847   1.3  christos 
   3848   1.1  christos   if (SWITCH_TABLE (fixp))
   3849   1.1  christos     {
   3850   1.1  christos       *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
   3851   1.1  christos       rel->addend = rel->address - S_GET_VALUE(fixp->fx_subsy);
   3852   1.1  christos       if (r_type == BFD_RELOC_16)
   3853   1.1  christos 	r_type = BFD_RELOC_SH_SWITCH16;
   3854   1.1  christos       else if (r_type == BFD_RELOC_8)
   3855   1.1  christos 	r_type = BFD_RELOC_8_PCREL;
   3856   1.1  christos       else if (r_type == BFD_RELOC_32)
   3857   1.1  christos 	r_type = BFD_RELOC_SH_SWITCH32;
   3858   1.1  christos       else
   3859   1.1  christos 	abort ();
   3860   1.1  christos     }
   3861   1.1  christos   else if (r_type == BFD_RELOC_SH_USES)
   3862   1.1  christos     rel->addend = fixp->fx_addnumber;
   3863   1.1  christos   else if (r_type == BFD_RELOC_SH_COUNT)
   3864   1.1  christos     rel->addend = fixp->fx_offset;
   3865   1.1  christos   else if (r_type == BFD_RELOC_SH_ALIGN)
   3866   1.1  christos     rel->addend = fixp->fx_offset;
   3867   1.1  christos   else if (r_type == BFD_RELOC_VTABLE_INHERIT
   3868   1.1  christos            || r_type == BFD_RELOC_VTABLE_ENTRY)
   3869   1.1  christos     rel->addend = fixp->fx_offset;
   3870   1.1  christos   else if (r_type == BFD_RELOC_SH_LOOP_START
   3871   1.1  christos            || r_type == BFD_RELOC_SH_LOOP_END)
   3872   1.1  christos     rel->addend = fixp->fx_offset;
   3873   1.1  christos   else if (r_type == BFD_RELOC_SH_LABEL && fixp->fx_pcrel)
   3874   1.1  christos     {
   3875   1.1  christos       rel->addend = 0;
   3876   1.1  christos       rel->address = rel->addend = fixp->fx_offset;
   3877   1.1  christos     }
   3878   1.1  christos   else
   3879   1.1  christos     rel->addend = fixp->fx_addnumber;
   3880   1.1  christos 
   3881   1.1  christos   rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
   3882   1.1  christos 
   3883   1.1  christos   if (rel->howto == NULL)
   3884   1.1  christos     {
   3885   1.1  christos       as_bad_where (fixp->fx_file, fixp->fx_line,
   3886   1.1  christos 		    _("Cannot represent relocation type %s"),
   3887   1.1  christos 		    bfd_get_reloc_code_name (r_type));
   3888   1.1  christos       /* Set howto to a garbage value so that we can keep going.  */
   3889   1.1  christos       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
   3890   1.1  christos       gas_assert (rel->howto != NULL);
   3891   1.1  christos     }
   3892   1.1  christos #ifdef OBJ_ELF
   3893   1.1  christos   else if (rel->howto->type == R_SH_IND12W)
   3894   1.1  christos     rel->addend += fixp->fx_offset - 4;
   3895   1.1  christos #endif
   3896   1.1  christos 
   3897   1.1  christos   return rel;
   3898   1.5  christos }
   3899   1.1  christos 
   3900   1.1  christos #ifdef OBJ_ELF
   3901   1.1  christos inline static char *
   3902   1.1  christos sh_end_of_match (char *cont, const char *what)
   3903   1.1  christos {
   3904   1.1  christos   int len = strlen (what);
   3905   1.1  christos 
   3906   1.1  christos   if (strncasecmp (cont, what, strlen (what)) == 0
   3907   1.1  christos       && ! is_part_of_name (cont[len]))
   3908   1.1  christos     return cont + len;
   3909   1.1  christos 
   3910   1.1  christos   return NULL;
   3911   1.1  christos }
   3912   1.1  christos 
   3913   1.1  christos int
   3914   1.1  christos sh_parse_name (char const *name,
   3915   1.1  christos 	       expressionS *exprP,
   3916   1.1  christos 	       enum expr_mode mode,
   3917   1.1  christos 	       char *nextcharP)
   3918   1.1  christos {
   3919   1.1  christos   char *next = input_line_pointer;
   3920   1.1  christos   char *next_end;
   3921   1.1  christos   int reloc_type;
   3922   1.1  christos   segT segment;
   3923   1.1  christos 
   3924   1.1  christos   exprP->X_op_symbol = NULL;
   3925   1.1  christos 
   3926   1.1  christos   if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
   3927   1.1  christos     {
   3928   1.1  christos       if (! GOT_symbol)
   3929   1.1  christos 	GOT_symbol = symbol_find_or_make (name);
   3930   1.1  christos 
   3931   1.1  christos       exprP->X_add_symbol = GOT_symbol;
   3932  1.10  christos     no_suffix:
   3933   1.1  christos       /* If we have an absolute symbol or a reg, then we know its
   3934   1.1  christos 	 value now.  */
   3935   1.1  christos       segment = S_GET_SEGMENT (exprP->X_add_symbol);
   3936   1.1  christos       if (!expr_defer_p (mode) && segment == absolute_section)
   3937   1.1  christos 	{
   3938  1.10  christos 	  exprP->X_op = O_constant;
   3939   1.1  christos 	  exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
   3940   1.1  christos 	  exprP->X_add_symbol = NULL;
   3941   1.1  christos 	}
   3942   1.1  christos       else if (!expr_defer_p (mode) && segment == reg_section)
   3943   1.1  christos 	{
   3944   1.1  christos 	  exprP->X_op = O_register;
   3945   1.1  christos 	  exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
   3946   1.1  christos 	  exprP->X_add_symbol = NULL;
   3947   1.1  christos 	}
   3948   1.1  christos       else
   3949   1.1  christos 	{
   3950   1.1  christos 	  exprP->X_op = O_symbol;
   3951   1.1  christos 	  exprP->X_add_number = 0;
   3952   1.1  christos 	}
   3953   1.1  christos 
   3954   1.1  christos       return 1;
   3955   1.1  christos     }
   3956   1.1  christos 
   3957   1.1  christos   exprP->X_add_symbol = symbol_find_or_make (name);
   3958   1.1  christos 
   3959   1.1  christos   if (*nextcharP != '@')
   3960   1.1  christos     goto no_suffix;
   3961   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "GOTOFF")))
   3962   1.1  christos     reloc_type = BFD_RELOC_32_GOTOFF;
   3963   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "GOTPLT")))
   3964   1.1  christos     reloc_type = BFD_RELOC_SH_GOTPLT32;
   3965   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "GOT")))
   3966   1.1  christos     reloc_type = BFD_RELOC_32_GOT_PCREL;
   3967   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "PLT")))
   3968   1.1  christos     reloc_type = BFD_RELOC_32_PLT_PCREL;
   3969   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "TLSGD")))
   3970   1.1  christos     reloc_type = BFD_RELOC_SH_TLS_GD_32;
   3971   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "TLSLDM")))
   3972   1.1  christos     reloc_type = BFD_RELOC_SH_TLS_LD_32;
   3973   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "GOTTPOFF")))
   3974   1.1  christos     reloc_type = BFD_RELOC_SH_TLS_IE_32;
   3975   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "TPOFF")))
   3976   1.1  christos     reloc_type = BFD_RELOC_SH_TLS_LE_32;
   3977   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "DTPOFF")))
   3978   1.1  christos     reloc_type = BFD_RELOC_SH_TLS_LDO_32;
   3979   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "PCREL")))
   3980   1.1  christos     reloc_type = BFD_RELOC_32_PCREL;
   3981   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "GOTFUNCDESC")))
   3982   1.1  christos     reloc_type = BFD_RELOC_SH_GOTFUNCDESC;
   3983   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "GOTOFFFUNCDESC")))
   3984   1.1  christos     reloc_type = BFD_RELOC_SH_GOTOFFFUNCDESC;
   3985   1.1  christos   else if ((next_end = sh_end_of_match (next + 1, "FUNCDESC")))
   3986   1.1  christos     reloc_type = BFD_RELOC_SH_FUNCDESC;
   3987   1.1  christos   else
   3988   1.1  christos     goto no_suffix;
   3989   1.1  christos 
   3990   1.1  christos   *input_line_pointer = *nextcharP;
   3991   1.1  christos   input_line_pointer = next_end;
   3992   1.1  christos   *nextcharP = *input_line_pointer;
   3993   1.1  christos   *input_line_pointer = '\0';
   3994   1.1  christos 
   3995   1.1  christos   exprP->X_op = O_PIC_reloc;
   3996   1.1  christos   exprP->X_add_number = 0;
   3997   1.1  christos   exprP->X_md = reloc_type;
   3998   1.1  christos 
   3999   1.1  christos   return 1;
   4000   1.1  christos }
   4001   1.1  christos 
   4002   1.1  christos void
   4003   1.1  christos sh_cfi_frame_initial_instructions (void)
   4004   1.1  christos {
   4005   1.1  christos   cfi_add_CFA_def_cfa (15, 0);
   4006   1.1  christos }
   4007   1.1  christos 
   4008   1.1  christos int
   4009   1.1  christos sh_regname_to_dw2regnum (char *regname)
   4010   1.1  christos {
   4011   1.5  christos   unsigned int regnum = -1;
   4012   1.1  christos   unsigned int i;
   4013   1.1  christos   const char *p;
   4014   1.1  christos   char *q;
   4015   1.1  christos   static struct { const char *name; int dw2regnum; } regnames[] =
   4016   1.1  christos     {
   4017   1.1  christos       { "pr", 17 }, { "t", 18 }, { "gbr", 19 }, { "mach", 20 },
   4018   1.1  christos       { "macl", 21 }, { "fpul", 23 }
   4019   1.1  christos     };
   4020   1.1  christos 
   4021   1.1  christos   for (i = 0; i < ARRAY_SIZE (regnames); ++i)
   4022   1.1  christos     if (strcmp (regnames[i].name, regname) == 0)
   4023   1.1  christos       return regnames[i].dw2regnum;
   4024   1.1  christos 
   4025   1.1  christos   if (regname[0] == 'r')
   4026   1.1  christos     {
   4027   1.1  christos       p = regname + 1;
   4028   1.1  christos       regnum = strtoul (p, &q, 10);
   4029   1.1  christos       if (p == q || *q || regnum >= 16)
   4030   1.1  christos 	return -1;
   4031   1.1  christos     }
   4032   1.1  christos   else if (regname[0] == 'f' && regname[1] == 'r')
   4033   1.1  christos     {
   4034   1.1  christos       p = regname + 2;
   4035   1.1  christos       regnum = strtoul (p, &q, 10);
   4036   1.1  christos       if (p == q || *q || regnum >= 16)
   4037   1.1  christos 	return -1;
   4038   1.1  christos       regnum += 25;
   4039   1.1  christos     }
   4040   1.1  christos   else if (regname[0] == 'x' && regname[1] == 'd')
   4041   1.1  christos     {
   4042   1.1  christos       p = regname + 2;
   4043   1.1  christos       regnum = strtoul (p, &q, 10);
   4044   1.1  christos       if (p == q || *q || regnum >= 8)
   4045   1.1  christos 	return -1;
   4046   1.1  christos       regnum += 87;
   4047                     }
   4048                   return regnum;
   4049                 }
   4050                 #endif /* OBJ_ELF */
   4051