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