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