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