Initial revision
[binutils.git] / gas / config / tc-sparc.c
blob1518a8a34c48e9d5c9dba02807a6c2e4fc5ae606
1 /* tc-sparc.c -- Assemble for the SPARC
2 Copyright (C) 1989, 90-96, 97, 1998 Free Software Foundation, Inc.
3 This file is part of GAS, the GNU Assembler.
5 GAS is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
8 any later version.
10 GAS is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public
16 License along with GAS; see the file COPYING. If not, write
17 to the Free Software Foundation, 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
20 #include <stdio.h>
21 #include <ctype.h>
23 #include "as.h"
24 #include "subsegs.h"
26 #include "opcode/sparc.h"
28 #ifdef OBJ_ELF
29 #include "elf/sparc.h"
30 #endif
32 static struct sparc_arch *lookup_arch PARAMS ((char *));
33 static void init_default_arch PARAMS ((void));
34 static void sparc_ip PARAMS ((char *, const struct sparc_opcode **));
35 static int in_signed_range PARAMS ((bfd_signed_vma, bfd_signed_vma));
36 static int in_unsigned_range PARAMS ((bfd_vma, bfd_vma));
37 static int in_bitfield_range PARAMS ((bfd_signed_vma, bfd_signed_vma));
38 static int sparc_ffs PARAMS ((unsigned int));
39 static bfd_vma BSR PARAMS ((bfd_vma, int));
40 static int cmp_reg_entry PARAMS ((const PTR, const PTR));
41 static int parse_keyword_arg PARAMS ((int (*) (const char *), char **, int *));
42 static int parse_const_expr_arg PARAMS ((char **, int *));
43 static int get_expression PARAMS ((char *str));
45 /* Default architecture. */
46 /* ??? The default value should be V8, but sparclite support was added
47 by making it the default. GCC now passes -Asparclite, so maybe sometime in
48 the future we can set this to V8. */
49 #ifndef DEFAULT_ARCH
50 #define DEFAULT_ARCH "sparclite"
51 #endif
52 static char *default_arch = DEFAULT_ARCH;
54 /* Non-zero if the initial values of `max_architecture' and `sparc_arch_size'
55 have been set. */
56 static int default_init_p;
58 /* Current architecture. We don't bump up unless necessary. */
59 static enum sparc_opcode_arch_val current_architecture = SPARC_OPCODE_ARCH_V6;
61 /* The maximum architecture level we can bump up to.
62 In a 32 bit environment, don't allow bumping up to v9 by default.
63 The native assembler works this way. The user is required to pass
64 an explicit argument before we'll create v9 object files. However, if
65 we don't see any v9 insns, a v8plus object file is not created. */
66 static enum sparc_opcode_arch_val max_architecture;
68 /* Either 32 or 64, selects file format. */
69 static int sparc_arch_size;
70 /* Initial (default) value, recorded separately in case a user option
71 changes the value before md_show_usage is called. */
72 static int default_arch_size;
74 #ifdef OBJ_ELF
75 /* The currently selected v9 memory model. Currently only used for
76 ELF. */
77 static enum { MM_TSO, MM_PSO, MM_RMO } sparc_memory_model = MM_RMO;
78 #endif
80 static int architecture_requested;
81 static int warn_on_bump;
83 /* If warn_on_bump and the needed architecture is higher than this
84 architecture, issue a warning. */
85 static enum sparc_opcode_arch_val warn_after_architecture;
87 /* Non-zero if we are generating PIC code. */
88 int sparc_pic_code;
90 /* Non-zero if we should give an error when misaligned data is seen. */
91 static int enforce_aligned_data;
93 extern int target_big_endian;
95 static int target_little_endian_data;
97 /* V9 and 86x have big and little endian data, but instructions are always big
98 endian. The sparclet has bi-endian support but both data and insns have
99 the same endianness. Global `target_big_endian' is used for data.
100 The following macro is used for instructions. */
101 #ifndef INSN_BIG_ENDIAN
102 #define INSN_BIG_ENDIAN (target_big_endian \
103 || default_arch_type == sparc86x \
104 || SPARC_OPCODE_ARCH_V9_P (max_architecture))
105 #endif
107 /* handle of the OPCODE hash table */
108 static struct hash_control *op_hash;
110 static int log2 PARAMS ((int));
111 static void s_data1 PARAMS ((void));
112 static void s_seg PARAMS ((int));
113 static void s_proc PARAMS ((int));
114 static void s_reserve PARAMS ((int));
115 static void s_common PARAMS ((int));
116 static void s_empty PARAMS ((int));
117 static void s_uacons PARAMS ((int));
119 const pseudo_typeS md_pseudo_table[] =
121 {"align", s_align_bytes, 0}, /* Defaulting is invalid (0) */
122 {"common", s_common, 0},
123 {"empty", s_empty, 0},
124 {"global", s_globl, 0},
125 {"half", cons, 2},
126 {"optim", s_ignore, 0},
127 {"proc", s_proc, 0},
128 {"reserve", s_reserve, 0},
129 {"seg", s_seg, 0},
130 {"skip", s_space, 0},
131 {"word", cons, 4},
132 {"xword", cons, 8},
133 {"uahalf", s_uacons, 2},
134 {"uaword", s_uacons, 4},
135 {"uaxword", s_uacons, 8},
136 #ifdef OBJ_ELF
137 /* these are specific to sparc/svr4 */
138 {"pushsection", obj_elf_section, 0},
139 {"popsection", obj_elf_previous, 0},
140 {"2byte", s_uacons, 2},
141 {"4byte", s_uacons, 4},
142 {"8byte", s_uacons, 8},
143 #endif
144 {NULL, 0, 0},
147 const int md_reloc_size = 12; /* Size of relocation record */
149 /* This array holds the chars that always start a comment. If the
150 pre-processor is disabled, these aren't very useful */
151 const char comment_chars[] = "!"; /* JF removed '|' from comment_chars */
153 /* This array holds the chars that only start a comment at the beginning of
154 a line. If the line seems to have the form '# 123 filename'
155 .line and .file directives will appear in the pre-processed output */
156 /* Note that input_file.c hand checks for '#' at the beginning of the
157 first line of the input file. This is because the compiler outputs
158 #NO_APP at the beginning of its output. */
159 /* Also note that comments started like this one will always
160 work if '/' isn't otherwise defined. */
161 const char line_comment_chars[] = "#";
163 const char line_separator_chars[] = "";
165 /* Chars that can be used to separate mant from exp in floating point nums */
166 const char EXP_CHARS[] = "eE";
168 /* Chars that mean this number is a floating point constant */
169 /* As in 0f12.456 */
170 /* or 0d1.2345e12 */
171 const char FLT_CHARS[] = "rRsSfFdDxXpP";
173 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
174 changed in read.c. Ideally it shouldn't have to know about it at all,
175 but nothing is ideal around here. */
177 static unsigned char octal[256];
178 #define isoctal(c) octal[(unsigned char) (c)]
179 static unsigned char toHex[256];
181 struct sparc_it
183 char *error;
184 unsigned long opcode;
185 struct nlist *nlistp;
186 expressionS exp;
187 int pcrel;
188 bfd_reloc_code_real_type reloc;
191 struct sparc_it the_insn, set_insn;
193 static void output_insn
194 PARAMS ((const struct sparc_opcode *, struct sparc_it *));
196 /* Table of arguments to -A.
197 The sparc_opcode_arch table in sparc-opc.c is insufficient and incorrect
198 for this use. That table is for opcodes only. This table is for opcodes
199 and file formats. */
201 enum sparc_arch_types {v6, v7, v8, sparclet, sparclite, sparc86x, v8plus,
202 v8plusa, v9, v9a, v9_64};
204 static struct sparc_arch {
205 char *name;
206 char *opcode_arch;
207 enum sparc_arch_types arch_type;
208 /* Default word size, as specified during configuration.
209 A value of zero means can't be used to specify default architecture. */
210 int default_arch_size;
211 /* Allowable arg to -A? */
212 int user_option_p;
213 } sparc_arch_table[] = {
214 { "v6", "v6", v6, 0, 1 },
215 { "v7", "v7", v7, 0, 1 },
216 { "v8", "v8", v8, 32, 1 },
217 { "sparclet", "sparclet", sparclet, 32, 1 },
218 { "sparclite", "sparclite", sparclite, 32, 1 },
219 { "sparc86x", "sparclite", sparc86x, 32, 1 },
220 { "v8plus", "v9", v9, 0, 1 },
221 { "v8plusa", "v9a", v9, 0, 1 },
222 { "v9", "v9", v9, 0, 1 },
223 { "v9a", "v9a", v9, 0, 1 },
224 /* This exists to allow configure.in/Makefile.in to pass one
225 value to specify both the default machine and default word size. */
226 { "v9-64", "v9", v9, 64, 0 },
227 { NULL, NULL, v8, 0, 0 }
230 /* Variant of default_arch */
231 static enum sparc_arch_types default_arch_type;
233 static struct sparc_arch *
234 lookup_arch (name)
235 char *name;
237 struct sparc_arch *sa;
239 for (sa = &sparc_arch_table[0]; sa->name != NULL; sa++)
240 if (strcmp (sa->name, name) == 0)
241 break;
242 if (sa->name == NULL)
243 return NULL;
244 return sa;
247 /* Initialize the default opcode arch and word size from the default
248 architecture name. */
250 static void
251 init_default_arch ()
253 struct sparc_arch *sa = lookup_arch (default_arch);
255 if (sa == NULL
256 || sa->default_arch_size == 0)
257 as_fatal (_("Invalid default architecture, broken assembler."));
259 max_architecture = sparc_opcode_lookup_arch (sa->opcode_arch);
260 if (max_architecture == SPARC_OPCODE_ARCH_BAD)
261 as_fatal (_("Bad opcode table, broken assembler."));
262 default_arch_size = sparc_arch_size = sa->default_arch_size;
263 default_init_p = 1;
264 default_arch_type = sa->arch_type;
267 /* Called by TARGET_FORMAT. */
269 const char *
270 sparc_target_format ()
272 /* We don't get a chance to initialize anything before we're called,
273 so handle that now. */
274 if (! default_init_p)
275 init_default_arch ();
277 #ifdef OBJ_AOUT
278 #ifdef TE_NetBSD
279 return "a.out-sparc-netbsd";
280 #else
281 #ifdef TE_SPARCAOUT
282 if (target_big_endian)
283 return "a.out-sunos-big";
284 else if (default_arch_type == sparc86x && target_little_endian_data)
285 return "a.out-sunos-big";
286 else return "a.out-sparc-little";
287 #else
288 return "a.out-sunos-big";
289 #endif
290 #endif
291 #endif
293 #ifdef OBJ_BOUT
294 return "b.out.big";
295 #endif
297 #ifdef OBJ_COFF
298 #ifdef TE_LYNX
299 return "coff-sparc-lynx";
300 #else
301 return "coff-sparc";
302 #endif
303 #endif
305 #ifdef OBJ_ELF
306 return sparc_arch_size == 64 ? "elf64-sparc" : "elf32-sparc";
307 #endif
309 abort ();
313 * md_parse_option
314 * Invocation line includes a switch not recognized by the base assembler.
315 * See if it's a processor-specific option. These are:
317 * -bump
318 * Warn on architecture bumps. See also -A.
320 * -Av6, -Av7, -Av8, -Asparclite, -Asparclet
321 * Standard 32 bit architectures.
322 * -Av8plus, -Av8plusa
323 * Sparc64 in a 32 bit world.
324 * -Av9, -Av9a
325 * Sparc64 in either a 32 or 64 bit world (-32/-64 says which).
326 * This used to only mean 64 bits, but properly specifying it
327 * complicated gcc's ASM_SPECs, so now opcode selection is
328 * specified orthogonally to word size (except when specifying
329 * the default, but that is an internal implementation detail).
330 * -xarch=v8plus, -xarch=v8plusa
331 * Same as -Av8plus{,a}, for compatibility with Sun's assembler.
333 * Select the architecture and possibly the file format.
334 * Instructions or features not supported by the selected
335 * architecture cause fatal errors.
337 * The default is to start at v6, and bump the architecture up
338 * whenever an instruction is seen at a higher level. In 32 bit
339 * environments, v9 is not bumped up to, the user must pass
340 * -Av8plus{,a}.
342 * If -bump is specified, a warning is printing when bumping to
343 * higher levels.
345 * If an architecture is specified, all instructions must match
346 * that architecture. Any higher level instructions are flagged
347 * as errors. Note that in the 32 bit environment specifying
348 * -Av8plus does not automatically create a v8plus object file, a
349 * v9 insn must be seen.
351 * If both an architecture and -bump are specified, the
352 * architecture starts at the specified level, but bumps are
353 * warnings. Note that we can't set `current_architecture' to
354 * the requested level in this case: in the 32 bit environment,
355 * we still must avoid creating v8plus object files unless v9
356 * insns are seen.
358 * Note:
359 * Bumping between incompatible architectures is always an
360 * error. For example, from sparclite to v9.
363 #ifdef OBJ_ELF
364 CONST char *md_shortopts = "A:K:VQ:sq";
365 #else
366 #ifdef OBJ_AOUT
367 CONST char *md_shortopts = "A:k";
368 #else
369 CONST char *md_shortopts = "A:";
370 #endif
371 #endif
372 struct option md_longopts[] = {
373 #define OPTION_BUMP (OPTION_MD_BASE)
374 {"bump", no_argument, NULL, OPTION_BUMP},
375 #define OPTION_SPARC (OPTION_MD_BASE + 1)
376 {"sparc", no_argument, NULL, OPTION_SPARC},
377 #define OPTION_XARCH (OPTION_MD_BASE + 2)
378 {"xarch", required_argument, NULL, OPTION_XARCH},
379 #ifdef OBJ_ELF
380 #define OPTION_32 (OPTION_MD_BASE + 3)
381 {"32", no_argument, NULL, OPTION_32},
382 #define OPTION_64 (OPTION_MD_BASE + 4)
383 {"64", no_argument, NULL, OPTION_64},
384 #define OPTION_TSO (OPTION_MD_BASE + 5)
385 {"TSO", no_argument, NULL, OPTION_TSO},
386 #define OPTION_PSO (OPTION_MD_BASE + 6)
387 {"PSO", no_argument, NULL, OPTION_PSO},
388 #define OPTION_RMO (OPTION_MD_BASE + 7)
389 {"RMO", no_argument, NULL, OPTION_RMO},
390 #endif
391 #ifdef SPARC_BIENDIAN
392 #define OPTION_LITTLE_ENDIAN (OPTION_MD_BASE + 8)
393 {"EL", no_argument, NULL, OPTION_LITTLE_ENDIAN},
394 #define OPTION_BIG_ENDIAN (OPTION_MD_BASE + 9)
395 {"EB", no_argument, NULL, OPTION_BIG_ENDIAN},
396 #endif
397 #define OPTION_ENFORCE_ALIGNED_DATA (OPTION_MD_BASE + 10)
398 {"enforce-aligned-data", no_argument, NULL, OPTION_ENFORCE_ALIGNED_DATA},
399 #define OPTION_LITTLE_ENDIAN_DATA (OPTION_MD_BASE + 11)
400 {"little-endian-data", no_argument, NULL, OPTION_LITTLE_ENDIAN_DATA},
401 {NULL, no_argument, NULL, 0}
403 size_t md_longopts_size = sizeof(md_longopts);
406 md_parse_option (c, arg)
407 int c;
408 char *arg;
410 /* We don't get a chance to initialize anything before we're called,
411 so handle that now. */
412 if (! default_init_p)
413 init_default_arch ();
415 switch (c)
417 case OPTION_BUMP:
418 warn_on_bump = 1;
419 warn_after_architecture = SPARC_OPCODE_ARCH_V6;
420 break;
422 case OPTION_XARCH:
423 /* This is for compatibility with Sun's assembler. */
424 if (strcmp (arg, "v8plus") != 0
425 && strcmp (arg, "v8plusa") != 0)
427 as_bad (_("invalid architecture -xarch=%s"), arg);
428 return 0;
431 /* fall through */
433 case 'A':
435 struct sparc_arch *sa;
436 enum sparc_opcode_arch_val opcode_arch;
438 sa = lookup_arch (arg);
439 if (sa == NULL
440 || ! sa->user_option_p)
442 as_bad (_("invalid architecture -A%s"), arg);
443 return 0;
446 opcode_arch = sparc_opcode_lookup_arch (sa->opcode_arch);
447 if (opcode_arch == SPARC_OPCODE_ARCH_BAD)
448 as_fatal (_("Bad opcode table, broken assembler."));
450 max_architecture = opcode_arch;
451 architecture_requested = 1;
453 break;
455 case OPTION_SPARC:
456 /* Ignore -sparc, used by SunOS make default .s.o rule. */
457 break;
459 case OPTION_ENFORCE_ALIGNED_DATA:
460 enforce_aligned_data = 1;
461 break;
463 #ifdef SPARC_BIENDIAN
464 case OPTION_LITTLE_ENDIAN:
465 target_big_endian = 0;
466 if (default_arch_type != sparclet)
467 as_fatal ("This target does not support -EL");
468 break;
469 case OPTION_LITTLE_ENDIAN_DATA:
470 target_little_endian_data = 1;
471 target_big_endian = 0;
472 if (default_arch_type != sparc86x
473 && default_arch_type != v9)
474 as_fatal ("This target does not support --little-endian-data");
475 break;
476 case OPTION_BIG_ENDIAN:
477 target_big_endian = 1;
478 break;
479 #endif
481 #ifdef OBJ_AOUT
482 case 'k':
483 sparc_pic_code = 1;
484 break;
485 #endif
487 #ifdef OBJ_ELF
488 case OPTION_32:
489 case OPTION_64:
491 const char **list, **l;
493 sparc_arch_size = c == OPTION_32 ? 32 : 64;
494 list = bfd_target_list ();
495 for (l = list; *l != NULL; l++)
497 if (sparc_arch_size == 32)
499 if (strcmp (*l, "elf32-sparc") == 0)
500 break;
502 else
504 if (strcmp (*l, "elf64-sparc") == 0)
505 break;
508 if (*l == NULL)
509 as_fatal (_("No compiled in support for %d bit object file format"),
510 sparc_arch_size);
511 free (list);
513 break;
515 case OPTION_TSO:
516 sparc_memory_model = MM_TSO;
517 break;
519 case OPTION_PSO:
520 sparc_memory_model = MM_PSO;
521 break;
523 case OPTION_RMO:
524 sparc_memory_model = MM_RMO;
525 break;
527 case 'V':
528 print_version_id ();
529 break;
531 case 'Q':
532 /* Qy - do emit .comment
533 Qn - do not emit .comment */
534 break;
536 case 's':
537 /* use .stab instead of .stab.excl */
538 break;
540 case 'q':
541 /* quick -- native assembler does fewer checks */
542 break;
544 case 'K':
545 if (strcmp (arg, "PIC") != 0)
546 as_warn (_("Unrecognized option following -K"));
547 else
548 sparc_pic_code = 1;
549 break;
550 #endif
552 default:
553 return 0;
556 return 1;
559 void
560 md_show_usage (stream)
561 FILE *stream;
563 const struct sparc_arch *arch;
565 /* We don't get a chance to initialize anything before we're called,
566 so handle that now. */
567 if (! default_init_p)
568 init_default_arch ();
570 fprintf(stream, _("SPARC options:\n"));
571 for (arch = &sparc_arch_table[0]; arch->name; arch++)
573 if (arch != &sparc_arch_table[0])
574 fprintf (stream, " | ");
575 if (arch->user_option_p)
576 fprintf (stream, "-A%s", arch->name);
578 fprintf (stream, _("\n-xarch=v8plus | -xarch=v8plusa\n"));
579 fprintf (stream, _("\
580 specify variant of SPARC architecture\n\
581 -bump warn when assembler switches architectures\n\
582 -sparc ignored\n\
583 --enforce-aligned-data force .long, etc., to be aligned correctly\n"));
584 #ifdef OBJ_AOUT
585 fprintf (stream, _("\
586 -k generate PIC\n"));
587 #endif
588 #ifdef OBJ_ELF
589 fprintf (stream, _("\
590 -32 create 32 bit object file\n\
591 -64 create 64 bit object file\n"));
592 fprintf (stream, _("\
593 [default is %d]\n"), default_arch_size);
594 fprintf (stream, _("\
595 -TSO use Total Store Ordering\n\
596 -PSO use Partial Store Ordering\n\
597 -RMO use Relaxed Memory Ordering\n"));
598 fprintf (stream, _("\
599 [default is %s]\n"), (default_arch_size == 64) ? "RMO" : "TSO");
600 fprintf (stream, _("\
601 -KPIC generate PIC\n\
602 -V print assembler version number\n\
603 -q ignored\n\
604 -Qy, -Qn ignored\n\
605 -s ignored\n"));
606 #endif
607 #ifdef SPARC_BIENDIAN
608 fprintf (stream, _("\
609 -EL generate code for a little endian machine\n\
610 -EB generate code for a big endian machine\n\
611 --little-endian-data generate code for a machine having big endian\n\
612 instructions and little endian data."));
613 #endif
616 /* sparc64 priviledged registers */
618 struct priv_reg_entry
620 char *name;
621 int regnum;
624 struct priv_reg_entry priv_reg_table[] =
626 {"tpc", 0},
627 {"tnpc", 1},
628 {"tstate", 2},
629 {"tt", 3},
630 {"tick", 4},
631 {"tba", 5},
632 {"pstate", 6},
633 {"tl", 7},
634 {"pil", 8},
635 {"cwp", 9},
636 {"cansave", 10},
637 {"canrestore", 11},
638 {"cleanwin", 12},
639 {"otherwin", 13},
640 {"wstate", 14},
641 {"fq", 15},
642 {"ver", 31},
643 {"", -1}, /* end marker */
646 /* v9a specific asrs */
648 struct priv_reg_entry v9a_asr_table[] =
650 {"tick_cmpr", 23},
651 {"softint", 22},
652 {"set_softint", 20},
653 {"pic", 17},
654 {"pcr", 16},
655 {"gsr", 19},
656 {"dcr", 18},
657 {"clear_softint", 21},
658 {"", -1}, /* end marker */
661 static int
662 cmp_reg_entry (parg, qarg)
663 const PTR parg;
664 const PTR qarg;
666 const struct priv_reg_entry *p = (const struct priv_reg_entry *) parg;
667 const struct priv_reg_entry *q = (const struct priv_reg_entry *) qarg;
669 return strcmp (q->name, p->name);
672 /* This function is called once, at assembler startup time. It should
673 set up all the tables, etc. that the MD part of the assembler will need. */
675 void
676 md_begin ()
678 register const char *retval = NULL;
679 int lose = 0;
680 register unsigned int i = 0;
682 /* We don't get a chance to initialize anything before md_parse_option
683 is called, and it may not be called, so handle default initialization
684 now if not already done. */
685 if (! default_init_p)
686 init_default_arch ();
688 op_hash = hash_new ();
690 while (i < (unsigned int) sparc_num_opcodes)
692 const char *name = sparc_opcodes[i].name;
693 retval = hash_insert (op_hash, name, (PTR) &sparc_opcodes[i]);
694 if (retval != NULL)
696 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
697 sparc_opcodes[i].name, retval);
698 lose = 1;
702 if (sparc_opcodes[i].match & sparc_opcodes[i].lose)
704 fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"),
705 sparc_opcodes[i].name, sparc_opcodes[i].args);
706 lose = 1;
708 ++i;
710 while (i < (unsigned int) sparc_num_opcodes
711 && !strcmp (sparc_opcodes[i].name, name));
714 if (lose)
715 as_fatal (_("Broken assembler. No assembly attempted."));
717 for (i = '0'; i < '8'; ++i)
718 octal[i] = 1;
719 for (i = '0'; i <= '9'; ++i)
720 toHex[i] = i - '0';
721 for (i = 'a'; i <= 'f'; ++i)
722 toHex[i] = i + 10 - 'a';
723 for (i = 'A'; i <= 'F'; ++i)
724 toHex[i] = i + 10 - 'A';
726 qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]),
727 sizeof (priv_reg_table[0]), cmp_reg_entry);
729 /* If -bump, record the architecture level at which we start issuing
730 warnings. The behaviour is different depending upon whether an
731 architecture was explicitly specified. If it wasn't, we issue warnings
732 for all upwards bumps. If it was, we don't start issuing warnings until
733 we need to bump beyond the requested architecture or when we bump between
734 conflicting architectures. */
736 if (warn_on_bump
737 && architecture_requested)
739 /* `max_architecture' records the requested architecture.
740 Issue warnings if we go above it. */
741 warn_after_architecture = max_architecture;
743 /* Find the highest architecture level that doesn't conflict with
744 the requested one. */
745 for (max_architecture = SPARC_OPCODE_ARCH_MAX;
746 max_architecture > warn_after_architecture;
747 --max_architecture)
748 if (! SPARC_OPCODE_CONFLICT_P (max_architecture,
749 warn_after_architecture))
750 break;
754 /* Called after all assembly has been done. */
756 void
757 sparc_md_end ()
759 if (sparc_arch_size == 64)
761 if (current_architecture == SPARC_OPCODE_ARCH_V9A)
762 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v9a);
763 else
764 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v9);
766 else
768 if (current_architecture == SPARC_OPCODE_ARCH_V9)
769 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v8plus);
770 else if (current_architecture == SPARC_OPCODE_ARCH_V9A)
771 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v8plusa);
772 else if (current_architecture == SPARC_OPCODE_ARCH_SPARCLET)
773 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_sparclet);
774 else if (default_arch_type == sparc86x && target_little_endian_data)
775 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_sparclite_le);
776 else
778 /* The sparclite is treated like a normal sparc. Perhaps it shouldn't
779 be but for now it is (since that's the way it's always been
780 treated). */
781 bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc);
786 /* Return non-zero if VAL is in the range -(MAX+1) to MAX. */
788 static INLINE int
789 in_signed_range (val, max)
790 bfd_signed_vma val, max;
792 if (max <= 0)
793 abort ();
794 /* Sign-extend the value from the architecture word size, so that
795 0xffffffff is always considered -1 on sparc32. */
796 if (sparc_arch_size == 32)
798 bfd_signed_vma sign = (bfd_signed_vma)1 << 31;
799 val = ((val & 0xffffffff) ^ sign) - sign;
801 if (val > max)
802 return 0;
803 if (val < ~max)
804 return 0;
805 return 1;
808 /* Return non-zero if VAL is in the range 0 to MAX. */
810 static INLINE int
811 in_unsigned_range (val, max)
812 bfd_vma val, max;
814 if (val > max)
815 return 0;
816 return 1;
819 /* Return non-zero if VAL is in the range -(MAX/2+1) to MAX.
820 (e.g. -15 to +31). */
822 static INLINE int
823 in_bitfield_range (val, max)
824 bfd_signed_vma val, max;
826 if (max <= 0)
827 abort ();
828 if (val > max)
829 return 0;
830 if (val < ~(max >> 1))
831 return 0;
832 return 1;
835 static int
836 sparc_ffs (mask)
837 unsigned int mask;
839 int i;
841 if (mask == 0)
842 return -1;
844 for (i = 0; (mask & 1) == 0; ++i)
845 mask >>= 1;
846 return i;
849 /* Implement big shift right. */
850 static bfd_vma
851 BSR (val, amount)
852 bfd_vma val;
853 int amount;
855 if (sizeof (bfd_vma) <= 4 && amount >= 32)
856 as_fatal (_("Support for 64-bit arithmetic not compiled in."));
857 return val >> amount;
860 /* For communication between sparc_ip and get_expression. */
861 static char *expr_end;
863 /* For communication between md_assemble and sparc_ip. */
864 static int special_case;
866 /* Values for `special_case'.
867 Instructions that require wierd handling because they're longer than
868 4 bytes. */
869 #define SPECIAL_CASE_NONE 0
870 #define SPECIAL_CASE_SET 1
871 #define SPECIAL_CASE_SETSW 2
872 #define SPECIAL_CASE_SETX 3
873 /* FIXME: sparc-opc.c doesn't have necessary "S" trigger to enable this. */
874 #define SPECIAL_CASE_FDIV 4
876 /* Bit masks of various insns. */
877 #define NOP_INSN 0x01000000
878 #define OR_INSN 0x80100000
879 #define FMOVS_INSN 0x81A00020
880 #define SETHI_INSN 0x01000000
881 #define SLLX_INSN 0x81281000
882 #define SRA_INSN 0x81380000
884 /* The last instruction to be assembled. */
885 static const struct sparc_opcode *last_insn;
886 /* The assembled opcode of `last_insn'. */
887 static unsigned long last_opcode;
889 /* Main entry point to assemble one instruction. */
891 void
892 md_assemble (str)
893 char *str;
895 const struct sparc_opcode *insn;
897 know (str);
898 special_case = SPECIAL_CASE_NONE;
899 sparc_ip (str, &insn);
901 /* We warn about attempts to put a floating point branch in a delay slot,
902 unless the delay slot has been annulled. */
903 if (insn != NULL
904 && last_insn != NULL
905 && (insn->flags & F_FBR) != 0
906 && (last_insn->flags & F_DELAYED) != 0
907 /* ??? This test isn't completely accurate. We assume anything with
908 F_{UNBR,CONDBR,FBR} set is annullable. */
909 && ((last_insn->flags & (F_UNBR | F_CONDBR | F_FBR)) == 0
910 || (last_opcode & ANNUL) == 0))
911 as_warn (_("FP branch in delay slot"));
913 /* SPARC before v9 requires a nop instruction between a floating
914 point instruction and a floating point branch. We insert one
915 automatically, with a warning. */
916 if (max_architecture < SPARC_OPCODE_ARCH_V9
917 && insn != NULL
918 && last_insn != NULL
919 && (insn->flags & F_FBR) != 0
920 && (last_insn->flags & F_FLOAT) != 0)
922 struct sparc_it nop_insn;
924 nop_insn.opcode = NOP_INSN;
925 nop_insn.reloc = BFD_RELOC_NONE;
926 output_insn (insn, &nop_insn);
927 as_warn (_("FP branch preceded by FP instruction; NOP inserted"));
930 switch (special_case)
932 case SPECIAL_CASE_NONE:
933 /* normal insn */
934 output_insn (insn, &the_insn);
935 break;
937 case SPECIAL_CASE_SET:
939 int need_hi22_p = 0;
941 /* "set" is not defined for negative numbers in v9: it doesn't yield
942 what you expect it to. */
943 if (SPARC_OPCODE_ARCH_V9_P (max_architecture)
944 && the_insn.exp.X_op == O_constant)
946 if (the_insn.exp.X_add_number < 0)
947 as_warn (_("set: used with negative number"));
948 else if (the_insn.exp.X_add_number > (offsetT) 0xffffffff)
949 as_warn (_("set: number larger than 4294967295"));
952 /* See if operand is absolute and small; skip sethi if so. */
953 if (the_insn.exp.X_op != O_constant
954 || the_insn.exp.X_add_number >= (1 << 12)
955 || the_insn.exp.X_add_number < -(1 << 12))
957 output_insn (insn, &the_insn);
958 need_hi22_p = 1;
960 /* See if operand has no low-order bits; skip OR if so. */
961 if (the_insn.exp.X_op != O_constant
962 || (need_hi22_p && (the_insn.exp.X_add_number & 0x3FF) != 0)
963 || ! need_hi22_p)
965 int rd = (the_insn.opcode & RD (~0)) >> 25;
966 the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (rd) : 0)
967 | RD (rd)
968 | IMMED
969 | (the_insn.exp.X_add_number
970 & (need_hi22_p ? 0x3ff : 0x1fff)));
971 the_insn.reloc = (the_insn.exp.X_op != O_constant
972 ? BFD_RELOC_LO10
973 : BFD_RELOC_NONE);
974 output_insn (insn, &the_insn);
976 break;
979 case SPECIAL_CASE_SETSW:
981 /* FIXME: Not finished. */
982 break;
985 case SPECIAL_CASE_SETX:
987 #define SIGNEXT32(x) ((((x) & 0xffffffff) ^ 0x80000000) - 0x80000000)
988 int upper32 = SIGNEXT32 (BSR (the_insn.exp.X_add_number, 32));
989 int lower32 = SIGNEXT32 (the_insn.exp.X_add_number);
990 #undef SIGNEXT32
991 int tmpreg = (the_insn.opcode & RS1 (~0)) >> 14;
992 int dstreg = (the_insn.opcode & RD (~0)) >> 25;
993 /* Output directly to dst reg if lower 32 bits are all zero. */
994 int upper_dstreg = (the_insn.exp.X_op == O_constant
995 && lower32 == 0) ? dstreg : tmpreg;
996 int need_hh22_p = 0, need_hm10_p = 0, need_hi22_p = 0, need_lo10_p = 0;
998 /* The tmp reg should not be the dst reg. */
999 if (tmpreg == dstreg)
1000 as_warn (_("setx: temporary register same as destination register"));
1002 /* Reset X_add_number, we've extracted it as upper32/lower32.
1003 Otherwise fixup_segment will complain about not being able to
1004 write an 8 byte number in a 4 byte field. */
1005 the_insn.exp.X_add_number = 0;
1007 /* ??? Obviously there are other optimizations we can do
1008 (e.g. sethi+shift for 0x1f0000000) and perhaps we shouldn't be
1009 doing some of these. Later. If you do change things, try to
1010 change all of this to be table driven as well. */
1012 /* What to output depends on the number if it's constant.
1013 Compute that first, then output what we've decided upon. */
1014 if (the_insn.exp.X_op != O_constant)
1015 need_hh22_p = need_hm10_p = need_hi22_p = need_lo10_p = 1;
1016 else
1018 /* Only need hh22 if `or' insn can't handle constant. */
1019 if (upper32 < -(1 << 12) || upper32 >= (1 << 12))
1020 need_hh22_p = 1;
1022 /* Does bottom part (after sethi) have bits? */
1023 if ((need_hh22_p && (upper32 & 0x3ff) != 0)
1024 /* No hh22, but does upper32 still have bits we can't set
1025 from lower32? */
1026 || (! need_hh22_p
1027 && upper32 != 0
1028 && (upper32 != -1 || lower32 >= 0)))
1029 need_hm10_p = 1;
1031 /* If the lower half is all zero, we build the upper half directly
1032 into the dst reg. */
1033 if (lower32 != 0
1034 /* Need lower half if number is zero. */
1035 || (! need_hh22_p && ! need_hm10_p))
1037 /* No need for sethi if `or' insn can handle constant. */
1038 if (lower32 < -(1 << 12) || lower32 >= (1 << 12)
1039 /* Note that we can't use a negative constant in the `or'
1040 insn unless the upper 32 bits are all ones. */
1041 || (lower32 < 0 && upper32 != -1))
1042 need_hi22_p = 1;
1044 /* Does bottom part (after sethi) have bits? */
1045 if ((need_hi22_p && (lower32 & 0x3ff) != 0)
1046 /* No sethi. */
1047 || (! need_hi22_p && (lower32 & 0x1fff) != 0)
1048 /* Need `or' if we didn't set anything else. */
1049 || (! need_hi22_p && ! need_hh22_p && ! need_hm10_p))
1050 need_lo10_p = 1;
1054 if (need_hh22_p)
1056 the_insn.opcode = (SETHI_INSN | RD (upper_dstreg)
1057 | ((upper32 >> 10) & 0x3fffff));
1058 the_insn.reloc = (the_insn.exp.X_op != O_constant
1059 ? BFD_RELOC_SPARC_HH22 : BFD_RELOC_NONE);
1060 output_insn (insn, &the_insn);
1063 if (need_hm10_p)
1065 the_insn.opcode = (OR_INSN
1066 | (need_hh22_p ? RS1 (upper_dstreg) : 0)
1067 | RD (upper_dstreg)
1068 | IMMED
1069 | (upper32
1070 & (need_hh22_p ? 0x3ff : 0x1fff)));
1071 the_insn.reloc = (the_insn.exp.X_op != O_constant
1072 ? BFD_RELOC_SPARC_HM10 : BFD_RELOC_NONE);
1073 output_insn (insn, &the_insn);
1076 if (need_hi22_p)
1078 the_insn.opcode = (SETHI_INSN | RD (dstreg)
1079 | ((lower32 >> 10) & 0x3fffff));
1080 the_insn.reloc = BFD_RELOC_HI22;
1081 output_insn (insn, &the_insn);
1084 if (need_lo10_p)
1086 /* FIXME: One nice optimization to do here is to OR the low part
1087 with the highpart if hi22 isn't needed and the low part is
1088 positive. */
1089 the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (dstreg) : 0)
1090 | RD (dstreg)
1091 | IMMED
1092 | (lower32
1093 & (need_hi22_p ? 0x3ff : 0x1fff)));
1094 the_insn.reloc = BFD_RELOC_LO10;
1095 output_insn (insn, &the_insn);
1098 /* If we needed to build the upper part, shift it into place. */
1099 if (need_hh22_p || need_hm10_p)
1101 the_insn.opcode = (SLLX_INSN | RS1 (upper_dstreg) | RD (upper_dstreg)
1102 | IMMED | 32);
1103 the_insn.reloc = BFD_RELOC_NONE;
1104 output_insn (insn, &the_insn);
1107 /* If we needed to build both upper and lower parts, OR them together. */
1108 if ((need_hh22_p || need_hm10_p)
1109 && (need_hi22_p || need_lo10_p))
1111 the_insn.opcode = (OR_INSN | RS1 (dstreg) | RS2 (upper_dstreg)
1112 | RD (dstreg));
1113 the_insn.reloc = BFD_RELOC_NONE;
1114 output_insn (insn, &the_insn);
1116 /* We didn't need both regs, but we may have to sign extend lower32. */
1117 else if (need_hi22_p && upper32 == -1)
1119 the_insn.opcode = (SRA_INSN | RS1 (dstreg) | RD (dstreg)
1120 | IMMED | 0);
1121 the_insn.reloc = BFD_RELOC_NONE;
1122 output_insn (insn, &the_insn);
1124 break;
1127 case SPECIAL_CASE_FDIV:
1129 int rd = (the_insn.opcode >> 25) & 0x1f;
1131 output_insn (insn, &the_insn);
1133 /* According to information leaked from Sun, the "fdiv" instructions
1134 on early SPARC machines would produce incorrect results sometimes.
1135 The workaround is to add an fmovs of the destination register to
1136 itself just after the instruction. This was true on machines
1137 with Weitek 1165 float chips, such as the Sun-4/260 and /280. */
1138 assert (the_insn.reloc == BFD_RELOC_NONE);
1139 the_insn.opcode = FMOVS_INSN | rd | RD (rd);
1140 output_insn (insn, &the_insn);
1141 break;
1144 default:
1145 as_fatal (_("failed special case insn sanity check"));
1149 /* Subroutine of md_assemble to do the actual parsing. */
1151 static void
1152 sparc_ip (str, pinsn)
1153 char *str;
1154 const struct sparc_opcode **pinsn;
1156 char *error_message = "";
1157 char *s;
1158 const char *args;
1159 char c;
1160 const struct sparc_opcode *insn;
1161 char *argsStart;
1162 unsigned long opcode;
1163 unsigned int mask = 0;
1164 int match = 0;
1165 int comma = 0;
1166 int v9_arg_p;
1168 s = str;
1169 if (islower ((unsigned char) *s))
1172 ++s;
1173 while (islower ((unsigned char) *s) || isdigit ((unsigned char) *s));
1176 switch (*s)
1178 case '\0':
1179 break;
1181 case ',':
1182 comma = 1;
1184 /*FALLTHROUGH */
1186 case ' ':
1187 *s++ = '\0';
1188 break;
1190 default:
1191 as_fatal (_("Unknown opcode: `%s'"), str);
1193 insn = (struct sparc_opcode *) hash_find (op_hash, str);
1194 *pinsn = insn;
1195 if (insn == NULL)
1197 as_bad (_("Unknown opcode: `%s'"), str);
1198 return;
1200 if (comma)
1202 *--s = ',';
1205 argsStart = s;
1206 for (;;)
1208 opcode = insn->match;
1209 memset (&the_insn, '\0', sizeof (the_insn));
1210 the_insn.reloc = BFD_RELOC_NONE;
1211 v9_arg_p = 0;
1214 * Build the opcode, checking as we go to make
1215 * sure that the operands match
1217 for (args = insn->args;; ++args)
1219 switch (*args)
1221 case 'K':
1223 int kmask = 0;
1225 /* Parse a series of masks. */
1226 if (*s == '#')
1228 while (*s == '#')
1230 int mask;
1232 if (! parse_keyword_arg (sparc_encode_membar, &s,
1233 &mask))
1235 error_message = _(": invalid membar mask name");
1236 goto error;
1238 kmask |= mask;
1239 while (*s == ' ') { ++s; continue; }
1240 if (*s == '|' || *s == '+')
1241 ++s;
1242 while (*s == ' ') { ++s; continue; }
1245 else
1247 if (! parse_const_expr_arg (&s, &kmask))
1249 error_message = _(": invalid membar mask expression");
1250 goto error;
1252 if (kmask < 0 || kmask > 127)
1254 error_message = _(": invalid membar mask number");
1255 goto error;
1259 opcode |= MEMBAR (kmask);
1260 continue;
1263 case '*':
1265 int fcn = 0;
1267 /* Parse a prefetch function. */
1268 if (*s == '#')
1270 if (! parse_keyword_arg (sparc_encode_prefetch, &s, &fcn))
1272 error_message = _(": invalid prefetch function name");
1273 goto error;
1276 else
1278 if (! parse_const_expr_arg (&s, &fcn))
1280 error_message = _(": invalid prefetch function expression");
1281 goto error;
1283 if (fcn < 0 || fcn > 31)
1285 error_message = _(": invalid prefetch function number");
1286 goto error;
1289 opcode |= RD (fcn);
1290 continue;
1293 case '!':
1294 case '?':
1295 /* Parse a sparc64 privileged register. */
1296 if (*s == '%')
1298 struct priv_reg_entry *p = priv_reg_table;
1299 unsigned int len = 9999999; /* init to make gcc happy */
1301 s += 1;
1302 while (p->name[0] > s[0])
1303 p++;
1304 while (p->name[0] == s[0])
1306 len = strlen (p->name);
1307 if (strncmp (p->name, s, len) == 0)
1308 break;
1309 p++;
1311 if (p->name[0] != s[0])
1313 error_message = _(": unrecognizable privileged register");
1314 goto error;
1316 if (*args == '?')
1317 opcode |= (p->regnum << 14);
1318 else
1319 opcode |= (p->regnum << 25);
1320 s += len;
1321 continue;
1323 else
1325 error_message = _(": unrecognizable privileged register");
1326 goto error;
1329 case '_':
1330 case '/':
1331 /* Parse a v9a ancillary state register. */
1332 if (*s == '%')
1334 struct priv_reg_entry *p = v9a_asr_table;
1335 unsigned int len = 9999999; /* init to make gcc happy */
1337 s += 1;
1338 while (p->name[0] > s[0])
1339 p++;
1340 while (p->name[0] == s[0])
1342 len = strlen (p->name);
1343 if (strncmp (p->name, s, len) == 0)
1344 break;
1345 p++;
1347 if (p->name[0] != s[0])
1349 error_message = _(": unrecognizable v9a ancillary state register");
1350 goto error;
1352 if (*args == '/' && (p->regnum == 20 || p->regnum == 21))
1354 error_message = _(": rd on write only ancillary state register");
1355 goto error;
1357 if (*args == '/')
1358 opcode |= (p->regnum << 14);
1359 else
1360 opcode |= (p->regnum << 25);
1361 s += len;
1362 continue;
1364 else
1366 error_message = _(": unrecognizable v9a ancillary state register");
1367 goto error;
1370 case 'M':
1371 case 'm':
1372 if (strncmp (s, "%asr", 4) == 0)
1374 s += 4;
1376 if (isdigit ((unsigned char) *s))
1378 long num = 0;
1380 while (isdigit ((unsigned char) *s))
1382 num = num * 10 + *s - '0';
1383 ++s;
1386 if (current_architecture >= SPARC_OPCODE_ARCH_V9)
1388 if (num < 16 || 31 < num)
1390 error_message = _(": asr number must be between 16 and 31");
1391 goto error;
1394 else
1396 if (num < 0 || 31 < num)
1398 error_message = _(": asr number must be between 0 and 31");
1399 goto error;
1403 opcode |= (*args == 'M' ? RS1 (num) : RD (num));
1404 continue;
1406 else
1408 error_message = _(": expecting %asrN");
1409 goto error;
1411 } /* if %asr */
1412 break;
1414 case 'I':
1415 the_insn.reloc = BFD_RELOC_SPARC_11;
1416 goto immediate;
1418 case 'j':
1419 the_insn.reloc = BFD_RELOC_SPARC_10;
1420 goto immediate;
1422 case 'X':
1423 /* V8 systems don't understand BFD_RELOC_SPARC_5. */
1424 if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1425 the_insn.reloc = BFD_RELOC_SPARC_5;
1426 else
1427 the_insn.reloc = BFD_RELOC_SPARC13;
1428 /* These fields are unsigned, but for upward compatibility,
1429 allow negative values as well. */
1430 goto immediate;
1432 case 'Y':
1433 /* V8 systems don't understand BFD_RELOC_SPARC_6. */
1434 if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1435 the_insn.reloc = BFD_RELOC_SPARC_6;
1436 else
1437 the_insn.reloc = BFD_RELOC_SPARC13;
1438 /* These fields are unsigned, but for upward compatibility,
1439 allow negative values as well. */
1440 goto immediate;
1442 case 'k':
1443 the_insn.reloc = /* RELOC_WDISP2_14 */ BFD_RELOC_SPARC_WDISP16;
1444 the_insn.pcrel = 1;
1445 goto immediate;
1447 case 'G':
1448 the_insn.reloc = BFD_RELOC_SPARC_WDISP19;
1449 the_insn.pcrel = 1;
1450 goto immediate;
1452 case 'N':
1453 if (*s == 'p' && s[1] == 'n')
1455 s += 2;
1456 continue;
1458 break;
1460 case 'T':
1461 if (*s == 'p' && s[1] == 't')
1463 s += 2;
1464 continue;
1466 break;
1468 case 'z':
1469 if (*s == ' ')
1471 ++s;
1473 if (strncmp (s, "%icc", 4) == 0)
1475 s += 4;
1476 continue;
1478 break;
1480 case 'Z':
1481 if (*s == ' ')
1483 ++s;
1485 if (strncmp (s, "%xcc", 4) == 0)
1487 s += 4;
1488 continue;
1490 break;
1492 case '6':
1493 if (*s == ' ')
1495 ++s;
1497 if (strncmp (s, "%fcc0", 5) == 0)
1499 s += 5;
1500 continue;
1502 break;
1504 case '7':
1505 if (*s == ' ')
1507 ++s;
1509 if (strncmp (s, "%fcc1", 5) == 0)
1511 s += 5;
1512 continue;
1514 break;
1516 case '8':
1517 if (*s == ' ')
1519 ++s;
1521 if (strncmp (s, "%fcc2", 5) == 0)
1523 s += 5;
1524 continue;
1526 break;
1528 case '9':
1529 if (*s == ' ')
1531 ++s;
1533 if (strncmp (s, "%fcc3", 5) == 0)
1535 s += 5;
1536 continue;
1538 break;
1540 case 'P':
1541 if (strncmp (s, "%pc", 3) == 0)
1543 s += 3;
1544 continue;
1546 break;
1548 case 'W':
1549 if (strncmp (s, "%tick", 5) == 0)
1551 s += 5;
1552 continue;
1554 break;
1556 case '\0': /* end of args */
1557 if (*s == '\0')
1559 match = 1;
1561 break;
1563 case '+':
1564 if (*s == '+')
1566 ++s;
1567 continue;
1569 if (*s == '-')
1571 continue;
1573 break;
1575 case '[': /* these must match exactly */
1576 case ']':
1577 case ',':
1578 case ' ':
1579 if (*s++ == *args)
1580 continue;
1581 break;
1583 case '#': /* must be at least one digit */
1584 if (isdigit ((unsigned char) *s++))
1586 while (isdigit ((unsigned char) *s))
1588 ++s;
1590 continue;
1592 break;
1594 case 'C': /* coprocessor state register */
1595 if (strncmp (s, "%csr", 4) == 0)
1597 s += 4;
1598 continue;
1600 break;
1602 case 'b': /* next operand is a coprocessor register */
1603 case 'c':
1604 case 'D':
1605 if (*s++ == '%' && *s++ == 'c' && isdigit ((unsigned char) *s))
1607 mask = *s++;
1608 if (isdigit ((unsigned char) *s))
1610 mask = 10 * (mask - '0') + (*s++ - '0');
1611 if (mask >= 32)
1613 break;
1616 else
1618 mask -= '0';
1620 switch (*args)
1623 case 'b':
1624 opcode |= mask << 14;
1625 continue;
1627 case 'c':
1628 opcode |= mask;
1629 continue;
1631 case 'D':
1632 opcode |= mask << 25;
1633 continue;
1636 break;
1638 case 'r': /* next operand must be a register */
1639 case 'O':
1640 case '1':
1641 case '2':
1642 case 'd':
1643 if (*s++ == '%')
1645 switch (c = *s++)
1648 case 'f': /* frame pointer */
1649 if (*s++ == 'p')
1651 mask = 0x1e;
1652 break;
1654 goto error;
1656 case 'g': /* global register */
1657 if (isoctal (c = *s++))
1659 mask = c - '0';
1660 break;
1662 goto error;
1664 case 'i': /* in register */
1665 if (isoctal (c = *s++))
1667 mask = c - '0' + 24;
1668 break;
1670 goto error;
1672 case 'l': /* local register */
1673 if (isoctal (c = *s++))
1675 mask = (c - '0' + 16);
1676 break;
1678 goto error;
1680 case 'o': /* out register */
1681 if (isoctal (c = *s++))
1683 mask = (c - '0' + 8);
1684 break;
1686 goto error;
1688 case 's': /* stack pointer */
1689 if (*s++ == 'p')
1691 mask = 0xe;
1692 break;
1694 goto error;
1696 case 'r': /* any register */
1697 if (!isdigit ((unsigned char) (c = *s++)))
1699 goto error;
1701 /* FALLTHROUGH */
1702 case '0':
1703 case '1':
1704 case '2':
1705 case '3':
1706 case '4':
1707 case '5':
1708 case '6':
1709 case '7':
1710 case '8':
1711 case '9':
1712 if (isdigit ((unsigned char) *s))
1714 if ((c = 10 * (c - '0') + (*s++ - '0')) >= 32)
1716 goto error;
1719 else
1721 c -= '0';
1723 mask = c;
1724 break;
1726 default:
1727 goto error;
1730 /* Got the register, now figure out where
1731 it goes in the opcode. */
1732 switch (*args)
1734 case '1':
1735 opcode |= mask << 14;
1736 continue;
1738 case '2':
1739 opcode |= mask;
1740 continue;
1742 case 'd':
1743 opcode |= mask << 25;
1744 continue;
1746 case 'r':
1747 opcode |= (mask << 25) | (mask << 14);
1748 continue;
1750 case 'O':
1751 opcode |= (mask << 25) | (mask << 0);
1752 continue;
1755 break;
1757 case 'e': /* next operand is a floating point register */
1758 case 'v':
1759 case 'V':
1761 case 'f':
1762 case 'B':
1763 case 'R':
1765 case 'g':
1766 case 'H':
1767 case 'J':
1769 char format;
1771 if (*s++ == '%'
1772 && ((format = *s) == 'f')
1773 && isdigit ((unsigned char) *++s))
1775 for (mask = 0; isdigit ((unsigned char) *s); ++s)
1777 mask = 10 * mask + (*s - '0');
1778 } /* read the number */
1780 if ((*args == 'v'
1781 || *args == 'B'
1782 || *args == 'H')
1783 && (mask & 1))
1785 break;
1786 } /* register must be even numbered */
1788 if ((*args == 'V'
1789 || *args == 'R'
1790 || *args == 'J')
1791 && (mask & 3))
1793 break;
1794 } /* register must be multiple of 4 */
1796 if (mask >= 64)
1798 if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1799 error_message = _(": There are only 64 f registers; [0-63]");
1800 else
1801 error_message = _(": There are only 32 f registers; [0-31]");
1802 goto error;
1803 } /* on error */
1804 else if (mask >= 32)
1806 if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
1808 v9_arg_p = 1;
1809 mask -= 31; /* wrap high bit */
1811 else
1813 error_message = _(": There are only 32 f registers; [0-31]");
1814 goto error;
1818 else
1820 break;
1821 } /* if not an 'f' register. */
1823 switch (*args)
1825 case 'v':
1826 case 'V':
1827 case 'e':
1828 opcode |= RS1 (mask);
1829 continue;
1832 case 'f':
1833 case 'B':
1834 case 'R':
1835 opcode |= RS2 (mask);
1836 continue;
1838 case 'g':
1839 case 'H':
1840 case 'J':
1841 opcode |= RD (mask);
1842 continue;
1843 } /* pack it in. */
1845 know (0);
1846 break;
1847 } /* float arg */
1849 case 'F':
1850 if (strncmp (s, "%fsr", 4) == 0)
1852 s += 4;
1853 continue;
1855 break;
1857 case '0': /* 64 bit immediate (setx insn) */
1858 the_insn.reloc = BFD_RELOC_NONE; /* reloc handled elsewhere */
1859 goto immediate;
1861 case 'h': /* high 22 bits */
1862 the_insn.reloc = BFD_RELOC_HI22;
1863 goto immediate;
1865 case 'l': /* 22 bit PC relative immediate */
1866 the_insn.reloc = BFD_RELOC_SPARC_WDISP22;
1867 the_insn.pcrel = 1;
1868 goto immediate;
1870 case 'L': /* 30 bit immediate */
1871 the_insn.reloc = BFD_RELOC_32_PCREL_S2;
1872 the_insn.pcrel = 1;
1873 goto immediate;
1875 case 'n': /* 22 bit immediate */
1876 the_insn.reloc = BFD_RELOC_SPARC22;
1877 goto immediate;
1879 case 'i': /* 13 bit immediate */
1880 the_insn.reloc = BFD_RELOC_SPARC13;
1882 /* fallthrough */
1884 immediate:
1885 if (*s == ' ')
1886 s++;
1888 /* Check for %hi, etc. */
1889 if (*s == '%')
1891 static struct ops {
1892 /* The name as it appears in assembler. */
1893 char *name;
1894 /* strlen (name), precomputed for speed */
1895 int len;
1896 /* The reloc this pseudo-op translates to. */
1897 int reloc;
1898 /* Non-zero if for v9 only. */
1899 int v9_p;
1900 /* Non-zero if can be used in pc-relative contexts. */
1901 int pcrel_p;/*FIXME:wip*/
1902 } ops[] = {
1903 /* hix/lox must appear before hi/lo so %hix won't be
1904 mistaken for %hi. */
1905 { "hix", 3, BFD_RELOC_SPARC_HIX22, 1, 0 },
1906 { "lox", 3, BFD_RELOC_SPARC_LOX10, 1, 0 },
1907 { "hi", 2, BFD_RELOC_HI22, 0, 1 },
1908 { "lo", 2, BFD_RELOC_LO10, 0, 1 },
1909 { "hh", 2, BFD_RELOC_SPARC_HH22, 1, 1 },
1910 { "hm", 2, BFD_RELOC_SPARC_HM10, 1, 1 },
1911 { "lm", 2, BFD_RELOC_SPARC_LM22, 1, 1 },
1912 { "h44", 3, BFD_RELOC_SPARC_H44, 1, 0 },
1913 { "m44", 3, BFD_RELOC_SPARC_M44, 1, 0 },
1914 { "l44", 3, BFD_RELOC_SPARC_L44, 1, 0 },
1915 { "uhi", 3, BFD_RELOC_SPARC_HH22, 1, 0 },
1916 { "ulo", 3, BFD_RELOC_SPARC_HM10, 1, 0 },
1917 { NULL }
1919 struct ops *o;
1921 for (o = ops; o->name; o++)
1922 if (strncmp (s + 1, o->name, o->len) == 0)
1923 break;
1924 if (o->name == NULL)
1925 break;
1927 the_insn.reloc = o->reloc;
1928 s += o->len + 1;
1929 v9_arg_p = o->v9_p;
1932 /* Note that if the get_expression() fails, we will still
1933 have created U entries in the symbol table for the
1934 'symbols' in the input string. Try not to create U
1935 symbols for registers, etc. */
1937 /* This stuff checks to see if the expression ends in
1938 +%reg. If it does, it removes the register from
1939 the expression, and re-sets 's' to point to the
1940 right place. */
1942 char *s1;
1944 for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) ;
1946 if (s1 != s && isdigit ((unsigned char) s1[-1]))
1948 if (s1[-2] == '%' && s1[-3] == '+')
1950 s1 -= 3;
1951 *s1 = '\0';
1952 (void) get_expression (s);
1953 *s1 = '+';
1954 s = s1;
1955 continue;
1957 else if (strchr ("goli0123456789", s1[-2]) && s1[-3] == '%' && s1[-4] == '+')
1959 s1 -= 4;
1960 *s1 = '\0';
1961 (void) get_expression (s);
1962 *s1 = '+';
1963 s = s1;
1964 continue;
1968 (void) get_expression (s);
1969 s = expr_end;
1971 /* Check for constants that don't require emitting a reloc. */
1972 if (the_insn.exp.X_op == O_constant
1973 && the_insn.exp.X_add_symbol == 0
1974 && the_insn.exp.X_op_symbol == 0)
1976 /* For pc-relative call instructions, we reject
1977 constants to get better code. */
1978 if (the_insn.pcrel
1979 && the_insn.reloc == BFD_RELOC_32_PCREL_S2
1980 && in_signed_range (the_insn.exp.X_add_number, 0x3fff))
1982 error_message = _(": PC-relative operand can't be a constant");
1983 goto error;
1986 /* Constants that won't fit are checked in md_apply_fix3
1987 and bfd_install_relocation.
1988 ??? It would be preferable to install the constants
1989 into the insn here and save having to create a fixS
1990 for each one. There already exists code to handle
1991 all the various cases (e.g. in md_apply_fix3 and
1992 bfd_install_relocation) so duplicating all that code
1993 here isn't right. */
1996 continue;
1998 case 'a':
1999 if (*s++ == 'a')
2001 opcode |= ANNUL;
2002 continue;
2004 break;
2006 case 'A':
2008 int asi = 0;
2010 /* Parse an asi. */
2011 if (*s == '#')
2013 if (! parse_keyword_arg (sparc_encode_asi, &s, &asi))
2015 error_message = _(": invalid ASI name");
2016 goto error;
2019 else
2021 if (! parse_const_expr_arg (&s, &asi))
2023 error_message = _(": invalid ASI expression");
2024 goto error;
2026 if (asi < 0 || asi > 255)
2028 error_message = _(": invalid ASI number");
2029 goto error;
2032 opcode |= ASI (asi);
2033 continue;
2034 } /* alternate space */
2036 case 'p':
2037 if (strncmp (s, "%psr", 4) == 0)
2039 s += 4;
2040 continue;
2042 break;
2044 case 'q': /* floating point queue */
2045 if (strncmp (s, "%fq", 3) == 0)
2047 s += 3;
2048 continue;
2050 break;
2052 case 'Q': /* coprocessor queue */
2053 if (strncmp (s, "%cq", 3) == 0)
2055 s += 3;
2056 continue;
2058 break;
2060 case 'S':
2061 if (strcmp (str, "set") == 0
2062 || strcmp (str, "setuw") == 0)
2064 special_case = SPECIAL_CASE_SET;
2065 continue;
2067 else if (strcmp (str, "setsw") == 0)
2069 special_case = SPECIAL_CASE_SETSW;
2070 continue;
2072 else if (strcmp (str, "setx") == 0)
2074 special_case = SPECIAL_CASE_SETX;
2075 continue;
2077 else if (strncmp (str, "fdiv", 4) == 0)
2079 special_case = SPECIAL_CASE_FDIV;
2080 continue;
2082 break;
2084 case 'o':
2085 if (strncmp (s, "%asi", 4) != 0)
2086 break;
2087 s += 4;
2088 continue;
2090 case 's':
2091 if (strncmp (s, "%fprs", 5) != 0)
2092 break;
2093 s += 5;
2094 continue;
2096 case 'E':
2097 if (strncmp (s, "%ccr", 4) != 0)
2098 break;
2099 s += 4;
2100 continue;
2102 case 't':
2103 if (strncmp (s, "%tbr", 4) != 0)
2104 break;
2105 s += 4;
2106 continue;
2108 case 'w':
2109 if (strncmp (s, "%wim", 4) != 0)
2110 break;
2111 s += 4;
2112 continue;
2114 case 'x':
2116 char *push = input_line_pointer;
2117 expressionS e;
2119 input_line_pointer = s;
2120 expression (&e);
2121 if (e.X_op == O_constant)
2123 int n = e.X_add_number;
2124 if (n != e.X_add_number || (n & ~0x1ff) != 0)
2125 as_bad (_("OPF immediate operand out of range (0-0x1ff)"));
2126 else
2127 opcode |= e.X_add_number << 5;
2129 else
2130 as_bad (_("non-immediate OPF operand, ignored"));
2131 s = input_line_pointer;
2132 input_line_pointer = push;
2133 continue;
2136 case 'y':
2137 if (strncmp (s, "%y", 2) != 0)
2138 break;
2139 s += 2;
2140 continue;
2142 case 'u':
2143 case 'U':
2145 /* Parse a sparclet cpreg. */
2146 int cpreg;
2147 if (! parse_keyword_arg (sparc_encode_sparclet_cpreg, &s, &cpreg))
2149 error_message = _(": invalid cpreg name");
2150 goto error;
2152 opcode |= (*args == 'U' ? RS1 (cpreg) : RD (cpreg));
2153 continue;
2156 default:
2157 as_fatal (_("failed sanity check."));
2158 } /* switch on arg code */
2160 /* Break out of for() loop. */
2161 break;
2162 } /* for each arg that we expect */
2164 error:
2165 if (match == 0)
2167 /* Args don't match. */
2168 if (&insn[1] - sparc_opcodes < sparc_num_opcodes
2169 && (insn->name == insn[1].name
2170 || !strcmp (insn->name, insn[1].name)))
2172 ++insn;
2173 s = argsStart;
2174 continue;
2176 else
2178 as_bad (_("Illegal operands%s"), error_message);
2179 return;
2182 else
2184 /* We have a match. Now see if the architecture is ok. */
2185 int needed_arch_mask = insn->architecture;
2187 if (v9_arg_p)
2189 needed_arch_mask &= ~ ((1 << SPARC_OPCODE_ARCH_V9)
2190 | (1 << SPARC_OPCODE_ARCH_V9A));
2191 needed_arch_mask |= (1 << SPARC_OPCODE_ARCH_V9);
2194 if (needed_arch_mask & SPARC_OPCODE_SUPPORTED (current_architecture))
2195 ; /* ok */
2196 /* Can we bump up the architecture? */
2197 else if (needed_arch_mask & SPARC_OPCODE_SUPPORTED (max_architecture))
2199 enum sparc_opcode_arch_val needed_architecture =
2200 sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
2201 & needed_arch_mask);
2203 assert (needed_architecture <= SPARC_OPCODE_ARCH_MAX);
2204 if (warn_on_bump
2205 && needed_architecture > warn_after_architecture)
2207 as_warn (_("architecture bumped from \"%s\" to \"%s\" on \"%s\""),
2208 sparc_opcode_archs[current_architecture].name,
2209 sparc_opcode_archs[needed_architecture].name,
2210 str);
2211 warn_after_architecture = needed_architecture;
2213 current_architecture = needed_architecture;
2215 /* Conflict. */
2216 /* ??? This seems to be a bit fragile. What if the next entry in
2217 the opcode table is the one we want and it is supported?
2218 It is possible to arrange the table today so that this can't
2219 happen but what about tomorrow? */
2220 else
2222 int arch,printed_one_p = 0;
2223 char *p;
2224 char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
2226 /* Create a list of the architectures that support the insn. */
2227 needed_arch_mask &= ~ SPARC_OPCODE_SUPPORTED (max_architecture);
2228 p = required_archs;
2229 arch = sparc_ffs (needed_arch_mask);
2230 while ((1 << arch) <= needed_arch_mask)
2232 if ((1 << arch) & needed_arch_mask)
2234 if (printed_one_p)
2235 *p++ = '|';
2236 strcpy (p, sparc_opcode_archs[arch].name);
2237 p += strlen (p);
2238 printed_one_p = 1;
2240 ++arch;
2243 as_bad (_("Architecture mismatch on \"%s\"."), str);
2244 as_tsktsk (_(" (Requires %s; requested architecture is %s.)"),
2245 required_archs,
2246 sparc_opcode_archs[max_architecture].name);
2247 return;
2249 } /* if no match */
2251 break;
2252 } /* forever looking for a match */
2254 the_insn.opcode = opcode;
2257 /* Parse an argument that can be expressed as a keyword.
2258 (eg: #StoreStore or %ccfr).
2259 The result is a boolean indicating success.
2260 If successful, INPUT_POINTER is updated. */
2262 static int
2263 parse_keyword_arg (lookup_fn, input_pointerP, valueP)
2264 int (*lookup_fn) PARAMS ((const char *));
2265 char **input_pointerP;
2266 int *valueP;
2268 int value;
2269 char c, *p, *q;
2271 p = *input_pointerP;
2272 for (q = p + (*p == '#' || *p == '%');
2273 isalnum ((unsigned char) *q) || *q == '_';
2274 ++q)
2275 continue;
2276 c = *q;
2277 *q = 0;
2278 value = (*lookup_fn) (p);
2279 *q = c;
2280 if (value == -1)
2281 return 0;
2282 *valueP = value;
2283 *input_pointerP = q;
2284 return 1;
2287 /* Parse an argument that is a constant expression.
2288 The result is a boolean indicating success. */
2290 static int
2291 parse_const_expr_arg (input_pointerP, valueP)
2292 char **input_pointerP;
2293 int *valueP;
2295 char *save = input_line_pointer;
2296 expressionS exp;
2298 input_line_pointer = *input_pointerP;
2299 /* The next expression may be something other than a constant
2300 (say if we're not processing the right variant of the insn).
2301 Don't call expression unless we're sure it will succeed as it will
2302 signal an error (which we want to defer until later). */
2303 /* FIXME: It might be better to define md_operand and have it recognize
2304 things like %asi, etc. but continuing that route through to the end
2305 is a lot of work. */
2306 if (*input_line_pointer == '%')
2308 input_line_pointer = save;
2309 return 0;
2311 expression (&exp);
2312 *input_pointerP = input_line_pointer;
2313 input_line_pointer = save;
2314 if (exp.X_op != O_constant)
2315 return 0;
2316 *valueP = exp.X_add_number;
2317 return 1;
2320 /* Subroutine of sparc_ip to parse an expression. */
2322 static int
2323 get_expression (str)
2324 char *str;
2326 char *save_in;
2327 segT seg;
2329 save_in = input_line_pointer;
2330 input_line_pointer = str;
2331 seg = expression (&the_insn.exp);
2332 if (seg != absolute_section
2333 && seg != text_section
2334 && seg != data_section
2335 && seg != bss_section
2336 && seg != undefined_section)
2338 the_insn.error = _("bad segment");
2339 expr_end = input_line_pointer;
2340 input_line_pointer = save_in;
2341 return 1;
2343 expr_end = input_line_pointer;
2344 input_line_pointer = save_in;
2345 return 0;
2348 /* Subroutine of md_assemble to output one insn. */
2350 static void
2351 output_insn (insn, the_insn)
2352 const struct sparc_opcode *insn;
2353 struct sparc_it *the_insn;
2355 char *toP = frag_more (4);
2357 /* put out the opcode */
2358 if (INSN_BIG_ENDIAN)
2359 number_to_chars_bigendian (toP, (valueT) the_insn->opcode, 4);
2360 else
2361 number_to_chars_littleendian (toP, (valueT) the_insn->opcode, 4);
2363 /* put out the symbol-dependent stuff */
2364 if (the_insn->reloc != BFD_RELOC_NONE)
2366 fixS *fixP = fix_new_exp (frag_now, /* which frag */
2367 (toP - frag_now->fr_literal), /* where */
2368 4, /* size */
2369 &the_insn->exp,
2370 the_insn->pcrel,
2371 the_insn->reloc);
2372 /* Turn off overflow checking in fixup_segment. We'll do our
2373 own overflow checking in md_apply_fix3. This is necessary because
2374 the insn size is 4 and fixup_segment will signal an overflow for
2375 large 8 byte quantities. */
2376 fixP->fx_no_overflow = 1;
2379 last_insn = insn;
2380 last_opcode = the_insn->opcode;
2384 This is identical to the md_atof in m68k.c. I think this is right,
2385 but I'm not sure.
2387 Turn a string in input_line_pointer into a floating point constant of type
2388 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
2389 emitted is stored in *sizeP . An error message is returned, or NULL on OK.
2392 /* Equal to MAX_PRECISION in atof-ieee.c */
2393 #define MAX_LITTLENUMS 6
2395 char *
2396 md_atof (type, litP, sizeP)
2397 char type;
2398 char *litP;
2399 int *sizeP;
2401 int i,prec;
2402 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2403 char *t;
2405 switch (type)
2407 case 'f':
2408 case 'F':
2409 case 's':
2410 case 'S':
2411 prec = 2;
2412 break;
2414 case 'd':
2415 case 'D':
2416 case 'r':
2417 case 'R':
2418 prec = 4;
2419 break;
2421 case 'x':
2422 case 'X':
2423 prec = 6;
2424 break;
2426 case 'p':
2427 case 'P':
2428 prec = 6;
2429 break;
2431 default:
2432 *sizeP = 0;
2433 return _("Bad call to MD_ATOF()");
2436 t = atof_ieee (input_line_pointer, type, words);
2437 if (t)
2438 input_line_pointer = t;
2439 *sizeP = prec * sizeof (LITTLENUM_TYPE);
2441 if (target_big_endian)
2443 for (i = 0; i < prec; i++)
2445 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
2446 litP += sizeof (LITTLENUM_TYPE);
2449 else
2451 for (i = prec - 1; i >= 0; i--)
2453 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
2454 litP += sizeof (LITTLENUM_TYPE);
2458 return 0;
2461 /* Write a value out to the object file, using the appropriate
2462 endianness. */
2464 void
2465 md_number_to_chars (buf, val, n)
2466 char *buf;
2467 valueT val;
2468 int n;
2470 if (target_big_endian)
2471 number_to_chars_bigendian (buf, val, n);
2472 else if (target_little_endian_data
2473 && ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC))
2474 /* Output debug words, which are not in allocated sections, as big endian */
2475 number_to_chars_bigendian (buf, val, n);
2476 else if (target_little_endian_data || ! target_big_endian)
2477 number_to_chars_littleendian (buf, val, n);
2480 /* Apply a fixS to the frags, now that we know the value it ought to
2481 hold. */
2484 md_apply_fix3 (fixP, value, segment)
2485 fixS *fixP;
2486 valueT *value;
2487 segT segment;
2489 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2490 offsetT val;
2491 long insn;
2493 val = *value;
2495 assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
2497 fixP->fx_addnumber = val; /* Remember value for emit_reloc */
2499 #ifdef OBJ_ELF
2500 /* FIXME: SPARC ELF relocations don't use an addend in the data
2501 field itself. This whole approach should be somehow combined
2502 with the calls to bfd_install_relocation. Also, the value passed
2503 in by fixup_segment includes the value of a defined symbol. We
2504 don't want to include the value of an externally visible symbol. */
2505 if (fixP->fx_addsy != NULL)
2507 if (fixP->fx_addsy->sy_used_in_reloc
2508 && (S_IS_EXTERNAL (fixP->fx_addsy)
2509 || S_IS_WEAK (fixP->fx_addsy)
2510 || (sparc_pic_code && ! fixP->fx_pcrel)
2511 || (S_GET_SEGMENT (fixP->fx_addsy) != segment
2512 && ((bfd_get_section_flags (stdoutput,
2513 S_GET_SEGMENT (fixP->fx_addsy))
2514 & SEC_LINK_ONCE) != 0
2515 || strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
2516 ".gnu.linkonce",
2517 sizeof ".gnu.linkonce" - 1) == 0)))
2518 && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section
2519 && S_GET_SEGMENT (fixP->fx_addsy) != undefined_section
2520 && ! bfd_is_com_section (S_GET_SEGMENT (fixP->fx_addsy)))
2521 fixP->fx_addnumber -= S_GET_VALUE (fixP->fx_addsy);
2522 return 1;
2524 #endif
2526 /* This is a hack. There should be a better way to
2527 handle this. Probably in terms of howto fields, once
2528 we can look at these fixups in terms of howtos. */
2529 if (fixP->fx_r_type == BFD_RELOC_32_PCREL_S2 && fixP->fx_addsy)
2530 val += fixP->fx_where + fixP->fx_frag->fr_address;
2532 #ifdef OBJ_AOUT
2533 /* FIXME: More ridiculous gas reloc hacking. If we are going to
2534 generate a reloc, then we just want to let the reloc addend set
2535 the value. We do not want to also stuff the addend into the
2536 object file. Including the addend in the object file works when
2537 doing a static link, because the linker will ignore the object
2538 file contents. However, the dynamic linker does not ignore the
2539 object file contents. */
2540 if (fixP->fx_addsy != NULL
2541 && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2)
2542 val = 0;
2544 /* When generating PIC code, we do not want an addend for a reloc
2545 against a local symbol. We adjust fx_addnumber to cancel out the
2546 value already included in val, and to also cancel out the
2547 adjustment which bfd_install_relocation will create. */
2548 if (sparc_pic_code
2549 && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2
2550 && fixP->fx_addsy != NULL
2551 && ! S_IS_COMMON (fixP->fx_addsy)
2552 && (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) == 0)
2553 fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy);
2555 /* When generating PIC code, we need to fiddle to get
2556 bfd_install_relocation to do the right thing for a PC relative
2557 reloc against a local symbol which we are going to keep. */
2558 if (sparc_pic_code
2559 && fixP->fx_r_type == BFD_RELOC_32_PCREL_S2
2560 && fixP->fx_addsy != NULL
2561 && (S_IS_EXTERNAL (fixP->fx_addsy)
2562 || S_IS_WEAK (fixP->fx_addsy))
2563 && S_IS_DEFINED (fixP->fx_addsy)
2564 && ! S_IS_COMMON (fixP->fx_addsy))
2566 val = 0;
2567 fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy);
2569 #endif
2571 /* If this is a data relocation, just output VAL. */
2573 if (fixP->fx_r_type == BFD_RELOC_16)
2575 md_number_to_chars (buf, val, 2);
2577 else if (fixP->fx_r_type == BFD_RELOC_32
2578 || fixP->fx_r_type == BFD_RELOC_SPARC_REV32)
2580 md_number_to_chars (buf, val, 4);
2582 else if (fixP->fx_r_type == BFD_RELOC_64)
2584 md_number_to_chars (buf, val, 8);
2586 else if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2587 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2589 fixP->fx_done = 0;
2590 return 1;
2592 else
2594 /* It's a relocation against an instruction. */
2596 if (INSN_BIG_ENDIAN)
2597 insn = bfd_getb32 ((unsigned char *) buf);
2598 else
2599 insn = bfd_getl32 ((unsigned char *) buf);
2601 switch (fixP->fx_r_type)
2603 case BFD_RELOC_32_PCREL_S2:
2604 val = val >> 2;
2605 /* FIXME: This increment-by-one deserves a comment of why it's
2606 being done! */
2607 if (! sparc_pic_code
2608 || fixP->fx_addsy == NULL
2609 || (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) != 0)
2610 ++val;
2611 insn |= val & 0x3fffffff;
2612 break;
2614 case BFD_RELOC_SPARC_11:
2615 if (! in_signed_range (val, 0x7ff))
2616 as_bad_where (fixP->fx_file, fixP->fx_line,
2617 _("relocation overflow"));
2618 insn |= val & 0x7ff;
2619 break;
2621 case BFD_RELOC_SPARC_10:
2622 if (! in_signed_range (val, 0x3ff))
2623 as_bad_where (fixP->fx_file, fixP->fx_line,
2624 _("relocation overflow"));
2625 insn |= val & 0x3ff;
2626 break;
2628 case BFD_RELOC_SPARC_7:
2629 if (! in_bitfield_range (val, 0x7f))
2630 as_bad_where (fixP->fx_file, fixP->fx_line,
2631 _("relocation overflow"));
2632 insn |= val & 0x7f;
2633 break;
2635 case BFD_RELOC_SPARC_6:
2636 if (! in_bitfield_range (val, 0x3f))
2637 as_bad_where (fixP->fx_file, fixP->fx_line,
2638 _("relocation overflow"));
2639 insn |= val & 0x3f;
2640 break;
2642 case BFD_RELOC_SPARC_5:
2643 if (! in_bitfield_range (val, 0x1f))
2644 as_bad_where (fixP->fx_file, fixP->fx_line,
2645 _("relocation overflow"));
2646 insn |= val & 0x1f;
2647 break;
2649 case BFD_RELOC_SPARC_WDISP16:
2650 /* FIXME: simplify */
2651 if (((val > 0) && (val & ~0x3fffc))
2652 || ((val < 0) && (~(val - 1) & ~0x3fffc)))
2653 as_bad_where (fixP->fx_file, fixP->fx_line,
2654 _("relocation overflow"));
2655 /* FIXME: The +1 deserves a comment. */
2656 val = (val >> 2) + 1;
2657 insn |= ((val & 0xc000) << 6) | (val & 0x3fff);
2658 break;
2660 case BFD_RELOC_SPARC_WDISP19:
2661 /* FIXME: simplify */
2662 if (((val > 0) && (val & ~0x1ffffc))
2663 || ((val < 0) && (~(val - 1) & ~0x1ffffc)))
2664 as_bad_where (fixP->fx_file, fixP->fx_line,
2665 _("relocation overflow"));
2666 /* FIXME: The +1 deserves a comment. */
2667 val = (val >> 2) + 1;
2668 insn |= val & 0x7ffff;
2669 break;
2671 case BFD_RELOC_SPARC_HH22:
2672 val = BSR (val, 32);
2673 /* intentional fallthrough */
2675 case BFD_RELOC_SPARC_LM22:
2676 case BFD_RELOC_HI22:
2677 if (!fixP->fx_addsy)
2679 insn |= (val >> 10) & 0x3fffff;
2681 else
2683 /* FIXME: Need comment explaining why we do this. */
2684 insn &= ~0xffff;
2686 break;
2688 case BFD_RELOC_SPARC22:
2689 if (val & ~0x003fffff)
2690 as_bad_where (fixP->fx_file, fixP->fx_line,
2691 _("relocation overflow"));
2692 insn |= (val & 0x3fffff);
2693 break;
2695 case BFD_RELOC_SPARC_HM10:
2696 val = BSR (val, 32);
2697 /* intentional fallthrough */
2699 case BFD_RELOC_LO10:
2700 if (!fixP->fx_addsy)
2702 insn |= val & 0x3ff;
2704 else
2706 /* FIXME: Need comment explaining why we do this. */
2707 insn &= ~0xff;
2709 break;
2711 case BFD_RELOC_SPARC13:
2712 if (! in_signed_range (val, 0x1fff))
2713 as_bad_where (fixP->fx_file, fixP->fx_line,
2714 _("relocation overflow"));
2715 insn |= val & 0x1fff;
2716 break;
2718 case BFD_RELOC_SPARC_WDISP22:
2719 val = (val >> 2) + 1;
2720 /* FALLTHROUGH */
2721 case BFD_RELOC_SPARC_BASE22:
2722 insn |= val & 0x3fffff;
2723 break;
2725 case BFD_RELOC_SPARC_H44:
2726 if (!fixP->fx_addsy)
2728 bfd_vma tval = val;
2729 tval >>= 22;
2730 insn |= tval & 0x3fffff;
2732 break;
2734 case BFD_RELOC_SPARC_M44:
2735 if (!fixP->fx_addsy)
2736 insn |= (val >> 12) & 0x3ff;
2737 break;
2739 case BFD_RELOC_SPARC_L44:
2740 if (!fixP->fx_addsy)
2741 insn |= val & 0xfff;
2742 break;
2744 case BFD_RELOC_SPARC_HIX22:
2745 if (!fixP->fx_addsy)
2747 val ^= ~ (offsetT) 0;
2748 insn |= (val >> 10) & 0x3fffff;
2750 break;
2752 case BFD_RELOC_SPARC_LOX10:
2753 if (!fixP->fx_addsy)
2754 insn |= 0x1c00 | (val & 0x3ff);
2755 break;
2757 case BFD_RELOC_NONE:
2758 default:
2759 as_bad_where (fixP->fx_file, fixP->fx_line,
2760 _("bad or unhandled relocation type: 0x%02x"),
2761 fixP->fx_r_type);
2762 break;
2765 if (INSN_BIG_ENDIAN)
2766 bfd_putb32 (insn, (unsigned char *) buf);
2767 else
2768 bfd_putl32 (insn, (unsigned char *) buf);
2771 /* Are we finished with this relocation now? */
2772 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
2773 fixP->fx_done = 1;
2775 return 1;
2778 /* Translate internal representation of relocation info to BFD target
2779 format. */
2780 arelent *
2781 tc_gen_reloc (section, fixp)
2782 asection *section;
2783 fixS *fixp;
2785 arelent *reloc;
2786 bfd_reloc_code_real_type code;
2788 reloc = (arelent *) xmalloc (sizeof (arelent));
2790 reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
2791 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2793 switch (fixp->fx_r_type)
2795 case BFD_RELOC_16:
2796 case BFD_RELOC_32:
2797 case BFD_RELOC_HI22:
2798 case BFD_RELOC_LO10:
2799 case BFD_RELOC_32_PCREL_S2:
2800 case BFD_RELOC_SPARC13:
2801 case BFD_RELOC_SPARC_BASE13:
2802 case BFD_RELOC_SPARC_WDISP16:
2803 case BFD_RELOC_SPARC_WDISP19:
2804 case BFD_RELOC_SPARC_WDISP22:
2805 case BFD_RELOC_64:
2806 case BFD_RELOC_SPARC_5:
2807 case BFD_RELOC_SPARC_6:
2808 case BFD_RELOC_SPARC_7:
2809 case BFD_RELOC_SPARC_10:
2810 case BFD_RELOC_SPARC_11:
2811 case BFD_RELOC_SPARC_HH22:
2812 case BFD_RELOC_SPARC_HM10:
2813 case BFD_RELOC_SPARC_LM22:
2814 case BFD_RELOC_SPARC_PC_HH22:
2815 case BFD_RELOC_SPARC_PC_HM10:
2816 case BFD_RELOC_SPARC_PC_LM22:
2817 case BFD_RELOC_SPARC_H44:
2818 case BFD_RELOC_SPARC_M44:
2819 case BFD_RELOC_SPARC_L44:
2820 case BFD_RELOC_SPARC_HIX22:
2821 case BFD_RELOC_SPARC_LOX10:
2822 case BFD_RELOC_SPARC_REV32:
2823 case BFD_RELOC_VTABLE_ENTRY:
2824 case BFD_RELOC_VTABLE_INHERIT:
2825 code = fixp->fx_r_type;
2826 break;
2827 default:
2828 abort ();
2829 return NULL;
2832 #if defined (OBJ_ELF) || defined (OBJ_AOUT)
2833 /* If we are generating PIC code, we need to generate a different
2834 set of relocs. */
2836 #ifdef OBJ_ELF
2837 #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
2838 #else
2839 #define GOT_NAME "__GLOBAL_OFFSET_TABLE_"
2840 #endif
2842 if (sparc_pic_code)
2844 switch (code)
2846 case BFD_RELOC_32_PCREL_S2:
2847 if (! S_IS_DEFINED (fixp->fx_addsy)
2848 || S_IS_COMMON (fixp->fx_addsy)
2849 || S_IS_EXTERNAL (fixp->fx_addsy)
2850 || S_IS_WEAK (fixp->fx_addsy))
2851 code = BFD_RELOC_SPARC_WPLT30;
2852 break;
2853 case BFD_RELOC_HI22:
2854 if (fixp->fx_addsy != NULL
2855 && strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
2856 code = BFD_RELOC_SPARC_PC22;
2857 else
2858 code = BFD_RELOC_SPARC_GOT22;
2859 break;
2860 case BFD_RELOC_LO10:
2861 if (fixp->fx_addsy != NULL
2862 && strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
2863 code = BFD_RELOC_SPARC_PC10;
2864 else
2865 code = BFD_RELOC_SPARC_GOT10;
2866 break;
2867 case BFD_RELOC_SPARC13:
2868 code = BFD_RELOC_SPARC_GOT13;
2869 break;
2870 default:
2871 break;
2874 #endif /* defined (OBJ_ELF) || defined (OBJ_AOUT) */
2876 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2877 if (reloc->howto == 0)
2879 as_bad_where (fixp->fx_file, fixp->fx_line,
2880 _("internal error: can't export reloc type %d (`%s')"),
2881 fixp->fx_r_type, bfd_get_reloc_code_name (code));
2882 return 0;
2885 /* @@ Why fx_addnumber sometimes and fx_offset other times? */
2886 #ifdef OBJ_AOUT
2888 if (reloc->howto->pc_relative == 0
2889 || code == BFD_RELOC_SPARC_PC10
2890 || code == BFD_RELOC_SPARC_PC22)
2891 reloc->addend = fixp->fx_addnumber;
2892 else if (sparc_pic_code
2893 && fixp->fx_r_type == BFD_RELOC_32_PCREL_S2
2894 && fixp->fx_addsy != NULL
2895 && (S_IS_EXTERNAL (fixp->fx_addsy)
2896 || S_IS_WEAK (fixp->fx_addsy))
2897 && S_IS_DEFINED (fixp->fx_addsy)
2898 && ! S_IS_COMMON (fixp->fx_addsy))
2899 reloc->addend = fixp->fx_addnumber;
2900 else
2901 reloc->addend = fixp->fx_offset - reloc->address;
2903 #else /* elf or coff */
2905 if (reloc->howto->pc_relative == 0
2906 || code == BFD_RELOC_SPARC_PC10
2907 || code == BFD_RELOC_SPARC_PC22)
2908 reloc->addend = fixp->fx_addnumber;
2909 else if ((fixp->fx_addsy->bsym->flags & BSF_SECTION_SYM) != 0)
2910 reloc->addend = (section->vma
2911 + fixp->fx_addnumber
2912 + md_pcrel_from (fixp));
2913 else
2914 reloc->addend = fixp->fx_offset;
2915 #endif
2917 return reloc;
2920 /* We have no need to default values of symbols. */
2922 /* ARGSUSED */
2923 symbolS *
2924 md_undefined_symbol (name)
2925 char *name;
2927 return 0;
2928 } /* md_undefined_symbol() */
2930 /* Round up a section size to the appropriate boundary. */
2931 valueT
2932 md_section_align (segment, size)
2933 segT segment;
2934 valueT size;
2936 #ifndef OBJ_ELF
2937 /* This is not right for ELF; a.out wants it, and COFF will force
2938 the alignment anyways. */
2939 valueT align = ((valueT) 1
2940 << (valueT) bfd_get_section_alignment (stdoutput, segment));
2941 valueT newsize;
2942 /* turn alignment value into a mask */
2943 align--;
2944 newsize = (size + align) & ~align;
2945 return newsize;
2946 #else
2947 return size;
2948 #endif
2951 /* Exactly what point is a PC-relative offset relative TO?
2952 On the sparc, they're relative to the address of the offset, plus
2953 its size. This gets us to the following instruction.
2954 (??? Is this right? FIXME-SOON) */
2955 long
2956 md_pcrel_from (fixP)
2957 fixS *fixP;
2959 long ret;
2961 ret = fixP->fx_where + fixP->fx_frag->fr_address;
2962 if (! sparc_pic_code
2963 || fixP->fx_addsy == NULL
2964 || (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) != 0)
2965 ret += fixP->fx_size;
2966 return ret;
2969 /* Return log2 (VALUE), or -1 if VALUE is not an exact positive power
2970 of two. */
2972 static int
2973 log2 (value)
2974 int value;
2976 int shift;
2978 if (value <= 0)
2979 return -1;
2981 for (shift = 0; (value & 1) == 0; value >>= 1)
2982 ++shift;
2984 return (value == 1) ? shift : -1;
2988 * sort of like s_lcomm
2991 #ifndef OBJ_ELF
2992 static int max_alignment = 15;
2993 #endif
2995 static void
2996 s_reserve (ignore)
2997 int ignore;
2999 char *name;
3000 char *p;
3001 char c;
3002 int align;
3003 int size;
3004 int temp;
3005 symbolS *symbolP;
3007 name = input_line_pointer;
3008 c = get_symbol_end ();
3009 p = input_line_pointer;
3010 *p = c;
3011 SKIP_WHITESPACE ();
3013 if (*input_line_pointer != ',')
3015 as_bad (_("Expected comma after name"));
3016 ignore_rest_of_line ();
3017 return;
3020 ++input_line_pointer;
3022 if ((size = get_absolute_expression ()) < 0)
3024 as_bad (_("BSS length (%d.) <0! Ignored."), size);
3025 ignore_rest_of_line ();
3026 return;
3027 } /* bad length */
3029 *p = 0;
3030 symbolP = symbol_find_or_make (name);
3031 *p = c;
3033 if (strncmp (input_line_pointer, ",\"bss\"", 6) != 0
3034 && strncmp (input_line_pointer, ",\".bss\"", 7) != 0)
3036 as_bad (_("bad .reserve segment -- expected BSS segment"));
3037 return;
3040 if (input_line_pointer[2] == '.')
3041 input_line_pointer += 7;
3042 else
3043 input_line_pointer += 6;
3044 SKIP_WHITESPACE ();
3046 if (*input_line_pointer == ',')
3048 ++input_line_pointer;
3050 SKIP_WHITESPACE ();
3051 if (*input_line_pointer == '\n')
3053 as_bad (_("missing alignment"));
3054 ignore_rest_of_line ();
3055 return;
3058 align = (int) get_absolute_expression ();
3060 #ifndef OBJ_ELF
3061 if (align > max_alignment)
3063 align = max_alignment;
3064 as_warn (_("alignment too large; assuming %d"), align);
3066 #endif
3068 if (align < 0)
3070 as_bad (_("negative alignment"));
3071 ignore_rest_of_line ();
3072 return;
3075 if (align != 0)
3077 temp = log2 (align);
3078 if (temp < 0)
3080 as_bad (_("alignment not a power of 2"));
3081 ignore_rest_of_line ();
3082 return;
3085 align = temp;
3088 record_alignment (bss_section, align);
3090 else
3091 align = 0;
3093 if (!S_IS_DEFINED (symbolP)
3094 #ifdef OBJ_AOUT
3095 && S_GET_OTHER (symbolP) == 0
3096 && S_GET_DESC (symbolP) == 0
3097 #endif
3100 if (! need_pass_2)
3102 char *pfrag;
3103 segT current_seg = now_seg;
3104 subsegT current_subseg = now_subseg;
3106 subseg_set (bss_section, 1); /* switch to bss */
3108 if (align)
3109 frag_align (align, 0, 0); /* do alignment */
3111 /* detach from old frag */
3112 if (S_GET_SEGMENT(symbolP) == bss_section)
3113 symbolP->sy_frag->fr_symbol = NULL;
3115 symbolP->sy_frag = frag_now;
3116 pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
3117 (offsetT) size, (char *)0);
3118 *pfrag = 0;
3120 S_SET_SEGMENT (symbolP, bss_section);
3122 subseg_set (current_seg, current_subseg);
3124 #ifdef OBJ_ELF
3125 S_SET_SIZE (symbolP, size);
3126 #endif
3129 else
3131 as_warn("Ignoring attempt to re-define symbol %s",
3132 S_GET_NAME (symbolP));
3133 } /* if not redefining */
3135 demand_empty_rest_of_line ();
3138 static void
3139 s_common (ignore)
3140 int ignore;
3142 char *name;
3143 char c;
3144 char *p;
3145 int temp, size;
3146 symbolS *symbolP;
3148 name = input_line_pointer;
3149 c = get_symbol_end ();
3150 /* just after name is now '\0' */
3151 p = input_line_pointer;
3152 *p = c;
3153 SKIP_WHITESPACE ();
3154 if (*input_line_pointer != ',')
3156 as_bad (_("Expected comma after symbol-name"));
3157 ignore_rest_of_line ();
3158 return;
3160 input_line_pointer++; /* skip ',' */
3161 if ((temp = get_absolute_expression ()) < 0)
3163 as_bad (_(".COMMon length (%d.) <0! Ignored."), temp);
3164 ignore_rest_of_line ();
3165 return;
3167 size = temp;
3168 *p = 0;
3169 symbolP = symbol_find_or_make (name);
3170 *p = c;
3171 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
3173 as_bad (_("Ignoring attempt to re-define symbol"));
3174 ignore_rest_of_line ();
3175 return;
3177 if (S_GET_VALUE (symbolP) != 0)
3179 if (S_GET_VALUE (symbolP) != (valueT) size)
3181 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
3182 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
3185 else
3187 #ifndef OBJ_ELF
3188 S_SET_VALUE (symbolP, (valueT) size);
3189 S_SET_EXTERNAL (symbolP);
3190 #endif
3192 know (symbolP->sy_frag == &zero_address_frag);
3193 if (*input_line_pointer != ',')
3195 as_bad (_("Expected comma after common length"));
3196 ignore_rest_of_line ();
3197 return;
3199 input_line_pointer++;
3200 SKIP_WHITESPACE ();
3201 if (*input_line_pointer != '"')
3203 temp = get_absolute_expression ();
3205 #ifndef OBJ_ELF
3206 if (temp > max_alignment)
3208 temp = max_alignment;
3209 as_warn (_("alignment too large; assuming %d"), temp);
3211 #endif
3213 if (temp < 0)
3215 as_bad (_("negative alignment"));
3216 ignore_rest_of_line ();
3217 return;
3220 #ifdef OBJ_ELF
3221 if (symbolP->local)
3223 segT old_sec;
3224 int old_subsec;
3225 char *p;
3226 int align;
3228 old_sec = now_seg;
3229 old_subsec = now_subseg;
3231 if (temp == 0)
3232 align = 0;
3233 else
3234 align = log2 (temp);
3236 if (align < 0)
3238 as_bad (_("alignment not a power of 2"));
3239 ignore_rest_of_line ();
3240 return;
3243 record_alignment (bss_section, align);
3244 subseg_set (bss_section, 0);
3245 if (align)
3246 frag_align (align, 0, 0);
3247 if (S_GET_SEGMENT (symbolP) == bss_section)
3248 symbolP->sy_frag->fr_symbol = 0;
3249 symbolP->sy_frag = frag_now;
3250 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
3251 (offsetT) size, (char *) 0);
3252 *p = 0;
3253 S_SET_SEGMENT (symbolP, bss_section);
3254 S_CLEAR_EXTERNAL (symbolP);
3255 S_SET_SIZE (symbolP, size);
3256 subseg_set (old_sec, old_subsec);
3258 else
3259 #endif /* OBJ_ELF */
3261 allocate_common:
3262 S_SET_VALUE (symbolP, (valueT) size);
3263 #ifdef OBJ_ELF
3264 S_SET_ALIGN (symbolP, temp);
3265 S_SET_SIZE (symbolP, size);
3266 #endif
3267 S_SET_EXTERNAL (symbolP);
3268 S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
3271 else
3273 input_line_pointer++;
3274 /* @@ Some use the dot, some don't. Can we get some consistency?? */
3275 if (*input_line_pointer == '.')
3276 input_line_pointer++;
3277 /* @@ Some say data, some say bss. */
3278 if (strncmp (input_line_pointer, "bss\"", 4)
3279 && strncmp (input_line_pointer, "data\"", 5))
3281 while (*--input_line_pointer != '"')
3283 input_line_pointer--;
3284 goto bad_common_segment;
3286 while (*input_line_pointer++ != '"')
3288 goto allocate_common;
3291 #ifdef BFD_ASSEMBLER
3292 symbolP->bsym->flags |= BSF_OBJECT;
3293 #endif
3295 demand_empty_rest_of_line ();
3296 return;
3299 bad_common_segment:
3300 p = input_line_pointer;
3301 while (*p && *p != '\n')
3302 p++;
3303 c = *p;
3304 *p = '\0';
3305 as_bad (_("bad .common segment %s"), input_line_pointer + 1);
3306 *p = c;
3307 input_line_pointer = p;
3308 ignore_rest_of_line ();
3309 return;
3313 /* Handle the .empty pseudo-op. This supresses the warnings about
3314 invalid delay slot usage. */
3316 static void
3317 s_empty (ignore)
3318 int ignore;
3320 /* The easy way to implement is to just forget about the last
3321 instruction. */
3322 last_insn = NULL;
3325 static void
3326 s_seg (ignore)
3327 int ignore;
3330 if (strncmp (input_line_pointer, "\"text\"", 6) == 0)
3332 input_line_pointer += 6;
3333 s_text (0);
3334 return;
3336 if (strncmp (input_line_pointer, "\"data\"", 6) == 0)
3338 input_line_pointer += 6;
3339 s_data (0);
3340 return;
3342 if (strncmp (input_line_pointer, "\"data1\"", 7) == 0)
3344 input_line_pointer += 7;
3345 s_data1 ();
3346 return;
3348 if (strncmp (input_line_pointer, "\"bss\"", 5) == 0)
3350 input_line_pointer += 5;
3351 /* We only support 2 segments -- text and data -- for now, so
3352 things in the "bss segment" will have to go into data for now.
3353 You can still allocate SEG_BSS stuff with .lcomm or .reserve. */
3354 subseg_set (data_section, 255); /* FIXME-SOMEDAY */
3355 return;
3357 as_bad (_("Unknown segment type"));
3358 demand_empty_rest_of_line ();
3361 static void
3362 s_data1 ()
3364 subseg_set (data_section, 1);
3365 demand_empty_rest_of_line ();
3368 static void
3369 s_proc (ignore)
3370 int ignore;
3372 while (!is_end_of_line[(unsigned char) *input_line_pointer])
3374 ++input_line_pointer;
3376 ++input_line_pointer;
3379 /* This static variable is set by s_uacons to tell sparc_cons_align
3380 that the expession does not need to be aligned. */
3382 static int sparc_no_align_cons = 0;
3384 /* This handles the unaligned space allocation pseudo-ops, such as
3385 .uaword. .uaword is just like .word, but the value does not need
3386 to be aligned. */
3388 static void
3389 s_uacons (bytes)
3390 int bytes;
3392 /* Tell sparc_cons_align not to align this value. */
3393 sparc_no_align_cons = 1;
3394 cons (bytes);
3397 /* If the --enforce-aligned-data option is used, we require .word,
3398 et. al., to be aligned correctly. We do it by setting up an
3399 rs_align_code frag, and checking in HANDLE_ALIGN to make sure that
3400 no unexpected alignment was introduced.
3402 The SunOS and Solaris native assemblers enforce aligned data by
3403 default. We don't want to do that, because gcc can deliberately
3404 generate misaligned data if the packed attribute is used. Instead,
3405 we permit misaligned data by default, and permit the user to set an
3406 option to check for it. */
3408 void
3409 sparc_cons_align (nbytes)
3410 int nbytes;
3412 int nalign;
3413 char *p;
3415 /* Only do this if we are enforcing aligned data. */
3416 if (! enforce_aligned_data)
3417 return;
3419 if (sparc_no_align_cons)
3421 /* This is an unaligned pseudo-op. */
3422 sparc_no_align_cons = 0;
3423 return;
3426 nalign = log2 (nbytes);
3427 if (nalign == 0)
3428 return;
3430 assert (nalign > 0);
3432 if (now_seg == absolute_section)
3434 if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
3435 as_bad (_("misaligned data"));
3436 return;
3439 p = frag_var (rs_align_code, 1, 1, (relax_substateT) 0,
3440 (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
3442 record_alignment (now_seg, nalign);
3445 /* This is where we do the unexpected alignment check.
3446 This is called from HANDLE_ALIGN in tc-sparc.h. */
3448 void
3449 sparc_handle_align (fragp)
3450 fragS *fragp;
3452 if (fragp->fr_type == rs_align_code && !fragp->fr_subtype
3453 && fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix != 0)
3454 as_bad_where (fragp->fr_file, fragp->fr_line, _("misaligned data"));
3455 if (fragp->fr_type == rs_align_code && fragp->fr_subtype == 1024)
3457 int count = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
3459 if (count >= 4
3460 && !(count & 3)
3461 && count <= 1024
3462 && !((long)(fragp->fr_literal + fragp->fr_fix) & 3))
3464 unsigned *p = (unsigned *)(fragp->fr_literal + fragp->fr_fix);
3465 int i;
3467 for (i = 0; i < count; i += 4, p++)
3468 if (INSN_BIG_ENDIAN)
3469 number_to_chars_bigendian ((char *)p, 0x01000000, 4); /* emit nops */
3470 else
3471 number_to_chars_littleendian ((char *)p, 0x10000000, 4);
3473 if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8)
3475 char *waddr = &fragp->fr_literal[fragp->fr_fix];
3476 unsigned wval = (0x30680000 | count >> 2); /* ba,a,pt %xcc, 1f */
3477 if (INSN_BIG_ENDIAN)
3478 number_to_chars_bigendian (waddr, wval, 4);
3479 else
3480 number_to_chars_littleendian (waddr, wval, 4);
3482 fragp->fr_var = count;
3487 #ifdef OBJ_ELF
3488 /* Some special processing for a Sparc ELF file. */
3490 void
3491 sparc_elf_final_processing ()
3493 /* Set the Sparc ELF flag bits. FIXME: There should probably be some
3494 sort of BFD interface for this. */
3495 if (sparc_arch_size == 64)
3497 switch (sparc_memory_model)
3499 case MM_RMO:
3500 elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_RMO;
3501 break;
3502 case MM_PSO:
3503 elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_PSO;
3504 break;
3505 default:
3506 break;
3509 else if (current_architecture >= SPARC_OPCODE_ARCH_V9)
3510 elf_elfheader (stdoutput)->e_flags |= EF_SPARC_32PLUS;
3511 if (current_architecture == SPARC_OPCODE_ARCH_V9A)
3512 elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1;
3514 #endif
3516 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
3517 reloc for a cons. We could use the definition there, except that
3518 we want to handle little endian relocs specially. */
3520 void
3521 cons_fix_new_sparc (frag, where, nbytes, exp)
3522 fragS *frag;
3523 int where;
3524 unsigned int nbytes;
3525 expressionS *exp;
3527 bfd_reloc_code_real_type r;
3529 r = (nbytes == 1 ? BFD_RELOC_8 :
3530 (nbytes == 2 ? BFD_RELOC_16 :
3531 (nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64)));
3533 if (target_little_endian_data && nbytes == 4
3534 && now_seg->flags & SEC_ALLOC)
3535 r = BFD_RELOC_SPARC_REV32;
3536 fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
3539 #ifdef OBJ_ELF
3541 elf32_sparc_force_relocation (fixp)
3542 struct fix *fixp;
3544 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3545 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3546 return 1;
3548 return 0;
3550 #endif