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