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