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