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