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