1 /* tc-sparc.c -- Assemble for the SPARC
2    Copyright (C) 1989-2021 Free Software Foundation, Inc.
3    This file is part of GAS, the GNU Assembler.
4 
5    GAS is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3, or (at your option)
8    any later version.
9 
10    GAS is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public
16    License along with GAS; see the file COPYING.  If not, write
17    to the Free Software Foundation, 51 Franklin Street - Fifth Floor,
18    Boston, MA 02110-1301, USA.  */
19 
20 #include "as.h"
21 #include "safe-ctype.h"
22 #include "subsegs.h"
23 
24 #include "opcode/sparc.h"
25 #include "dw2gencfi.h"
26 
27 #include "elf/sparc.h"
28 #include "dwarf2dbg.h"
29 
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 
36 static int sparc_ip (char *, const struct sparc_opcode **);
37 static int parse_sparc_asi (char **, const sparc_asi **);
38 static int parse_keyword_arg (int (*) (const char *), char **, int *);
39 static int parse_const_expr_arg (char **, int *);
40 static int get_expression (char *);
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
49 static const char *default_arch = DEFAULT_ARCH;
50 
51 /* Non-zero if the initial values of `max_architecture' and `sparc_arch_size'
52    have been set.  */
53 static int default_init_p;
54 
55 /* Current architecture.  We don't bump up unless necessary.  */
56 static 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.  */
63 static enum sparc_opcode_arch_val max_architecture;
64 
65 /* Either 32 or 64, selects file format.  */
66 static 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.  */
69 static int default_arch_size;
70 
71 /* The currently selected v9 memory model.  Currently only used for
72    ELF.  */
73 static enum { MM_TSO, MM_PSO, MM_RMO } sparc_memory_model = MM_RMO;
74 
75 #ifndef TE_SOLARIS
76 /* Bitmask of instruction types seen so far, used to populate the
77    GNU attributes section with hwcap information.  */
78 static bfd_uint64_t hwcap_seen;
79 #endif
80 
81 static bfd_uint64_t hwcap_allowed;
82 
83 static int architecture_requested;
84 static int warn_on_bump;
85 
86 /* If warn_on_bump and the needed architecture is higher than this
87    architecture, issue a warning.  */
88 static enum sparc_opcode_arch_val warn_after_architecture;
89 
90 /* Non-zero if the assembler should generate error if an undeclared
91    g[23] register has been used in -64.  */
92 static int no_undeclared_regs;
93 
94 /* Non-zero if the assembler should generate a warning if an
95    unpredictable DCTI (delayed control transfer instruction) couple is
96    found.  */
97 static int dcti_couples_detect;
98 
99 /* Non-zero if we should try to relax jumps and calls.  */
100 static int sparc_relax;
101 
102 /* Non-zero if we are generating PIC code.  */
103 int sparc_pic_code;
104 
105 /* Non-zero if we should give an error when misaligned data is seen.  */
106 static int enforce_aligned_data;
107 
108 extern int target_big_endian;
109 
110 static int target_little_endian_data;
111 
112 /* Symbols for global registers on v9.  */
113 static symbolS *globals[8];
114 
115 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
116 int sparc_cie_data_alignment;
117 
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 
128 /* Handle of the OPCODE hash table.  */
129 static htab_t op_hash;
130 
131 static void s_data1 (void);
132 static void s_seg (int);
133 static void s_proc (int);
134 static void s_reserve (int);
135 static void s_common (int);
136 static void s_empty (int);
137 static void s_uacons (int);
138 static void s_ncons (int);
139 static void s_register (int);
140 
141 const pseudo_typeS md_pseudo_table[] =
142 {
143   {"align", s_align_bytes, 0},	/* Defaulting is invalid (0).  */
144   {"common", s_common, 0},
145   {"empty", s_empty, 0},
146   {"global", s_globl, 0},
147   {"half", cons, 2},
148   {"nword", s_ncons, 0},
149   {"optim", s_ignore, 0},
150   {"proc", s_proc, 0},
151   {"reserve", s_reserve, 0},
152   {"seg", s_seg, 0},
153   {"skip", s_space, 0},
154   {"word", cons, 4},
155   {"xword", cons, 8},
156   {"uahalf", s_uacons, 2},
157   {"uaword", s_uacons, 4},
158   {"uaxword", s_uacons, 8},
159   /* These are specific to sparc/svr4.  */
160   {"2byte", s_uacons, 2},
161   {"4byte", s_uacons, 4},
162   {"8byte", s_uacons, 8},
163   {"register", s_register, 0},
164   {NULL, 0, 0},
165 };
166 
167 /* This array holds the chars that always start a comment.  If the
168    pre-processor is disabled, these aren't very useful.  */
169 const char comment_chars[] = "!";	/* JF removed '|' from
170                                            comment_chars.  */
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'
174    .line and .file directives will appear in the pre-processed output.  */
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
177    #NO_APP at the beginning of its output.  */
178 /* Also note that comments started like this one will always
179    work if '/' isn't otherwise defined.  */
180 const char line_comment_chars[] = "#";
181 
182 const char line_separator_chars[] = ";";
183 
184 /* Chars that can be used to separate mant from exp in floating point
185    nums.  */
186 const char EXP_CHARS[] = "eE";
187 
188 /* Chars that mean this number is a floating point constant.
189    As in 0f12.456
190    or    0d1.2345e12  */
191 const 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 
197 #define isoctal(c)  ((unsigned) ((c) - '0') < 8)
198 
199 struct sparc_it
200   {
201     const char *error;
202     unsigned long opcode;
203     struct nlist *nlistp;
204     expressionS exp;
205     expressionS exp2;
206     int pcrel;
207     bfd_reloc_code_real_type reloc;
208   };
209 
210 struct sparc_it the_insn, set_insn;
211 
212 static void output_insn (const struct sparc_opcode *, struct sparc_it *);
213 
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 
219 enum sparc_arch_types {v6, v7, v8, leon, sparclet, sparclite, sparc86x, v8plus,
220 		       v8plusa, v9, v9a, v9b, v9_64};
221 
222 static struct sparc_arch {
223   const char *name;
224   const char *opcode_arch;
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;
231   /* Extra hardware capabilities allowed.  These are added to the
232      hardware capabilities associated with the opcode
233      architecture.  */
234   int hwcap_allowed;
235   int hwcap2_allowed;
236 } sparc_arch_table[] = {
237   { "v6",         "v6",  v6,  0, 1, 0, 0 },
238   { "v7",         "v7",  v7,  0, 1, 0, 0 },
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 },
251   { "sparc6",     "m8",  v9,  0, 1, 0, 0 },
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 },
266   { "v8plusm8", "m8", v9,  0, 1, HWCAP_V8PLUS, 0 },
267 
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 },
276   { "v9m8",     "m8", v9,  0, 1, 0, 0 },
277 
278   /* This exists to allow configure.tgt to pass one
279      value to specify both the default machine and default word size.  */
280   { "v9-64",   "v9",  v9, 64, 0, 0, 0 },
281   { NULL, NULL, v8, 0, 0, 0, 0 }
282 };
283 
284 /* Variant of default_arch */
285 static enum sparc_arch_types default_arch_type;
286 
287 static struct sparc_arch *
lookup_arch(const char * name)288 lookup_arch (const char *name)
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 
303 static void
init_default_arch(void)304 init_default_arch (void)
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 
320 /* Called by TARGET_MACH.  */
321 
322 unsigned long
sparc_mach(void)323 sparc_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 
333 /* Called by TARGET_FORMAT.  */
334 
335 const char *
sparc_target_format(void)336 sparc_target_format (void)
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 
343 #ifdef TE_VXWORKS
344   return "elf32-sparc-vxworks";
345 #endif
346 
347   return sparc_arch_size == 64 ? ELF64_TARGET_FORMAT : ELF_TARGET_FORMAT;
348 }
349 
350 /* md_parse_option
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  *
357  *	-Av6, -Av7, -Av8, -Aleon, -Asparclite, -Asparclet
358  *		Standard 32 bit architectures.
359  *	-Av9, -Av9a, -Av9b
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).
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
372  *		assembler.
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
381  * 		-Av8plus{,a,b}.
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 
404 const char *md_shortopts = "A:K:VQ:sq";
405 struct 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},
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},
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},
432 #define OPTION_NO_UNDECLARED_REGS (OPTION_MD_BASE + 12)
433   {"no-undeclared-regs", no_argument, NULL, OPTION_NO_UNDECLARED_REGS},
434 #define OPTION_UNDECLARED_REGS (OPTION_MD_BASE + 13)
435   {"undeclared-regs", no_argument, NULL, OPTION_UNDECLARED_REGS},
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},
440 #define OPTION_DCTI_COUPLES_DETECT (OPTION_MD_BASE + 16)
441   {"dcti-couples-detect", no_argument, NULL, OPTION_DCTI_COUPLES_DETECT},
442   {NULL, no_argument, NULL, 0}
443 };
444 
445 size_t md_longopts_size = sizeof (md_longopts);
446 
447 int
md_parse_option(int c,const char * arg)448 md_parse_option (int c, const char *arg)
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:
463       if (startswith (arg, "v9"))
464 	md_parse_option (OPTION_64, NULL);
465       else
466 	{
467 	  if (startswith (arg, "v8")
468 	      || startswith (arg, "v7")
469 	      || startswith (arg, "v6")
470 	      || !strcmp (arg, "sparclet")
471 	      || !strcmp (arg, "sparclite")
472 	      || !strcmp (arg, "sparc86x"))
473 	    md_parse_option (OPTION_32, NULL);
474 	}
475       /* Fall through.  */
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 	  {
486 	    if (c == OPTION_XARCH)
487 	      as_bad (_("invalid architecture -xarch=%s"), arg);
488 	    else
489 	      as_bad (_("invalid architecture -A%s"), arg);
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 
497 	if (!architecture_requested
498 	    || opcode_arch > max_architecture)
499 	  max_architecture = opcode_arch;
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);
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 
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 	      {
551 		if (startswith (*l, "elf32-sparc"))
552 		  break;
553 	      }
554 	    else
555 	      {
556 		if (startswith (*l, "elf64-sparc"))
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);
564 
565 	if (sparc_arch_size == 64
566 	    && max_architecture < SPARC_OPCODE_ARCH_V9)
567 	  max_architecture = SPARC_OPCODE_ARCH_V9;
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
589 	 Qn - do not emit .comment.  */
590       break;
591 
592     case 's':
593       /* Use .stab instead of .stab.excl.  */
594       break;
595 
596     case 'q':
597       /* quick -- Native assembler does fewer checks.  */
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;
606 
607     case OPTION_NO_UNDECLARED_REGS:
608       no_undeclared_regs = 1;
609       break;
610 
611     case OPTION_UNDECLARED_REGS:
612       no_undeclared_regs = 0;
613       break;
614 
615     case OPTION_RELAX:
616       sparc_relax = 1;
617       break;
618 
619     case OPTION_NO_RELAX:
620       sparc_relax = 0;
621       break;
622 
623     case OPTION_DCTI_COUPLES_DETECT:
624       dcti_couples_detect = 1;
625       break;
626 
627     default:
628       return 0;
629     }
630 
631   return 1;
632 }
633 
634 void
md_show_usage(FILE * stream)635 md_show_usage (FILE *stream)
636 {
637   const struct sparc_arch *arch;
638   int column;
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 
645   fprintf (stream, _("SPARC options:\n"));
646   column = 0;
647   for (arch = &sparc_arch_table[0]; arch->name; arch++)
648     {
649       if (!arch->user_option_p)
650 	continue;
651       if (arch != &sparc_arch_table[0])
652 	fprintf (stream, " | ");
653       if (column + strlen (arch->name) > 70)
654 	{
655 	  column = 0;
656 	  fputc ('\n', stream);
657 	}
658       column += 5 + 2 + strlen (arch->name);
659       fprintf (stream, "-A%s", arch->name);
660     }
661   for (arch = &sparc_arch_table[0]; arch->name; arch++)
662     {
663       if (!arch->user_option_p)
664 	continue;
665       fprintf (stream, " | ");
666       if (column + strlen (arch->name) > 65)
667 	{
668 	  column = 0;
669 	  fputc ('\n', stream);
670 	}
671       column += 5 + 7 + strlen (arch->name);
672       fprintf (stream, "-xarch=%s", arch->name);
673     }
674   fprintf (stream, _("\n\
675 			specify variant of SPARC architecture\n\
676 -bump			warn when assembler switches architectures\n\
677 -sparc			ignored\n\
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"));
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\
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\
699 --dcti-couples-detect	warn when an unpredictable DCTI couple is found\n\
700 -q			ignored\n\
701 -Qy, -Qn		ignored\n\
702 -s			ignored\n"));
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\
708                         instructions and little endian data.\n"));
709 #endif
710 }
711 
712 /* Native operand size opcode translation.  */
713 static struct
714   {
715     const char *name;
716     const char *name32;
717     const char *name64;
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 
733 /* sparc64 privileged and hyperprivileged registers.  */
734 
735 struct priv_reg_entry
736 {
737   const char *name;
738   int regnum;
739 };
740 
741 struct 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},
759   {"gl", 16},
760   {"pmcdper", 23},
761   {"ver", 31},
762   {NULL, -1},			/* End marker.  */
763 };
764 
765 struct priv_reg_entry hpriv_reg_table[] =
766 {
767   {"hpstate", 0},
768   {"htstate", 1},
769   {"hintp", 3},
770   {"htba", 5},
771   {"hver", 6},
772   {"hmcdper", 23},
773   {"hmcddfr", 24},
774   {"hva_mask_nz", 27},
775   {"hstick_offset", 28},
776   {"hstick_enable", 29},
777   {"hstick_cmpr", 31},
778   {NULL, -1},			/* End marker.  */
779 };
780 
781 /* v9a or later specific ancillary state registers. */
782 
783 struct priv_reg_entry v9a_asr_table[] =
784 {
785   {"tick_cmpr", 23},
786   {"sys_tick_cmpr", 25},
787   {"sys_tick", 24},
788   {"stick_cmpr", 25},
789   {"stick", 24},
790   {"softint_clear", 21},
791   {"softint_set", 20},
792   {"softint", 22},
793   {"set_softint", 20},
794   {"pause", 27},
795   {"pic", 17},
796   {"pcr", 16},
797   {"mwait", 28},
798   {"gsr", 19},
799   {"dcr", 18},
800   {"cfr", 26},
801   {"clear_softint", 21},
802   {NULL, -1},			/* End marker.  */
803 };
804 
805 static int
cmp_reg_entry(const void * parg,const void * qarg)806 cmp_reg_entry (const void *parg, const void *qarg)
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 
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 
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.  */
833 struct pop_entry
834 {
835   /* The name as it appears in assembler.  */
836   const char *name;
837   /* The reloc this pseudo-op translates to.  */
838   bfd_reloc_code_real_type reloc;
839   /* Flags.  See F_POP_* above.  */
840   int flags;
841 };
842 
843 struct 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 },
881   { "gdop",	 	BFD_RELOC_SPARC_GOTDATA_OP,	F_POP_POSTFIX }
882 };
883 
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 
888 enum 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 
896 struct 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)         \
916    + ARRAY_SIZE (pop_table)						\
917    + 1)
918 
919 struct perc_entry perc_table[NUM_PERC_ENTRIES];
920 
921 static int
cmp_perc_entry(const void * parg,const void * qarg)922 cmp_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);
935 }
936 
937 /* This function is called once, at assembler startup time.  It should
938    set up all the tables, etc. that the MD part of the assembler will
939    need.  */
940 
941 void
md_begin(void)942 md_begin (void)
943 {
944   int lose = 0;
945   unsigned int i = 0;
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 
953   sparc_cie_data_alignment = sparc_arch_size == 64 ? -8 : -4;
954   op_hash = str_htab_create ();
955 
956   while (i < (unsigned int) sparc_num_opcodes)
957     {
958       const char *name = sparc_opcodes[i].name;
959       if (str_hash_insert (op_hash, name, &sparc_opcodes[i], 0) != NULL)
960 	{
961 	  as_bad (_("duplicate %s"), name);
962 	  lose = 1;
963 	}
964       do
965 	{
966 	  if (sparc_opcodes[i].match & sparc_opcodes[i].lose)
967 	    {
968 	      as_bad (_("Internal error: losing opcode: `%s' \"%s\"\n"),
969 		      sparc_opcodes[i].name, sparc_opcodes[i].args);
970 	      lose = 1;
971 	    }
972 	  ++i;
973 	}
974       while (i < (unsigned int) sparc_num_opcodes
975 	     && !strcmp (sparc_opcodes[i].name, name));
976     }
977 
978   for (i = 0; native_op_table[i].name; i++)
979     {
980       const struct sparc_opcode *insn;
981       const char *name = ((sparc_arch_size == 32)
982 		    ? native_op_table[i].name32
983 		    : native_op_table[i].name64);
984       insn = (struct sparc_opcode *) str_hash_find (op_hash, name);
985       if (insn == NULL)
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 	}
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 	}
996     }
997 
998   if (lose)
999     as_fatal (_("Broken assembler.  No assembly attempted."));
1000 
1001   qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]),
1002 	 sizeof (priv_reg_table[0]), cmp_reg_entry);
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 
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;
1021     }
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   }
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.  */
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       }
1071 
1072     /* Last entry is the sentinel.  */
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   }
1079 }
1080 
1081 /* Called after all assembly has been done.  */
1082 
1083 void
sparc_md_end(void)1084 sparc_md_end (void)
1085 {
1086   unsigned long mach;
1087 #ifndef TE_SOLARIS
1088   int hwcaps, hwcaps2;
1089 #endif
1090 
1091   if (sparc_arch_size == 64)
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;
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;
1101       case SPARC_OPCODE_ARCH_M8:  mach = bfd_mach_sparc_v9m8; break;
1102       default: mach = bfd_mach_sparc_v9; break;
1103       }
1104   else
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;
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;
1116       case SPARC_OPCODE_ARCH_M8:  mach = bfd_mach_sparc_v8plusm8; break;
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).  */
1120       default: mach = bfd_mach_sparc; break;
1121       }
1122   bfd_set_arch_mach (stdoutput, bfd_arch_sparc, mach);
1123 
1124 #ifndef TE_SOLARIS
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);
1132 #endif
1133 }
1134 
1135 /* Return non-zero if VAL is in the range -(MAX+1) to MAX.  */
1136 
1137 static inline int
in_signed_range(bfd_signed_vma val,bfd_signed_vma max)1138 in_signed_range (bfd_signed_vma val, bfd_signed_vma max)
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     {
1146       bfd_vma sign = (bfd_vma) 1 << 31;
1147       val = ((val & U0xffffffff) ^ sign) - sign;
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 
1158 static inline int
in_unsigned_range(bfd_vma val,bfd_vma max)1159 in_unsigned_range (bfd_vma val, bfd_vma max)
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 
1169 static inline int
in_bitfield_range(bfd_signed_vma val,bfd_signed_vma max)1170 in_bitfield_range (bfd_signed_vma val, bfd_signed_vma max)
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 
1181 static int
sparc_ffs(unsigned int mask)1182 sparc_ffs (unsigned int mask)
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.  */
1195 static bfd_vma
BSR(bfd_vma val,int amount)1196 BSR (bfd_vma val, int amount)
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 
1203 /* For communication between sparc_ip and get_expression.  */
1204 static char *expr_end;
1205 
1206 /* Values for `special_case'.
1207    Instructions that require weird handling because they're longer than
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
1219 #define XOR_INSN 0x80180000
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.  */
1226 static const struct sparc_opcode *last_insn;
1227 /* The assembled opcode of `last_insn'.  */
1228 static unsigned long last_opcode;
1229 
1230 /* Handle the set and setuw synthetic instructions.  */
1231 
1232 static void
synthetize_setuw(const struct sparc_opcode * insn)1233 synthetize_setuw (const struct sparc_opcode *insn)
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 	{
1242 	  if (sizeof (offsetT) > 4
1243 	      && (the_insn.exp.X_add_number < 0
1244 		  || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
1245 	    as_warn (_("set: number not in 0..4294967295 range"));
1246 	}
1247       else
1248 	{
1249 	  if (sizeof (offsetT) > 4
1250 	      && (the_insn.exp.X_add_number < -(offsetT) U0x80000000
1251 		  || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
1252 	    as_warn (_("set: number not in -2147483648..4294967295 range"));
1253 	  the_insn.exp.X_add_number = (int) the_insn.exp.X_add_number;
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)
1264 			    & (the_insn.exp.X_op == O_constant
1265 			       ? 0x3fffff : 0)));
1266       the_insn.reloc = (the_insn.exp.X_op != O_constant
1267 			? BFD_RELOC_HI22 : BFD_RELOC_NONE);
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
1280 			    & (the_insn.exp.X_op != O_constant
1281 			       ? 0 : need_hi22_p ? 0x3ff : 0x1fff)));
1282       the_insn.reloc = (the_insn.exp.X_op != O_constant
1283 			? BFD_RELOC_LO10 : BFD_RELOC_NONE);
1284       output_insn (insn, &the_insn);
1285     }
1286 }
1287 
1288 /* Handle the setsw synthetic instruction.  */
1289 
1290 static void
synthetize_setsw(const struct sparc_opcode * insn)1291 synthetize_setsw (const struct sparc_opcode *insn)
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 
1308   if (sizeof (offsetT) > 4
1309       && (the_insn.exp.X_add_number < -(offsetT) U0x80000000
1310 	  || the_insn.exp.X_add_number > (offsetT) U0xffffffff))
1311     as_warn (_("setsw: number not in -2147483648..4294967295 range"));
1312 
1313   low32 = the_insn.exp.X_add_number;
1314 
1315   if (low32 >= 0)
1316     {
1317       synthetize_setuw (insn);
1318       return;
1319     }
1320 
1321   opc = OR_INSN;
1322 
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 
1339 /* Handle the setx synthetic instruction.  */
1340 
1341 static void
synthetize_setx(const struct sparc_opcode * insn)1342 synthetize_setx (const struct sparc_opcode *insn)
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;
1350 
1351 #define SIGNEXT32(x) ((((x) & U0xffffffff) ^ U0x80000000) - U0x80000000)
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;
1378       lower32 = 0;
1379       upper32 = 0;
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;
1387 
1388       /* Only need hh22 if `or' insn can't handle constant.  */
1389       if (upper32 < -(1 << 12) || upper32 >= (1 << 12))
1390 	need_hh22_p = 1;
1391 
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;
1398 
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;
1412 
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     }
1428 
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     }
1440 
1441   if (need_hi22_p)
1442     {
1443       the_insn.opcode = (SETHI_INSN | RD (dstreg)
1444 			 | (((need_xor10_p ? ~lower32 : lower32)
1445 			     >> 10) & 0x3fffff));
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     }
1462 
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     }
1476 
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     }
1485 
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 
1505 /* Main entry point to assemble one instruction.  */
1506 
1507 void
md_assemble(char * str)1508 md_assemble (char *str)
1509 {
1510   const struct sparc_opcode *insn;
1511   int special_case;
1512 
1513   know (str);
1514   special_case = sparc_ip (str, &insn);
1515   if (insn == NULL)
1516     return;
1517 
1518   /* Certain instructions may not appear on delay slots.  Check for
1519      these situations.  */
1520   if (last_insn != NULL
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     }
1550 
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.  */
1554   if (max_architecture < SPARC_OPCODE_ARCH_V9
1555       && last_insn != NULL
1556       && (insn->flags & F_FBR) != 0
1557       && (last_insn->flags & F_FLOAT) != 0
1558       && (last_insn->match & OP3 (0x35)) == OP3 (0x35))
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);
1565       as_warn (_("FP branch preceded by FP compare; NOP inserted"));
1566     }
1567 
1568   switch (special_case)
1569     {
1570     case SPECIAL_CASE_NONE:
1571       /* Normal insn.  */
1572       output_insn (insn, &the_insn);
1573       break;
1574 
1575     case SPECIAL_CASE_SETSW:
1576       synthetize_setsw (insn);
1577       break;
1578 
1579     case SPECIAL_CASE_SET:
1580       synthetize_setuw (insn);
1581       break;
1582 
1583     case SPECIAL_CASE_SETX:
1584       synthetize_setx (insn);
1585       break;
1586 
1587     case SPECIAL_CASE_FDIV:
1588       {
1589 	int rd = (the_insn.opcode >> 25) & 0x1f;
1590 
1591 	output_insn (insn, &the_insn);
1592 
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
1597 	   with Weitek 1165 float chips, such as the Sun-4/260 and /280.  */
1598 	gas_assert (the_insn.reloc == BFD_RELOC_NONE);
1599 	the_insn.opcode = FMOVS_INSN | rd | RD (rd);
1600 	output_insn (insn, &the_insn);
1601 	return;
1602       }
1603 
1604     default:
1605       as_fatal (_("failed special case insn sanity check"));
1606     }
1607 }
1608 
1609 static const char *
get_hwcap_name(bfd_uint64_t mask)1610 get_hwcap_name (bfd_uint64_t mask)
1611 {
1612   if (mask & HWCAP_MUL32)
1613     return "mul32";
1614   if (mask & HWCAP_DIV32)
1615     return "div32";
1616   if (mask & HWCAP_FSMULD)
1617     return "fsmuld";
1618   if (mask & HWCAP_V8PLUS)
1619     return "v8plus";
1620   if (mask & HWCAP_POPC)
1621     return "popc";
1622   if (mask & HWCAP_VIS)
1623     return "vis";
1624   if (mask & HWCAP_VIS2)
1625     return "vis2";
1626   if (mask & HWCAP_ASI_BLK_INIT)
1627     return "ASIBlkInit";
1628   if (mask & HWCAP_FMAF)
1629     return "fmaf";
1630   if (mask & HWCAP_VIS3)
1631     return "vis3";
1632   if (mask & HWCAP_HPC)
1633     return "hpc";
1634   if (mask & HWCAP_RANDOM)
1635     return "random";
1636   if (mask & HWCAP_TRANS)
1637     return "trans";
1638   if (mask & HWCAP_FJFMAU)
1639     return "fjfmau";
1640   if (mask & HWCAP_IMA)
1641     return "ima";
1642   if (mask & HWCAP_ASI_CACHE_SPARING)
1643     return "cspare";
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";
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";
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";
1704 
1705   return "UNKNOWN";
1706 }
1707 
1708 /* Subroutine of md_assemble to do the actual parsing.  */
1709 
1710 static int
sparc_ip(char * str,const struct sparc_opcode ** pinsn)1711 sparc_ip (char *str, const struct sparc_opcode **pinsn)
1712 {
1713   const char *error_message = "";
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;
1724   int special_case = SPECIAL_CASE_NONE;
1725   const sparc_asi *sasi = NULL;
1726 
1727   s = str;
1728   if (ISLOWER (*s))
1729     {
1730       do
1731 	++s;
1732       while (ISLOWER (*s) || ISDIGIT (*s) || *s == '_');
1733     }
1734 
1735   switch (*s)
1736     {
1737     case '\0':
1738       break;
1739 
1740     case ',':
1741       comma = 1;
1742       /* Fall through.  */
1743 
1744     case ' ':
1745       *s++ = '\0';
1746       break;
1747 
1748     default:
1749       as_bad (_("Unknown opcode: `%s'"), str);
1750       *pinsn = NULL;
1751       return special_case;
1752     }
1753   insn = (struct sparc_opcode *) str_hash_find (op_hash, str);
1754   *pinsn = insn;
1755   if (insn == NULL)
1756     {
1757       as_bad (_("Unknown opcode: `%s'"), str);
1758       return special_case;
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 
1773       /* Build the opcode, checking as we go to make sure that the
1774          operands match.  */
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 		      {
1788 			int jmask;
1789 
1790 			if (! parse_keyword_arg (sparc_encode_membar, &s,
1791 						 &jmask))
1792 			  {
1793 			    error_message = _(": invalid membar mask name");
1794 			    goto error;
1795 			  }
1796 			kmask |= jmask;
1797 			while (*s == ' ')
1798 			  ++s;
1799 			if (*s == '|' || *s == '+')
1800 			  ++s;
1801 			while (*s == ' ')
1802 			  ++s;
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 
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 
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 		{
1876 		  struct priv_reg_entry *p;
1877 		  unsigned int len = 9999999; /* Init to make gcc happy.  */
1878 
1879 		  s += 1;
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)
1889 		    {
1890 		      error_message = _(": unrecognizable privileged register");
1891 		      goto error;
1892 		    }
1893 
1894                   if (((opcode >> (*args == '?' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum)
1895                     {
1896                       error_message = _(": unrecognizable privileged register");
1897                       goto error;
1898                     }
1899 
1900 		  s += len;
1901 		  continue;
1902 		}
1903 	      else
1904 		{
1905 		  error_message = _(": unrecognizable privileged register");
1906 		  goto error;
1907 		}
1908 
1909 	    case '$':
1910 	    case '%':
1911 	      /* Parse a sparc64 hyperprivileged register.  */
1912 	      if (*s == '%')
1913 		{
1914 		  struct priv_reg_entry *p;
1915 		  unsigned int len = 9999999; /* Init to make gcc happy.  */
1916 
1917 		  s += 1;
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)
1927 		    {
1928 		      error_message = _(": unrecognizable hyperprivileged register");
1929 		      goto error;
1930 		    }
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;
1939 		  continue;
1940 		}
1941 	      else
1942 		{
1943 		  error_message = _(": unrecognizable hyperprivileged register");
1944 		  goto error;
1945 		}
1946 
1947 	    case '_':
1948 	    case '/':
1949 	      /* Parse a v9a or later ancillary state register.  */
1950 	      if (*s == '%')
1951 		{
1952 		  struct priv_reg_entry *p;
1953 		  unsigned int len = 9999999; /* Init to make gcc happy.  */
1954 
1955 		  s += 1;
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)
1965 		    {
1966 		      error_message = _(": unrecognizable ancillary state register");
1967 		      goto error;
1968 		    }
1969 
1970                   if (((opcode >> (*args == '/' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum)
1971                      {
1972                        error_message = _(": unrecognizable ancillary state register");
1973                        goto error;
1974                      }
1975 
1976 		  s += len;
1977 		  continue;
1978 		}
1979 	      else
1980 		{
1981 		  error_message = _(": unrecognizable ancillary state register");
1982 		  goto error;
1983 		}
1984 
1985 	    case 'M':
1986 	    case 'm':
1987 	      if (startswith (s, "%asr"))
1988 		{
1989 		  s += 4;
1990 
1991 		  if (ISDIGIT (*s))
1992 		    {
1993 		      long num = 0;
1994 
1995 		      while (ISDIGIT (*s))
1996 			{
1997 			  num = num * 10 + *s - '0';
1998 			  ++s;
1999 			}
2000 
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                         }
2017 
2018 		      opcode |= (*args == 'M' ? RS1 (num) : RD (num));
2019 		      continue;
2020 		    }
2021 		  else
2022 		    {
2023 		      error_message = _(": expecting %asrN");
2024 		      goto error;
2025 		    }
2026 		} /* if %asr  */
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 
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 
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 
2103 	    case '=':
2104 	      the_insn.reloc = /* RELOC_WDISP2_8 */ BFD_RELOC_SPARC_WDISP10;
2105 	      the_insn.pcrel = 1;
2106 	      goto immediate;
2107 
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 		}
2134 	      if ((startswith (s, "%icc"))
2135                   || (sparc_arch_size == 32 && startswith (s, "%ncc")))
2136 		{
2137 		  s += 4;
2138 		  continue;
2139 		}
2140 	      break;
2141 
2142 	    case 'Z':
2143 	      if (*s == ' ')
2144 		{
2145 		  ++s;
2146 		}
2147               if ((startswith (s, "%xcc"))
2148                   || (sparc_arch_size == 64 && startswith (s, "%ncc")))
2149 		{
2150 		  s += 4;
2151 		  continue;
2152 		}
2153 	      break;
2154 
2155 	    case '6':
2156 	      if (*s == ' ')
2157 		{
2158 		  ++s;
2159 		}
2160 	      if (startswith (s, "%fcc0"))
2161 		{
2162 		  s += 5;
2163 		  continue;
2164 		}
2165 	      break;
2166 
2167 	    case '7':
2168 	      if (*s == ' ')
2169 		{
2170 		  ++s;
2171 		}
2172 	      if (startswith (s, "%fcc1"))
2173 		{
2174 		  s += 5;
2175 		  continue;
2176 		}
2177 	      break;
2178 
2179 	    case '8':
2180 	      if (*s == ' ')
2181 		{
2182 		  ++s;
2183 		}
2184 	      if (startswith (s, "%fcc2"))
2185 		{
2186 		  s += 5;
2187 		  continue;
2188 		}
2189 	      break;
2190 
2191 	    case '9':
2192 	      if (*s == ' ')
2193 		{
2194 		  ++s;
2195 		}
2196 	      if (startswith (s, "%fcc3"))
2197 		{
2198 		  s += 5;
2199 		  continue;
2200 		}
2201 	      break;
2202 
2203 	    case 'P':
2204 	      if (startswith (s, "%pc"))
2205 		{
2206 		  s += 3;
2207 		  continue;
2208 		}
2209 	      break;
2210 
2211 	    case 'W':
2212 	      if (startswith (s, "%tick"))
2213 		{
2214 		  s += 5;
2215 		  continue;
2216 		}
2217 	      break;
2218 
2219 	    case '\0':		/* End of args.  */
2220 	      if (s[0] == ',' && s[1] == '%')
2221 		{
2222 		  char *s1;
2223 		  int npar = 0;
2224                   const struct perc_entry *p;
2225 
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;
2232 
2233 		  if (s[p->len + 2] != '(')
2234 		    {
2235 		      as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name);
2236 		      return special_case;
2237 		    }
2238 
2239 		  if (! (p->pop->flags & F_POP_TLS_CALL)
2240                       && the_insn.reloc != BFD_RELOC_NONE)
2241 		    {
2242 		      as_bad (_("Illegal operands: %%%s cannot be used together with other relocs in the insn ()"),
2243 			      p->name);
2244 		      return special_case;
2245 		    }
2246 
2247 		  if ((p->pop->flags & F_POP_TLS_CALL)
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"),
2254 			      p->name);
2255 		      return special_case;
2256 		    }
2257 
2258 		  the_insn.reloc = p->pop->reloc;
2259 		  memset (&the_insn.exp, 0, sizeof (the_insn.exp));
2260 		  s += p->len + 3;
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 		    {
2274 		      as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name);
2275 		      return special_case;
2276 		    }
2277 
2278 		  *s1 = '\0';
2279 		  (void) get_expression (s);
2280 		  *s1 = ')';
2281 		  s = s1 + 1;
2282 		}
2283 	      if (*s == '\0')
2284 		match = 1;
2285 	      break;
2286 
2287 	    case '+':
2288 	      if (*s == '+')
2289 		{
2290 		  ++s;
2291 		  continue;
2292 		}
2293 	      if (*s == '-')
2294 		{
2295 		  continue;
2296 		}
2297 	      break;
2298 
2299 	    case '[':		/* These must match exactly.  */
2300 	    case ']':
2301 	    case ',':
2302 	    case ' ':
2303 	      if (*s++ == *args)
2304 		continue;
2305 	      break;
2306 
2307 	    case '#':		/* Must be at least one digit.  */
2308 	      if (ISDIGIT (*s++))
2309 		{
2310 		  while (ISDIGIT (*s))
2311 		    {
2312 		      ++s;
2313 		    }
2314 		  continue;
2315 		}
2316 	      break;
2317 
2318 	    case 'C':		/* Coprocessor state register.  */
2319 	      if (startswith (s, "%csr"))
2320 		{
2321 		  s += 4;
2322 		  continue;
2323 		}
2324 	      break;
2325 
2326 	    case 'b':		/* Next operand is a coprocessor register.  */
2327 	    case 'c':
2328 	    case 'D':
2329 	      if (*s++ == '%' && *s++ == 'c' && ISDIGIT (*s))
2330 		{
2331 		  mask = *s++;
2332 		  if (ISDIGIT (*s))
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 */
2381 		      c = *s++;
2382 		      if (isoctal (c))
2383 			{
2384 			  mask = c - '0';
2385 			  break;
2386 			}
2387 		      goto error;
2388 
2389 		    case 'i':	/* in register */
2390 		      c = *s++;
2391 		      if (isoctal (c))
2392 			{
2393 			  mask = c - '0' + 24;
2394 			  break;
2395 			}
2396 		      goto error;
2397 
2398 		    case 'l':	/* local register */
2399 		      c = *s++;
2400 		      if (isoctal (c))
2401 			{
2402 			  mask = (c - '0' + 16);
2403 			  break;
2404 			}
2405 		      goto error;
2406 
2407 		    case 'o':	/* out register */
2408 		      c = *s++;
2409 		      if (isoctal (c))
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 */
2425 		      if (!ISDIGIT ((c = *s++)))
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':
2440 		      if (ISDIGIT (*s))
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 
2458 		  if ((mask & ~1) == 2 && sparc_arch_size == 64
2459 		      && no_undeclared_regs && ! globals[mask])
2460 		    as_bad (_("detected global register use not covered by .register pseudo-op"));
2461 
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':
2492             case ';':
2493 
2494 	    case 'f':
2495 	    case 'B':
2496 	    case 'R':
2497             case ':':
2498             case '\'':
2499 
2500 	    case '4':
2501 	    case '5':
2502 
2503 	    case 'g':
2504 	    case 'H':
2505 	    case 'J':
2506 	    case '}':
2507             case '^':
2508 	      {
2509 		char format;
2510 
2511 		if (*s++ == '%'
2512 		    && ((format = *s) == 'f'
2513                         || format == 'd'
2514                         || format == 'q')
2515 		    && ISDIGIT (*++s))
2516 		  {
2517 		    for (mask = 0; ISDIGIT (*s); ++s)
2518 		      {
2519 			mask = 10 * mask + (*s - '0');
2520 		      }		/* read the number */
2521 
2522 		    if ((*args == 'v'
2523 			 || *args == 'B'
2524 			 || *args == '5'
2525 			 || *args == 'H'
2526                          || *args == '\''
2527 			 || format == 'd')
2528 			&& (mask & 1))
2529 		      {
2530                         /* register must be even numbered */
2531 			break;
2532 		      }
2533 
2534 		    if ((*args == 'V'
2535 			 || *args == 'R'
2536 			 || *args == 'J'
2537 			 || format == 'q')
2538 			&& (mask & 3))
2539 		      {
2540                         /* register must be multiple of 4 */
2541 			break;
2542 		      }
2543 
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 
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 			  {
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 			      }
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;
2590 		  }	/* if not an 'f' register.  */
2591 
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 
2599 		switch (*args)
2600 		  {
2601 		  case 'v':
2602 		  case 'V':
2603 		  case 'e':
2604                   case ';':
2605 		    opcode |= RS1 (mask);
2606 		    continue;
2607 
2608 		  case 'f':
2609 		  case 'B':
2610 		  case 'R':
2611                   case ':':
2612 		    opcode |= RS2 (mask);
2613 		    continue;
2614 
2615                   case '\'':
2616                     opcode |= RS2 (mask & 0xe);
2617                     continue;
2618 
2619 		  case '4':
2620 		  case '5':
2621 		    opcode |= RS3 (mask);
2622 		    continue;
2623 
2624 		  case 'g':
2625 		  case 'H':
2626 		  case 'J':
2627 		  case '}':
2628                   case '^':
2629 		    opcode |= RD (mask);
2630 		    continue;
2631 		  }		/* Pack it in.  */
2632 
2633 		know (0);
2634 		break;
2635 	      }			/* float arg  */
2636 
2637 	    case 'F':
2638 	      if (startswith (s, "%fsr"))
2639 		{
2640 		  s += 4;
2641 		  continue;
2642 		}
2643 	      break;
2644 
2645 	    case '(':
2646 	      if (startswith (s, "%efsr"))
2647 		{
2648 		  s += 5;
2649 		  continue;
2650 		}
2651 	      break;
2652 
2653 	    case '0':		/* 64 bit immediate (set, setsw, setx insn)  */
2654 	      the_insn.reloc = BFD_RELOC_NONE; /* reloc handled elsewhere  */
2655 	      goto immediate;
2656 
2657 	    case 'l':		/* 22 bit PC relative immediate  */
2658 	      the_insn.reloc = BFD_RELOC_SPARC_WDISP22;
2659 	      the_insn.pcrel = 1;
2660 	      goto immediate;
2661 
2662 	    case 'L':		/* 30 bit immediate  */
2663 	      the_insn.reloc = BFD_RELOC_32_PCREL_S2;
2664 	      the_insn.pcrel = 1;
2665 	      goto immediate;
2666 
2667 	    case 'h':
2668 	    case 'n':		/* 22 bit immediate  */
2669 	      the_insn.reloc = BFD_RELOC_SPARC22;
2670 	      goto immediate;
2671 
2672 	    case 'i':		/* 13 bit immediate  */
2673 	      the_insn.reloc = BFD_RELOC_SPARC13;
2674 
2675 	      /* fallthrough */
2676 
2677 	    immediate:
2678 	      if (*s == ' ')
2679 		s++;
2680 
2681 	      {
2682 		char *s1;
2683 		const char *op_arg = NULL;
2684 		static expressionS op_exp;
2685 		bfd_reloc_code_real_type old_reloc = the_insn.reloc;
2686 
2687 		/* Check for %hi, etc.  */
2688 		if (*s == '%')
2689 		  {
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] != '(')
2700 		      {
2701 			as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name);
2702 			return special_case;
2703 		      }
2704 
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;
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.  */
2715 
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 
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);
2738 			return special_case;
2739 		      }
2740 
2741 		    *s1 = '\0';
2742 		    (void) get_expression (s);
2743 		    *s1 = ')';
2744 		    if (expr_end != s1)
2745 		      {
2746 			as_bad (_("Expression inside %%%s could not be parsed"), op_arg);
2747 			return special_case;
2748 		      }
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);
2755 			return special_case;
2756 		      }
2757 		    *s1 = '0';
2758 		    s = s1;
2759 		    op_exp = the_insn.exp;
2760 		    memset (&the_insn.exp, 0, sizeof (the_insn.exp));
2761 		  }
2762 
2763 		for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
2764 		  ;
2765 
2766 		if (s1 != s && ISDIGIT (s1[-1]))
2767 		  {
2768 		    if (s1[-2] == '%' && s1[-3] == '+')
2769 		      s1 -= 3;
2770 		    else if (strchr ("golir0123456789", s1[-2]) && s1[-3] == '%' && s1[-4] == '+')
2771 		      s1 -= 4;
2772 		    else if (s1[-3] == 'r' && s1[-4] == '%' && s1[-5] == '+')
2773 		      s1 -= 5;
2774 		    else
2775 		      s1 = NULL;
2776 		    if (s1)
2777 		      {
2778 			*s1 = '\0';
2779 			if (op_arg && s1 == s + 1)
2780 			  the_insn.exp.X_op = O_absent;
2781 			else
2782 			  (void) get_expression (s);
2783 			*s1 = '+';
2784 			if (op_arg)
2785 			  *s = ')';
2786 			s = s1;
2787 		      }
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)
2807 		      {
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 			  {
2816 			  default:
2817 			    break;
2818 
2819 			  case BFD_RELOC_SPARC_HH22:
2820 			    val = BSR (val, 32);
2821 			    /* Fall through.  */
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);
2830 			    /* Fall through.  */
2831 
2832 			  case BFD_RELOC_LO10:
2833 			    val &= 0x3ff;
2834 			    break;
2835 
2836 			  case BFD_RELOC_SPARC_H34:
2837 			    val >>= 12;
2838 			    val &= 0x3fffff;
2839 			    break;
2840 
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:
2856 			    val = ~val;
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);
2872 			return special_case;
2873 		      }
2874 		    else
2875 		      {
2876 			if (old_reloc != BFD_RELOC_SPARC13
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);
2882 			    return special_case;
2883 			  }
2884 			the_insn.reloc = BFD_RELOC_SPARC_OLO10;
2885 		      }
2886 		  }
2887 	      }
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 
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 
2910 		  /* Constants that won't fit are checked in md_apply_fix
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
2915 		     all the various cases (e.g. in md_apply_fix and
2916 		     bfd_install_relocation) so duplicating all that code
2917 		     here isn't right.  */
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.  */
2926 		  if (the_insn.reloc == BFD_RELOC_SPARC_5
2927                       && ((insn->match & OP(0x3)) == 0))
2928 		    {
2929 		      valueT val = the_insn.exp.X_add_number;
2930 
2931 		      the_insn.reloc = BFD_RELOC_NONE;
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;
2938 		    }
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 		  {
2958 		    if (! parse_sparc_asi (&s, &sasi))
2959 		      {
2960 			error_message = _(": invalid ASI name");
2961 			goto error;
2962 		      }
2963 		    asi = sasi->value;
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;
2980 	      }			/* Alternate space.  */
2981 
2982 	    case 'p':
2983 	      if (startswith (s, "%psr"))
2984 		{
2985 		  s += 4;
2986 		  continue;
2987 		}
2988 	      break;
2989 
2990 	    case 'q':		/* Floating point queue.  */
2991 	      if (startswith (s, "%fq"))
2992 		{
2993 		  s += 3;
2994 		  continue;
2995 		}
2996 	      break;
2997 
2998 	    case 'Q':		/* Coprocessor queue.  */
2999 	      if (startswith (s, "%cq"))
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 (startswith (str, "fdiv"))
3024 		{
3025 		  special_case = SPECIAL_CASE_FDIV;
3026 		  continue;
3027 		}
3028 	      break;
3029 
3030 	    case 'o':
3031 	      if (!startswith (s, "%asi"))
3032 		break;
3033 	      s += 4;
3034 	      continue;
3035 
3036 	    case 's':
3037 	      if (!startswith (s, "%fprs"))
3038 		break;
3039 	      s += 5;
3040 	      continue;
3041 
3042 	    case '{':
3043 	      if (!startswith (s, "%mcdper"))
3044 		break;
3045 	      s += 7;
3046 	      continue;
3047 
3048             case '&':
3049               if (!startswith (s, "%entropy"))
3050                 break;
3051               s += 8;
3052               continue;
3053 
3054 	    case 'E':
3055 	      if (!startswith (s, "%ccr"))
3056 		break;
3057 	      s += 4;
3058 	      continue;
3059 
3060 	    case 't':
3061 	      if (!startswith (s, "%tbr"))
3062 		break;
3063 	      s += 4;
3064 	      continue;
3065 
3066 	    case 'w':
3067 	      if (!startswith (s, "%wim"))
3068 		break;
3069 	      s += 4;
3070 	      continue;
3071 
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 
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 (!startswith (s, "%y"))
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."));
3136 	    }			/* switch on arg code.  */
3137 
3138 	  /* Break out of for() loop.  */
3139 	  break;
3140 	}			/* For each arg that we expect.  */
3141 
3142     error:
3143       if (match == 0)
3144 	{
3145 	  /* Args don't match.  */
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);
3157 	      return special_case;
3158 	    }
3159 	}
3160       else
3161 	{
3162 	  /* We have a match.  Now see if the architecture is OK.  */
3163 	  /* String to use in case of architecture warning.  */
3164 	  const char *msg_str = str;
3165 	  int needed_arch_mask = insn->architecture;
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
3175 	    = (((bfd_uint64_t) insn->hwcaps2) << 32) | insn->hwcaps;
3176 
3177 #ifndef TE_SOLARIS
3178 	  if (hwcaps)
3179 		  hwcap_seen |= hwcaps;
3180 #endif
3181 	  if (v9_arg_p)
3182 	    {
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);
3188 	    }
3189 
3190 	  if (needed_arch_mask
3191 	      & SPARC_OPCODE_SUPPORTED (current_architecture))
3192 	    /* OK.  */
3193 	    ;
3194 	  /* Can we bump up the architecture?  */
3195 	  else if (needed_arch_mask
3196 		   & SPARC_OPCODE_SUPPORTED (max_architecture))
3197 	    {
3198 	      enum sparc_opcode_arch_val needed_architecture =
3199 		sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
3200 			   & needed_arch_mask);
3201 
3202 	      gas_assert (needed_architecture <= SPARC_OPCODE_ARCH_MAX);
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,
3209 			   msg_str);
3210 		  warn_after_architecture = needed_architecture;
3211 		}
3212 	      current_architecture = needed_architecture;
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);
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 	    {
3226 	      int arch, printed_one_p = 0;
3227 	      char *p;
3228 	      char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
3229 
3230 	      /* Create a list of the architectures that support the insn.  */
3231 	      needed_arch_mask &= ~SPARC_OPCODE_SUPPORTED (max_architecture);
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 
3247 	      as_bad (_("Architecture mismatch on \"%s %s\"."), str, argsStart);
3248 	      as_tsktsk (_("(Requires %s; requested architecture is %s.)"),
3249 			 required_archs,
3250 			 sparc_opcode_archs[max_architecture].name);
3251 	      return special_case;
3252 	    }
3253 
3254 	  /* Make sure the hwcaps used by the instruction are
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 	    }
3264 	} /* If no match.  */
3265 
3266       break;
3267     } /* Forever looking for a match.  */
3268 
3269   the_insn.opcode = opcode;
3270   return special_case;
3271 }
3272 
3273 static char *
skip_over_keyword(char * q)3274 skip_over_keyword (char *q)
3275 {
3276   for (q = q + (*q == '#' || *q == '%');
3277        ISALNUM (*q) || *q == '_';
3278        ++q)
3279     continue;
3280   return q;
3281 }
3282 
3283 static int
parse_sparc_asi(char ** input_pointer_p,const sparc_asi ** value_p)3284 parse_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 
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 
3307 static int
parse_keyword_arg(int (* lookup_fn)(const char *),char ** input_pointerP,int * valueP)3308 parse_keyword_arg (int (*lookup_fn) (const char *),
3309 		   char **input_pointerP,
3310 		   int *valueP)
3311 {
3312   int value;
3313   char c, *p, *q;
3314 
3315   p = *input_pointerP;
3316   q = skip_over_keyword(p);
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 
3331 static int
parse_const_expr_arg(char ** input_pointerP,int * valueP)3332 parse_const_expr_arg (char **input_pointerP, int *valueP)
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 
3361 static int
get_expression(char * str)3362 get_expression (char *str)
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 
3388 static void
output_insn(const struct sparc_opcode * insn,struct sparc_it * theinsn)3389 output_insn (const struct sparc_opcode *insn, struct sparc_it *theinsn)
3390 {
3391   char *toP = frag_more (4);
3392 
3393   /* Put out the opcode.  */
3394   if (INSN_BIG_ENDIAN)
3395     number_to_chars_bigendian (toP, (valueT) theinsn->opcode, 4);
3396   else
3397     number_to_chars_littleendian (toP, (valueT) theinsn->opcode, 4);
3398 
3399   /* Put out the symbol-dependent stuff.  */
3400   if (theinsn->reloc != BFD_RELOC_NONE)
3401     {
3402       fixS *fixP =  fix_new_exp (frag_now,	/* Which frag.  */
3403 				 (toP - frag_now->fr_literal),	/* Where.  */
3404 				 4,		/* Size.  */
3405 				 &theinsn->exp,
3406 				 theinsn->pcrel,
3407 				 theinsn->reloc);
3408       /* Turn off overflow checking in fixup_segment.  We'll do our
3409 	 own overflow checking in md_apply_fix.  This is necessary because
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;
3413       if (theinsn->reloc == BFD_RELOC_SPARC_OLO10)
3414 	fixP->tc_fix_data = theinsn->exp2.X_add_number;
3415     }
3416 
3417   last_insn = insn;
3418   last_opcode = theinsn->opcode;
3419 
3420   dwarf2_emit_insn (4);
3421 }
3422 
3423 const char *
md_atof(int type,char * litP,int * sizeP)3424 md_atof (int type, char *litP, int *sizeP)
3425 {
3426   return ieee_md_atof (type, litP, sizeP, target_big_endian);
3427 }
3428 
3429 /* Write a value out to the object file, using the appropriate
3430    endianness.  */
3431 
3432 void
md_number_to_chars(char * buf,valueT val,int n)3433 md_number_to_chars (char *buf, valueT val, int n)
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))
3439     /* Output debug words, which are not in allocated sections, as big
3440        endian.  */
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 
3446 /* Apply a fixS to the frags, now that we know the value it ought to
3447    hold.  */
3448 
3449 void
md_apply_fix(fixS * fixP,valueT * valP,segT segment ATTRIBUTE_UNUSED)3450 md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED)
3451 {
3452   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3453   offsetT val = * (offsetT *) valP;
3454   long insn;
3455 
3456   gas_assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
3457 
3458   fixP->fx_addnumber = val;	/* Remember value for emit_reloc.  */
3459 
3460   /* SPARC ELF relocations don't use an addend in the data field.  */
3461   if (fixP->fx_addsy != NULL)
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     }
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 
3504   /* If this is a data relocation, just output VAL.  */
3505 
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)
3512     {
3513       md_number_to_chars (buf, val, 2);
3514     }
3515   else if (fixP->fx_r_type == BFD_RELOC_32
3516 	   || fixP->fx_r_type == BFD_RELOC_SPARC_UA32
3517 	   || fixP->fx_r_type == BFD_RELOC_SPARC_REV32)
3518     {
3519       md_number_to_chars (buf, val, 4);
3520     }
3521   else if (fixP->fx_r_type == BFD_RELOC_64
3522 	   || fixP->fx_r_type == BFD_RELOC_SPARC_UA64)
3523     {
3524       md_number_to_chars (buf, val, 8);
3525     }
3526   else if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3527            || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3528     {
3529       fixP->fx_done = 0;
3530       return;
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);
3540 
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
3549 	      || symbol_section_p (fixP->fx_addsy))
3550 	    ++val;
3551 
3552 	  insn |= val & 0x3fffffff;
3553 
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
3560 	      && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix)
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);
3584 	      if ((insn & OP (~0)) != OP (1) || (delay & OP (~0)) != OP (2))
3585 		break;
3586 	      if ((delay & OP3 (~0)) != OP3 (0x3d) /* Restore.  */
3587 		  && ((delay & OP3 (0x28)) != 0 /* Arithmetic.  */
3588 		      || ((delay & RD (~0)) != RD (O7))))
3589 		break;
3590 	      if ((delay & RS1 (~0)) == RS1 (O7)
3591 		  || ((delay & F3I (~0)) == 0
3592 		      && (delay & RS2 (~0)) == RS2 (O7)))
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))
3604 		/* ba,pt %xcc  */
3605 		insn = INSN_BPA | (val & 0x7ffff);
3606 	      else
3607 		/* ba  */
3608 		insn = INSN_BA | (val & 0x3fffff);
3609 	      if (fixP->fx_where >= 4
3610 		  && ((delay & (0xffffffff ^ RS1 (~0)))
3611 		      == (INSN_OR | RD (O7) | RS2 (G0))))
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);
3620 		  if ((setter & (0xffffffff ^ RD (~0)))
3621 		      != (INSN_OR | RS1 (O7) | RS2 (G0)))
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.  */
3630 		  reg = (delay & RS1 (~0)) >> 14;
3631 		  if (reg != ((setter & RD (~0)) >> 25)
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 	    }
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 
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 
3690 	case BFD_RELOC_SPARC_WDISP16:
3691 	  if ((val & 3)
3692 	      || val >= 0x1fffc
3693 	      || val <= -(offsetT) 0x20008)
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:
3702 	  if ((val & 3)
3703 	      || val >= 0xffffc
3704 	      || val <= -(offsetT) 0x100008)
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);
3714 	  /* Fall through.  */
3715 
3716 	case BFD_RELOC_SPARC_LM22:
3717 	case BFD_RELOC_HI22:
3718 	  if (!fixP->fx_addsy)
3719 	    insn |= (val >> 10) & 0x3fffff;
3720 	  else
3721 	    /* FIXME: Need comment explaining why we do this.  */
3722 	    insn &= ~0xffff;
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);
3734 	  /* Fall through.  */
3735 
3736 	case BFD_RELOC_LO10:
3737 	  if (!fixP->fx_addsy)
3738 	    insn |= val & 0x3ff;
3739 	  else
3740 	    /* FIXME: Need comment explaining why we do this.  */
3741 	    insn &= ~0xff;
3742 	  break;
3743 
3744 	case BFD_RELOC_SPARC_OLO10:
3745 	  val &= 0x3ff;
3746 	  val += fixP->tc_fix_data;
3747 	  /* Fall through.  */
3748 
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;
3758 	  /* Fall through.  */
3759 	case BFD_RELOC_SPARC_BASE22:
3760 	  insn |= val & 0x3fffff;
3761 	  break;
3762 
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 
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 	    {
3794 	      val ^= ~(offsetT) 0;
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;
3821 }
3822 
3823 /* Translate internal representation of relocation info to BFD target
3824    format.  */
3825 
3826 arelent **
tc_gen_reloc(asection * section,fixS * fixp)3827 tc_gen_reloc (asection *section, fixS *fixp)
3828 {
3829   static arelent *relocs[3];
3830   arelent *reloc;
3831   bfd_reloc_code_real_type code;
3832 
3833   relocs[0] = reloc = XNEW (arelent);
3834   relocs[1] = NULL;
3835 
3836   reloc->sym_ptr_ptr = XNEW (asymbol *);
3837   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3838   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3839 
3840   switch (fixp->fx_r_type)
3841     {
3842     case BFD_RELOC_8:
3843     case BFD_RELOC_16:
3844     case BFD_RELOC_32:
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.  */
3869     case BFD_RELOC_HI22:
3870     case BFD_RELOC_LO10:
3871     case BFD_RELOC_32_PCREL_S2:
3872     case BFD_RELOC_SPARC13:
3873     case BFD_RELOC_SPARC22:
3874     case BFD_RELOC_SPARC_PC22:
3875     case BFD_RELOC_SPARC_PC10:
3876     case BFD_RELOC_SPARC_BASE13:
3877     case BFD_RELOC_SPARC_WDISP10:
3878     case BFD_RELOC_SPARC_WDISP16:
3879     case BFD_RELOC_SPARC_WDISP19:
3880     case BFD_RELOC_SPARC_WDISP22:
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:
3892     case BFD_RELOC_SPARC_H34:
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:
3899     case BFD_RELOC_SPARC_OLO10:
3900     case BFD_RELOC_SPARC_UA16:
3901     case BFD_RELOC_SPARC_UA32:
3902     case BFD_RELOC_SPARC_UA64:
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:
3909     case BFD_RELOC_VTABLE_ENTRY:
3910     case BFD_RELOC_VTABLE_INHERIT:
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:
3931     case BFD_RELOC_SPARC_GOTDATA_OP_HIX22:
3932     case BFD_RELOC_SPARC_GOTDATA_OP_LOX10:
3933     case BFD_RELOC_SPARC_GOTDATA_OP:
3934       code = fixp->fx_r_type;
3935       break;
3936     default:
3937       abort ();
3938       return NULL;
3939     }
3940 
3941   /* If we are generating PIC code, we need to generate a different
3942      set of relocs.  */
3943 
3944 #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
3945 #ifdef TE_VXWORKS
3946 #define GOTT_BASE "__GOTT_BASE__"
3947 #define GOTT_INDEX "__GOTT_INDEX__"
3948 #endif
3949 
3950   /* This code must be parallel to tc_fix_adjustable.  */
3951 
3952   if (sparc_pic_code)
3953     {
3954       switch (code)
3955 	{
3956 	case BFD_RELOC_32_PCREL_S2:
3957 	  if (generic_force_reloc (fixp))
3958 	    code = BFD_RELOC_SPARC_WPLT30;
3959 	  break;
3960 	case BFD_RELOC_HI22:
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 	    }
3972 	  break;
3973 	case BFD_RELOC_LO10:
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 	    }
3985 	  break;
3986 	case BFD_RELOC_SPARC13:
3987 	  code = BFD_RELOC_SPARC_GOT13;
3988 	  break;
3989 	default:
3990 	  break;
3991 	}
3992     }
3993 
3994   /* Nothing is aligned in DWARF debugging sections.  */
3995   if (bfd_section_flags (section) & SEC_DEBUGGING)
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 
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);
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));
4013       xfree (reloc);
4014       relocs[0] = NULL;
4015       return relocs;
4016     }
4017 
4018   /* @@ Why fx_addnumber sometimes and fx_offset other times?  */
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
4023       && code != BFD_RELOC_SPARC_WDISP10
4024       && code != BFD_RELOC_SPARC_WPLT30
4025       && code != BFD_RELOC_SPARC_TLS_GD_CALL
4026       && code != BFD_RELOC_SPARC_TLS_LDM_CALL)
4027     reloc->addend = fixp->fx_addnumber;
4028   else if (symbol_section_p (fixp->fx_addsy))
4029     reloc->addend = (section->vma
4030 		     + fixp->fx_addnumber
4031 		     + md_pcrel_from (fixp));
4032   else
4033     reloc->addend = fixp->fx_offset;
4034 
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     {
4039       relocs[1] = reloc = XNEW (arelent);
4040       relocs[2] = NULL;
4041 
4042       reloc->sym_ptr_ptr = XNEW (asymbol *);
4043       *reloc->sym_ptr_ptr
4044 	= symbol_get_bfdsym (section_symbol (absolute_section));
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;
4051 }
4052 
4053 /* We have no need to default values of symbols.  */
4054 
4055 symbolS *
md_undefined_symbol(char * name ATTRIBUTE_UNUSED)4056 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
4057 {
4058   return 0;
4059 }
4060 
4061 /* Round up a section size to the appropriate boundary.  */
4062 
4063 valueT
md_section_align(segT segment ATTRIBUTE_UNUSED,valueT size)4064 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
4065 {
4066   return size;
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.
4072    (??? Is this right?  FIXME-SOON)  */
4073 long
md_pcrel_from(fixS * fixP)4074 md_pcrel_from (fixS *fixP)
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
4081       || symbol_section_p (fixP->fx_addsy))
4082     ret += fixP->fx_size;
4083   return ret;
4084 }
4085 
4086 /* Return log2 (VALUE), or -1 if VALUE is not an exact positive power
4087    of two.  */
4088 
4089 static int
mylog2(int value)4090 mylog2 (int value)
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 
4103 /* Sort of like s_lcomm.  */
4104 
4105 static void
s_reserve(int ignore ATTRIBUTE_UNUSED)4106 s_reserve (int ignore ATTRIBUTE_UNUSED)
4107 {
4108   char *name;
4109   char *p;
4110   char c;
4111   int align;
4112   int size;
4113   int temp;
4114   symbolS *symbolP;
4115 
4116   c = get_symbol_name (&name);
4117   p = input_line_pointer;
4118   *p = c;
4119   SKIP_WHITESPACE_AFTER_NAME ();
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;
4135     }				/* Bad length.  */
4136 
4137   *p = 0;
4138   symbolP = symbol_find_or_make (name);
4139   *p = c;
4140 
4141   if (!startswith (input_line_pointer, ",\"bss\"")
4142       && !startswith (input_line_pointer, ",\".bss\""))
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 
4168       if (align < 0)
4169 	{
4170 	  as_bad (_("negative alignment"));
4171 	  ignore_rest_of_line ();
4172 	  return;
4173 	}
4174 
4175       if (align != 0)
4176 	{
4177 	  temp = mylog2 (align);
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 
4193   if (!S_IS_DEFINED (symbolP))
4194     {
4195       if (! need_pass_2)
4196 	{
4197 	  char *pfrag;
4198 	  segT current_seg = now_seg;
4199 	  subsegT current_subseg = now_subseg;
4200 
4201 	  /* Switch to bss.  */
4202 	  subseg_set (bss_section, 1);
4203 
4204 	  if (align)
4205 	    /* Do alignment.  */
4206 	    frag_align (align, 0, 0);
4207 
4208 	  /* Detach from old frag.  */
4209 	  if (S_GET_SEGMENT (symbolP) == bss_section)
4210 	    symbol_get_frag (symbolP)->fr_symbol = NULL;
4211 
4212 	  symbol_set_frag (symbolP, frag_now);
4213 	  pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
4214 			    (offsetT) size, (char *) 0);
4215 	  *pfrag = 0;
4216 
4217 	  S_SET_SEGMENT (symbolP, bss_section);
4218 
4219 	  subseg_set (current_seg, current_subseg);
4220 
4221 	  S_SET_SIZE (symbolP, size);
4222 	}
4223     }
4224   else
4225     {
4226       as_warn (_("Ignoring attempt to re-define symbol %s"),
4227 	       S_GET_NAME (symbolP));
4228     }
4229 
4230   demand_empty_rest_of_line ();
4231 }
4232 
4233 static void
s_common(int ignore ATTRIBUTE_UNUSED)4234 s_common (int ignore ATTRIBUTE_UNUSED)
4235 {
4236   char *name;
4237   char c;
4238   char *p;
4239   offsetT temp, size;
4240   symbolS *symbolP;
4241 
4242   c = get_symbol_name (&name);
4243   /* Just after name is now '\0'.  */
4244   p = input_line_pointer;
4245   *p = c;
4246   SKIP_WHITESPACE_AFTER_NAME ();
4247   if (*input_line_pointer != ',')
4248     {
4249       as_bad (_("Expected comma after symbol-name"));
4250       ignore_rest_of_line ();
4251       return;
4252     }
4253 
4254   /* Skip ','.  */
4255   input_line_pointer++;
4256 
4257   if ((temp = get_absolute_expression ()) < 0)
4258     {
4259       as_bad (_(".COMMon length (%lu) out of range ignored"),
4260 	      (unsigned long) temp);
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 	{
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);
4280 	}
4281     }
4282   know (symbol_get_frag (symbolP) == &zero_address_frag);
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 
4295       if (temp < 0)
4296 	{
4297 	  as_bad (_("negative alignment"));
4298 	  ignore_rest_of_line ();
4299 	  return;
4300 	}
4301 
4302       if (symbol_get_obj (symbolP)->local)
4303 	{
4304 	  segT old_sec;
4305 	  int old_subsec;
4306 	  int align;
4307 
4308 	  old_sec = now_seg;
4309 	  old_subsec = now_subseg;
4310 
4311 	  if (temp == 0)
4312 	    align = 0;
4313 	  else
4314 	    align = mylog2 (temp);
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)
4328 	    symbol_get_frag (symbolP)->fr_symbol = 0;
4329 	  symbol_set_frag (symbolP, frag_now);
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
4339 	{
4340 	allocate_common:
4341 	  S_SET_VALUE (symbolP, (valueT) size);
4342 	  S_SET_ALIGN (symbolP, temp);
4343 	  S_SET_SIZE (symbolP, size);
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 (!startswith (input_line_pointer, "bss\"")
4356 	  && !startswith (input_line_pointer, "data\""))
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 
4368   symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
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 
4388 /* Handle the .empty pseudo-op.  This suppresses the warnings about
4389    invalid delay slot usage.  */
4390 
4391 static void
s_empty(int ignore ATTRIBUTE_UNUSED)4392 s_empty (int ignore ATTRIBUTE_UNUSED)
4393 {
4394   /* The easy way to implement is to just forget about the last
4395      instruction.  */
4396   last_insn = NULL;
4397 }
4398 
4399 static void
s_seg(int ignore ATTRIBUTE_UNUSED)4400 s_seg (int ignore ATTRIBUTE_UNUSED)
4401 {
4402 
4403   if (startswith (input_line_pointer, "\"text\""))
4404     {
4405       input_line_pointer += 6;
4406       s_text (0);
4407       return;
4408     }
4409   if (startswith (input_line_pointer, "\"data\""))
4410     {
4411       input_line_pointer += 6;
4412       s_data (0);
4413       return;
4414     }
4415   if (startswith (input_line_pointer, "\"data1\""))
4416     {
4417       input_line_pointer += 7;
4418       s_data1 ();
4419       return;
4420     }
4421   if (startswith (input_line_pointer, "\"bss\""))
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.
4426 	 You can still allocate SEG_BSS stuff with .lcomm or .reserve.  */
4427       subseg_set (data_section, 255);	/* FIXME-SOMEDAY.  */
4428       return;
4429     }
4430   as_bad (_("Unknown segment type"));
4431   demand_empty_rest_of_line ();
4432 }
4433 
4434 static void
s_data1(void)4435 s_data1 (void)
4436 {
4437   subseg_set (data_section, 1);
4438   demand_empty_rest_of_line ();
4439 }
4440 
4441 static void
s_proc(int ignore ATTRIBUTE_UNUSED)4442 s_proc (int ignore ATTRIBUTE_UNUSED)
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
4452    that the expression does not need to be aligned.  */
4453 
4454 static 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 
4460 static void
s_uacons(int bytes)4461 s_uacons (int bytes)
4462 {
4463   /* Tell sparc_cons_align not to align this value.  */
4464   sparc_no_align_cons = 1;
4465   cons (bytes);
4466   sparc_no_align_cons = 0;
4467 }
4468 
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 
4473 static void
s_ncons(int bytes ATTRIBUTE_UNUSED)4474 s_ncons (int bytes ATTRIBUTE_UNUSED)
4475 {
4476   cons (sparc_arch_size == 32 ? 4 : 8);
4477 }
4478 
4479 /* Handle the SPARC ELF .register pseudo-op.  This sets the binding of a
4480    global register.
4481    The syntax is:
4482 
4483    .register %g[2367],{#scratch|symbolname|#ignore}
4484 */
4485 
4486 static void
s_register(int ignore ATTRIBUTE_UNUSED)4487 s_register (int ignore ATTRIBUTE_UNUSED)
4488 {
4489   char c;
4490   int reg;
4491   int flags;
4492   char *regname;
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;
4506       c = get_symbol_name (&regname);
4507       if (strcmp (regname, "scratch") && strcmp (regname, "ignore"))
4508 	as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
4509       if (regname[0] == 'i')
4510 	regname = NULL;
4511       else
4512 	regname = (char *) "";
4513     }
4514   else
4515     {
4516       c = get_symbol_name (&regname);
4517     }
4518 
4519   if (sparc_arch_size == 64)
4520     {
4521       if (globals[reg])
4522 	{
4523 	  if ((regname && globals[reg] != (symbolS *) 1
4524 	       && strcmp (S_GET_NAME (globals[reg]), regname))
4525 	      || ((regname != NULL) ^ (globals[reg] != (symbolS *) 1)))
4526 	    as_bad (_("redefinition of global register"));
4527 	}
4528       else
4529 	{
4530 	  if (regname == NULL)
4531 	    globals[reg] = (symbolS *) 1;
4532 	  else
4533 	    {
4534 	      if (*regname)
4535 		{
4536 		  if (symbol_find (regname))
4537 		    as_bad (_("Register symbol %s already defined."),
4538 			    regname);
4539 		}
4540 	      globals[reg] = symbol_make (regname);
4541 	      flags = symbol_get_bfdsym (globals[reg])->flags;
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;
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);
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.  */
4554 	      S_SET_SEGMENT (globals[reg], absolute_section);
4555 	      S_SET_OTHER (globals[reg], 0);
4556 	      elf_symbol (symbol_get_bfdsym (globals[reg]))
4557 		->internal_elf_sym.st_info =
4558 		  ELF_ST_INFO(STB_GLOBAL, STT_REGISTER);
4559 	      elf_symbol (symbol_get_bfdsym (globals[reg]))
4560 		->internal_elf_sym.st_shndx = SHN_UNDEF;
4561 	    }
4562 	}
4563     }
4564 
4565   (void) restore_line_pointer (c);
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.  */
4572 
4573 void
sparc_adjust_symtab(void)4574 sparc_adjust_symtab (void)
4575 {
4576   symbolS *sym;
4577 
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 }
4591 
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 
4603 void
sparc_cons_align(int nbytes)4604 sparc_cons_align (int nbytes)
4605 {
4606   int nalign;
4607 
4608   /* Only do this if we are enforcing aligned data.  */
4609   if (! enforce_aligned_data)
4610     return;
4611 
4612   /* Don't align if this is an unaligned pseudo-op.  */
4613   if (sparc_no_align_cons)
4614     return;
4615 
4616   nalign = mylog2 (nbytes);
4617   if (nalign == 0)
4618     return;
4619 
4620   gas_assert (nalign > 0);
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 
4629   frag_var (rs_align_test, 1, 1, (relax_substateT) 0,
4630 	    (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
4631 
4632   record_alignment (now_seg, nalign);
4633 }
4634 
4635 /* This is called from HANDLE_ALIGN in tc-sparc.h.  */
4636 
4637 void
sparc_handle_align(fragS * fragp)4638 sparc_handle_align (fragS *fragp)
4639 {
4640   int count, fix;
4641   char *p;
4642 
4643   count = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
4644 
4645   switch (fragp->fr_type)
4646     {
4647     case rs_align_test:
4648       if (count != 0)
4649 	as_bad_where (fragp->fr_file, fragp->fr_line, _("misaligned data"));
4650       break;
4651 
4652     case rs_align_code:
4653       p = fragp->fr_literal + fragp->fr_fix;
4654       fix = 0;
4655 
4656       if (count & 3)
4657 	{
4658 	  fix = count & 3;
4659 	  memset (p, 0, fix);
4660 	  p += fix;
4661 	  count -= fix;
4662 	}
4663 
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;
4674 	}
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;
4687     }
4688 }
4689 
4690 /* Some special processing for a Sparc ELF file.  */
4691 
4692 void
sparc_elf_final_processing(void)4693 sparc_elf_final_processing (void)
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;
4715   else if (current_architecture == SPARC_OPCODE_ARCH_V9B)
4716     elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1|EF_SPARC_SUN_US3;
4717 }
4718 
4719 const char *
sparc_cons(expressionS * exp,int size)4720 sparc_cons (expressionS *exp, int size)
4721 {
4722   char *save;
4723   const char *sparc_cons_special_reloc = NULL;
4724 
4725   SKIP_WHITESPACE ();
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 (startswith (input_line_pointer + 3, "disp"))
4732 	{
4733 	  input_line_pointer += 7;
4734 	  sparc_cons_special_reloc = "disp";
4735 	}
4736       else if (startswith (input_line_pointer + 3, "plt"))
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 	}
4746       else if (startswith (input_line_pointer + 3, "tls_dtpoff"))
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 	}
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);
4852   return sparc_cons_special_reloc;
4853 }
4854 
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 
4859 void
cons_fix_new_sparc(fragS * frag,int where,unsigned int nbytes,expressionS * exp,const char * sparc_cons_special_reloc)4860 cons_fix_new_sparc (fragS *frag,
4861 		    int where,
4862 		    unsigned int nbytes,
4863 		    expressionS *exp,
4864 		    const char *sparc_cons_special_reloc)
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 
4872   if (target_little_endian_data
4873       && nbytes == 4
4874       && now_seg->flags & SEC_ALLOC)
4875     r = BFD_RELOC_SPARC_REV32;
4876 
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 
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 	  }
4897       else if (*sparc_cons_special_reloc == 'p')
4898 	switch (nbytes)
4899 	  {
4900 	  case 4: r = BFD_RELOC_SPARC_PLT32; break;
4901 	  case 8: r = BFD_RELOC_SPARC_PLT64; break;
4902 	  }
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 	  }
4909     }
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)
4914     {
4915       switch (nbytes)
4916 	{
4917 	case 2: r = BFD_RELOC_SPARC_UA16; break;
4918 	case 4: r = BFD_RELOC_SPARC_UA32; break;
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
4925 	case 8: r = BFD_RELOC_SPARC_UA64; break;
4926 #endif
4927 	default: abort ();
4928 	}
4929    }
4930 
4931   fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
4932 }
4933 
4934 void
sparc_cfi_frame_initial_instructions(void)4935 sparc_cfi_frame_initial_instructions (void)
4936 {
4937   cfi_add_CFA_def_cfa (14, sparc_arch_size == 64 ? 0x7ff : 0);
4938 }
4939 
4940 int
sparc_regname_to_dw2regnum(char * regname)4941 sparc_regname_to_dw2regnum (char *regname)
4942 {
4943   char *q;
4944   int i;
4945 
4946   if (!regname[0])
4947     return -1;
4948 
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)
4958     {
4959       if (regname[1] < '0' || regname[1] > '8' || regname[2])
4960 	return -1;
4961       return i * 8 + regname[1] - '0';
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);
4972       if (q == NULL || *q)
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 
4989 void
sparc_cfi_emit_pcrel_expr(expressionS * exp,unsigned int nbytes)4990 sparc_cfi_emit_pcrel_expr (expressionS *exp, unsigned int nbytes)
4991 {
4992   sparc_no_align_cons = 1;
4993   emit_expr_with_reloc (exp, nbytes, "disp");
4994   sparc_no_align_cons = 0;
4995 }
4996