Home | History | Annotate | Line # | Download | only in config
tc-sparc.c revision 1.4
      1  1.1     skrll /* tc-sparc.c -- Assemble for the SPARC
      2  1.4  christos    Copyright (C) 1989-2018 Free Software Foundation, Inc.
      3  1.1     skrll    This file is part of GAS, the GNU Assembler.
      4  1.1     skrll 
      5  1.1     skrll    GAS is free software; you can redistribute it and/or modify
      6  1.1     skrll    it under the terms of the GNU General Public License as published by
      7  1.1     skrll    the Free Software Foundation; either version 3, or (at your option)
      8  1.1     skrll    any later version.
      9  1.1     skrll 
     10  1.1     skrll    GAS is distributed in the hope that it will be useful,
     11  1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1     skrll    GNU General Public License for more details.
     14  1.1     skrll 
     15  1.1     skrll    You should have received a copy of the GNU General Public
     16  1.1     skrll    License along with GAS; see the file COPYING.  If not, write
     17  1.1     skrll    to the Free Software Foundation, 51 Franklin Street - Fifth Floor,
     18  1.1     skrll    Boston, MA 02110-1301, USA.  */
     19  1.1     skrll 
     20  1.1     skrll #include "as.h"
     21  1.1     skrll #include "safe-ctype.h"
     22  1.1     skrll #include "subsegs.h"
     23  1.1     skrll 
     24  1.1     skrll #include "opcode/sparc.h"
     25  1.1     skrll #include "dw2gencfi.h"
     26  1.1     skrll 
     27  1.1     skrll #ifdef OBJ_ELF
     28  1.1     skrll #include "elf/sparc.h"
     29  1.1     skrll #include "dwarf2dbg.h"
     30  1.1     skrll #endif
     31  1.1     skrll 
     32  1.1     skrll /* Some ancient Sun C compilers would not take such hex constants as
     33  1.1     skrll    unsigned, and would end up sign-extending them to form an offsetT,
     34  1.1     skrll    so use these constants instead.  */
     35  1.1     skrll #define U0xffffffff ((((unsigned long) 1 << 16) << 16) - 1)
     36  1.1     skrll #define U0x80000000 ((((unsigned long) 1 << 16) << 15))
     37  1.1     skrll 
     38  1.1     skrll static int sparc_ip (char *, const struct sparc_opcode **);
     39  1.4  christos static int parse_sparc_asi (char **, const sparc_asi **);
     40  1.1     skrll static int parse_keyword_arg (int (*) (const char *), char **, int *);
     41  1.1     skrll static int parse_const_expr_arg (char **, int *);
     42  1.1     skrll static int get_expression (char *);
     43  1.1     skrll 
     44  1.1     skrll /* Default architecture.  */
     45  1.1     skrll /* ??? The default value should be V8, but sparclite support was added
     46  1.1     skrll    by making it the default.  GCC now passes -Asparclite, so maybe sometime in
     47  1.1     skrll    the future we can set this to V8.  */
     48  1.1     skrll #ifndef DEFAULT_ARCH
     49  1.1     skrll #define DEFAULT_ARCH "sparclite"
     50  1.1     skrll #endif
     51  1.3  christos static const char *default_arch = DEFAULT_ARCH;
     52  1.1     skrll 
     53  1.1     skrll /* Non-zero if the initial values of `max_architecture' and `sparc_arch_size'
     54  1.1     skrll    have been set.  */
     55  1.1     skrll static int default_init_p;
     56  1.1     skrll 
     57  1.1     skrll /* Current architecture.  We don't bump up unless necessary.  */
     58  1.1     skrll static enum sparc_opcode_arch_val current_architecture = SPARC_OPCODE_ARCH_V6;
     59  1.1     skrll 
     60  1.1     skrll /* The maximum architecture level we can bump up to.
     61  1.1     skrll    In a 32 bit environment, don't allow bumping up to v9 by default.
     62  1.1     skrll    The native assembler works this way.  The user is required to pass
     63  1.1     skrll    an explicit argument before we'll create v9 object files.  However, if
     64  1.1     skrll    we don't see any v9 insns, a v8plus object file is not created.  */
     65  1.1     skrll static enum sparc_opcode_arch_val max_architecture;
     66  1.1     skrll 
     67  1.1     skrll /* Either 32 or 64, selects file format.  */
     68  1.1     skrll static int sparc_arch_size;
     69  1.1     skrll /* Initial (default) value, recorded separately in case a user option
     70  1.1     skrll    changes the value before md_show_usage is called.  */
     71  1.1     skrll static int default_arch_size;
     72  1.1     skrll 
     73  1.1     skrll #ifdef OBJ_ELF
     74  1.1     skrll /* The currently selected v9 memory model.  Currently only used for
     75  1.1     skrll    ELF.  */
     76  1.1     skrll static enum { MM_TSO, MM_PSO, MM_RMO } sparc_memory_model = MM_RMO;
     77  1.2     joerg 
     78  1.2     joerg #ifndef TE_SOLARIS
     79  1.2     joerg /* Bitmask of instruction types seen so far, used to populate the
     80  1.2     joerg    GNU attributes section with hwcap information.  */
     81  1.2     joerg static bfd_uint64_t hwcap_seen;
     82  1.2     joerg #endif
     83  1.1     skrll #endif
     84  1.1     skrll 
     85  1.2     joerg static bfd_uint64_t hwcap_allowed;
     86  1.2     joerg 
     87  1.1     skrll static int architecture_requested;
     88  1.1     skrll static int warn_on_bump;
     89  1.1     skrll 
     90  1.1     skrll /* If warn_on_bump and the needed architecture is higher than this
     91  1.1     skrll    architecture, issue a warning.  */
     92  1.1     skrll static enum sparc_opcode_arch_val warn_after_architecture;
     93  1.1     skrll 
     94  1.4  christos /* Non-zero if the assembler should generate error if an undeclared
     95  1.4  christos    g[23] register has been used in -64.  */
     96  1.1     skrll static int no_undeclared_regs;
     97  1.1     skrll 
     98  1.4  christos /* Non-zero if the assembler should generate a warning if an
     99  1.4  christos    unpredictable DCTI (delayed control transfer instruction) couple is
    100  1.4  christos    found.  */
    101  1.4  christos static int dcti_couples_detect;
    102  1.4  christos 
    103  1.1     skrll /* Non-zero if we should try to relax jumps and calls.  */
    104  1.1     skrll static int sparc_relax;
    105  1.1     skrll 
    106  1.1     skrll /* Non-zero if we are generating PIC code.  */
    107  1.1     skrll int sparc_pic_code;
    108  1.1     skrll 
    109  1.1     skrll /* Non-zero if we should give an error when misaligned data is seen.  */
    110  1.1     skrll static int enforce_aligned_data;
    111  1.1     skrll 
    112  1.1     skrll extern int target_big_endian;
    113  1.1     skrll 
    114  1.1     skrll static int target_little_endian_data;
    115  1.1     skrll 
    116  1.1     skrll /* Symbols for global registers on v9.  */
    117  1.1     skrll static symbolS *globals[8];
    118  1.1     skrll 
    119  1.1     skrll /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
    120  1.1     skrll int sparc_cie_data_alignment;
    121  1.1     skrll 
    122  1.1     skrll /* V9 and 86x have big and little endian data, but instructions are always big
    123  1.1     skrll    endian.  The sparclet has bi-endian support but both data and insns have
    124  1.1     skrll    the same endianness.  Global `target_big_endian' is used for data.
    125  1.1     skrll    The following macro is used for instructions.  */
    126  1.1     skrll #ifndef INSN_BIG_ENDIAN
    127  1.1     skrll #define INSN_BIG_ENDIAN (target_big_endian \
    128  1.1     skrll 			 || default_arch_type == sparc86x \
    129  1.1     skrll 			 || SPARC_OPCODE_ARCH_V9_P (max_architecture))
    130  1.1     skrll #endif
    131  1.1     skrll 
    132  1.1     skrll /* Handle of the OPCODE hash table.  */
    133  1.1     skrll static struct hash_control *op_hash;
    134  1.1     skrll 
    135  1.1     skrll static void s_data1 (void);
    136  1.1     skrll static void s_seg (int);
    137  1.1     skrll static void s_proc (int);
    138  1.1     skrll static void s_reserve (int);
    139  1.1     skrll static void s_common (int);
    140  1.1     skrll static void s_empty (int);
    141  1.1     skrll static void s_uacons (int);
    142  1.1     skrll static void s_ncons (int);
    143  1.1     skrll #ifdef OBJ_ELF
    144  1.1     skrll static void s_register (int);
    145  1.1     skrll #endif
    146  1.1     skrll 
    147  1.1     skrll const pseudo_typeS md_pseudo_table[] =
    148  1.1     skrll {
    149  1.1     skrll   {"align", s_align_bytes, 0},	/* Defaulting is invalid (0).  */
    150  1.1     skrll   {"common", s_common, 0},
    151  1.1     skrll   {"empty", s_empty, 0},
    152  1.1     skrll   {"global", s_globl, 0},
    153  1.1     skrll   {"half", cons, 2},
    154  1.1     skrll   {"nword", s_ncons, 0},
    155  1.1     skrll   {"optim", s_ignore, 0},
    156  1.1     skrll   {"proc", s_proc, 0},
    157  1.1     skrll   {"reserve", s_reserve, 0},
    158  1.1     skrll   {"seg", s_seg, 0},
    159  1.1     skrll   {"skip", s_space, 0},
    160  1.1     skrll   {"word", cons, 4},
    161  1.1     skrll   {"xword", cons, 8},
    162  1.1     skrll   {"uahalf", s_uacons, 2},
    163  1.1     skrll   {"uaword", s_uacons, 4},
    164  1.1     skrll   {"uaxword", s_uacons, 8},
    165  1.1     skrll #ifdef OBJ_ELF
    166  1.1     skrll   /* These are specific to sparc/svr4.  */
    167  1.1     skrll   {"2byte", s_uacons, 2},
    168  1.1     skrll   {"4byte", s_uacons, 4},
    169  1.1     skrll   {"8byte", s_uacons, 8},
    170  1.1     skrll   {"register", s_register, 0},
    171  1.1     skrll #endif
    172  1.1     skrll   {NULL, 0, 0},
    173  1.1     skrll };
    174  1.1     skrll 
    175  1.1     skrll /* This array holds the chars that always start a comment.  If the
    176  1.1     skrll    pre-processor is disabled, these aren't very useful.  */
    177  1.1     skrll const char comment_chars[] = "!";	/* JF removed '|' from
    178  1.1     skrll                                            comment_chars.  */
    179  1.1     skrll 
    180  1.1     skrll /* This array holds the chars that only start a comment at the beginning of
    181  1.1     skrll    a line.  If the line seems to have the form '# 123 filename'
    182  1.1     skrll    .line and .file directives will appear in the pre-processed output.  */
    183  1.1     skrll /* Note that input_file.c hand checks for '#' at the beginning of the
    184  1.1     skrll    first line of the input file.  This is because the compiler outputs
    185  1.1     skrll    #NO_APP at the beginning of its output.  */
    186  1.1     skrll /* Also note that comments started like this one will always
    187  1.1     skrll    work if '/' isn't otherwise defined.  */
    188  1.1     skrll const char line_comment_chars[] = "#";
    189  1.1     skrll 
    190  1.1     skrll const char line_separator_chars[] = ";";
    191  1.1     skrll 
    192  1.1     skrll /* Chars that can be used to separate mant from exp in floating point
    193  1.1     skrll    nums.  */
    194  1.1     skrll const char EXP_CHARS[] = "eE";
    195  1.1     skrll 
    196  1.1     skrll /* Chars that mean this number is a floating point constant.
    197  1.1     skrll    As in 0f12.456
    198  1.1     skrll    or    0d1.2345e12  */
    199  1.1     skrll const char FLT_CHARS[] = "rRsSfFdDxXpP";
    200  1.1     skrll 
    201  1.1     skrll /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
    202  1.1     skrll    changed in read.c.  Ideally it shouldn't have to know about it at all,
    203  1.1     skrll    but nothing is ideal around here.  */
    204  1.1     skrll 
    205  1.1     skrll #define isoctal(c)  ((unsigned) ((c) - '0') < 8)
    206  1.1     skrll 
    207  1.1     skrll struct sparc_it
    208  1.1     skrll   {
    209  1.3  christos     const char *error;
    210  1.1     skrll     unsigned long opcode;
    211  1.1     skrll     struct nlist *nlistp;
    212  1.1     skrll     expressionS exp;
    213  1.1     skrll     expressionS exp2;
    214  1.1     skrll     int pcrel;
    215  1.1     skrll     bfd_reloc_code_real_type reloc;
    216  1.1     skrll   };
    217  1.1     skrll 
    218  1.1     skrll struct sparc_it the_insn, set_insn;
    219  1.1     skrll 
    220  1.1     skrll static void output_insn (const struct sparc_opcode *, struct sparc_it *);
    221  1.1     skrll 
    222  1.1     skrll /* Table of arguments to -A.
    224  1.1     skrll    The sparc_opcode_arch table in sparc-opc.c is insufficient and incorrect
    225  1.1     skrll    for this use.  That table is for opcodes only.  This table is for opcodes
    226  1.1     skrll    and file formats.  */
    227  1.2     joerg 
    228  1.1     skrll enum sparc_arch_types {v6, v7, v8, leon, sparclet, sparclite, sparc86x, v8plus,
    229  1.1     skrll 		       v8plusa, v9, v9a, v9b, v9_64};
    230  1.1     skrll 
    231  1.3  christos static struct sparc_arch {
    232  1.3  christos   const char *name;
    233  1.1     skrll   const char *opcode_arch;
    234  1.1     skrll   enum sparc_arch_types arch_type;
    235  1.1     skrll   /* Default word size, as specified during configuration.
    236  1.1     skrll      A value of zero means can't be used to specify default architecture.  */
    237  1.1     skrll   int default_arch_size;
    238  1.1     skrll   /* Allowable arg to -A?  */
    239  1.4  christos   int user_option_p;
    240  1.4  christos   /* Extra hardware capabilities allowed.  These are added to the
    241  1.4  christos      hardware capabilities associated with the opcode
    242  1.2     joerg      architecture.  */
    243  1.2     joerg   int hwcap_allowed;
    244  1.1     skrll   int hwcap2_allowed;
    245  1.2     joerg } sparc_arch_table[] = {
    246  1.2     joerg   { "v6",         "v6",  v6,  0, 1, 0, 0 },
    247  1.4  christos   { "v7",         "v7",  v7,  0, 1, 0, 0 },
    248  1.4  christos   { "v8",         "v8",  v8, 32, 1, 0, 0 },
    249  1.4  christos   { "v8a",        "v8",  v8, 32, 1, 0, 0 },
    250  1.4  christos   { "sparc",      "v9",  v9,  0, 1, HWCAP_V8PLUS, 0 },
    251  1.4  christos   { "sparcvis",   "v9a", v9,  0, 1, 0, 0 },
    252  1.4  christos   { "sparcvis2",  "v9b", v9,  0, 1, 0, 0 },
    253  1.4  christos   { "sparcfmaf",  "v9b", v9,  0, 1, HWCAP_FMAF, 0 },
    254  1.4  christos   { "sparcima",   "v9b", v9,  0, 1, HWCAP_FMAF|HWCAP_IMA, 0 },
    255  1.4  christos   { "sparcvis3",  "v9b", v9,  0, 1, HWCAP_FMAF|HWCAP_VIS3|HWCAP_HPC, 0 },
    256  1.4  christos   { "sparcvis3r", "v9b", v9,  0, 1, HWCAP_FMAF|HWCAP_VIS3|HWCAP_HPC|HWCAP_FJFMAU, 0 },
    257  1.4  christos 
    258  1.4  christos   { "sparc4",     "v9v", v9,  0, 1, 0, 0 },
    259  1.4  christos   { "sparc5",     "v9m", v9,  0, 1, 0, 0 },
    260  1.4  christos   { "sparc6",     "m8",  v9,  0, 1, 0, 0 },
    261  1.4  christos 
    262  1.4  christos   { "leon",      "leon",      leon,      32, 1, 0, 0 },
    263  1.4  christos   { "sparclet",  "sparclet",  sparclet,  32, 1, 0, 0 },
    264  1.4  christos   { "sparclite", "sparclite", sparclite, 32, 1, 0, 0 },
    265  1.4  christos   { "sparc86x",  "sparclite", sparc86x,  32, 1, 0, 0 },
    266  1.4  christos 
    267  1.4  christos   { "v8plus",  "v9",  v9,  0, 1, HWCAP_V8PLUS, 0 },
    268  1.4  christos   { "v8plusa", "v9a", v9,  0, 1, HWCAP_V8PLUS, 0 },
    269  1.4  christos   { "v8plusb", "v9b", v9,  0, 1, HWCAP_V8PLUS, 0 },
    270  1.4  christos   { "v8plusc", "v9c", v9,  0, 1, HWCAP_V8PLUS, 0 },
    271  1.4  christos   { "v8plusd", "v9d", v9,  0, 1, HWCAP_V8PLUS, 0 },
    272  1.4  christos   { "v8pluse", "v9e", v9,  0, 1, HWCAP_V8PLUS, 0 },
    273  1.4  christos   { "v8plusv", "v9v", v9,  0, 1, HWCAP_V8PLUS, 0 },
    274  1.4  christos   { "v8plusm", "v9m", v9,  0, 1, HWCAP_V8PLUS, 0 },
    275  1.4  christos   { "v8plusm8", "m8", v9,  0, 1, HWCAP_V8PLUS, 0 },
    276  1.4  christos 
    277  1.4  christos   { "v9",      "v9",  v9,  0, 1, 0, 0 },
    278  1.4  christos   { "v9a",     "v9a", v9,  0, 1, 0, 0 },
    279  1.4  christos   { "v9b",     "v9b", v9,  0, 1, 0, 0 },
    280  1.4  christos   { "v9c",     "v9c", v9,  0, 1, 0, 0 },
    281  1.4  christos   { "v9d",     "v9d", v9,  0, 1, 0, 0 },
    282  1.4  christos   { "v9e",     "v9e", v9,  0, 1, 0, 0 },
    283  1.4  christos   { "v9v",     "v9v", v9,  0, 1, 0, 0 },
    284  1.4  christos   { "v9m",     "v9m", v9,  0, 1, 0, 0 },
    285  1.2     joerg   { "v9m8",     "m8", v9,  0, 1, 0, 0 },
    286  1.2     joerg 
    287  1.1     skrll   /* This exists to allow configure.tgt to pass one
    288  1.4  christos      value to specify both the default machine and default word size.  */
    289  1.2     joerg   { "v9-64",   "v9",  v9, 64, 0, 0, 0 },
    290  1.1     skrll   { NULL, NULL, v8, 0, 0, 0, 0 }
    291  1.1     skrll };
    292  1.1     skrll 
    293  1.1     skrll /* Variant of default_arch */
    294  1.1     skrll static enum sparc_arch_types default_arch_type;
    295  1.1     skrll 
    296  1.3  christos static struct sparc_arch *
    297  1.1     skrll lookup_arch (const char *name)
    298  1.1     skrll {
    299  1.1     skrll   struct sparc_arch *sa;
    300  1.1     skrll 
    301  1.1     skrll   for (sa = &sparc_arch_table[0]; sa->name != NULL; sa++)
    302  1.1     skrll     if (strcmp (sa->name, name) == 0)
    303  1.1     skrll       break;
    304  1.1     skrll   if (sa->name == NULL)
    305  1.1     skrll     return NULL;
    306  1.1     skrll   return sa;
    307  1.1     skrll }
    308  1.1     skrll 
    309  1.1     skrll /* Initialize the default opcode arch and word size from the default
    310  1.1     skrll    architecture name.  */
    311  1.1     skrll 
    312  1.1     skrll static void
    313  1.1     skrll init_default_arch (void)
    314  1.1     skrll {
    315  1.1     skrll   struct sparc_arch *sa = lookup_arch (default_arch);
    316  1.1     skrll 
    317  1.1     skrll   if (sa == NULL
    318  1.1     skrll       || sa->default_arch_size == 0)
    319  1.1     skrll     as_fatal (_("Invalid default architecture, broken assembler."));
    320  1.1     skrll 
    321  1.1     skrll   max_architecture = sparc_opcode_lookup_arch (sa->opcode_arch);
    322  1.1     skrll   if (max_architecture == SPARC_OPCODE_ARCH_BAD)
    323  1.1     skrll     as_fatal (_("Bad opcode table, broken assembler."));
    324  1.1     skrll   default_arch_size = sparc_arch_size = sa->default_arch_size;
    325  1.1     skrll   default_init_p = 1;
    326  1.1     skrll   default_arch_type = sa->arch_type;
    327  1.1     skrll }
    328  1.1     skrll 
    329  1.1     skrll /* Called by TARGET_FORMAT.  */
    330  1.1     skrll 
    331  1.1     skrll const char *
    332  1.1     skrll sparc_target_format (void)
    333  1.1     skrll {
    334  1.1     skrll   /* We don't get a chance to initialize anything before we're called,
    335  1.1     skrll      so handle that now.  */
    336  1.1     skrll   if (! default_init_p)
    337  1.1     skrll     init_default_arch ();
    338  1.1     skrll 
    339  1.1     skrll #ifdef OBJ_AOUT
    340  1.1     skrll #ifdef TE_NetBSD
    341  1.1     skrll   return "a.out-sparc-netbsd";
    342  1.1     skrll #else
    343  1.1     skrll #ifdef TE_SPARCAOUT
    344  1.1     skrll   if (target_big_endian)
    345  1.1     skrll     return "a.out-sunos-big";
    346  1.1     skrll   else if (default_arch_type == sparc86x && target_little_endian_data)
    347  1.1     skrll     return "a.out-sunos-big";
    348  1.1     skrll   else
    349  1.1     skrll     return "a.out-sparc-little";
    350  1.1     skrll #else
    351  1.1     skrll   return "a.out-sunos-big";
    352  1.1     skrll #endif
    353  1.1     skrll #endif
    354  1.1     skrll #endif
    355  1.1     skrll 
    356  1.1     skrll #ifdef OBJ_BOUT
    357  1.1     skrll   return "b.out.big";
    358  1.1     skrll #endif
    359  1.1     skrll 
    360  1.1     skrll #ifdef OBJ_COFF
    361  1.1     skrll #ifdef TE_LYNX
    362  1.1     skrll   return "coff-sparc-lynx";
    363  1.1     skrll #else
    364  1.1     skrll   return "coff-sparc";
    365  1.1     skrll #endif
    366  1.1     skrll #endif
    367  1.1     skrll 
    368  1.1     skrll #ifdef TE_VXWORKS
    369  1.1     skrll   return "elf32-sparc-vxworks";
    370  1.1     skrll #endif
    371  1.1     skrll 
    372  1.1     skrll #ifdef OBJ_ELF
    373  1.1     skrll   return sparc_arch_size == 64 ? ELF64_TARGET_FORMAT : ELF_TARGET_FORMAT;
    374  1.1     skrll #endif
    375  1.1     skrll 
    376  1.1     skrll   abort ();
    377  1.1     skrll }
    378  1.1     skrll 
    379  1.1     skrll /* md_parse_option
    381  1.1     skrll  *	Invocation line includes a switch not recognized by the base assembler.
    382  1.1     skrll  *	See if it's a processor-specific option.  These are:
    383  1.1     skrll  *
    384  1.1     skrll  *	-bump
    385  1.2     joerg  *		Warn on architecture bumps.  See also -A.
    386  1.1     skrll  *
    387  1.1     skrll  *	-Av6, -Av7, -Av8, -Aleon, -Asparclite, -Asparclet
    388  1.1     skrll  *		Standard 32 bit architectures.
    389  1.1     skrll  *	-Av9, -Av9a, -Av9b
    390  1.1     skrll  *		Sparc64 in either a 32 or 64 bit world (-32/-64 says which).
    391  1.1     skrll  *		This used to only mean 64 bits, but properly specifying it
    392  1.1     skrll  *		complicated gcc's ASM_SPECs, so now opcode selection is
    393  1.1     skrll  *		specified orthogonally to word size (except when specifying
    394  1.1     skrll  *		the default, but that is an internal implementation detail).
    395  1.1     skrll  *	-Av8plus, -Av8plusa, -Av8plusb
    396  1.1     skrll  *		Same as -Av9{,a,b}.
    397  1.1     skrll  *	-xarch=v8plus, -xarch=v8plusa, -xarch=v8plusb
    398  1.1     skrll  *		Same as -Av8plus{,a,b} -32, for compatibility with Sun's
    399  1.1     skrll  *		assembler.
    400  1.1     skrll  *	-xarch=v9, -xarch=v9a, -xarch=v9b
    401  1.1     skrll  *		Same as -Av9{,a,b} -64, for compatibility with Sun's
    402  1.1     skrll  *		assembler.
    403  1.1     skrll  *
    404  1.1     skrll  *		Select the architecture and possibly the file format.
    405  1.1     skrll  *		Instructions or features not supported by the selected
    406  1.1     skrll  *		architecture cause fatal errors.
    407  1.1     skrll  *
    408  1.1     skrll  *		The default is to start at v6, and bump the architecture up
    409  1.1     skrll  *		whenever an instruction is seen at a higher level.  In 32 bit
    410  1.1     skrll  *		environments, v9 is not bumped up to, the user must pass
    411  1.1     skrll  * 		-Av8plus{,a,b}.
    412  1.1     skrll  *
    413  1.1     skrll  *		If -bump is specified, a warning is printing when bumping to
    414  1.1     skrll  *		higher levels.
    415  1.1     skrll  *
    416  1.1     skrll  *		If an architecture is specified, all instructions must match
    417  1.1     skrll  *		that architecture.  Any higher level instructions are flagged
    418  1.1     skrll  *		as errors.  Note that in the 32 bit environment specifying
    419  1.1     skrll  *		-Av8plus does not automatically create a v8plus object file, a
    420  1.1     skrll  *		v9 insn must be seen.
    421  1.1     skrll  *
    422  1.1     skrll  *		If both an architecture and -bump are specified, the
    423  1.1     skrll  *		architecture starts at the specified level, but bumps are
    424  1.1     skrll  *		warnings.  Note that we can't set `current_architecture' to
    425  1.1     skrll  *		the requested level in this case: in the 32 bit environment,
    426  1.1     skrll  *		we still must avoid creating v8plus object files unless v9
    427  1.1     skrll  * 		insns are seen.
    428  1.1     skrll  *
    429  1.1     skrll  * Note:
    430  1.1     skrll  *		Bumping between incompatible architectures is always an
    431  1.1     skrll  *		error.  For example, from sparclite to v9.
    432  1.1     skrll  */
    433  1.1     skrll 
    434  1.1     skrll #ifdef OBJ_ELF
    435  1.1     skrll const char *md_shortopts = "A:K:VQ:sq";
    436  1.1     skrll #else
    437  1.1     skrll #ifdef OBJ_AOUT
    438  1.1     skrll const char *md_shortopts = "A:k";
    439  1.1     skrll #else
    440  1.1     skrll const char *md_shortopts = "A:";
    441  1.1     skrll #endif
    442  1.1     skrll #endif
    443  1.1     skrll struct option md_longopts[] = {
    444  1.1     skrll #define OPTION_BUMP (OPTION_MD_BASE)
    445  1.1     skrll   {"bump", no_argument, NULL, OPTION_BUMP},
    446  1.1     skrll #define OPTION_SPARC (OPTION_MD_BASE + 1)
    447  1.1     skrll   {"sparc", no_argument, NULL, OPTION_SPARC},
    448  1.1     skrll #define OPTION_XARCH (OPTION_MD_BASE + 2)
    449  1.1     skrll   {"xarch", required_argument, NULL, OPTION_XARCH},
    450  1.1     skrll #ifdef OBJ_ELF
    451  1.1     skrll #define OPTION_32 (OPTION_MD_BASE + 3)
    452  1.1     skrll   {"32", no_argument, NULL, OPTION_32},
    453  1.1     skrll #define OPTION_64 (OPTION_MD_BASE + 4)
    454  1.1     skrll   {"64", no_argument, NULL, OPTION_64},
    455  1.1     skrll #define OPTION_TSO (OPTION_MD_BASE + 5)
    456  1.1     skrll   {"TSO", no_argument, NULL, OPTION_TSO},
    457  1.1     skrll #define OPTION_PSO (OPTION_MD_BASE + 6)
    458  1.1     skrll   {"PSO", no_argument, NULL, OPTION_PSO},
    459  1.1     skrll #define OPTION_RMO (OPTION_MD_BASE + 7)
    460  1.1     skrll   {"RMO", no_argument, NULL, OPTION_RMO},
    461  1.1     skrll #endif
    462  1.1     skrll #ifdef SPARC_BIENDIAN
    463  1.1     skrll #define OPTION_LITTLE_ENDIAN (OPTION_MD_BASE + 8)
    464  1.1     skrll   {"EL", no_argument, NULL, OPTION_LITTLE_ENDIAN},
    465  1.1     skrll #define OPTION_BIG_ENDIAN (OPTION_MD_BASE + 9)
    466  1.1     skrll   {"EB", no_argument, NULL, OPTION_BIG_ENDIAN},
    467  1.1     skrll #endif
    468  1.1     skrll #define OPTION_ENFORCE_ALIGNED_DATA (OPTION_MD_BASE + 10)
    469  1.1     skrll   {"enforce-aligned-data", no_argument, NULL, OPTION_ENFORCE_ALIGNED_DATA},
    470  1.1     skrll #define OPTION_LITTLE_ENDIAN_DATA (OPTION_MD_BASE + 11)
    471  1.1     skrll   {"little-endian-data", no_argument, NULL, OPTION_LITTLE_ENDIAN_DATA},
    472  1.1     skrll #ifdef OBJ_ELF
    473  1.1     skrll #define OPTION_NO_UNDECLARED_REGS (OPTION_MD_BASE + 12)
    474  1.1     skrll   {"no-undeclared-regs", no_argument, NULL, OPTION_NO_UNDECLARED_REGS},
    475  1.1     skrll #define OPTION_UNDECLARED_REGS (OPTION_MD_BASE + 13)
    476  1.1     skrll   {"undeclared-regs", no_argument, NULL, OPTION_UNDECLARED_REGS},
    477  1.1     skrll #endif
    478  1.1     skrll #define OPTION_RELAX (OPTION_MD_BASE + 14)
    479  1.1     skrll   {"relax", no_argument, NULL, OPTION_RELAX},
    480  1.4  christos #define OPTION_NO_RELAX (OPTION_MD_BASE + 15)
    481  1.4  christos   {"no-relax", no_argument, NULL, OPTION_NO_RELAX},
    482  1.1     skrll #define OPTION_DCTI_COUPLES_DETECT (OPTION_MD_BASE + 16)
    483  1.1     skrll   {"dcti-couples-detect", no_argument, NULL, OPTION_DCTI_COUPLES_DETECT},
    484  1.1     skrll   {NULL, no_argument, NULL, 0}
    485  1.1     skrll };
    486  1.1     skrll 
    487  1.1     skrll size_t md_longopts_size = sizeof (md_longopts);
    488  1.3  christos 
    489  1.1     skrll int
    490  1.1     skrll md_parse_option (int c, const char *arg)
    491  1.1     skrll {
    492  1.1     skrll   /* We don't get a chance to initialize anything before we're called,
    493  1.1     skrll      so handle that now.  */
    494  1.1     skrll   if (! default_init_p)
    495  1.1     skrll     init_default_arch ();
    496  1.1     skrll 
    497  1.1     skrll   switch (c)
    498  1.1     skrll     {
    499  1.1     skrll     case OPTION_BUMP:
    500  1.1     skrll       warn_on_bump = 1;
    501  1.1     skrll       warn_after_architecture = SPARC_OPCODE_ARCH_V6;
    502  1.1     skrll       break;
    503  1.1     skrll 
    504  1.2     joerg     case OPTION_XARCH:
    505  1.2     joerg #ifdef OBJ_ELF
    506  1.1     skrll       if (!strncmp (arg, "v9", 2))
    507  1.2     joerg 	md_parse_option (OPTION_64, NULL);
    508  1.2     joerg       else
    509  1.2     joerg 	{
    510  1.2     joerg 	  if (!strncmp (arg, "v8", 2)
    511  1.2     joerg 	      || !strncmp (arg, "v7", 2)
    512  1.2     joerg 	      || !strncmp (arg, "v6", 2)
    513  1.2     joerg 	      || !strcmp (arg, "sparclet")
    514  1.2     joerg 	      || !strcmp (arg, "sparclite")
    515  1.2     joerg 	      || !strcmp (arg, "sparc86x"))
    516  1.1     skrll 	    md_parse_option (OPTION_32, NULL);
    517  1.1     skrll 	}
    518  1.1     skrll #endif
    519  1.1     skrll       /* Fall through.  */
    520  1.1     skrll 
    521  1.1     skrll     case 'A':
    522  1.1     skrll       {
    523  1.1     skrll 	struct sparc_arch *sa;
    524  1.1     skrll 	enum sparc_opcode_arch_val opcode_arch;
    525  1.1     skrll 
    526  1.1     skrll 	sa = lookup_arch (arg);
    527  1.1     skrll 	if (sa == NULL
    528  1.1     skrll 	    || ! sa->user_option_p)
    529  1.1     skrll 	  {
    530  1.1     skrll 	    if (c == OPTION_XARCH)
    531  1.1     skrll 	      as_bad (_("invalid architecture -xarch=%s"), arg);
    532  1.1     skrll 	    else
    533  1.1     skrll 	      as_bad (_("invalid architecture -A%s"), arg);
    534  1.1     skrll 	    return 0;
    535  1.1     skrll 	  }
    536  1.1     skrll 
    537  1.1     skrll 	opcode_arch = sparc_opcode_lookup_arch (sa->opcode_arch);
    538  1.1     skrll 	if (opcode_arch == SPARC_OPCODE_ARCH_BAD)
    539  1.2     joerg 	  as_fatal (_("Bad opcode table, broken assembler."));
    540  1.2     joerg 
    541  1.2     joerg 	if (!architecture_requested
    542  1.4  christos 	    || opcode_arch > max_architecture)
    543  1.4  christos 	  max_architecture = opcode_arch;
    544  1.4  christos 
    545  1.4  christos         /* The allowed hardware capabilities are the implied by the
    546  1.4  christos            opcodes arch plus any extra capabilities defined in the GAS
    547  1.4  christos            arch.  */
    548  1.4  christos         hwcap_allowed
    549  1.4  christos           = (hwcap_allowed
    550  1.4  christos              | (((bfd_uint64_t) sparc_opcode_archs[opcode_arch].hwcaps2) << 32)
    551  1.4  christos              | (((bfd_uint64_t) sa->hwcap2_allowed) << 32)
    552  1.1     skrll              | sparc_opcode_archs[opcode_arch].hwcaps
    553  1.1     skrll              | sa->hwcap_allowed);
    554  1.1     skrll 	architecture_requested = 1;
    555  1.1     skrll       }
    556  1.1     skrll       break;
    557  1.1     skrll 
    558  1.1     skrll     case OPTION_SPARC:
    559  1.1     skrll       /* Ignore -sparc, used by SunOS make default .s.o rule.  */
    560  1.1     skrll       break;
    561  1.1     skrll 
    562  1.1     skrll     case OPTION_ENFORCE_ALIGNED_DATA:
    563  1.1     skrll       enforce_aligned_data = 1;
    564  1.1     skrll       break;
    565  1.1     skrll 
    566  1.1     skrll #ifdef SPARC_BIENDIAN
    567  1.1     skrll     case OPTION_LITTLE_ENDIAN:
    568  1.1     skrll       target_big_endian = 0;
    569  1.1     skrll       if (default_arch_type != sparclet)
    570  1.1     skrll 	as_fatal ("This target does not support -EL");
    571  1.1     skrll       break;
    572  1.1     skrll     case OPTION_LITTLE_ENDIAN_DATA:
    573  1.1     skrll       target_little_endian_data = 1;
    574  1.1     skrll       target_big_endian = 0;
    575  1.1     skrll       if (default_arch_type != sparc86x
    576  1.1     skrll 	  && default_arch_type != v9)
    577  1.1     skrll 	as_fatal ("This target does not support --little-endian-data");
    578  1.1     skrll       break;
    579  1.1     skrll     case OPTION_BIG_ENDIAN:
    580  1.1     skrll       target_big_endian = 1;
    581  1.1     skrll       break;
    582  1.1     skrll #endif
    583  1.1     skrll 
    584  1.1     skrll #ifdef OBJ_AOUT
    585  1.1     skrll     case 'k':
    586  1.1     skrll       sparc_pic_code = 1;
    587  1.1     skrll       break;
    588  1.1     skrll #endif
    589  1.1     skrll 
    590  1.1     skrll #ifdef OBJ_ELF
    591  1.1     skrll     case OPTION_32:
    592  1.1     skrll     case OPTION_64:
    593  1.1     skrll       {
    594  1.1     skrll 	const char **list, **l;
    595  1.1     skrll 
    596  1.1     skrll 	sparc_arch_size = c == OPTION_32 ? 32 : 64;
    597  1.1     skrll 	list = bfd_target_list ();
    598  1.1     skrll 	for (l = list; *l != NULL; l++)
    599  1.1     skrll 	  {
    600  1.1     skrll 	    if (sparc_arch_size == 32)
    601  1.1     skrll 	      {
    602  1.1     skrll 		if (CONST_STRNEQ (*l, "elf32-sparc"))
    603  1.1     skrll 		  break;
    604  1.1     skrll 	      }
    605  1.1     skrll 	    else
    606  1.1     skrll 	      {
    607  1.1     skrll 		if (CONST_STRNEQ (*l, "elf64-sparc"))
    608  1.1     skrll 		  break;
    609  1.1     skrll 	      }
    610  1.1     skrll 	  }
    611  1.1     skrll 	if (*l == NULL)
    612  1.1     skrll 	  as_fatal (_("No compiled in support for %d bit object file format"),
    613  1.2     joerg 		    sparc_arch_size);
    614  1.2     joerg 	free (list);
    615  1.2     joerg 
    616  1.2     joerg 	if (sparc_arch_size == 64
    617  1.1     skrll 	    && max_architecture < SPARC_OPCODE_ARCH_V9)
    618  1.1     skrll 	  max_architecture = SPARC_OPCODE_ARCH_V9;
    619  1.1     skrll       }
    620  1.1     skrll       break;
    621  1.1     skrll 
    622  1.1     skrll     case OPTION_TSO:
    623  1.1     skrll       sparc_memory_model = MM_TSO;
    624  1.1     skrll       break;
    625  1.1     skrll 
    626  1.1     skrll     case OPTION_PSO:
    627  1.1     skrll       sparc_memory_model = MM_PSO;
    628  1.1     skrll       break;
    629  1.1     skrll 
    630  1.1     skrll     case OPTION_RMO:
    631  1.1     skrll       sparc_memory_model = MM_RMO;
    632  1.1     skrll       break;
    633  1.1     skrll 
    634  1.1     skrll     case 'V':
    635  1.1     skrll       print_version_id ();
    636  1.1     skrll       break;
    637  1.1     skrll 
    638  1.1     skrll     case 'Q':
    639  1.1     skrll       /* Qy - do emit .comment
    640  1.1     skrll 	 Qn - do not emit .comment.  */
    641  1.1     skrll       break;
    642  1.1     skrll 
    643  1.1     skrll     case 's':
    644  1.1     skrll       /* Use .stab instead of .stab.excl.  */
    645  1.1     skrll       break;
    646  1.1     skrll 
    647  1.1     skrll     case 'q':
    648  1.1     skrll       /* quick -- Native assembler does fewer checks.  */
    649  1.1     skrll       break;
    650  1.1     skrll 
    651  1.1     skrll     case 'K':
    652  1.1     skrll       if (strcmp (arg, "PIC") != 0)
    653  1.1     skrll 	as_warn (_("Unrecognized option following -K"));
    654  1.1     skrll       else
    655  1.1     skrll 	sparc_pic_code = 1;
    656  1.1     skrll       break;
    657  1.1     skrll 
    658  1.1     skrll     case OPTION_NO_UNDECLARED_REGS:
    659  1.1     skrll       no_undeclared_regs = 1;
    660  1.1     skrll       break;
    661  1.1     skrll 
    662  1.1     skrll     case OPTION_UNDECLARED_REGS:
    663  1.1     skrll       no_undeclared_regs = 0;
    664  1.1     skrll       break;
    665  1.1     skrll #endif
    666  1.1     skrll 
    667  1.1     skrll     case OPTION_RELAX:
    668  1.1     skrll       sparc_relax = 1;
    669  1.1     skrll       break;
    670  1.1     skrll 
    671  1.1     skrll     case OPTION_NO_RELAX:
    672  1.1     skrll       sparc_relax = 0;
    673  1.4  christos       break;
    674  1.4  christos 
    675  1.4  christos     case OPTION_DCTI_COUPLES_DETECT:
    676  1.4  christos       dcti_couples_detect = 1;
    677  1.1     skrll       break;
    678  1.1     skrll 
    679  1.1     skrll     default:
    680  1.1     skrll       return 0;
    681  1.1     skrll     }
    682  1.1     skrll 
    683  1.1     skrll   return 1;
    684  1.1     skrll }
    685  1.1     skrll 
    686  1.1     skrll void
    687  1.1     skrll md_show_usage (FILE *stream)
    688  1.1     skrll {
    689  1.1     skrll   const struct sparc_arch *arch;
    690  1.1     skrll   int column;
    691  1.1     skrll 
    692  1.1     skrll   /* We don't get a chance to initialize anything before we're called,
    693  1.1     skrll      so handle that now.  */
    694  1.1     skrll   if (! default_init_p)
    695  1.1     skrll     init_default_arch ();
    696  1.1     skrll 
    697  1.1     skrll   fprintf (stream, _("SPARC options:\n"));
    698  1.1     skrll   column = 0;
    699  1.1     skrll   for (arch = &sparc_arch_table[0]; arch->name; arch++)
    700  1.1     skrll     {
    701  1.1     skrll       if (!arch->user_option_p)
    702  1.1     skrll 	continue;
    703  1.1     skrll       if (arch != &sparc_arch_table[0])
    704  1.1     skrll 	fprintf (stream, " | ");
    705  1.1     skrll       if (column + strlen (arch->name) > 70)
    706  1.1     skrll 	{
    707  1.1     skrll 	  column = 0;
    708  1.1     skrll 	  fputc ('\n', stream);
    709  1.1     skrll 	}
    710  1.1     skrll       column += 5 + 2 + strlen (arch->name);
    711  1.1     skrll       fprintf (stream, "-A%s", arch->name);
    712  1.1     skrll     }
    713  1.1     skrll   for (arch = &sparc_arch_table[0]; arch->name; arch++)
    714  1.1     skrll     {
    715  1.1     skrll       if (!arch->user_option_p)
    716  1.1     skrll 	continue;
    717  1.1     skrll       fprintf (stream, " | ");
    718  1.1     skrll       if (column + strlen (arch->name) > 65)
    719  1.1     skrll 	{
    720  1.1     skrll 	  column = 0;
    721  1.1     skrll 	  fputc ('\n', stream);
    722  1.1     skrll 	}
    723  1.1     skrll       column += 5 + 7 + strlen (arch->name);
    724  1.1     skrll       fprintf (stream, "-xarch=%s", arch->name);
    725  1.1     skrll     }
    726  1.1     skrll   fprintf (stream, _("\n\
    727  1.1     skrll 			specify variant of SPARC architecture\n\
    728  1.1     skrll -bump			warn when assembler switches architectures\n\
    729  1.1     skrll -sparc			ignored\n\
    730  1.1     skrll --enforce-aligned-data	force .long, etc., to be aligned correctly\n\
    731  1.1     skrll -relax			relax jumps and branches (default)\n\
    732  1.1     skrll -no-relax		avoid changing any jumps and branches\n"));
    733  1.1     skrll #ifdef OBJ_AOUT
    734  1.1     skrll   fprintf (stream, _("\
    735  1.1     skrll -k			generate PIC\n"));
    736  1.1     skrll #endif
    737  1.1     skrll #ifdef OBJ_ELF
    738  1.1     skrll   fprintf (stream, _("\
    739  1.1     skrll -32			create 32 bit object file\n\
    740  1.1     skrll -64			create 64 bit object file\n"));
    741  1.1     skrll   fprintf (stream, _("\
    742  1.1     skrll 			[default is %d]\n"), default_arch_size);
    743  1.1     skrll   fprintf (stream, _("\
    744  1.1     skrll -TSO			use Total Store Ordering\n\
    745  1.1     skrll -PSO			use Partial Store Ordering\n\
    746  1.1     skrll -RMO			use Relaxed Memory Ordering\n"));
    747  1.1     skrll   fprintf (stream, _("\
    748  1.1     skrll 			[default is %s]\n"), (default_arch_size == 64) ? "RMO" : "TSO");
    749  1.1     skrll   fprintf (stream, _("\
    750  1.1     skrll -KPIC			generate PIC\n\
    751  1.1     skrll -V			print assembler version number\n\
    752  1.1     skrll -undeclared-regs	ignore application global register usage without\n\
    753  1.1     skrll 			appropriate .register directive (default)\n\
    754  1.4  christos -no-undeclared-regs	force error on application global register usage\n\
    755  1.1     skrll 			without appropriate .register directive\n\
    756  1.1     skrll --dcti-couples-detect	warn when an unpredictable DCTI couple is found\n\
    757  1.1     skrll -q			ignored\n\
    758  1.1     skrll -Qy, -Qn		ignored\n\
    759  1.1     skrll -s			ignored\n"));
    760  1.1     skrll #endif
    761  1.1     skrll #ifdef SPARC_BIENDIAN
    762  1.1     skrll   fprintf (stream, _("\
    763  1.1     skrll -EL			generate code for a little endian machine\n\
    764  1.1     skrll -EB			generate code for a big endian machine\n\
    765  1.1     skrll --little-endian-data	generate code for a machine having big endian\n\
    766  1.1     skrll                         instructions and little endian data.\n"));
    767  1.1     skrll #endif
    768  1.1     skrll }
    769  1.3  christos 
    770  1.1     skrll /* Native operand size opcode translation.  */
    772  1.3  christos static struct
    773  1.3  christos   {
    774  1.1     skrll     const char *name;
    775  1.1     skrll     const char *name32;
    776  1.1     skrll     const char *name64;
    777  1.1     skrll   } native_op_table[] =
    778  1.1     skrll {
    779  1.1     skrll   {"ldn", "ld", "ldx"},
    780  1.1     skrll   {"ldna", "lda", "ldxa"},
    781  1.1     skrll   {"stn", "st", "stx"},
    782  1.1     skrll   {"stna", "sta", "stxa"},
    783  1.1     skrll   {"slln", "sll", "sllx"},
    784  1.1     skrll   {"srln", "srl", "srlx"},
    785  1.1     skrll   {"sran", "sra", "srax"},
    786  1.1     skrll   {"casn", "cas", "casx"},
    787  1.1     skrll   {"casna", "casa", "casxa"},
    788  1.1     skrll   {"clrn", "clr", "clrx"},
    789  1.1     skrll   {NULL, NULL, NULL},
    790  1.1     skrll };
    791  1.1     skrll 
    792  1.1     skrll /* sparc64 privileged and hyperprivileged registers.  */
    794  1.1     skrll 
    795  1.1     skrll struct priv_reg_entry
    796  1.1     skrll {
    797  1.1     skrll   const char *name;
    798  1.1     skrll   int regnum;
    799  1.1     skrll };
    800  1.1     skrll 
    801  1.1     skrll struct priv_reg_entry priv_reg_table[] =
    802  1.1     skrll {
    803  1.1     skrll   {"tpc", 0},
    804  1.1     skrll   {"tnpc", 1},
    805  1.1     skrll   {"tstate", 2},
    806  1.1     skrll   {"tt", 3},
    807  1.1     skrll   {"tick", 4},
    808  1.1     skrll   {"tba", 5},
    809  1.1     skrll   {"pstate", 6},
    810  1.1     skrll   {"tl", 7},
    811  1.1     skrll   {"pil", 8},
    812  1.1     skrll   {"cwp", 9},
    813  1.1     skrll   {"cansave", 10},
    814  1.1     skrll   {"canrestore", 11},
    815  1.1     skrll   {"cleanwin", 12},
    816  1.2     joerg   {"otherwin", 13},
    817  1.1     skrll   {"wstate", 14},
    818  1.3  christos   {"fq", 15},
    819  1.1     skrll   {"gl", 16},
    820  1.1     skrll   {"pmcdper", 23},
    821  1.1     skrll   {"ver", 31},
    822  1.1     skrll   {NULL, -1},			/* End marker.  */
    823  1.1     skrll };
    824  1.1     skrll 
    825  1.1     skrll struct priv_reg_entry hpriv_reg_table[] =
    826  1.1     skrll {
    827  1.1     skrll   {"hpstate", 0},
    828  1.3  christos   {"htstate", 1},
    829  1.3  christos   {"hintp", 3},
    830  1.3  christos   {"htba", 5},
    831  1.2     joerg   {"hver", 6},
    832  1.2     joerg   {"hmcdper", 23},
    833  1.1     skrll   {"hmcddfr", 24},
    834  1.3  christos   {"hva_mask_nz", 27},
    835  1.1     skrll   {"hstick_offset", 28},
    836  1.1     skrll   {"hstick_enable", 29},
    837  1.3  christos   {"hstick_cmpr", 31},
    838  1.1     skrll   {NULL, -1},			/* End marker.  */
    839  1.1     skrll };
    840  1.1     skrll 
    841  1.1     skrll /* v9a or later specific ancillary state registers. */
    842  1.1     skrll 
    843  1.1     skrll struct priv_reg_entry v9a_asr_table[] =
    844  1.1     skrll {
    845  1.1     skrll   {"tick_cmpr", 23},
    846  1.1     skrll   {"sys_tick_cmpr", 25},
    847  1.1     skrll   {"sys_tick", 24},
    848  1.1     skrll   {"stick_cmpr", 25},
    849  1.1     skrll   {"stick", 24},
    850  1.2     joerg   {"softint_clear", 21},
    851  1.1     skrll   {"softint_set", 20},
    852  1.1     skrll   {"softint", 22},
    853  1.2     joerg   {"set_softint", 20},
    854  1.1     skrll   {"pause", 27},
    855  1.1     skrll   {"pic", 17},
    856  1.2     joerg   {"pcr", 16},
    857  1.1     skrll   {"mwait", 28},
    858  1.3  christos   {"gsr", 19},
    859  1.1     skrll   {"dcr", 18},
    860  1.1     skrll   {"cfr", 26},
    861  1.1     skrll   {"clear_softint", 21},
    862  1.1     skrll   {NULL, -1},			/* End marker.  */
    863  1.1     skrll };
    864  1.1     skrll 
    865  1.1     skrll static int
    866  1.1     skrll cmp_reg_entry (const void *parg, const void *qarg)
    867  1.3  christos {
    868  1.3  christos   const struct priv_reg_entry *p = (const struct priv_reg_entry *) parg;
    869  1.3  christos   const struct priv_reg_entry *q = (const struct priv_reg_entry *) qarg;
    870  1.3  christos 
    871  1.3  christos   if (p->name == q->name)
    872  1.3  christos     return 0;
    873  1.3  christos   else if (p->name == NULL)
    874  1.3  christos     return 1;
    875  1.3  christos   else if (q->name == NULL)
    876  1.3  christos     return -1;
    877  1.3  christos   else
    878  1.3  christos     return strcmp (q->name, p->name);
    879  1.3  christos }
    880  1.3  christos 
    881  1.3  christos /* sparc %-pseudo-operations.  */
    883  1.3  christos 
    884  1.3  christos 
    885  1.3  christos #define F_POP_V9       0x1 /* The pseudo-op is for v9 only.  */
    886  1.3  christos #define F_POP_PCREL    0x2 /* The pseudo-op can be used in pc-relative
    887  1.3  christos                               contexts.  */
    888  1.3  christos #define F_POP_TLS_CALL 0x4 /* The pseudo-op marks a tls call.  */
    889  1.3  christos #define F_POP_POSTFIX  0x8 /* The pseudo-op should appear after the
    890  1.3  christos                               last operand of an
    891  1.3  christos                               instruction. (Generally they can appear
    892  1.3  christos                               anywhere an immediate operand is
    893  1.3  christos                               expected.  */
    894  1.4  christos struct pop_entry
    895  1.3  christos {
    896  1.3  christos   /* The name as it appears in assembler.  */
    897  1.3  christos   const char *name;
    898  1.3  christos   /* The reloc this pseudo-op translates to.  */
    899  1.3  christos   bfd_reloc_code_real_type reloc;
    900  1.3  christos   /* Flags.  See F_POP_* above.  */
    901  1.3  christos   int flags;
    902  1.3  christos };
    903  1.3  christos 
    904  1.3  christos struct pop_entry pop_table[] =
    905  1.3  christos {
    906  1.3  christos   { "hix",		BFD_RELOC_SPARC_HIX22,		F_POP_V9 },
    907  1.3  christos   { "lox",		BFD_RELOC_SPARC_LOX10, 		F_POP_V9 },
    908  1.3  christos   { "hi",		BFD_RELOC_HI22,			F_POP_PCREL },
    909  1.3  christos   { "lo",		BFD_RELOC_LO10,			F_POP_PCREL },
    910  1.3  christos   { "pc22",		BFD_RELOC_SPARC_PC22,		F_POP_PCREL },
    911  1.3  christos   { "pc10",		BFD_RELOC_SPARC_PC10,		F_POP_PCREL },
    912  1.3  christos   { "hh",		BFD_RELOC_SPARC_HH22,		F_POP_V9|F_POP_PCREL },
    913  1.3  christos   { "hm",		BFD_RELOC_SPARC_HM10,		F_POP_V9|F_POP_PCREL },
    914  1.3  christos   { "lm",		BFD_RELOC_SPARC_LM22,		F_POP_V9|F_POP_PCREL },
    915  1.3  christos   { "h34",		BFD_RELOC_SPARC_H34,		F_POP_V9 },
    916  1.3  christos   { "l34",		BFD_RELOC_SPARC_L44,		F_POP_V9 },
    917  1.3  christos   { "h44",		BFD_RELOC_SPARC_H44,		F_POP_V9 },
    918  1.3  christos   { "m44",		BFD_RELOC_SPARC_M44,		F_POP_V9 },
    919  1.3  christos   { "l44",		BFD_RELOC_SPARC_L44,		F_POP_V9 },
    920  1.3  christos   { "uhi",		BFD_RELOC_SPARC_HH22,		F_POP_V9 },
    921  1.3  christos   { "ulo",		BFD_RELOC_SPARC_HM10,		F_POP_V9 },
    922  1.3  christos   { "tgd_hi22",		BFD_RELOC_SPARC_TLS_GD_HI22, 	0 },
    923  1.3  christos   { "tgd_lo10",		BFD_RELOC_SPARC_TLS_GD_LO10, 	0 },
    924  1.3  christos   { "tldm_hi22",	BFD_RELOC_SPARC_TLS_LDM_HI22, 	0 },
    925  1.3  christos   { "tldm_lo10",	BFD_RELOC_SPARC_TLS_LDM_LO10, 	0 },
    926  1.3  christos   { "tldo_hix22",	BFD_RELOC_SPARC_TLS_LDO_HIX22, 	0 },
    927  1.3  christos   { "tldo_lox10",	BFD_RELOC_SPARC_TLS_LDO_LOX10, 	0 },
    928  1.3  christos   { "tie_hi22",		BFD_RELOC_SPARC_TLS_IE_HI22, 	0 },
    929  1.3  christos   { "tie_lo10",		BFD_RELOC_SPARC_TLS_IE_LO10, 	0 },
    930  1.3  christos   { "tle_hix22",	BFD_RELOC_SPARC_TLS_LE_HIX22, 	0 },
    931  1.3  christos   { "tle_lox10",	BFD_RELOC_SPARC_TLS_LE_LOX10, 	0 },
    932  1.3  christos   { "gdop_hix22",	BFD_RELOC_SPARC_GOTDATA_OP_HIX22, 0 },
    933  1.3  christos   { "gdop_lox10",	BFD_RELOC_SPARC_GOTDATA_OP_LOX10, 0 },
    934  1.3  christos   { "tgd_add", 		BFD_RELOC_SPARC_TLS_GD_ADD,	F_POP_POSTFIX },
    935  1.3  christos   { "tgd_call",		BFD_RELOC_SPARC_TLS_GD_CALL, 	F_POP_POSTFIX|F_POP_TLS_CALL },
    936  1.3  christos   { "tldm_add",		BFD_RELOC_SPARC_TLS_LDM_ADD, 	F_POP_POSTFIX },
    937  1.4  christos   { "tldm_call",	BFD_RELOC_SPARC_TLS_LDM_CALL,	F_POP_POSTFIX|F_POP_TLS_CALL },
    938  1.3  christos   { "tldo_add",		BFD_RELOC_SPARC_TLS_LDO_ADD, 	F_POP_POSTFIX },
    939  1.3  christos   { "tie_ldx",		BFD_RELOC_SPARC_TLS_IE_LDX, 	F_POP_POSTFIX },
    940  1.3  christos   { "tie_ld",		BFD_RELOC_SPARC_TLS_IE_LD,	F_POP_POSTFIX },
    941  1.3  christos   { "tie_add",		BFD_RELOC_SPARC_TLS_IE_ADD,	F_POP_POSTFIX },
    942  1.3  christos   { "gdop",	 	BFD_RELOC_SPARC_GOTDATA_OP,	F_POP_POSTFIX }
    943  1.3  christos };
    944  1.3  christos 
    945  1.3  christos /* Table of %-names that can appear in a sparc assembly program.  This
    947  1.3  christos    table is initialized in md_begin and contains entries for each
    948  1.3  christos    privileged/hyperprivileged/alternate register and %-pseudo-op.  */
    949  1.3  christos 
    950  1.3  christos enum perc_entry_type
    951  1.3  christos {
    952  1.3  christos   perc_entry_none = 0,
    953  1.3  christos   perc_entry_reg,
    954  1.3  christos   perc_entry_post_pop,
    955  1.3  christos   perc_entry_imm_pop
    956  1.3  christos };
    957  1.3  christos 
    958  1.3  christos struct perc_entry
    959  1.3  christos {
    960  1.3  christos   /* Entry type.  */
    961  1.3  christos   enum perc_entry_type type;
    962  1.3  christos   /* Name of the %-entity.  */
    963  1.3  christos   const char *name;
    964  1.3  christos   /* strlen (name).  */
    965  1.3  christos   int len;
    966  1.3  christos   /* Value.  Either a pop or a reg depending on type.*/
    967  1.3  christos   union
    968  1.3  christos   {
    969  1.3  christos     struct pop_entry *pop;
    970  1.3  christos     struct priv_reg_entry *reg;
    971  1.3  christos   };
    972  1.4  christos };
    973  1.3  christos 
    974  1.3  christos #define NUM_PERC_ENTRIES \
    975  1.3  christos   (((sizeof (priv_reg_table) / sizeof (priv_reg_table[0])) - 1)         \
    976  1.3  christos    + ((sizeof (hpriv_reg_table) / sizeof (hpriv_reg_table[0])) - 1)     \
    977  1.3  christos    + ((sizeof (v9a_asr_table) / sizeof (v9a_asr_table[0])) - 1)         \
    978  1.3  christos    + ARRAY_SIZE (pop_table)						\
    979  1.3  christos    + 1)
    980  1.3  christos 
    981  1.3  christos struct perc_entry perc_table[NUM_PERC_ENTRIES];
    982  1.3  christos 
    983  1.3  christos static int
    984  1.3  christos cmp_perc_entry (const void *parg, const void *qarg)
    985  1.3  christos {
    986  1.3  christos   const struct perc_entry *p = (const struct perc_entry *) parg;
    987  1.3  christos   const struct perc_entry *q = (const struct perc_entry *) qarg;
    988  1.3  christos 
    989  1.3  christos   if (p->name == q->name)
    990  1.3  christos     return 0;
    991  1.1     skrll   else if (p->name == NULL)
    992  1.1     skrll     return 1;
    993  1.1     skrll   else if (q->name == NULL)
    994  1.1     skrll     return -1;
    995  1.1     skrll   else
    996  1.1     skrll     return strcmp (q->name, p->name);
    997  1.1     skrll }
    998  1.1     skrll 
    999  1.1     skrll /* This function is called once, at assembler startup time.  It should
   1001  1.1     skrll    set up all the tables, etc. that the MD part of the assembler will
   1002  1.2     joerg    need.  */
   1003  1.1     skrll 
   1004  1.1     skrll void
   1005  1.1     skrll md_begin (void)
   1006  1.1     skrll {
   1007  1.1     skrll   const char *retval = NULL;
   1008  1.1     skrll   int lose = 0;
   1009  1.1     skrll   unsigned int i = 0;
   1010  1.1     skrll 
   1011  1.1     skrll   /* We don't get a chance to initialize anything before md_parse_option
   1012  1.1     skrll      is called, and it may not be called, so handle default initialization
   1013  1.1     skrll      now if not already done.  */
   1014  1.1     skrll   if (! default_init_p)
   1015  1.1     skrll     init_default_arch ();
   1016  1.1     skrll 
   1017  1.1     skrll   sparc_cie_data_alignment = sparc_arch_size == 64 ? -8 : -4;
   1018  1.1     skrll   op_hash = hash_new ();
   1019  1.1     skrll 
   1020  1.1     skrll   while (i < (unsigned int) sparc_num_opcodes)
   1021  1.1     skrll     {
   1022  1.1     skrll       const char *name = sparc_opcodes[i].name;
   1023  1.1     skrll       retval = hash_insert (op_hash, name, (void *) &sparc_opcodes[i]);
   1024  1.1     skrll       if (retval != NULL)
   1025  1.1     skrll 	{
   1026  1.1     skrll 	  as_bad (_("Internal error: can't hash `%s': %s\n"),
   1027  1.1     skrll 		  sparc_opcodes[i].name, retval);
   1028  1.1     skrll 	  lose = 1;
   1029  1.1     skrll 	}
   1030  1.1     skrll       do
   1031  1.1     skrll 	{
   1032  1.1     skrll 	  if (sparc_opcodes[i].match & sparc_opcodes[i].lose)
   1033  1.1     skrll 	    {
   1034  1.1     skrll 	      as_bad (_("Internal error: losing opcode: `%s' \"%s\"\n"),
   1035  1.1     skrll 		      sparc_opcodes[i].name, sparc_opcodes[i].args);
   1036  1.1     skrll 	      lose = 1;
   1037  1.1     skrll 	    }
   1038  1.1     skrll 	  ++i;
   1039  1.1     skrll 	}
   1040  1.3  christos       while (i < (unsigned int) sparc_num_opcodes
   1041  1.1     skrll 	     && !strcmp (sparc_opcodes[i].name, name));
   1042  1.1     skrll     }
   1043  1.1     skrll 
   1044  1.1     skrll   for (i = 0; native_op_table[i].name; i++)
   1045  1.1     skrll     {
   1046  1.1     skrll       const struct sparc_opcode *insn;
   1047  1.1     skrll       const char *name = ((sparc_arch_size == 32)
   1048  1.1     skrll 		    ? native_op_table[i].name32
   1049  1.1     skrll 		    : native_op_table[i].name64);
   1050  1.1     skrll       insn = (struct sparc_opcode *) hash_find (op_hash, name);
   1051  1.1     skrll       if (insn == NULL)
   1052  1.1     skrll 	{
   1053  1.1     skrll 	  as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"),
   1054  1.1     skrll 		  name, native_op_table[i].name);
   1055  1.1     skrll 	  lose = 1;
   1056  1.1     skrll 	}
   1057  1.1     skrll       else
   1058  1.1     skrll 	{
   1059  1.1     skrll 	  retval = hash_insert (op_hash, native_op_table[i].name,
   1060  1.1     skrll 				(void *) insn);
   1061  1.1     skrll 	  if (retval != NULL)
   1062  1.1     skrll 	    {
   1063  1.1     skrll 	      as_bad (_("Internal error: can't hash `%s': %s\n"),
   1064  1.1     skrll 		      sparc_opcodes[i].name, retval);
   1065  1.1     skrll 	      lose = 1;
   1066  1.1     skrll 	    }
   1067  1.1     skrll 	}
   1068  1.3  christos     }
   1069  1.3  christos 
   1070  1.3  christos   if (lose)
   1071  1.3  christos     as_fatal (_("Broken assembler.  No assembly attempted."));
   1072  1.3  christos 
   1073  1.1     skrll   qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]),
   1074  1.1     skrll 	 sizeof (priv_reg_table[0]), cmp_reg_entry);
   1075  1.1     skrll   qsort (hpriv_reg_table, sizeof (hpriv_reg_table) / sizeof (hpriv_reg_table[0]),
   1076  1.1     skrll 	 sizeof (hpriv_reg_table[0]), cmp_reg_entry);
   1077  1.1     skrll   qsort (v9a_asr_table, sizeof (v9a_asr_table) / sizeof (v9a_asr_table[0]),
   1078  1.1     skrll 	 sizeof (v9a_asr_table[0]), cmp_reg_entry);
   1079  1.1     skrll 
   1080  1.1     skrll   /* If -bump, record the architecture level at which we start issuing
   1081  1.1     skrll      warnings.  The behaviour is different depending upon whether an
   1082  1.1     skrll      architecture was explicitly specified.  If it wasn't, we issue warnings
   1083  1.1     skrll      for all upwards bumps.  If it was, we don't start issuing warnings until
   1084  1.1     skrll      we need to bump beyond the requested architecture or when we bump between
   1085  1.1     skrll      conflicting architectures.  */
   1086  1.2     joerg 
   1087  1.2     joerg   if (warn_on_bump
   1088  1.2     joerg       && architecture_requested)
   1089  1.2     joerg     {
   1090  1.2     joerg       /* `max_architecture' records the requested architecture.
   1091  1.2     joerg 	 Issue warnings if we go above it.  */
   1092  1.2     joerg       warn_after_architecture = max_architecture;
   1093  1.2     joerg     }
   1094  1.2     joerg 
   1095  1.2     joerg   /* Find the highest architecture level that doesn't conflict with
   1096  1.1     skrll      the requested one.  */
   1097  1.2     joerg 
   1098  1.2     joerg   if (warn_on_bump
   1099  1.2     joerg       || !architecture_requested)
   1100  1.2     joerg   {
   1101  1.2     joerg     enum sparc_opcode_arch_val current_max_architecture
   1102  1.2     joerg       = max_architecture;
   1103  1.2     joerg 
   1104  1.3  christos     for (max_architecture = SPARC_OPCODE_ARCH_MAX;
   1105  1.3  christos 	 max_architecture > warn_after_architecture;
   1106  1.3  christos 	 --max_architecture)
   1107  1.3  christos       if (! SPARC_OPCODE_CONFLICT_P (max_architecture,
   1108  1.3  christos 				     current_max_architecture))
   1109  1.3  christos 	break;
   1110  1.3  christos   }
   1111  1.3  christos 
   1112  1.3  christos   /* Prepare the tables of %-pseudo-ops.  */
   1113  1.3  christos   {
   1114  1.3  christos     struct priv_reg_entry *reg_tables[]
   1115  1.3  christos       = {priv_reg_table, hpriv_reg_table, v9a_asr_table, NULL};
   1116  1.3  christos     struct priv_reg_entry **reg_table;
   1117  1.3  christos     int entry = 0;
   1118  1.3  christos 
   1119  1.3  christos     /* Add registers.  */
   1120  1.3  christos     for (reg_table = reg_tables; reg_table[0]; reg_table++)
   1121  1.3  christos       {
   1122  1.3  christos         struct priv_reg_entry *reg;
   1123  1.3  christos         for (reg = *reg_table; reg->name; reg++)
   1124  1.3  christos           {
   1125  1.3  christos             struct perc_entry *p = &perc_table[entry++];
   1126  1.3  christos             p->type = perc_entry_reg;
   1127  1.4  christos             p->name = reg->name;
   1128  1.4  christos             p->len = strlen (reg->name);
   1129  1.4  christos             p->reg = reg;
   1130  1.4  christos           }
   1131  1.4  christos       }
   1132  1.4  christos 
   1133  1.4  christos     /* Add %-pseudo-ops.  */
   1134  1.4  christos     for (i = 0; i < ARRAY_SIZE (pop_table); i++)
   1135  1.4  christos       {
   1136  1.3  christos 	struct perc_entry *p = &perc_table[entry++];
   1137  1.4  christos 	p->type = (pop_table[i].flags & F_POP_POSTFIX
   1138  1.3  christos 		   ? perc_entry_post_pop : perc_entry_imm_pop);
   1139  1.3  christos 	p->name = pop_table[i].name;
   1140  1.3  christos 	p->len = strlen (pop_table[i].name);
   1141  1.3  christos 	p->pop = &pop_table[i];
   1142  1.3  christos       }
   1143  1.3  christos 
   1144  1.1     skrll     /* Last entry is the sentinel.  */
   1145  1.1     skrll     perc_table[entry].type = perc_entry_none;
   1146  1.1     skrll 
   1147  1.1     skrll     qsort (perc_table, sizeof (perc_table) / sizeof (perc_table[0]),
   1148  1.1     skrll            sizeof (perc_table[0]), cmp_perc_entry);
   1149  1.1     skrll 
   1150  1.1     skrll   }
   1151  1.1     skrll }
   1152  1.2     joerg 
   1153  1.2     joerg /* Called after all assembly has been done.  */
   1154  1.2     joerg 
   1155  1.1     skrll void
   1156  1.1     skrll sparc_md_end (void)
   1157  1.1     skrll {
   1158  1.1     skrll   unsigned long mach = bfd_mach_sparc;
   1159  1.1     skrll #if defined(OBJ_ELF) && !defined(TE_SOLARIS)
   1160  1.1     skrll   int hwcaps, hwcaps2;
   1161  1.3  christos #endif
   1162  1.3  christos 
   1163  1.3  christos   if (sparc_arch_size == 64)
   1164  1.3  christos     switch (current_architecture)
   1165  1.3  christos       {
   1166  1.4  christos       case SPARC_OPCODE_ARCH_V9A: mach = bfd_mach_sparc_v9a; break;
   1167  1.1     skrll       case SPARC_OPCODE_ARCH_V9B: mach = bfd_mach_sparc_v9b; break;
   1168  1.1     skrll       case SPARC_OPCODE_ARCH_V9C: mach = bfd_mach_sparc_v9c; break;
   1169  1.1     skrll       case SPARC_OPCODE_ARCH_V9D: mach = bfd_mach_sparc_v9d; break;
   1170  1.1     skrll       case SPARC_OPCODE_ARCH_V9E: mach = bfd_mach_sparc_v9e; break;
   1171  1.1     skrll       case SPARC_OPCODE_ARCH_V9V: mach = bfd_mach_sparc_v9v; break;
   1172  1.1     skrll       case SPARC_OPCODE_ARCH_V9M: mach = bfd_mach_sparc_v9m; break;
   1173  1.1     skrll       case SPARC_OPCODE_ARCH_M8:  mach = bfd_mach_sparc_v9m8; break;
   1174  1.1     skrll       default: mach = bfd_mach_sparc_v9; break;
   1175  1.1     skrll       }
   1176  1.3  christos   else
   1177  1.3  christos     switch (current_architecture)
   1178  1.3  christos       {
   1179  1.3  christos       case SPARC_OPCODE_ARCH_SPARCLET: mach = bfd_mach_sparc_sparclet; break;
   1180  1.3  christos       case SPARC_OPCODE_ARCH_V9: mach = bfd_mach_sparc_v8plus; break;
   1181  1.4  christos       case SPARC_OPCODE_ARCH_V9A: mach = bfd_mach_sparc_v8plusa; break;
   1182  1.1     skrll       case SPARC_OPCODE_ARCH_V9B: mach = bfd_mach_sparc_v8plusb; break;
   1183  1.1     skrll       case SPARC_OPCODE_ARCH_V9C: mach = bfd_mach_sparc_v8plusc; break;
   1184  1.1     skrll       case SPARC_OPCODE_ARCH_V9D: mach = bfd_mach_sparc_v8plusd; break;
   1185  1.1     skrll       case SPARC_OPCODE_ARCH_V9E: mach = bfd_mach_sparc_v8pluse; break;
   1186  1.1     skrll       case SPARC_OPCODE_ARCH_V9V: mach = bfd_mach_sparc_v8plusv; break;
   1187  1.1     skrll       case SPARC_OPCODE_ARCH_V9M: mach = bfd_mach_sparc_v8plusm; break;
   1188  1.2     joerg       case SPARC_OPCODE_ARCH_M8:  mach = bfd_mach_sparc_v8plusm8; break;
   1189  1.2     joerg       /* The sparclite is treated like a normal sparc.  Perhaps it shouldn't
   1190  1.2     joerg 	 be but for now it is (since that's the way it's always been
   1191  1.2     joerg 	 treated).  */
   1192  1.2     joerg       default: break;
   1193  1.2     joerg       }
   1194  1.2     joerg   bfd_set_arch_mach (stdoutput, bfd_arch_sparc, mach);
   1195  1.2     joerg 
   1196  1.2     joerg #if defined(OBJ_ELF) && !defined(TE_SOLARIS)
   1197  1.2     joerg   hwcaps = hwcap_seen & U0xffffffff;
   1198  1.1     skrll   hwcaps2 = hwcap_seen >> 32;
   1199  1.1     skrll 
   1200  1.1     skrll   if (hwcaps)
   1201  1.1     skrll     bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, Tag_GNU_Sparc_HWCAPS, hwcaps);
   1202  1.1     skrll   if (hwcaps2)
   1203  1.1     skrll     bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, Tag_GNU_Sparc_HWCAPS2, hwcaps2);
   1204  1.1     skrll #endif
   1205  1.1     skrll }
   1206  1.1     skrll 
   1207  1.1     skrll /* Return non-zero if VAL is in the range -(MAX+1) to MAX.  */
   1209  1.1     skrll 
   1210  1.1     skrll static inline int
   1211  1.1     skrll in_signed_range (bfd_signed_vma val, bfd_signed_vma max)
   1212  1.1     skrll {
   1213  1.1     skrll   if (max <= 0)
   1214  1.1     skrll     abort ();
   1215  1.1     skrll   /* Sign-extend the value from the architecture word size, so that
   1216  1.1     skrll      0xffffffff is always considered -1 on sparc32.  */
   1217  1.1     skrll   if (sparc_arch_size == 32)
   1218  1.1     skrll     {
   1219  1.1     skrll       bfd_signed_vma sign = (bfd_signed_vma) 1 << 31;
   1220  1.1     skrll       val = ((val & U0xffffffff) ^ sign) - sign;
   1221  1.1     skrll     }
   1222  1.1     skrll   if (val > max)
   1223  1.1     skrll     return 0;
   1224  1.1     skrll   if (val < ~max)
   1225  1.1     skrll     return 0;
   1226  1.1     skrll   return 1;
   1227  1.1     skrll }
   1228  1.1     skrll 
   1229  1.1     skrll /* Return non-zero if VAL is in the range 0 to MAX.  */
   1230  1.1     skrll 
   1231  1.1     skrll static inline int
   1232  1.1     skrll in_unsigned_range (bfd_vma val, bfd_vma max)
   1233  1.1     skrll {
   1234  1.1     skrll   if (val > max)
   1235  1.1     skrll     return 0;
   1236  1.1     skrll   return 1;
   1237  1.1     skrll }
   1238  1.1     skrll 
   1239  1.1     skrll /* Return non-zero if VAL is in the range -(MAX/2+1) to MAX.
   1240  1.1     skrll    (e.g. -15 to +31).  */
   1241  1.1     skrll 
   1242  1.1     skrll static inline int
   1243  1.1     skrll in_bitfield_range (bfd_signed_vma val, bfd_signed_vma max)
   1244  1.1     skrll {
   1245  1.1     skrll   if (max <= 0)
   1246  1.1     skrll     abort ();
   1247  1.1     skrll   if (val > max)
   1248  1.1     skrll     return 0;
   1249  1.1     skrll   if (val < ~(max >> 1))
   1250  1.1     skrll     return 0;
   1251  1.1     skrll   return 1;
   1252  1.1     skrll }
   1253  1.1     skrll 
   1254  1.1     skrll static int
   1255  1.1     skrll sparc_ffs (unsigned int mask)
   1256  1.1     skrll {
   1257  1.1     skrll   int i;
   1258  1.1     skrll 
   1259  1.1     skrll   if (mask == 0)
   1260  1.1     skrll     return -1;
   1261  1.1     skrll 
   1262  1.1     skrll   for (i = 0; (mask & 1) == 0; ++i)
   1263  1.1     skrll     mask >>= 1;
   1264  1.1     skrll   return i;
   1265  1.1     skrll }
   1266  1.1     skrll 
   1267  1.1     skrll /* Implement big shift right.  */
   1268  1.1     skrll static bfd_vma
   1269  1.1     skrll BSR (bfd_vma val, int amount)
   1270  1.1     skrll {
   1271  1.1     skrll   if (sizeof (bfd_vma) <= 4 && amount >= 32)
   1272  1.4  christos     as_fatal (_("Support for 64-bit arithmetic not compiled in."));
   1273  1.1     skrll   return val >> amount;
   1274  1.1     skrll }
   1275  1.1     skrll 
   1276  1.1     skrll /* For communication between sparc_ip and get_expression.  */
   1278  1.1     skrll static char *expr_end;
   1279  1.1     skrll 
   1280  1.1     skrll /* Values for `special_case'.
   1281  1.1     skrll    Instructions that require weird handling because they're longer than
   1282  1.1     skrll    4 bytes.  */
   1283  1.1     skrll #define SPECIAL_CASE_NONE	0
   1284  1.1     skrll #define	SPECIAL_CASE_SET	1
   1285  1.1     skrll #define SPECIAL_CASE_SETSW	2
   1286  1.1     skrll #define SPECIAL_CASE_SETX	3
   1287  1.1     skrll /* FIXME: sparc-opc.c doesn't have necessary "S" trigger to enable this.  */
   1288  1.1     skrll #define	SPECIAL_CASE_FDIV	4
   1289  1.1     skrll 
   1290  1.1     skrll /* Bit masks of various insns.  */
   1291  1.1     skrll #define NOP_INSN 0x01000000
   1292  1.1     skrll #define OR_INSN 0x80100000
   1293  1.1     skrll #define XOR_INSN 0x80180000
   1294  1.1     skrll #define FMOVS_INSN 0x81A00020
   1295  1.1     skrll #define SETHI_INSN 0x01000000
   1296  1.1     skrll #define SLLX_INSN 0x81281000
   1297  1.1     skrll #define SRA_INSN 0x81380000
   1298  1.1     skrll 
   1299  1.1     skrll /* The last instruction to be assembled.  */
   1300  1.1     skrll static const struct sparc_opcode *last_insn;
   1301  1.1     skrll /* The assembled opcode of `last_insn'.  */
   1302  1.1     skrll static unsigned long last_opcode;
   1303  1.1     skrll 
   1304  1.1     skrll /* Handle the set and setuw synthetic instructions.  */
   1306  1.1     skrll 
   1307  1.1     skrll static void
   1308  1.1     skrll synthetize_setuw (const struct sparc_opcode *insn)
   1309  1.1     skrll {
   1310  1.1     skrll   int need_hi22_p = 0;
   1311  1.1     skrll   int rd = (the_insn.opcode & RD (~0)) >> 25;
   1312  1.1     skrll 
   1313  1.1     skrll   if (the_insn.exp.X_op == O_constant)
   1314  1.1     skrll     {
   1315  1.1     skrll       if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
   1316  1.1     skrll 	{
   1317  1.1     skrll 	  if (sizeof (offsetT) > 4
   1318  1.1     skrll 	      && (the_insn.exp.X_add_number < 0
   1319  1.1     skrll 		  || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
   1320  1.1     skrll 	    as_warn (_("set: number not in 0..4294967295 range"));
   1321  1.1     skrll 	}
   1322  1.1     skrll       else
   1323  1.1     skrll 	{
   1324  1.1     skrll 	  if (sizeof (offsetT) > 4
   1325  1.1     skrll 	      && (the_insn.exp.X_add_number < -(offsetT) U0x80000000
   1326  1.1     skrll 		  || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
   1327  1.1     skrll 	    as_warn (_("set: number not in -2147483648..4294967295 range"));
   1328  1.1     skrll 	  the_insn.exp.X_add_number = (int) the_insn.exp.X_add_number;
   1329  1.1     skrll 	}
   1330  1.1     skrll     }
   1331  1.1     skrll 
   1332  1.1     skrll   /* See if operand is absolute and small; skip sethi if so.  */
   1333  1.1     skrll   if (the_insn.exp.X_op != O_constant
   1334  1.1     skrll       || the_insn.exp.X_add_number >= (1 << 12)
   1335  1.1     skrll       || the_insn.exp.X_add_number < -(1 << 12))
   1336  1.1     skrll     {
   1337  1.1     skrll       the_insn.opcode = (SETHI_INSN | RD (rd)
   1338  1.1     skrll 			 | ((the_insn.exp.X_add_number >> 10)
   1339  1.1     skrll 			    & (the_insn.exp.X_op == O_constant
   1340  1.1     skrll 			       ? 0x3fffff : 0)));
   1341  1.1     skrll       the_insn.reloc = (the_insn.exp.X_op != O_constant
   1342  1.1     skrll 			? BFD_RELOC_HI22 : BFD_RELOC_NONE);
   1343  1.1     skrll       output_insn (insn, &the_insn);
   1344  1.1     skrll       need_hi22_p = 1;
   1345  1.1     skrll     }
   1346  1.1     skrll 
   1347  1.1     skrll   /* See if operand has no low-order bits; skip OR if so.  */
   1348  1.1     skrll   if (the_insn.exp.X_op != O_constant
   1349  1.1     skrll       || (need_hi22_p && (the_insn.exp.X_add_number & 0x3FF) != 0)
   1350  1.1     skrll       || ! need_hi22_p)
   1351  1.1     skrll     {
   1352  1.1     skrll       the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (rd) : 0)
   1353  1.1     skrll 			 | RD (rd) | IMMED
   1354  1.1     skrll 			 | (the_insn.exp.X_add_number
   1355  1.1     skrll 			    & (the_insn.exp.X_op != O_constant
   1356  1.1     skrll 			       ? 0 : need_hi22_p ? 0x3ff : 0x1fff)));
   1357  1.1     skrll       the_insn.reloc = (the_insn.exp.X_op != O_constant
   1358  1.1     skrll 			? BFD_RELOC_LO10 : BFD_RELOC_NONE);
   1359  1.1     skrll       output_insn (insn, &the_insn);
   1360  1.1     skrll     }
   1361  1.1     skrll }
   1362  1.1     skrll 
   1363  1.1     skrll /* Handle the setsw synthetic instruction.  */
   1364  1.1     skrll 
   1365  1.1     skrll static void
   1366  1.1     skrll synthetize_setsw (const struct sparc_opcode *insn)
   1367  1.1     skrll {
   1368  1.1     skrll   int low32, rd, opc;
   1369  1.1     skrll 
   1370  1.1     skrll   rd = (the_insn.opcode & RD (~0)) >> 25;
   1371  1.1     skrll 
   1372  1.1     skrll   if (the_insn.exp.X_op != O_constant)
   1373  1.1     skrll     {
   1374  1.1     skrll       synthetize_setuw (insn);
   1375  1.1     skrll 
   1376  1.1     skrll       /* Need to sign extend it.  */
   1377  1.1     skrll       the_insn.opcode = (SRA_INSN | RS1 (rd) | RD (rd));
   1378  1.1     skrll       the_insn.reloc = BFD_RELOC_NONE;
   1379  1.1     skrll       output_insn (insn, &the_insn);
   1380  1.1     skrll       return;
   1381  1.1     skrll     }
   1382  1.1     skrll 
   1383  1.1     skrll   if (sizeof (offsetT) > 4
   1384  1.1     skrll       && (the_insn.exp.X_add_number < -(offsetT) U0x80000000
   1385  1.1     skrll 	  || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
   1386  1.1     skrll     as_warn (_("setsw: number not in -2147483648..4294967295 range"));
   1387  1.1     skrll 
   1388  1.1     skrll   low32 = the_insn.exp.X_add_number;
   1389  1.1     skrll 
   1390  1.1     skrll   if (low32 >= 0)
   1391  1.1     skrll     {
   1392  1.1     skrll       synthetize_setuw (insn);
   1393  1.1     skrll       return;
   1394  1.1     skrll     }
   1395  1.1     skrll 
   1396  1.1     skrll   opc = OR_INSN;
   1397  1.1     skrll 
   1398  1.1     skrll   the_insn.reloc = BFD_RELOC_NONE;
   1399  1.1     skrll   /* See if operand is absolute and small; skip sethi if so.  */
   1400  1.1     skrll   if (low32 < -(1 << 12))
   1401  1.1     skrll     {
   1402  1.1     skrll       the_insn.opcode = (SETHI_INSN | RD (rd)
   1403  1.1     skrll 			 | (((~the_insn.exp.X_add_number) >> 10) & 0x3fffff));
   1404  1.2     joerg       output_insn (insn, &the_insn);
   1405  1.1     skrll       low32 = 0x1c00 | (low32 & 0x3ff);
   1406  1.1     skrll       opc = RS1 (rd) | XOR_INSN;
   1407  1.1     skrll     }
   1408  1.1     skrll 
   1409  1.1     skrll   the_insn.opcode = (opc | RD (rd) | IMMED
   1410  1.1     skrll 		     | (low32 & 0x1fff));
   1411  1.1     skrll   output_insn (insn, &the_insn);
   1412  1.1     skrll }
   1413  1.1     skrll 
   1414  1.1     skrll /* Handle the setx synthetic instruction.  */
   1415  1.1     skrll 
   1416  1.1     skrll static void
   1417  1.1     skrll synthetize_setx (const struct sparc_opcode *insn)
   1418  1.1     skrll {
   1419  1.1     skrll   int upper32, lower32;
   1420  1.1     skrll   int tmpreg = (the_insn.opcode & RS1 (~0)) >> 14;
   1421  1.1     skrll   int dstreg = (the_insn.opcode & RD (~0)) >> 25;
   1422  1.1     skrll   int upper_dstreg;
   1423  1.1     skrll   int need_hh22_p = 0, need_hm10_p = 0, need_hi22_p = 0, need_lo10_p = 0;
   1424  1.1     skrll   int need_xor10_p = 0;
   1425  1.1     skrll 
   1426  1.1     skrll #define SIGNEXT32(x) ((((x) & U0xffffffff) ^ U0x80000000) - U0x80000000)
   1427  1.1     skrll   lower32 = SIGNEXT32 (the_insn.exp.X_add_number);
   1428  1.1     skrll   upper32 = SIGNEXT32 (BSR (the_insn.exp.X_add_number, 32));
   1429  1.1     skrll #undef SIGNEXT32
   1430  1.1     skrll 
   1431  1.1     skrll   upper_dstreg = tmpreg;
   1432  1.1     skrll   /* The tmp reg should not be the dst reg.  */
   1433  1.1     skrll   if (tmpreg == dstreg)
   1434  1.1     skrll     as_warn (_("setx: temporary register same as destination register"));
   1435  1.1     skrll 
   1436  1.1     skrll   /* ??? Obviously there are other optimizations we can do
   1437  1.1     skrll      (e.g. sethi+shift for 0x1f0000000) and perhaps we shouldn't be
   1438  1.1     skrll      doing some of these.  Later.  If you do change things, try to
   1439  1.1     skrll      change all of this to be table driven as well.  */
   1440  1.1     skrll   /* What to output depends on the number if it's constant.
   1441  1.1     skrll      Compute that first, then output what we've decided upon.  */
   1442  1.1     skrll   if (the_insn.exp.X_op != O_constant)
   1443  1.1     skrll     {
   1444  1.1     skrll       if (sparc_arch_size == 32)
   1445  1.1     skrll 	{
   1446  1.1     skrll 	  /* When arch size is 32, we want setx to be equivalent
   1447  1.1     skrll 	     to setuw for anything but constants.  */
   1448  1.1     skrll 	  the_insn.exp.X_add_number &= 0xffffffff;
   1449  1.1     skrll 	  synthetize_setuw (insn);
   1450  1.1     skrll 	  return;
   1451  1.1     skrll 	}
   1452  1.1     skrll       need_hh22_p = need_hm10_p = need_hi22_p = need_lo10_p = 1;
   1453  1.1     skrll       lower32 = 0;
   1454  1.1     skrll       upper32 = 0;
   1455  1.1     skrll     }
   1456  1.1     skrll   else
   1457  1.1     skrll     {
   1458  1.1     skrll       /* Reset X_add_number, we've extracted it as upper32/lower32.
   1459  1.1     skrll 	 Otherwise fixup_segment will complain about not being able to
   1460  1.1     skrll 	 write an 8 byte number in a 4 byte field.  */
   1461  1.1     skrll       the_insn.exp.X_add_number = 0;
   1462  1.1     skrll 
   1463  1.1     skrll       /* Only need hh22 if `or' insn can't handle constant.  */
   1464  1.1     skrll       if (upper32 < -(1 << 12) || upper32 >= (1 << 12))
   1465  1.1     skrll 	need_hh22_p = 1;
   1466  1.1     skrll 
   1467  1.1     skrll       /* Does bottom part (after sethi) have bits?  */
   1468  1.1     skrll       if ((need_hh22_p && (upper32 & 0x3ff) != 0)
   1469  1.1     skrll 	  /* No hh22, but does upper32 still have bits we can't set
   1470  1.1     skrll 	     from lower32?  */
   1471  1.1     skrll 	  || (! need_hh22_p && upper32 != 0 && upper32 != -1))
   1472  1.1     skrll 	need_hm10_p = 1;
   1473  1.1     skrll 
   1474  1.1     skrll       /* If the lower half is all zero, we build the upper half directly
   1475  1.1     skrll 	 into the dst reg.  */
   1476  1.1     skrll       if (lower32 != 0
   1477  1.1     skrll 	  /* Need lower half if number is zero or 0xffffffff00000000.  */
   1478  1.1     skrll 	  || (! need_hh22_p && ! need_hm10_p))
   1479  1.1     skrll 	{
   1480  1.1     skrll 	  /* No need for sethi if `or' insn can handle constant.  */
   1481  1.1     skrll 	  if (lower32 < -(1 << 12) || lower32 >= (1 << 12)
   1482  1.1     skrll 	      /* Note that we can't use a negative constant in the `or'
   1483  1.1     skrll 		 insn unless the upper 32 bits are all ones.  */
   1484  1.1     skrll 	      || (lower32 < 0 && upper32 != -1)
   1485  1.1     skrll 	      || (lower32 >= 0 && upper32 == -1))
   1486  1.1     skrll 	    need_hi22_p = 1;
   1487  1.1     skrll 
   1488  1.1     skrll 	  if (need_hi22_p && upper32 == -1)
   1489  1.1     skrll 	    need_xor10_p = 1;
   1490  1.1     skrll 
   1491  1.1     skrll 	  /* Does bottom part (after sethi) have bits?  */
   1492  1.1     skrll 	  else if ((need_hi22_p && (lower32 & 0x3ff) != 0)
   1493  1.1     skrll 		   /* No sethi.  */
   1494  1.1     skrll 		   || (! need_hi22_p && (lower32 & 0x1fff) != 0)
   1495  1.1     skrll 		   /* Need `or' if we didn't set anything else.  */
   1496  1.1     skrll 		   || (! need_hi22_p && ! need_hh22_p && ! need_hm10_p))
   1497  1.1     skrll 	    need_lo10_p = 1;
   1498  1.1     skrll 	}
   1499  1.1     skrll       else
   1500  1.1     skrll 	/* Output directly to dst reg if lower 32 bits are all zero.  */
   1501  1.1     skrll 	upper_dstreg = dstreg;
   1502  1.1     skrll     }
   1503  1.1     skrll 
   1504  1.1     skrll   if (!upper_dstreg && dstreg)
   1505  1.1     skrll     as_warn (_("setx: illegal temporary register g0"));
   1506  1.1     skrll 
   1507  1.1     skrll   if (need_hh22_p)
   1508  1.1     skrll     {
   1509  1.1     skrll       the_insn.opcode = (SETHI_INSN | RD (upper_dstreg)
   1510  1.1     skrll 			 | ((upper32 >> 10) & 0x3fffff));
   1511  1.1     skrll       the_insn.reloc = (the_insn.exp.X_op != O_constant
   1512  1.1     skrll 			? BFD_RELOC_SPARC_HH22 : BFD_RELOC_NONE);
   1513  1.1     skrll       output_insn (insn, &the_insn);
   1514  1.1     skrll     }
   1515  1.1     skrll 
   1516  1.1     skrll   if (need_hi22_p)
   1517  1.1     skrll     {
   1518  1.1     skrll       the_insn.opcode = (SETHI_INSN | RD (dstreg)
   1519  1.1     skrll 			 | (((need_xor10_p ? ~lower32 : lower32)
   1520  1.1     skrll 			     >> 10) & 0x3fffff));
   1521  1.1     skrll       the_insn.reloc = (the_insn.exp.X_op != O_constant
   1522  1.1     skrll 			? BFD_RELOC_SPARC_LM22 : BFD_RELOC_NONE);
   1523  1.1     skrll       output_insn (insn, &the_insn);
   1524  1.1     skrll     }
   1525  1.1     skrll 
   1526  1.1     skrll   if (need_hm10_p)
   1527  1.1     skrll     {
   1528  1.1     skrll       the_insn.opcode = (OR_INSN
   1529  1.1     skrll 			 | (need_hh22_p ? RS1 (upper_dstreg) : 0)
   1530  1.1     skrll 			 | RD (upper_dstreg)
   1531  1.1     skrll 			 | IMMED
   1532  1.1     skrll 			 | (upper32 & (need_hh22_p ? 0x3ff : 0x1fff)));
   1533  1.1     skrll       the_insn.reloc = (the_insn.exp.X_op != O_constant
   1534  1.1     skrll 			? BFD_RELOC_SPARC_HM10 : BFD_RELOC_NONE);
   1535  1.1     skrll       output_insn (insn, &the_insn);
   1536  1.1     skrll     }
   1537  1.1     skrll 
   1538  1.1     skrll   if (need_lo10_p)
   1539  1.1     skrll     {
   1540  1.1     skrll       /* FIXME: One nice optimization to do here is to OR the low part
   1541  1.1     skrll 	 with the highpart if hi22 isn't needed and the low part is
   1542  1.1     skrll 	 positive.  */
   1543  1.1     skrll       the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (dstreg) : 0)
   1544  1.1     skrll 			 | RD (dstreg)
   1545  1.1     skrll 			 | IMMED
   1546  1.1     skrll 			 | (lower32 & (need_hi22_p ? 0x3ff : 0x1fff)));
   1547  1.1     skrll       the_insn.reloc = (the_insn.exp.X_op != O_constant
   1548  1.1     skrll 			? BFD_RELOC_LO10 : BFD_RELOC_NONE);
   1549  1.1     skrll       output_insn (insn, &the_insn);
   1550  1.1     skrll     }
   1551  1.1     skrll 
   1552  1.1     skrll   /* If we needed to build the upper part, shift it into place.  */
   1553  1.1     skrll   if (need_hh22_p || need_hm10_p)
   1554  1.1     skrll     {
   1555  1.1     skrll       the_insn.opcode = (SLLX_INSN | RS1 (upper_dstreg) | RD (upper_dstreg)
   1556  1.1     skrll 			 | IMMED | 32);
   1557  1.1     skrll       the_insn.reloc = BFD_RELOC_NONE;
   1558  1.1     skrll       output_insn (insn, &the_insn);
   1559  1.1     skrll     }
   1560  1.1     skrll 
   1561  1.1     skrll   /* To get -1 in upper32, we do sethi %hi(~x), r; xor r, -0x400 | x, r.  */
   1562  1.1     skrll   if (need_xor10_p)
   1563  1.1     skrll     {
   1564  1.1     skrll       the_insn.opcode = (XOR_INSN | RS1 (dstreg) | RD (dstreg) | IMMED
   1565  1.1     skrll 			 | 0x1c00 | (lower32 & 0x3ff));
   1566  1.1     skrll       the_insn.reloc = BFD_RELOC_NONE;
   1567  1.1     skrll       output_insn (insn, &the_insn);
   1568  1.1     skrll     }
   1569  1.1     skrll 
   1570  1.1     skrll   /* If we needed to build both upper and lower parts, OR them together.  */
   1571  1.1     skrll   else if ((need_hh22_p || need_hm10_p) && (need_hi22_p || need_lo10_p))
   1572  1.1     skrll     {
   1573  1.1     skrll       the_insn.opcode = (OR_INSN | RS1 (dstreg) | RS2 (upper_dstreg)
   1574  1.1     skrll 			 | RD (dstreg));
   1575  1.1     skrll       the_insn.reloc = BFD_RELOC_NONE;
   1576  1.1     skrll       output_insn (insn, &the_insn);
   1577  1.1     skrll     }
   1578  1.1     skrll }
   1579  1.1     skrll 
   1580  1.1     skrll /* Main entry point to assemble one instruction.  */
   1582  1.1     skrll 
   1583  1.4  christos void
   1584  1.4  christos md_assemble (char *str)
   1585  1.1     skrll {
   1586  1.4  christos   const struct sparc_opcode *insn;
   1587  1.4  christos   int special_case;
   1588  1.4  christos 
   1589  1.4  christos   know (str);
   1590  1.4  christos   special_case = sparc_ip (str, &insn);
   1591  1.4  christos   if (insn == NULL)
   1592  1.4  christos     return;
   1593  1.4  christos 
   1594  1.4  christos   /* Certain instructions may not appear on delay slots.  Check for
   1595  1.4  christos      these situations.  */
   1596  1.4  christos   if (last_insn != NULL
   1597  1.4  christos       && (last_insn->flags & F_DELAYED) != 0)
   1598  1.4  christos     {
   1599  1.4  christos       /* Before SPARC V9 the effect of having a delayed branch
   1600  1.4  christos          instruction in the delay slot of a conditional delayed branch
   1601  1.4  christos          was undefined.
   1602  1.4  christos 
   1603  1.4  christos          In SPARC V9 DCTI couples are well defined.
   1604  1.4  christos 
   1605  1.4  christos          However, starting with the UltraSPARC Architecture 2005, DCTI
   1606  1.4  christos          couples (of all kind) are deprecated and should not be used,
   1607  1.4  christos          as they may be slow or behave differently to what the
   1608  1.4  christos          programmer expects.  */
   1609  1.4  christos       if (dcti_couples_detect
   1610  1.4  christos           && (insn->flags & F_DELAYED) != 0
   1611  1.4  christos           && ((max_architecture < SPARC_OPCODE_ARCH_V9
   1612  1.4  christos                && (last_insn->flags & F_CONDBR) != 0)
   1613  1.4  christos               || max_architecture >= SPARC_OPCODE_ARCH_V9C))
   1614  1.4  christos         as_warn (_("unpredictable DCTI couple"));
   1615  1.1     skrll 
   1616  1.2     joerg 
   1617  1.2     joerg       /* We warn about attempts to put a floating point branch in a
   1618  1.2     joerg          delay slot, unless the delay slot has been annulled.  */
   1619  1.2     joerg       if ((insn->flags & F_FBR) != 0
   1620  1.2     joerg           /* ??? This test isn't completely accurate.  We assume anything with
   1621  1.2     joerg              F_{UNBR,CONDBR,FBR} set is annullable.  */
   1622  1.1     skrll           && ((last_insn->flags & (F_UNBR | F_CONDBR | F_FBR)) == 0
   1623  1.2     joerg               || (last_opcode & ANNUL) == 0))
   1624  1.2     joerg         as_warn (_("FP branch in delay slot"));
   1625  1.2     joerg     }
   1626  1.2     joerg 
   1627  1.1     skrll   /* SPARC before v8 requires a nop instruction between a floating
   1628  1.1     skrll      point instruction and a floating point branch.  SPARCv8 requires
   1629  1.1     skrll      a nop only immediately after FPop2 (fcmp*) instructions.
   1630  1.1     skrll      We insert one automatically, with a warning.
   1631  1.1     skrll    */
   1632  1.1     skrll   if (last_insn != NULL
   1633  1.1     skrll       && (insn->flags & F_FBR) != 0
   1634  1.1     skrll       && (last_insn->flags & F_FLOAT) != 0
   1635  1.1     skrll       && (max_architecture < SPARC_OPCODE_ARCH_V8 ||
   1636  1.1     skrll           (max_architecture < SPARC_OPCODE_ARCH_V9 &&
   1637  1.1     skrll            strncmp(last_insn->name, "fcmp", 4) == 0)))
   1638  1.1     skrll     {
   1639  1.1     skrll       struct sparc_it nop_insn;
   1640  1.1     skrll 
   1641  1.1     skrll       nop_insn.opcode = NOP_INSN;
   1642  1.1     skrll       nop_insn.reloc = BFD_RELOC_NONE;
   1643  1.1     skrll       output_insn (insn, &nop_insn);
   1644  1.1     skrll       as_warn (_("FP branch preceded by FP instruction; NOP inserted"));
   1645  1.1     skrll     }
   1646  1.1     skrll 
   1647  1.1     skrll   switch (special_case)
   1648  1.1     skrll     {
   1649  1.1     skrll     case SPECIAL_CASE_NONE:
   1650  1.1     skrll       /* Normal insn.  */
   1651  1.1     skrll       output_insn (insn, &the_insn);
   1652  1.1     skrll       break;
   1653  1.1     skrll 
   1654  1.1     skrll     case SPECIAL_CASE_SETSW:
   1655  1.1     skrll       synthetize_setsw (insn);
   1656  1.1     skrll       break;
   1657  1.1     skrll 
   1658  1.1     skrll     case SPECIAL_CASE_SET:
   1659  1.1     skrll       synthetize_setuw (insn);
   1660  1.1     skrll       break;
   1661  1.1     skrll 
   1662  1.1     skrll     case SPECIAL_CASE_SETX:
   1663  1.1     skrll       synthetize_setx (insn);
   1664  1.1     skrll       break;
   1665  1.1     skrll 
   1666  1.2     joerg     case SPECIAL_CASE_FDIV:
   1667  1.1     skrll       {
   1668  1.1     skrll 	int rd = (the_insn.opcode >> 25) & 0x1f;
   1669  1.1     skrll 
   1670  1.1     skrll 	output_insn (insn, &the_insn);
   1671  1.1     skrll 
   1672  1.1     skrll 	/* According to information leaked from Sun, the "fdiv" instructions
   1673  1.1     skrll 	   on early SPARC machines would produce incorrect results sometimes.
   1674  1.1     skrll 	   The workaround is to add an fmovs of the destination register to
   1675  1.1     skrll 	   itself just after the instruction.  This was true on machines
   1676  1.1     skrll 	   with Weitek 1165 float chips, such as the Sun-4/260 and /280.  */
   1677  1.2     joerg 	gas_assert (the_insn.reloc == BFD_RELOC_NONE);
   1678  1.2     joerg 	the_insn.opcode = FMOVS_INSN | rd | RD (rd);
   1679  1.2     joerg 	output_insn (insn, &the_insn);
   1680  1.2     joerg 	return;
   1681  1.2     joerg       }
   1682  1.2     joerg 
   1683  1.2     joerg     default:
   1684  1.2     joerg       as_fatal (_("failed special case insn sanity check"));
   1685  1.2     joerg     }
   1686  1.2     joerg }
   1687  1.2     joerg 
   1688  1.2     joerg static const char *
   1689  1.2     joerg get_hwcap_name (bfd_uint64_t mask)
   1690  1.2     joerg {
   1691  1.2     joerg   if (mask & HWCAP_MUL32)
   1692  1.2     joerg     return "mul32";
   1693  1.2     joerg   if (mask & HWCAP_DIV32)
   1694  1.2     joerg     return "div32";
   1695  1.2     joerg   if (mask & HWCAP_FSMULD)
   1696  1.2     joerg     return "fsmuld";
   1697  1.2     joerg   if (mask & HWCAP_V8PLUS)
   1698  1.2     joerg     return "v8plus";
   1699  1.2     joerg   if (mask & HWCAP_POPC)
   1700  1.2     joerg     return "popc";
   1701  1.2     joerg   if (mask & HWCAP_VIS)
   1702  1.2     joerg     return "vis";
   1703  1.2     joerg   if (mask & HWCAP_VIS2)
   1704  1.2     joerg     return "vis2";
   1705  1.2     joerg   if (mask & HWCAP_ASI_BLK_INIT)
   1706  1.2     joerg     return "ASIBlkInit";
   1707  1.2     joerg   if (mask & HWCAP_FMAF)
   1708  1.2     joerg     return "fmaf";
   1709  1.2     joerg   if (mask & HWCAP_VIS3)
   1710  1.2     joerg     return "vis3";
   1711  1.2     joerg   if (mask & HWCAP_HPC)
   1712  1.2     joerg     return "hpc";
   1713  1.2     joerg   if (mask & HWCAP_RANDOM)
   1714  1.2     joerg     return "random";
   1715  1.2     joerg   if (mask & HWCAP_TRANS)
   1716  1.2     joerg     return "trans";
   1717  1.2     joerg   if (mask & HWCAP_FJFMAU)
   1718  1.2     joerg     return "fjfmau";
   1719  1.2     joerg   if (mask & HWCAP_IMA)
   1720  1.2     joerg     return "ima";
   1721  1.2     joerg   if (mask & HWCAP_ASI_CACHE_SPARING)
   1722  1.2     joerg     return "cspare";
   1723  1.2     joerg   if (mask & HWCAP_AES)
   1724  1.2     joerg     return "aes";
   1725  1.2     joerg   if (mask & HWCAP_DES)
   1726  1.2     joerg     return "des";
   1727  1.2     joerg   if (mask & HWCAP_KASUMI)
   1728  1.2     joerg     return "kasumi";
   1729  1.2     joerg   if (mask & HWCAP_CAMELLIA)
   1730  1.2     joerg     return "camellia";
   1731  1.2     joerg   if (mask & HWCAP_MD5)
   1732  1.2     joerg     return "md5";
   1733  1.2     joerg   if (mask & HWCAP_SHA1)
   1734  1.2     joerg     return "sha1";
   1735  1.2     joerg   if (mask & HWCAP_SHA256)
   1736  1.2     joerg     return "sha256";
   1737  1.2     joerg   if (mask & HWCAP_SHA512)
   1738  1.2     joerg     return "sha512";
   1739  1.2     joerg   if (mask & HWCAP_MPMUL)
   1740  1.2     joerg     return "mpmul";
   1741  1.2     joerg   if (mask & HWCAP_MONT)
   1742  1.2     joerg     return "mont";
   1743  1.2     joerg   if (mask & HWCAP_PAUSE)
   1744  1.2     joerg     return "pause";
   1745  1.2     joerg   if (mask & HWCAP_CBCOND)
   1746  1.2     joerg     return "cbcond";
   1747  1.2     joerg   if (mask & HWCAP_CRC32C)
   1748  1.2     joerg     return "crc32c";
   1749  1.2     joerg 
   1750  1.2     joerg   mask = mask >> 32;
   1751  1.2     joerg   if (mask & HWCAP2_FJATHPLUS)
   1752  1.2     joerg     return "fjathplus";
   1753  1.2     joerg   if (mask & HWCAP2_VIS3B)
   1754  1.2     joerg     return "vis3b";
   1755  1.2     joerg   if (mask & HWCAP2_ADP)
   1756  1.4  christos     return "adp";
   1757  1.4  christos   if (mask & HWCAP2_SPARC5)
   1758  1.4  christos     return "sparc5";
   1759  1.4  christos   if (mask & HWCAP2_MWAIT)
   1760  1.4  christos     return "mwait";
   1761  1.4  christos   if (mask & HWCAP2_XMPMUL)
   1762  1.4  christos     return "xmpmul";
   1763  1.4  christos   if (mask & HWCAP2_XMONT)
   1764  1.4  christos     return "xmont";
   1765  1.4  christos   if (mask & HWCAP2_NSEC)
   1766  1.4  christos     return "nsec";
   1767  1.4  christos   if (mask & HWCAP2_SPARC6)
   1768  1.4  christos     return "sparc6";
   1769  1.4  christos   if (mask & HWCAP2_ONADDSUB)
   1770  1.4  christos     return "onaddsub";
   1771  1.4  christos   if (mask & HWCAP2_ONMUL)
   1772  1.2     joerg     return "onmul";
   1773  1.2     joerg   if (mask & HWCAP2_ONDIV)
   1774  1.2     joerg     return "ondiv";
   1775  1.2     joerg   if (mask & HWCAP2_DICTUNP)
   1776  1.1     skrll     return "dictunp";
   1777  1.1     skrll   if (mask & HWCAP2_FPCMPSHL)
   1778  1.1     skrll     return "fpcmpshl";
   1779  1.1     skrll   if (mask & HWCAP2_RLE)
   1780  1.1     skrll     return "rle";
   1781  1.3  christos   if (mask & HWCAP2_SHA3)
   1782  1.1     skrll     return "sha3";
   1783  1.1     skrll 
   1784  1.1     skrll   return "UNKNOWN";
   1785  1.1     skrll }
   1786  1.1     skrll 
   1787  1.1     skrll /* Subroutine of md_assemble to do the actual parsing.  */
   1788  1.1     skrll 
   1789  1.1     skrll static int
   1790  1.1     skrll sparc_ip (char *str, const struct sparc_opcode **pinsn)
   1791  1.1     skrll {
   1792  1.1     skrll   const char *error_message = "";
   1793  1.4  christos   char *s;
   1794  1.1     skrll   const char *args;
   1795  1.1     skrll   char c;
   1796  1.1     skrll   const struct sparc_opcode *insn;
   1797  1.1     skrll   char *argsStart;
   1798  1.1     skrll   unsigned long opcode;
   1799  1.1     skrll   unsigned int mask = 0;
   1800  1.2     joerg   int match = 0;
   1801  1.1     skrll   int comma = 0;
   1802  1.1     skrll   int v9_arg_p;
   1803  1.1     skrll   int special_case = SPECIAL_CASE_NONE;
   1804  1.1     skrll   const sparc_asi *sasi = NULL;
   1805  1.1     skrll 
   1806  1.1     skrll   s = str;
   1807  1.1     skrll   if (ISLOWER (*s))
   1808  1.1     skrll     {
   1809  1.1     skrll       do
   1810  1.1     skrll 	++s;
   1811  1.1     skrll       while (ISLOWER (*s) || ISDIGIT (*s) || *s == '_');
   1812  1.1     skrll     }
   1813  1.1     skrll 
   1814  1.1     skrll   switch (*s)
   1815  1.1     skrll     {
   1816  1.1     skrll     case '\0':
   1817  1.1     skrll       break;
   1818  1.1     skrll 
   1819  1.1     skrll     case ',':
   1820  1.1     skrll       comma = 1;
   1821  1.1     skrll       /* Fall through.  */
   1822  1.1     skrll 
   1823  1.1     skrll     case ' ':
   1824  1.1     skrll       *s++ = '\0';
   1825  1.1     skrll       break;
   1826  1.1     skrll 
   1827  1.1     skrll     default:
   1828  1.1     skrll       as_bad (_("Unknown opcode: `%s'"), str);
   1829  1.1     skrll       *pinsn = NULL;
   1830  1.1     skrll       return special_case;
   1831  1.1     skrll     }
   1832  1.1     skrll   insn = (struct sparc_opcode *) hash_find (op_hash, str);
   1833  1.1     skrll   *pinsn = insn;
   1834  1.1     skrll   if (insn == NULL)
   1835  1.1     skrll     {
   1836  1.1     skrll       as_bad (_("Unknown opcode: `%s'"), str);
   1837  1.1     skrll       return special_case;
   1838  1.1     skrll     }
   1839  1.1     skrll   if (comma)
   1840  1.1     skrll     {
   1841  1.1     skrll       *--s = ',';
   1842  1.1     skrll     }
   1843  1.1     skrll 
   1844  1.1     skrll   argsStart = s;
   1845  1.1     skrll   for (;;)
   1846  1.1     skrll     {
   1847  1.1     skrll       opcode = insn->match;
   1848  1.1     skrll       memset (&the_insn, '\0', sizeof (the_insn));
   1849  1.1     skrll       the_insn.reloc = BFD_RELOC_NONE;
   1850  1.1     skrll       v9_arg_p = 0;
   1851  1.1     skrll 
   1852  1.1     skrll       /* Build the opcode, checking as we go to make sure that the
   1853  1.1     skrll          operands match.  */
   1854  1.1     skrll       for (args = insn->args;; ++args)
   1855  1.1     skrll 	{
   1856  1.2     joerg 	  switch (*args)
   1857  1.1     skrll 	    {
   1858  1.1     skrll 	    case 'K':
   1859  1.2     joerg 	      {
   1860  1.1     skrll 		int kmask = 0;
   1861  1.1     skrll 
   1862  1.1     skrll 		/* Parse a series of masks.  */
   1863  1.1     skrll 		if (*s == '#')
   1864  1.2     joerg 		  {
   1865  1.1     skrll 		    while (*s == '#')
   1866  1.1     skrll 		      {
   1867  1.1     skrll 			int jmask;
   1868  1.1     skrll 
   1869  1.1     skrll 			if (! parse_keyword_arg (sparc_encode_membar, &s,
   1870  1.1     skrll 						 &jmask))
   1871  1.1     skrll 			  {
   1872  1.1     skrll 			    error_message = _(": invalid membar mask name");
   1873  1.1     skrll 			    goto error;
   1874  1.1     skrll 			  }
   1875  1.1     skrll 			kmask |= jmask;
   1876  1.1     skrll 			while (*s == ' ')
   1877  1.1     skrll 			  ++s;
   1878  1.1     skrll 			if (*s == '|' || *s == '+')
   1879  1.1     skrll 			  ++s;
   1880  1.1     skrll 			while (*s == ' ')
   1881  1.1     skrll 			  ++s;
   1882  1.1     skrll 		      }
   1883  1.1     skrll 		  }
   1884  1.1     skrll 		else
   1885  1.1     skrll 		  {
   1886  1.1     skrll 		    if (! parse_const_expr_arg (&s, &kmask))
   1887  1.1     skrll 		      {
   1888  1.1     skrll 			error_message = _(": invalid membar mask expression");
   1889  1.1     skrll 			goto error;
   1890  1.1     skrll 		      }
   1891  1.1     skrll 		    if (kmask < 0 || kmask > 127)
   1892  1.1     skrll 		      {
   1893  1.1     skrll 			error_message = _(": invalid membar mask number");
   1894  1.1     skrll 			goto error;
   1895  1.1     skrll 		      }
   1896  1.1     skrll 		  }
   1897  1.1     skrll 
   1898  1.1     skrll 		opcode |= MEMBAR (kmask);
   1899  1.1     skrll 		continue;
   1900  1.1     skrll 	      }
   1901  1.1     skrll 
   1902  1.1     skrll 	    case '3':
   1903  1.1     skrll 	      {
   1904  1.1     skrll 		int smask = 0;
   1905  1.1     skrll 
   1906  1.1     skrll 		if (! parse_const_expr_arg (&s, &smask))
   1907  1.1     skrll 		  {
   1908  1.1     skrll 		    error_message = _(": invalid siam mode expression");
   1909  1.1     skrll 		    goto error;
   1910  1.1     skrll 		  }
   1911  1.1     skrll 		if (smask < 0 || smask > 7)
   1912  1.1     skrll 		  {
   1913  1.1     skrll 		    error_message = _(": invalid siam mode number");
   1914  1.1     skrll 		    goto error;
   1915  1.1     skrll 		  }
   1916  1.1     skrll 		opcode |= smask;
   1917  1.1     skrll 		continue;
   1918  1.1     skrll 	      }
   1919  1.1     skrll 
   1920  1.1     skrll 	    case '*':
   1921  1.1     skrll 	      {
   1922  1.1     skrll 		int fcn = 0;
   1923  1.1     skrll 
   1924  1.1     skrll 		/* Parse a prefetch function.  */
   1925  1.1     skrll 		if (*s == '#')
   1926  1.1     skrll 		  {
   1927  1.1     skrll 		    if (! parse_keyword_arg (sparc_encode_prefetch, &s, &fcn))
   1928  1.1     skrll 		      {
   1929  1.1     skrll 			error_message = _(": invalid prefetch function name");
   1930  1.1     skrll 			goto error;
   1931  1.1     skrll 		      }
   1932  1.1     skrll 		  }
   1933  1.1     skrll 		else
   1934  1.1     skrll 		  {
   1935  1.1     skrll 		    if (! parse_const_expr_arg (&s, &fcn))
   1936  1.1     skrll 		      {
   1937  1.1     skrll 			error_message = _(": invalid prefetch function expression");
   1938  1.1     skrll 			goto error;
   1939  1.1     skrll 		      }
   1940  1.1     skrll 		    if (fcn < 0 || fcn > 31)
   1941  1.1     skrll 		      {
   1942  1.1     skrll 			error_message = _(": invalid prefetch function number");
   1943  1.1     skrll 			goto error;
   1944  1.3  christos 		      }
   1945  1.1     skrll 		  }
   1946  1.1     skrll 		opcode |= RD (fcn);
   1947  1.1     skrll 		continue;
   1948  1.3  christos 	      }
   1949  1.3  christos 
   1950  1.3  christos 	    case '!':
   1951  1.3  christos 	    case '?':
   1952  1.3  christos 	      /* Parse a sparc64 privileged register.  */
   1953  1.3  christos 	      if (*s == '%')
   1954  1.3  christos 		{
   1955  1.3  christos 		  struct priv_reg_entry *p;
   1956  1.3  christos 		  unsigned int len = 9999999; /* Init to make gcc happy.  */
   1957  1.1     skrll 
   1958  1.1     skrll 		  s += 1;
   1959  1.1     skrll                   for (p = priv_reg_table; p->name; p++)
   1960  1.1     skrll                     if (p->name[0] == s[0])
   1961  1.3  christos                       {
   1962  1.3  christos                         len = strlen (p->name);
   1963  1.3  christos                         if (strncmp (p->name, s, len) == 0)
   1964  1.3  christos                           break;
   1965  1.3  christos                       }
   1966  1.3  christos 
   1967  1.3  christos 		  if (!p->name)
   1968  1.1     skrll 		    {
   1969  1.1     skrll 		      error_message = _(": unrecognizable privileged register");
   1970  1.1     skrll 		      goto error;
   1971  1.1     skrll 		    }
   1972  1.1     skrll 
   1973  1.1     skrll                   if (((opcode >> (*args == '?' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum)
   1974  1.1     skrll                     {
   1975  1.1     skrll                       error_message = _(": unrecognizable privileged register");
   1976  1.1     skrll                       goto error;
   1977  1.1     skrll                     }
   1978  1.1     skrll 
   1979  1.1     skrll 		  s += len;
   1980  1.1     skrll 		  continue;
   1981  1.1     skrll 		}
   1982  1.3  christos 	      else
   1983  1.1     skrll 		{
   1984  1.1     skrll 		  error_message = _(": unrecognizable privileged register");
   1985  1.1     skrll 		  goto error;
   1986  1.3  christos 		}
   1987  1.3  christos 
   1988  1.3  christos 	    case '$':
   1989  1.3  christos 	    case '%':
   1990  1.3  christos 	      /* Parse a sparc64 hyperprivileged register.  */
   1991  1.3  christos 	      if (*s == '%')
   1992  1.3  christos 		{
   1993  1.3  christos 		  struct priv_reg_entry *p;
   1994  1.3  christos 		  unsigned int len = 9999999; /* Init to make gcc happy.  */
   1995  1.1     skrll 
   1996  1.1     skrll 		  s += 1;
   1997  1.1     skrll                   for (p = hpriv_reg_table; p->name; p++)
   1998  1.1     skrll                     if (p->name[0] == s[0])
   1999  1.3  christos                       {
   2000  1.3  christos                         len = strlen (p->name);
   2001  1.3  christos                         if (strncmp (p->name, s, len) == 0)
   2002  1.3  christos                           break;
   2003  1.3  christos                       }
   2004  1.3  christos 
   2005  1.3  christos 		  if (!p->name)
   2006  1.3  christos 		    {
   2007  1.1     skrll 		      error_message = _(": unrecognizable hyperprivileged register");
   2008  1.1     skrll 		      goto error;
   2009  1.1     skrll 		    }
   2010  1.1     skrll 
   2011  1.1     skrll                   if (((opcode >> (*args == '$' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum)
   2012  1.1     skrll                     {
   2013  1.1     skrll                       error_message = _(": unrecognizable hyperprivileged register");
   2014  1.1     skrll                       goto error;
   2015  1.1     skrll                     }
   2016  1.1     skrll 
   2017  1.3  christos                   s += len;
   2018  1.1     skrll 		  continue;
   2019  1.1     skrll 		}
   2020  1.3  christos 	      else
   2021  1.1     skrll 		{
   2022  1.1     skrll 		  error_message = _(": unrecognizable hyperprivileged register");
   2023  1.1     skrll 		  goto error;
   2024  1.3  christos 		}
   2025  1.3  christos 
   2026  1.3  christos 	    case '_':
   2027  1.3  christos 	    case '/':
   2028  1.3  christos 	      /* Parse a v9a or later ancillary state register.  */
   2029  1.3  christos 	      if (*s == '%')
   2030  1.3  christos 		{
   2031  1.3  christos 		  struct priv_reg_entry *p;
   2032  1.3  christos 		  unsigned int len = 9999999; /* Init to make gcc happy.  */
   2033  1.1     skrll 
   2034  1.3  christos 		  s += 1;
   2035  1.1     skrll                   for (p = v9a_asr_table; p->name; p++)
   2036  1.1     skrll                     if (p->name[0] == s[0])
   2037  1.3  christos                       {
   2038  1.3  christos                         len = strlen (p->name);
   2039  1.3  christos                         if (strncmp (p->name, s, len) == 0)
   2040  1.3  christos                           break;
   2041  1.3  christos                       }
   2042  1.3  christos 
   2043  1.3  christos 		  if (!p->name)
   2044  1.1     skrll 		    {
   2045  1.1     skrll 		      error_message = _(": unrecognizable ancillary state register");
   2046  1.1     skrll 		      goto error;
   2047  1.1     skrll 		    }
   2048  1.1     skrll 
   2049  1.3  christos                   if (((opcode >> (*args == '/' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum)
   2050  1.1     skrll                      {
   2051  1.1     skrll                        error_message = _(": unrecognizable ancillary state register");
   2052  1.1     skrll                        goto error;
   2053  1.1     skrll                      }
   2054  1.1     skrll 
   2055  1.1     skrll 		  s += len;
   2056  1.1     skrll 		  continue;
   2057  1.1     skrll 		}
   2058  1.1     skrll 	      else
   2059  1.1     skrll 		{
   2060  1.1     skrll 		  error_message = _(": unrecognizable ancillary state register");
   2061  1.1     skrll 		  goto error;
   2062  1.1     skrll 		}
   2063  1.1     skrll 
   2064  1.1     skrll 	    case 'M':
   2065  1.1     skrll 	    case 'm':
   2066  1.1     skrll 	      if (strncmp (s, "%asr", 4) == 0)
   2067  1.1     skrll 		{
   2068  1.1     skrll 		  s += 4;
   2069  1.3  christos 
   2070  1.3  christos 		  if (ISDIGIT (*s))
   2071  1.3  christos 		    {
   2072  1.3  christos 		      long num = 0;
   2073  1.3  christos 
   2074  1.3  christos 		      while (ISDIGIT (*s))
   2075  1.3  christos 			{
   2076  1.3  christos 			  num = num * 10 + *s - '0';
   2077  1.3  christos 			  ++s;
   2078  1.3  christos 			}
   2079  1.3  christos 
   2080  1.3  christos                       /* We used to check here for the asr number to
   2081  1.3  christos                          be between 16 and 31 in V9 and later, as
   2082  1.3  christos                          mandated by the section C.1.1 "Register
   2083  1.3  christos                          Names" in the SPARC spec.  However, we
   2084  1.3  christos                          decided to remove this restriction as a) it
   2085  1.1     skrll                          introduces problems when new V9 asr registers
   2086  1.1     skrll                          are introduced, b) the Solaris assembler
   2087  1.1     skrll                          doesn't implement this restriction and c) the
   2088  1.1     skrll                          restriction will go away in future revisions
   2089  1.1     skrll                          of the Oracle SPARC Architecture.  */
   2090  1.1     skrll 
   2091  1.1     skrll                       if (num < 0 || 31 < num)
   2092  1.1     skrll                         {
   2093  1.1     skrll                           error_message = _(": asr number must be between 0 and 31");
   2094  1.1     skrll                           goto error;
   2095  1.1     skrll                         }
   2096  1.1     skrll 
   2097  1.1     skrll 		      opcode |= (*args == 'M' ? RS1 (num) : RD (num));
   2098  1.1     skrll 		      continue;
   2099  1.1     skrll 		    }
   2100  1.1     skrll 		  else
   2101  1.1     skrll 		    {
   2102  1.1     skrll 		      error_message = _(": expecting %asrN");
   2103  1.1     skrll 		      goto error;
   2104  1.1     skrll 		    }
   2105  1.2     joerg 		} /* if %asr  */
   2106  1.2     joerg 	      break;
   2107  1.2     joerg 
   2108  1.2     joerg 	    case 'I':
   2109  1.2     joerg 	      the_insn.reloc = BFD_RELOC_SPARC_11;
   2110  1.2     joerg 	      goto immediate;
   2111  1.2     joerg 
   2112  1.2     joerg 	    case 'j':
   2113  1.2     joerg 	      the_insn.reloc = BFD_RELOC_SPARC_10;
   2114  1.2     joerg 	      goto immediate;
   2115  1.2     joerg 
   2116  1.2     joerg 	    case ')':
   2117  1.2     joerg 	      if (*s == ' ')
   2118  1.2     joerg 		s++;
   2119  1.2     joerg 	      if ((s[0] == '0' && s[1] == 'x' && ISXDIGIT (s[2]))
   2120  1.2     joerg 		  || ISDIGIT (*s))
   2121  1.2     joerg 		{
   2122  1.2     joerg 		  long num = 0;
   2123  1.2     joerg 
   2124  1.2     joerg 		  if (s[0] == '0' && s[1] == 'x')
   2125  1.2     joerg 		    {
   2126  1.2     joerg 		      s += 2;
   2127  1.2     joerg 		      while (ISXDIGIT (*s))
   2128  1.2     joerg 			{
   2129  1.2     joerg 			  num <<= 4;
   2130  1.2     joerg 			  num |= hex_value (*s);
   2131  1.2     joerg 			  ++s;
   2132  1.2     joerg 			}
   2133  1.2     joerg 		    }
   2134  1.2     joerg 		  else
   2135  1.2     joerg 		    {
   2136  1.2     joerg 		      while (ISDIGIT (*s))
   2137  1.2     joerg 			{
   2138  1.2     joerg 			  num = num * 10 + *s - '0';
   2139  1.2     joerg 			  ++s;
   2140  1.2     joerg 			}
   2141  1.2     joerg 		    }
   2142  1.2     joerg 		  if (num < 0 || num > 31)
   2143  1.2     joerg 		    {
   2144  1.2     joerg 		      error_message = _(": crypto immediate must be between 0 and 31");
   2145  1.2     joerg 		      goto error;
   2146  1.1     skrll 		    }
   2147  1.1     skrll 
   2148  1.1     skrll 		  opcode |= RS3 (num);
   2149  1.1     skrll 		  continue;
   2150  1.1     skrll 		}
   2151  1.1     skrll 	      else
   2152  1.1     skrll 		{
   2153  1.1     skrll 		  error_message = _(": expecting crypto immediate");
   2154  1.1     skrll 		  goto error;
   2155  1.1     skrll 		}
   2156  1.1     skrll 
   2157  1.1     skrll 	    case 'X':
   2158  1.1     skrll 	      /* V8 systems don't understand BFD_RELOC_SPARC_5.  */
   2159  1.1     skrll 	      if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
   2160  1.1     skrll 		the_insn.reloc = BFD_RELOC_SPARC_5;
   2161  1.1     skrll 	      else
   2162  1.1     skrll 		the_insn.reloc = BFD_RELOC_SPARC13;
   2163  1.1     skrll 	      /* These fields are unsigned, but for upward compatibility,
   2164  1.1     skrll 		 allow negative values as well.  */
   2165  1.1     skrll 	      goto immediate;
   2166  1.1     skrll 
   2167  1.1     skrll 	    case 'Y':
   2168  1.1     skrll 	      /* V8 systems don't understand BFD_RELOC_SPARC_6.  */
   2169  1.1     skrll 	      if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
   2170  1.1     skrll 		the_insn.reloc = BFD_RELOC_SPARC_6;
   2171  1.2     joerg 	      else
   2172  1.2     joerg 		the_insn.reloc = BFD_RELOC_SPARC13;
   2173  1.2     joerg 	      /* These fields are unsigned, but for upward compatibility,
   2174  1.2     joerg 		 allow negative values as well.  */
   2175  1.2     joerg 	      goto immediate;
   2176  1.1     skrll 
   2177  1.1     skrll 	    case 'k':
   2178  1.1     skrll 	      the_insn.reloc = /* RELOC_WDISP2_14 */ BFD_RELOC_SPARC_WDISP16;
   2179  1.1     skrll 	      the_insn.pcrel = 1;
   2180  1.1     skrll 	      goto immediate;
   2181  1.1     skrll 
   2182  1.1     skrll 	    case '=':
   2183  1.1     skrll 	      the_insn.reloc = /* RELOC_WDISP2_8 */ BFD_RELOC_SPARC_WDISP10;
   2184  1.1     skrll 	      the_insn.pcrel = 1;
   2185  1.1     skrll 	      goto immediate;
   2186  1.1     skrll 
   2187  1.1     skrll 	    case 'G':
   2188  1.1     skrll 	      the_insn.reloc = BFD_RELOC_SPARC_WDISP19;
   2189  1.1     skrll 	      the_insn.pcrel = 1;
   2190  1.1     skrll 	      goto immediate;
   2191  1.1     skrll 
   2192  1.1     skrll 	    case 'N':
   2193  1.1     skrll 	      if (*s == 'p' && s[1] == 'n')
   2194  1.1     skrll 		{
   2195  1.1     skrll 		  s += 2;
   2196  1.1     skrll 		  continue;
   2197  1.1     skrll 		}
   2198  1.1     skrll 	      break;
   2199  1.1     skrll 
   2200  1.1     skrll 	    case 'T':
   2201  1.1     skrll 	      if (*s == 'p' && s[1] == 't')
   2202  1.2     joerg 		{
   2203  1.2     joerg 		  s += 2;
   2204  1.1     skrll 		  continue;
   2205  1.1     skrll 		}
   2206  1.1     skrll 	      break;
   2207  1.1     skrll 
   2208  1.1     skrll 	    case 'z':
   2209  1.1     skrll 	      if (*s == ' ')
   2210  1.1     skrll 		{
   2211  1.1     skrll 		  ++s;
   2212  1.1     skrll 		}
   2213  1.1     skrll 	      if ((strncmp (s, "%icc", 4) == 0)
   2214  1.1     skrll                   || (sparc_arch_size == 32 && strncmp (s, "%ncc", 4) == 0))
   2215  1.2     joerg 		{
   2216  1.2     joerg 		  s += 4;
   2217  1.1     skrll 		  continue;
   2218  1.1     skrll 		}
   2219  1.1     skrll 	      break;
   2220  1.1     skrll 
   2221  1.1     skrll 	    case 'Z':
   2222  1.1     skrll 	      if (*s == ' ')
   2223  1.1     skrll 		{
   2224  1.1     skrll 		  ++s;
   2225  1.1     skrll 		}
   2226  1.1     skrll               if ((strncmp (s, "%xcc", 4) == 0)
   2227  1.1     skrll                   || (sparc_arch_size == 64 && strncmp (s, "%ncc", 4) == 0))
   2228  1.1     skrll 		{
   2229  1.1     skrll 		  s += 4;
   2230  1.1     skrll 		  continue;
   2231  1.1     skrll 		}
   2232  1.1     skrll 	      break;
   2233  1.1     skrll 
   2234  1.1     skrll 	    case '6':
   2235  1.1     skrll 	      if (*s == ' ')
   2236  1.1     skrll 		{
   2237  1.1     skrll 		  ++s;
   2238  1.1     skrll 		}
   2239  1.1     skrll 	      if (strncmp (s, "%fcc0", 5) == 0)
   2240  1.1     skrll 		{
   2241  1.1     skrll 		  s += 5;
   2242  1.1     skrll 		  continue;
   2243  1.1     skrll 		}
   2244  1.1     skrll 	      break;
   2245  1.1     skrll 
   2246  1.1     skrll 	    case '7':
   2247  1.1     skrll 	      if (*s == ' ')
   2248  1.1     skrll 		{
   2249  1.1     skrll 		  ++s;
   2250  1.1     skrll 		}
   2251  1.1     skrll 	      if (strncmp (s, "%fcc1", 5) == 0)
   2252  1.1     skrll 		{
   2253  1.1     skrll 		  s += 5;
   2254  1.1     skrll 		  continue;
   2255  1.1     skrll 		}
   2256  1.1     skrll 	      break;
   2257  1.1     skrll 
   2258  1.1     skrll 	    case '8':
   2259  1.1     skrll 	      if (*s == ' ')
   2260  1.1     skrll 		{
   2261  1.1     skrll 		  ++s;
   2262  1.1     skrll 		}
   2263  1.1     skrll 	      if (strncmp (s, "%fcc2", 5) == 0)
   2264  1.1     skrll 		{
   2265  1.1     skrll 		  s += 5;
   2266  1.1     skrll 		  continue;
   2267  1.1     skrll 		}
   2268  1.1     skrll 	      break;
   2269  1.1     skrll 
   2270  1.1     skrll 	    case '9':
   2271  1.1     skrll 	      if (*s == ' ')
   2272  1.1     skrll 		{
   2273  1.1     skrll 		  ++s;
   2274  1.1     skrll 		}
   2275  1.1     skrll 	      if (strncmp (s, "%fcc3", 5) == 0)
   2276  1.1     skrll 		{
   2277  1.1     skrll 		  s += 5;
   2278  1.1     skrll 		  continue;
   2279  1.1     skrll 		}
   2280  1.1     skrll 	      break;
   2281  1.1     skrll 
   2282  1.1     skrll 	    case 'P':
   2283  1.1     skrll 	      if (strncmp (s, "%pc", 3) == 0)
   2284  1.1     skrll 		{
   2285  1.1     skrll 		  s += 3;
   2286  1.1     skrll 		  continue;
   2287  1.1     skrll 		}
   2288  1.1     skrll 	      break;
   2289  1.1     skrll 
   2290  1.1     skrll 	    case 'W':
   2291  1.1     skrll 	      if (strncmp (s, "%tick", 5) == 0)
   2292  1.3  christos 		{
   2293  1.1     skrll 		  s += 5;
   2294  1.3  christos 		  continue;
   2295  1.3  christos 		}
   2296  1.3  christos 	      break;
   2297  1.3  christos 
   2298  1.3  christos 	    case '\0':		/* End of args.  */
   2299  1.3  christos 	      if (s[0] == ',' && s[1] == '%')
   2300  1.1     skrll 		{
   2301  1.3  christos 		  char *s1;
   2302  1.1     skrll 		  int npar = 0;
   2303  1.3  christos                   const struct perc_entry *p;
   2304  1.1     skrll 
   2305  1.1     skrll                   for (p = perc_table; p->type != perc_entry_none; p++)
   2306  1.1     skrll                     if ((p->type == perc_entry_post_pop || p->type == perc_entry_reg)
   2307  1.3  christos                         && strncmp (s + 2, p->name, p->len) == 0)
   2308  1.3  christos                       break;
   2309  1.1     skrll                   if (p->type == perc_entry_none || p->type == perc_entry_reg)
   2310  1.1     skrll                     break;
   2311  1.3  christos 
   2312  1.1     skrll 		  if (s[p->len + 2] != '(')
   2313  1.1     skrll 		    {
   2314  1.1     skrll 		      as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name);
   2315  1.3  christos 		      return special_case;
   2316  1.1     skrll 		    }
   2317  1.1     skrll 
   2318  1.1     skrll 		  if (! (p->pop->flags & F_POP_TLS_CALL)
   2319  1.1     skrll                       && the_insn.reloc != BFD_RELOC_NONE)
   2320  1.1     skrll 		    {
   2321  1.1     skrll 		      as_bad (_("Illegal operands: %%%s cannot be used together with other relocs in the insn ()"),
   2322  1.3  christos 			      p->name);
   2323  1.1     skrll 		      return special_case;
   2324  1.1     skrll 		    }
   2325  1.1     skrll 
   2326  1.3  christos 		  if ((p->pop->flags & F_POP_TLS_CALL)
   2327  1.1     skrll 		      && (the_insn.reloc != BFD_RELOC_32_PCREL_S2
   2328  1.3  christos 			  || the_insn.exp.X_add_number != 0
   2329  1.1     skrll 			  || the_insn.exp.X_add_symbol
   2330  1.1     skrll 			     != symbol_find_or_make ("__tls_get_addr")))
   2331  1.1     skrll 		    {
   2332  1.1     skrll 		      as_bad (_("Illegal operands: %%%s can be only used with call __tls_get_addr"),
   2333  1.1     skrll 			      p->name);
   2334  1.1     skrll 		      return special_case;
   2335  1.1     skrll 		    }
   2336  1.1     skrll 
   2337  1.1     skrll 		  the_insn.reloc = p->pop->reloc;
   2338  1.1     skrll 		  memset (&the_insn.exp, 0, sizeof (the_insn.exp));
   2339  1.1     skrll 		  s += p->len + 3;
   2340  1.1     skrll 
   2341  1.1     skrll 		  for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
   2342  1.3  christos 		    if (*s1 == '(')
   2343  1.1     skrll 		      npar++;
   2344  1.1     skrll 		    else if (*s1 == ')')
   2345  1.1     skrll 		      {
   2346  1.1     skrll 			if (!npar)
   2347  1.1     skrll 			  break;
   2348  1.1     skrll 			npar--;
   2349  1.1     skrll 		      }
   2350  1.1     skrll 
   2351  1.1     skrll 		  if (*s1 != ')')
   2352  1.1     skrll 		    {
   2353  1.1     skrll 		      as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name);
   2354  1.1     skrll 		      return special_case;
   2355  1.1     skrll 		    }
   2356  1.1     skrll 
   2357  1.1     skrll 		  *s1 = '\0';
   2358  1.1     skrll 		  (void) get_expression (s);
   2359  1.1     skrll 		  *s1 = ')';
   2360  1.1     skrll 		  s = s1 + 1;
   2361  1.1     skrll 		}
   2362  1.1     skrll 	      if (*s == '\0')
   2363  1.1     skrll 		match = 1;
   2364  1.1     skrll 	      break;
   2365  1.1     skrll 
   2366  1.1     skrll 	    case '+':
   2367  1.1     skrll 	      if (*s == '+')
   2368  1.1     skrll 		{
   2369  1.1     skrll 		  ++s;
   2370  1.1     skrll 		  continue;
   2371  1.1     skrll 		}
   2372  1.1     skrll 	      if (*s == '-')
   2373  1.1     skrll 		{
   2374  1.1     skrll 		  continue;
   2375  1.1     skrll 		}
   2376  1.1     skrll 	      break;
   2377  1.1     skrll 
   2378  1.1     skrll 	    case '[':		/* These must match exactly.  */
   2379  1.1     skrll 	    case ']':
   2380  1.1     skrll 	    case ',':
   2381  1.1     skrll 	    case ' ':
   2382  1.1     skrll 	      if (*s++ == *args)
   2383  1.1     skrll 		continue;
   2384  1.1     skrll 	      break;
   2385  1.1     skrll 
   2386  1.1     skrll 	    case '#':		/* Must be at least one digit.  */
   2387  1.1     skrll 	      if (ISDIGIT (*s++))
   2388  1.1     skrll 		{
   2389  1.1     skrll 		  while (ISDIGIT (*s))
   2390  1.1     skrll 		    {
   2391  1.1     skrll 		      ++s;
   2392  1.1     skrll 		    }
   2393  1.1     skrll 		  continue;
   2394  1.1     skrll 		}
   2395  1.1     skrll 	      break;
   2396  1.1     skrll 
   2397  1.1     skrll 	    case 'C':		/* Coprocessor state register.  */
   2398  1.1     skrll 	      if (strncmp (s, "%csr", 4) == 0)
   2399  1.1     skrll 		{
   2400  1.1     skrll 		  s += 4;
   2401  1.1     skrll 		  continue;
   2402  1.1     skrll 		}
   2403  1.1     skrll 	      break;
   2404  1.1     skrll 
   2405  1.1     skrll 	    case 'b':		/* Next operand is a coprocessor register.  */
   2406  1.1     skrll 	    case 'c':
   2407  1.1     skrll 	    case 'D':
   2408  1.1     skrll 	      if (*s++ == '%' && *s++ == 'c' && ISDIGIT (*s))
   2409  1.1     skrll 		{
   2410  1.1     skrll 		  mask = *s++;
   2411  1.1     skrll 		  if (ISDIGIT (*s))
   2412  1.1     skrll 		    {
   2413  1.1     skrll 		      mask = 10 * (mask - '0') + (*s++ - '0');
   2414  1.1     skrll 		      if (mask >= 32)
   2415  1.1     skrll 			{
   2416  1.1     skrll 			  break;
   2417  1.1     skrll 			}
   2418  1.1     skrll 		    }
   2419  1.1     skrll 		  else
   2420  1.1     skrll 		    {
   2421  1.1     skrll 		      mask -= '0';
   2422  1.1     skrll 		    }
   2423  1.1     skrll 		  switch (*args)
   2424  1.1     skrll 		    {
   2425  1.1     skrll 
   2426  1.1     skrll 		    case 'b':
   2427  1.1     skrll 		      opcode |= mask << 14;
   2428  1.1     skrll 		      continue;
   2429  1.1     skrll 
   2430  1.1     skrll 		    case 'c':
   2431  1.1     skrll 		      opcode |= mask;
   2432  1.1     skrll 		      continue;
   2433  1.1     skrll 
   2434  1.1     skrll 		    case 'D':
   2435  1.1     skrll 		      opcode |= mask << 25;
   2436  1.1     skrll 		      continue;
   2437  1.1     skrll 		    }
   2438  1.1     skrll 		}
   2439  1.1     skrll 	      break;
   2440  1.1     skrll 
   2441  1.1     skrll 	    case 'r':		/* next operand must be a register */
   2442  1.1     skrll 	    case 'O':
   2443  1.1     skrll 	    case '1':
   2444  1.1     skrll 	    case '2':
   2445  1.1     skrll 	    case 'd':
   2446  1.1     skrll 	      if (*s++ == '%')
   2447  1.1     skrll 		{
   2448  1.1     skrll 		  switch (c = *s++)
   2449  1.1     skrll 		    {
   2450  1.1     skrll 
   2451  1.1     skrll 		    case 'f':	/* frame pointer */
   2452  1.1     skrll 		      if (*s++ == 'p')
   2453  1.1     skrll 			{
   2454  1.1     skrll 			  mask = 0x1e;
   2455  1.1     skrll 			  break;
   2456  1.1     skrll 			}
   2457  1.1     skrll 		      goto error;
   2458  1.1     skrll 
   2459  1.1     skrll 		    case 'g':	/* global register */
   2460  1.1     skrll 		      c = *s++;
   2461  1.1     skrll 		      if (isoctal (c))
   2462  1.1     skrll 			{
   2463  1.1     skrll 			  mask = c - '0';
   2464  1.1     skrll 			  break;
   2465  1.1     skrll 			}
   2466  1.1     skrll 		      goto error;
   2467  1.1     skrll 
   2468  1.1     skrll 		    case 'i':	/* in register */
   2469  1.1     skrll 		      c = *s++;
   2470  1.1     skrll 		      if (isoctal (c))
   2471  1.1     skrll 			{
   2472  1.1     skrll 			  mask = c - '0' + 24;
   2473  1.1     skrll 			  break;
   2474  1.1     skrll 			}
   2475  1.1     skrll 		      goto error;
   2476  1.1     skrll 
   2477  1.1     skrll 		    case 'l':	/* local register */
   2478  1.1     skrll 		      c = *s++;
   2479  1.1     skrll 		      if (isoctal (c))
   2480  1.1     skrll 			{
   2481  1.1     skrll 			  mask = (c - '0' + 16);
   2482  1.1     skrll 			  break;
   2483  1.1     skrll 			}
   2484  1.1     skrll 		      goto error;
   2485  1.1     skrll 
   2486  1.1     skrll 		    case 'o':	/* out register */
   2487  1.1     skrll 		      c = *s++;
   2488  1.1     skrll 		      if (isoctal (c))
   2489  1.1     skrll 			{
   2490  1.1     skrll 			  mask = (c - '0' + 8);
   2491  1.1     skrll 			  break;
   2492  1.1     skrll 			}
   2493  1.1     skrll 		      goto error;
   2494  1.1     skrll 
   2495  1.1     skrll 		    case 's':	/* stack pointer */
   2496  1.1     skrll 		      if (*s++ == 'p')
   2497  1.1     skrll 			{
   2498  1.1     skrll 			  mask = 0xe;
   2499  1.1     skrll 			  break;
   2500  1.1     skrll 			}
   2501  1.1     skrll 		      goto error;
   2502  1.1     skrll 
   2503  1.1     skrll 		    case 'r':	/* any register */
   2504  1.1     skrll 		      if (!ISDIGIT ((c = *s++)))
   2505  1.1     skrll 			{
   2506  1.1     skrll 			  goto error;
   2507  1.1     skrll 			}
   2508  1.1     skrll 		      /* FALLTHROUGH */
   2509  1.1     skrll 		    case '0':
   2510  1.1     skrll 		    case '1':
   2511  1.1     skrll 		    case '2':
   2512  1.1     skrll 		    case '3':
   2513  1.1     skrll 		    case '4':
   2514  1.1     skrll 		    case '5':
   2515  1.1     skrll 		    case '6':
   2516  1.1     skrll 		    case '7':
   2517  1.1     skrll 		    case '8':
   2518  1.1     skrll 		    case '9':
   2519  1.1     skrll 		      if (ISDIGIT (*s))
   2520  1.1     skrll 			{
   2521  1.1     skrll 			  if ((c = 10 * (c - '0') + (*s++ - '0')) >= 32)
   2522  1.1     skrll 			    {
   2523  1.1     skrll 			      goto error;
   2524  1.1     skrll 			    }
   2525  1.1     skrll 			}
   2526  1.1     skrll 		      else
   2527  1.1     skrll 			{
   2528  1.1     skrll 			  c -= '0';
   2529  1.1     skrll 			}
   2530  1.1     skrll 		      mask = c;
   2531  1.1     skrll 		      break;
   2532  1.1     skrll 
   2533  1.1     skrll 		    default:
   2534  1.1     skrll 		      goto error;
   2535  1.1     skrll 		    }
   2536  1.1     skrll 
   2537  1.1     skrll 		  if ((mask & ~1) == 2 && sparc_arch_size == 64
   2538  1.1     skrll 		      && no_undeclared_regs && ! globals[mask])
   2539  1.1     skrll 		    as_bad (_("detected global register use not covered by .register pseudo-op"));
   2540  1.1     skrll 
   2541  1.1     skrll 		  /* Got the register, now figure out where
   2542  1.1     skrll 		     it goes in the opcode.  */
   2543  1.1     skrll 		  switch (*args)
   2544  1.1     skrll 		    {
   2545  1.1     skrll 		    case '1':
   2546  1.1     skrll 		      opcode |= mask << 14;
   2547  1.1     skrll 		      continue;
   2548  1.1     skrll 
   2549  1.1     skrll 		    case '2':
   2550  1.1     skrll 		      opcode |= mask;
   2551  1.1     skrll 		      continue;
   2552  1.1     skrll 
   2553  1.1     skrll 		    case 'd':
   2554  1.1     skrll 		      opcode |= mask << 25;
   2555  1.1     skrll 		      continue;
   2556  1.1     skrll 
   2557  1.1     skrll 		    case 'r':
   2558  1.1     skrll 		      opcode |= (mask << 25) | (mask << 14);
   2559  1.1     skrll 		      continue;
   2560  1.4  christos 
   2561  1.1     skrll 		    case 'O':
   2562  1.1     skrll 		      opcode |= (mask << 25) | (mask << 0);
   2563  1.1     skrll 		      continue;
   2564  1.1     skrll 		    }
   2565  1.4  christos 		}
   2566  1.4  christos 	      break;
   2567  1.1     skrll 
   2568  1.2     joerg 	    case 'e':		/* next operand is a floating point register */
   2569  1.2     joerg 	    case 'v':
   2570  1.2     joerg 	    case 'V':
   2571  1.1     skrll             case ';':
   2572  1.1     skrll 
   2573  1.1     skrll 	    case 'f':
   2574  1.2     joerg 	    case 'B':
   2575  1.4  christos 	    case 'R':
   2576  1.1     skrll             case ':':
   2577  1.1     skrll             case '\'':
   2578  1.1     skrll 
   2579  1.1     skrll 	    case '4':
   2580  1.3  christos 	    case '5':
   2581  1.3  christos 
   2582  1.3  christos 	    case 'g':
   2583  1.1     skrll 	    case 'H':
   2584  1.1     skrll 	    case 'J':
   2585  1.1     skrll 	    case '}':
   2586  1.1     skrll             case '^':
   2587  1.1     skrll 	      {
   2588  1.1     skrll 		char format;
   2589  1.1     skrll 
   2590  1.1     skrll 		if (*s++ == '%'
   2591  1.1     skrll 		    && ((format = *s) == 'f'
   2592  1.2     joerg                         || format == 'd'
   2593  1.3  christos                         || format == 'q')
   2594  1.4  christos 		    && ISDIGIT (*++s))
   2595  1.3  christos 		  {
   2596  1.1     skrll 		    for (mask = 0; ISDIGIT (*s); ++s)
   2597  1.1     skrll 		      {
   2598  1.3  christos 			mask = 10 * mask + (*s - '0');
   2599  1.1     skrll 		      }		/* read the number */
   2600  1.3  christos 
   2601  1.1     skrll 		    if ((*args == 'v'
   2602  1.1     skrll 			 || *args == 'B'
   2603  1.1     skrll 			 || *args == '5'
   2604  1.3  christos 			 || *args == 'H'
   2605  1.3  christos                          || *args == '\''
   2606  1.1     skrll 			 || format == 'd')
   2607  1.1     skrll 			&& (mask & 1))
   2608  1.3  christos 		      {
   2609  1.1     skrll                         /* register must be even numbered */
   2610  1.3  christos 			break;
   2611  1.1     skrll 		      }
   2612  1.4  christos 
   2613  1.4  christos 		    if ((*args == 'V'
   2614  1.4  christos 			 || *args == 'R'
   2615  1.4  christos 			 || *args == 'J'
   2616  1.4  christos 			 || format == 'q')
   2617  1.4  christos 			&& (mask & 3))
   2618  1.4  christos 		      {
   2619  1.4  christos                         /* register must be multiple of 4 */
   2620  1.4  christos 			break;
   2621  1.4  christos 		      }
   2622  1.4  christos 
   2623  1.4  christos                     if ((*args == ':'
   2624  1.4  christos                          || *args == ';'
   2625  1.4  christos                          || *args == '^')
   2626  1.4  christos                         && (mask & 7))
   2627  1.1     skrll                       {
   2628  1.1     skrll                         /* register must be multiple of 8 */
   2629  1.1     skrll                         break;
   2630  1.1     skrll                       }
   2631  1.1     skrll 
   2632  1.1     skrll                     if (*args == '\'' && mask < 48)
   2633  1.1     skrll                       {
   2634  1.1     skrll                         /* register must be higher or equal than %f48 */
   2635  1.1     skrll                         break;
   2636  1.1     skrll                       }
   2637  1.1     skrll 
   2638  1.1     skrll 		    if (mask >= 64)
   2639  1.1     skrll 		      {
   2640  1.1     skrll 			if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
   2641  1.1     skrll 			  error_message = _(": There are only 64 f registers; [0-63]");
   2642  1.1     skrll 			else
   2643  1.1     skrll 			  error_message = _(": There are only 32 f registers; [0-31]");
   2644  1.1     skrll 			goto error;
   2645  1.1     skrll 		      }	/* on error */
   2646  1.1     skrll 		    else if (mask >= 32)
   2647  1.1     skrll 		      {
   2648  1.1     skrll 			if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
   2649  1.1     skrll 			  {
   2650  1.1     skrll 			    if (*args == 'e' || *args == 'f' || *args == 'g')
   2651  1.1     skrll 			      {
   2652  1.1     skrll 				error_message
   2653  1.1     skrll 				  = _(": There are only 32 single precision f registers; [0-31]");
   2654  1.1     skrll 				goto error;
   2655  1.1     skrll 			      }
   2656  1.1     skrll 			    v9_arg_p = 1;
   2657  1.1     skrll 			    mask -= 31;	/* wrap high bit */
   2658  1.1     skrll 			  }
   2659  1.1     skrll 			else
   2660  1.2     joerg 			  {
   2661  1.2     joerg 			    error_message = _(": There are only 32 f registers; [0-31]");
   2662  1.2     joerg 			    goto error;
   2663  1.2     joerg 			  }
   2664  1.2     joerg 		      }
   2665  1.2     joerg 		  }
   2666  1.2     joerg 		else
   2667  1.1     skrll 		  {
   2668  1.1     skrll 		    break;
   2669  1.1     skrll 		  }	/* if not an 'f' register.  */
   2670  1.1     skrll 
   2671  1.1     skrll 		if (*args == '}' && mask != RS2 (opcode))
   2672  1.4  christos 		  {
   2673  1.1     skrll 		    error_message
   2674  1.1     skrll 		      = _(": Instruction requires frs2 and frsd must be the same register");
   2675  1.1     skrll 		    goto error;
   2676  1.1     skrll 		  }
   2677  1.1     skrll 
   2678  1.1     skrll 		switch (*args)
   2679  1.4  christos 		  {
   2680  1.1     skrll 		  case 'v':
   2681  1.1     skrll 		  case 'V':
   2682  1.1     skrll 		  case 'e':
   2683  1.4  christos                   case ';':
   2684  1.4  christos 		    opcode |= RS1 (mask);
   2685  1.4  christos 		    continue;
   2686  1.4  christos 
   2687  1.2     joerg 		  case 'f':
   2688  1.2     joerg 		  case 'B':
   2689  1.2     joerg 		  case 'R':
   2690  1.2     joerg                   case ':':
   2691  1.2     joerg 		    opcode |= RS2 (mask);
   2692  1.1     skrll 		    continue;
   2693  1.1     skrll 
   2694  1.1     skrll                   case '\'':
   2695  1.2     joerg                     opcode |= RS2 (mask & 0xe);
   2696  1.4  christos                     continue;
   2697  1.1     skrll 
   2698  1.1     skrll 		  case '4':
   2699  1.1     skrll 		  case '5':
   2700  1.1     skrll 		    opcode |= RS3 (mask);
   2701  1.1     skrll 		    continue;
   2702  1.1     skrll 
   2703  1.1     skrll 		  case 'g':
   2704  1.1     skrll 		  case 'H':
   2705  1.1     skrll 		  case 'J':
   2706  1.1     skrll 		  case '}':
   2707  1.1     skrll                   case '^':
   2708  1.1     skrll 		    opcode |= RD (mask);
   2709  1.1     skrll 		    continue;
   2710  1.1     skrll 		  }		/* Pack it in.  */
   2711  1.1     skrll 
   2712  1.1     skrll 		know (0);
   2713  1.2     joerg 		break;
   2714  1.2     joerg 	      }			/* float arg  */
   2715  1.2     joerg 
   2716  1.2     joerg 	    case 'F':
   2717  1.2     joerg 	      if (strncmp (s, "%fsr", 4) == 0)
   2718  1.2     joerg 		{
   2719  1.2     joerg 		  s += 4;
   2720  1.2     joerg 		  continue;
   2721  1.1     skrll 		}
   2722  1.1     skrll 	      break;
   2723  1.1     skrll 
   2724  1.1     skrll 	    case '(':
   2725  1.1     skrll 	      if (strncmp (s, "%efsr", 5) == 0)
   2726  1.1     skrll 		{
   2727  1.1     skrll 		  s += 5;
   2728  1.1     skrll 		  continue;
   2729  1.1     skrll 		}
   2730  1.1     skrll 	      break;
   2731  1.1     skrll 
   2732  1.1     skrll 	    case '0':		/* 64 bit immediate (set, setsw, setx insn)  */
   2733  1.1     skrll 	      the_insn.reloc = BFD_RELOC_NONE; /* reloc handled elsewhere  */
   2734  1.1     skrll 	      goto immediate;
   2735  1.1     skrll 
   2736  1.1     skrll 	    case 'l':		/* 22 bit PC relative immediate  */
   2737  1.1     skrll 	      the_insn.reloc = BFD_RELOC_SPARC_WDISP22;
   2738  1.1     skrll 	      the_insn.pcrel = 1;
   2739  1.1     skrll 	      goto immediate;
   2740  1.1     skrll 
   2741  1.1     skrll 	    case 'L':		/* 30 bit immediate  */
   2742  1.1     skrll 	      the_insn.reloc = BFD_RELOC_32_PCREL_S2;
   2743  1.1     skrll 	      the_insn.pcrel = 1;
   2744  1.1     skrll 	      goto immediate;
   2745  1.1     skrll 
   2746  1.1     skrll 	    case 'h':
   2747  1.1     skrll 	    case 'n':		/* 22 bit immediate  */
   2748  1.1     skrll 	      the_insn.reloc = BFD_RELOC_SPARC22;
   2749  1.1     skrll 	      goto immediate;
   2750  1.1     skrll 
   2751  1.3  christos 	    case 'i':		/* 13 bit immediate  */
   2752  1.1     skrll 	      the_insn.reloc = BFD_RELOC_SPARC13;
   2753  1.1     skrll 
   2754  1.1     skrll 	      /* fallthrough */
   2755  1.1     skrll 
   2756  1.1     skrll 	    immediate:
   2757  1.1     skrll 	      if (*s == ' ')
   2758  1.3  christos 		s++;
   2759  1.3  christos 
   2760  1.3  christos 	      {
   2761  1.3  christos 		char *s1;
   2762  1.3  christos 		const char *op_arg = NULL;
   2763  1.3  christos 		static expressionS op_exp;
   2764  1.3  christos 		bfd_reloc_code_real_type old_reloc = the_insn.reloc;
   2765  1.3  christos 
   2766  1.1     skrll 		/* Check for %hi, etc.  */
   2767  1.3  christos 		if (*s == '%')
   2768  1.1     skrll 		  {
   2769  1.3  christos                     const struct perc_entry *p;
   2770  1.1     skrll 
   2771  1.1     skrll                     for (p = perc_table; p->type != perc_entry_none; p++)
   2772  1.1     skrll                       if ((p->type == perc_entry_imm_pop || p->type == perc_entry_reg)
   2773  1.3  christos                           && strncmp (s + 1, p->name, p->len) == 0)
   2774  1.3  christos                         break;
   2775  1.3  christos                     if (p->type == perc_entry_none || p->type == perc_entry_reg)
   2776  1.3  christos                       break;
   2777  1.1     skrll 
   2778  1.1     skrll 		    if (s[p->len + 1] != '(')
   2779  1.1     skrll 		      {
   2780  1.1     skrll 			as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name);
   2781  1.1     skrll 			return special_case;
   2782  1.1     skrll 		      }
   2783  1.1     skrll 
   2784  1.1     skrll 		    op_arg = p->name;
   2785  1.1     skrll 		    the_insn.reloc = p->pop->reloc;
   2786  1.1     skrll 		    s += p->len + 2;
   2787  1.1     skrll 		    v9_arg_p = p->pop->flags & F_POP_V9;
   2788  1.1     skrll 		  }
   2789  1.1     skrll 
   2790  1.1     skrll 		/* Note that if the get_expression() fails, we will still
   2791  1.1     skrll 		   have created U entries in the symbol table for the
   2792  1.1     skrll 		   'symbols' in the input string.  Try not to create U
   2793  1.1     skrll 		   symbols for registers, etc.  */
   2794  1.1     skrll 
   2795  1.1     skrll 		/* This stuff checks to see if the expression ends in
   2796  1.1     skrll 		   +%reg.  If it does, it removes the register from
   2797  1.1     skrll 		   the expression, and re-sets 's' to point to the
   2798  1.1     skrll 		   right place.  */
   2799  1.1     skrll 
   2800  1.1     skrll 		if (op_arg)
   2801  1.1     skrll 		  {
   2802  1.1     skrll 		    int npar = 0;
   2803  1.1     skrll 
   2804  1.1     skrll 		    for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
   2805  1.1     skrll 		      if (*s1 == '(')
   2806  1.1     skrll 			npar++;
   2807  1.1     skrll 		      else if (*s1 == ')')
   2808  1.1     skrll 			{
   2809  1.1     skrll 			  if (!npar)
   2810  1.1     skrll 			    break;
   2811  1.1     skrll 			  npar--;
   2812  1.3  christos 			}
   2813  1.3  christos 
   2814  1.3  christos 		    if (*s1 != ')')
   2815  1.3  christos 		      {
   2816  1.3  christos 			as_bad (_("Illegal operands: %%%s requires arguments in ()"), op_arg);
   2817  1.1     skrll 			return special_case;
   2818  1.1     skrll 		      }
   2819  1.1     skrll 
   2820  1.1     skrll 		    *s1 = '\0';
   2821  1.1     skrll 		    (void) get_expression (s);
   2822  1.1     skrll 		    *s1 = ')';
   2823  1.1     skrll 		    if (expr_end != s1)
   2824  1.1     skrll 		      {
   2825  1.1     skrll 			as_bad (_("Expression inside %%%s could not be parsed"), op_arg);
   2826  1.1     skrll 			return special_case;
   2827  1.1     skrll 		      }
   2828  1.1     skrll 		    s = s1 + 1;
   2829  1.1     skrll 		    if (*s == ',' || *s == ']' || !*s)
   2830  1.1     skrll 		      continue;
   2831  1.1     skrll 		    if (*s != '+' && *s != '-')
   2832  1.1     skrll 		      {
   2833  1.1     skrll 			as_bad (_("Illegal operands: Can't do arithmetics other than + and - involving %%%s()"), op_arg);
   2834  1.1     skrll 			return special_case;
   2835  1.1     skrll 		      }
   2836  1.1     skrll 		    *s1 = '0';
   2837  1.1     skrll 		    s = s1;
   2838  1.2     joerg 		    op_exp = the_insn.exp;
   2839  1.1     skrll 		    memset (&the_insn.exp, 0, sizeof (the_insn.exp));
   2840  1.2     joerg 		  }
   2841  1.2     joerg 
   2842  1.1     skrll 		for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
   2843  1.1     skrll 		  ;
   2844  1.1     skrll 
   2845  1.1     skrll 		if (s1 != s && ISDIGIT (s1[-1]))
   2846  1.1     skrll 		  {
   2847  1.1     skrll 		    if (s1[-2] == '%' && s1[-3] == '+')
   2848  1.1     skrll 		      s1 -= 3;
   2849  1.1     skrll 		    else if (strchr ("golir0123456789", s1[-2]) && s1[-3] == '%' && s1[-4] == '+')
   2850  1.1     skrll 		      s1 -= 4;
   2851  1.1     skrll 		    else if (s1[-3] == 'r' && s1[-4] == '%' && s1[-5] == '+')
   2852  1.1     skrll 		      s1 -= 5;
   2853  1.1     skrll 		    else
   2854  1.1     skrll 		      s1 = NULL;
   2855  1.1     skrll 		    if (s1)
   2856  1.1     skrll 		      {
   2857  1.1     skrll 			*s1 = '\0';
   2858  1.1     skrll 			if (op_arg && s1 == s + 1)
   2859  1.1     skrll 			  the_insn.exp.X_op = O_absent;
   2860  1.1     skrll 			else
   2861  1.1     skrll 			  (void) get_expression (s);
   2862  1.1     skrll 			*s1 = '+';
   2863  1.1     skrll 			if (op_arg)
   2864  1.1     skrll 			  *s = ')';
   2865  1.1     skrll 			s = s1;
   2866  1.1     skrll 		      }
   2867  1.1     skrll 		  }
   2868  1.1     skrll 		else
   2869  1.1     skrll 		  s1 = NULL;
   2870  1.1     skrll 
   2871  1.1     skrll 		if (!s1)
   2872  1.1     skrll 		  {
   2873  1.1     skrll 		    (void) get_expression (s);
   2874  1.1     skrll 		    if (op_arg)
   2875  1.1     skrll 		      *s = ')';
   2876  1.1     skrll 		    s = expr_end;
   2877  1.1     skrll 		  }
   2878  1.1     skrll 
   2879  1.1     skrll 		if (op_arg)
   2880  1.1     skrll 		  {
   2881  1.1     skrll 		    the_insn.exp2 = the_insn.exp;
   2882  1.1     skrll 		    the_insn.exp = op_exp;
   2883  1.1     skrll 		    if (the_insn.exp2.X_op == O_absent)
   2884  1.1     skrll 		      the_insn.exp2.X_op = O_illegal;
   2885  1.1     skrll 		    else if (the_insn.exp.X_op == O_absent)
   2886  1.1     skrll 		      {
   2887  1.1     skrll 			the_insn.exp = the_insn.exp2;
   2888  1.1     skrll 			the_insn.exp2.X_op = O_illegal;
   2889  1.1     skrll 		      }
   2890  1.1     skrll 		    else if (the_insn.exp.X_op == O_constant)
   2891  1.1     skrll 		      {
   2892  1.1     skrll 			valueT val = the_insn.exp.X_add_number;
   2893  1.1     skrll 			switch (the_insn.reloc)
   2894  1.1     skrll 			  {
   2895  1.1     skrll 			  default:
   2896  1.1     skrll 			    break;
   2897  1.1     skrll 
   2898  1.1     skrll 			  case BFD_RELOC_SPARC_HH22:
   2899  1.1     skrll 			    val = BSR (val, 32);
   2900  1.1     skrll 			    /* Fall through.  */
   2901  1.1     skrll 
   2902  1.1     skrll 			  case BFD_RELOC_SPARC_LM22:
   2903  1.1     skrll 			  case BFD_RELOC_HI22:
   2904  1.2     joerg 			    val = (val >> 10) & 0x3fffff;
   2905  1.2     joerg 			    break;
   2906  1.2     joerg 
   2907  1.2     joerg 			  case BFD_RELOC_SPARC_HM10:
   2908  1.2     joerg 			    val = BSR (val, 32);
   2909  1.1     skrll 			    /* Fall through.  */
   2910  1.1     skrll 
   2911  1.1     skrll 			  case BFD_RELOC_LO10:
   2912  1.1     skrll 			    val &= 0x3ff;
   2913  1.1     skrll 			    break;
   2914  1.1     skrll 
   2915  1.1     skrll 			  case BFD_RELOC_SPARC_H34:
   2916  1.1     skrll 			    val >>= 12;
   2917  1.1     skrll 			    val &= 0x3fffff;
   2918  1.1     skrll 			    break;
   2919  1.1     skrll 
   2920  1.1     skrll 			  case BFD_RELOC_SPARC_H44:
   2921  1.1     skrll 			    val >>= 22;
   2922  1.1     skrll 			    val &= 0x3fffff;
   2923  1.1     skrll 			    break;
   2924  1.1     skrll 
   2925  1.1     skrll 			  case BFD_RELOC_SPARC_M44:
   2926  1.1     skrll 			    val >>= 12;
   2927  1.1     skrll 			    val &= 0x3ff;
   2928  1.1     skrll 			    break;
   2929  1.1     skrll 
   2930  1.1     skrll 			  case BFD_RELOC_SPARC_L44:
   2931  1.1     skrll 			    val &= 0xfff;
   2932  1.1     skrll 			    break;
   2933  1.1     skrll 
   2934  1.1     skrll 			  case BFD_RELOC_SPARC_HIX22:
   2935  1.1     skrll 			    val = ~val;
   2936  1.1     skrll 			    val = (val >> 10) & 0x3fffff;
   2937  1.1     skrll 			    break;
   2938  1.1     skrll 
   2939  1.1     skrll 			  case BFD_RELOC_SPARC_LOX10:
   2940  1.1     skrll 			    val = (val & 0x3ff) | 0x1c00;
   2941  1.1     skrll 			    break;
   2942  1.1     skrll 			  }
   2943  1.1     skrll 			the_insn.exp = the_insn.exp2;
   2944  1.1     skrll 			the_insn.exp.X_add_number += val;
   2945  1.1     skrll 			the_insn.exp2.X_op = O_illegal;
   2946  1.1     skrll 			the_insn.reloc = old_reloc;
   2947  1.1     skrll 		      }
   2948  1.1     skrll 		    else if (the_insn.exp2.X_op != O_constant)
   2949  1.1     skrll 		      {
   2950  1.1     skrll 			as_bad (_("Illegal operands: Can't add non-constant expression to %%%s()"), op_arg);
   2951  1.1     skrll 			return special_case;
   2952  1.1     skrll 		      }
   2953  1.1     skrll 		    else
   2954  1.1     skrll 		      {
   2955  1.1     skrll 			if (old_reloc != BFD_RELOC_SPARC13
   2956  1.1     skrll 			    || the_insn.reloc != BFD_RELOC_LO10
   2957  1.1     skrll 			    || sparc_arch_size != 64
   2958  1.1     skrll 			    || sparc_pic_code)
   2959  1.1     skrll 			  {
   2960  1.1     skrll 			    as_bad (_("Illegal operands: Can't do arithmetics involving %%%s() of a relocatable symbol"), op_arg);
   2961  1.1     skrll 			    return special_case;
   2962  1.1     skrll 			  }
   2963  1.1     skrll 			the_insn.reloc = BFD_RELOC_SPARC_OLO10;
   2964  1.1     skrll 		      }
   2965  1.1     skrll 		  }
   2966  1.1     skrll 	      }
   2967  1.1     skrll 	      /* Check for constants that don't require emitting a reloc.  */
   2968  1.1     skrll 	      if (the_insn.exp.X_op == O_constant
   2969  1.1     skrll 		  && the_insn.exp.X_add_symbol == 0
   2970  1.1     skrll 		  && the_insn.exp.X_op_symbol == 0)
   2971  1.1     skrll 		{
   2972  1.1     skrll 		  /* For pc-relative call instructions, we reject
   2973  1.1     skrll 		     constants to get better code.  */
   2974  1.1     skrll 		  if (the_insn.pcrel
   2975  1.1     skrll 		      && the_insn.reloc == BFD_RELOC_32_PCREL_S2
   2976  1.1     skrll 		      && in_signed_range (the_insn.exp.X_add_number, 0x3fff))
   2977  1.1     skrll 		    {
   2978  1.1     skrll 		      error_message = _(": PC-relative operand can't be a constant");
   2979  1.1     skrll 		      goto error;
   2980  1.1     skrll 		    }
   2981  1.1     skrll 
   2982  1.1     skrll 		  if (the_insn.reloc >= BFD_RELOC_SPARC_TLS_GD_HI22
   2983  1.1     skrll 		      && the_insn.reloc <= BFD_RELOC_SPARC_TLS_TPOFF64)
   2984  1.1     skrll 		    {
   2985  1.1     skrll 		      error_message = _(": TLS operand can't be a constant");
   2986  1.2     joerg 		      goto error;
   2987  1.2     joerg 		    }
   2988  1.2     joerg 
   2989  1.2     joerg 		  /* Constants that won't fit are checked in md_apply_fix
   2990  1.2     joerg 		     and bfd_install_relocation.
   2991  1.2     joerg 		     ??? It would be preferable to install the constants
   2992  1.2     joerg 		     into the insn here and save having to create a fixS
   2993  1.2     joerg 		     for each one.  There already exists code to handle
   2994  1.4  christos 		     all the various cases (e.g. in md_apply_fix and
   2995  1.4  christos 		     bfd_install_relocation) so duplicating all that code
   2996  1.2     joerg 		     here isn't right.  */
   2997  1.2     joerg 
   2998  1.2     joerg 		  /* This is a special case to handle cbcond instructions
   2999  1.4  christos 		     properly, which can need two relocations.  The first
   3000  1.2     joerg 		     one is for the 5-bit immediate field and the latter
   3001  1.2     joerg 		     is going to be for the WDISP10 branch part.  We
   3002  1.2     joerg 		     handle the R_SPARC_5 immediate directly here so that
   3003  1.2     joerg 		     we don't need to add support for multiple relocations
   3004  1.2     joerg 		     in one instruction just yet.  */
   3005  1.2     joerg 		  if (the_insn.reloc == BFD_RELOC_SPARC_5
   3006  1.2     joerg                       && ((insn->match & OP(0x3)) == 0))
   3007  1.1     skrll 		    {
   3008  1.1     skrll 		      valueT val = the_insn.exp.X_add_number;
   3009  1.1     skrll 
   3010  1.1     skrll 		      the_insn.reloc = BFD_RELOC_NONE;
   3011  1.1     skrll 		      if (! in_bitfield_range (val, 0x1f))
   3012  1.1     skrll 			{
   3013  1.1     skrll 			  error_message = _(": Immediate value in cbcond is out of range.");
   3014  1.1     skrll 			  goto error;
   3015  1.1     skrll 			}
   3016  1.1     skrll 		      opcode |= val & 0x1f;
   3017  1.1     skrll 		    }
   3018  1.1     skrll 		}
   3019  1.1     skrll 
   3020  1.1     skrll 	      continue;
   3021  1.1     skrll 
   3022  1.1     skrll 	    case 'a':
   3023  1.1     skrll 	      if (*s++ == 'a')
   3024  1.1     skrll 		{
   3025  1.1     skrll 		  opcode |= ANNUL;
   3026  1.4  christos 		  continue;
   3027  1.1     skrll 		}
   3028  1.1     skrll 	      break;
   3029  1.1     skrll 
   3030  1.1     skrll 	    case 'A':
   3031  1.4  christos 	      {
   3032  1.1     skrll 		int asi = 0;
   3033  1.1     skrll 
   3034  1.1     skrll 		/* Parse an asi.  */
   3035  1.1     skrll 		if (*s == '#')
   3036  1.1     skrll 		  {
   3037  1.1     skrll 		    if (! parse_sparc_asi (&s, &sasi))
   3038  1.1     skrll 		      {
   3039  1.1     skrll 			error_message = _(": invalid ASI name");
   3040  1.1     skrll 			goto error;
   3041  1.1     skrll 		      }
   3042  1.1     skrll 		    asi = sasi->value;
   3043  1.1     skrll 		  }
   3044  1.1     skrll 		else
   3045  1.1     skrll 		  {
   3046  1.1     skrll 		    if (! parse_const_expr_arg (&s, &asi))
   3047  1.1     skrll 		      {
   3048  1.1     skrll 			error_message = _(": invalid ASI expression");
   3049  1.1     skrll 			goto error;
   3050  1.1     skrll 		      }
   3051  1.1     skrll 		    if (asi < 0 || asi > 255)
   3052  1.1     skrll 		      {
   3053  1.1     skrll 			error_message = _(": invalid ASI number");
   3054  1.1     skrll 			goto error;
   3055  1.1     skrll 		      }
   3056  1.1     skrll 		  }
   3057  1.1     skrll 		opcode |= ASI (asi);
   3058  1.1     skrll 		continue;
   3059  1.1     skrll 	      }			/* Alternate space.  */
   3060  1.1     skrll 
   3061  1.1     skrll 	    case 'p':
   3062  1.1     skrll 	      if (strncmp (s, "%psr", 4) == 0)
   3063  1.1     skrll 		{
   3064  1.1     skrll 		  s += 4;
   3065  1.1     skrll 		  continue;
   3066  1.1     skrll 		}
   3067  1.1     skrll 	      break;
   3068  1.1     skrll 
   3069  1.1     skrll 	    case 'q':		/* Floating point queue.  */
   3070  1.1     skrll 	      if (strncmp (s, "%fq", 3) == 0)
   3071  1.1     skrll 		{
   3072  1.1     skrll 		  s += 3;
   3073  1.1     skrll 		  continue;
   3074  1.1     skrll 		}
   3075  1.1     skrll 	      break;
   3076  1.1     skrll 
   3077  1.1     skrll 	    case 'Q':		/* Coprocessor queue.  */
   3078  1.1     skrll 	      if (strncmp (s, "%cq", 3) == 0)
   3079  1.1     skrll 		{
   3080  1.1     skrll 		  s += 3;
   3081  1.1     skrll 		  continue;
   3082  1.1     skrll 		}
   3083  1.1     skrll 	      break;
   3084  1.1     skrll 
   3085  1.1     skrll 	    case 'S':
   3086  1.1     skrll 	      if (strcmp (str, "set") == 0
   3087  1.1     skrll 		  || strcmp (str, "setuw") == 0)
   3088  1.1     skrll 		{
   3089  1.1     skrll 		  special_case = SPECIAL_CASE_SET;
   3090  1.1     skrll 		  continue;
   3091  1.1     skrll 		}
   3092  1.1     skrll 	      else if (strcmp (str, "setsw") == 0)
   3093  1.1     skrll 		{
   3094  1.1     skrll 		  special_case = SPECIAL_CASE_SETSW;
   3095  1.1     skrll 		  continue;
   3096  1.1     skrll 		}
   3097  1.1     skrll 	      else if (strcmp (str, "setx") == 0)
   3098  1.1     skrll 		{
   3099  1.1     skrll 		  special_case = SPECIAL_CASE_SETX;
   3100  1.1     skrll 		  continue;
   3101  1.1     skrll 		}
   3102  1.1     skrll 	      else if (strncmp (str, "fdiv", 4) == 0)
   3103  1.1     skrll 		{
   3104  1.1     skrll 		  special_case = SPECIAL_CASE_FDIV;
   3105  1.1     skrll 		  continue;
   3106  1.1     skrll 		}
   3107  1.1     skrll 	      break;
   3108  1.1     skrll 
   3109  1.1     skrll 	    case 'o':
   3110  1.2     joerg 	      if (strncmp (s, "%asi", 4) != 0)
   3111  1.2     joerg 		break;
   3112  1.2     joerg 	      s += 4;
   3113  1.2     joerg 	      continue;
   3114  1.2     joerg 
   3115  1.2     joerg 	    case 's':
   3116  1.4  christos 	      if (strncmp (s, "%fprs", 5) != 0)
   3117  1.4  christos 		break;
   3118  1.4  christos 	      s += 5;
   3119  1.4  christos 	      continue;
   3120  1.4  christos 
   3121  1.4  christos 	    case '{':
   3122  1.1     skrll 	      if (strncmp (s, "%mcdper",7) != 0)
   3123  1.1     skrll 		break;
   3124  1.1     skrll 	      s += 7;
   3125  1.1     skrll 	      continue;
   3126  1.1     skrll 
   3127  1.1     skrll             case '&':
   3128  1.1     skrll               if (strncmp (s, "%entropy", 8) != 0)
   3129  1.1     skrll                 break;
   3130  1.1     skrll               s += 8;
   3131  1.1     skrll               continue;
   3132  1.1     skrll 
   3133  1.1     skrll 	    case 'E':
   3134  1.1     skrll 	      if (strncmp (s, "%ccr", 4) != 0)
   3135  1.1     skrll 		break;
   3136  1.1     skrll 	      s += 4;
   3137  1.1     skrll 	      continue;
   3138  1.1     skrll 
   3139  1.1     skrll 	    case 't':
   3140  1.4  christos 	      if (strncmp (s, "%tbr", 4) != 0)
   3141  1.4  christos 		break;
   3142  1.4  christos 	      s += 4;
   3143  1.4  christos 	      continue;
   3144  1.4  christos 
   3145  1.4  christos 	    case 'w':
   3146  1.4  christos 	      if (strncmp (s, "%wim", 4) != 0)
   3147  1.4  christos 		break;
   3148  1.4  christos 	      s += 4;
   3149  1.4  christos 	      continue;
   3150  1.4  christos 
   3151  1.4  christos             case '|':
   3152  1.4  christos               {
   3153  1.4  christos                 int imm2 = 0;
   3154  1.4  christos 
   3155  1.4  christos                 /* Parse a 2-bit immediate.  */
   3156  1.4  christos                 if (! parse_const_expr_arg (&s, &imm2))
   3157  1.4  christos                   {
   3158  1.4  christos                     error_message = _(": non-immdiate imm2 operand");
   3159  1.4  christos                     goto error;
   3160  1.1     skrll                   }
   3161  1.1     skrll                 if ((imm2 & ~0x3) != 0)
   3162  1.1     skrll                   {
   3163  1.1     skrll                     error_message = _(": imm2 immediate operand out of range (0-3)");
   3164  1.1     skrll                     goto error;
   3165  1.1     skrll                   }
   3166  1.1     skrll 
   3167  1.1     skrll                 opcode |= ((imm2 & 0x2) << 3) | (imm2 & 0x1);
   3168  1.1     skrll                 continue;
   3169  1.1     skrll               }
   3170  1.1     skrll 
   3171  1.1     skrll 	    case 'x':
   3172  1.1     skrll 	      {
   3173  1.1     skrll 		char *push = input_line_pointer;
   3174  1.1     skrll 		expressionS e;
   3175  1.1     skrll 
   3176  1.1     skrll 		input_line_pointer = s;
   3177  1.1     skrll 		expression (&e);
   3178  1.1     skrll 		if (e.X_op == O_constant)
   3179  1.1     skrll 		  {
   3180  1.1     skrll 		    int n = e.X_add_number;
   3181  1.1     skrll 		    if (n != e.X_add_number || (n & ~0x1ff) != 0)
   3182  1.1     skrll 		      as_bad (_("OPF immediate operand out of range (0-0x1ff)"));
   3183  1.1     skrll 		    else
   3184  1.1     skrll 		      opcode |= e.X_add_number << 5;
   3185  1.1     skrll 		  }
   3186  1.1     skrll 		else
   3187  1.1     skrll 		  as_bad (_("non-immediate OPF operand, ignored"));
   3188  1.1     skrll 		s = input_line_pointer;
   3189  1.1     skrll 		input_line_pointer = push;
   3190  1.1     skrll 		continue;
   3191  1.1     skrll 	      }
   3192  1.1     skrll 
   3193  1.1     skrll 	    case 'y':
   3194  1.1     skrll 	      if (strncmp (s, "%y", 2) != 0)
   3195  1.1     skrll 		break;
   3196  1.1     skrll 	      s += 2;
   3197  1.1     skrll 	      continue;
   3198  1.1     skrll 
   3199  1.1     skrll 	    case 'u':
   3200  1.1     skrll 	    case 'U':
   3201  1.1     skrll 	      {
   3202  1.1     skrll 		/* Parse a sparclet cpreg.  */
   3203  1.1     skrll 		int cpreg;
   3204  1.1     skrll 		if (! parse_keyword_arg (sparc_encode_sparclet_cpreg, &s, &cpreg))
   3205  1.1     skrll 		  {
   3206  1.1     skrll 		    error_message = _(": invalid cpreg name");
   3207  1.1     skrll 		    goto error;
   3208  1.1     skrll 		  }
   3209  1.1     skrll 		opcode |= (*args == 'U' ? RS1 (cpreg) : RD (cpreg));
   3210  1.1     skrll 		continue;
   3211  1.1     skrll 	      }
   3212  1.1     skrll 
   3213  1.1     skrll 	    default:
   3214  1.1     skrll 	      as_fatal (_("failed sanity check."));
   3215  1.1     skrll 	    }			/* switch on arg code.  */
   3216  1.1     skrll 
   3217  1.1     skrll 	  /* Break out of for() loop.  */
   3218  1.1     skrll 	  break;
   3219  1.1     skrll 	}			/* For each arg that we expect.  */
   3220  1.1     skrll 
   3221  1.1     skrll     error:
   3222  1.1     skrll       if (match == 0)
   3223  1.1     skrll 	{
   3224  1.1     skrll 	  /* Args don't match.  */
   3225  1.1     skrll 	  if (&insn[1] - sparc_opcodes < sparc_num_opcodes
   3226  1.1     skrll 	      && (insn->name == insn[1].name
   3227  1.1     skrll 		  || !strcmp (insn->name, insn[1].name)))
   3228  1.1     skrll 	    {
   3229  1.1     skrll 	      ++insn;
   3230  1.1     skrll 	      s = argsStart;
   3231  1.4  christos 	      continue;
   3232  1.4  christos 	    }
   3233  1.1     skrll 	  else
   3234  1.4  christos 	    {
   3235  1.4  christos 	      as_bad (_("Illegal operands%s"), error_message);
   3236  1.4  christos 	      return special_case;
   3237  1.4  christos 	    }
   3238  1.4  christos 	}
   3239  1.4  christos       else
   3240  1.4  christos 	{
   3241  1.4  christos 	  /* We have a match.  Now see if the architecture is OK.  */
   3242  1.4  christos 	  /* String to use in case of architecture warning.  */
   3243  1.2     joerg 	  const char *msg_str = str;
   3244  1.1     skrll 	  int needed_arch_mask = insn->architecture;
   3245  1.2     joerg 
   3246  1.2     joerg           /* Include the ASI architecture needed as well */
   3247  1.2     joerg           if (sasi && needed_arch_mask > sasi->architecture)
   3248  1.2     joerg             {
   3249  1.1     skrll               needed_arch_mask = sasi->architecture;
   3250  1.1     skrll               msg_str = sasi->name;
   3251  1.1     skrll             }
   3252  1.1     skrll 
   3253  1.1     skrll           bfd_uint64_t hwcaps
   3254  1.1     skrll 	    = (((bfd_uint64_t) insn->hwcaps2) << 32) | insn->hwcaps;
   3255  1.1     skrll 
   3256  1.1     skrll #if defined(OBJ_ELF) && !defined(TE_SOLARIS)
   3257  1.1     skrll 	  if (hwcaps)
   3258  1.1     skrll 		  hwcap_seen |= hwcaps;
   3259  1.1     skrll #endif
   3260  1.1     skrll 	  if (v9_arg_p)
   3261  1.1     skrll 	    {
   3262  1.1     skrll 	      needed_arch_mask &=
   3263  1.1     skrll 		~(SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9) - 1);
   3264  1.1     skrll 	      if (! needed_arch_mask)
   3265  1.1     skrll 		needed_arch_mask =
   3266  1.1     skrll 		  SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
   3267  1.1     skrll 	    }
   3268  1.1     skrll 
   3269  1.1     skrll 	  if (needed_arch_mask
   3270  1.2     joerg 	      & SPARC_OPCODE_SUPPORTED (current_architecture))
   3271  1.1     skrll 	    /* OK.  */
   3272  1.1     skrll 	    ;
   3273  1.1     skrll 	  /* Can we bump up the architecture?  */
   3274  1.1     skrll 	  else if (needed_arch_mask
   3275  1.1     skrll 		   & SPARC_OPCODE_SUPPORTED (max_architecture))
   3276  1.1     skrll 	    {
   3277  1.4  christos 	      enum sparc_opcode_arch_val needed_architecture =
   3278  1.1     skrll 		sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
   3279  1.1     skrll 			   & needed_arch_mask);
   3280  1.1     skrll 
   3281  1.4  christos 	      gas_assert (needed_architecture <= SPARC_OPCODE_ARCH_MAX);
   3282  1.4  christos 	      if (warn_on_bump
   3283  1.4  christos 		  && needed_architecture > warn_after_architecture)
   3284  1.4  christos 		{
   3285  1.4  christos 		  as_warn (_("architecture bumped from \"%s\" to \"%s\" on \"%s\""),
   3286  1.1     skrll 			   sparc_opcode_archs[current_architecture].name,
   3287  1.1     skrll 			   sparc_opcode_archs[needed_architecture].name,
   3288  1.1     skrll 			   msg_str);
   3289  1.1     skrll 		  warn_after_architecture = needed_architecture;
   3290  1.1     skrll 		}
   3291  1.1     skrll 	      current_architecture = needed_architecture;
   3292  1.1     skrll 	      hwcap_allowed
   3293  1.1     skrll                 = (hwcap_allowed
   3294  1.1     skrll                    | hwcaps
   3295  1.1     skrll                    | (((bfd_uint64_t) sparc_opcode_archs[current_architecture].hwcaps2) << 32)
   3296  1.1     skrll                    | sparc_opcode_archs[current_architecture].hwcaps);
   3297  1.1     skrll 	    }
   3298  1.1     skrll 	  /* Conflict.  */
   3299  1.1     skrll 	  /* ??? This seems to be a bit fragile.  What if the next entry in
   3300  1.1     skrll 	     the opcode table is the one we want and it is supported?
   3301  1.1     skrll 	     It is possible to arrange the table today so that this can't
   3302  1.1     skrll 	     happen but what about tomorrow?  */
   3303  1.1     skrll 	  else
   3304  1.1     skrll 	    {
   3305  1.1     skrll 	      int arch, printed_one_p = 0;
   3306  1.1     skrll 	      char *p;
   3307  1.1     skrll 	      char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
   3308  1.1     skrll 
   3309  1.1     skrll 	      /* Create a list of the architectures that support the insn.  */
   3310  1.1     skrll 	      needed_arch_mask &= ~SPARC_OPCODE_SUPPORTED (max_architecture);
   3311  1.1     skrll 	      p = required_archs;
   3312  1.1     skrll 	      arch = sparc_ffs (needed_arch_mask);
   3313  1.1     skrll 	      while ((1 << arch) <= needed_arch_mask)
   3314  1.1     skrll 		{
   3315  1.4  christos 		  if ((1 << arch) & needed_arch_mask)
   3316  1.4  christos 		    {
   3317  1.1     skrll 		      if (printed_one_p)
   3318  1.1     skrll 			*p++ = '|';
   3319  1.1     skrll 		      strcpy (p, sparc_opcode_archs[arch].name);
   3320  1.1     skrll 		      p += strlen (p);
   3321  1.2     joerg 		      printed_one_p = 1;
   3322  1.2     joerg 		    }
   3323  1.2     joerg 		  ++arch;
   3324  1.2     joerg 		}
   3325  1.2     joerg 
   3326  1.2     joerg 	      as_bad (_("Architecture mismatch on \"%s %s\"."), str, argsStart);
   3327  1.2     joerg 	      as_tsktsk (_("(Requires %s; requested architecture is %s.)"),
   3328  1.2     joerg 			 required_archs,
   3329  1.2     joerg 			 sparc_opcode_archs[max_architecture].name);
   3330  1.2     joerg 	      return special_case;
   3331  1.2     joerg 	    }
   3332  1.1     skrll 
   3333  1.1     skrll 	  /* Make sure the hwcaps used by the instruction are
   3334  1.1     skrll 	     currently enabled.  */
   3335  1.1     skrll 	  if (hwcaps & ~hwcap_allowed)
   3336  1.1     skrll 	    {
   3337  1.1     skrll 	      const char *hwcap_name = get_hwcap_name(hwcaps & ~hwcap_allowed);
   3338  1.1     skrll 
   3339  1.1     skrll 	      as_bad (_("Hardware capability \"%s\" not enabled for \"%s\"."),
   3340  1.1     skrll 		      hwcap_name, str);
   3341  1.4  christos 	      return special_case;
   3342  1.4  christos 	    }
   3343  1.4  christos 	} /* If no match.  */
   3344  1.4  christos 
   3345  1.4  christos       break;
   3346  1.4  christos     } /* Forever looking for a match.  */
   3347  1.4  christos 
   3348  1.4  christos   the_insn.opcode = opcode;
   3349  1.4  christos   return special_case;
   3350  1.4  christos }
   3351  1.4  christos 
   3352  1.4  christos static char *
   3353  1.4  christos skip_over_keyword (char *q)
   3354  1.4  christos {
   3355  1.4  christos   for (q = q + (*q == '#' || *q == '%');
   3356  1.4  christos        ISALNUM (*q) || *q == '_';
   3357  1.4  christos        ++q)
   3358  1.4  christos     continue;
   3359  1.4  christos   return q;
   3360  1.4  christos }
   3361  1.4  christos 
   3362  1.4  christos static int
   3363  1.4  christos parse_sparc_asi (char **input_pointer_p, const sparc_asi **value_p)
   3364  1.4  christos {
   3365  1.4  christos   const sparc_asi *value;
   3366  1.4  christos   char c, *p, *q;
   3367  1.4  christos 
   3368  1.4  christos   p = *input_pointer_p;
   3369  1.4  christos   q = skip_over_keyword(p);
   3370  1.1     skrll   c = *q;
   3371  1.1     skrll   *q = 0;
   3372  1.1     skrll   value = sparc_encode_asi (p);
   3373  1.1     skrll   *q = c;
   3374  1.1     skrll   if (value == NULL)
   3375  1.1     skrll     return 0;
   3376  1.1     skrll   *value_p = value;
   3377  1.1     skrll   *input_pointer_p = q;
   3378  1.1     skrll   return 1;
   3379  1.1     skrll }
   3380  1.1     skrll 
   3381  1.1     skrll /* Parse an argument that can be expressed as a keyword.
   3382  1.1     skrll    (eg: #StoreStore or %ccfr).
   3383  1.1     skrll    The result is a boolean indicating success.
   3384  1.4  christos    If successful, INPUT_POINTER is updated.  */
   3385  1.1     skrll 
   3386  1.1     skrll static int
   3387  1.1     skrll parse_keyword_arg (int (*lookup_fn) (const char *),
   3388  1.1     skrll 		   char **input_pointerP,
   3389  1.1     skrll 		   int *valueP)
   3390  1.1     skrll {
   3391  1.1     skrll   int value;
   3392  1.1     skrll   char c, *p, *q;
   3393  1.1     skrll 
   3394  1.1     skrll   p = *input_pointerP;
   3395  1.1     skrll   q = skip_over_keyword(p);
   3396  1.1     skrll   c = *q;
   3397  1.1     skrll   *q = 0;
   3398  1.1     skrll   value = (*lookup_fn) (p);
   3399  1.1     skrll   *q = c;
   3400  1.1     skrll   if (value == -1)
   3401  1.1     skrll     return 0;
   3402  1.1     skrll   *valueP = value;
   3403  1.1     skrll   *input_pointerP = q;
   3404  1.1     skrll   return 1;
   3405  1.1     skrll }
   3406  1.1     skrll 
   3407  1.1     skrll /* Parse an argument that is a constant expression.
   3408  1.1     skrll    The result is a boolean indicating success.  */
   3409  1.1     skrll 
   3410  1.1     skrll static int
   3411  1.1     skrll parse_const_expr_arg (char **input_pointerP, int *valueP)
   3412  1.1     skrll {
   3413  1.1     skrll   char *save = input_line_pointer;
   3414  1.1     skrll   expressionS exp;
   3415  1.1     skrll 
   3416  1.1     skrll   input_line_pointer = *input_pointerP;
   3417  1.1     skrll   /* The next expression may be something other than a constant
   3418  1.1     skrll      (say if we're not processing the right variant of the insn).
   3419  1.1     skrll      Don't call expression unless we're sure it will succeed as it will
   3420  1.1     skrll      signal an error (which we want to defer until later).  */
   3421  1.1     skrll   /* FIXME: It might be better to define md_operand and have it recognize
   3422  1.1     skrll      things like %asi, etc. but continuing that route through to the end
   3423  1.1     skrll      is a lot of work.  */
   3424  1.1     skrll   if (*input_line_pointer == '%')
   3425  1.1     skrll     {
   3426  1.1     skrll       input_line_pointer = save;
   3427  1.1     skrll       return 0;
   3428  1.1     skrll     }
   3429  1.1     skrll   expression (&exp);
   3430  1.1     skrll   *input_pointerP = input_line_pointer;
   3431  1.1     skrll   input_line_pointer = save;
   3432  1.1     skrll   if (exp.X_op != O_constant)
   3433  1.1     skrll     return 0;
   3434  1.1     skrll   *valueP = exp.X_add_number;
   3435  1.1     skrll   return 1;
   3436  1.1     skrll }
   3437  1.1     skrll 
   3438  1.1     skrll /* Subroutine of sparc_ip to parse an expression.  */
   3439  1.1     skrll 
   3440  1.1     skrll static int
   3441  1.1     skrll get_expression (char *str)
   3442  1.1     skrll {
   3443  1.1     skrll   char *save_in;
   3444  1.1     skrll   segT seg;
   3445  1.1     skrll 
   3446  1.1     skrll   save_in = input_line_pointer;
   3447  1.1     skrll   input_line_pointer = str;
   3448  1.1     skrll   seg = expression (&the_insn.exp);
   3449  1.1     skrll   if (seg != absolute_section
   3450  1.1     skrll       && seg != text_section
   3451  1.1     skrll       && seg != data_section
   3452  1.1     skrll       && seg != bss_section
   3453  1.1     skrll       && seg != undefined_section)
   3454  1.1     skrll     {
   3455  1.1     skrll       the_insn.error = _("bad segment");
   3456  1.1     skrll       expr_end = input_line_pointer;
   3457  1.2     joerg       input_line_pointer = save_in;
   3458  1.1     skrll       return 1;
   3459  1.1     skrll     }
   3460  1.1     skrll   expr_end = input_line_pointer;
   3461  1.1     skrll   input_line_pointer = save_in;
   3462  1.1     skrll   return 0;
   3463  1.2     joerg }
   3464  1.1     skrll 
   3465  1.2     joerg /* Subroutine of md_assemble to output one insn.  */
   3466  1.1     skrll 
   3467  1.1     skrll static void
   3468  1.2     joerg output_insn (const struct sparc_opcode *insn, struct sparc_it *theinsn)
   3469  1.1     skrll {
   3470  1.1     skrll   char *toP = frag_more (4);
   3471  1.1     skrll 
   3472  1.1     skrll   /* Put out the opcode.  */
   3473  1.2     joerg   if (INSN_BIG_ENDIAN)
   3474  1.2     joerg     number_to_chars_bigendian (toP, (valueT) theinsn->opcode, 4);
   3475  1.2     joerg   else
   3476  1.1     skrll     number_to_chars_littleendian (toP, (valueT) theinsn->opcode, 4);
   3477  1.1     skrll 
   3478  1.1     skrll   /* Put out the symbol-dependent stuff.  */
   3479  1.1     skrll   if (theinsn->reloc != BFD_RELOC_NONE)
   3480  1.1     skrll     {
   3481  1.2     joerg       fixS *fixP =  fix_new_exp (frag_now,	/* Which frag.  */
   3482  1.2     joerg 				 (toP - frag_now->fr_literal),	/* Where.  */
   3483  1.1     skrll 				 4,		/* Size.  */
   3484  1.1     skrll 				 &theinsn->exp,
   3485  1.1     skrll 				 theinsn->pcrel,
   3486  1.2     joerg 				 theinsn->reloc);
   3487  1.1     skrll       /* Turn off overflow checking in fixup_segment.  We'll do our
   3488  1.1     skrll 	 own overflow checking in md_apply_fix.  This is necessary because
   3489  1.1     skrll 	 the insn size is 4 and fixup_segment will signal an overflow for
   3490  1.1     skrll 	 large 8 byte quantities.  */
   3491  1.1     skrll       fixP->fx_no_overflow = 1;
   3492  1.1     skrll       if (theinsn->reloc == BFD_RELOC_SPARC_OLO10)
   3493  1.3  christos 	fixP->tc_fix_data = theinsn->exp2.X_add_number;
   3494  1.1     skrll     }
   3495  1.1     skrll 
   3496  1.1     skrll   last_insn = insn;
   3497  1.1     skrll   last_opcode = theinsn->opcode;
   3498  1.1     skrll 
   3499  1.1     skrll #ifdef OBJ_ELF
   3500  1.1     skrll   dwarf2_emit_insn (4);
   3501  1.1     skrll #endif
   3502  1.1     skrll }
   3503  1.1     skrll 
   3504  1.1     skrll const char *
   3506  1.1     skrll md_atof (int type, char *litP, int *sizeP)
   3507  1.1     skrll {
   3508  1.1     skrll   return ieee_md_atof (type, litP, sizeP, target_big_endian);
   3509  1.1     skrll }
   3510  1.1     skrll 
   3511  1.1     skrll /* Write a value out to the object file, using the appropriate
   3512  1.1     skrll    endianness.  */
   3513  1.1     skrll 
   3514  1.1     skrll void
   3515  1.1     skrll md_number_to_chars (char *buf, valueT val, int n)
   3516  1.1     skrll {
   3517  1.1     skrll   if (target_big_endian)
   3518  1.1     skrll     number_to_chars_bigendian (buf, val, n);
   3519  1.1     skrll   else if (target_little_endian_data
   3520  1.1     skrll 	   && ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC))
   3521  1.1     skrll     /* Output debug words, which are not in allocated sections, as big
   3522  1.1     skrll        endian.  */
   3523  1.1     skrll     number_to_chars_bigendian (buf, val, n);
   3524  1.1     skrll   else if (target_little_endian_data || ! target_big_endian)
   3525  1.1     skrll     number_to_chars_littleendian (buf, val, n);
   3526  1.2     joerg }
   3527  1.1     skrll 
   3528  1.1     skrll /* Apply a fixS to the frags, now that we know the value it ought to
   3530  1.1     skrll    hold.  */
   3531  1.1     skrll 
   3532  1.1     skrll void
   3533  1.1     skrll md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
   3534  1.1     skrll {
   3535  1.1     skrll   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
   3536  1.1     skrll   offsetT val = * (offsetT *) valP;
   3537  1.1     skrll   long insn;
   3538  1.1     skrll 
   3539  1.1     skrll   gas_assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
   3540  1.1     skrll 
   3541  1.1     skrll   fixP->fx_addnumber = val;	/* Remember value for emit_reloc.  */
   3542  1.1     skrll 
   3543  1.1     skrll #ifdef OBJ_ELF
   3544  1.1     skrll   /* SPARC ELF relocations don't use an addend in the data field.  */
   3545  1.1     skrll   if (fixP->fx_addsy != NULL)
   3546  1.1     skrll     {
   3547  1.1     skrll       switch (fixP->fx_r_type)
   3548  1.1     skrll 	{
   3549  1.1     skrll 	case BFD_RELOC_SPARC_TLS_GD_HI22:
   3550  1.1     skrll 	case BFD_RELOC_SPARC_TLS_GD_LO10:
   3551  1.1     skrll 	case BFD_RELOC_SPARC_TLS_GD_ADD:
   3552  1.1     skrll 	case BFD_RELOC_SPARC_TLS_GD_CALL:
   3553  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDM_HI22:
   3554  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDM_LO10:
   3555  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDM_ADD:
   3556  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDM_CALL:
   3557  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDO_HIX22:
   3558  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDO_LOX10:
   3559  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LDO_ADD:
   3560  1.1     skrll 	case BFD_RELOC_SPARC_TLS_IE_HI22:
   3561  1.1     skrll 	case BFD_RELOC_SPARC_TLS_IE_LO10:
   3562  1.1     skrll 	case BFD_RELOC_SPARC_TLS_IE_LD:
   3563  1.1     skrll 	case BFD_RELOC_SPARC_TLS_IE_LDX:
   3564  1.1     skrll 	case BFD_RELOC_SPARC_TLS_IE_ADD:
   3565  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LE_HIX22:
   3566  1.1     skrll 	case BFD_RELOC_SPARC_TLS_LE_LOX10:
   3567  1.1     skrll 	case BFD_RELOC_SPARC_TLS_DTPMOD32:
   3568  1.1     skrll 	case BFD_RELOC_SPARC_TLS_DTPMOD64:
   3569  1.1     skrll 	case BFD_RELOC_SPARC_TLS_DTPOFF32:
   3570  1.1     skrll 	case BFD_RELOC_SPARC_TLS_DTPOFF64:
   3571  1.1     skrll 	case BFD_RELOC_SPARC_TLS_TPOFF32:
   3572  1.1     skrll 	case BFD_RELOC_SPARC_TLS_TPOFF64:
   3573  1.1     skrll 	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
   3574  1.1     skrll 
   3575  1.1     skrll 	default:
   3576  1.1     skrll 	  break;
   3577  1.1     skrll 	}
   3578  1.1     skrll 
   3579  1.1     skrll       return;
   3580  1.1     skrll     }
   3581  1.1     skrll #endif
   3582  1.1     skrll 
   3583  1.1     skrll   /* This is a hack.  There should be a better way to
   3584  1.1     skrll      handle this.  Probably in terms of howto fields, once
   3585  1.1     skrll      we can look at these fixups in terms of howtos.  */
   3586  1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_32_PCREL_S2 && fixP->fx_addsy)
   3587  1.1     skrll     val += fixP->fx_where + fixP->fx_frag->fr_address;
   3588  1.1     skrll 
   3589  1.1     skrll #ifdef OBJ_AOUT
   3590  1.1     skrll   /* FIXME: More ridiculous gas reloc hacking.  If we are going to
   3591  1.1     skrll      generate a reloc, then we just want to let the reloc addend set
   3592  1.1     skrll      the value.  We do not want to also stuff the addend into the
   3593  1.1     skrll      object file.  Including the addend in the object file works when
   3594  1.1     skrll      doing a static link, because the linker will ignore the object
   3595  1.1     skrll      file contents.  However, the dynamic linker does not ignore the
   3596  1.1     skrll      object file contents.  */
   3597  1.1     skrll   if (fixP->fx_addsy != NULL
   3598  1.1     skrll       && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2)
   3599  1.1     skrll     val = 0;
   3600  1.1     skrll 
   3601  1.1     skrll   /* When generating PIC code, we do not want an addend for a reloc
   3602  1.1     skrll      against a local symbol.  We adjust fx_addnumber to cancel out the
   3603  1.1     skrll      value already included in val, and to also cancel out the
   3604  1.1     skrll      adjustment which bfd_install_relocation will create.  */
   3605  1.1     skrll   if (sparc_pic_code
   3606  1.1     skrll       && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2
   3607  1.1     skrll       && fixP->fx_addsy != NULL
   3608  1.1     skrll       && ! S_IS_COMMON (fixP->fx_addsy)
   3609  1.1     skrll       && symbol_section_p (fixP->fx_addsy))
   3610  1.1     skrll     fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy);
   3611  1.1     skrll 
   3612  1.1     skrll   /* When generating PIC code, we need to fiddle to get
   3613  1.1     skrll      bfd_install_relocation to do the right thing for a PC relative
   3614  1.1     skrll      reloc against a local symbol which we are going to keep.  */
   3615  1.1     skrll   if (sparc_pic_code
   3616  1.1     skrll       && fixP->fx_r_type == BFD_RELOC_32_PCREL_S2
   3617  1.2     joerg       && fixP->fx_addsy != NULL
   3618  1.2     joerg       && (S_IS_EXTERNAL (fixP->fx_addsy)
   3619  1.2     joerg 	  || S_IS_WEAK (fixP->fx_addsy))
   3620  1.2     joerg       && S_IS_DEFINED (fixP->fx_addsy)
   3621  1.2     joerg       && ! S_IS_COMMON (fixP->fx_addsy))
   3622  1.2     joerg     {
   3623  1.1     skrll       val = 0;
   3624  1.1     skrll       fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy);
   3625  1.1     skrll     }
   3626  1.1     skrll #endif
   3627  1.1     skrll 
   3628  1.1     skrll   /* If this is a data relocation, just output VAL.  */
   3629  1.1     skrll 
   3630  1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_8)
   3631  1.1     skrll     {
   3632  1.1     skrll       md_number_to_chars (buf, val, 1);
   3633  1.1     skrll     }
   3634  1.1     skrll   else if (fixP->fx_r_type == BFD_RELOC_16
   3635  1.1     skrll 	   || fixP->fx_r_type == BFD_RELOC_SPARC_UA16)
   3636  1.1     skrll     {
   3637  1.1     skrll       md_number_to_chars (buf, val, 2);
   3638  1.1     skrll     }
   3639  1.1     skrll   else if (fixP->fx_r_type == BFD_RELOC_32
   3640  1.1     skrll 	   || fixP->fx_r_type == BFD_RELOC_SPARC_UA32
   3641  1.1     skrll 	   || fixP->fx_r_type == BFD_RELOC_SPARC_REV32)
   3642  1.1     skrll     {
   3643  1.1     skrll       md_number_to_chars (buf, val, 4);
   3644  1.1     skrll     }
   3645  1.1     skrll   else if (fixP->fx_r_type == BFD_RELOC_64
   3646  1.1     skrll 	   || fixP->fx_r_type == BFD_RELOC_SPARC_UA64)
   3647  1.1     skrll     {
   3648  1.1     skrll       md_number_to_chars (buf, val, 8);
   3649  1.1     skrll     }
   3650  1.1     skrll   else if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   3651  1.1     skrll            || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   3652  1.1     skrll     {
   3653  1.1     skrll       fixP->fx_done = 0;
   3654  1.1     skrll       return;
   3655  1.1     skrll     }
   3656  1.1     skrll   else
   3657  1.1     skrll     {
   3658  1.1     skrll       /* It's a relocation against an instruction.  */
   3659  1.1     skrll 
   3660  1.1     skrll       if (INSN_BIG_ENDIAN)
   3661  1.1     skrll 	insn = bfd_getb32 ((unsigned char *) buf);
   3662  1.1     skrll       else
   3663  1.1     skrll 	insn = bfd_getl32 ((unsigned char *) buf);
   3664  1.1     skrll 
   3665  1.4  christos       switch (fixP->fx_r_type)
   3666  1.4  christos 	{
   3667  1.4  christos 	case BFD_RELOC_32_PCREL_S2:
   3668  1.4  christos 	  val = val >> 2;
   3669  1.4  christos 	  /* FIXME: This increment-by-one deserves a comment of why it's
   3670  1.4  christos 	     being done!  */
   3671  1.4  christos 	  if (! sparc_pic_code
   3672  1.1     skrll 	      || fixP->fx_addsy == NULL
   3673  1.1     skrll 	      || symbol_section_p (fixP->fx_addsy))
   3674  1.1     skrll 	    ++val;
   3675  1.1     skrll 
   3676  1.1     skrll 	  insn |= val & 0x3fffffff;
   3677  1.1     skrll 
   3678  1.1     skrll 	  /* See if we have a delay slot.  In that case we attempt to
   3679  1.1     skrll              optimize several cases transforming CALL instructions
   3680  1.1     skrll              into branches.  But we can only do that if the relocation
   3681  1.1     skrll              can be completely resolved here, i.e. if no undefined
   3682  1.1     skrll              symbol is associated with it.  */
   3683  1.1     skrll 	  if (sparc_relax && fixP->fx_addsy == NULL
   3684  1.1     skrll 	      && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix)
   3685  1.1     skrll 	    {
   3686  1.1     skrll #define G0		0
   3687  1.1     skrll #define O7		15
   3688  1.1     skrll #define XCC		(2 << 20)
   3689  1.1     skrll #define COND(x)		(((x)&0xf)<<25)
   3690  1.1     skrll #define CONDA		COND(0x8)
   3691  1.1     skrll #define INSN_BPA	(F2(0,1) | CONDA | BPRED | XCC)
   3692  1.1     skrll #define INSN_BA		(F2(0,2) | CONDA)
   3693  1.1     skrll #define INSN_OR		F3(2, 0x2, 0)
   3694  1.1     skrll #define INSN_NOP	F2(0,4)
   3695  1.1     skrll 
   3696  1.1     skrll 	      long delay;
   3697  1.1     skrll 
   3698  1.1     skrll 	      /* If the instruction is a call with either:
   3699  1.1     skrll 		 restore
   3700  1.1     skrll 		 arithmetic instruction with rd == %o7
   3701  1.1     skrll 		 where rs1 != %o7 and rs2 if it is register != %o7
   3702  1.1     skrll 		 then we can optimize if the call destination is near
   3703  1.1     skrll 		 by changing the call into a branch always.  */
   3704  1.1     skrll 	      if (INSN_BIG_ENDIAN)
   3705  1.1     skrll 		delay = bfd_getb32 ((unsigned char *) buf + 4);
   3706  1.1     skrll 	      else
   3707  1.1     skrll 		delay = bfd_getl32 ((unsigned char *) buf + 4);
   3708  1.1     skrll 	      if ((insn & OP (~0)) != OP (1) || (delay & OP (~0)) != OP (2))
   3709  1.1     skrll 		break;
   3710  1.1     skrll 	      if ((delay & OP3 (~0)) != OP3 (0x3d) /* Restore.  */
   3711  1.1     skrll 		  && ((delay & OP3 (0x28)) != 0 /* Arithmetic.  */
   3712  1.1     skrll 		      || ((delay & RD (~0)) != RD (O7))))
   3713  1.1     skrll 		break;
   3714  1.1     skrll 	      if ((delay & RS1 (~0)) == RS1 (O7)
   3715  1.1     skrll 		  || ((delay & F3I (~0)) == 0
   3716  1.1     skrll 		      && (delay & RS2 (~0)) == RS2 (O7)))
   3717  1.1     skrll 		break;
   3718  1.1     skrll 	      /* Ensure the branch will fit into simm22.  */
   3719  1.1     skrll 	      if ((val & 0x3fe00000)
   3720  1.1     skrll 		  && (val & 0x3fe00000) != 0x3fe00000)
   3721  1.1     skrll 		break;
   3722  1.1     skrll 	      /* Check if the arch is v9 and branch will fit
   3723  1.1     skrll 		 into simm19.  */
   3724  1.1     skrll 	      if (((val & 0x3c0000) == 0
   3725  1.1     skrll 		   || (val & 0x3c0000) == 0x3c0000)
   3726  1.1     skrll 		  && (sparc_arch_size == 64
   3727  1.1     skrll 		      || current_architecture >= SPARC_OPCODE_ARCH_V9))
   3728  1.1     skrll 		/* ba,pt %xcc  */
   3729  1.1     skrll 		insn = INSN_BPA | (val & 0x7ffff);
   3730  1.1     skrll 	      else
   3731  1.1     skrll 		/* ba  */
   3732  1.1     skrll 		insn = INSN_BA | (val & 0x3fffff);
   3733  1.1     skrll 	      if (fixP->fx_where >= 4
   3734  1.1     skrll 		  && ((delay & (0xffffffff ^ RS1 (~0)))
   3735  1.1     skrll 		      == (INSN_OR | RD (O7) | RS2 (G0))))
   3736  1.1     skrll 		{
   3737  1.1     skrll 		  long setter;
   3738  1.1     skrll 		  int reg;
   3739  1.1     skrll 
   3740  1.1     skrll 		  if (INSN_BIG_ENDIAN)
   3741  1.1     skrll 		    setter = bfd_getb32 ((unsigned char *) buf - 4);
   3742  1.1     skrll 		  else
   3743  1.1     skrll 		    setter = bfd_getl32 ((unsigned char *) buf - 4);
   3744  1.1     skrll 		  if ((setter & (0xffffffff ^ RD (~0)))
   3745  1.1     skrll 		      != (INSN_OR | RS1 (O7) | RS2 (G0)))
   3746  1.1     skrll 		    break;
   3747  1.1     skrll 		  /* The sequence was
   3748  1.1     skrll 		     or %o7, %g0, %rN
   3749  1.1     skrll 		     call foo
   3750  1.1     skrll 		     or %rN, %g0, %o7
   3751  1.1     skrll 
   3752  1.1     skrll 		     If call foo was replaced with ba, replace
   3753  1.1     skrll 		     or %rN, %g0, %o7 with nop.  */
   3754  1.1     skrll 		  reg = (delay & RS1 (~0)) >> 14;
   3755  1.1     skrll 		  if (reg != ((setter & RD (~0)) >> 25)
   3756  1.1     skrll 		      || reg == G0 || reg == O7)
   3757  1.1     skrll 		    break;
   3758  1.1     skrll 
   3759  1.1     skrll 		  if (INSN_BIG_ENDIAN)
   3760  1.1     skrll 		    bfd_putb32 (INSN_NOP, (unsigned char *) buf + 4);
   3761  1.1     skrll 		  else
   3762  1.1     skrll 		    bfd_putl32 (INSN_NOP, (unsigned char *) buf + 4);
   3763  1.1     skrll 		}
   3764  1.1     skrll 	    }
   3765  1.1     skrll 	  break;
   3766  1.1     skrll 
   3767  1.1     skrll 	case BFD_RELOC_SPARC_11:
   3768  1.1     skrll 	  if (! in_signed_range (val, 0x7ff))
   3769  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3770  1.1     skrll 			  _("relocation overflow"));
   3771  1.1     skrll 	  insn |= val & 0x7ff;
   3772  1.1     skrll 	  break;
   3773  1.1     skrll 
   3774  1.1     skrll 	case BFD_RELOC_SPARC_10:
   3775  1.1     skrll 	  if (! in_signed_range (val, 0x3ff))
   3776  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3777  1.1     skrll 			  _("relocation overflow"));
   3778  1.1     skrll 	  insn |= val & 0x3ff;
   3779  1.1     skrll 	  break;
   3780  1.1     skrll 
   3781  1.1     skrll 	case BFD_RELOC_SPARC_7:
   3782  1.1     skrll 	  if (! in_bitfield_range (val, 0x7f))
   3783  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3784  1.1     skrll 			  _("relocation overflow"));
   3785  1.1     skrll 	  insn |= val & 0x7f;
   3786  1.1     skrll 	  break;
   3787  1.1     skrll 
   3788  1.1     skrll 	case BFD_RELOC_SPARC_6:
   3789  1.2     joerg 	  if (! in_bitfield_range (val, 0x3f))
   3790  1.2     joerg 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3791  1.2     joerg 			  _("relocation overflow"));
   3792  1.2     joerg 	  insn |= val & 0x3f;
   3793  1.2     joerg 	  break;
   3794  1.2     joerg 
   3795  1.2     joerg 	case BFD_RELOC_SPARC_5:
   3796  1.2     joerg 	  if (! in_bitfield_range (val, 0x1f))
   3797  1.2     joerg 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3798  1.2     joerg 			  _("relocation overflow"));
   3799  1.2     joerg 	  insn |= val & 0x1f;
   3800  1.2     joerg 	  break;
   3801  1.1     skrll 
   3802  1.1     skrll 	case BFD_RELOC_SPARC_WDISP10:
   3803  1.1     skrll 	  if ((val & 3)
   3804  1.1     skrll 	      || val >= 0x007fc
   3805  1.1     skrll 	      || val <= -(offsetT) 0x808)
   3806  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3807  1.1     skrll 			  _("relocation overflow"));
   3808  1.1     skrll 	  /* FIXME: The +1 deserves a comment.  */
   3809  1.1     skrll 	  val = (val >> 2) + 1;
   3810  1.1     skrll 	  insn |= ((val & 0x300) << 11)
   3811  1.1     skrll 	    | ((val & 0xff) << 5);
   3812  1.1     skrll 	  break;
   3813  1.1     skrll 
   3814  1.1     skrll 	case BFD_RELOC_SPARC_WDISP16:
   3815  1.1     skrll 	  if ((val & 3)
   3816  1.1     skrll 	      || val >= 0x1fffc
   3817  1.1     skrll 	      || val <= -(offsetT) 0x20008)
   3818  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3819  1.1     skrll 			  _("relocation overflow"));
   3820  1.1     skrll 	  /* FIXME: The +1 deserves a comment.  */
   3821  1.1     skrll 	  val = (val >> 2) + 1;
   3822  1.1     skrll 	  insn |= ((val & 0xc000) << 6) | (val & 0x3fff);
   3823  1.1     skrll 	  break;
   3824  1.1     skrll 
   3825  1.1     skrll 	case BFD_RELOC_SPARC_WDISP19:
   3826  1.1     skrll 	  if ((val & 3)
   3827  1.1     skrll 	      || val >= 0xffffc
   3828  1.1     skrll 	      || val <= -(offsetT) 0x100008)
   3829  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3830  1.1     skrll 			  _("relocation overflow"));
   3831  1.1     skrll 	  /* FIXME: The +1 deserves a comment.  */
   3832  1.1     skrll 	  val = (val >> 2) + 1;
   3833  1.1     skrll 	  insn |= val & 0x7ffff;
   3834  1.1     skrll 	  break;
   3835  1.1     skrll 
   3836  1.1     skrll 	case BFD_RELOC_SPARC_HH22:
   3837  1.1     skrll 	  val = BSR (val, 32);
   3838  1.1     skrll 	  /* Fall through.  */
   3839  1.1     skrll 
   3840  1.1     skrll 	case BFD_RELOC_SPARC_LM22:
   3841  1.1     skrll 	case BFD_RELOC_HI22:
   3842  1.1     skrll 	  if (!fixP->fx_addsy)
   3843  1.1     skrll 	    insn |= (val >> 10) & 0x3fffff;
   3844  1.1     skrll 	  else
   3845  1.1     skrll 	    /* FIXME: Need comment explaining why we do this.  */
   3846  1.1     skrll 	    insn &= ~0xffff;
   3847  1.1     skrll 	  break;
   3848  1.1     skrll 
   3849  1.1     skrll 	case BFD_RELOC_SPARC22:
   3850  1.1     skrll 	  if (val & ~0x003fffff)
   3851  1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3852  1.1     skrll 			  _("relocation overflow"));
   3853  1.1     skrll 	  insn |= (val & 0x3fffff);
   3854  1.1     skrll 	  break;
   3855  1.1     skrll 
   3856  1.1     skrll 	case BFD_RELOC_SPARC_HM10:
   3857  1.1     skrll 	  val = BSR (val, 32);
   3858  1.1     skrll 	  /* Fall through.  */
   3859  1.1     skrll 
   3860  1.1     skrll 	case BFD_RELOC_LO10:
   3861  1.1     skrll 	  if (!fixP->fx_addsy)
   3862  1.1     skrll 	    insn |= val & 0x3ff;
   3863  1.1     skrll 	  else
   3864  1.1     skrll 	    /* FIXME: Need comment explaining why we do this.  */
   3865  1.1     skrll 	    insn &= ~0xff;
   3866  1.1     skrll 	  break;
   3867  1.1     skrll 
   3868  1.1     skrll 	case BFD_RELOC_SPARC_OLO10:
   3869  1.1     skrll 	  val &= 0x3ff;
   3870  1.1     skrll 	  val += fixP->tc_fix_data;
   3871  1.1     skrll 	  /* Fall through.  */
   3872  1.1     skrll 
   3873  1.1     skrll 	case BFD_RELOC_SPARC13:
   3874  1.2     joerg 	  if (! in_signed_range (val, 0x1fff))
   3875  1.2     joerg 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3876  1.2     joerg 			  _("relocation overflow"));
   3877  1.2     joerg 	  insn |= val & 0x1fff;
   3878  1.2     joerg 	  break;
   3879  1.2     joerg 
   3880  1.2     joerg 	case BFD_RELOC_SPARC_WDISP22:
   3881  1.2     joerg 	  val = (val >> 2) + 1;
   3882  1.2     joerg 	  /* Fall through.  */
   3883  1.1     skrll 	case BFD_RELOC_SPARC_BASE22:
   3884  1.1     skrll 	  insn |= val & 0x3fffff;
   3885  1.1     skrll 	  break;
   3886  1.1     skrll 
   3887  1.1     skrll 	case BFD_RELOC_SPARC_H34:
   3888  1.1     skrll 	  if (!fixP->fx_addsy)
   3889  1.1     skrll 	    {
   3890  1.1     skrll 	      bfd_vma tval = val;
   3891  1.1     skrll 	      tval >>= 12;
   3892  1.1     skrll 	      insn |= tval & 0x3fffff;
   3893  1.1     skrll 	    }
   3894  1.1     skrll 	  break;
   3895  1.1     skrll 
   3896  1.1     skrll 	case BFD_RELOC_SPARC_H44:
   3897  1.1     skrll 	  if (!fixP->fx_addsy)
   3898  1.1     skrll 	    {
   3899  1.1     skrll 	      bfd_vma tval = val;
   3900  1.1     skrll 	      tval >>= 22;
   3901  1.1     skrll 	      insn |= tval & 0x3fffff;
   3902  1.1     skrll 	    }
   3903  1.1     skrll 	  break;
   3904  1.1     skrll 
   3905  1.1     skrll 	case BFD_RELOC_SPARC_M44:
   3906  1.1     skrll 	  if (!fixP->fx_addsy)
   3907  1.1     skrll 	    insn |= (val >> 12) & 0x3ff;
   3908  1.1     skrll 	  break;
   3909  1.1     skrll 
   3910  1.1     skrll 	case BFD_RELOC_SPARC_L44:
   3911  1.1     skrll 	  if (!fixP->fx_addsy)
   3912  1.1     skrll 	    insn |= val & 0xfff;
   3913  1.1     skrll 	  break;
   3914  1.1     skrll 
   3915  1.1     skrll 	case BFD_RELOC_SPARC_HIX22:
   3916  1.1     skrll 	  if (!fixP->fx_addsy)
   3917  1.1     skrll 	    {
   3918  1.1     skrll 	      val ^= ~(offsetT) 0;
   3919  1.1     skrll 	      insn |= (val >> 10) & 0x3fffff;
   3920  1.1     skrll 	    }
   3921  1.1     skrll 	  break;
   3922  1.1     skrll 
   3923  1.1     skrll 	case BFD_RELOC_SPARC_LOX10:
   3924  1.1     skrll 	  if (!fixP->fx_addsy)
   3925  1.1     skrll 	    insn |= 0x1c00 | (val & 0x3ff);
   3926  1.1     skrll 	  break;
   3927  1.1     skrll 
   3928  1.1     skrll 	case BFD_RELOC_NONE:
   3929  1.1     skrll 	default:
   3930  1.1     skrll 	  as_bad_where (fixP->fx_file, fixP->fx_line,
   3931  1.1     skrll 			_("bad or unhandled relocation type: 0x%02x"),
   3932  1.1     skrll 			fixP->fx_r_type);
   3933  1.1     skrll 	  break;
   3934  1.1     skrll 	}
   3935  1.1     skrll 
   3936  1.1     skrll       if (INSN_BIG_ENDIAN)
   3937  1.1     skrll 	bfd_putb32 (insn, (unsigned char *) buf);
   3938  1.1     skrll       else
   3939  1.1     skrll 	bfd_putl32 (insn, (unsigned char *) buf);
   3940  1.1     skrll     }
   3941  1.1     skrll 
   3942  1.1     skrll   /* Are we finished with this relocation now?  */
   3943  1.1     skrll   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
   3944  1.3  christos     fixP->fx_done = 1;
   3945  1.1     skrll }
   3946  1.1     skrll 
   3947  1.3  christos /* Translate internal representation of relocation info to BFD target
   3948  1.1     skrll    format.  */
   3949  1.1     skrll 
   3950  1.1     skrll arelent **
   3951  1.1     skrll tc_gen_reloc (asection *section, fixS *fixp)
   3952  1.1     skrll {
   3953  1.4  christos   static arelent *relocs[3];
   3954  1.1     skrll   arelent *reloc;
   3955  1.1     skrll   bfd_reloc_code_real_type code;
   3956  1.4  christos 
   3957  1.4  christos   relocs[0] = reloc = XNEW (arelent);
   3958  1.4  christos   relocs[1] = NULL;
   3959  1.4  christos 
   3960  1.4  christos   reloc->sym_ptr_ptr = XNEW (asymbol *);
   3961  1.4  christos   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   3962  1.4  christos   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   3963  1.4  christos 
   3964  1.4  christos   switch (fixp->fx_r_type)
   3965  1.4  christos     {
   3966  1.4  christos     case BFD_RELOC_8:
   3967  1.4  christos     case BFD_RELOC_16:
   3968  1.4  christos     case BFD_RELOC_32:
   3969  1.4  christos     case BFD_RELOC_64:
   3970  1.4  christos       if (fixp->fx_pcrel)
   3971  1.4  christos 	{
   3972  1.4  christos 	  switch (fixp->fx_size)
   3973  1.4  christos 	    {
   3974  1.4  christos 	    default:
   3975  1.4  christos 	      as_bad_where (fixp->fx_file, fixp->fx_line,
   3976  1.4  christos 			    _("can not do %d byte pc-relative relocation"),
   3977  1.4  christos 			    fixp->fx_size);
   3978  1.4  christos 	      code = fixp->fx_r_type;
   3979  1.4  christos 	      fixp->fx_pcrel = 0;
   3980  1.1     skrll 	      break;
   3981  1.1     skrll 	    case 1: code = BFD_RELOC_8_PCREL;  break;
   3982  1.1     skrll 	    case 2: code = BFD_RELOC_16_PCREL; break;
   3983  1.1     skrll 	    case 4: code = BFD_RELOC_32_PCREL; break;
   3984  1.1     skrll #ifdef BFD64
   3985  1.1     skrll 	    case 8: code = BFD_RELOC_64_PCREL; break;
   3986  1.1     skrll #endif
   3987  1.1     skrll 	    }
   3988  1.2     joerg 	  if (fixp->fx_pcrel)
   3989  1.1     skrll 	    fixp->fx_addnumber = fixp->fx_offset;
   3990  1.1     skrll 	  break;
   3991  1.1     skrll 	}
   3992  1.1     skrll       /* Fall through.  */
   3993  1.1     skrll     case BFD_RELOC_HI22:
   3994  1.1     skrll     case BFD_RELOC_LO10:
   3995  1.1     skrll     case BFD_RELOC_32_PCREL_S2:
   3996  1.1     skrll     case BFD_RELOC_SPARC13:
   3997  1.1     skrll     case BFD_RELOC_SPARC22:
   3998  1.1     skrll     case BFD_RELOC_SPARC_PC22:
   3999  1.1     skrll     case BFD_RELOC_SPARC_PC10:
   4000  1.1     skrll     case BFD_RELOC_SPARC_BASE13:
   4001  1.1     skrll     case BFD_RELOC_SPARC_WDISP10:
   4002  1.1     skrll     case BFD_RELOC_SPARC_WDISP16:
   4003  1.2     joerg     case BFD_RELOC_SPARC_WDISP19:
   4004  1.1     skrll     case BFD_RELOC_SPARC_WDISP22:
   4005  1.1     skrll     case BFD_RELOC_SPARC_5:
   4006  1.1     skrll     case BFD_RELOC_SPARC_6:
   4007  1.1     skrll     case BFD_RELOC_SPARC_7:
   4008  1.1     skrll     case BFD_RELOC_SPARC_10:
   4009  1.1     skrll     case BFD_RELOC_SPARC_11:
   4010  1.1     skrll     case BFD_RELOC_SPARC_HH22:
   4011  1.1     skrll     case BFD_RELOC_SPARC_HM10:
   4012  1.1     skrll     case BFD_RELOC_SPARC_LM22:
   4013  1.1     skrll     case BFD_RELOC_SPARC_PC_HH22:
   4014  1.1     skrll     case BFD_RELOC_SPARC_PC_HM10:
   4015  1.1     skrll     case BFD_RELOC_SPARC_PC_LM22:
   4016  1.1     skrll     case BFD_RELOC_SPARC_H34:
   4017  1.1     skrll     case BFD_RELOC_SPARC_H44:
   4018  1.1     skrll     case BFD_RELOC_SPARC_M44:
   4019  1.1     skrll     case BFD_RELOC_SPARC_L44:
   4020  1.1     skrll     case BFD_RELOC_SPARC_HIX22:
   4021  1.1     skrll     case BFD_RELOC_SPARC_LOX10:
   4022  1.1     skrll     case BFD_RELOC_SPARC_REV32:
   4023  1.1     skrll     case BFD_RELOC_SPARC_OLO10:
   4024  1.1     skrll     case BFD_RELOC_SPARC_UA16:
   4025  1.1     skrll     case BFD_RELOC_SPARC_UA32:
   4026  1.1     skrll     case BFD_RELOC_SPARC_UA64:
   4027  1.1     skrll     case BFD_RELOC_8_PCREL:
   4028  1.1     skrll     case BFD_RELOC_16_PCREL:
   4029  1.1     skrll     case BFD_RELOC_32_PCREL:
   4030  1.1     skrll     case BFD_RELOC_64_PCREL:
   4031  1.1     skrll     case BFD_RELOC_SPARC_PLT32:
   4032  1.1     skrll     case BFD_RELOC_SPARC_PLT64:
   4033  1.1     skrll     case BFD_RELOC_VTABLE_ENTRY:
   4034  1.1     skrll     case BFD_RELOC_VTABLE_INHERIT:
   4035  1.1     skrll     case BFD_RELOC_SPARC_TLS_GD_HI22:
   4036  1.1     skrll     case BFD_RELOC_SPARC_TLS_GD_LO10:
   4037  1.1     skrll     case BFD_RELOC_SPARC_TLS_GD_ADD:
   4038  1.1     skrll     case BFD_RELOC_SPARC_TLS_GD_CALL:
   4039  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDM_HI22:
   4040  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDM_LO10:
   4041  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDM_ADD:
   4042  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDM_CALL:
   4043  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDO_HIX22:
   4044  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDO_LOX10:
   4045  1.1     skrll     case BFD_RELOC_SPARC_TLS_LDO_ADD:
   4046  1.1     skrll     case BFD_RELOC_SPARC_TLS_IE_HI22:
   4047  1.1     skrll     case BFD_RELOC_SPARC_TLS_IE_LO10:
   4048  1.1     skrll     case BFD_RELOC_SPARC_TLS_IE_LD:
   4049  1.1     skrll     case BFD_RELOC_SPARC_TLS_IE_LDX:
   4050  1.1     skrll     case BFD_RELOC_SPARC_TLS_IE_ADD:
   4051  1.1     skrll     case BFD_RELOC_SPARC_TLS_LE_HIX22:
   4052  1.1     skrll     case BFD_RELOC_SPARC_TLS_LE_LOX10:
   4053  1.1     skrll     case BFD_RELOC_SPARC_TLS_DTPOFF32:
   4054  1.1     skrll     case BFD_RELOC_SPARC_TLS_DTPOFF64:
   4055  1.1     skrll     case BFD_RELOC_SPARC_GOTDATA_OP_HIX22:
   4056  1.1     skrll     case BFD_RELOC_SPARC_GOTDATA_OP_LOX10:
   4057  1.1     skrll     case BFD_RELOC_SPARC_GOTDATA_OP:
   4058  1.1     skrll       code = fixp->fx_r_type;
   4059  1.1     skrll       break;
   4060  1.1     skrll     default:
   4061  1.1     skrll       abort ();
   4062  1.1     skrll       return NULL;
   4063  1.1     skrll     }
   4064  1.1     skrll 
   4065  1.1     skrll #if defined (OBJ_ELF) || defined (OBJ_AOUT)
   4066  1.1     skrll   /* If we are generating PIC code, we need to generate a different
   4067  1.1     skrll      set of relocs.  */
   4068  1.1     skrll 
   4069  1.1     skrll #ifdef OBJ_ELF
   4070  1.1     skrll #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
   4071  1.1     skrll #else
   4072  1.1     skrll #define GOT_NAME "__GLOBAL_OFFSET_TABLE_"
   4073  1.1     skrll #endif
   4074  1.1     skrll #ifdef TE_VXWORKS
   4075  1.1     skrll #define GOTT_BASE "__GOTT_BASE__"
   4076  1.1     skrll #define GOTT_INDEX "__GOTT_INDEX__"
   4077  1.1     skrll #endif
   4078  1.1     skrll 
   4079  1.1     skrll   /* This code must be parallel to the OBJ_ELF tc_fix_adjustable.  */
   4080  1.1     skrll 
   4081  1.1     skrll   if (sparc_pic_code)
   4082  1.1     skrll     {
   4083  1.1     skrll       switch (code)
   4084  1.1     skrll 	{
   4085  1.1     skrll 	case BFD_RELOC_32_PCREL_S2:
   4086  1.1     skrll 	  if (generic_force_reloc (fixp))
   4087  1.1     skrll 	    code = BFD_RELOC_SPARC_WPLT30;
   4088  1.1     skrll 	  break;
   4089  1.1     skrll 	case BFD_RELOC_HI22:
   4090  1.1     skrll 	  code = BFD_RELOC_SPARC_GOT22;
   4091  1.1     skrll 	  if (fixp->fx_addsy != NULL)
   4092  1.1     skrll 	    {
   4093  1.1     skrll 	      if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
   4094  1.1     skrll 		code = BFD_RELOC_SPARC_PC22;
   4095  1.1     skrll #ifdef TE_VXWORKS
   4096  1.1     skrll 	      if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0
   4097  1.1     skrll 		  || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0)
   4098  1.1     skrll 		code = BFD_RELOC_HI22; /* Unchanged.  */
   4099  1.1     skrll #endif
   4100  1.1     skrll 	    }
   4101  1.1     skrll 	  break;
   4102  1.1     skrll 	case BFD_RELOC_LO10:
   4103  1.1     skrll 	  code = BFD_RELOC_SPARC_GOT10;
   4104  1.1     skrll 	  if (fixp->fx_addsy != NULL)
   4105  1.1     skrll 	    {
   4106  1.1     skrll 	      if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
   4107  1.1     skrll 		code = BFD_RELOC_SPARC_PC10;
   4108  1.1     skrll #ifdef TE_VXWORKS
   4109  1.1     skrll 	      if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0
   4110  1.1     skrll 		  || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0)
   4111  1.1     skrll 		code = BFD_RELOC_LO10; /* Unchanged.  */
   4112  1.1     skrll #endif
   4113  1.1     skrll 	    }
   4114  1.1     skrll 	  break;
   4115  1.1     skrll 	case BFD_RELOC_SPARC13:
   4116  1.1     skrll 	  code = BFD_RELOC_SPARC_GOT13;
   4117  1.1     skrll 	  break;
   4118  1.1     skrll 	default:
   4119  1.1     skrll 	  break;
   4120  1.1     skrll 	}
   4121  1.1     skrll     }
   4122  1.1     skrll #endif /* defined (OBJ_ELF) || defined (OBJ_AOUT)  */
   4123  1.1     skrll 
   4124  1.1     skrll   /* Nothing is aligned in DWARF debugging sections.  */
   4125  1.1     skrll   if (bfd_get_section_flags (stdoutput, section) & SEC_DEBUGGING)
   4126  1.1     skrll     switch (code)
   4127  1.1     skrll       {
   4128  1.1     skrll       case BFD_RELOC_16: code = BFD_RELOC_SPARC_UA16; break;
   4129  1.1     skrll       case BFD_RELOC_32: code = BFD_RELOC_SPARC_UA32; break;
   4130  1.1     skrll       case BFD_RELOC_64: code = BFD_RELOC_SPARC_UA64; break;
   4131  1.1     skrll       default: break;
   4132  1.1     skrll       }
   4133  1.1     skrll 
   4134  1.1     skrll   if (code == BFD_RELOC_SPARC_OLO10)
   4135  1.1     skrll     reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO10);
   4136  1.1     skrll   else
   4137  1.1     skrll     reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
   4138  1.1     skrll   if (reloc->howto == 0)
   4139  1.1     skrll     {
   4140  1.1     skrll       as_bad_where (fixp->fx_file, fixp->fx_line,
   4141  1.1     skrll 		    _("internal error: can't export reloc type %d (`%s')"),
   4142  1.1     skrll 		    fixp->fx_r_type, bfd_get_reloc_code_name (code));
   4143  1.1     skrll       xfree (reloc);
   4144  1.1     skrll       relocs[0] = NULL;
   4145  1.1     skrll       return relocs;
   4146  1.1     skrll     }
   4147  1.1     skrll 
   4148  1.1     skrll   /* @@ Why fx_addnumber sometimes and fx_offset other times?  */
   4149  1.1     skrll #ifdef OBJ_AOUT
   4150  1.1     skrll 
   4151  1.1     skrll   if (reloc->howto->pc_relative == 0
   4152  1.1     skrll       || code == BFD_RELOC_SPARC_PC10
   4153  1.1     skrll       || code == BFD_RELOC_SPARC_PC22)
   4154  1.1     skrll     reloc->addend = fixp->fx_addnumber;
   4155  1.1     skrll   else if (sparc_pic_code
   4156  1.1     skrll 	   && fixp->fx_r_type == BFD_RELOC_32_PCREL_S2
   4157  1.1     skrll 	   && fixp->fx_addsy != NULL
   4158  1.1     skrll 	   && (S_IS_EXTERNAL (fixp->fx_addsy)
   4159  1.2     joerg 	       || S_IS_WEAK (fixp->fx_addsy))
   4160  1.1     skrll 	   && S_IS_DEFINED (fixp->fx_addsy)
   4161  1.1     skrll 	   && ! S_IS_COMMON (fixp->fx_addsy))
   4162  1.1     skrll     reloc->addend = fixp->fx_addnumber;
   4163  1.1     skrll   else
   4164  1.1     skrll     reloc->addend = fixp->fx_offset - reloc->address;
   4165  1.1     skrll 
   4166  1.1     skrll #else /* elf or coff  */
   4167  1.1     skrll 
   4168  1.1     skrll   if (code != BFD_RELOC_32_PCREL_S2
   4169  1.1     skrll       && code != BFD_RELOC_SPARC_WDISP22
   4170  1.1     skrll       && code != BFD_RELOC_SPARC_WDISP16
   4171  1.1     skrll       && code != BFD_RELOC_SPARC_WDISP19
   4172  1.1     skrll       && code != BFD_RELOC_SPARC_WDISP10
   4173  1.1     skrll       && code != BFD_RELOC_SPARC_WPLT30
   4174  1.1     skrll       && code != BFD_RELOC_SPARC_TLS_GD_CALL
   4175  1.1     skrll       && code != BFD_RELOC_SPARC_TLS_LDM_CALL)
   4176  1.3  christos     reloc->addend = fixp->fx_addnumber;
   4177  1.1     skrll   else if (symbol_section_p (fixp->fx_addsy))
   4178  1.1     skrll     reloc->addend = (section->vma
   4179  1.3  christos 		     + fixp->fx_addnumber
   4180  1.1     skrll 		     + md_pcrel_from (fixp));
   4181  1.1     skrll   else
   4182  1.1     skrll     reloc->addend = fixp->fx_offset;
   4183  1.1     skrll #endif
   4184  1.1     skrll 
   4185  1.1     skrll   /* We expand R_SPARC_OLO10 to R_SPARC_LO10 and R_SPARC_13
   4186  1.1     skrll      on the same location.  */
   4187  1.1     skrll   if (code == BFD_RELOC_SPARC_OLO10)
   4188  1.1     skrll     {
   4189  1.1     skrll       relocs[1] = reloc = XNEW (arelent);
   4190  1.1     skrll       relocs[2] = NULL;
   4191  1.1     skrll 
   4192  1.1     skrll       reloc->sym_ptr_ptr = XNEW (asymbol *);
   4193  1.1     skrll       *reloc->sym_ptr_ptr
   4194  1.1     skrll 	= symbol_get_bfdsym (section_symbol (absolute_section));
   4195  1.1     skrll       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   4196  1.1     skrll       reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_SPARC13);
   4197  1.1     skrll       reloc->addend = fixp->tc_fix_data;
   4198  1.1     skrll     }
   4199  1.1     skrll 
   4200  1.1     skrll   return relocs;
   4201  1.1     skrll }
   4202  1.1     skrll 
   4203  1.1     skrll /* We have no need to default values of symbols.  */
   4205  1.1     skrll 
   4206  1.1     skrll symbolS *
   4207  1.1     skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   4208  1.1     skrll {
   4209  1.1     skrll   return 0;
   4210  1.1     skrll }
   4211  1.1     skrll 
   4212  1.1     skrll /* Round up a section size to the appropriate boundary.  */
   4213  1.1     skrll 
   4214  1.1     skrll valueT
   4215  1.1     skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
   4216  1.1     skrll {
   4217  1.1     skrll #ifndef OBJ_ELF
   4218  1.1     skrll   /* This is not right for ELF; a.out wants it, and COFF will force
   4219  1.1     skrll      the alignment anyways.  */
   4220  1.1     skrll   valueT align = ((valueT) 1
   4221  1.1     skrll 		  << (valueT) bfd_get_section_alignment (stdoutput, segment));
   4222  1.1     skrll   valueT newsize;
   4223  1.1     skrll 
   4224  1.1     skrll   /* Turn alignment value into a mask.  */
   4225  1.1     skrll   align--;
   4226  1.1     skrll   newsize = (size + align) & ~align;
   4227  1.1     skrll   return newsize;
   4228  1.1     skrll #else
   4229  1.1     skrll   return size;
   4230  1.1     skrll #endif
   4231  1.1     skrll }
   4232  1.1     skrll 
   4233  1.1     skrll /* Exactly what point is a PC-relative offset relative TO?
   4234  1.1     skrll    On the sparc, they're relative to the address of the offset, plus
   4235  1.1     skrll    its size.  This gets us to the following instruction.
   4236  1.1     skrll    (??? Is this right?  FIXME-SOON)  */
   4237  1.1     skrll long
   4238  1.1     skrll md_pcrel_from (fixS *fixP)
   4239  1.1     skrll {
   4240  1.1     skrll   long ret;
   4241  1.1     skrll 
   4242  1.1     skrll   ret = fixP->fx_where + fixP->fx_frag->fr_address;
   4243  1.1     skrll   if (! sparc_pic_code
   4244  1.1     skrll       || fixP->fx_addsy == NULL
   4245  1.1     skrll       || symbol_section_p (fixP->fx_addsy))
   4246  1.1     skrll     ret += fixP->fx_size;
   4247  1.1     skrll   return ret;
   4248  1.1     skrll }
   4249  1.1     skrll 
   4250  1.1     skrll /* Return log2 (VALUE), or -1 if VALUE is not an exact positive power
   4252  1.1     skrll    of two.  */
   4253  1.1     skrll 
   4254  1.1     skrll static int
   4255  1.1     skrll mylog2 (int value)
   4256  1.1     skrll {
   4257  1.1     skrll   int shift;
   4258  1.1     skrll 
   4259  1.1     skrll   if (value <= 0)
   4260  1.1     skrll     return -1;
   4261  1.1     skrll 
   4262  1.1     skrll   for (shift = 0; (value & 1) == 0; value >>= 1)
   4263  1.1     skrll     ++shift;
   4264  1.1     skrll 
   4265  1.1     skrll   return (value == 1) ? shift : -1;
   4266  1.1     skrll }
   4267  1.1     skrll 
   4268  1.1     skrll /* Sort of like s_lcomm.  */
   4269  1.1     skrll 
   4270  1.2     joerg #ifndef OBJ_ELF
   4271  1.1     skrll static int max_alignment = 15;
   4272  1.1     skrll #endif
   4273  1.2     joerg 
   4274  1.1     skrll static void
   4275  1.1     skrll s_reserve (int ignore ATTRIBUTE_UNUSED)
   4276  1.1     skrll {
   4277  1.1     skrll   char *name;
   4278  1.1     skrll   char *p;
   4279  1.1     skrll   char c;
   4280  1.1     skrll   int align;
   4281  1.1     skrll   int size;
   4282  1.1     skrll   int temp;
   4283  1.1     skrll   symbolS *symbolP;
   4284  1.1     skrll 
   4285  1.1     skrll   c = get_symbol_name (&name);
   4286  1.1     skrll   p = input_line_pointer;
   4287  1.1     skrll   *p = c;
   4288  1.1     skrll   SKIP_WHITESPACE_AFTER_NAME ();
   4289  1.1     skrll 
   4290  1.1     skrll   if (*input_line_pointer != ',')
   4291  1.1     skrll     {
   4292  1.1     skrll       as_bad (_("Expected comma after name"));
   4293  1.1     skrll       ignore_rest_of_line ();
   4294  1.1     skrll       return;
   4295  1.1     skrll     }
   4296  1.1     skrll 
   4297  1.1     skrll   ++input_line_pointer;
   4298  1.1     skrll 
   4299  1.1     skrll   if ((size = get_absolute_expression ()) < 0)
   4300  1.1     skrll     {
   4301  1.1     skrll       as_bad (_("BSS length (%d.) <0! Ignored."), size);
   4302  1.1     skrll       ignore_rest_of_line ();
   4303  1.1     skrll       return;
   4304  1.1     skrll     }				/* Bad length.  */
   4305  1.1     skrll 
   4306  1.1     skrll   *p = 0;
   4307  1.1     skrll   symbolP = symbol_find_or_make (name);
   4308  1.1     skrll   *p = c;
   4309  1.1     skrll 
   4310  1.1     skrll   if (strncmp (input_line_pointer, ",\"bss\"", 6) != 0
   4311  1.1     skrll       && strncmp (input_line_pointer, ",\".bss\"", 7) != 0)
   4312  1.1     skrll     {
   4313  1.1     skrll       as_bad (_("bad .reserve segment -- expected BSS segment"));
   4314  1.1     skrll       return;
   4315  1.1     skrll     }
   4316  1.1     skrll 
   4317  1.1     skrll   if (input_line_pointer[2] == '.')
   4318  1.1     skrll     input_line_pointer += 7;
   4319  1.1     skrll   else
   4320  1.1     skrll     input_line_pointer += 6;
   4321  1.1     skrll   SKIP_WHITESPACE ();
   4322  1.1     skrll 
   4323  1.1     skrll   if (*input_line_pointer == ',')
   4324  1.1     skrll     {
   4325  1.1     skrll       ++input_line_pointer;
   4326  1.1     skrll 
   4327  1.1     skrll       SKIP_WHITESPACE ();
   4328  1.1     skrll       if (*input_line_pointer == '\n')
   4329  1.1     skrll 	{
   4330  1.1     skrll 	  as_bad (_("missing alignment"));
   4331  1.1     skrll 	  ignore_rest_of_line ();
   4332  1.1     skrll 	  return;
   4333  1.1     skrll 	}
   4334  1.1     skrll 
   4335  1.1     skrll       align = (int) get_absolute_expression ();
   4336  1.1     skrll 
   4337  1.1     skrll #ifndef OBJ_ELF
   4338  1.1     skrll       if (align > max_alignment)
   4339  1.1     skrll 	{
   4340  1.1     skrll 	  align = max_alignment;
   4341  1.1     skrll 	  as_warn (_("alignment too large; assuming %d"), align);
   4342  1.1     skrll 	}
   4343  1.1     skrll #endif
   4344  1.1     skrll 
   4345  1.1     skrll       if (align < 0)
   4346  1.1     skrll 	{
   4347  1.1     skrll 	  as_bad (_("negative alignment"));
   4348  1.1     skrll 	  ignore_rest_of_line ();
   4349  1.1     skrll 	  return;
   4350  1.1     skrll 	}
   4351  1.1     skrll 
   4352  1.1     skrll       if (align != 0)
   4353  1.1     skrll 	{
   4354  1.1     skrll 	  temp = mylog2 (align);
   4355  1.1     skrll 	  if (temp < 0)
   4356  1.1     skrll 	    {
   4357  1.1     skrll 	      as_bad (_("alignment not a power of 2"));
   4358  1.1     skrll 	      ignore_rest_of_line ();
   4359  1.1     skrll 	      return;
   4360  1.1     skrll 	    }
   4361  1.1     skrll 
   4362  1.1     skrll 	  align = temp;
   4363  1.1     skrll 	}
   4364  1.1     skrll 
   4365  1.1     skrll       record_alignment (bss_section, align);
   4366  1.1     skrll     }
   4367  1.1     skrll   else
   4368  1.1     skrll     align = 0;
   4369  1.1     skrll 
   4370  1.1     skrll   if (!S_IS_DEFINED (symbolP)
   4371  1.1     skrll #ifdef OBJ_AOUT
   4372  1.1     skrll       && S_GET_OTHER (symbolP) == 0
   4373  1.1     skrll       && S_GET_DESC (symbolP) == 0
   4374  1.1     skrll #endif
   4375  1.1     skrll       )
   4376  1.1     skrll     {
   4377  1.1     skrll       if (! need_pass_2)
   4378  1.1     skrll 	{
   4379  1.1     skrll 	  char *pfrag;
   4380  1.1     skrll 	  segT current_seg = now_seg;
   4381  1.1     skrll 	  subsegT current_subseg = now_subseg;
   4382  1.1     skrll 
   4383  1.1     skrll 	  /* Switch to bss.  */
   4384  1.1     skrll 	  subseg_set (bss_section, 1);
   4385  1.1     skrll 
   4386  1.1     skrll 	  if (align)
   4387  1.1     skrll 	    /* Do alignment.  */
   4388  1.1     skrll 	    frag_align (align, 0, 0);
   4389  1.1     skrll 
   4390  1.1     skrll 	  /* Detach from old frag.  */
   4391  1.1     skrll 	  if (S_GET_SEGMENT (symbolP) == bss_section)
   4392  1.1     skrll 	    symbol_get_frag (symbolP)->fr_symbol = NULL;
   4393  1.1     skrll 
   4394  1.1     skrll 	  symbol_set_frag (symbolP, frag_now);
   4395  1.2     joerg 	  pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
   4396  1.1     skrll 			    (offsetT) size, (char *) 0);
   4397  1.2     joerg 	  *pfrag = 0;
   4398  1.1     skrll 
   4399  1.1     skrll 	  S_SET_SEGMENT (symbolP, bss_section);
   4400  1.1     skrll 
   4401  1.1     skrll 	  subseg_set (current_seg, current_subseg);
   4402  1.1     skrll 
   4403  1.1     skrll #ifdef OBJ_ELF
   4404  1.1     skrll 	  S_SET_SIZE (symbolP, size);
   4405  1.1     skrll #endif
   4406  1.1     skrll 	}
   4407  1.1     skrll     }
   4408  1.1     skrll   else
   4409  1.1     skrll     {
   4410  1.1     skrll       as_warn (_("Ignoring attempt to re-define symbol %s"),
   4411  1.2     joerg 	       S_GET_NAME (symbolP));
   4412  1.1     skrll     }
   4413  1.1     skrll 
   4414  1.1     skrll   demand_empty_rest_of_line ();
   4415  1.2     joerg }
   4416  1.1     skrll 
   4417  1.1     skrll static void
   4418  1.1     skrll s_common (int ignore ATTRIBUTE_UNUSED)
   4419  1.1     skrll {
   4420  1.1     skrll   char *name;
   4421  1.1     skrll   char c;
   4422  1.1     skrll   char *p;
   4423  1.1     skrll   offsetT temp, size;
   4424  1.1     skrll   symbolS *symbolP;
   4425  1.1     skrll 
   4426  1.1     skrll   c = get_symbol_name (&name);
   4427  1.1     skrll   /* Just after name is now '\0'.  */
   4428  1.1     skrll   p = input_line_pointer;
   4429  1.1     skrll   *p = c;
   4430  1.1     skrll   SKIP_WHITESPACE_AFTER_NAME ();
   4431  1.1     skrll   if (*input_line_pointer != ',')
   4432  1.1     skrll     {
   4433  1.1     skrll       as_bad (_("Expected comma after symbol-name"));
   4434  1.1     skrll       ignore_rest_of_line ();
   4435  1.1     skrll       return;
   4436  1.1     skrll     }
   4437  1.1     skrll 
   4438  1.1     skrll   /* Skip ','.  */
   4439  1.1     skrll   input_line_pointer++;
   4440  1.1     skrll 
   4441  1.1     skrll   if ((temp = get_absolute_expression ()) < 0)
   4442  1.1     skrll     {
   4443  1.1     skrll       as_bad (_(".COMMon length (%lu) out of range ignored"),
   4444  1.1     skrll 	      (unsigned long) temp);
   4445  1.1     skrll       ignore_rest_of_line ();
   4446  1.1     skrll       return;
   4447  1.1     skrll     }
   4448  1.1     skrll   size = temp;
   4449  1.1     skrll   *p = 0;
   4450  1.1     skrll   symbolP = symbol_find_or_make (name);
   4451  1.1     skrll   *p = c;
   4452  1.1     skrll   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
   4453  1.1     skrll     {
   4454  1.1     skrll       as_bad (_("Ignoring attempt to re-define symbol"));
   4455  1.1     skrll       ignore_rest_of_line ();
   4456  1.1     skrll       return;
   4457  1.1     skrll     }
   4458  1.1     skrll   if (S_GET_VALUE (symbolP) != 0)
   4459  1.1     skrll     {
   4460  1.1     skrll       if (S_GET_VALUE (symbolP) != (valueT) size)
   4461  1.1     skrll 	{
   4462  1.1     skrll 	  as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
   4463  1.1     skrll 		   S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), (long) size);
   4464  1.1     skrll 	}
   4465  1.1     skrll     }
   4466  1.1     skrll   else
   4467  1.1     skrll     {
   4468  1.1     skrll #ifndef OBJ_ELF
   4469  1.1     skrll       S_SET_VALUE (symbolP, (valueT) size);
   4470  1.1     skrll       S_SET_EXTERNAL (symbolP);
   4471  1.1     skrll #endif
   4472  1.1     skrll     }
   4473  1.1     skrll   know (symbol_get_frag (symbolP) == &zero_address_frag);
   4474  1.1     skrll   if (*input_line_pointer != ',')
   4475  1.1     skrll     {
   4476  1.1     skrll       as_bad (_("Expected comma after common length"));
   4477  1.1     skrll       ignore_rest_of_line ();
   4478  1.1     skrll       return;
   4479  1.1     skrll     }
   4480  1.1     skrll   input_line_pointer++;
   4481  1.1     skrll   SKIP_WHITESPACE ();
   4482  1.1     skrll   if (*input_line_pointer != '"')
   4483  1.1     skrll     {
   4484  1.1     skrll       temp = get_absolute_expression ();
   4485  1.1     skrll 
   4486  1.1     skrll #ifndef OBJ_ELF
   4487  1.1     skrll       if (temp > max_alignment)
   4488  1.1     skrll 	{
   4489  1.1     skrll 	  temp = max_alignment;
   4490  1.1     skrll 	  as_warn (_("alignment too large; assuming %ld"), (long) temp);
   4491  1.1     skrll 	}
   4492  1.1     skrll #endif
   4493  1.1     skrll 
   4494  1.1     skrll       if (temp < 0)
   4495  1.1     skrll 	{
   4496  1.1     skrll 	  as_bad (_("negative alignment"));
   4497  1.1     skrll 	  ignore_rest_of_line ();
   4498  1.1     skrll 	  return;
   4499  1.1     skrll 	}
   4500  1.1     skrll 
   4501  1.1     skrll #ifdef OBJ_ELF
   4502  1.1     skrll       if (symbol_get_obj (symbolP)->local)
   4503  1.1     skrll 	{
   4504  1.1     skrll 	  segT old_sec;
   4505  1.1     skrll 	  int old_subsec;
   4506  1.1     skrll 	  int align;
   4507  1.1     skrll 
   4508  1.1     skrll 	  old_sec = now_seg;
   4509  1.1     skrll 	  old_subsec = now_subseg;
   4510  1.1     skrll 
   4511  1.1     skrll 	  if (temp == 0)
   4512  1.1     skrll 	    align = 0;
   4513  1.1     skrll 	  else
   4514  1.1     skrll 	    align = mylog2 (temp);
   4515  1.1     skrll 
   4516  1.1     skrll 	  if (align < 0)
   4517  1.1     skrll 	    {
   4518  1.1     skrll 	      as_bad (_("alignment not a power of 2"));
   4519  1.1     skrll 	      ignore_rest_of_line ();
   4520  1.1     skrll 	      return;
   4521  1.1     skrll 	    }
   4522  1.1     skrll 
   4523  1.1     skrll 	  record_alignment (bss_section, align);
   4524  1.1     skrll 	  subseg_set (bss_section, 0);
   4525  1.1     skrll 	  if (align)
   4526  1.1     skrll 	    frag_align (align, 0, 0);
   4527  1.1     skrll 	  if (S_GET_SEGMENT (symbolP) == bss_section)
   4528  1.1     skrll 	    symbol_get_frag (symbolP)->fr_symbol = 0;
   4529  1.1     skrll 	  symbol_set_frag (symbolP, frag_now);
   4530  1.1     skrll 	  p = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
   4531  1.1     skrll 			(offsetT) size, (char *) 0);
   4532  1.1     skrll 	  *p = 0;
   4533  1.1     skrll 	  S_SET_SEGMENT (symbolP, bss_section);
   4534  1.1     skrll 	  S_CLEAR_EXTERNAL (symbolP);
   4535  1.1     skrll 	  S_SET_SIZE (symbolP, size);
   4536  1.1     skrll 	  subseg_set (old_sec, old_subsec);
   4537  1.1     skrll 	}
   4538  1.1     skrll       else
   4539  1.1     skrll #endif /* OBJ_ELF  */
   4540  1.1     skrll 	{
   4541  1.1     skrll 	allocate_common:
   4542  1.1     skrll 	  S_SET_VALUE (symbolP, (valueT) size);
   4543  1.1     skrll #ifdef OBJ_ELF
   4544  1.1     skrll 	  S_SET_ALIGN (symbolP, temp);
   4545  1.1     skrll 	  S_SET_SIZE (symbolP, size);
   4546  1.1     skrll #endif
   4547  1.1     skrll 	  S_SET_EXTERNAL (symbolP);
   4548  1.1     skrll 	  S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
   4549  1.1     skrll 	}
   4550  1.1     skrll     }
   4551  1.1     skrll   else
   4552  1.1     skrll     {
   4553  1.1     skrll       input_line_pointer++;
   4554  1.1     skrll       /* @@ Some use the dot, some don't.  Can we get some consistency??  */
   4555  1.1     skrll       if (*input_line_pointer == '.')
   4556  1.1     skrll 	input_line_pointer++;
   4557  1.1     skrll       /* @@ Some say data, some say bss.  */
   4558  1.1     skrll       if (strncmp (input_line_pointer, "bss\"", 4)
   4559  1.1     skrll 	  && strncmp (input_line_pointer, "data\"", 5))
   4560  1.1     skrll 	{
   4561  1.1     skrll 	  while (*--input_line_pointer != '"')
   4562  1.1     skrll 	    ;
   4563  1.1     skrll 	  input_line_pointer--;
   4564  1.1     skrll 	  goto bad_common_segment;
   4565  1.1     skrll 	}
   4566  1.1     skrll       while (*input_line_pointer++ != '"')
   4567  1.1     skrll 	;
   4568  1.1     skrll       goto allocate_common;
   4569  1.1     skrll     }
   4570  1.1     skrll 
   4571  1.1     skrll   symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
   4572  1.1     skrll 
   4573  1.1     skrll   demand_empty_rest_of_line ();
   4574  1.1     skrll   return;
   4575  1.1     skrll 
   4576  1.1     skrll   {
   4577  1.1     skrll   bad_common_segment:
   4578  1.1     skrll     p = input_line_pointer;
   4579  1.1     skrll     while (*p && *p != '\n')
   4580  1.1     skrll       p++;
   4581  1.1     skrll     c = *p;
   4582  1.1     skrll     *p = '\0';
   4583  1.1     skrll     as_bad (_("bad .common segment %s"), input_line_pointer + 1);
   4584  1.1     skrll     *p = c;
   4585  1.1     skrll     input_line_pointer = p;
   4586  1.1     skrll     ignore_rest_of_line ();
   4587  1.1     skrll     return;
   4588  1.1     skrll   }
   4589  1.1     skrll }
   4590  1.1     skrll 
   4591  1.1     skrll /* Handle the .empty pseudo-op.  This suppresses the warnings about
   4592  1.1     skrll    invalid delay slot usage.  */
   4593  1.1     skrll 
   4594  1.1     skrll static void
   4595  1.1     skrll s_empty (int ignore ATTRIBUTE_UNUSED)
   4596  1.1     skrll {
   4597  1.1     skrll   /* The easy way to implement is to just forget about the last
   4598  1.1     skrll      instruction.  */
   4599  1.1     skrll   last_insn = NULL;
   4600  1.1     skrll }
   4601  1.1     skrll 
   4602  1.1     skrll static void
   4603  1.1     skrll s_seg (int ignore ATTRIBUTE_UNUSED)
   4604  1.1     skrll {
   4605  1.1     skrll 
   4606  1.1     skrll   if (strncmp (input_line_pointer, "\"text\"", 6) == 0)
   4607  1.1     skrll     {
   4608  1.1     skrll       input_line_pointer += 6;
   4609  1.1     skrll       s_text (0);
   4610  1.1     skrll       return;
   4611  1.1     skrll     }
   4612  1.1     skrll   if (strncmp (input_line_pointer, "\"data\"", 6) == 0)
   4613  1.1     skrll     {
   4614  1.1     skrll       input_line_pointer += 6;
   4615  1.1     skrll       s_data (0);
   4616  1.1     skrll       return;
   4617  1.1     skrll     }
   4618  1.1     skrll   if (strncmp (input_line_pointer, "\"data1\"", 7) == 0)
   4619  1.1     skrll     {
   4620  1.1     skrll       input_line_pointer += 7;
   4621  1.1     skrll       s_data1 ();
   4622  1.1     skrll       return;
   4623  1.1     skrll     }
   4624  1.1     skrll   if (strncmp (input_line_pointer, "\"bss\"", 5) == 0)
   4625  1.1     skrll     {
   4626  1.1     skrll       input_line_pointer += 5;
   4627  1.1     skrll       /* We only support 2 segments -- text and data -- for now, so
   4628  1.1     skrll 	 things in the "bss segment" will have to go into data for now.
   4629  1.1     skrll 	 You can still allocate SEG_BSS stuff with .lcomm or .reserve.  */
   4630  1.1     skrll       subseg_set (data_section, 255);	/* FIXME-SOMEDAY.  */
   4631  1.1     skrll       return;
   4632  1.1     skrll     }
   4633  1.1     skrll   as_bad (_("Unknown segment type"));
   4634  1.1     skrll   demand_empty_rest_of_line ();
   4635  1.1     skrll }
   4636  1.1     skrll 
   4637  1.1     skrll static void
   4638  1.1     skrll s_data1 (void)
   4639  1.1     skrll {
   4640  1.1     skrll   subseg_set (data_section, 1);
   4641  1.1     skrll   demand_empty_rest_of_line ();
   4642  1.1     skrll }
   4643  1.1     skrll 
   4644  1.1     skrll static void
   4645  1.1     skrll s_proc (int ignore ATTRIBUTE_UNUSED)
   4646  1.1     skrll {
   4647  1.1     skrll   while (!is_end_of_line[(unsigned char) *input_line_pointer])
   4648  1.1     skrll     {
   4649  1.1     skrll       ++input_line_pointer;
   4650  1.1     skrll     }
   4651  1.1     skrll   ++input_line_pointer;
   4652  1.1     skrll }
   4653  1.1     skrll 
   4654  1.1     skrll /* This static variable is set by s_uacons to tell sparc_cons_align
   4655  1.1     skrll    that the expression does not need to be aligned.  */
   4656  1.1     skrll 
   4657  1.1     skrll static int sparc_no_align_cons = 0;
   4658  1.1     skrll 
   4659  1.1     skrll /* This handles the unaligned space allocation pseudo-ops, such as
   4660  1.1     skrll    .uaword.  .uaword is just like .word, but the value does not need
   4661  1.1     skrll    to be aligned.  */
   4662  1.1     skrll 
   4663  1.1     skrll static void
   4664  1.1     skrll s_uacons (int bytes)
   4665  1.1     skrll {
   4666  1.1     skrll   /* Tell sparc_cons_align not to align this value.  */
   4667  1.1     skrll   sparc_no_align_cons = 1;
   4668  1.1     skrll   cons (bytes);
   4669  1.1     skrll   sparc_no_align_cons = 0;
   4670  1.1     skrll }
   4671  1.1     skrll 
   4672  1.1     skrll /* This handles the native word allocation pseudo-op .nword.
   4673  1.1     skrll    For sparc_arch_size 32 it is equivalent to .word,  for
   4674  1.1     skrll    sparc_arch_size 64 it is equivalent to .xword.  */
   4675  1.1     skrll 
   4676  1.1     skrll static void
   4677  1.1     skrll s_ncons (int bytes ATTRIBUTE_UNUSED)
   4678  1.1     skrll {
   4679  1.1     skrll   cons (sparc_arch_size == 32 ? 4 : 8);
   4680  1.1     skrll }
   4681  1.2     joerg 
   4682  1.1     skrll #ifdef OBJ_ELF
   4683  1.1     skrll /* Handle the SPARC ELF .register pseudo-op.  This sets the binding of a
   4684  1.1     skrll    global register.
   4685  1.1     skrll    The syntax is:
   4686  1.1     skrll 
   4687  1.1     skrll    .register %g[2367],{#scratch|symbolname|#ignore}
   4688  1.1     skrll */
   4689  1.1     skrll 
   4690  1.1     skrll static void
   4691  1.1     skrll s_register (int ignore ATTRIBUTE_UNUSED)
   4692  1.1     skrll {
   4693  1.1     skrll   char c;
   4694  1.1     skrll   int reg;
   4695  1.2     joerg   int flags;
   4696  1.1     skrll   char *regname;
   4697  1.1     skrll 
   4698  1.1     skrll   if (input_line_pointer[0] != '%'
   4699  1.1     skrll       || input_line_pointer[1] != 'g'
   4700  1.1     skrll       || ((input_line_pointer[2] & ~1) != '2'
   4701  1.3  christos 	  && (input_line_pointer[2] & ~1) != '6')
   4702  1.1     skrll       || input_line_pointer[3] != ',')
   4703  1.1     skrll     as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
   4704  1.1     skrll   reg = input_line_pointer[2] - '0';
   4705  1.2     joerg   input_line_pointer += 4;
   4706  1.1     skrll 
   4707  1.2     joerg   if (*input_line_pointer == '#')
   4708  1.1     skrll     {
   4709  1.1     skrll       ++input_line_pointer;
   4710  1.1     skrll       c = get_symbol_name (&regname);
   4711  1.1     skrll       if (strcmp (regname, "scratch") && strcmp (regname, "ignore"))
   4712  1.1     skrll 	as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
   4713  1.1     skrll       if (regname[0] == 'i')
   4714  1.1     skrll 	regname = NULL;
   4715  1.1     skrll       else
   4716  1.1     skrll 	regname = (char *) "";
   4717  1.1     skrll     }
   4718  1.1     skrll   else
   4719  1.1     skrll     {
   4720  1.1     skrll       c = get_symbol_name (&regname);
   4721  1.1     skrll     }
   4722  1.1     skrll 
   4723  1.1     skrll   if (sparc_arch_size == 64)
   4724  1.1     skrll     {
   4725  1.1     skrll       if (globals[reg])
   4726  1.1     skrll 	{
   4727  1.1     skrll 	  if ((regname && globals[reg] != (symbolS *) 1
   4728  1.1     skrll 	       && strcmp (S_GET_NAME (globals[reg]), regname))
   4729  1.1     skrll 	      || ((regname != NULL) ^ (globals[reg] != (symbolS *) 1)))
   4730  1.1     skrll 	    as_bad (_("redefinition of global register"));
   4731  1.1     skrll 	}
   4732  1.1     skrll       else
   4733  1.1     skrll 	{
   4734  1.1     skrll 	  if (regname == NULL)
   4735  1.1     skrll 	    globals[reg] = (symbolS *) 1;
   4736  1.1     skrll 	  else
   4737  1.1     skrll 	    {
   4738  1.1     skrll 	      if (*regname)
   4739  1.1     skrll 		{
   4740  1.1     skrll 		  if (symbol_find (regname))
   4741  1.1     skrll 		    as_bad (_("Register symbol %s already defined."),
   4742  1.1     skrll 			    regname);
   4743  1.1     skrll 		}
   4744  1.1     skrll 	      globals[reg] = symbol_make (regname);
   4745  1.1     skrll 	      flags = symbol_get_bfdsym (globals[reg])->flags;
   4746  1.1     skrll 	      if (! *regname)
   4747  1.1     skrll 		flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK);
   4748  1.1     skrll 	      if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK)))
   4749  1.1     skrll 		flags |= BSF_GLOBAL;
   4750  1.1     skrll 	      symbol_get_bfdsym (globals[reg])->flags = flags;
   4751  1.1     skrll 	      S_SET_VALUE (globals[reg], (valueT) reg);
   4752  1.1     skrll 	      S_SET_ALIGN (globals[reg], reg);
   4753  1.1     skrll 	      S_SET_SIZE (globals[reg], 0);
   4754  1.2     joerg 	      /* Although we actually want undefined_section here,
   4755  1.1     skrll 		 we have to use absolute_section, because otherwise
   4756  1.1     skrll 		 generic as code will make it a COM section.
   4757  1.1     skrll 		 We fix this up in sparc_adjust_symtab.  */
   4758  1.1     skrll 	      S_SET_SEGMENT (globals[reg], absolute_section);
   4759  1.1     skrll 	      S_SET_OTHER (globals[reg], 0);
   4760  1.1     skrll 	      elf_symbol (symbol_get_bfdsym (globals[reg]))
   4761  1.1     skrll 		->internal_elf_sym.st_info =
   4762  1.1     skrll 		  ELF_ST_INFO(STB_GLOBAL, STT_REGISTER);
   4763  1.1     skrll 	      elf_symbol (symbol_get_bfdsym (globals[reg]))
   4764  1.1     skrll 		->internal_elf_sym.st_shndx = SHN_UNDEF;
   4765  1.1     skrll 	    }
   4766  1.1     skrll 	}
   4767  1.1     skrll     }
   4768  1.1     skrll 
   4769  1.1     skrll   (void) restore_line_pointer (c);
   4770  1.1     skrll 
   4771  1.1     skrll   demand_empty_rest_of_line ();
   4772  1.1     skrll }
   4773  1.1     skrll 
   4774  1.1     skrll /* Adjust the symbol table.  We set undefined sections for STT_REGISTER
   4775  1.1     skrll    symbols which need it.  */
   4776  1.1     skrll 
   4777  1.1     skrll void
   4778  1.1     skrll sparc_adjust_symtab (void)
   4779  1.1     skrll {
   4780  1.1     skrll   symbolS *sym;
   4781  1.1     skrll 
   4782  1.1     skrll   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
   4783  1.1     skrll     {
   4784  1.1     skrll       if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym))
   4785  1.1     skrll 		       ->internal_elf_sym.st_info) != STT_REGISTER)
   4786  1.1     skrll 	continue;
   4787  1.1     skrll 
   4788  1.1     skrll       if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym))
   4789  1.1     skrll 		       ->internal_elf_sym.st_shndx != SHN_UNDEF))
   4790  1.1     skrll 	continue;
   4791  1.1     skrll 
   4792  1.1     skrll       S_SET_SEGMENT (sym, undefined_section);
   4793  1.1     skrll     }
   4794  1.1     skrll }
   4795  1.1     skrll #endif
   4796  1.1     skrll 
   4797  1.1     skrll /* If the --enforce-aligned-data option is used, we require .word,
   4798  1.1     skrll    et. al., to be aligned correctly.  We do it by setting up an
   4799  1.1     skrll    rs_align_code frag, and checking in HANDLE_ALIGN to make sure that
   4800  1.1     skrll    no unexpected alignment was introduced.
   4801  1.1     skrll 
   4802  1.1     skrll    The SunOS and Solaris native assemblers enforce aligned data by
   4803  1.1     skrll    default.  We don't want to do that, because gcc can deliberately
   4804  1.1     skrll    generate misaligned data if the packed attribute is used.  Instead,
   4805  1.1     skrll    we permit misaligned data by default, and permit the user to set an
   4806  1.1     skrll    option to check for it.  */
   4807  1.1     skrll 
   4808  1.1     skrll void
   4809  1.1     skrll sparc_cons_align (int nbytes)
   4810  1.2     joerg {
   4811  1.1     skrll   int nalign;
   4812  1.1     skrll 
   4813  1.1     skrll   /* Only do this if we are enforcing aligned data.  */
   4814  1.1     skrll   if (! enforce_aligned_data)
   4815  1.1     skrll     return;
   4816  1.1     skrll 
   4817  1.1     skrll   /* Don't align if this is an unaligned pseudo-op.  */
   4818  1.1     skrll   if (sparc_no_align_cons)
   4819  1.2     joerg     return;
   4820  1.2     joerg 
   4821  1.1     skrll   nalign = mylog2 (nbytes);
   4822  1.1     skrll   if (nalign == 0)
   4823  1.1     skrll     return;
   4824  1.1     skrll 
   4825  1.1     skrll   gas_assert (nalign > 0);
   4826  1.1     skrll 
   4827  1.1     skrll   if (now_seg == absolute_section)
   4828  1.1     skrll     {
   4829  1.1     skrll       if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
   4830  1.1     skrll 	as_bad (_("misaligned data"));
   4831  1.1     skrll       return;
   4832  1.1     skrll     }
   4833  1.1     skrll 
   4834  1.1     skrll   frag_var (rs_align_test, 1, 1, (relax_substateT) 0,
   4835  1.1     skrll 	    (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
   4836  1.1     skrll 
   4837  1.1     skrll   record_alignment (now_seg, nalign);
   4838  1.1     skrll }
   4839  1.1     skrll 
   4840  1.1     skrll /* This is called from HANDLE_ALIGN in tc-sparc.h.  */
   4841  1.1     skrll 
   4842  1.1     skrll void
   4843  1.1     skrll sparc_handle_align (fragS *fragp)
   4844  1.1     skrll {
   4845  1.1     skrll   int count, fix;
   4846  1.1     skrll   char *p;
   4847  1.1     skrll 
   4848  1.1     skrll   count = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
   4849  1.1     skrll 
   4850  1.1     skrll   switch (fragp->fr_type)
   4851  1.1     skrll     {
   4852  1.1     skrll     case rs_align_test:
   4853  1.1     skrll       if (count != 0)
   4854  1.1     skrll 	as_bad_where (fragp->fr_file, fragp->fr_line, _("misaligned data"));
   4855  1.1     skrll       break;
   4856  1.1     skrll 
   4857  1.1     skrll     case rs_align_code:
   4858  1.1     skrll       p = fragp->fr_literal + fragp->fr_fix;
   4859  1.1     skrll       fix = 0;
   4860  1.1     skrll 
   4861  1.1     skrll       if (count & 3)
   4862  1.1     skrll 	{
   4863  1.1     skrll 	  fix = count & 3;
   4864  1.1     skrll 	  memset (p, 0, fix);
   4865  1.1     skrll 	  p += fix;
   4866  1.1     skrll 	  count -= fix;
   4867  1.1     skrll 	}
   4868  1.1     skrll 
   4869  1.1     skrll       if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8)
   4870  1.1     skrll 	{
   4871  1.1     skrll 	  unsigned wval = (0x30680000 | count >> 2); /* ba,a,pt %xcc, 1f  */
   4872  1.1     skrll 	  if (INSN_BIG_ENDIAN)
   4873  1.1     skrll 	    number_to_chars_bigendian (p, wval, 4);
   4874  1.1     skrll 	  else
   4875  1.1     skrll 	    number_to_chars_littleendian (p, wval, 4);
   4876  1.1     skrll 	  p += 4;
   4877  1.1     skrll 	  count -= 4;
   4878  1.1     skrll 	  fix += 4;
   4879  1.1     skrll 	}
   4880  1.1     skrll 
   4881  1.1     skrll       if (INSN_BIG_ENDIAN)
   4882  1.1     skrll 	number_to_chars_bigendian (p, 0x01000000, 4);
   4883  1.1     skrll       else
   4884  1.1     skrll 	number_to_chars_littleendian (p, 0x01000000, 4);
   4885  1.1     skrll 
   4886  1.1     skrll       fragp->fr_fix += fix;
   4887  1.1     skrll       fragp->fr_var = 4;
   4888  1.1     skrll       break;
   4889  1.1     skrll 
   4890  1.1     skrll     default:
   4891  1.1     skrll       break;
   4892  1.1     skrll     }
   4893  1.1     skrll }
   4894  1.1     skrll 
   4895  1.1     skrll #ifdef OBJ_ELF
   4896  1.1     skrll /* Some special processing for a Sparc ELF file.  */
   4897  1.1     skrll 
   4898  1.1     skrll void
   4899  1.1     skrll sparc_elf_final_processing (void)
   4900  1.1     skrll {
   4901  1.1     skrll   /* Set the Sparc ELF flag bits.  FIXME: There should probably be some
   4902  1.1     skrll      sort of BFD interface for this.  */
   4903  1.1     skrll   if (sparc_arch_size == 64)
   4904  1.1     skrll     {
   4905  1.1     skrll       switch (sparc_memory_model)
   4906  1.1     skrll 	{
   4907  1.1     skrll 	case MM_RMO:
   4908  1.1     skrll 	  elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_RMO;
   4909  1.1     skrll 	  break;
   4910  1.2     joerg 	case MM_PSO:
   4911  1.1     skrll 	  elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_PSO;
   4912  1.1     skrll 	  break;
   4913  1.1     skrll 	default:
   4914  1.2     joerg 	  break;
   4915  1.1     skrll 	}
   4916  1.1     skrll     }
   4917  1.1     skrll   else if (current_architecture >= SPARC_OPCODE_ARCH_V9)
   4918  1.1     skrll     elf_elfheader (stdoutput)->e_flags |= EF_SPARC_32PLUS;
   4919  1.1     skrll   if (current_architecture == SPARC_OPCODE_ARCH_V9A)
   4920  1.1     skrll     elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1;
   4921  1.1     skrll   else if (current_architecture == SPARC_OPCODE_ARCH_V9B)
   4922  1.1     skrll     elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1|EF_SPARC_SUN_US3;
   4923  1.1     skrll }
   4924  1.1     skrll 
   4925  1.1     skrll const char *
   4926  1.1     skrll sparc_cons (expressionS *exp, int size)
   4927  1.1     skrll {
   4928  1.1     skrll   char *save;
   4929  1.1     skrll   const char *sparc_cons_special_reloc = NULL;
   4930  1.1     skrll 
   4931  1.1     skrll   SKIP_WHITESPACE ();
   4932  1.1     skrll   save = input_line_pointer;
   4933  1.1     skrll   if (input_line_pointer[0] == '%'
   4934  1.1     skrll       && input_line_pointer[1] == 'r'
   4935  1.1     skrll       && input_line_pointer[2] == '_')
   4936  1.1     skrll     {
   4937  1.1     skrll       if (strncmp (input_line_pointer + 3, "disp", 4) == 0)
   4938  1.1     skrll 	{
   4939  1.1     skrll 	  input_line_pointer += 7;
   4940  1.1     skrll 	  sparc_cons_special_reloc = "disp";
   4941  1.1     skrll 	}
   4942  1.1     skrll       else if (strncmp (input_line_pointer + 3, "plt", 3) == 0)
   4943  1.1     skrll 	{
   4944  1.1     skrll 	  if (size != 4 && size != 8)
   4945  1.1     skrll 	    as_bad (_("Illegal operands: %%r_plt in %d-byte data field"), size);
   4946  1.1     skrll 	  else
   4947  1.1     skrll 	    {
   4948  1.1     skrll 	      input_line_pointer += 6;
   4949  1.1     skrll 	      sparc_cons_special_reloc = "plt";
   4950  1.1     skrll 	    }
   4951  1.1     skrll 	}
   4952  1.1     skrll       else if (strncmp (input_line_pointer + 3, "tls_dtpoff", 10) == 0)
   4953  1.1     skrll 	{
   4954  1.1     skrll 	  if (size != 4 && size != 8)
   4955  1.1     skrll 	    as_bad (_("Illegal operands: %%r_tls_dtpoff in %d-byte data field"), size);
   4956  1.1     skrll 	  else
   4957  1.1     skrll 	    {
   4958  1.1     skrll 	      input_line_pointer += 13;
   4959  1.1     skrll 	      sparc_cons_special_reloc = "tls_dtpoff";
   4960  1.1     skrll 	    }
   4961  1.1     skrll 	}
   4962  1.1     skrll       if (sparc_cons_special_reloc)
   4963  1.1     skrll 	{
   4964  1.1     skrll 	  int bad = 0;
   4965  1.1     skrll 
   4966  1.1     skrll 	  switch (size)
   4967  1.1     skrll 	    {
   4968  1.1     skrll 	    case 1:
   4969  1.1     skrll 	      if (*input_line_pointer != '8')
   4970  1.1     skrll 		bad = 1;
   4971  1.1     skrll 	      input_line_pointer--;
   4972  1.1     skrll 	      break;
   4973  1.1     skrll 	    case 2:
   4974  1.1     skrll 	      if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6')
   4975  1.1     skrll 		bad = 1;
   4976  1.1     skrll 	      break;
   4977  1.1     skrll 	    case 4:
   4978  1.1     skrll 	      if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2')
   4979  1.1     skrll 		bad = 1;
   4980  1.1     skrll 	      break;
   4981  1.1     skrll 	    case 8:
   4982  1.1     skrll 	      if (input_line_pointer[0] != '6' || input_line_pointer[1] != '4')
   4983  1.1     skrll 		bad = 1;
   4984  1.1     skrll 	      break;
   4985  1.1     skrll 	    default:
   4986  1.1     skrll 	      bad = 1;
   4987  1.1     skrll 	      break;
   4988  1.1     skrll 	    }
   4989  1.1     skrll 
   4990  1.1     skrll 	  if (bad)
   4991  1.1     skrll 	    {
   4992  1.1     skrll 	      as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
   4993  1.1     skrll 		      sparc_cons_special_reloc, size * 8, size);
   4994  1.1     skrll 	    }
   4995  1.1     skrll 	  else
   4996  1.1     skrll 	    {
   4997  1.1     skrll 	      input_line_pointer += 2;
   4998  1.1     skrll 	      if (*input_line_pointer != '(')
   4999  1.1     skrll 		{
   5000  1.1     skrll 		  as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
   5001  1.1     skrll 			  sparc_cons_special_reloc, size * 8);
   5002  1.1     skrll 		  bad = 1;
   5003  1.1     skrll 		}
   5004  1.1     skrll 	    }
   5005  1.1     skrll 
   5006  1.1     skrll 	  if (bad)
   5007  1.1     skrll 	    {
   5008  1.1     skrll 	      input_line_pointer = save;
   5009  1.1     skrll 	      sparc_cons_special_reloc = NULL;
   5010  1.1     skrll 	    }
   5011  1.1     skrll 	  else
   5012  1.1     skrll 	    {
   5013  1.1     skrll 	      int c;
   5014  1.1     skrll 	      char *end = ++input_line_pointer;
   5015  1.1     skrll 	      int npar = 0;
   5016  1.1     skrll 
   5017  1.1     skrll 	      while (! is_end_of_line[(c = *end)])
   5018  1.1     skrll 		{
   5019  1.1     skrll 		  if (c == '(')
   5020  1.1     skrll 	  	    npar++;
   5021  1.1     skrll 		  else if (c == ')')
   5022  1.1     skrll 	  	    {
   5023  1.1     skrll 		      if (!npar)
   5024  1.1     skrll 	      		break;
   5025  1.1     skrll 		      npar--;
   5026  1.1     skrll 		    }
   5027  1.1     skrll 	    	  end++;
   5028  1.1     skrll 		}
   5029  1.1     skrll 
   5030  1.1     skrll 	      if (c != ')')
   5031  1.1     skrll 		as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
   5032  1.1     skrll 			sparc_cons_special_reloc, size * 8);
   5033  1.1     skrll 	      else
   5034  1.1     skrll 		{
   5035  1.1     skrll 		  *end = '\0';
   5036  1.1     skrll 		  expression (exp);
   5037  1.1     skrll 		  *end = c;
   5038  1.1     skrll 		  if (input_line_pointer != end)
   5039  1.1     skrll 		    {
   5040  1.1     skrll 		      as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
   5041  1.1     skrll 			      sparc_cons_special_reloc, size * 8);
   5042  1.1     skrll 		    }
   5043  1.2     joerg 		  else
   5044  1.1     skrll 		    {
   5045  1.1     skrll 		      input_line_pointer++;
   5046  1.1     skrll 		      SKIP_WHITESPACE ();
   5047  1.1     skrll 		      c = *input_line_pointer;
   5048  1.1     skrll 		      if (! is_end_of_line[c] && c != ',')
   5049  1.1     skrll 			as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
   5050  1.1     skrll 			        sparc_cons_special_reloc, size * 8);
   5051  1.1     skrll 		    }
   5052  1.1     skrll 		}
   5053  1.1     skrll 	    }
   5054  1.1     skrll 	}
   5055  1.1     skrll     }
   5056  1.2     joerg   if (sparc_cons_special_reloc == NULL)
   5057  1.2     joerg     expression (exp);
   5058  1.1     skrll   return sparc_cons_special_reloc;
   5059  1.1     skrll }
   5060  1.1     skrll 
   5061  1.1     skrll #endif
   5062  1.1     skrll 
   5063  1.1     skrll /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
   5064  1.1     skrll    reloc for a cons.  We could use the definition there, except that
   5065  1.1     skrll    we want to handle little endian relocs specially.  */
   5066  1.1     skrll 
   5067  1.1     skrll void
   5068  1.1     skrll cons_fix_new_sparc (fragS *frag,
   5069  1.1     skrll 		    int where,
   5070  1.4  christos 		    unsigned int nbytes,
   5071  1.4  christos 		    expressionS *exp,
   5072  1.4  christos 		    const char *sparc_cons_special_reloc)
   5073  1.4  christos {
   5074  1.4  christos   bfd_reloc_code_real_type r;
   5075  1.4  christos 
   5076  1.4  christos   r = (nbytes == 1 ? BFD_RELOC_8 :
   5077  1.4  christos        (nbytes == 2 ? BFD_RELOC_16 :
   5078  1.4  christos 	(nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64)));
   5079  1.1     skrll 
   5080  1.1     skrll   if (target_little_endian_data
   5081  1.1     skrll       && nbytes == 4
   5082  1.1     skrll       && now_seg->flags & SEC_ALLOC)
   5083  1.1     skrll     r = BFD_RELOC_SPARC_REV32;
   5084  1.1     skrll 
   5085  1.1     skrll #ifdef TE_SOLARIS
   5086  1.1     skrll   /* The Solaris linker does not allow R_SPARC_UA64
   5087  1.1     skrll      relocations for 32-bit executables.  */
   5088  1.1     skrll   if (!target_little_endian_data
   5089  1.1     skrll       && sparc_arch_size != 64
   5090  1.1     skrll       && r == BFD_RELOC_64)
   5091  1.1     skrll     r = BFD_RELOC_32;
   5092  1.1     skrll #endif
   5093  1.1     skrll 
   5094  1.1     skrll   if (sparc_cons_special_reloc)
   5095  1.1     skrll     {
   5096  1.1     skrll       if (*sparc_cons_special_reloc == 'd')
   5097  1.1     skrll 	switch (nbytes)
   5098  1.1     skrll 	  {
   5099  1.1     skrll 	  case 1: r = BFD_RELOC_8_PCREL; break;
   5100  1.1     skrll 	  case 2: r = BFD_RELOC_16_PCREL; break;
   5101  1.1     skrll 	  case 4: r = BFD_RELOC_32_PCREL; break;
   5102  1.1     skrll 	  case 8: r = BFD_RELOC_64_PCREL; break;
   5103  1.4  christos 	  default: abort ();
   5104  1.4  christos 	  }
   5105  1.4  christos       else if (*sparc_cons_special_reloc == 'p')
   5106  1.4  christos 	switch (nbytes)
   5107  1.1     skrll 	  {
   5108  1.1     skrll 	  case 4: r = BFD_RELOC_SPARC_PLT32; break;
   5109  1.1     skrll 	  case 8: r = BFD_RELOC_SPARC_PLT64; break;
   5110  1.1     skrll 	  }
   5111  1.1     skrll       else
   5112  1.4  christos 	switch (nbytes)
   5113  1.4  christos 	  {
   5114  1.4  christos 	  case 4: r = BFD_RELOC_SPARC_TLS_DTPOFF32; break;
   5115  1.4  christos 	  case 8: r = BFD_RELOC_SPARC_TLS_DTPOFF64; break;
   5116  1.4  christos 	  }
   5117  1.4  christos     }
   5118  1.1     skrll   else if (sparc_no_align_cons
   5119  1.4  christos 	   || /* PR 20803 - relocs in the .eh_frame section
   5120  1.1     skrll 		 need to support unaligned access.  */
   5121  1.1     skrll 	   strcmp (now_seg->name, ".eh_frame") == 0)
   5122  1.1     skrll     {
   5123  1.1     skrll       switch (nbytes)
   5124  1.1     skrll 	{
   5125  1.1     skrll 	case 2: r = BFD_RELOC_SPARC_UA16; break;
   5126  1.1     skrll 	case 4: r = BFD_RELOC_SPARC_UA32; break;
   5127  1.1     skrll #ifdef TE_SOLARIS
   5128  1.1     skrll         /* The Solaris linker does not allow R_SPARC_UA64
   5129  1.1     skrll 	   relocations for 32-bit executables.  */
   5130  1.1     skrll         case 8: r = sparc_arch_size == 64 ?
   5131  1.1     skrll                     BFD_RELOC_SPARC_UA64 : BFD_RELOC_SPARC_UA32; break;
   5132  1.1     skrll #else
   5133  1.1     skrll 	case 8: r = BFD_RELOC_SPARC_UA64; break;
   5134  1.1     skrll #endif
   5135  1.1     skrll 	default: abort ();
   5136  1.3  christos 	}
   5137  1.3  christos    }
   5138  1.1     skrll 
   5139  1.1     skrll   fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
   5140  1.1     skrll }
   5141  1.1     skrll 
   5142  1.3  christos void
   5143  1.3  christos sparc_cfi_frame_initial_instructions (void)
   5144  1.3  christos {
   5145  1.3  christos   cfi_add_CFA_def_cfa (14, sparc_arch_size == 64 ? 0x7ff : 0);
   5146  1.3  christos }
   5147  1.3  christos 
   5148  1.3  christos int
   5149  1.3  christos sparc_regname_to_dw2regnum (char *regname)
   5150  1.3  christos {
   5151  1.1     skrll   char *q;
   5152  1.1     skrll   int i;
   5153  1.1     skrll 
   5154  1.3  christos   if (!regname[0])
   5155  1.1     skrll     return -1;
   5156  1.1     skrll 
   5157  1.1     skrll   switch (regname[0])
   5158  1.1     skrll     {
   5159  1.1     skrll     case 'g': i = 0; break;
   5160  1.1     skrll     case 'o': i = 1; break;
   5161  1.1     skrll     case 'l': i = 2; break;
   5162  1.1     skrll     case 'i': i = 3; break;
   5163  1.1     skrll     default: i = -1; break;
   5164  1.1     skrll     }
   5165  1.3  christos   if (i != -1)
   5166  1.1     skrll     {
   5167  1.1     skrll       if (regname[1] < '0' || regname[1] > '8' || regname[2])
   5168  1.1     skrll 	return -1;
   5169  1.1     skrll       return i * 8 + regname[1] - '0';
   5170  1.1     skrll     }
   5171  1.1     skrll   if (regname[0] == 's' && regname[1] == 'p' && !regname[2])
   5172  1.1     skrll     return 14;
   5173  1.1     skrll   if (regname[0] == 'f' && regname[1] == 'p' && !regname[2])
   5174  1.1     skrll     return 30;
   5175  1.1     skrll   if (regname[0] == 'f' || regname[0] == 'r')
   5176  1.1     skrll     {
   5177  1.1     skrll       unsigned int regnum;
   5178  1.1     skrll 
   5179  1.1     skrll       regnum = strtoul (regname + 1, &q, 10);
   5180  1.1     skrll       if (q == NULL || *q)
   5181  1.1     skrll         return -1;
   5182  1.1     skrll       if (regnum >= ((regname[0] == 'f'
   5183  1.1     skrll 		      && SPARC_OPCODE_ARCH_V9_P (max_architecture))
   5184  1.1     skrll 		     ? 64 : 32))
   5185  1.1     skrll 	return -1;
   5186  1.2     joerg       if (regname[0] == 'f')
   5187  1.1     skrll 	{
   5188  1.1     skrll           regnum += 32;
   5189                          if (regnum >= 64 && (regnum & 1))
   5190                	    return -1;
   5191                        }
   5192                      return regnum;
   5193                    }
   5194                  return -1;
   5195                }
   5196                
   5197                void
   5198                sparc_cfi_emit_pcrel_expr (expressionS *exp, unsigned int nbytes)
   5199                {
   5200                  sparc_no_align_cons = 1;
   5201                  emit_expr_with_reloc (exp, nbytes, "disp");
   5202                  sparc_no_align_cons = 0;
   5203                }
   5204