1 /* tc-sparc.c -- Assemble for the SPARC
2 Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public
18 License along with GAS; see the file COPYING. If not, write
19 to the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
25 #include "safe-ctype.h"
28 #include "opcode/sparc.h"
29 #include "dw2gencfi.h"
32 #include "elf/sparc.h"
33 #include "dwarf2dbg.h"
36 /* Some ancient Sun C compilers would not take such hex constants as
37 unsigned, and would end up sign-extending them to form an offsetT,
38 so use these constants instead. */
39 #define U0xffffffff ((((unsigned long) 1 << 16) << 16) - 1)
40 #define U0x80000000 ((((unsigned long) 1 << 16) << 15))
42 static struct sparc_arch
*lookup_arch
PARAMS ((char *));
43 static void init_default_arch
PARAMS ((void));
44 static int sparc_ip
PARAMS ((char *, const struct sparc_opcode
**));
45 static int in_signed_range
PARAMS ((bfd_signed_vma
, bfd_signed_vma
));
46 static int in_unsigned_range
PARAMS ((bfd_vma
, bfd_vma
));
47 static int in_bitfield_range
PARAMS ((bfd_signed_vma
, bfd_signed_vma
));
48 static int sparc_ffs
PARAMS ((unsigned int));
49 static void synthetize_setuw
PARAMS ((const struct sparc_opcode
*));
50 static void synthetize_setsw
PARAMS ((const struct sparc_opcode
*));
51 static void synthetize_setx
PARAMS ((const struct sparc_opcode
*));
52 static bfd_vma BSR
PARAMS ((bfd_vma
, int));
53 static int cmp_reg_entry
PARAMS ((const PTR
, const PTR
));
54 static int parse_keyword_arg
PARAMS ((int (*) (const char *), char **, int *));
55 static int parse_const_expr_arg
PARAMS ((char **, int *));
56 static int get_expression
PARAMS ((char *str
));
58 /* Default architecture. */
59 /* ??? The default value should be V8, but sparclite support was added
60 by making it the default. GCC now passes -Asparclite, so maybe sometime in
61 the future we can set this to V8. */
63 #define DEFAULT_ARCH "sparclite"
65 static char *default_arch
= DEFAULT_ARCH
;
67 /* Non-zero if the initial values of `max_architecture' and `sparc_arch_size'
69 static int default_init_p
;
71 /* Current architecture. We don't bump up unless necessary. */
72 static enum sparc_opcode_arch_val current_architecture
= SPARC_OPCODE_ARCH_V6
;
74 /* The maximum architecture level we can bump up to.
75 In a 32 bit environment, don't allow bumping up to v9 by default.
76 The native assembler works this way. The user is required to pass
77 an explicit argument before we'll create v9 object files. However, if
78 we don't see any v9 insns, a v8plus object file is not created. */
79 static enum sparc_opcode_arch_val max_architecture
;
81 /* Either 32 or 64, selects file format. */
82 static int sparc_arch_size
;
83 /* Initial (default) value, recorded separately in case a user option
84 changes the value before md_show_usage is called. */
85 static int default_arch_size
;
88 /* The currently selected v9 memory model. Currently only used for
90 static enum { MM_TSO
, MM_PSO
, MM_RMO
} sparc_memory_model
= MM_RMO
;
93 static int architecture_requested
;
94 static int warn_on_bump
;
96 /* If warn_on_bump and the needed architecture is higher than this
97 architecture, issue a warning. */
98 static enum sparc_opcode_arch_val warn_after_architecture
;
100 /* Non-zero if as should generate error if an undeclared g[23] register
101 has been used in -64. */
102 static int no_undeclared_regs
;
104 /* Non-zero if we should try to relax jumps and calls. */
105 static int sparc_relax
;
107 /* Non-zero if we are generating PIC code. */
110 /* Non-zero if we should give an error when misaligned data is seen. */
111 static int enforce_aligned_data
;
113 extern int target_big_endian
;
115 static int target_little_endian_data
;
117 /* Symbols for global registers on v9. */
118 static symbolS
*globals
[8];
120 /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
121 int sparc_cie_data_alignment
;
123 /* V9 and 86x have big and little endian data, but instructions are always big
124 endian. The sparclet has bi-endian support but both data and insns have
125 the same endianness. Global `target_big_endian' is used for data.
126 The following macro is used for instructions. */
127 #ifndef INSN_BIG_ENDIAN
128 #define INSN_BIG_ENDIAN (target_big_endian \
129 || default_arch_type == sparc86x \
130 || SPARC_OPCODE_ARCH_V9_P (max_architecture))
133 /* Handle of the OPCODE hash table. */
134 static struct hash_control
*op_hash
;
136 static int mylog2
PARAMS ((int));
137 static void s_data1
PARAMS ((void));
138 static void s_seg
PARAMS ((int));
139 static void s_proc
PARAMS ((int));
140 static void s_reserve
PARAMS ((int));
141 static void s_common
PARAMS ((int));
142 static void s_empty
PARAMS ((int));
143 static void s_uacons
PARAMS ((int));
144 static void s_ncons
PARAMS ((int));
146 static void s_register
PARAMS ((int));
149 const pseudo_typeS md_pseudo_table
[] =
151 {"align", s_align_bytes
, 0}, /* Defaulting is invalid (0). */
152 {"common", s_common
, 0},
153 {"empty", s_empty
, 0},
154 {"global", s_globl
, 0},
156 {"nword", s_ncons
, 0},
157 {"optim", s_ignore
, 0},
159 {"reserve", s_reserve
, 0},
161 {"skip", s_space
, 0},
164 {"uahalf", s_uacons
, 2},
165 {"uaword", s_uacons
, 4},
166 {"uaxword", s_uacons
, 8},
168 /* These are specific to sparc/svr4. */
169 {"2byte", s_uacons
, 2},
170 {"4byte", s_uacons
, 4},
171 {"8byte", s_uacons
, 8},
172 {"register", s_register
, 0},
177 /* This array holds the chars that always start a comment. If the
178 pre-processor is disabled, these aren't very useful. */
179 const char comment_chars
[] = "!"; /* JF removed '|' from
182 /* This array holds the chars that only start a comment at the beginning of
183 a line. If the line seems to have the form '# 123 filename'
184 .line and .file directives will appear in the pre-processed output. */
185 /* Note that input_file.c hand checks for '#' at the beginning of the
186 first line of the input file. This is because the compiler outputs
187 #NO_APP at the beginning of its output. */
188 /* Also note that comments started like this one will always
189 work if '/' isn't otherwise defined. */
190 const char line_comment_chars
[] = "#";
192 const char line_separator_chars
[] = ";";
194 /* Chars that can be used to separate mant from exp in floating point
196 const char EXP_CHARS
[] = "eE";
198 /* Chars that mean this number is a floating point constant.
201 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
203 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
204 changed in read.c. Ideally it shouldn't have to know about it at all,
205 but nothing is ideal around here. */
207 #define isoctal(c) ((unsigned) ((c) - '0') < 8)
212 unsigned long opcode
;
213 struct nlist
*nlistp
;
217 bfd_reloc_code_real_type reloc
;
220 struct sparc_it the_insn
, set_insn
;
222 static void output_insn
223 PARAMS ((const struct sparc_opcode
*, struct sparc_it
*));
225 /* Table of arguments to -A.
226 The sparc_opcode_arch table in sparc-opc.c is insufficient and incorrect
227 for this use. That table is for opcodes only. This table is for opcodes
230 enum sparc_arch_types
{v6
, v7
, v8
, sparclet
, sparclite
, sparc86x
, v8plus
,
231 v8plusa
, v9
, v9a
, v9b
, v9_64
};
233 static struct sparc_arch
{
236 enum sparc_arch_types arch_type
;
237 /* Default word size, as specified during configuration.
238 A value of zero means can't be used to specify default architecture. */
239 int default_arch_size
;
240 /* Allowable arg to -A? */
242 } sparc_arch_table
[] = {
243 { "v6", "v6", v6
, 0, 1 },
244 { "v7", "v7", v7
, 0, 1 },
245 { "v8", "v8", v8
, 32, 1 },
246 { "sparclet", "sparclet", sparclet
, 32, 1 },
247 { "sparclite", "sparclite", sparclite
, 32, 1 },
248 { "sparc86x", "sparclite", sparc86x
, 32, 1 },
249 { "v8plus", "v9", v9
, 0, 1 },
250 { "v8plusa", "v9a", v9
, 0, 1 },
251 { "v8plusb", "v9b", v9
, 0, 1 },
252 { "v9", "v9", v9
, 0, 1 },
253 { "v9a", "v9a", v9
, 0, 1 },
254 { "v9b", "v9b", v9
, 0, 1 },
255 /* This exists to allow configure.in/Makefile.in to pass one
256 value to specify both the default machine and default word size. */
257 { "v9-64", "v9", v9
, 64, 0 },
258 { NULL
, NULL
, v8
, 0, 0 }
261 /* Variant of default_arch */
262 static enum sparc_arch_types default_arch_type
;
264 static struct sparc_arch
*
268 struct sparc_arch
*sa
;
270 for (sa
= &sparc_arch_table
[0]; sa
->name
!= NULL
; sa
++)
271 if (strcmp (sa
->name
, name
) == 0)
273 if (sa
->name
== NULL
)
278 /* Initialize the default opcode arch and word size from the default
279 architecture name. */
284 struct sparc_arch
*sa
= lookup_arch (default_arch
);
287 || sa
->default_arch_size
== 0)
288 as_fatal (_("Invalid default architecture, broken assembler."));
290 max_architecture
= sparc_opcode_lookup_arch (sa
->opcode_arch
);
291 if (max_architecture
== SPARC_OPCODE_ARCH_BAD
)
292 as_fatal (_("Bad opcode table, broken assembler."));
293 default_arch_size
= sparc_arch_size
= sa
->default_arch_size
;
295 default_arch_type
= sa
->arch_type
;
298 /* Called by TARGET_FORMAT. */
301 sparc_target_format ()
303 /* We don't get a chance to initialize anything before we're called,
304 so handle that now. */
305 if (! default_init_p
)
306 init_default_arch ();
310 return "a.out-sparc-netbsd";
313 if (target_big_endian
)
314 return "a.out-sunos-big";
315 else if (default_arch_type
== sparc86x
&& target_little_endian_data
)
316 return "a.out-sunos-big";
318 return "a.out-sparc-little";
320 return "a.out-sunos-big";
331 return "coff-sparc-lynx";
338 return sparc_arch_size
== 64 ? "elf64-sparc" : "elf32-sparc";
345 * Invocation line includes a switch not recognized by the base assembler.
346 * See if it's a processor-specific option. These are:
349 * Warn on architecture bumps. See also -A.
351 * -Av6, -Av7, -Av8, -Asparclite, -Asparclet
352 * Standard 32 bit architectures.
354 * Sparc64 in either a 32 or 64 bit world (-32/-64 says which).
355 * This used to only mean 64 bits, but properly specifying it
356 * complicated gcc's ASM_SPECs, so now opcode selection is
357 * specified orthogonally to word size (except when specifying
358 * the default, but that is an internal implementation detail).
359 * -Av8plus, -Av8plusa, -Av8plusb
360 * Same as -Av9{,a,b}.
361 * -xarch=v8plus, -xarch=v8plusa, -xarch=v8plusb
362 * Same as -Av8plus{,a,b} -32, for compatibility with Sun's
364 * -xarch=v9, -xarch=v9a, -xarch=v9b
365 * Same as -Av9{,a,b} -64, for compatibility with Sun's
368 * Select the architecture and possibly the file format.
369 * Instructions or features not supported by the selected
370 * architecture cause fatal errors.
372 * The default is to start at v6, and bump the architecture up
373 * whenever an instruction is seen at a higher level. In 32 bit
374 * environments, v9 is not bumped up to, the user must pass
377 * If -bump is specified, a warning is printing when bumping to
380 * If an architecture is specified, all instructions must match
381 * that architecture. Any higher level instructions are flagged
382 * as errors. Note that in the 32 bit environment specifying
383 * -Av8plus does not automatically create a v8plus object file, a
384 * v9 insn must be seen.
386 * If both an architecture and -bump are specified, the
387 * architecture starts at the specified level, but bumps are
388 * warnings. Note that we can't set `current_architecture' to
389 * the requested level in this case: in the 32 bit environment,
390 * we still must avoid creating v8plus object files unless v9
394 * Bumping between incompatible architectures is always an
395 * error. For example, from sparclite to v9.
399 const char *md_shortopts
= "A:K:VQ:sq";
402 const char *md_shortopts
= "A:k";
404 const char *md_shortopts
= "A:";
407 struct option md_longopts
[] = {
408 #define OPTION_BUMP (OPTION_MD_BASE)
409 {"bump", no_argument
, NULL
, OPTION_BUMP
},
410 #define OPTION_SPARC (OPTION_MD_BASE + 1)
411 {"sparc", no_argument
, NULL
, OPTION_SPARC
},
412 #define OPTION_XARCH (OPTION_MD_BASE + 2)
413 {"xarch", required_argument
, NULL
, OPTION_XARCH
},
415 #define OPTION_32 (OPTION_MD_BASE + 3)
416 {"32", no_argument
, NULL
, OPTION_32
},
417 #define OPTION_64 (OPTION_MD_BASE + 4)
418 {"64", no_argument
, NULL
, OPTION_64
},
419 #define OPTION_TSO (OPTION_MD_BASE + 5)
420 {"TSO", no_argument
, NULL
, OPTION_TSO
},
421 #define OPTION_PSO (OPTION_MD_BASE + 6)
422 {"PSO", no_argument
, NULL
, OPTION_PSO
},
423 #define OPTION_RMO (OPTION_MD_BASE + 7)
424 {"RMO", no_argument
, NULL
, OPTION_RMO
},
426 #ifdef SPARC_BIENDIAN
427 #define OPTION_LITTLE_ENDIAN (OPTION_MD_BASE + 8)
428 {"EL", no_argument
, NULL
, OPTION_LITTLE_ENDIAN
},
429 #define OPTION_BIG_ENDIAN (OPTION_MD_BASE + 9)
430 {"EB", no_argument
, NULL
, OPTION_BIG_ENDIAN
},
432 #define OPTION_ENFORCE_ALIGNED_DATA (OPTION_MD_BASE + 10)
433 {"enforce-aligned-data", no_argument
, NULL
, OPTION_ENFORCE_ALIGNED_DATA
},
434 #define OPTION_LITTLE_ENDIAN_DATA (OPTION_MD_BASE + 11)
435 {"little-endian-data", no_argument
, NULL
, OPTION_LITTLE_ENDIAN_DATA
},
437 #define OPTION_NO_UNDECLARED_REGS (OPTION_MD_BASE + 12)
438 {"no-undeclared-regs", no_argument
, NULL
, OPTION_NO_UNDECLARED_REGS
},
439 #define OPTION_UNDECLARED_REGS (OPTION_MD_BASE + 13)
440 {"undeclared-regs", no_argument
, NULL
, OPTION_UNDECLARED_REGS
},
442 #define OPTION_RELAX (OPTION_MD_BASE + 14)
443 {"relax", no_argument
, NULL
, OPTION_RELAX
},
444 #define OPTION_NO_RELAX (OPTION_MD_BASE + 15)
445 {"no-relax", no_argument
, NULL
, OPTION_NO_RELAX
},
446 {NULL
, no_argument
, NULL
, 0}
449 size_t md_longopts_size
= sizeof (md_longopts
);
452 md_parse_option (c
, arg
)
456 /* We don't get a chance to initialize anything before we're called,
457 so handle that now. */
458 if (! default_init_p
)
459 init_default_arch ();
465 warn_after_architecture
= SPARC_OPCODE_ARCH_V6
;
470 if (strncmp (arg
, "v9", 2) != 0)
471 md_parse_option (OPTION_32
, NULL
);
473 md_parse_option (OPTION_64
, NULL
);
479 struct sparc_arch
*sa
;
480 enum sparc_opcode_arch_val opcode_arch
;
482 sa
= lookup_arch (arg
);
484 || ! sa
->user_option_p
)
486 if (c
== OPTION_XARCH
)
487 as_bad (_("invalid architecture -xarch=%s"), arg
);
489 as_bad (_("invalid architecture -A%s"), arg
);
493 opcode_arch
= sparc_opcode_lookup_arch (sa
->opcode_arch
);
494 if (opcode_arch
== SPARC_OPCODE_ARCH_BAD
)
495 as_fatal (_("Bad opcode table, broken assembler."));
497 max_architecture
= opcode_arch
;
498 architecture_requested
= 1;
503 /* Ignore -sparc, used by SunOS make default .s.o rule. */
506 case OPTION_ENFORCE_ALIGNED_DATA
:
507 enforce_aligned_data
= 1;
510 #ifdef SPARC_BIENDIAN
511 case OPTION_LITTLE_ENDIAN
:
512 target_big_endian
= 0;
513 if (default_arch_type
!= sparclet
)
514 as_fatal ("This target does not support -EL");
516 case OPTION_LITTLE_ENDIAN_DATA
:
517 target_little_endian_data
= 1;
518 target_big_endian
= 0;
519 if (default_arch_type
!= sparc86x
520 && default_arch_type
!= v9
)
521 as_fatal ("This target does not support --little-endian-data");
523 case OPTION_BIG_ENDIAN
:
524 target_big_endian
= 1;
538 const char **list
, **l
;
540 sparc_arch_size
= c
== OPTION_32
? 32 : 64;
541 list
= bfd_target_list ();
542 for (l
= list
; *l
!= NULL
; l
++)
544 if (sparc_arch_size
== 32)
546 if (strcmp (*l
, "elf32-sparc") == 0)
551 if (strcmp (*l
, "elf64-sparc") == 0)
556 as_fatal (_("No compiled in support for %d bit object file format"),
563 sparc_memory_model
= MM_TSO
;
567 sparc_memory_model
= MM_PSO
;
571 sparc_memory_model
= MM_RMO
;
579 /* Qy - do emit .comment
580 Qn - do not emit .comment. */
584 /* Use .stab instead of .stab.excl. */
588 /* quick -- Native assembler does fewer checks. */
592 if (strcmp (arg
, "PIC") != 0)
593 as_warn (_("Unrecognized option following -K"));
598 case OPTION_NO_UNDECLARED_REGS
:
599 no_undeclared_regs
= 1;
602 case OPTION_UNDECLARED_REGS
:
603 no_undeclared_regs
= 0;
611 case OPTION_NO_RELAX
:
623 md_show_usage (stream
)
626 const struct sparc_arch
*arch
;
629 /* We don't get a chance to initialize anything before we're called,
630 so handle that now. */
631 if (! default_init_p
)
632 init_default_arch ();
634 fprintf (stream
, _("SPARC options:\n"));
636 for (arch
= &sparc_arch_table
[0]; arch
->name
; arch
++)
638 if (!arch
->user_option_p
)
640 if (arch
!= &sparc_arch_table
[0])
641 fprintf (stream
, " | ");
642 if (column
+ strlen (arch
->name
) > 70)
645 fputc ('\n', stream
);
647 column
+= 5 + 2 + strlen (arch
->name
);
648 fprintf (stream
, "-A%s", arch
->name
);
650 for (arch
= &sparc_arch_table
[0]; arch
->name
; arch
++)
652 if (!arch
->user_option_p
)
654 fprintf (stream
, " | ");
655 if (column
+ strlen (arch
->name
) > 65)
658 fputc ('\n', stream
);
660 column
+= 5 + 7 + strlen (arch
->name
);
661 fprintf (stream
, "-xarch=%s", arch
->name
);
663 fprintf (stream
, _("\n\
664 specify variant of SPARC architecture\n\
665 -bump warn when assembler switches architectures\n\
667 --enforce-aligned-data force .long, etc., to be aligned correctly\n\
668 -relax relax jumps and branches (default)\n\
669 -no-relax avoid changing any jumps and branches\n"));
671 fprintf (stream
, _("\
672 -k generate PIC\n"));
675 fprintf (stream
, _("\
676 -32 create 32 bit object file\n\
677 -64 create 64 bit object file\n"));
678 fprintf (stream
, _("\
679 [default is %d]\n"), default_arch_size
);
680 fprintf (stream
, _("\
681 -TSO use Total Store Ordering\n\
682 -PSO use Partial Store Ordering\n\
683 -RMO use Relaxed Memory Ordering\n"));
684 fprintf (stream
, _("\
685 [default is %s]\n"), (default_arch_size
== 64) ? "RMO" : "TSO");
686 fprintf (stream
, _("\
687 -KPIC generate PIC\n\
688 -V print assembler version number\n\
689 -undeclared-regs ignore application global register usage without\n\
690 appropriate .register directive (default)\n\
691 -no-undeclared-regs force error on application global register usage\n\
692 without appropriate .register directive\n\
697 #ifdef SPARC_BIENDIAN
698 fprintf (stream
, _("\
699 -EL generate code for a little endian machine\n\
700 -EB generate code for a big endian machine\n\
701 --little-endian-data generate code for a machine having big endian\n\
702 instructions and little endian data.\n"));
706 /* Native operand size opcode translation. */
712 } native_op_table
[] =
714 {"ldn", "ld", "ldx"},
715 {"ldna", "lda", "ldxa"},
716 {"stn", "st", "stx"},
717 {"stna", "sta", "stxa"},
718 {"slln", "sll", "sllx"},
719 {"srln", "srl", "srlx"},
720 {"sran", "sra", "srax"},
721 {"casn", "cas", "casx"},
722 {"casna", "casa", "casxa"},
723 {"clrn", "clr", "clrx"},
727 /* sparc64 privileged and hyperprivileged registers. */
729 struct priv_reg_entry
735 struct priv_reg_entry priv_reg_table
[] =
755 {"", -1}, /* End marker. */
758 struct priv_reg_entry hpriv_reg_table
[] =
766 {"", -1}, /* End marker. */
769 /* v9a specific asrs. */
771 struct priv_reg_entry v9a_asr_table
[] =
774 {"sys_tick_cmpr", 25},
782 {"clear_softint", 21},
783 {"", -1}, /* End marker. */
787 cmp_reg_entry (parg
, qarg
)
791 const struct priv_reg_entry
*p
= (const struct priv_reg_entry
*) parg
;
792 const struct priv_reg_entry
*q
= (const struct priv_reg_entry
*) qarg
;
794 return strcmp (q
->name
, p
->name
);
797 /* This function is called once, at assembler startup time. It should
798 set up all the tables, etc. that the MD part of the assembler will
804 register const char *retval
= NULL
;
806 register unsigned int i
= 0;
808 /* We don't get a chance to initialize anything before md_parse_option
809 is called, and it may not be called, so handle default initialization
810 now if not already done. */
811 if (! default_init_p
)
812 init_default_arch ();
814 sparc_cie_data_alignment
= sparc_arch_size
== 64 ? -8 : -4;
815 op_hash
= hash_new ();
817 while (i
< (unsigned int) sparc_num_opcodes
)
819 const char *name
= sparc_opcodes
[i
].name
;
820 retval
= hash_insert (op_hash
, name
, (PTR
) &sparc_opcodes
[i
]);
823 as_bad (_("Internal error: can't hash `%s': %s\n"),
824 sparc_opcodes
[i
].name
, retval
);
829 if (sparc_opcodes
[i
].match
& sparc_opcodes
[i
].lose
)
831 as_bad (_("Internal error: losing opcode: `%s' \"%s\"\n"),
832 sparc_opcodes
[i
].name
, sparc_opcodes
[i
].args
);
837 while (i
< (unsigned int) sparc_num_opcodes
838 && !strcmp (sparc_opcodes
[i
].name
, name
));
841 for (i
= 0; native_op_table
[i
].name
; i
++)
843 const struct sparc_opcode
*insn
;
844 char *name
= ((sparc_arch_size
== 32)
845 ? native_op_table
[i
].name32
846 : native_op_table
[i
].name64
);
847 insn
= (struct sparc_opcode
*) hash_find (op_hash
, name
);
850 as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"),
851 name
, native_op_table
[i
].name
);
856 retval
= hash_insert (op_hash
, native_op_table
[i
].name
, (PTR
) insn
);
859 as_bad (_("Internal error: can't hash `%s': %s\n"),
860 sparc_opcodes
[i
].name
, retval
);
867 as_fatal (_("Broken assembler. No assembly attempted."));
869 qsort (priv_reg_table
, sizeof (priv_reg_table
) / sizeof (priv_reg_table
[0]),
870 sizeof (priv_reg_table
[0]), cmp_reg_entry
);
872 /* If -bump, record the architecture level at which we start issuing
873 warnings. The behaviour is different depending upon whether an
874 architecture was explicitly specified. If it wasn't, we issue warnings
875 for all upwards bumps. If it was, we don't start issuing warnings until
876 we need to bump beyond the requested architecture or when we bump between
877 conflicting architectures. */
880 && architecture_requested
)
882 /* `max_architecture' records the requested architecture.
883 Issue warnings if we go above it. */
884 warn_after_architecture
= max_architecture
;
886 /* Find the highest architecture level that doesn't conflict with
887 the requested one. */
888 for (max_architecture
= SPARC_OPCODE_ARCH_MAX
;
889 max_architecture
> warn_after_architecture
;
891 if (! SPARC_OPCODE_CONFLICT_P (max_architecture
,
892 warn_after_architecture
))
897 /* Called after all assembly has been done. */
902 unsigned long mach
= bfd_mach_sparc
;
904 if (sparc_arch_size
== 64)
905 switch (current_architecture
)
907 case SPARC_OPCODE_ARCH_V9A
: mach
= bfd_mach_sparc_v9a
; break;
908 case SPARC_OPCODE_ARCH_V9B
: mach
= bfd_mach_sparc_v9b
; break;
909 default: mach
= bfd_mach_sparc_v9
; break;
912 switch (current_architecture
)
914 case SPARC_OPCODE_ARCH_SPARCLET
: mach
= bfd_mach_sparc_sparclet
; break;
915 case SPARC_OPCODE_ARCH_V9
: mach
= bfd_mach_sparc_v8plus
; break;
916 case SPARC_OPCODE_ARCH_V9A
: mach
= bfd_mach_sparc_v8plusa
; break;
917 case SPARC_OPCODE_ARCH_V9B
: mach
= bfd_mach_sparc_v8plusb
; break;
918 /* The sparclite is treated like a normal sparc. Perhaps it shouldn't
919 be but for now it is (since that's the way it's always been
923 bfd_set_arch_mach (stdoutput
, bfd_arch_sparc
, mach
);
926 /* Return non-zero if VAL is in the range -(MAX+1) to MAX. */
929 in_signed_range (val
, max
)
930 bfd_signed_vma val
, max
;
934 /* Sign-extend the value from the architecture word size, so that
935 0xffffffff is always considered -1 on sparc32. */
936 if (sparc_arch_size
== 32)
938 bfd_signed_vma sign
= (bfd_signed_vma
) 1 << 31;
939 val
= ((val
& U0xffffffff
) ^ sign
) - sign
;
948 /* Return non-zero if VAL is in the range 0 to MAX. */
951 in_unsigned_range (val
, max
)
959 /* Return non-zero if VAL is in the range -(MAX/2+1) to MAX.
960 (e.g. -15 to +31). */
963 in_bitfield_range (val
, max
)
964 bfd_signed_vma val
, max
;
970 if (val
< ~(max
>> 1))
984 for (i
= 0; (mask
& 1) == 0; ++i
)
989 /* Implement big shift right. */
995 if (sizeof (bfd_vma
) <= 4 && amount
>= 32)
996 as_fatal (_("Support for 64-bit arithmetic not compiled in."));
997 return val
>> amount
;
1000 /* For communication between sparc_ip and get_expression. */
1001 static char *expr_end
;
1003 /* Values for `special_case'.
1004 Instructions that require wierd handling because they're longer than
1006 #define SPECIAL_CASE_NONE 0
1007 #define SPECIAL_CASE_SET 1
1008 #define SPECIAL_CASE_SETSW 2
1009 #define SPECIAL_CASE_SETX 3
1010 /* FIXME: sparc-opc.c doesn't have necessary "S" trigger to enable this. */
1011 #define SPECIAL_CASE_FDIV 4
1013 /* Bit masks of various insns. */
1014 #define NOP_INSN 0x01000000
1015 #define OR_INSN 0x80100000
1016 #define XOR_INSN 0x80180000
1017 #define FMOVS_INSN 0x81A00020
1018 #define SETHI_INSN 0x01000000
1019 #define SLLX_INSN 0x81281000
1020 #define SRA_INSN 0x81380000
1022 /* The last instruction to be assembled. */
1023 static const struct sparc_opcode
*last_insn
;
1024 /* The assembled opcode of `last_insn'. */
1025 static unsigned long last_opcode
;
1027 /* Handle the set and setuw synthetic instructions. */
1030 synthetize_setuw (insn
)
1031 const struct sparc_opcode
*insn
;
1033 int need_hi22_p
= 0;
1034 int rd
= (the_insn
.opcode
& RD (~0)) >> 25;
1036 if (the_insn
.exp
.X_op
== O_constant
)
1038 if (SPARC_OPCODE_ARCH_V9_P (max_architecture
))
1040 if (sizeof (offsetT
) > 4
1041 && (the_insn
.exp
.X_add_number
< 0
1042 || the_insn
.exp
.X_add_number
> (offsetT
) U0xffffffff
))
1043 as_warn (_("set: number not in 0..4294967295 range"));
1047 if (sizeof (offsetT
) > 4
1048 && (the_insn
.exp
.X_add_number
< -(offsetT
) U0x80000000
1049 || the_insn
.exp
.X_add_number
> (offsetT
) U0xffffffff
))
1050 as_warn (_("set: number not in -2147483648..4294967295 range"));
1051 the_insn
.exp
.X_add_number
= (int) the_insn
.exp
.X_add_number
;
1055 /* See if operand is absolute and small; skip sethi if so. */
1056 if (the_insn
.exp
.X_op
!= O_constant
1057 || the_insn
.exp
.X_add_number
>= (1 << 12)
1058 || the_insn
.exp
.X_add_number
< -(1 << 12))
1060 the_insn
.opcode
= (SETHI_INSN
| RD (rd
)
1061 | ((the_insn
.exp
.X_add_number
>> 10)
1062 & (the_insn
.exp
.X_op
== O_constant
1064 the_insn
.reloc
= (the_insn
.exp
.X_op
!= O_constant
1065 ? BFD_RELOC_HI22
: BFD_RELOC_NONE
);
1066 output_insn (insn
, &the_insn
);
1070 /* See if operand has no low-order bits; skip OR if so. */
1071 if (the_insn
.exp
.X_op
!= O_constant
1072 || (need_hi22_p
&& (the_insn
.exp
.X_add_number
& 0x3FF) != 0)
1075 the_insn
.opcode
= (OR_INSN
| (need_hi22_p
? RS1 (rd
) : 0)
1077 | (the_insn
.exp
.X_add_number
1078 & (the_insn
.exp
.X_op
!= O_constant
1079 ? 0 : need_hi22_p
? 0x3ff : 0x1fff)));
1080 the_insn
.reloc
= (the_insn
.exp
.X_op
!= O_constant
1081 ? BFD_RELOC_LO10
: BFD_RELOC_NONE
);
1082 output_insn (insn
, &the_insn
);
1086 /* Handle the setsw synthetic instruction. */
1089 synthetize_setsw (insn
)
1090 const struct sparc_opcode
*insn
;
1094 rd
= (the_insn
.opcode
& RD (~0)) >> 25;
1096 if (the_insn
.exp
.X_op
!= O_constant
)
1098 synthetize_setuw (insn
);
1100 /* Need to sign extend it. */
1101 the_insn
.opcode
= (SRA_INSN
| RS1 (rd
) | RD (rd
));
1102 the_insn
.reloc
= BFD_RELOC_NONE
;
1103 output_insn (insn
, &the_insn
);
1107 if (sizeof (offsetT
) > 4
1108 && (the_insn
.exp
.X_add_number
< -(offsetT
) U0x80000000
1109 || the_insn
.exp
.X_add_number
> (offsetT
) U0xffffffff
))
1110 as_warn (_("setsw: number not in -2147483648..4294967295 range"));
1112 low32
= the_insn
.exp
.X_add_number
;
1116 synthetize_setuw (insn
);
1122 the_insn
.reloc
= BFD_RELOC_NONE
;
1123 /* See if operand is absolute and small; skip sethi if so. */
1124 if (low32
< -(1 << 12))
1126 the_insn
.opcode
= (SETHI_INSN
| RD (rd
)
1127 | (((~the_insn
.exp
.X_add_number
) >> 10) & 0x3fffff));
1128 output_insn (insn
, &the_insn
);
1129 low32
= 0x1c00 | (low32
& 0x3ff);
1130 opc
= RS1 (rd
) | XOR_INSN
;
1133 the_insn
.opcode
= (opc
| RD (rd
) | IMMED
1134 | (low32
& 0x1fff));
1135 output_insn (insn
, &the_insn
);
1138 /* Handle the setsw synthetic instruction. */
1141 synthetize_setx (insn
)
1142 const struct sparc_opcode
*insn
;
1144 int upper32
, lower32
;
1145 int tmpreg
= (the_insn
.opcode
& RS1 (~0)) >> 14;
1146 int dstreg
= (the_insn
.opcode
& RD (~0)) >> 25;
1148 int need_hh22_p
= 0, need_hm10_p
= 0, need_hi22_p
= 0, need_lo10_p
= 0;
1149 int need_xor10_p
= 0;
1151 #define SIGNEXT32(x) ((((x) & U0xffffffff) ^ U0x80000000) - U0x80000000)
1152 lower32
= SIGNEXT32 (the_insn
.exp
.X_add_number
);
1153 upper32
= SIGNEXT32 (BSR (the_insn
.exp
.X_add_number
, 32));
1156 upper_dstreg
= tmpreg
;
1157 /* The tmp reg should not be the dst reg. */
1158 if (tmpreg
== dstreg
)
1159 as_warn (_("setx: temporary register same as destination register"));
1161 /* ??? Obviously there are other optimizations we can do
1162 (e.g. sethi+shift for 0x1f0000000) and perhaps we shouldn't be
1163 doing some of these. Later. If you do change things, try to
1164 change all of this to be table driven as well. */
1165 /* What to output depends on the number if it's constant.
1166 Compute that first, then output what we've decided upon. */
1167 if (the_insn
.exp
.X_op
!= O_constant
)
1169 if (sparc_arch_size
== 32)
1171 /* When arch size is 32, we want setx to be equivalent
1172 to setuw for anything but constants. */
1173 the_insn
.exp
.X_add_number
&= 0xffffffff;
1174 synthetize_setuw (insn
);
1177 need_hh22_p
= need_hm10_p
= need_hi22_p
= need_lo10_p
= 1;
1183 /* Reset X_add_number, we've extracted it as upper32/lower32.
1184 Otherwise fixup_segment will complain about not being able to
1185 write an 8 byte number in a 4 byte field. */
1186 the_insn
.exp
.X_add_number
= 0;
1188 /* Only need hh22 if `or' insn can't handle constant. */
1189 if (upper32
< -(1 << 12) || upper32
>= (1 << 12))
1192 /* Does bottom part (after sethi) have bits? */
1193 if ((need_hh22_p
&& (upper32
& 0x3ff) != 0)
1194 /* No hh22, but does upper32 still have bits we can't set
1196 || (! need_hh22_p
&& upper32
!= 0 && upper32
!= -1))
1199 /* If the lower half is all zero, we build the upper half directly
1200 into the dst reg. */
1202 /* Need lower half if number is zero or 0xffffffff00000000. */
1203 || (! need_hh22_p
&& ! need_hm10_p
))
1205 /* No need for sethi if `or' insn can handle constant. */
1206 if (lower32
< -(1 << 12) || lower32
>= (1 << 12)
1207 /* Note that we can't use a negative constant in the `or'
1208 insn unless the upper 32 bits are all ones. */
1209 || (lower32
< 0 && upper32
!= -1)
1210 || (lower32
>= 0 && upper32
== -1))
1213 if (need_hi22_p
&& upper32
== -1)
1216 /* Does bottom part (after sethi) have bits? */
1217 else if ((need_hi22_p
&& (lower32
& 0x3ff) != 0)
1219 || (! need_hi22_p
&& (lower32
& 0x1fff) != 0)
1220 /* Need `or' if we didn't set anything else. */
1221 || (! need_hi22_p
&& ! need_hh22_p
&& ! need_hm10_p
))
1225 /* Output directly to dst reg if lower 32 bits are all zero. */
1226 upper_dstreg
= dstreg
;
1229 if (!upper_dstreg
&& dstreg
)
1230 as_warn (_("setx: illegal temporary register g0"));
1234 the_insn
.opcode
= (SETHI_INSN
| RD (upper_dstreg
)
1235 | ((upper32
>> 10) & 0x3fffff));
1236 the_insn
.reloc
= (the_insn
.exp
.X_op
!= O_constant
1237 ? BFD_RELOC_SPARC_HH22
: BFD_RELOC_NONE
);
1238 output_insn (insn
, &the_insn
);
1243 the_insn
.opcode
= (SETHI_INSN
| RD (dstreg
)
1244 | (((need_xor10_p
? ~lower32
: lower32
)
1245 >> 10) & 0x3fffff));
1246 the_insn
.reloc
= (the_insn
.exp
.X_op
!= O_constant
1247 ? BFD_RELOC_SPARC_LM22
: BFD_RELOC_NONE
);
1248 output_insn (insn
, &the_insn
);
1253 the_insn
.opcode
= (OR_INSN
1254 | (need_hh22_p
? RS1 (upper_dstreg
) : 0)
1257 | (upper32
& (need_hh22_p
? 0x3ff : 0x1fff)));
1258 the_insn
.reloc
= (the_insn
.exp
.X_op
!= O_constant
1259 ? BFD_RELOC_SPARC_HM10
: BFD_RELOC_NONE
);
1260 output_insn (insn
, &the_insn
);
1265 /* FIXME: One nice optimization to do here is to OR the low part
1266 with the highpart if hi22 isn't needed and the low part is
1268 the_insn
.opcode
= (OR_INSN
| (need_hi22_p
? RS1 (dstreg
) : 0)
1271 | (lower32
& (need_hi22_p
? 0x3ff : 0x1fff)));
1272 the_insn
.reloc
= (the_insn
.exp
.X_op
!= O_constant
1273 ? BFD_RELOC_LO10
: BFD_RELOC_NONE
);
1274 output_insn (insn
, &the_insn
);
1277 /* If we needed to build the upper part, shift it into place. */
1278 if (need_hh22_p
|| need_hm10_p
)
1280 the_insn
.opcode
= (SLLX_INSN
| RS1 (upper_dstreg
) | RD (upper_dstreg
)
1282 the_insn
.reloc
= BFD_RELOC_NONE
;
1283 output_insn (insn
, &the_insn
);
1286 /* To get -1 in upper32, we do sethi %hi(~x), r; xor r, -0x400 | x, r. */
1289 the_insn
.opcode
= (XOR_INSN
| RS1 (dstreg
) | RD (dstreg
) | IMMED
1290 | 0x1c00 | (lower32
& 0x3ff));
1291 the_insn
.reloc
= BFD_RELOC_NONE
;
1292 output_insn (insn
, &the_insn
);
1295 /* If we needed to build both upper and lower parts, OR them together. */
1296 else if ((need_hh22_p
|| need_hm10_p
) && (need_hi22_p
|| need_lo10_p
))
1298 the_insn
.opcode
= (OR_INSN
| RS1 (dstreg
) | RS2 (upper_dstreg
)
1300 the_insn
.reloc
= BFD_RELOC_NONE
;
1301 output_insn (insn
, &the_insn
);
1305 /* Main entry point to assemble one instruction. */
1311 const struct sparc_opcode
*insn
;
1315 special_case
= sparc_ip (str
, &insn
);
1319 /* We warn about attempts to put a floating point branch in a delay slot,
1320 unless the delay slot has been annulled. */
1321 if (last_insn
!= NULL
1322 && (insn
->flags
& F_FBR
) != 0
1323 && (last_insn
->flags
& F_DELAYED
) != 0
1324 /* ??? This test isn't completely accurate. We assume anything with
1325 F_{UNBR,CONDBR,FBR} set is annullable. */
1326 && ((last_insn
->flags
& (F_UNBR
| F_CONDBR
| F_FBR
)) == 0
1327 || (last_opcode
& ANNUL
) == 0))
1328 as_warn (_("FP branch in delay slot"));
1330 /* SPARC before v9 requires a nop instruction between a floating
1331 point instruction and a floating point branch. We insert one
1332 automatically, with a warning. */
1333 if (max_architecture
< SPARC_OPCODE_ARCH_V9
1334 && last_insn
!= NULL
1335 && (insn
->flags
& F_FBR
) != 0
1336 && (last_insn
->flags
& F_FLOAT
) != 0)
1338 struct sparc_it nop_insn
;
1340 nop_insn
.opcode
= NOP_INSN
;
1341 nop_insn
.reloc
= BFD_RELOC_NONE
;
1342 output_insn (insn
, &nop_insn
);
1343 as_warn (_("FP branch preceded by FP instruction; NOP inserted"));
1346 switch (special_case
)
1348 case SPECIAL_CASE_NONE
:
1350 output_insn (insn
, &the_insn
);
1353 case SPECIAL_CASE_SETSW
:
1354 synthetize_setsw (insn
);
1357 case SPECIAL_CASE_SET
:
1358 synthetize_setuw (insn
);
1361 case SPECIAL_CASE_SETX
:
1362 synthetize_setx (insn
);
1365 case SPECIAL_CASE_FDIV
:
1367 int rd
= (the_insn
.opcode
>> 25) & 0x1f;
1369 output_insn (insn
, &the_insn
);
1371 /* According to information leaked from Sun, the "fdiv" instructions
1372 on early SPARC machines would produce incorrect results sometimes.
1373 The workaround is to add an fmovs of the destination register to
1374 itself just after the instruction. This was true on machines
1375 with Weitek 1165 float chips, such as the Sun-4/260 and /280. */
1376 assert (the_insn
.reloc
== BFD_RELOC_NONE
);
1377 the_insn
.opcode
= FMOVS_INSN
| rd
| RD (rd
);
1378 output_insn (insn
, &the_insn
);
1383 as_fatal (_("failed special case insn sanity check"));
1387 /* Subroutine of md_assemble to do the actual parsing. */
1390 sparc_ip (str
, pinsn
)
1392 const struct sparc_opcode
**pinsn
;
1394 char *error_message
= "";
1398 const struct sparc_opcode
*insn
;
1400 unsigned long opcode
;
1401 unsigned int mask
= 0;
1405 int special_case
= SPECIAL_CASE_NONE
;
1412 while (ISLOWER (*s
) || ISDIGIT (*s
));
1429 as_bad (_("Unknown opcode: `%s'"), str
);
1431 return special_case
;
1433 insn
= (struct sparc_opcode
*) hash_find (op_hash
, str
);
1437 as_bad (_("Unknown opcode: `%s'"), str
);
1438 return special_case
;
1448 opcode
= insn
->match
;
1449 memset (&the_insn
, '\0', sizeof (the_insn
));
1450 the_insn
.reloc
= BFD_RELOC_NONE
;
1453 /* Build the opcode, checking as we go to make sure that the
1455 for (args
= insn
->args
;; ++args
)
1463 /* Parse a series of masks. */
1470 if (! parse_keyword_arg (sparc_encode_membar
, &s
,
1473 error_message
= _(": invalid membar mask name");
1479 if (*s
== '|' || *s
== '+')
1487 if (! parse_const_expr_arg (&s
, &kmask
))
1489 error_message
= _(": invalid membar mask expression");
1492 if (kmask
< 0 || kmask
> 127)
1494 error_message
= _(": invalid membar mask number");
1499 opcode
|= MEMBAR (kmask
);
1507 if (! parse_const_expr_arg (&s
, &smask
))
1509 error_message
= _(": invalid siam mode expression");
1512 if (smask
< 0 || smask
> 7)
1514 error_message
= _(": invalid siam mode number");
1525 /* Parse a prefetch function. */
1528 if (! parse_keyword_arg (sparc_encode_prefetch
, &s
, &fcn
))
1530 error_message
= _(": invalid prefetch function name");
1536 if (! parse_const_expr_arg (&s
, &fcn
))
1538 error_message
= _(": invalid prefetch function expression");
1541 if (fcn
< 0 || fcn
> 31)
1543 error_message
= _(": invalid prefetch function number");
1553 /* Parse a sparc64 privileged register. */
1556 struct priv_reg_entry
*p
= priv_reg_table
;
1557 unsigned int len
= 9999999; /* Init to make gcc happy. */
1560 while (p
->name
[0] > s
[0])
1562 while (p
->name
[0] == s
[0])
1564 len
= strlen (p
->name
);
1565 if (strncmp (p
->name
, s
, len
) == 0)
1569 if (p
->name
[0] != s
[0])
1571 error_message
= _(": unrecognizable privileged register");
1575 opcode
|= (p
->regnum
<< 14);
1577 opcode
|= (p
->regnum
<< 25);
1583 error_message
= _(": unrecognizable privileged register");
1589 /* Parse a sparc64 hyperprivileged register. */
1592 struct priv_reg_entry
*p
= hpriv_reg_table
;
1593 unsigned int len
= 9999999; /* Init to make gcc happy. */
1596 while (p
->name
[0] > s
[0])
1598 while (p
->name
[0] == s
[0])
1600 len
= strlen (p
->name
);
1601 if (strncmp (p
->name
, s
, len
) == 0)
1605 if (p
->name
[0] != s
[0])
1607 error_message
= _(": unrecognizable hyperprivileged register");
1611 opcode
|= (p
->regnum
<< 14);
1613 opcode
|= (p
->regnum
<< 25);
1619 error_message
= _(": unrecognizable hyperprivileged register");
1625 /* Parse a v9a/v9b ancillary state register. */
1628 struct priv_reg_entry
*p
= v9a_asr_table
;
1629 unsigned int len
= 9999999; /* Init to make gcc happy. */
1632 while (p
->name
[0] > s
[0])
1634 while (p
->name
[0] == s
[0])
1636 len
= strlen (p
->name
);
1637 if (strncmp (p
->name
, s
, len
) == 0)
1641 if (p
->name
[0] != s
[0])
1643 error_message
= _(": unrecognizable v9a or v9b ancillary state register");
1646 if (*args
== '/' && (p
->regnum
== 20 || p
->regnum
== 21))
1648 error_message
= _(": rd on write only ancillary state register");
1652 && (insn
->architecture
1653 & SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A
)))
1655 /* %sys_tick and %sys_tick_cmpr are v9bnotv9a */
1656 error_message
= _(": unrecognizable v9a ancillary state register");
1660 opcode
|= (p
->regnum
<< 14);
1662 opcode
|= (p
->regnum
<< 25);
1668 error_message
= _(": unrecognizable v9a or v9b ancillary state register");
1674 if (strncmp (s
, "%asr", 4) == 0)
1682 while (ISDIGIT (*s
))
1684 num
= num
* 10 + *s
- '0';
1688 if (current_architecture
>= SPARC_OPCODE_ARCH_V9
)
1690 if (num
< 16 || 31 < num
)
1692 error_message
= _(": asr number must be between 16 and 31");
1698 if (num
< 0 || 31 < num
)
1700 error_message
= _(": asr number must be between 0 and 31");
1705 opcode
|= (*args
== 'M' ? RS1 (num
) : RD (num
));
1710 error_message
= _(": expecting %asrN");
1717 the_insn
.reloc
= BFD_RELOC_SPARC_11
;
1721 the_insn
.reloc
= BFD_RELOC_SPARC_10
;
1725 /* V8 systems don't understand BFD_RELOC_SPARC_5. */
1726 if (SPARC_OPCODE_ARCH_V9_P (max_architecture
))
1727 the_insn
.reloc
= BFD_RELOC_SPARC_5
;
1729 the_insn
.reloc
= BFD_RELOC_SPARC13
;
1730 /* These fields are unsigned, but for upward compatibility,
1731 allow negative values as well. */
1735 /* V8 systems don't understand BFD_RELOC_SPARC_6. */
1736 if (SPARC_OPCODE_ARCH_V9_P (max_architecture
))
1737 the_insn
.reloc
= BFD_RELOC_SPARC_6
;
1739 the_insn
.reloc
= BFD_RELOC_SPARC13
;
1740 /* These fields are unsigned, but for upward compatibility,
1741 allow negative values as well. */
1745 the_insn
.reloc
= /* RELOC_WDISP2_14 */ BFD_RELOC_SPARC_WDISP16
;
1750 the_insn
.reloc
= BFD_RELOC_SPARC_WDISP19
;
1755 if (*s
== 'p' && s
[1] == 'n')
1763 if (*s
== 'p' && s
[1] == 't')
1775 if (strncmp (s
, "%icc", 4) == 0)
1787 if (strncmp (s
, "%xcc", 4) == 0)
1799 if (strncmp (s
, "%fcc0", 5) == 0)
1811 if (strncmp (s
, "%fcc1", 5) == 0)
1823 if (strncmp (s
, "%fcc2", 5) == 0)
1835 if (strncmp (s
, "%fcc3", 5) == 0)
1843 if (strncmp (s
, "%pc", 3) == 0)
1851 if (strncmp (s
, "%tick", 5) == 0)
1858 case '\0': /* End of args. */
1859 if (s
[0] == ',' && s
[1] == '%')
1861 static const struct tls_ops
{
1862 /* The name as it appears in assembler. */
1864 /* strlen (name), precomputed for speed */
1866 /* The reloc this pseudo-op translates to. */
1871 { "tgd_add", 7, BFD_RELOC_SPARC_TLS_GD_ADD
, 0 },
1872 { "tgd_call", 8, BFD_RELOC_SPARC_TLS_GD_CALL
, 1 },
1873 { "tldm_add", 8, BFD_RELOC_SPARC_TLS_LDM_ADD
, 0 },
1874 { "tldm_call", 9, BFD_RELOC_SPARC_TLS_LDM_CALL
, 1 },
1875 { "tldo_add", 8, BFD_RELOC_SPARC_TLS_LDO_ADD
, 0 },
1876 { "tie_ldx", 7, BFD_RELOC_SPARC_TLS_IE_LDX
, 0 },
1877 { "tie_ld", 6, BFD_RELOC_SPARC_TLS_IE_LD
, 0 },
1878 { "tie_add", 7, BFD_RELOC_SPARC_TLS_IE_ADD
, 0 }
1880 const struct tls_ops
*o
;
1884 for (o
= tls_ops
; o
->name
; o
++)
1885 if (strncmp (s
+ 2, o
->name
, o
->len
) == 0)
1887 if (o
->name
== NULL
)
1890 if (s
[o
->len
+ 2] != '(')
1892 as_bad (_("Illegal operands: %%%s requires arguments in ()"), o
->name
);
1893 return special_case
;
1896 if (! o
->call
&& the_insn
.reloc
!= BFD_RELOC_NONE
)
1898 as_bad (_("Illegal operands: %%%s cannot be used together with other relocs in the insn ()"),
1900 return special_case
;
1904 && (the_insn
.reloc
!= BFD_RELOC_32_PCREL_S2
1905 || the_insn
.exp
.X_add_number
!= 0
1906 || the_insn
.exp
.X_add_symbol
1907 != symbol_find_or_make ("__tls_get_addr")))
1909 as_bad (_("Illegal operands: %%%s can be only used with call __tls_get_addr"),
1911 return special_case
;
1914 the_insn
.reloc
= o
->reloc
;
1915 memset (&the_insn
.exp
, 0, sizeof (the_insn
.exp
));
1918 for (s1
= s
; *s1
&& *s1
!= ',' && *s1
!= ']'; s1
++)
1921 else if (*s1
== ')')
1930 as_bad (_("Illegal operands: %%%s requires arguments in ()"), o
->name
);
1931 return special_case
;
1935 (void) get_expression (s
);
1955 case '[': /* These must match exactly. */
1963 case '#': /* Must be at least one digit. */
1966 while (ISDIGIT (*s
))
1974 case 'C': /* Coprocessor state register. */
1975 if (strncmp (s
, "%csr", 4) == 0)
1982 case 'b': /* Next operand is a coprocessor register. */
1985 if (*s
++ == '%' && *s
++ == 'c' && ISDIGIT (*s
))
1990 mask
= 10 * (mask
- '0') + (*s
++ - '0');
2004 opcode
|= mask
<< 14;
2012 opcode
|= mask
<< 25;
2018 case 'r': /* next operand must be a register */
2028 case 'f': /* frame pointer */
2036 case 'g': /* global register */
2045 case 'i': /* in register */
2049 mask
= c
- '0' + 24;
2054 case 'l': /* local register */
2058 mask
= (c
- '0' + 16);
2063 case 'o': /* out register */
2067 mask
= (c
- '0' + 8);
2072 case 's': /* stack pointer */
2080 case 'r': /* any register */
2081 if (!ISDIGIT ((c
= *s
++)))
2098 if ((c
= 10 * (c
- '0') + (*s
++ - '0')) >= 32)
2114 if ((mask
& ~1) == 2 && sparc_arch_size
== 64
2115 && no_undeclared_regs
&& ! globals
[mask
])
2116 as_bad (_("detected global register use not covered by .register pseudo-op"));
2118 /* Got the register, now figure out where
2119 it goes in the opcode. */
2123 opcode
|= mask
<< 14;
2131 opcode
|= mask
<< 25;
2135 opcode
|= (mask
<< 25) | (mask
<< 14);
2139 opcode
|= (mask
<< 25) | (mask
<< 0);
2145 case 'e': /* next operand is a floating point register */
2160 && ((format
= *s
) == 'f')
2163 for (mask
= 0; ISDIGIT (*s
); ++s
)
2165 mask
= 10 * mask
+ (*s
- '0');
2166 } /* read the number */
2174 } /* register must be even numbered */
2182 } /* register must be multiple of 4 */
2186 if (SPARC_OPCODE_ARCH_V9_P (max_architecture
))
2187 error_message
= _(": There are only 64 f registers; [0-63]");
2189 error_message
= _(": There are only 32 f registers; [0-31]");
2192 else if (mask
>= 32)
2194 if (SPARC_OPCODE_ARCH_V9_P (max_architecture
))
2196 if (*args
== 'e' || *args
== 'f' || *args
== 'g')
2199 = _(": There are only 32 single precision f registers; [0-31]");
2203 mask
-= 31; /* wrap high bit */
2207 error_message
= _(": There are only 32 f registers; [0-31]");
2215 } /* if not an 'f' register. */
2222 opcode
|= RS1 (mask
);
2228 opcode
|= RS2 (mask
);
2234 opcode
|= RD (mask
);
2243 if (strncmp (s
, "%fsr", 4) == 0)
2250 case '0': /* 64 bit immediate (set, setsw, setx insn) */
2251 the_insn
.reloc
= BFD_RELOC_NONE
; /* reloc handled elsewhere */
2254 case 'l': /* 22 bit PC relative immediate */
2255 the_insn
.reloc
= BFD_RELOC_SPARC_WDISP22
;
2259 case 'L': /* 30 bit immediate */
2260 the_insn
.reloc
= BFD_RELOC_32_PCREL_S2
;
2265 case 'n': /* 22 bit immediate */
2266 the_insn
.reloc
= BFD_RELOC_SPARC22
;
2269 case 'i': /* 13 bit immediate */
2270 the_insn
.reloc
= BFD_RELOC_SPARC13
;
2280 char *op_arg
= NULL
;
2281 static expressionS op_exp
;
2282 bfd_reloc_code_real_type old_reloc
= the_insn
.reloc
;
2284 /* Check for %hi, etc. */
2287 static const struct ops
{
2288 /* The name as it appears in assembler. */
2290 /* strlen (name), precomputed for speed */
2292 /* The reloc this pseudo-op translates to. */
2294 /* Non-zero if for v9 only. */
2296 /* Non-zero if can be used in pc-relative contexts. */
2297 int pcrel_p
;/*FIXME:wip*/
2299 /* hix/lox must appear before hi/lo so %hix won't be
2300 mistaken for %hi. */
2301 { "hix", 3, BFD_RELOC_SPARC_HIX22
, 1, 0 },
2302 { "lox", 3, BFD_RELOC_SPARC_LOX10
, 1, 0 },
2303 { "hi", 2, BFD_RELOC_HI22
, 0, 1 },
2304 { "lo", 2, BFD_RELOC_LO10
, 0, 1 },
2305 { "hh", 2, BFD_RELOC_SPARC_HH22
, 1, 1 },
2306 { "hm", 2, BFD_RELOC_SPARC_HM10
, 1, 1 },
2307 { "lm", 2, BFD_RELOC_SPARC_LM22
, 1, 1 },
2308 { "h44", 3, BFD_RELOC_SPARC_H44
, 1, 0 },
2309 { "m44", 3, BFD_RELOC_SPARC_M44
, 1, 0 },
2310 { "l44", 3, BFD_RELOC_SPARC_L44
, 1, 0 },
2311 { "uhi", 3, BFD_RELOC_SPARC_HH22
, 1, 0 },
2312 { "ulo", 3, BFD_RELOC_SPARC_HM10
, 1, 0 },
2313 { "tgd_hi22", 8, BFD_RELOC_SPARC_TLS_GD_HI22
, 0, 0 },
2314 { "tgd_lo10", 8, BFD_RELOC_SPARC_TLS_GD_LO10
, 0, 0 },
2315 { "tldm_hi22", 9, BFD_RELOC_SPARC_TLS_LDM_HI22
, 0, 0 },
2316 { "tldm_lo10", 9, BFD_RELOC_SPARC_TLS_LDM_LO10
, 0, 0 },
2317 { "tldo_hix22", 10, BFD_RELOC_SPARC_TLS_LDO_HIX22
, 0,
2319 { "tldo_lox10", 10, BFD_RELOC_SPARC_TLS_LDO_LOX10
, 0,
2321 { "tie_hi22", 8, BFD_RELOC_SPARC_TLS_IE_HI22
, 0, 0 },
2322 { "tie_lo10", 8, BFD_RELOC_SPARC_TLS_IE_LO10
, 0, 0 },
2323 { "tle_hix22", 9, BFD_RELOC_SPARC_TLS_LE_HIX22
, 0, 0 },
2324 { "tle_lox10", 9, BFD_RELOC_SPARC_TLS_LE_LOX10
, 0, 0 },
2325 { NULL
, 0, 0, 0, 0 }
2327 const struct ops
*o
;
2329 for (o
= ops
; o
->name
; o
++)
2330 if (strncmp (s
+ 1, o
->name
, o
->len
) == 0)
2332 if (o
->name
== NULL
)
2335 if (s
[o
->len
+ 1] != '(')
2337 as_bad (_("Illegal operands: %%%s requires arguments in ()"), o
->name
);
2338 return special_case
;
2342 the_insn
.reloc
= o
->reloc
;
2347 /* Note that if the get_expression() fails, we will still
2348 have created U entries in the symbol table for the
2349 'symbols' in the input string. Try not to create U
2350 symbols for registers, etc. */
2352 /* This stuff checks to see if the expression ends in
2353 +%reg. If it does, it removes the register from
2354 the expression, and re-sets 's' to point to the
2361 for (s1
= s
; *s1
&& *s1
!= ',' && *s1
!= ']'; s1
++)
2364 else if (*s1
== ')')
2373 as_bad (_("Illegal operands: %%%s requires arguments in ()"), op_arg
);
2374 return special_case
;
2378 (void) get_expression (s
);
2381 if (*s
== ',' || *s
== ']' || !*s
)
2383 if (*s
!= '+' && *s
!= '-')
2385 as_bad (_("Illegal operands: Can't do arithmetics other than + and - involving %%%s()"), op_arg
);
2386 return special_case
;
2390 op_exp
= the_insn
.exp
;
2391 memset (&the_insn
.exp
, 0, sizeof (the_insn
.exp
));
2394 for (s1
= s
; *s1
&& *s1
!= ',' && *s1
!= ']'; s1
++)
2397 if (s1
!= s
&& ISDIGIT (s1
[-1]))
2399 if (s1
[-2] == '%' && s1
[-3] == '+')
2401 else if (strchr ("goli0123456789", s1
[-2]) && s1
[-3] == '%' && s1
[-4] == '+')
2408 if (op_arg
&& s1
== s
+ 1)
2409 the_insn
.exp
.X_op
= O_absent
;
2411 (void) get_expression (s
);
2423 (void) get_expression (s
);
2431 the_insn
.exp2
= the_insn
.exp
;
2432 the_insn
.exp
= op_exp
;
2433 if (the_insn
.exp2
.X_op
== O_absent
)
2434 the_insn
.exp2
.X_op
= O_illegal
;
2435 else if (the_insn
.exp
.X_op
== O_absent
)
2437 the_insn
.exp
= the_insn
.exp2
;
2438 the_insn
.exp2
.X_op
= O_illegal
;
2440 else if (the_insn
.exp
.X_op
== O_constant
)
2442 valueT val
= the_insn
.exp
.X_add_number
;
2443 switch (the_insn
.reloc
)
2448 case BFD_RELOC_SPARC_HH22
:
2449 val
= BSR (val
, 32);
2452 case BFD_RELOC_SPARC_LM22
:
2453 case BFD_RELOC_HI22
:
2454 val
= (val
>> 10) & 0x3fffff;
2457 case BFD_RELOC_SPARC_HM10
:
2458 val
= BSR (val
, 32);
2461 case BFD_RELOC_LO10
:
2465 case BFD_RELOC_SPARC_H44
:
2470 case BFD_RELOC_SPARC_M44
:
2475 case BFD_RELOC_SPARC_L44
:
2479 case BFD_RELOC_SPARC_HIX22
:
2481 val
= (val
>> 10) & 0x3fffff;
2484 case BFD_RELOC_SPARC_LOX10
:
2485 val
= (val
& 0x3ff) | 0x1c00;
2488 the_insn
.exp
= the_insn
.exp2
;
2489 the_insn
.exp
.X_add_number
+= val
;
2490 the_insn
.exp2
.X_op
= O_illegal
;
2491 the_insn
.reloc
= old_reloc
;
2493 else if (the_insn
.exp2
.X_op
!= O_constant
)
2495 as_bad (_("Illegal operands: Can't add non-constant expression to %%%s()"), op_arg
);
2496 return special_case
;
2500 if (old_reloc
!= BFD_RELOC_SPARC13
2501 || the_insn
.reloc
!= BFD_RELOC_LO10
2502 || sparc_arch_size
!= 64
2505 as_bad (_("Illegal operands: Can't do arithmetics involving %%%s() of a relocatable symbol"), op_arg
);
2506 return special_case
;
2508 the_insn
.reloc
= BFD_RELOC_SPARC_OLO10
;
2512 /* Check for constants that don't require emitting a reloc. */
2513 if (the_insn
.exp
.X_op
== O_constant
2514 && the_insn
.exp
.X_add_symbol
== 0
2515 && the_insn
.exp
.X_op_symbol
== 0)
2517 /* For pc-relative call instructions, we reject
2518 constants to get better code. */
2520 && the_insn
.reloc
== BFD_RELOC_32_PCREL_S2
2521 && in_signed_range (the_insn
.exp
.X_add_number
, 0x3fff))
2523 error_message
= _(": PC-relative operand can't be a constant");
2527 if (the_insn
.reloc
>= BFD_RELOC_SPARC_TLS_GD_HI22
2528 && the_insn
.reloc
<= BFD_RELOC_SPARC_TLS_TPOFF64
)
2530 error_message
= _(": TLS operand can't be a constant");
2534 /* Constants that won't fit are checked in md_apply_fix
2535 and bfd_install_relocation.
2536 ??? It would be preferable to install the constants
2537 into the insn here and save having to create a fixS
2538 for each one. There already exists code to handle
2539 all the various cases (e.g. in md_apply_fix and
2540 bfd_install_relocation) so duplicating all that code
2541 here isn't right. */
2561 if (! parse_keyword_arg (sparc_encode_asi
, &s
, &asi
))
2563 error_message
= _(": invalid ASI name");
2569 if (! parse_const_expr_arg (&s
, &asi
))
2571 error_message
= _(": invalid ASI expression");
2574 if (asi
< 0 || asi
> 255)
2576 error_message
= _(": invalid ASI number");
2580 opcode
|= ASI (asi
);
2582 } /* Alternate space. */
2585 if (strncmp (s
, "%psr", 4) == 0)
2592 case 'q': /* Floating point queue. */
2593 if (strncmp (s
, "%fq", 3) == 0)
2600 case 'Q': /* Coprocessor queue. */
2601 if (strncmp (s
, "%cq", 3) == 0)
2609 if (strcmp (str
, "set") == 0
2610 || strcmp (str
, "setuw") == 0)
2612 special_case
= SPECIAL_CASE_SET
;
2615 else if (strcmp (str
, "setsw") == 0)
2617 special_case
= SPECIAL_CASE_SETSW
;
2620 else if (strcmp (str
, "setx") == 0)
2622 special_case
= SPECIAL_CASE_SETX
;
2625 else if (strncmp (str
, "fdiv", 4) == 0)
2627 special_case
= SPECIAL_CASE_FDIV
;
2633 if (strncmp (s
, "%asi", 4) != 0)
2639 if (strncmp (s
, "%fprs", 5) != 0)
2645 if (strncmp (s
, "%ccr", 4) != 0)
2651 if (strncmp (s
, "%tbr", 4) != 0)
2657 if (strncmp (s
, "%wim", 4) != 0)
2664 char *push
= input_line_pointer
;
2667 input_line_pointer
= s
;
2669 if (e
.X_op
== O_constant
)
2671 int n
= e
.X_add_number
;
2672 if (n
!= e
.X_add_number
|| (n
& ~0x1ff) != 0)
2673 as_bad (_("OPF immediate operand out of range (0-0x1ff)"));
2675 opcode
|= e
.X_add_number
<< 5;
2678 as_bad (_("non-immediate OPF operand, ignored"));
2679 s
= input_line_pointer
;
2680 input_line_pointer
= push
;
2685 if (strncmp (s
, "%y", 2) != 0)
2693 /* Parse a sparclet cpreg. */
2695 if (! parse_keyword_arg (sparc_encode_sparclet_cpreg
, &s
, &cpreg
))
2697 error_message
= _(": invalid cpreg name");
2700 opcode
|= (*args
== 'U' ? RS1 (cpreg
) : RD (cpreg
));
2705 as_fatal (_("failed sanity check."));
2706 } /* switch on arg code. */
2708 /* Break out of for() loop. */
2710 } /* For each arg that we expect. */
2715 /* Args don't match. */
2716 if (&insn
[1] - sparc_opcodes
< sparc_num_opcodes
2717 && (insn
->name
== insn
[1].name
2718 || !strcmp (insn
->name
, insn
[1].name
)))
2726 as_bad (_("Illegal operands%s"), error_message
);
2727 return special_case
;
2732 /* We have a match. Now see if the architecture is OK. */
2733 int needed_arch_mask
= insn
->architecture
;
2738 ~(SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9
) - 1);
2739 if (! needed_arch_mask
)
2741 SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9
);
2744 if (needed_arch_mask
2745 & SPARC_OPCODE_SUPPORTED (current_architecture
))
2748 /* Can we bump up the architecture? */
2749 else if (needed_arch_mask
2750 & SPARC_OPCODE_SUPPORTED (max_architecture
))
2752 enum sparc_opcode_arch_val needed_architecture
=
2753 sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture
)
2754 & needed_arch_mask
);
2756 assert (needed_architecture
<= SPARC_OPCODE_ARCH_MAX
);
2758 && needed_architecture
> warn_after_architecture
)
2760 as_warn (_("architecture bumped from \"%s\" to \"%s\" on \"%s\""),
2761 sparc_opcode_archs
[current_architecture
].name
,
2762 sparc_opcode_archs
[needed_architecture
].name
,
2764 warn_after_architecture
= needed_architecture
;
2766 current_architecture
= needed_architecture
;
2769 /* ??? This seems to be a bit fragile. What if the next entry in
2770 the opcode table is the one we want and it is supported?
2771 It is possible to arrange the table today so that this can't
2772 happen but what about tomorrow? */
2775 int arch
, printed_one_p
= 0;
2777 char required_archs
[SPARC_OPCODE_ARCH_MAX
* 16];
2779 /* Create a list of the architectures that support the insn. */
2780 needed_arch_mask
&= ~SPARC_OPCODE_SUPPORTED (max_architecture
);
2782 arch
= sparc_ffs (needed_arch_mask
);
2783 while ((1 << arch
) <= needed_arch_mask
)
2785 if ((1 << arch
) & needed_arch_mask
)
2789 strcpy (p
, sparc_opcode_archs
[arch
].name
);
2796 as_bad (_("Architecture mismatch on \"%s\"."), str
);
2797 as_tsktsk (_(" (Requires %s; requested architecture is %s.)"),
2799 sparc_opcode_archs
[max_architecture
].name
);
2800 return special_case
;
2802 } /* If no match. */
2805 } /* Forever looking for a match. */
2807 the_insn
.opcode
= opcode
;
2808 return special_case
;
2811 /* Parse an argument that can be expressed as a keyword.
2812 (eg: #StoreStore or %ccfr).
2813 The result is a boolean indicating success.
2814 If successful, INPUT_POINTER is updated. */
2817 parse_keyword_arg (lookup_fn
, input_pointerP
, valueP
)
2818 int (*lookup_fn
) PARAMS ((const char *));
2819 char **input_pointerP
;
2825 p
= *input_pointerP
;
2826 for (q
= p
+ (*p
== '#' || *p
== '%');
2827 ISALNUM (*q
) || *q
== '_';
2832 value
= (*lookup_fn
) (p
);
2837 *input_pointerP
= q
;
2841 /* Parse an argument that is a constant expression.
2842 The result is a boolean indicating success. */
2845 parse_const_expr_arg (input_pointerP
, valueP
)
2846 char **input_pointerP
;
2849 char *save
= input_line_pointer
;
2852 input_line_pointer
= *input_pointerP
;
2853 /* The next expression may be something other than a constant
2854 (say if we're not processing the right variant of the insn).
2855 Don't call expression unless we're sure it will succeed as it will
2856 signal an error (which we want to defer until later). */
2857 /* FIXME: It might be better to define md_operand and have it recognize
2858 things like %asi, etc. but continuing that route through to the end
2859 is a lot of work. */
2860 if (*input_line_pointer
== '%')
2862 input_line_pointer
= save
;
2866 *input_pointerP
= input_line_pointer
;
2867 input_line_pointer
= save
;
2868 if (exp
.X_op
!= O_constant
)
2870 *valueP
= exp
.X_add_number
;
2874 /* Subroutine of sparc_ip to parse an expression. */
2877 get_expression (str
)
2883 save_in
= input_line_pointer
;
2884 input_line_pointer
= str
;
2885 seg
= expression (&the_insn
.exp
);
2886 if (seg
!= absolute_section
2887 && seg
!= text_section
2888 && seg
!= data_section
2889 && seg
!= bss_section
2890 && seg
!= undefined_section
)
2892 the_insn
.error
= _("bad segment");
2893 expr_end
= input_line_pointer
;
2894 input_line_pointer
= save_in
;
2897 expr_end
= input_line_pointer
;
2898 input_line_pointer
= save_in
;
2902 /* Subroutine of md_assemble to output one insn. */
2905 output_insn (insn
, the_insn
)
2906 const struct sparc_opcode
*insn
;
2907 struct sparc_it
*the_insn
;
2909 char *toP
= frag_more (4);
2911 /* Put out the opcode. */
2912 if (INSN_BIG_ENDIAN
)
2913 number_to_chars_bigendian (toP
, (valueT
) the_insn
->opcode
, 4);
2915 number_to_chars_littleendian (toP
, (valueT
) the_insn
->opcode
, 4);
2917 /* Put out the symbol-dependent stuff. */
2918 if (the_insn
->reloc
!= BFD_RELOC_NONE
)
2920 fixS
*fixP
= fix_new_exp (frag_now
, /* Which frag. */
2921 (toP
- frag_now
->fr_literal
), /* Where. */
2926 /* Turn off overflow checking in fixup_segment. We'll do our
2927 own overflow checking in md_apply_fix. This is necessary because
2928 the insn size is 4 and fixup_segment will signal an overflow for
2929 large 8 byte quantities. */
2930 fixP
->fx_no_overflow
= 1;
2931 if (the_insn
->reloc
== BFD_RELOC_SPARC_OLO10
)
2932 fixP
->tc_fix_data
= the_insn
->exp2
.X_add_number
;
2936 last_opcode
= the_insn
->opcode
;
2939 dwarf2_emit_insn (4);
2943 /* This is identical to the md_atof in m68k.c. I think this is right,
2946 Turn a string in input_line_pointer into a floating point constant
2947 of type TYPE, and store the appropriate bytes in *LITP. The number
2948 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2949 returned, or NULL on OK. */
2951 /* Equal to MAX_PRECISION in atof-ieee.c. */
2952 #define MAX_LITTLENUMS 6
2955 md_atof (type
, litP
, sizeP
)
2961 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
2992 return _("Bad call to MD_ATOF()");
2995 t
= atof_ieee (input_line_pointer
, type
, words
);
2997 input_line_pointer
= t
;
2998 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
3000 if (target_big_endian
)
3002 for (i
= 0; i
< prec
; i
++)
3004 md_number_to_chars (litP
, (valueT
) words
[i
],
3005 sizeof (LITTLENUM_TYPE
));
3006 litP
+= sizeof (LITTLENUM_TYPE
);
3011 for (i
= prec
- 1; i
>= 0; i
--)
3013 md_number_to_chars (litP
, (valueT
) words
[i
],
3014 sizeof (LITTLENUM_TYPE
));
3015 litP
+= sizeof (LITTLENUM_TYPE
);
3022 /* Write a value out to the object file, using the appropriate
3026 md_number_to_chars (buf
, val
, n
)
3031 if (target_big_endian
)
3032 number_to_chars_bigendian (buf
, val
, n
);
3033 else if (target_little_endian_data
3034 && ((n
== 4 || n
== 2) && ~now_seg
->flags
& SEC_ALLOC
))
3035 /* Output debug words, which are not in allocated sections, as big
3037 number_to_chars_bigendian (buf
, val
, n
);
3038 else if (target_little_endian_data
|| ! target_big_endian
)
3039 number_to_chars_littleendian (buf
, val
, n
);
3042 /* Apply a fixS to the frags, now that we know the value it ought to
3046 md_apply_fix (fixP
, valP
, segment
)
3049 segT segment ATTRIBUTE_UNUSED
;
3051 char *buf
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
3052 offsetT val
= * (offsetT
*) valP
;
3055 assert (fixP
->fx_r_type
< BFD_RELOC_UNUSED
);
3057 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
3060 /* SPARC ELF relocations don't use an addend in the data field. */
3061 if (fixP
->fx_addsy
!= NULL
)
3063 switch (fixP
->fx_r_type
)
3065 case BFD_RELOC_SPARC_TLS_GD_HI22
:
3066 case BFD_RELOC_SPARC_TLS_GD_LO10
:
3067 case BFD_RELOC_SPARC_TLS_GD_ADD
:
3068 case BFD_RELOC_SPARC_TLS_GD_CALL
:
3069 case BFD_RELOC_SPARC_TLS_LDM_HI22
:
3070 case BFD_RELOC_SPARC_TLS_LDM_LO10
:
3071 case BFD_RELOC_SPARC_TLS_LDM_ADD
:
3072 case BFD_RELOC_SPARC_TLS_LDM_CALL
:
3073 case BFD_RELOC_SPARC_TLS_LDO_HIX22
:
3074 case BFD_RELOC_SPARC_TLS_LDO_LOX10
:
3075 case BFD_RELOC_SPARC_TLS_LDO_ADD
:
3076 case BFD_RELOC_SPARC_TLS_IE_HI22
:
3077 case BFD_RELOC_SPARC_TLS_IE_LO10
:
3078 case BFD_RELOC_SPARC_TLS_IE_LD
:
3079 case BFD_RELOC_SPARC_TLS_IE_LDX
:
3080 case BFD_RELOC_SPARC_TLS_IE_ADD
:
3081 case BFD_RELOC_SPARC_TLS_LE_HIX22
:
3082 case BFD_RELOC_SPARC_TLS_LE_LOX10
:
3083 case BFD_RELOC_SPARC_TLS_DTPMOD32
:
3084 case BFD_RELOC_SPARC_TLS_DTPMOD64
:
3085 case BFD_RELOC_SPARC_TLS_DTPOFF32
:
3086 case BFD_RELOC_SPARC_TLS_DTPOFF64
:
3087 case BFD_RELOC_SPARC_TLS_TPOFF32
:
3088 case BFD_RELOC_SPARC_TLS_TPOFF64
:
3089 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
3099 /* This is a hack. There should be a better way to
3100 handle this. Probably in terms of howto fields, once
3101 we can look at these fixups in terms of howtos. */
3102 if (fixP
->fx_r_type
== BFD_RELOC_32_PCREL_S2
&& fixP
->fx_addsy
)
3103 val
+= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
3106 /* FIXME: More ridiculous gas reloc hacking. If we are going to
3107 generate a reloc, then we just want to let the reloc addend set
3108 the value. We do not want to also stuff the addend into the
3109 object file. Including the addend in the object file works when
3110 doing a static link, because the linker will ignore the object
3111 file contents. However, the dynamic linker does not ignore the
3112 object file contents. */
3113 if (fixP
->fx_addsy
!= NULL
3114 && fixP
->fx_r_type
!= BFD_RELOC_32_PCREL_S2
)
3117 /* When generating PIC code, we do not want an addend for a reloc
3118 against a local symbol. We adjust fx_addnumber to cancel out the
3119 value already included in val, and to also cancel out the
3120 adjustment which bfd_install_relocation will create. */
3122 && fixP
->fx_r_type
!= BFD_RELOC_32_PCREL_S2
3123 && fixP
->fx_addsy
!= NULL
3124 && ! S_IS_COMMON (fixP
->fx_addsy
)
3125 && symbol_section_p (fixP
->fx_addsy
))
3126 fixP
->fx_addnumber
-= 2 * S_GET_VALUE (fixP
->fx_addsy
);
3128 /* When generating PIC code, we need to fiddle to get
3129 bfd_install_relocation to do the right thing for a PC relative
3130 reloc against a local symbol which we are going to keep. */
3132 && fixP
->fx_r_type
== BFD_RELOC_32_PCREL_S2
3133 && fixP
->fx_addsy
!= NULL
3134 && (S_IS_EXTERNAL (fixP
->fx_addsy
)
3135 || S_IS_WEAK (fixP
->fx_addsy
))
3136 && S_IS_DEFINED (fixP
->fx_addsy
)
3137 && ! S_IS_COMMON (fixP
->fx_addsy
))
3140 fixP
->fx_addnumber
-= 2 * S_GET_VALUE (fixP
->fx_addsy
);
3144 /* If this is a data relocation, just output VAL. */
3146 if (fixP
->fx_r_type
== BFD_RELOC_16
3147 || fixP
->fx_r_type
== BFD_RELOC_SPARC_UA16
)
3149 md_number_to_chars (buf
, val
, 2);
3151 else if (fixP
->fx_r_type
== BFD_RELOC_32
3152 || fixP
->fx_r_type
== BFD_RELOC_SPARC_UA32
3153 || fixP
->fx_r_type
== BFD_RELOC_SPARC_REV32
)
3155 md_number_to_chars (buf
, val
, 4);
3157 else if (fixP
->fx_r_type
== BFD_RELOC_64
3158 || fixP
->fx_r_type
== BFD_RELOC_SPARC_UA64
)
3160 md_number_to_chars (buf
, val
, 8);
3162 else if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3163 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
3170 /* It's a relocation against an instruction. */
3172 if (INSN_BIG_ENDIAN
)
3173 insn
= bfd_getb32 ((unsigned char *) buf
);
3175 insn
= bfd_getl32 ((unsigned char *) buf
);
3177 switch (fixP
->fx_r_type
)
3179 case BFD_RELOC_32_PCREL_S2
:
3181 /* FIXME: This increment-by-one deserves a comment of why it's
3183 if (! sparc_pic_code
3184 || fixP
->fx_addsy
== NULL
3185 || symbol_section_p (fixP
->fx_addsy
))
3188 insn
|= val
& 0x3fffffff;
3190 /* See if we have a delay slot. */
3191 if (sparc_relax
&& fixP
->fx_where
+ 8 <= fixP
->fx_frag
->fr_fix
)
3195 #define XCC (2 << 20)
3196 #define COND(x) (((x)&0xf)<<25)
3197 #define CONDA COND(0x8)
3198 #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
3199 #define INSN_BA (F2(0,2) | CONDA)
3200 #define INSN_OR F3(2, 0x2, 0)
3201 #define INSN_NOP F2(0,4)
3205 /* If the instruction is a call with either:
3207 arithmetic instruction with rd == %o7
3208 where rs1 != %o7 and rs2 if it is register != %o7
3209 then we can optimize if the call destination is near
3210 by changing the call into a branch always. */
3211 if (INSN_BIG_ENDIAN
)
3212 delay
= bfd_getb32 ((unsigned char *) buf
+ 4);
3214 delay
= bfd_getl32 ((unsigned char *) buf
+ 4);
3215 if ((insn
& OP (~0)) != OP (1) || (delay
& OP (~0)) != OP (2))
3217 if ((delay
& OP3 (~0)) != OP3 (0x3d) /* Restore. */
3218 && ((delay
& OP3 (0x28)) != 0 /* Arithmetic. */
3219 || ((delay
& RD (~0)) != RD (O7
))))
3221 if ((delay
& RS1 (~0)) == RS1 (O7
)
3222 || ((delay
& F3I (~0)) == 0
3223 && (delay
& RS2 (~0)) == RS2 (O7
)))
3225 /* Ensure the branch will fit into simm22. */
3226 if ((val
& 0x3fe00000)
3227 && (val
& 0x3fe00000) != 0x3fe00000)
3229 /* Check if the arch is v9 and branch will fit
3231 if (((val
& 0x3c0000) == 0
3232 || (val
& 0x3c0000) == 0x3c0000)
3233 && (sparc_arch_size
== 64
3234 || current_architecture
>= SPARC_OPCODE_ARCH_V9
))
3236 insn
= INSN_BPA
| (val
& 0x7ffff);
3239 insn
= INSN_BA
| (val
& 0x3fffff);
3240 if (fixP
->fx_where
>= 4
3241 && ((delay
& (0xffffffff ^ RS1 (~0)))
3242 == (INSN_OR
| RD (O7
) | RS2 (G0
))))
3247 if (INSN_BIG_ENDIAN
)
3248 setter
= bfd_getb32 ((unsigned char *) buf
- 4);
3250 setter
= bfd_getl32 ((unsigned char *) buf
- 4);
3251 if ((setter
& (0xffffffff ^ RD (~0)))
3252 != (INSN_OR
| RS1 (O7
) | RS2 (G0
)))
3259 If call foo was replaced with ba, replace
3260 or %rN, %g0, %o7 with nop. */
3261 reg
= (delay
& RS1 (~0)) >> 14;
3262 if (reg
!= ((setter
& RD (~0)) >> 25)
3263 || reg
== G0
|| reg
== O7
)
3266 if (INSN_BIG_ENDIAN
)
3267 bfd_putb32 (INSN_NOP
, (unsigned char *) buf
+ 4);
3269 bfd_putl32 (INSN_NOP
, (unsigned char *) buf
+ 4);
3274 case BFD_RELOC_SPARC_11
:
3275 if (! in_signed_range (val
, 0x7ff))
3276 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3277 _("relocation overflow"));
3278 insn
|= val
& 0x7ff;
3281 case BFD_RELOC_SPARC_10
:
3282 if (! in_signed_range (val
, 0x3ff))
3283 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3284 _("relocation overflow"));
3285 insn
|= val
& 0x3ff;
3288 case BFD_RELOC_SPARC_7
:
3289 if (! in_bitfield_range (val
, 0x7f))
3290 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3291 _("relocation overflow"));
3295 case BFD_RELOC_SPARC_6
:
3296 if (! in_bitfield_range (val
, 0x3f))
3297 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3298 _("relocation overflow"));
3302 case BFD_RELOC_SPARC_5
:
3303 if (! in_bitfield_range (val
, 0x1f))
3304 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3305 _("relocation overflow"));
3309 case BFD_RELOC_SPARC_WDISP16
:
3310 /* FIXME: simplify. */
3311 if (((val
> 0) && (val
& ~0x3fffc))
3312 || ((val
< 0) && (~(val
- 1) & ~0x3fffc)))
3313 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3314 _("relocation overflow"));
3315 /* FIXME: The +1 deserves a comment. */
3316 val
= (val
>> 2) + 1;
3317 insn
|= ((val
& 0xc000) << 6) | (val
& 0x3fff);
3320 case BFD_RELOC_SPARC_WDISP19
:
3321 /* FIXME: simplify. */
3322 if (((val
> 0) && (val
& ~0x1ffffc))
3323 || ((val
< 0) && (~(val
- 1) & ~0x1ffffc)))
3324 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3325 _("relocation overflow"));
3326 /* FIXME: The +1 deserves a comment. */
3327 val
= (val
>> 2) + 1;
3328 insn
|= val
& 0x7ffff;
3331 case BFD_RELOC_SPARC_HH22
:
3332 val
= BSR (val
, 32);
3335 case BFD_RELOC_SPARC_LM22
:
3336 case BFD_RELOC_HI22
:
3337 if (!fixP
->fx_addsy
)
3338 insn
|= (val
>> 10) & 0x3fffff;
3340 /* FIXME: Need comment explaining why we do this. */
3344 case BFD_RELOC_SPARC22
:
3345 if (val
& ~0x003fffff)
3346 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3347 _("relocation overflow"));
3348 insn
|= (val
& 0x3fffff);
3351 case BFD_RELOC_SPARC_HM10
:
3352 val
= BSR (val
, 32);
3355 case BFD_RELOC_LO10
:
3356 if (!fixP
->fx_addsy
)
3357 insn
|= val
& 0x3ff;
3359 /* FIXME: Need comment explaining why we do this. */
3363 case BFD_RELOC_SPARC_OLO10
:
3365 val
+= fixP
->tc_fix_data
;
3368 case BFD_RELOC_SPARC13
:
3369 if (! in_signed_range (val
, 0x1fff))
3370 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3371 _("relocation overflow"));
3372 insn
|= val
& 0x1fff;
3375 case BFD_RELOC_SPARC_WDISP22
:
3376 val
= (val
>> 2) + 1;
3378 case BFD_RELOC_SPARC_BASE22
:
3379 insn
|= val
& 0x3fffff;
3382 case BFD_RELOC_SPARC_H44
:
3383 if (!fixP
->fx_addsy
)
3387 insn
|= tval
& 0x3fffff;
3391 case BFD_RELOC_SPARC_M44
:
3392 if (!fixP
->fx_addsy
)
3393 insn
|= (val
>> 12) & 0x3ff;
3396 case BFD_RELOC_SPARC_L44
:
3397 if (!fixP
->fx_addsy
)
3398 insn
|= val
& 0xfff;
3401 case BFD_RELOC_SPARC_HIX22
:
3402 if (!fixP
->fx_addsy
)
3404 val
^= ~(offsetT
) 0;
3405 insn
|= (val
>> 10) & 0x3fffff;
3409 case BFD_RELOC_SPARC_LOX10
:
3410 if (!fixP
->fx_addsy
)
3411 insn
|= 0x1c00 | (val
& 0x3ff);
3414 case BFD_RELOC_NONE
:
3416 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3417 _("bad or unhandled relocation type: 0x%02x"),
3422 if (INSN_BIG_ENDIAN
)
3423 bfd_putb32 (insn
, (unsigned char *) buf
);
3425 bfd_putl32 (insn
, (unsigned char *) buf
);
3428 /* Are we finished with this relocation now? */
3429 if (fixP
->fx_addsy
== 0 && !fixP
->fx_pcrel
)
3433 /* Translate internal representation of relocation info to BFD target
3437 tc_gen_reloc (section
, fixp
)
3438 asection
*section ATTRIBUTE_UNUSED
;
3441 static arelent
*relocs
[3];
3443 bfd_reloc_code_real_type code
;
3445 relocs
[0] = reloc
= (arelent
*) xmalloc (sizeof (arelent
));
3448 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
3449 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
3450 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
3452 switch (fixp
->fx_r_type
)
3456 case BFD_RELOC_HI22
:
3457 case BFD_RELOC_LO10
:
3458 case BFD_RELOC_32_PCREL_S2
:
3459 case BFD_RELOC_SPARC13
:
3460 case BFD_RELOC_SPARC22
:
3461 case BFD_RELOC_SPARC_BASE13
:
3462 case BFD_RELOC_SPARC_WDISP16
:
3463 case BFD_RELOC_SPARC_WDISP19
:
3464 case BFD_RELOC_SPARC_WDISP22
:
3466 case BFD_RELOC_SPARC_5
:
3467 case BFD_RELOC_SPARC_6
:
3468 case BFD_RELOC_SPARC_7
:
3469 case BFD_RELOC_SPARC_10
:
3470 case BFD_RELOC_SPARC_11
:
3471 case BFD_RELOC_SPARC_HH22
:
3472 case BFD_RELOC_SPARC_HM10
:
3473 case BFD_RELOC_SPARC_LM22
:
3474 case BFD_RELOC_SPARC_PC_HH22
:
3475 case BFD_RELOC_SPARC_PC_HM10
:
3476 case BFD_RELOC_SPARC_PC_LM22
:
3477 case BFD_RELOC_SPARC_H44
:
3478 case BFD_RELOC_SPARC_M44
:
3479 case BFD_RELOC_SPARC_L44
:
3480 case BFD_RELOC_SPARC_HIX22
:
3481 case BFD_RELOC_SPARC_LOX10
:
3482 case BFD_RELOC_SPARC_REV32
:
3483 case BFD_RELOC_SPARC_OLO10
:
3484 case BFD_RELOC_SPARC_UA16
:
3485 case BFD_RELOC_SPARC_UA32
:
3486 case BFD_RELOC_SPARC_UA64
:
3487 case BFD_RELOC_8_PCREL
:
3488 case BFD_RELOC_16_PCREL
:
3489 case BFD_RELOC_32_PCREL
:
3490 case BFD_RELOC_64_PCREL
:
3491 case BFD_RELOC_SPARC_PLT32
:
3492 case BFD_RELOC_SPARC_PLT64
:
3493 case BFD_RELOC_VTABLE_ENTRY
:
3494 case BFD_RELOC_VTABLE_INHERIT
:
3495 case BFD_RELOC_SPARC_TLS_GD_HI22
:
3496 case BFD_RELOC_SPARC_TLS_GD_LO10
:
3497 case BFD_RELOC_SPARC_TLS_GD_ADD
:
3498 case BFD_RELOC_SPARC_TLS_GD_CALL
:
3499 case BFD_RELOC_SPARC_TLS_LDM_HI22
:
3500 case BFD_RELOC_SPARC_TLS_LDM_LO10
:
3501 case BFD_RELOC_SPARC_TLS_LDM_ADD
:
3502 case BFD_RELOC_SPARC_TLS_LDM_CALL
:
3503 case BFD_RELOC_SPARC_TLS_LDO_HIX22
:
3504 case BFD_RELOC_SPARC_TLS_LDO_LOX10
:
3505 case BFD_RELOC_SPARC_TLS_LDO_ADD
:
3506 case BFD_RELOC_SPARC_TLS_IE_HI22
:
3507 case BFD_RELOC_SPARC_TLS_IE_LO10
:
3508 case BFD_RELOC_SPARC_TLS_IE_LD
:
3509 case BFD_RELOC_SPARC_TLS_IE_LDX
:
3510 case BFD_RELOC_SPARC_TLS_IE_ADD
:
3511 case BFD_RELOC_SPARC_TLS_LE_HIX22
:
3512 case BFD_RELOC_SPARC_TLS_LE_LOX10
:
3513 case BFD_RELOC_SPARC_TLS_DTPOFF32
:
3514 case BFD_RELOC_SPARC_TLS_DTPOFF64
:
3515 code
= fixp
->fx_r_type
;
3522 #if defined (OBJ_ELF) || defined (OBJ_AOUT)
3523 /* If we are generating PIC code, we need to generate a different
3527 #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
3529 #define GOT_NAME "__GLOBAL_OFFSET_TABLE_"
3532 /* This code must be parallel to the OBJ_ELF tc_fix_adjustable. */
3538 case BFD_RELOC_32_PCREL_S2
:
3539 if (generic_force_reloc (fixp
))
3540 code
= BFD_RELOC_SPARC_WPLT30
;
3542 case BFD_RELOC_HI22
:
3543 if (fixp
->fx_addsy
!= NULL
3544 && strcmp (S_GET_NAME (fixp
->fx_addsy
), GOT_NAME
) == 0)
3545 code
= BFD_RELOC_SPARC_PC22
;
3547 code
= BFD_RELOC_SPARC_GOT22
;
3549 case BFD_RELOC_LO10
:
3550 if (fixp
->fx_addsy
!= NULL
3551 && strcmp (S_GET_NAME (fixp
->fx_addsy
), GOT_NAME
) == 0)
3552 code
= BFD_RELOC_SPARC_PC10
;
3554 code
= BFD_RELOC_SPARC_GOT10
;
3556 case BFD_RELOC_SPARC13
:
3557 code
= BFD_RELOC_SPARC_GOT13
;
3563 #endif /* defined (OBJ_ELF) || defined (OBJ_AOUT) */
3565 if (code
== BFD_RELOC_SPARC_OLO10
)
3566 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_LO10
);
3568 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
3569 if (reloc
->howto
== 0)
3571 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
3572 _("internal error: can't export reloc type %d (`%s')"),
3573 fixp
->fx_r_type
, bfd_get_reloc_code_name (code
));
3579 /* @@ Why fx_addnumber sometimes and fx_offset other times? */
3582 if (reloc
->howto
->pc_relative
== 0
3583 || code
== BFD_RELOC_SPARC_PC10
3584 || code
== BFD_RELOC_SPARC_PC22
)
3585 reloc
->addend
= fixp
->fx_addnumber
;
3586 else if (sparc_pic_code
3587 && fixp
->fx_r_type
== BFD_RELOC_32_PCREL_S2
3588 && fixp
->fx_addsy
!= NULL
3589 && (S_IS_EXTERNAL (fixp
->fx_addsy
)
3590 || S_IS_WEAK (fixp
->fx_addsy
))
3591 && S_IS_DEFINED (fixp
->fx_addsy
)
3592 && ! S_IS_COMMON (fixp
->fx_addsy
))
3593 reloc
->addend
= fixp
->fx_addnumber
;
3595 reloc
->addend
= fixp
->fx_offset
- reloc
->address
;
3597 #else /* elf or coff */
3599 if (code
!= BFD_RELOC_32_PCREL_S2
3600 && code
!= BFD_RELOC_SPARC_WDISP22
3601 && code
!= BFD_RELOC_SPARC_WDISP16
3602 && code
!= BFD_RELOC_SPARC_WDISP19
3603 && code
!= BFD_RELOC_SPARC_WPLT30
3604 && code
!= BFD_RELOC_SPARC_TLS_GD_CALL
3605 && code
!= BFD_RELOC_SPARC_TLS_LDM_CALL
)
3606 reloc
->addend
= fixp
->fx_addnumber
;
3607 else if (symbol_section_p (fixp
->fx_addsy
))
3608 reloc
->addend
= (section
->vma
3609 + fixp
->fx_addnumber
3610 + md_pcrel_from (fixp
));
3612 reloc
->addend
= fixp
->fx_offset
;
3615 /* We expand R_SPARC_OLO10 to R_SPARC_LO10 and R_SPARC_13
3616 on the same location. */
3617 if (code
== BFD_RELOC_SPARC_OLO10
)
3619 relocs
[1] = reloc
= (arelent
*) xmalloc (sizeof (arelent
));
3622 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
3624 = symbol_get_bfdsym (section_symbol (absolute_section
));
3625 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
3626 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_SPARC13
);
3627 reloc
->addend
= fixp
->tc_fix_data
;
3633 /* We have no need to default values of symbols. */
3636 md_undefined_symbol (name
)
3637 char *name ATTRIBUTE_UNUSED
;
3642 /* Round up a section size to the appropriate boundary. */
3645 md_section_align (segment
, size
)
3646 segT segment ATTRIBUTE_UNUSED
;
3650 /* This is not right for ELF; a.out wants it, and COFF will force
3651 the alignment anyways. */
3652 valueT align
= ((valueT
) 1
3653 << (valueT
) bfd_get_section_alignment (stdoutput
, segment
));
3656 /* Turn alignment value into a mask. */
3658 newsize
= (size
+ align
) & ~align
;
3665 /* Exactly what point is a PC-relative offset relative TO?
3666 On the sparc, they're relative to the address of the offset, plus
3667 its size. This gets us to the following instruction.
3668 (??? Is this right? FIXME-SOON) */
3670 md_pcrel_from (fixP
)
3675 ret
= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
3676 if (! sparc_pic_code
3677 || fixP
->fx_addsy
== NULL
3678 || symbol_section_p (fixP
->fx_addsy
))
3679 ret
+= fixP
->fx_size
;
3683 /* Return log2 (VALUE), or -1 if VALUE is not an exact positive power
3695 for (shift
= 0; (value
& 1) == 0; value
>>= 1)
3698 return (value
== 1) ? shift
: -1;
3701 /* Sort of like s_lcomm. */
3704 static int max_alignment
= 15;
3709 int ignore ATTRIBUTE_UNUSED
;
3719 name
= input_line_pointer
;
3720 c
= get_symbol_end ();
3721 p
= input_line_pointer
;
3725 if (*input_line_pointer
!= ',')
3727 as_bad (_("Expected comma after name"));
3728 ignore_rest_of_line ();
3732 ++input_line_pointer
;
3734 if ((size
= get_absolute_expression ()) < 0)
3736 as_bad (_("BSS length (%d.) <0! Ignored."), size
);
3737 ignore_rest_of_line ();
3742 symbolP
= symbol_find_or_make (name
);
3745 if (strncmp (input_line_pointer
, ",\"bss\"", 6) != 0
3746 && strncmp (input_line_pointer
, ",\".bss\"", 7) != 0)
3748 as_bad (_("bad .reserve segment -- expected BSS segment"));
3752 if (input_line_pointer
[2] == '.')
3753 input_line_pointer
+= 7;
3755 input_line_pointer
+= 6;
3758 if (*input_line_pointer
== ',')
3760 ++input_line_pointer
;
3763 if (*input_line_pointer
== '\n')
3765 as_bad (_("missing alignment"));
3766 ignore_rest_of_line ();
3770 align
= (int) get_absolute_expression ();
3773 if (align
> max_alignment
)
3775 align
= max_alignment
;
3776 as_warn (_("alignment too large; assuming %d"), align
);
3782 as_bad (_("negative alignment"));
3783 ignore_rest_of_line ();
3789 temp
= mylog2 (align
);
3792 as_bad (_("alignment not a power of 2"));
3793 ignore_rest_of_line ();
3800 record_alignment (bss_section
, align
);
3805 if (!S_IS_DEFINED (symbolP
)
3807 && S_GET_OTHER (symbolP
) == 0
3808 && S_GET_DESC (symbolP
) == 0
3815 segT current_seg
= now_seg
;
3816 subsegT current_subseg
= now_subseg
;
3818 /* Switch to bss. */
3819 subseg_set (bss_section
, 1);
3823 frag_align (align
, 0, 0);
3825 /* Detach from old frag. */
3826 if (S_GET_SEGMENT (symbolP
) == bss_section
)
3827 symbol_get_frag (symbolP
)->fr_symbol
= NULL
;
3829 symbol_set_frag (symbolP
, frag_now
);
3830 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
3831 (offsetT
) size
, (char *) 0);
3834 S_SET_SEGMENT (symbolP
, bss_section
);
3836 subseg_set (current_seg
, current_subseg
);
3839 S_SET_SIZE (symbolP
, size
);
3845 as_warn ("Ignoring attempt to re-define symbol %s",
3846 S_GET_NAME (symbolP
));
3847 } /* if not redefining. */
3849 demand_empty_rest_of_line ();
3854 int ignore ATTRIBUTE_UNUSED
;
3862 name
= input_line_pointer
;
3863 c
= get_symbol_end ();
3864 /* Just after name is now '\0'. */
3865 p
= input_line_pointer
;
3868 if (*input_line_pointer
!= ',')
3870 as_bad (_("Expected comma after symbol-name"));
3871 ignore_rest_of_line ();
3876 input_line_pointer
++;
3878 if ((temp
= get_absolute_expression ()) < 0)
3880 as_bad (_(".COMMon length (%lu) out of range ignored"),
3881 (unsigned long) temp
);
3882 ignore_rest_of_line ();
3887 symbolP
= symbol_find_or_make (name
);
3889 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
3891 as_bad (_("Ignoring attempt to re-define symbol"));
3892 ignore_rest_of_line ();
3895 if (S_GET_VALUE (symbolP
) != 0)
3897 if (S_GET_VALUE (symbolP
) != (valueT
) size
)
3899 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
3900 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), (long) size
);
3906 S_SET_VALUE (symbolP
, (valueT
) size
);
3907 S_SET_EXTERNAL (symbolP
);
3910 know (symbol_get_frag (symbolP
) == &zero_address_frag
);
3911 if (*input_line_pointer
!= ',')
3913 as_bad (_("Expected comma after common length"));
3914 ignore_rest_of_line ();
3917 input_line_pointer
++;
3919 if (*input_line_pointer
!= '"')
3921 temp
= get_absolute_expression ();
3924 if (temp
> max_alignment
)
3926 temp
= max_alignment
;
3927 as_warn (_("alignment too large; assuming %ld"), (long) temp
);
3933 as_bad (_("negative alignment"));
3934 ignore_rest_of_line ();
3939 if (symbol_get_obj (symbolP
)->local
)
3947 old_subsec
= now_subseg
;
3952 align
= mylog2 (temp
);
3956 as_bad (_("alignment not a power of 2"));
3957 ignore_rest_of_line ();
3961 record_alignment (bss_section
, align
);
3962 subseg_set (bss_section
, 0);
3964 frag_align (align
, 0, 0);
3965 if (S_GET_SEGMENT (symbolP
) == bss_section
)
3966 symbol_get_frag (symbolP
)->fr_symbol
= 0;
3967 symbol_set_frag (symbolP
, frag_now
);
3968 p
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
3969 (offsetT
) size
, (char *) 0);
3971 S_SET_SEGMENT (symbolP
, bss_section
);
3972 S_CLEAR_EXTERNAL (symbolP
);
3973 S_SET_SIZE (symbolP
, size
);
3974 subseg_set (old_sec
, old_subsec
);
3977 #endif /* OBJ_ELF */
3980 S_SET_VALUE (symbolP
, (valueT
) size
);
3982 S_SET_ALIGN (symbolP
, temp
);
3983 S_SET_SIZE (symbolP
, size
);
3985 S_SET_EXTERNAL (symbolP
);
3986 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
3991 input_line_pointer
++;
3992 /* @@ Some use the dot, some don't. Can we get some consistency?? */
3993 if (*input_line_pointer
== '.')
3994 input_line_pointer
++;
3995 /* @@ Some say data, some say bss. */
3996 if (strncmp (input_line_pointer
, "bss\"", 4)
3997 && strncmp (input_line_pointer
, "data\"", 5))
3999 while (*--input_line_pointer
!= '"')
4001 input_line_pointer
--;
4002 goto bad_common_segment
;
4004 while (*input_line_pointer
++ != '"')
4006 goto allocate_common
;
4009 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
4011 demand_empty_rest_of_line ();
4016 p
= input_line_pointer
;
4017 while (*p
&& *p
!= '\n')
4021 as_bad (_("bad .common segment %s"), input_line_pointer
+ 1);
4023 input_line_pointer
= p
;
4024 ignore_rest_of_line ();
4029 /* Handle the .empty pseudo-op. This suppresses the warnings about
4030 invalid delay slot usage. */
4034 int ignore ATTRIBUTE_UNUSED
;
4036 /* The easy way to implement is to just forget about the last
4043 int ignore ATTRIBUTE_UNUSED
;
4046 if (strncmp (input_line_pointer
, "\"text\"", 6) == 0)
4048 input_line_pointer
+= 6;
4052 if (strncmp (input_line_pointer
, "\"data\"", 6) == 0)
4054 input_line_pointer
+= 6;
4058 if (strncmp (input_line_pointer
, "\"data1\"", 7) == 0)
4060 input_line_pointer
+= 7;
4064 if (strncmp (input_line_pointer
, "\"bss\"", 5) == 0)
4066 input_line_pointer
+= 5;
4067 /* We only support 2 segments -- text and data -- for now, so
4068 things in the "bss segment" will have to go into data for now.
4069 You can still allocate SEG_BSS stuff with .lcomm or .reserve. */
4070 subseg_set (data_section
, 255); /* FIXME-SOMEDAY. */
4073 as_bad (_("Unknown segment type"));
4074 demand_empty_rest_of_line ();
4080 subseg_set (data_section
, 1);
4081 demand_empty_rest_of_line ();
4086 int ignore ATTRIBUTE_UNUSED
;
4088 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
4090 ++input_line_pointer
;
4092 ++input_line_pointer
;
4095 /* This static variable is set by s_uacons to tell sparc_cons_align
4096 that the expression does not need to be aligned. */
4098 static int sparc_no_align_cons
= 0;
4100 /* This static variable is set by sparc_cons to emit requested types
4101 of relocations in cons_fix_new_sparc. */
4103 static const char *sparc_cons_special_reloc
;
4105 /* This handles the unaligned space allocation pseudo-ops, such as
4106 .uaword. .uaword is just like .word, but the value does not need
4113 /* Tell sparc_cons_align not to align this value. */
4114 sparc_no_align_cons
= 1;
4116 sparc_no_align_cons
= 0;
4119 /* This handles the native word allocation pseudo-op .nword.
4120 For sparc_arch_size 32 it is equivalent to .word, for
4121 sparc_arch_size 64 it is equivalent to .xword. */
4125 int bytes ATTRIBUTE_UNUSED
;
4127 cons (sparc_arch_size
== 32 ? 4 : 8);
4131 /* Handle the SPARC ELF .register pseudo-op. This sets the binding of a
4135 .register %g[2367],{#scratch|symbolname|#ignore}
4140 int ignore ATTRIBUTE_UNUSED
;
4145 const char *regname
;
4147 if (input_line_pointer
[0] != '%'
4148 || input_line_pointer
[1] != 'g'
4149 || ((input_line_pointer
[2] & ~1) != '2'
4150 && (input_line_pointer
[2] & ~1) != '6')
4151 || input_line_pointer
[3] != ',')
4152 as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
4153 reg
= input_line_pointer
[2] - '0';
4154 input_line_pointer
+= 4;
4156 if (*input_line_pointer
== '#')
4158 ++input_line_pointer
;
4159 regname
= input_line_pointer
;
4160 c
= get_symbol_end ();
4161 if (strcmp (regname
, "scratch") && strcmp (regname
, "ignore"))
4162 as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
4163 if (regname
[0] == 'i')
4170 regname
= input_line_pointer
;
4171 c
= get_symbol_end ();
4173 if (sparc_arch_size
== 64)
4177 if ((regname
&& globals
[reg
] != (symbolS
*) 1
4178 && strcmp (S_GET_NAME (globals
[reg
]), regname
))
4179 || ((regname
!= NULL
) ^ (globals
[reg
] != (symbolS
*) 1)))
4180 as_bad (_("redefinition of global register"));
4184 if (regname
== NULL
)
4185 globals
[reg
] = (symbolS
*) 1;
4190 if (symbol_find (regname
))
4191 as_bad (_("Register symbol %s already defined."),
4194 globals
[reg
] = symbol_make (regname
);
4195 flags
= symbol_get_bfdsym (globals
[reg
])->flags
;
4197 flags
= flags
& ~(BSF_GLOBAL
|BSF_LOCAL
|BSF_WEAK
);
4198 if (! (flags
& (BSF_GLOBAL
|BSF_LOCAL
|BSF_WEAK
)))
4199 flags
|= BSF_GLOBAL
;
4200 symbol_get_bfdsym (globals
[reg
])->flags
= flags
;
4201 S_SET_VALUE (globals
[reg
], (valueT
) reg
);
4202 S_SET_ALIGN (globals
[reg
], reg
);
4203 S_SET_SIZE (globals
[reg
], 0);
4204 /* Although we actually want undefined_section here,
4205 we have to use absolute_section, because otherwise
4206 generic as code will make it a COM section.
4207 We fix this up in sparc_adjust_symtab. */
4208 S_SET_SEGMENT (globals
[reg
], absolute_section
);
4209 S_SET_OTHER (globals
[reg
], 0);
4210 elf_symbol (symbol_get_bfdsym (globals
[reg
]))
4211 ->internal_elf_sym
.st_info
=
4212 ELF_ST_INFO(STB_GLOBAL
, STT_REGISTER
);
4213 elf_symbol (symbol_get_bfdsym (globals
[reg
]))
4214 ->internal_elf_sym
.st_shndx
= SHN_UNDEF
;
4219 *input_line_pointer
= c
;
4221 demand_empty_rest_of_line ();
4224 /* Adjust the symbol table. We set undefined sections for STT_REGISTER
4225 symbols which need it. */
4228 sparc_adjust_symtab ()
4232 for (sym
= symbol_rootP
; sym
!= NULL
; sym
= symbol_next (sym
))
4234 if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym
))
4235 ->internal_elf_sym
.st_info
) != STT_REGISTER
)
4238 if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym
))
4239 ->internal_elf_sym
.st_shndx
!= SHN_UNDEF
))
4242 S_SET_SEGMENT (sym
, undefined_section
);
4247 /* If the --enforce-aligned-data option is used, we require .word,
4248 et. al., to be aligned correctly. We do it by setting up an
4249 rs_align_code frag, and checking in HANDLE_ALIGN to make sure that
4250 no unexpected alignment was introduced.
4252 The SunOS and Solaris native assemblers enforce aligned data by
4253 default. We don't want to do that, because gcc can deliberately
4254 generate misaligned data if the packed attribute is used. Instead,
4255 we permit misaligned data by default, and permit the user to set an
4256 option to check for it. */
4259 sparc_cons_align (nbytes
)
4265 /* Only do this if we are enforcing aligned data. */
4266 if (! enforce_aligned_data
)
4269 /* Don't align if this is an unaligned pseudo-op. */
4270 if (sparc_no_align_cons
)
4273 nalign
= mylog2 (nbytes
);
4277 assert (nalign
> 0);
4279 if (now_seg
== absolute_section
)
4281 if ((abs_section_offset
& ((1 << nalign
) - 1)) != 0)
4282 as_bad (_("misaligned data"));
4286 p
= frag_var (rs_align_test
, 1, 1, (relax_substateT
) 0,
4287 (symbolS
*) NULL
, (offsetT
) nalign
, (char *) NULL
);
4289 record_alignment (now_seg
, nalign
);
4292 /* This is called from HANDLE_ALIGN in tc-sparc.h. */
4295 sparc_handle_align (fragp
)
4301 count
= fragp
->fr_next
->fr_address
- fragp
->fr_address
- fragp
->fr_fix
;
4303 switch (fragp
->fr_type
)
4307 as_bad_where (fragp
->fr_file
, fragp
->fr_line
, _("misaligned data"));
4311 p
= fragp
->fr_literal
+ fragp
->fr_fix
;
4322 if (SPARC_OPCODE_ARCH_V9_P (max_architecture
) && count
> 8)
4324 unsigned wval
= (0x30680000 | count
>> 2); /* ba,a,pt %xcc, 1f */
4325 if (INSN_BIG_ENDIAN
)
4326 number_to_chars_bigendian (p
, wval
, 4);
4328 number_to_chars_littleendian (p
, wval
, 4);
4334 if (INSN_BIG_ENDIAN
)
4335 number_to_chars_bigendian (p
, 0x01000000, 4);
4337 number_to_chars_littleendian (p
, 0x01000000, 4);
4339 fragp
->fr_fix
+= fix
;
4349 /* Some special processing for a Sparc ELF file. */
4352 sparc_elf_final_processing ()
4354 /* Set the Sparc ELF flag bits. FIXME: There should probably be some
4355 sort of BFD interface for this. */
4356 if (sparc_arch_size
== 64)
4358 switch (sparc_memory_model
)
4361 elf_elfheader (stdoutput
)->e_flags
|= EF_SPARCV9_RMO
;
4364 elf_elfheader (stdoutput
)->e_flags
|= EF_SPARCV9_PSO
;
4370 else if (current_architecture
>= SPARC_OPCODE_ARCH_V9
)
4371 elf_elfheader (stdoutput
)->e_flags
|= EF_SPARC_32PLUS
;
4372 if (current_architecture
== SPARC_OPCODE_ARCH_V9A
)
4373 elf_elfheader (stdoutput
)->e_flags
|= EF_SPARC_SUN_US1
;
4374 else if (current_architecture
== SPARC_OPCODE_ARCH_V9B
)
4375 elf_elfheader (stdoutput
)->e_flags
|= EF_SPARC_SUN_US1
|EF_SPARC_SUN_US3
;
4379 sparc_cons (exp
, size
)
4386 sparc_cons_special_reloc
= NULL
;
4387 save
= input_line_pointer
;
4388 if (input_line_pointer
[0] == '%'
4389 && input_line_pointer
[1] == 'r'
4390 && input_line_pointer
[2] == '_')
4392 if (strncmp (input_line_pointer
+ 3, "disp", 4) == 0)
4394 input_line_pointer
+= 7;
4395 sparc_cons_special_reloc
= "disp";
4397 else if (strncmp (input_line_pointer
+ 3, "plt", 3) == 0)
4399 if (size
!= 4 && size
!= 8)
4400 as_bad (_("Illegal operands: %%r_plt in %d-byte data field"), size
);
4403 input_line_pointer
+= 6;
4404 sparc_cons_special_reloc
= "plt";
4407 else if (strncmp (input_line_pointer
+ 3, "tls_dtpoff", 10) == 0)
4409 if (size
!= 4 && size
!= 8)
4410 as_bad (_("Illegal operands: %%r_tls_dtpoff in %d-byte data field"), size
);
4413 input_line_pointer
+= 13;
4414 sparc_cons_special_reloc
= "tls_dtpoff";
4417 if (sparc_cons_special_reloc
)
4424 if (*input_line_pointer
!= '8')
4426 input_line_pointer
--;
4429 if (input_line_pointer
[0] != '1' || input_line_pointer
[1] != '6')
4433 if (input_line_pointer
[0] != '3' || input_line_pointer
[1] != '2')
4437 if (input_line_pointer
[0] != '6' || input_line_pointer
[1] != '4')
4447 as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
4448 sparc_cons_special_reloc
, size
* 8, size
);
4452 input_line_pointer
+= 2;
4453 if (*input_line_pointer
!= '(')
4455 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
4456 sparc_cons_special_reloc
, size
* 8);
4463 input_line_pointer
= save
;
4464 sparc_cons_special_reloc
= NULL
;
4469 char *end
= ++input_line_pointer
;
4472 while (! is_end_of_line
[(c
= *end
)])
4486 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
4487 sparc_cons_special_reloc
, size
* 8);
4493 if (input_line_pointer
!= end
)
4495 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
4496 sparc_cons_special_reloc
, size
* 8);
4500 input_line_pointer
++;
4502 c
= *input_line_pointer
;
4503 if (! is_end_of_line
[c
] && c
!= ',')
4504 as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
4505 sparc_cons_special_reloc
, size
* 8);
4511 if (sparc_cons_special_reloc
== NULL
)
4517 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
4518 reloc for a cons. We could use the definition there, except that
4519 we want to handle little endian relocs specially. */
4522 cons_fix_new_sparc (frag
, where
, nbytes
, exp
)
4525 unsigned int nbytes
;
4528 bfd_reloc_code_real_type r
;
4530 r
= (nbytes
== 1 ? BFD_RELOC_8
:
4531 (nbytes
== 2 ? BFD_RELOC_16
:
4532 (nbytes
== 4 ? BFD_RELOC_32
: BFD_RELOC_64
)));
4534 if (target_little_endian_data
4536 && now_seg
->flags
& SEC_ALLOC
)
4537 r
= BFD_RELOC_SPARC_REV32
;
4539 if (sparc_cons_special_reloc
)
4541 if (*sparc_cons_special_reloc
== 'd')
4544 case 1: r
= BFD_RELOC_8_PCREL
; break;
4545 case 2: r
= BFD_RELOC_16_PCREL
; break;
4546 case 4: r
= BFD_RELOC_32_PCREL
; break;
4547 case 8: r
= BFD_RELOC_64_PCREL
; break;
4550 else if (*sparc_cons_special_reloc
== 'p')
4553 case 4: r
= BFD_RELOC_SPARC_PLT32
; break;
4554 case 8: r
= BFD_RELOC_SPARC_PLT64
; break;
4559 case 4: r
= BFD_RELOC_SPARC_TLS_DTPOFF32
; break;
4560 case 8: r
= BFD_RELOC_SPARC_TLS_DTPOFF64
; break;
4563 else if (sparc_no_align_cons
)
4567 case 2: r
= BFD_RELOC_SPARC_UA16
; break;
4568 case 4: r
= BFD_RELOC_SPARC_UA32
; break;
4569 case 8: r
= BFD_RELOC_SPARC_UA64
; break;
4574 fix_new_exp (frag
, where
, (int) nbytes
, exp
, 0, r
);
4575 sparc_cons_special_reloc
= NULL
;
4579 sparc_cfi_frame_initial_instructions ()
4581 cfi_add_CFA_def_cfa (14, sparc_arch_size
== 64 ? 0x7ff : 0);
4585 sparc_regname_to_dw2regnum (const char *regname
)
4593 p
= strchr (q
, regname
[0]);
4596 if (regname
[1] < '0' || regname
[1] > '8' || regname
[2])
4598 return (p
- q
) * 8 + regname
[1] - '0';
4600 if (regname
[0] == 's' && regname
[1] == 'p' && !regname
[2])
4602 if (regname
[0] == 'f' && regname
[1] == 'p' && !regname
[2])
4604 if (regname
[0] == 'f' || regname
[0] == 'r')
4606 unsigned int regnum
;
4608 regnum
= strtoul (regname
+ 1, &q
, 10);
4611 if (regnum
>= ((regname
[0] == 'f'
4612 && SPARC_OPCODE_ARCH_V9_P (max_architecture
))
4615 if (regname
[0] == 'f')
4618 if (regnum
>= 64 && (regnum
& 1))
4627 sparc_cfi_emit_pcrel_expr (expressionS
*exp
, unsigned int nbytes
)
4629 sparc_cons_special_reloc
= "disp";
4630 sparc_no_align_cons
= 1;
4631 emit_expr (exp
, nbytes
);
4632 sparc_no_align_cons
= 0;
4633 sparc_cons_special_reloc
= NULL
;