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