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