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