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