1 /* tc-alpha.c - Processor-specific code for the DEC Alpha AXP CPU.
2 Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Contributed by Carnegie Mellon University, 1993.
5 Written by Alessandro Forin, based on earlier gas-1.38 target CPU files.
6 Modified by Ken Raeburn for gas-2.x and ECOFF support.
7 Modified by Richard Henderson for ELF support.
8 Modified by Klaus K"ampf for EVAX (OpenVMS/Alpha) support.
10 This file is part of GAS, the GNU Assembler.
12 GAS is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2, or (at your option)
17 GAS is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with GAS; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
28 * Mach Operating System
29 * Copyright (c) 1993 Carnegie Mellon University
30 * All Rights Reserved.
32 * Permission to use, copy, modify and distribute this software and its
33 * documentation is hereby granted, provided that both the copyright
34 * notice and this permission notice appear in all copies of the
35 * software, derivative works or modified versions, and any portions
36 * thereof, and that both notices appear in supporting documentation.
38 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
39 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
40 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
42 * Carnegie Mellon requests users of this software to return to
44 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
45 * School of Computer Science
46 * Carnegie Mellon University
47 * Pittsburgh PA 15213-3890
49 * any improvements or extensions that they make and grant Carnegie the
50 * rights to redistribute these changes.
55 #include "struc-symbol.h"
58 #include "opcode/alpha.h"
61 #include "elf/alpha.h"
62 #include "dwarf2dbg.h"
69 #define TOKENIZE_ERROR -1
70 #define TOKENIZE_ERROR_REPORT -2
72 #define MAX_INSN_FIXUPS 2
73 #define MAX_INSN_ARGS 5
77 bfd_reloc_code_real_type reloc;
83 struct alpha_fixup fixups[MAX_INSN_FIXUPS];
84 unsigned sequence[MAX_INSN_FIXUPS];
87 enum alpha_macro_arg {
103 void (*emit) PARAMS ((const expressionS *, int, const PTR));
105 enum alpha_macro_arg argsets[16];
108 /* Extra expression types. */
110 #define O_pregister O_md1 /* O_register, in parentheses */
111 #define O_cpregister O_md2 /* + a leading comma */
114 /* Note, the alpha_reloc_op table below depends on the ordering
115 of O_literal .. O_gprelow. */
116 #define O_literal O_md3 /* !literal relocation */
117 #define O_lituse_base O_md4 /* !lituse_base relocation */
118 #define O_lituse_bytoff O_md5 /* !lituse_bytoff relocation */
119 #define O_lituse_jsr O_md6 /* !lituse_jsr relocation */
120 #define O_gpdisp O_md7 /* !gpdisp relocation */
121 #define O_gprelhigh O_md8 /* !gprelhigh relocation */
122 #define O_gprellow O_md9 /* !gprellow relocation */
124 #define USER_RELOC_P(R) ((R) >= O_literal && (R) <= O_gprellow)
127 /* Macros for extracting the type and number of encoded register tokens */
129 #define is_ir_num(x) (((x) & 32) == 0)
130 #define is_fpr_num(x) (((x) & 32) != 0)
131 #define regno(x) ((x) & 31)
133 /* Something odd inherited from the old assembler */
135 #define note_gpreg(R) (alpha_gprmask |= (1 << (R)))
136 #define note_fpreg(R) (alpha_fprmask |= (1 << (R)))
138 /* Predicates for 16- and 32-bit ranges */
139 /* XXX: The non-shift version appears to trigger a compiler bug when
140 cross-assembling from x86 w/ gcc 2.7.2. */
143 #define range_signed_16(x) \
144 (((offsetT) (x) >> 15) == 0 || ((offsetT) (x) >> 15) == -1)
145 #define range_signed_32(x) \
146 (((offsetT) (x) >> 31) == 0 || ((offsetT) (x) >> 31) == -1)
148 #define range_signed_16(x) ((offsetT) (x) >= -(offsetT) 0x8000 && \
149 (offsetT) (x) <= (offsetT) 0x7FFF)
150 #define range_signed_32(x) ((offsetT) (x) >= -(offsetT) 0x80000000 && \
151 (offsetT) (x) <= (offsetT) 0x7FFFFFFF)
154 /* Macros for sign extending from 16- and 32-bits. */
155 /* XXX: The cast macros will work on all the systems that I care about,
156 but really a predicate should be found to use the non-cast forms. */
159 #define sign_extend_16(x) ((short) (x))
160 #define sign_extend_32(x) ((int) (x))
162 #define sign_extend_16(x) ((offsetT) (((x) & 0xFFFF) ^ 0x8000) - 0x8000)
163 #define sign_extend_32(x) ((offsetT) (((x) & 0xFFFFFFFF) \
164 ^ 0x80000000) - 0x80000000)
167 /* Macros to build tokens */
169 #define set_tok_reg(t, r) (memset (&(t), 0, sizeof (t)), \
170 (t).X_op = O_register, \
171 (t).X_add_number = (r))
172 #define set_tok_preg(t, r) (memset (&(t), 0, sizeof (t)), \
173 (t).X_op = O_pregister, \
174 (t).X_add_number = (r))
175 #define set_tok_cpreg(t, r) (memset (&(t), 0, sizeof (t)), \
176 (t).X_op = O_cpregister, \
177 (t).X_add_number = (r))
178 #define set_tok_freg(t, r) (memset (&(t), 0, sizeof (t)), \
179 (t).X_op = O_register, \
180 (t).X_add_number = (r) + 32)
181 #define set_tok_sym(t, s, a) (memset (&(t), 0, sizeof (t)), \
182 (t).X_op = O_symbol, \
183 (t).X_add_symbol = (s), \
184 (t).X_add_number = (a))
185 #define set_tok_const(t, n) (memset (&(t), 0, sizeof (t)), \
186 (t).X_op = O_constant, \
187 (t).X_add_number = (n))
189 /* Prototypes for all local functions */
191 static int tokenize_arguments PARAMS ((char *, expressionS *, int));
192 static const struct alpha_opcode *find_opcode_match
193 PARAMS ((const struct alpha_opcode *, const expressionS *, int *, int *));
194 static const struct alpha_macro *find_macro_match
195 PARAMS ((const struct alpha_macro *, const expressionS *, int *));
196 static unsigned insert_operand
197 PARAMS ((unsigned, const struct alpha_operand *, offsetT, char *, unsigned));
198 static void assemble_insn
199 PARAMS ((const struct alpha_opcode *, const expressionS *, int,
200 struct alpha_insn *));
201 static void emit_insn PARAMS ((struct alpha_insn *));
202 static void assemble_tokens_to_insn
203 PARAMS ((const char *, const expressionS *, int, struct alpha_insn *));
204 static void assemble_tokens
205 PARAMS ((const char *, const expressionS *, int, int));
207 static int load_expression
208 PARAMS ((int, const expressionS *, int *, expressionS *,
209 const expressionS *));
211 static void emit_ldgp PARAMS ((const expressionS *, int, const PTR));
212 static void emit_division PARAMS ((const expressionS *, int, const PTR));
213 static void emit_lda PARAMS ((const expressionS *, int, const PTR));
214 static void emit_ldah PARAMS ((const expressionS *, int, const PTR));
215 static void emit_ir_load PARAMS ((const expressionS *, int, const PTR));
216 static void emit_loadstore PARAMS ((const expressionS *, int, const PTR));
217 static void emit_jsrjmp PARAMS ((const expressionS *, int, const PTR));
218 static void emit_ldX PARAMS ((const expressionS *, int, const PTR));
219 static void emit_ldXu PARAMS ((const expressionS *, int, const PTR));
220 static void emit_uldX PARAMS ((const expressionS *, int, const PTR));
221 static void emit_uldXu PARAMS ((const expressionS *, int, const PTR));
222 static void emit_ldil PARAMS ((const expressionS *, int, const PTR));
223 static void emit_stX PARAMS ((const expressionS *, int, const PTR));
224 static void emit_ustX PARAMS ((const expressionS *, int, const PTR));
225 static void emit_sextX PARAMS ((const expressionS *, int, const PTR));
226 static void emit_retjcr PARAMS ((const expressionS *, int, const PTR));
228 static void s_alpha_text PARAMS ((int));
229 static void s_alpha_data PARAMS ((int));
231 static void s_alpha_comm PARAMS ((int));
232 static void s_alpha_rdata PARAMS ((int));
235 static void s_alpha_sdata PARAMS ((int));
238 static void s_alpha_section PARAMS ((int));
239 static void s_alpha_ent PARAMS ((int));
240 static void s_alpha_end PARAMS ((int));
241 static void s_alpha_mask PARAMS ((int));
242 static void s_alpha_frame PARAMS ((int));
243 static void s_alpha_prologue PARAMS ((int));
244 static void s_alpha_file PARAMS ((int));
245 static void s_alpha_loc PARAMS ((int));
246 static void s_alpha_stab PARAMS ((int));
247 static void s_alpha_coff_wrapper PARAMS ((int));
250 static void s_alpha_section PARAMS ((int));
252 static void s_alpha_gprel32 PARAMS ((int));
253 static void s_alpha_float_cons PARAMS ((int));
254 static void s_alpha_proc PARAMS ((int));
255 static void s_alpha_set PARAMS ((int));
256 static void s_alpha_base PARAMS ((int));
257 static void s_alpha_align PARAMS ((int));
258 static void s_alpha_stringer PARAMS ((int));
259 static void s_alpha_space PARAMS ((int));
261 static void create_literal_section PARAMS ((const char *, segT *, symbolS **));
263 static void select_gp_value PARAMS ((void));
265 static void alpha_align PARAMS ((int, char *, symbolS *, int));
268 static void alpha_adjust_symtab_relocs PARAMS ((bfd *, asection *, PTR));
271 /* Generic assembler global variables which must be defined by all
274 /* Characters which always start a comment. */
275 const char comment_chars[] = "#";
277 /* Characters which start a comment at the beginning of a line. */
278 const char line_comment_chars[] = "#";
280 /* Characters which may be used to separate multiple commands on a
282 const char line_separator_chars[] = ";";
284 /* Characters which are used to indicate an exponent in a floating
286 const char EXP_CHARS[] = "eE";
288 /* Characters which mean that a number is a floating point constant,
291 const char FLT_CHARS[] = "dD";
293 /* XXX: Do all of these really get used on the alpha?? */
294 char FLT_CHARS[] = "rRsSfFdDxXpP";
298 const char *md_shortopts = "Fm:g+1h:HG:";
300 const char *md_shortopts = "Fm:gG:";
303 struct option md_longopts[] = {
304 #define OPTION_32ADDR (OPTION_MD_BASE)
305 { "32addr", no_argument, NULL, OPTION_32ADDR },
306 #define OPTION_RELAX (OPTION_32ADDR + 1)
307 { "relax", no_argument, NULL, OPTION_RELAX },
309 #define OPTION_MDEBUG (OPTION_RELAX + 1)
310 #define OPTION_NO_MDEBUG (OPTION_MDEBUG + 1)
311 { "mdebug", no_argument, NULL, OPTION_MDEBUG },
312 { "no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG },
314 { NULL, no_argument, NULL, 0 }
317 size_t md_longopts_size = sizeof (md_longopts);
321 #define AXP_REG_R16 16
322 #define AXP_REG_R17 17
324 #define AXP_REG_T9 22
326 #define AXP_REG_T10 23
328 #define AXP_REG_T11 24
330 #define AXP_REG_T12 25
331 #define AXP_REG_AI 25
333 #define AXP_REG_FP 29
336 #define AXP_REG_GP AXP_REG_PV
337 #endif /* OBJ_EVAX */
339 /* The cpu for which we are generating code */
340 static unsigned alpha_target = AXP_OPCODE_BASE;
341 static const char *alpha_target_name = "<all>";
343 /* The hash table of instruction opcodes */
344 static struct hash_control *alpha_opcode_hash;
346 /* The hash table of macro opcodes */
347 static struct hash_control *alpha_macro_hash;
350 /* The $gp relocation symbol */
351 static symbolS *alpha_gp_symbol;
353 /* XXX: what is this, and why is it exported? */
354 valueT alpha_gp_value;
357 /* The current $gp register */
358 static int alpha_gp_register = AXP_REG_GP;
360 /* A table of the register symbols */
361 static symbolS *alpha_register_table[64];
363 /* Constant sections, or sections of constants */
365 static segT alpha_lita_section;
366 static segT alpha_lit4_section;
369 static segT alpha_link_section;
370 static segT alpha_ctors_section;
371 static segT alpha_dtors_section;
373 static segT alpha_lit8_section;
375 /* Symbols referring to said sections. */
377 static symbolS *alpha_lita_symbol;
378 static symbolS *alpha_lit4_symbol;
381 static symbolS *alpha_link_symbol;
382 static symbolS *alpha_ctors_symbol;
383 static symbolS *alpha_dtors_symbol;
385 static symbolS *alpha_lit8_symbol;
387 /* Literal for .litX+0x8000 within .lita */
389 static offsetT alpha_lit4_literal;
390 static offsetT alpha_lit8_literal;
394 /* The active .ent symbol. */
395 static symbolS *alpha_cur_ent_sym;
398 /* Is the assembler not allowed to use $at? */
399 static int alpha_noat_on = 0;
401 /* Are macros enabled? */
402 static int alpha_macros_on = 1;
404 /* Are floats disabled? */
405 static int alpha_nofloats_on = 0;
407 /* Are addresses 32 bit? */
408 static int alpha_addr32_on = 0;
410 /* Symbol labelling the current insn. When the Alpha gas sees
413 and the section happens to not be on an eight byte boundary, it
414 will align both the symbol and the .quad to an eight byte boundary. */
415 static symbolS *alpha_insn_label;
417 /* Whether we should automatically align data generation pseudo-ops.
418 .align 0 will turn this off. */
419 static int alpha_auto_align_on = 1;
421 /* The known current alignment of the current section. */
422 static int alpha_current_align;
424 /* These are exported to ECOFF code. */
425 unsigned long alpha_gprmask, alpha_fprmask;
427 /* Whether the debugging option was seen. */
428 static int alpha_debug;
431 /* Whether we are emitting an mdebug section. */
432 int alpha_flag_mdebug = -1;
435 /* Don't fully resolve relocations, allowing code movement in the linker. */
436 static int alpha_flag_relax;
438 /* What value to give to bfd_set_gp_size. */
439 static int g_switch_value = 8;
442 /* Collect information about current procedure here. */
444 symbolS *symbol; /* proc pdesc symbol */
446 int framereg; /* register for frame pointer */
447 int framesize; /* size of frame */
457 static int alpha_flag_hash_long_names = 0; /* -+ */
458 static int alpha_flag_show_after_trunc = 0; /* -H */
460 /* If the -+ switch is given, then a hash is appended to any name that is
461 * longer than 64 characters, else longer symbol names are truncated.
467 /* A table to map the spelling of a relocation operand into an appropriate
468 bfd_reloc_code_real_type type. The table is assumed to be ordered such
469 that op-O_literal indexes into it. */
471 #define ALPHA_RELOC_TABLE(op) \
472 &alpha_reloc_op[ ((!USER_RELOC_P (op)) \
474 : (int) (op) - (int) O_literal) ]
476 #define LITUSE_BASE 1
477 #define LITUSE_BYTOFF 2
480 static const struct alpha_reloc_op_tag {
481 const char *name; /* string to lookup */
482 size_t length; /* size of the string */
483 bfd_reloc_code_real_type reloc; /* relocation before frob */
484 operatorT op; /* which operator to use */
485 int lituse; /* addened to specify lituse */
486 } alpha_reloc_op[] = {
489 "literal", /* name */
490 sizeof ("literal")-1, /* length */
491 BFD_RELOC_ALPHA_USER_LITERAL, /* reloc */
497 "lituse_base", /* name */
498 sizeof ("lituse_base")-1, /* length */
499 BFD_RELOC_ALPHA_USER_LITUSE_BASE, /* reloc */
500 O_lituse_base, /* op */
501 LITUSE_BASE, /* lituse */
505 "lituse_bytoff", /* name */
506 sizeof ("lituse_bytoff")-1, /* length */
507 BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF, /* reloc */
508 O_lituse_bytoff, /* op */
509 LITUSE_BYTOFF, /* lituse */
513 "lituse_jsr", /* name */
514 sizeof ("lituse_jsr")-1, /* length */
515 BFD_RELOC_ALPHA_USER_LITUSE_JSR, /* reloc */
516 O_lituse_jsr, /* op */
517 LITUSE_JSR, /* lituse */
522 sizeof ("gpdisp")-1, /* length */
523 BFD_RELOC_ALPHA_USER_GPDISP, /* reloc */
529 "gprelhigh", /* name */
530 sizeof ("gprelhigh")-1, /* length */
531 BFD_RELOC_ALPHA_USER_GPRELHIGH, /* reloc */
532 O_gprelhigh, /* op */
537 "gprellow", /* name */
538 sizeof ("gprellow")-1, /* length */
539 BFD_RELOC_ALPHA_USER_GPRELLOW, /* reloc */
545 static const int alpha_num_reloc_op
546 = sizeof (alpha_reloc_op) / sizeof (*alpha_reloc_op);
548 /* Maximum # digits needed to hold the largest sequence # */
549 #define ALPHA_RELOC_DIGITS 25
551 /* Whether a sequence number is valid. */
552 #define ALPHA_RELOC_SEQUENCE_OK(X) ((X) > 0 && ((unsigned) (X)) == (X))
554 /* Structure to hold explict sequence information. */
555 struct alpha_literal_tag
557 fixS *lituse; /* head of linked list of !literals */
558 segT segment; /* segment relocs are in or undefined_section*/
559 int multi_section_p; /* True if more than one section was used */
560 unsigned sequence; /* sequence # */
561 unsigned n_literals; /* # of literals */
562 unsigned n_lituses; /* # of lituses */
563 char string[1]; /* printable form of sequence to hash with */
566 /* Hash table to link up literals with the appropriate lituse */
567 static struct hash_control *alpha_literal_hash;
570 /* A table of CPU names and opcode sets. */
572 static const struct cpu_type {
576 /* Ad hoc convention: cpu number gets palcode, process code doesn't.
577 This supports usage under DU 4.0b that does ".arch ev4", and
578 usage in MILO that does -m21064. Probably something more
579 specific like -m21064-pal should be used, but oh well. */
581 { "21064", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
582 { "21064a", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
583 { "21066", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
584 { "21068", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
585 { "21164", AXP_OPCODE_BASE|AXP_OPCODE_EV5 },
586 { "21164a", AXP_OPCODE_BASE|AXP_OPCODE_EV5|AXP_OPCODE_BWX },
587 { "21164pc", (AXP_OPCODE_BASE|AXP_OPCODE_EV5|AXP_OPCODE_BWX
589 { "21264", (AXP_OPCODE_BASE|AXP_OPCODE_EV6|AXP_OPCODE_BWX
590 |AXP_OPCODE_MAX|AXP_OPCODE_CIX) },
592 { "ev4", AXP_OPCODE_BASE },
593 { "ev45", AXP_OPCODE_BASE },
594 { "lca45", AXP_OPCODE_BASE },
595 { "ev5", AXP_OPCODE_BASE },
596 { "ev56", AXP_OPCODE_BASE|AXP_OPCODE_BWX },
597 { "pca56", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX },
598 { "ev6", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX|AXP_OPCODE_CIX },
600 { "all", AXP_OPCODE_BASE },
604 /* The macro table */
606 static const struct alpha_macro alpha_macros[] = {
607 /* Load/Store macros */
608 { "lda", emit_lda, NULL,
609 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_LITERAL, MACRO_BASE, MACRO_EOA } },
610 { "ldah", emit_ldah, NULL,
611 { MACRO_IR, MACRO_EXP, MACRO_EOA } },
613 { "ldl", emit_ir_load, "ldl",
614 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
615 { "ldl_l", emit_ir_load, "ldl_l",
616 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
617 { "ldq", emit_ir_load, "ldq",
618 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_LITERAL, MACRO_EOA } },
619 { "ldq_l", emit_ir_load, "ldq_l",
620 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
621 { "ldq_u", emit_ir_load, "ldq_u",
622 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
623 { "ldf", emit_loadstore, "ldf",
624 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
625 { "ldg", emit_loadstore, "ldg",
626 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
627 { "lds", emit_loadstore, "lds",
628 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
629 { "ldt", emit_loadstore, "ldt",
630 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
632 { "ldb", emit_ldX, (PTR) 0,
633 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
634 { "ldbu", emit_ldXu, (PTR) 0,
635 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
636 { "ldw", emit_ldX, (PTR) 1,
637 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
638 { "ldwu", emit_ldXu, (PTR) 1,
639 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
641 { "uldw", emit_uldX, (PTR) 1,
642 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
643 { "uldwu", emit_uldXu, (PTR) 1,
644 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
645 { "uldl", emit_uldX, (PTR) 2,
646 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
647 { "uldlu", emit_uldXu, (PTR) 2,
648 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
649 { "uldq", emit_uldXu, (PTR) 3,
650 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
652 { "ldgp", emit_ldgp, NULL,
653 { MACRO_IR, MACRO_EXP, MACRO_PIR, MACRO_EOA } },
655 { "ldi", emit_lda, NULL,
656 { MACRO_IR, MACRO_EXP, MACRO_EOA } },
657 { "ldil", emit_ldil, NULL,
658 { MACRO_IR, MACRO_EXP, MACRO_EOA } },
659 { "ldiq", emit_lda, NULL,
660 { MACRO_IR, MACRO_EXP, MACRO_EOA } },
662 { "ldif" emit_ldiq, NULL,
663 { MACRO_FPR, MACRO_EXP, MACRO_EOA } },
664 { "ldid" emit_ldiq, NULL,
665 { MACRO_FPR, MACRO_EXP, MACRO_EOA } },
666 { "ldig" emit_ldiq, NULL,
667 { MACRO_FPR, MACRO_EXP, MACRO_EOA } },
668 { "ldis" emit_ldiq, NULL,
669 { MACRO_FPR, MACRO_EXP, MACRO_EOA } },
670 { "ldit" emit_ldiq, NULL,
671 { MACRO_FPR, MACRO_EXP, MACRO_EOA } },
674 { "stl", emit_loadstore, "stl",
675 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
676 { "stl_c", emit_loadstore, "stl_c",
677 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
678 { "stq", emit_loadstore, "stq",
679 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
680 { "stq_c", emit_loadstore, "stq_c",
681 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
682 { "stq_u", emit_loadstore, "stq_u",
683 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
684 { "stf", emit_loadstore, "stf",
685 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
686 { "stg", emit_loadstore, "stg",
687 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
688 { "sts", emit_loadstore, "sts",
689 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
690 { "stt", emit_loadstore, "stt",
691 { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
693 { "stb", emit_stX, (PTR) 0,
694 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
695 { "stw", emit_stX, (PTR) 1,
696 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
697 { "ustw", emit_ustX, (PTR) 1,
698 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
699 { "ustl", emit_ustX, (PTR) 2,
700 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
701 { "ustq", emit_ustX, (PTR) 3,
702 { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } },
704 /* Arithmetic macros */
706 { "absl" emit_absl, 1, { IR } },
707 { "absl" emit_absl, 2, { IR, IR } },
708 { "absl" emit_absl, 2, { EXP, IR } },
709 { "absq" emit_absq, 1, { IR } },
710 { "absq" emit_absq, 2, { IR, IR } },
711 { "absq" emit_absq, 2, { EXP, IR } },
714 { "sextb", emit_sextX, (PTR) 0,
715 { MACRO_IR, MACRO_IR, MACRO_EOA,
717 /* MACRO_EXP, MACRO_IR, MACRO_EOA */ } },
718 { "sextw", emit_sextX, (PTR) 1,
719 { MACRO_IR, MACRO_IR, MACRO_EOA,
721 /* MACRO_EXP, MACRO_IR, MACRO_EOA */ } },
723 { "divl", emit_division, "__divl",
724 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
725 MACRO_IR, MACRO_IR, MACRO_EOA,
726 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
727 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
728 { "divlu", emit_division, "__divlu",
729 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
730 MACRO_IR, MACRO_IR, MACRO_EOA,
731 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
732 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
733 { "divq", emit_division, "__divq",
734 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
735 MACRO_IR, MACRO_IR, MACRO_EOA,
736 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
737 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
738 { "divqu", emit_division, "__divqu",
739 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
740 MACRO_IR, MACRO_IR, MACRO_EOA,
741 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
742 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
743 { "reml", emit_division, "__reml",
744 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
745 MACRO_IR, MACRO_IR, MACRO_EOA,
746 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
747 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
748 { "remlu", emit_division, "__remlu",
749 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
750 MACRO_IR, MACRO_IR, MACRO_EOA,
751 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
752 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
753 { "remq", emit_division, "__remq",
754 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
755 MACRO_IR, MACRO_IR, MACRO_EOA,
756 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
757 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
758 { "remqu", emit_division, "__remqu",
759 { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
760 MACRO_IR, MACRO_IR, MACRO_EOA,
761 /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
762 MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
764 { "jsr", emit_jsrjmp, "jsr",
765 { MACRO_PIR, MACRO_EXP, MACRO_JSR, MACRO_EOA,
766 MACRO_PIR, MACRO_JSR, MACRO_EOA,
767 MACRO_IR, MACRO_EXP, MACRO_JSR, MACRO_EOA,
768 MACRO_EXP, MACRO_JSR, MACRO_EOA } },
769 { "jmp", emit_jsrjmp, "jmp",
770 { MACRO_PIR, MACRO_EXP, MACRO_JSR, MACRO_EOA,
771 MACRO_PIR, MACRO_JSR, MACRO_EOA,
772 MACRO_IR, MACRO_EXP, MACRO_JSR, MACRO_EOA,
773 MACRO_EXP, MACRO_JSR, MACRO_EOA } },
774 { "ret", emit_retjcr, "ret",
775 { MACRO_IR, MACRO_EXP, MACRO_EOA,
777 MACRO_PIR, MACRO_EXP, MACRO_EOA,
778 MACRO_PIR, MACRO_EOA,
779 MACRO_EXP, MACRO_EOA,
781 { "jcr", emit_retjcr, "jcr",
782 { MACRO_IR, MACRO_EXP, MACRO_EOA,
784 MACRO_PIR, MACRO_EXP, MACRO_EOA,
785 MACRO_PIR, MACRO_EOA,
786 MACRO_EXP, MACRO_EOA,
788 { "jsr_coroutine", emit_retjcr, "jcr",
789 { MACRO_IR, MACRO_EXP, MACRO_EOA,
791 MACRO_PIR, MACRO_EXP, MACRO_EOA,
792 MACRO_PIR, MACRO_EOA,
793 MACRO_EXP, MACRO_EOA,
797 static const unsigned int alpha_num_macros
798 = sizeof (alpha_macros) / sizeof (*alpha_macros);
800 /* Public interface functions */
802 /* This function is called once, at assembler startup time. It sets
803 up all the tables, etc. that the MD part of the assembler will
804 need, that can be determined before arguments are parsed. */
811 /* Verify that X_op field is wide enough. */
815 assert (e.X_op == O_max);
818 /* Create the opcode hash table */
820 alpha_opcode_hash = hash_new ();
821 for (i = 0; i < alpha_num_opcodes;)
823 const char *name, *retval, *slash;
825 name = alpha_opcodes[i].name;
826 retval = hash_insert (alpha_opcode_hash, name, (PTR) &alpha_opcodes[i]);
828 as_fatal (_("internal error: can't hash opcode `%s': %s"), name, retval);
830 /* Some opcodes include modifiers of various sorts with a "/mod"
831 syntax, like the architecture manual suggests. However, for
832 use with gcc at least, we also need access to those same opcodes
835 if ((slash = strchr (name, '/')) != NULL)
837 char *p = xmalloc (strlen (name));
838 memcpy (p, name, slash - name);
839 strcpy (p + (slash - name), slash + 1);
841 (void) hash_insert (alpha_opcode_hash, p, (PTR) &alpha_opcodes[i]);
842 /* Ignore failures -- the opcode table does duplicate some
843 variants in different forms, like "hw_stq" and "hw_st/q". */
846 while (++i < alpha_num_opcodes
847 && (alpha_opcodes[i].name == name
848 || !strcmp (alpha_opcodes[i].name, name)))
852 /* Create the macro hash table */
854 alpha_macro_hash = hash_new ();
855 for (i = 0; i < alpha_num_macros;)
857 const char *name, *retval;
859 name = alpha_macros[i].name;
860 retval = hash_insert (alpha_macro_hash, name, (PTR) &alpha_macros[i]);
862 as_fatal (_("internal error: can't hash macro `%s': %s"),
865 while (++i < alpha_num_macros
866 && (alpha_macros[i].name == name
867 || !strcmp (alpha_macros[i].name, name)))
871 /* Construct symbols for each of the registers */
873 for (i = 0; i < 32; ++i)
876 sprintf (name, "$%d", i);
877 alpha_register_table[i] = symbol_create (name, reg_section, i,
883 sprintf (name, "$f%d", i - 32);
884 alpha_register_table[i] = symbol_create (name, reg_section, i,
888 /* Create the special symbols and sections we'll be using */
890 /* So .sbss will get used for tiny objects. */
891 bfd_set_gp_size (stdoutput, g_switch_value);
894 create_literal_section (".lita", &alpha_lita_section, &alpha_lita_symbol);
896 /* For handling the GP, create a symbol that won't be output in the
897 symbol table. We'll edit it out of relocs later. */
898 alpha_gp_symbol = symbol_create ("<GP value>", alpha_lita_section, 0x8000,
903 create_literal_section (".link", &alpha_link_section, &alpha_link_symbol);
909 segT sec = subseg_new (".mdebug", (subsegT) 0);
910 bfd_set_section_flags (stdoutput, sec, SEC_HAS_CONTENTS | SEC_READONLY);
911 bfd_set_section_alignment (stdoutput, sec, 3);
915 subseg_set (text_section, 0);
918 /* Create literal lookup hash table. */
919 alpha_literal_hash = hash_new ();
923 /* The public interface to the instruction assembler. */
929 char opname[32]; /* current maximum is 13 */
930 expressionS tok[MAX_INSN_ARGS];
934 /* split off the opcode */
935 opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/46819");
936 trunclen = (opnamelen < sizeof (opname) - 1
938 : sizeof (opname) - 1);
939 memcpy (opname, str, trunclen);
940 opname[trunclen] = '\0';
942 /* tokenize the rest of the line */
943 if ((ntok = tokenize_arguments (str + opnamelen, tok, MAX_INSN_ARGS)) < 0)
945 if (ntok != TOKENIZE_ERROR_REPORT)
946 as_bad (_("syntax error"));
952 assemble_tokens (opname, tok, ntok, alpha_macros_on);
955 /* Round up a section's size to the appropriate boundary. */
958 md_section_align (seg, size)
962 int align = bfd_get_section_alignment (stdoutput, seg);
963 valueT mask = ((valueT) 1 << align) - 1;
965 return (size + mask) & ~mask;
968 /* Turn a string in input_line_pointer into a floating point constant
969 of type TYPE, and store the appropriate bytes in *LITP. The number
970 of LITTLENUMS emitted is stored in *SIZEP. An error message is
971 returned, or NULL on OK. */
973 /* Equal to MAX_PRECISION in atof-ieee.c */
974 #define MAX_LITTLENUMS 6
976 extern char *vax_md_atof PARAMS ((int, char *, int *));
979 md_atof (type, litP, sizeP)
985 LITTLENUM_TYPE words[MAX_LITTLENUMS];
986 LITTLENUM_TYPE *wordP;
993 /* VAX md_atof doesn't like "G" for some reason. */
997 return vax_md_atof (type, litP, sizeP);
1020 return _("Bad call to MD_ATOF()");
1022 t = atof_ieee (input_line_pointer, type, words);
1024 input_line_pointer = t;
1025 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1027 for (wordP = words + prec - 1; prec--;)
1029 md_number_to_chars (litP, (long) (*wordP--), sizeof (LITTLENUM_TYPE));
1030 litP += sizeof (LITTLENUM_TYPE);
1036 /* Take care of the target-specific command-line options. */
1039 md_parse_option (c, arg)
1046 alpha_nofloats_on = 1;
1050 alpha_addr32_on = 1;
1058 g_switch_value = atoi (arg);
1063 const struct cpu_type *p;
1064 for (p = cpu_types; p->name; ++p)
1065 if (strcmp (arg, p->name) == 0)
1067 alpha_target_name = p->name, alpha_target = p->flags;
1070 as_warn (_("Unknown CPU identifier `%s'"), arg);
1076 case '+': /* For g++. Hash any name > 63 chars long. */
1077 alpha_flag_hash_long_names = 1;
1080 case 'H': /* Show new symbol after hash truncation */
1081 alpha_flag_show_after_trunc = 1;
1084 case 'h': /* for gnu-c/vax compatibility. */
1089 alpha_flag_relax = 1;
1094 alpha_flag_mdebug = 1;
1096 case OPTION_NO_MDEBUG:
1097 alpha_flag_mdebug = 0;
1108 /* Print a description of the command-line options that we accept. */
1111 md_show_usage (stream)
1116 -32addr treat addresses as 32-bit values\n\
1117 -F lack floating point instructions support\n\
1118 -mev4 | -mev45 | -mev5 | -mev56 | -mpca56 | -mev6 | -mall\n\
1119 specify variant of Alpha architecture\n\
1120 -m21064 | -m21066 | -m21164 | -m21164a | -m21164pc | -m21264\n\
1121 these variants include PALcode opcodes\n"),
1126 -+ hash encode (don't truncate) names longer than 64 characters\n\
1127 -H show new symbol after hash truncation\n"),
1132 /* Decide from what point a pc-relative relocation is relative to,
1133 relative to the pc-relative fixup. Er, relatively speaking. */
1136 md_pcrel_from (fixP)
1139 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
1140 switch (fixP->fx_r_type)
1142 case BFD_RELOC_ALPHA_GPDISP:
1143 case BFD_RELOC_ALPHA_GPDISP_HI16:
1144 case BFD_RELOC_ALPHA_GPDISP_LO16:
1147 return fixP->fx_size + addr;
1151 /* Attempt to simplify or even eliminate a fixup. The return value is
1152 ignored; perhaps it was once meaningful, but now it is historical.
1153 To indicate that a fixup has been eliminated, set fixP->fx_done.
1155 For ELF, here it is that we transform the GPDISP_HI16 reloc we used
1156 internally into the GPDISP reloc used externally. We had to do
1157 this so that we'd have the GPDISP_LO16 reloc as a tag to compute
1158 the distance to the "lda" instruction for setting the addend to
1162 md_apply_fix3 (fixP, valueP, seg)
1167 char * const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
1168 valueT value = *valueP;
1169 unsigned image, size;
1171 switch (fixP->fx_r_type)
1173 /* The GPDISP relocations are processed internally with a symbol
1174 referring to the current function; we need to drop in a value
1175 which, when added to the address of the start of the function,
1176 gives the desired GP. */
1177 case BFD_RELOC_ALPHA_GPDISP_HI16:
1179 fixS *next = fixP->fx_next;
1180 assert (next->fx_r_type == BFD_RELOC_ALPHA_GPDISP_LO16);
1182 fixP->fx_offset = (next->fx_frag->fr_address + next->fx_where
1183 - fixP->fx_frag->fr_address - fixP->fx_where);
1185 value = (value - sign_extend_16 (value)) >> 16;
1188 fixP->fx_r_type = BFD_RELOC_ALPHA_GPDISP;
1192 case BFD_RELOC_ALPHA_GPDISP_LO16:
1193 value = sign_extend_16 (value);
1194 fixP->fx_offset = 0;
1200 fixP->fx_addsy = section_symbol (seg);
1201 md_number_to_chars (fixpos, value, 2);
1206 fixP->fx_r_type = BFD_RELOC_16_PCREL;
1211 fixP->fx_r_type = BFD_RELOC_32_PCREL;
1216 fixP->fx_r_type = BFD_RELOC_64_PCREL;
1219 if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0)
1221 md_number_to_chars (fixpos, value, size);
1227 case BFD_RELOC_GPREL32:
1228 assert (fixP->fx_subsy == alpha_gp_symbol);
1230 /* FIXME: inherited this obliviousness of `value' -- why? */
1231 md_number_to_chars (fixpos, -alpha_gp_value, 4);
1235 case BFD_RELOC_GPREL32:
1239 case BFD_RELOC_23_PCREL_S2:
1240 if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0)
1242 image = bfd_getl32 (fixpos);
1243 image = (image & ~0x1FFFFF) | ((value >> 2) & 0x1FFFFF);
1248 case BFD_RELOC_ALPHA_HINT:
1249 if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0)
1251 image = bfd_getl32 (fixpos);
1252 image = (image & ~0x3FFF) | ((value >> 2) & 0x3FFF);
1258 case BFD_RELOC_ALPHA_LITERAL:
1259 md_number_to_chars (fixpos, value, 2);
1262 case BFD_RELOC_ALPHA_LITUSE:
1266 case BFD_RELOC_ALPHA_ELF_LITERAL:
1267 case BFD_RELOC_ALPHA_LITUSE:
1271 case BFD_RELOC_ALPHA_LINKAGE:
1272 case BFD_RELOC_ALPHA_CODEADDR:
1277 case BFD_RELOC_ALPHA_USER_LITERAL:
1278 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
1279 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
1280 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
1283 case BFD_RELOC_ALPHA_USER_GPDISP:
1284 case BFD_RELOC_ALPHA_USER_GPRELHIGH:
1285 case BFD_RELOC_ALPHA_USER_GPRELLOW:
1289 case BFD_RELOC_VTABLE_INHERIT:
1290 case BFD_RELOC_VTABLE_ENTRY:
1295 const struct alpha_operand *operand;
1297 if ((int) fixP->fx_r_type >= 0)
1298 as_fatal (_("unhandled relocation type %s"),
1299 bfd_get_reloc_code_name (fixP->fx_r_type));
1301 assert (-(int) fixP->fx_r_type < (int) alpha_num_operands);
1302 operand = &alpha_operands[-(int) fixP->fx_r_type];
1304 /* The rest of these fixups only exist internally during symbol
1305 resolution and have no representation in the object file.
1306 Therefore they must be completely resolved as constants. */
1308 if (fixP->fx_addsy != 0
1309 && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section)
1310 as_bad_where (fixP->fx_file, fixP->fx_line,
1311 _("non-absolute expression in constant field"));
1313 image = bfd_getl32 (fixpos);
1314 image = insert_operand (image, operand, (offsetT) value,
1315 fixP->fx_file, fixP->fx_line);
1320 if (fixP->fx_addsy != 0 || fixP->fx_pcrel != 0)
1324 as_warn_where (fixP->fx_file, fixP->fx_line,
1325 _("type %d reloc done?\n"), (int) fixP->fx_r_type);
1330 md_number_to_chars (fixpos, image, 4);
1338 * Look for a register name in the given symbol.
1342 md_undefined_symbol (name)
1347 int is_float = 0, num;
1352 if (name[1] == 'p' && name[2] == '\0')
1353 return alpha_register_table[AXP_REG_FP];
1358 if (!isdigit (*++name))
1362 case '0': case '1': case '2': case '3': case '4':
1363 case '5': case '6': case '7': case '8': case '9':
1364 if (name[1] == '\0')
1365 num = name[0] - '0';
1366 else if (name[0] != '0' && isdigit (name[1]) && name[2] == '\0')
1368 num = (name[0] - '0') * 10 + name[1] - '0';
1375 if (!alpha_noat_on && (num + is_float) == AXP_REG_AT)
1376 as_warn (_("Used $at without \".set noat\""));
1377 return alpha_register_table[num + is_float];
1380 if (name[1] == 't' && name[2] == '\0')
1383 as_warn (_("Used $at without \".set noat\""));
1384 return alpha_register_table[AXP_REG_AT];
1389 if (name[1] == 'p' && name[2] == '\0')
1390 return alpha_register_table[alpha_gp_register];
1394 if (name[1] == 'p' && name[2] == '\0')
1395 return alpha_register_table[AXP_REG_SP];
1403 /* @@@ Magic ECOFF bits. */
1406 alpha_frob_ecoff_data ()
1409 /* $zero and $f31 are read-only */
1410 alpha_gprmask &= ~1;
1411 alpha_fprmask &= ~1;
1415 /* Hook to remember a recently defined label so that the auto-align
1416 code can adjust the symbol after we know what alignment will be
1420 alpha_define_label (sym)
1423 alpha_insn_label = sym;
1426 /* Return true if we must always emit a reloc for a type and false if
1427 there is some hope of resolving it a assembly time. */
1430 alpha_force_relocation (f)
1433 if (alpha_flag_relax)
1436 switch (f->fx_r_type)
1438 case BFD_RELOC_ALPHA_GPDISP_HI16:
1439 case BFD_RELOC_ALPHA_GPDISP_LO16:
1440 case BFD_RELOC_ALPHA_GPDISP:
1442 case BFD_RELOC_ALPHA_LITERAL:
1445 case BFD_RELOC_ALPHA_ELF_LITERAL:
1447 case BFD_RELOC_ALPHA_LITUSE:
1448 case BFD_RELOC_GPREL32:
1450 case BFD_RELOC_ALPHA_LINKAGE:
1451 case BFD_RELOC_ALPHA_CODEADDR:
1454 case BFD_RELOC_ALPHA_USER_LITERAL:
1455 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
1456 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
1457 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
1458 case BFD_RELOC_ALPHA_USER_GPDISP:
1459 case BFD_RELOC_ALPHA_USER_GPRELHIGH:
1460 case BFD_RELOC_ALPHA_USER_GPRELLOW:
1462 case BFD_RELOC_VTABLE_INHERIT:
1463 case BFD_RELOC_VTABLE_ENTRY:
1466 case BFD_RELOC_23_PCREL_S2:
1469 case BFD_RELOC_ALPHA_HINT:
1473 assert ((int) f->fx_r_type < 0
1474 && -(int) f->fx_r_type < (int) alpha_num_operands);
1479 /* Return true if we can partially resolve a relocation now. */
1482 alpha_fix_adjustable (f)
1486 /* Prevent all adjustments to global symbols */
1487 if (S_IS_EXTERN (f->fx_addsy) || S_IS_WEAK (f->fx_addsy))
1491 /* Are there any relocation types for which we must generate a reloc
1492 but we can adjust the values contained within it? */
1493 switch (f->fx_r_type)
1495 case BFD_RELOC_ALPHA_GPDISP_HI16:
1496 case BFD_RELOC_ALPHA_GPDISP_LO16:
1497 case BFD_RELOC_ALPHA_GPDISP:
1501 case BFD_RELOC_ALPHA_LITERAL:
1504 case BFD_RELOC_ALPHA_ELF_LITERAL:
1507 case BFD_RELOC_ALPHA_USER_LITERAL:
1510 case BFD_RELOC_ALPHA_LINKAGE:
1511 case BFD_RELOC_ALPHA_CODEADDR:
1515 case BFD_RELOC_ALPHA_LITUSE:
1517 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
1518 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
1519 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
1520 case BFD_RELOC_ALPHA_USER_GPDISP:
1521 case BFD_RELOC_ALPHA_USER_GPRELHIGH:
1522 case BFD_RELOC_ALPHA_USER_GPRELLOW:
1524 case BFD_RELOC_VTABLE_ENTRY:
1525 case BFD_RELOC_VTABLE_INHERIT:
1528 case BFD_RELOC_GPREL32:
1529 case BFD_RELOC_23_PCREL_S2:
1532 case BFD_RELOC_ALPHA_HINT:
1536 assert ((int) f->fx_r_type < 0
1537 && - (int) f->fx_r_type < (int) alpha_num_operands);
1543 /* Generate the BFD reloc to be stuck in the object file from the
1544 fixup used internally in the assembler. */
1547 tc_gen_reloc (sec, fixp)
1548 asection *sec ATTRIBUTE_UNUSED;
1553 reloc = (arelent *) xmalloc (sizeof (arelent));
1554 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1555 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1556 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1558 /* Make sure none of our internal relocations make it this far.
1559 They'd better have been fully resolved by this point. */
1560 assert ((int) fixp->fx_r_type > 0);
1562 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1563 if (reloc->howto == NULL)
1565 as_bad_where (fixp->fx_file, fixp->fx_line,
1566 _("cannot represent `%s' relocation in object file"),
1567 bfd_get_reloc_code_name (fixp->fx_r_type));
1571 if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
1573 as_fatal (_("internal error? cannot generate `%s' relocation"),
1574 bfd_get_reloc_code_name (fixp->fx_r_type));
1576 assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
1579 if (fixp->fx_r_type == BFD_RELOC_ALPHA_LITERAL)
1581 /* fake out bfd_perform_relocation. sigh */
1582 reloc->addend = -alpha_gp_value;
1587 reloc->addend = fixp->fx_offset;
1590 * Ohhh, this is ugly. The problem is that if this is a local global
1591 * symbol, the relocation will entirely be performed at link time, not
1592 * at assembly time. bfd_perform_reloc doesn't know about this sort
1593 * of thing, and as a result we need to fake it out here.
1595 if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)
1596 || (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE))
1597 && !S_IS_COMMON (fixp->fx_addsy))
1598 reloc->addend -= symbol_get_bfdsym (fixp->fx_addsy)->value;
1605 /* Parse a register name off of the input_line and return a register
1606 number. Gets md_undefined_symbol above to do the register name
1609 Only called as a part of processing the ECOFF .frame directive. */
1612 tc_get_register (frame)
1613 int frame ATTRIBUTE_UNUSED;
1615 int framereg = AXP_REG_SP;
1618 if (*input_line_pointer == '$')
1620 char *s = input_line_pointer;
1621 char c = get_symbol_end ();
1622 symbolS *sym = md_undefined_symbol (s);
1624 *strchr (s, '\0') = c;
1625 if (sym && (framereg = S_GET_VALUE (sym)) <= 31)
1628 as_warn (_("frame reg expected, using $%d."), framereg);
1631 note_gpreg (framereg);
1635 /* This is called before the symbol table is processed. In order to
1636 work with gcc when using mips-tfile, we must keep all local labels.
1637 However, in other cases, we want to discard them. If we were
1638 called with -g, but we didn't see any debugging information, it may
1639 mean that gcc is smuggling debugging information through to
1640 mips-tfile, in which case we must generate all local labels. */
1645 alpha_frob_file_before_adjust ()
1647 if (alpha_debug != 0
1648 && ! ecoff_debugging_seen)
1649 flag_keep_locals = 1;
1652 #endif /* OBJ_ECOFF */
1656 /* Before the relocations are written, reorder them, so that user
1657 supplied !lituse relocations follow the appropriate !literal
1658 relocations. Also convert the gas-internal relocations to the
1659 appropriate linker relocations. */
1662 alpha_adjust_symtab ()
1664 if (alpha_literal_hash)
1667 fprintf (stderr, "alpha_adjust_symtab called\n");
1670 /* Go over each section, reordering the relocations so that all
1671 of the explicit LITUSE's are adjacent to the explicit
1673 bfd_map_over_sections (stdoutput, alpha_adjust_symtab_relocs,
1678 /* Inner function to move LITUSE's next to the LITERAL. */
1681 alpha_adjust_symtab_relocs (abfd, sec, ptr)
1682 bfd *abfd ATTRIBUTE_UNUSED;
1684 PTR ptr ATTRIBUTE_UNUSED;
1686 segment_info_type *seginfo = seg_info (sec);
1696 int n_dup_literals = 0;
1699 /* If seginfo is NULL, we did not create this section; don't do
1700 anything with it. By using a pointer to a pointer, we can update
1701 the links in place. */
1702 if (seginfo == NULL)
1705 /* If there are no relocations, skip the section. */
1706 if (! seginfo->fix_root)
1709 /* First rebuild the fixup chain without the expicit lituse's. */
1710 prevP = &(seginfo->fix_root);
1711 for (fixp = seginfo->fix_root; fixp; fixp = next)
1713 next = fixp->fx_next;
1714 fixp->fx_next = (fixS *) 0;
1719 switch (fixp->fx_r_type)
1723 prevP = &(fixp->fx_next);
1726 "alpha_adjust_symtab_relocs: 0x%lx, other relocation %s\n",
1728 bfd_get_reloc_code_name (fixp->fx_r_type));
1732 case BFD_RELOC_ALPHA_USER_LITERAL:
1734 prevP = &(fixp->fx_next);
1735 /* prevent assembler from trying to adjust the offset */
1738 if (fixp->tc_fix_data.info->n_literals != 1)
1741 "alpha_adjust_symtab_relocs: 0x%lx, !literal!%.6d, # literals = %2d\n",
1743 fixp->tc_fix_data.info->sequence,
1744 fixp->tc_fix_data.info->n_literals);
1748 /* do not link in lituse's */
1749 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
1750 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
1751 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
1753 if (fixp->tc_fix_data.info->n_literals == 0)
1754 as_bad_where (fixp->fx_file, fixp->fx_line,
1755 _("No !literal!%d was found"),
1756 fixp->tc_fix_data.info->sequence);
1759 "alpha_adjust_symtab_relocs: 0x%lx, !lituse !%.6d, # lituses = %2d, next_lituse = 0x%lx\n",
1761 fixp->tc_fix_data.info->sequence,
1762 fixp->tc_fix_data.info->n_lituses,
1763 (long) fixp->tc_fix_data.next_lituse);
1769 /* If there were any lituses, go and add them to the chain, unless there is
1770 more than one !literal for a given sequence number. They are linked
1771 through the next_lituse field in reverse order, so as we go through the
1772 next_lituse chain, we effectively reverse the chain once again. If there
1773 was more than one !literal, we fall back to loading up the address w/o
1774 optimization. Also, if the !literals/!lituses are spread in different
1775 segments (happens in the Linux kernel semaphores), suppress the
1779 for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next)
1781 switch (fixp->fx_r_type)
1786 case BFD_RELOC_ALPHA_USER_LITERAL:
1788 fixp->fx_r_type = BFD_RELOC_ALPHA_ELF_LITERAL;
1790 fixp->fx_r_type = BFD_RELOC_ALPHA_LITERAL; /* XXX check this */
1792 if (fixp->tc_fix_data.info->n_literals == 1
1793 && ! fixp->tc_fix_data.info->multi_section_p)
1795 for (lituse = fixp->tc_fix_data.info->lituse;
1796 lituse != (fixS *) 0;
1797 lituse = lituse->tc_fix_data.next_lituse)
1799 lituse->fx_next = fixp->fx_next;
1800 fixp->fx_next = lituse;
1805 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
1806 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
1807 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
1808 fixp->fx_r_type = BFD_RELOC_ALPHA_LITUSE;
1815 fprintf (stderr, "alpha_adjust_symtab_relocs: %s, %d literal%s, %d duplicate literal%s, %d lituse%s\n\n",
1817 n_literals, (n_literals == 1) ? "" : "s",
1818 n_dup_literals, (n_dup_literals == 1) ? "" : "s",
1819 n_lituses, (n_lituses == 1) ? "" : "s");
1823 #endif /* RELOC_OP_P */
1827 debug_exp (tok, ntok)
1833 fprintf (stderr, "debug_exp: %d tokens", ntok);
1834 for (i = 0; i < ntok; i++)
1836 expressionS *t = &tok[i];
1840 default: name = "unknown"; break;
1841 case O_illegal: name = "O_illegal"; break;
1842 case O_absent: name = "O_absent"; break;
1843 case O_constant: name = "O_constant"; break;
1844 case O_symbol: name = "O_symbol"; break;
1845 case O_symbol_rva: name = "O_symbol_rva"; break;
1846 case O_register: name = "O_register"; break;
1847 case O_big: name = "O_big"; break;
1848 case O_uminus: name = "O_uminus"; break;
1849 case O_bit_not: name = "O_bit_not"; break;
1850 case O_logical_not: name = "O_logical_not"; break;
1851 case O_multiply: name = "O_multiply"; break;
1852 case O_divide: name = "O_divide"; break;
1853 case O_modulus: name = "O_modulus"; break;
1854 case O_left_shift: name = "O_left_shift"; break;
1855 case O_right_shift: name = "O_right_shift"; break;
1856 case O_bit_inclusive_or: name = "O_bit_inclusive_or"; break;
1857 case O_bit_or_not: name = "O_bit_or_not"; break;
1858 case O_bit_exclusive_or: name = "O_bit_exclusive_or"; break;
1859 case O_bit_and: name = "O_bit_and"; break;
1860 case O_add: name = "O_add"; break;
1861 case O_subtract: name = "O_subtract"; break;
1862 case O_eq: name = "O_eq"; break;
1863 case O_ne: name = "O_ne"; break;
1864 case O_lt: name = "O_lt"; break;
1865 case O_le: name = "O_le"; break;
1866 case O_ge: name = "O_ge"; break;
1867 case O_gt: name = "O_gt"; break;
1868 case O_logical_and: name = "O_logical_and"; break;
1869 case O_logical_or: name = "O_logical_or"; break;
1870 case O_index: name = "O_index"; break;
1871 case O_pregister: name = "O_pregister"; break;
1872 case O_cpregister: name = "O_cpregister"; break;
1873 case O_literal: name = "O_literal"; break;
1874 case O_lituse_base: name = "O_lituse_base"; break;
1875 case O_lituse_bytoff: name = "O_lituse_bytoff"; break;
1876 case O_lituse_jsr: name = "O_lituse_jsr"; break;
1877 case O_gpdisp: name = "O_gpdisp"; break;
1878 case O_gprelhigh: name = "O_gprelhigh"; break;
1879 case O_gprellow: name = "O_gprellow"; break;
1880 case O_md10: name = "O_md10"; break;
1881 case O_md11: name = "O_md11"; break;
1882 case O_md12: name = "O_md12"; break;
1883 case O_md13: name = "O_md13"; break;
1884 case O_md14: name = "O_md14"; break;
1885 case O_md15: name = "O_md15"; break;
1886 case O_md16: name = "O_md16"; break;
1889 fprintf (stderr, ", %s(%s, %s, %d)", name,
1890 (t->X_add_symbol) ? S_GET_NAME (t->X_add_symbol) : "--",
1891 (t->X_op_symbol) ? S_GET_NAME (t->X_op_symbol) : "--",
1892 (int) t->X_add_number);
1894 fprintf (stderr, "\n");
1899 /* Parse the arguments to an opcode. */
1902 tokenize_arguments (str, tok, ntok)
1907 expressionS *end_tok = tok + ntok;
1908 char *old_input_line_pointer;
1909 int saw_comma = 0, saw_arg = 0;
1911 expressionS *orig_tok = tok;
1915 const struct alpha_reloc_op_tag *r;
1918 int reloc_found_p = 0;
1921 memset (tok, 0, sizeof (*tok) * ntok);
1923 /* Save and restore input_line_pointer around this function */
1924 old_input_line_pointer = input_line_pointer;
1925 input_line_pointer = str;
1927 while (tok < end_tok && *input_line_pointer)
1930 switch (*input_line_pointer)
1937 /* A relocation operand can be placed after the normal operand on an
1938 assembly language statement, and has the following form:
1939 !relocation_type!sequence_number. */
1941 { /* only support one relocation op per insn */
1942 as_bad (_("More than one relocation op per insn"));
1949 for (p = ++input_line_pointer;
1950 ((c = *p) != '!' && c != ';' && c != '#' && c != ','
1951 && !is_end_of_line[c]);
1955 /* Parse !relocation_type */
1956 len = p - input_line_pointer;
1959 as_bad (_("No relocation operand"));
1965 as_bad (_("No !sequence-number after !%s"), input_line_pointer);
1969 r = &alpha_reloc_op[0];
1970 for (i = alpha_num_reloc_op - 1; i >= 0; i--, r++)
1972 if (len == r->length
1973 && memcmp (input_line_pointer, r->name, len) == 0)
1978 as_bad (_("Unknown relocation operand: !%s"),
1979 input_line_pointer);
1983 input_line_pointer = ++p;
1985 /* Parse !sequence_number */
1986 memset (tok, '\0', sizeof (expressionS));
1989 if (tok->X_op != O_constant
1990 || ! ALPHA_RELOC_SEQUENCE_OK (tok->X_add_number))
1992 as_bad (_("Bad sequence number: !%s!%s"),
1993 r->name, input_line_pointer);
2004 ++input_line_pointer;
2005 if (saw_comma || !saw_arg)
2012 char *hold = input_line_pointer++;
2014 /* First try for parenthesized register ... */
2016 if (*input_line_pointer == ')' && tok->X_op == O_register)
2018 tok->X_op = (saw_comma ? O_cpregister : O_pregister);
2021 ++input_line_pointer;
2026 /* ... then fall through to plain expression */
2027 input_line_pointer = hold;
2031 if (saw_arg && !saw_comma)
2035 if (tok->X_op == O_illegal || tok->X_op == O_absent)
2048 input_line_pointer = old_input_line_pointer;
2051 debug_exp (orig_tok, ntok - (end_tok - tok));
2054 return ntok - (end_tok - tok);
2057 input_line_pointer = old_input_line_pointer;
2058 return TOKENIZE_ERROR;
2062 input_line_pointer = old_input_line_pointer;
2063 return TOKENIZE_ERROR_REPORT;
2067 /* Search forward through all variants of an opcode looking for a
2070 static const struct alpha_opcode *
2071 find_opcode_match (first_opcode, tok, pntok, pcpumatch)
2072 const struct alpha_opcode *first_opcode;
2073 const expressionS *tok;
2077 const struct alpha_opcode *opcode = first_opcode;
2079 int got_cpu_match = 0;
2083 const unsigned char *opidx;
2086 /* Don't match opcodes that don't exist on this architecture */
2087 if (!(opcode->flags & alpha_target))
2092 for (opidx = opcode->operands; *opidx; ++opidx)
2094 const struct alpha_operand *operand = &alpha_operands[*opidx];
2096 /* only take input from real operands */
2097 if (operand->flags & AXP_OPERAND_FAKE)
2100 /* when we expect input, make sure we have it */
2103 if ((operand->flags & AXP_OPERAND_OPTIONAL_MASK) == 0)
2108 /* match operand type with expression type */
2109 switch (operand->flags & AXP_OPERAND_TYPECHECK_MASK)
2111 case AXP_OPERAND_IR:
2112 if (tok[tokidx].X_op != O_register
2113 || !is_ir_num (tok[tokidx].X_add_number))
2116 case AXP_OPERAND_FPR:
2117 if (tok[tokidx].X_op != O_register
2118 || !is_fpr_num (tok[tokidx].X_add_number))
2121 case AXP_OPERAND_IR | AXP_OPERAND_PARENS:
2122 if (tok[tokidx].X_op != O_pregister
2123 || !is_ir_num (tok[tokidx].X_add_number))
2126 case AXP_OPERAND_IR | AXP_OPERAND_PARENS | AXP_OPERAND_COMMA:
2127 if (tok[tokidx].X_op != O_cpregister
2128 || !is_ir_num (tok[tokidx].X_add_number))
2132 case AXP_OPERAND_RELATIVE:
2133 case AXP_OPERAND_SIGNED:
2134 case AXP_OPERAND_UNSIGNED:
2135 switch (tok[tokidx].X_op)
2150 /* everything else should have been fake */
2156 /* possible match -- did we use all of our input? */
2165 while (++opcode - alpha_opcodes < alpha_num_opcodes
2166 && !strcmp (opcode->name, first_opcode->name));
2169 *pcpumatch = got_cpu_match;
2174 /* Search forward through all variants of a macro looking for a syntax
2177 static const struct alpha_macro *
2178 find_macro_match (first_macro, tok, pntok)
2179 const struct alpha_macro *first_macro;
2180 const expressionS *tok;
2183 const struct alpha_macro *macro = first_macro;
2188 const enum alpha_macro_arg *arg = macro->argsets;
2202 /* index register */
2204 if (tokidx >= ntok || tok[tokidx].X_op != O_register
2205 || !is_ir_num (tok[tokidx].X_add_number))
2210 /* parenthesized index register */
2212 if (tokidx >= ntok || tok[tokidx].X_op != O_pregister
2213 || !is_ir_num (tok[tokidx].X_add_number))
2218 /* optional parenthesized index register */
2220 if (tokidx < ntok && tok[tokidx].X_op == O_pregister
2221 && is_ir_num (tok[tokidx].X_add_number))
2225 /* leading comma with a parenthesized index register */
2227 if (tokidx >= ntok || tok[tokidx].X_op != O_cpregister
2228 || !is_ir_num (tok[tokidx].X_add_number))
2233 /* floating point register */
2235 if (tokidx >= ntok || tok[tokidx].X_op != O_register
2236 || !is_fpr_num (tok[tokidx].X_add_number))
2241 /* normal expression */
2245 switch (tok[tokidx].X_op)
2255 case O_lituse_bytoff:
2269 /* optional !literal!<number> */
2272 if (tokidx < ntok && tok[tokidx].X_op == O_literal)
2277 /* optional !lituse_base!<number> */
2280 if (tokidx < ntok && tok[tokidx].X_op == O_lituse_base)
2285 /* optional !lituse_bytoff!<number> */
2288 if (tokidx < ntok && tok[tokidx].X_op == O_lituse_bytoff)
2293 /* optional !lituse_jsr!<number> */
2296 if (tokidx < ntok && tok[tokidx].X_op == O_lituse_jsr)
2302 while (*arg != MACRO_EOA)
2310 while (++macro - alpha_macros < alpha_num_macros
2311 && !strcmp (macro->name, first_macro->name));
2316 /* Insert an operand value into an instruction. */
2319 insert_operand (insn, operand, val, file, line)
2321 const struct alpha_operand *operand;
2326 if (operand->bits != 32 && !(operand->flags & AXP_OPERAND_NOOVERFLOW))
2330 if (operand->flags & AXP_OPERAND_SIGNED)
2332 max = (1 << (operand->bits - 1)) - 1;
2333 min = -(1 << (operand->bits - 1));
2337 max = (1 << operand->bits) - 1;
2341 if (val < min || val > max)
2344 _("operand out of range (%s not between %d and %d)");
2345 char buf[sizeof (val) * 3 + 2];
2347 sprint_value (buf, val);
2349 as_warn_where (file, line, err, buf, min, max);
2351 as_warn (err, buf, min, max);
2355 if (operand->insert)
2357 const char *errmsg = NULL;
2359 insn = (*operand->insert) (insn, val, &errmsg);
2364 insn |= ((val & ((1 << operand->bits) - 1)) << operand->shift);
2370 * Turn an opcode description and a set of arguments into
2371 * an instruction and a fixup.
2375 assemble_insn (opcode, tok, ntok, insn)
2376 const struct alpha_opcode *opcode;
2377 const expressionS *tok;
2379 struct alpha_insn *insn;
2381 const unsigned char *argidx;
2385 memset (insn, 0, sizeof (*insn));
2386 image = opcode->opcode;
2388 for (argidx = opcode->operands; *argidx; ++argidx)
2390 const struct alpha_operand *operand = &alpha_operands[*argidx];
2391 const expressionS *t = (const expressionS *) 0;
2393 if (operand->flags & AXP_OPERAND_FAKE)
2395 /* fake operands take no value and generate no fixup */
2396 image = insert_operand (image, operand, 0, NULL, 0);
2402 switch (operand->flags & AXP_OPERAND_OPTIONAL_MASK)
2404 case AXP_OPERAND_DEFAULT_FIRST:
2407 case AXP_OPERAND_DEFAULT_SECOND:
2410 case AXP_OPERAND_DEFAULT_ZERO:
2412 static expressionS zero_exp;
2414 zero_exp.X_op = O_constant;
2415 zero_exp.X_unsigned = 1;
2430 image = insert_operand (image, operand, regno (t->X_add_number),
2435 image = insert_operand (image, operand, t->X_add_number, NULL, 0);
2440 struct alpha_fixup *fixup;
2442 if (insn->nfixups >= MAX_INSN_FIXUPS)
2443 as_fatal (_("too many fixups"));
2445 fixup = &insn->fixups[insn->nfixups++];
2448 fixup->reloc = operand->default_reloc;
2458 * Actually output an instruction with its fixup.
2463 struct alpha_insn *insn;
2468 /* Take care of alignment duties. */
2469 if (alpha_auto_align_on && alpha_current_align < 2)
2470 alpha_align (2, (char *) NULL, alpha_insn_label, 0);
2471 if (alpha_current_align > 2)
2472 alpha_current_align = 2;
2473 alpha_insn_label = NULL;
2475 /* Write out the instruction. */
2477 md_number_to_chars (f, insn->insn, 4);
2480 dwarf2_emit_insn (4);
2483 /* Apply the fixups in order */
2484 for (i = 0; i < insn->nfixups; ++i)
2486 const struct alpha_operand *operand = (const struct alpha_operand *) 0;
2487 struct alpha_fixup *fixup = &insn->fixups[i];
2491 char buffer[ALPHA_RELOC_DIGITS];
2492 struct alpha_literal_tag *info;
2495 /* Some fixups are only used internally and so have no howto */
2496 if ((int) fixup->reloc < 0)
2498 operand = &alpha_operands[-(int) fixup->reloc];
2500 pcrel = ((operand->flags & AXP_OPERAND_RELATIVE) != 0);
2503 switch (fixup->reloc)
2506 /* These relocation types are only used internally. */
2507 case BFD_RELOC_ALPHA_GPDISP_HI16:
2508 case BFD_RELOC_ALPHA_GPDISP_LO16:
2514 /* and these also are internal only relocations */
2515 case BFD_RELOC_ALPHA_USER_LITERAL:
2516 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
2517 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
2518 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
2519 case BFD_RELOC_ALPHA_USER_GPDISP:
2520 case BFD_RELOC_ALPHA_USER_GPRELHIGH:
2521 case BFD_RELOC_ALPHA_USER_GPRELLOW:
2529 reloc_howto_type *reloc_howto
2530 = bfd_reloc_type_lookup (stdoutput, fixup->reloc);
2531 assert (reloc_howto);
2533 size = bfd_get_reloc_size (reloc_howto);
2534 pcrel = reloc_howto->pc_relative;
2536 assert (size >= 1 && size <= 4);
2540 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size,
2541 &fixup->exp, pcrel, fixup->reloc);
2543 /* Turn off complaints that the addend is too large for some fixups,
2544 and copy in the sequence number for the explicit relocations. */
2545 switch (fixup->reloc)
2547 case BFD_RELOC_ALPHA_GPDISP_LO16:
2549 case BFD_RELOC_ALPHA_LITERAL:
2552 case BFD_RELOC_ALPHA_ELF_LITERAL:
2554 case BFD_RELOC_GPREL32:
2555 fixP->fx_no_overflow = 1;
2559 case BFD_RELOC_ALPHA_USER_LITERAL:
2560 fixP->fx_no_overflow = 1;
2561 sprintf (buffer, "!%u", insn->sequence[i]);
2562 info = ((struct alpha_literal_tag *)
2563 hash_find (alpha_literal_hash, buffer));
2567 size_t len = strlen (buffer);
2570 info = ((struct alpha_literal_tag *)
2571 xcalloc (sizeof (struct alpha_literal_tag) + len, 1));
2573 info->segment = now_seg;
2574 info->sequence = insn->sequence[i];
2575 strcpy (info->string, buffer);
2576 errmsg = hash_insert (alpha_literal_hash, info->string, (PTR) info);
2583 if (info->segment != now_seg)
2584 info->multi_section_p = 1;
2586 fixP->tc_fix_data.info = info;
2589 case BFD_RELOC_ALPHA_USER_LITUSE_BASE:
2590 case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF:
2591 case BFD_RELOC_ALPHA_USER_LITUSE_JSR:
2592 sprintf (buffer, "!%u", insn->sequence[i]);
2593 info = ((struct alpha_literal_tag *)
2594 hash_find (alpha_literal_hash, buffer));
2598 size_t len = strlen (buffer);
2601 info = ((struct alpha_literal_tag *)
2602 xcalloc (sizeof (struct alpha_literal_tag) + len, 1));
2604 info->segment = now_seg;
2605 info->sequence = insn->sequence[i];
2606 strcpy (info->string, buffer);
2607 errmsg = hash_insert (alpha_literal_hash, info->string, (PTR) info);
2612 fixP->tc_fix_data.info = info;
2613 fixP->tc_fix_data.next_lituse = info->lituse;
2614 info->lituse = fixP;
2615 if (info->segment != now_seg)
2616 info->multi_section_p = 1;
2622 if ((int) fixup->reloc < 0)
2624 if (operand->flags & AXP_OPERAND_NOOVERFLOW)
2625 fixP->fx_no_overflow = 1;
2632 /* Given an opcode name and a pre-tokenized set of arguments, assemble
2633 the insn, but do not emit it.
2635 Note that this implies no macros allowed, since we can't store more
2636 than one insn in an insn structure. */
2639 assemble_tokens_to_insn (opname, tok, ntok, insn)
2641 const expressionS *tok;
2643 struct alpha_insn *insn;
2645 const struct alpha_opcode *opcode;
2647 /* search opcodes */
2648 opcode = (const struct alpha_opcode *) hash_find (alpha_opcode_hash, opname);
2652 opcode = find_opcode_match (opcode, tok, &ntok, &cpumatch);
2655 assemble_insn (opcode, tok, ntok, insn);
2659 as_bad (_("inappropriate arguments for opcode `%s'"), opname);
2661 as_bad (_("opcode `%s' not supported for target %s"), opname,
2665 as_bad (_("unknown opcode `%s'"), opname);
2668 /* Given an opcode name and a pre-tokenized set of arguments, take the
2669 opcode all the way through emission. */
2672 assemble_tokens (opname, tok, ntok, local_macros_on)
2674 const expressionS *tok;
2676 int local_macros_on;
2678 int found_something = 0;
2679 const struct alpha_opcode *opcode;
2680 const struct alpha_macro *macro;
2684 if (local_macros_on)
2686 macro = ((const struct alpha_macro *)
2687 hash_find (alpha_macro_hash, opname));
2690 found_something = 1;
2691 macro = find_macro_match (macro, tok, &ntok);
2694 (*macro->emit) (tok, ntok, macro->arg);
2701 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
2703 const expressionS *reloc_exp = &tok[ntok - 1];
2704 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
2705 as_bad (_("Cannot use !%s!%d with %s"), r->name,
2706 (int) reloc_exp->X_add_number, opname);
2711 /* search opcodes */
2712 opcode = (const struct alpha_opcode *) hash_find (alpha_opcode_hash, opname);
2715 found_something = 1;
2716 opcode = find_opcode_match (opcode, tok, &ntok, &cpumatch);
2719 struct alpha_insn insn;
2720 assemble_insn (opcode, tok, ntok, &insn);
2726 if (found_something)
2728 as_bad (_("inappropriate arguments for opcode `%s'"), opname);
2730 as_bad (_("opcode `%s' not supported for target %s"), opname,
2733 as_bad (_("unknown opcode `%s'"), opname);
2736 /* Some instruction sets indexed by lg(size) */
2737 static const char * const sextX_op[] = { "sextb", "sextw", "sextl", NULL };
2738 static const char * const insXl_op[] = { "insbl", "inswl", "insll", "insql" };
2739 static const char * const insXh_op[] = { NULL, "inswh", "inslh", "insqh" };
2740 static const char * const extXl_op[] = { "extbl", "extwl", "extll", "extql" };
2741 static const char * const extXh_op[] = { NULL, "extwh", "extlh", "extqh" };
2742 static const char * const mskXl_op[] = { "mskbl", "mskwl", "mskll", "mskql" };
2743 static const char * const mskXh_op[] = { NULL, "mskwh", "msklh", "mskqh" };
2744 static const char * const stX_op[] = { "stb", "stw", "stl", "stq" };
2745 static const char * const ldX_op[] = { "ldb", "ldw", "ldll", "ldq" };
2746 static const char * const ldXu_op[] = { "ldbu", "ldwu", NULL, NULL };
2748 /* Implement the ldgp macro. */
2751 emit_ldgp (tok, ntok, unused)
2752 const expressionS *tok;
2753 int ntok ATTRIBUTE_UNUSED;
2754 const PTR unused ATTRIBUTE_UNUSED;
2759 #if defined(OBJ_ECOFF) || defined(OBJ_ELF)
2760 /* from "ldgp r1,n(r2)", generate "ldah r1,X(R2); lda r1,Y(r1)"
2761 with appropriate constants and relocations. */
2762 struct alpha_insn insn;
2763 expressionS newtok[3];
2767 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
2769 const expressionS *reloc_exp = &tok[ntok - 1];
2770 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
2771 as_bad (_("Cannot use !%s!%d with %s"), r->name,
2772 (int) reloc_exp->X_add_number, "ldgp");
2778 if (regno (tok[2].X_add_number) == AXP_REG_PV)
2779 ecoff_set_gp_prolog_size (0);
2783 set_tok_const (newtok[1], 0);
2786 assemble_tokens_to_insn ("ldah", newtok, 3, &insn);
2791 if (addend.X_op != O_constant)
2792 as_bad (_("can not resolve expression"));
2793 addend.X_op = O_symbol;
2794 addend.X_add_symbol = alpha_gp_symbol;
2798 insn.fixups[0].exp = addend;
2799 insn.fixups[0].reloc = BFD_RELOC_ALPHA_GPDISP_HI16;
2803 set_tok_preg (newtok[2], tok[0].X_add_number);
2805 assemble_tokens_to_insn ("lda", newtok, 3, &insn);
2808 addend.X_add_number += 4;
2812 insn.fixups[0].exp = addend;
2813 insn.fixups[0].reloc = BFD_RELOC_ALPHA_GPDISP_LO16;
2816 #endif /* OBJ_ECOFF || OBJ_ELF */
2821 /* Add symbol+addend to link pool.
2822 Return offset from basesym to entry in link pool.
2824 Add new fixup only if offset isn't 16bit. */
2827 add_to_link_pool (basesym, sym, addend)
2832 segT current_section = now_seg;
2833 int current_subsec = now_subseg;
2835 bfd_reloc_code_real_type reloc_type;
2837 segment_info_type *seginfo = seg_info (alpha_link_section);
2840 offset = - *symbol_get_obj (basesym);
2842 /* @@ This assumes all entries in a given section will be of the same
2843 size... Probably correct, but unwise to rely on. */
2844 /* This must always be called with the same subsegment. */
2846 if (seginfo->frchainP)
2847 for (fixp = seginfo->frchainP->fix_root;
2848 fixp != (fixS *) NULL;
2849 fixp = fixp->fx_next, offset += 8)
2851 if (fixp->fx_addsy == sym && fixp->fx_offset == addend)
2853 if (range_signed_16 (offset))
2860 /* Not found in 16bit signed range. */
2862 subseg_set (alpha_link_section, 0);
2866 fix_new (frag_now, p - frag_now->fr_literal, 8, sym, addend, 0,
2869 subseg_set (current_section, current_subsec);
2870 seginfo->literal_pool_size += 8;
2874 #endif /* OBJ_EVAX */
2876 /* Load a (partial) expression into a target register.
2878 If poffset is not null, after the call it will either contain
2879 O_constant 0, or a 16-bit offset appropriate for any MEM format
2880 instruction. In addition, pbasereg will be modified to point to
2881 the base register to use in that MEM format instruction.
2883 In any case, *pbasereg should contain a base register to add to the
2884 expression. This will normally be either AXP_REG_ZERO or
2885 alpha_gp_register. Symbol addresses will always be loaded via $gp,
2886 so "foo($0)" is interpreted as adding the address of foo to $0;
2887 i.e. "ldq $targ, LIT($gp); addq $targ, $0, $targ". Odd, perhaps,
2888 but this is what OSF/1 does.
2890 If explicit relocations of the form !literal!<number> are allowed,
2891 and used, then explict_reloc with be an expression pointer.
2893 Finally, the return value is true if the calling macro may emit a
2894 LITUSE reloc if otherwise appropriate. */
2897 load_expression (targreg, exp, pbasereg, poffset, explicit_reloc)
2899 const expressionS *exp;
2901 expressionS *poffset;
2902 const expressionS *explicit_reloc;
2904 int emit_lituse = 0;
2905 offsetT addend = exp->X_add_number;
2906 int basereg = *pbasereg;
2907 struct alpha_insn insn;
2908 expressionS newtok[3];
2917 /* attempt to reduce .lit load by splitting the offset from
2918 its symbol when possible, but don't create a situation in
2920 if (!range_signed_32 (addend) &&
2921 (alpha_noat_on || targreg == AXP_REG_AT))
2923 lit = add_to_literal_pool (exp->X_add_symbol, addend,
2924 alpha_lita_section, 8);
2929 lit = add_to_literal_pool (exp->X_add_symbol, 0,
2930 alpha_lita_section, 8);
2934 as_fatal (_("overflow in literal (.lita) table"));
2936 /* emit "ldq r, lit(gp)" */
2938 if (basereg != alpha_gp_register && targreg == basereg)
2941 as_bad (_("macro requires $at register while noat in effect"));
2942 if (targreg == AXP_REG_AT)
2943 as_bad (_("macro requires $at while $at in use"));
2945 set_tok_reg (newtok[0], AXP_REG_AT);
2948 set_tok_reg (newtok[0], targreg);
2949 set_tok_sym (newtok[1], alpha_lita_symbol, lit);
2950 set_tok_preg (newtok[2], alpha_gp_register);
2952 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
2954 assert (explicit_reloc == (const expressionS *) 0);
2955 assert (insn.nfixups == 1);
2956 insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITERAL;
2957 #endif /* OBJ_ECOFF */
2959 /* emit "ldq r, gotoff(gp)" */
2961 if (basereg != alpha_gp_register && targreg == basereg)
2964 as_bad (_("macro requires $at register while noat in effect"));
2965 if (targreg == AXP_REG_AT)
2966 as_bad (_("macro requires $at while $at in use"));
2968 set_tok_reg (newtok[0], AXP_REG_AT);
2971 set_tok_reg (newtok[0], targreg);
2973 /* XXX: Disable this .got minimizing optimization so that we can get
2974 better instruction offset knowledge in the compiler. This happens
2975 very infrequently anyway. */
2977 || (!range_signed_32 (addend)
2978 && (alpha_noat_on || targreg == AXP_REG_AT)))
2985 set_tok_sym (newtok[1], exp->X_add_symbol, 0);
2988 set_tok_preg (newtok[2], alpha_gp_register);
2990 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
2992 assert (insn.nfixups == 1);
2993 if (!explicit_reloc)
2994 insn.fixups[0].reloc = BFD_RELOC_ALPHA_ELF_LITERAL;
2998 insn.fixups[0].reloc
2999 = (ALPHA_RELOC_TABLE (explicit_reloc->X_op))->reloc;
3000 insn.sequence[0] = explicit_reloc->X_add_number;
3005 #endif /* OBJ_ELF */
3009 /* Find symbol or symbol pointer in link section. */
3011 assert (explicit_reloc == (const expressionS *) 0);
3012 if (exp->X_add_symbol == alpha_evax_proc.symbol)
3014 if (range_signed_16 (addend))
3016 set_tok_reg (newtok[0], targreg);
3017 set_tok_const (newtok[1], addend);
3018 set_tok_preg (newtok[2], basereg);
3019 assemble_tokens_to_insn ("lda", newtok, 3, &insn);
3024 set_tok_reg (newtok[0], targreg);
3025 set_tok_const (newtok[1], 0);
3026 set_tok_preg (newtok[2], basereg);
3027 assemble_tokens_to_insn ("lda", newtok, 3, &insn);
3032 if (!range_signed_32 (addend))
3034 link = add_to_link_pool (alpha_evax_proc.symbol,
3035 exp->X_add_symbol, addend);
3040 link = add_to_link_pool (alpha_evax_proc.symbol,
3041 exp->X_add_symbol, 0);
3043 set_tok_reg (newtok[0], targreg);
3044 set_tok_const (newtok[1], link);
3045 set_tok_preg (newtok[2], basereg);
3046 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
3048 #endif /* OBJ_EVAX */
3055 if (basereg != alpha_gp_register && basereg != AXP_REG_ZERO)
3057 /* emit "addq r, base, r" */
3059 set_tok_reg (newtok[1], basereg);
3060 set_tok_reg (newtok[2], targreg);
3061 assemble_tokens ("addq", newtok, 3, 0);
3070 assert (explicit_reloc == (const expressionS *) 0);
3074 /* Assume that this difference expression will be resolved to an
3075 absolute value and that that value will fit in 16 bits. */
3077 assert (explicit_reloc == (const expressionS *) 0);
3078 set_tok_reg (newtok[0], targreg);
3080 set_tok_preg (newtok[2], basereg);
3081 assemble_tokens ("lda", newtok, 3, 0);
3084 set_tok_const (*poffset, 0);
3088 if (exp->X_add_number > 0)
3089 as_bad (_("bignum invalid; zero assumed"));
3091 as_bad (_("floating point number invalid; zero assumed"));
3096 as_bad (_("can't handle expression"));
3101 if (!range_signed_32 (addend))
3105 /* for 64-bit addends, just put it in the literal pool */
3108 /* emit "ldq targreg, lit(basereg)" */
3109 lit = add_to_link_pool (alpha_evax_proc.symbol,
3110 section_symbol (absolute_section), addend);
3111 set_tok_reg (newtok[0], targreg);
3112 set_tok_const (newtok[1], lit);
3113 set_tok_preg (newtok[2], alpha_gp_register);
3114 assemble_tokens ("ldq", newtok, 3, 0);
3117 if (alpha_lit8_section == NULL)
3119 create_literal_section (".lit8",
3120 &alpha_lit8_section,
3121 &alpha_lit8_symbol);
3124 alpha_lit8_literal = add_to_literal_pool (alpha_lit8_symbol, 0x8000,
3125 alpha_lita_section, 8);
3126 if (alpha_lit8_literal >= 0x8000)
3127 as_fatal (_("overflow in literal (.lita) table"));
3131 lit = add_to_literal_pool (NULL, addend, alpha_lit8_section, 8) - 0x8000;
3133 as_fatal (_("overflow in literal (.lit8) table"));
3135 /* emit "lda litreg, .lit8+0x8000" */
3137 if (targreg == basereg)
3140 as_bad (_("macro requires $at register while noat in effect"));
3141 if (targreg == AXP_REG_AT)
3142 as_bad (_("macro requires $at while $at in use"));
3144 set_tok_reg (newtok[0], AXP_REG_AT);
3147 set_tok_reg (newtok[0], targreg);
3149 set_tok_sym (newtok[1], alpha_lita_symbol, alpha_lit8_literal);
3152 set_tok_sym (newtok[1], alpha_lit8_symbol, 0x8000);
3154 set_tok_preg (newtok[2], alpha_gp_register);
3156 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
3158 assert (insn.nfixups == 1);
3160 insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITERAL;
3163 insn.fixups[0].reloc = BFD_RELOC_ALPHA_ELF_LITERAL;
3168 /* emit "ldq litreg, lit(litreg)" */
3170 set_tok_const (newtok[1], lit);
3171 set_tok_preg (newtok[2], newtok[0].X_add_number);
3173 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
3175 assert (insn.nfixups < MAX_INSN_FIXUPS);
3176 if (insn.nfixups > 0)
3178 memmove (&insn.fixups[1], &insn.fixups[0],
3179 sizeof (struct alpha_fixup) * insn.nfixups);
3182 insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
3183 insn.fixups[0].exp.X_op = O_symbol;
3184 insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
3185 insn.fixups[0].exp.X_add_number = LITUSE_BASE;
3190 /* emit "addq litreg, base, target" */
3192 if (basereg != AXP_REG_ZERO)
3194 set_tok_reg (newtok[1], basereg);
3195 set_tok_reg (newtok[2], targreg);
3196 assemble_tokens ("addq", newtok, 3, 0);
3198 #endif /* !OBJ_EVAX */
3201 set_tok_const (*poffset, 0);
3202 *pbasereg = targreg;
3206 offsetT low, high, extra, tmp;
3208 /* for 32-bit operands, break up the addend */
3210 low = sign_extend_16 (addend);
3212 high = sign_extend_16 (tmp >> 16);
3214 if (tmp - (high << 16))
3218 high = sign_extend_16 (tmp >> 16);
3223 set_tok_reg (newtok[0], targreg);
3224 set_tok_preg (newtok[2], basereg);
3228 /* emit "ldah r, extra(r) */
3229 set_tok_const (newtok[1], extra);
3230 assemble_tokens ("ldah", newtok, 3, 0);
3231 set_tok_preg (newtok[2], basereg = targreg);
3236 /* emit "ldah r, high(r) */
3237 set_tok_const (newtok[1], high);
3238 assemble_tokens ("ldah", newtok, 3, 0);
3240 set_tok_preg (newtok[2], basereg);
3243 if ((low && !poffset) || (!poffset && basereg != targreg))
3245 /* emit "lda r, low(base)" */
3246 set_tok_const (newtok[1], low);
3247 assemble_tokens ("lda", newtok, 3, 0);
3253 set_tok_const (*poffset, low);
3254 *pbasereg = basereg;
3260 /* The lda macro differs from the lda instruction in that it handles
3261 most simple expressions, particualrly symbol address loads and
3265 emit_lda (tok, ntok, opname)
3266 const expressionS *tok;
3271 const expressionS *reloc = (const expressionS *) 0;
3274 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3276 const struct alpha_reloc_op_tag *r;
3278 reloc = &tok[ntok - 1];
3279 r = ALPHA_RELOC_TABLE (reloc->X_op);
3280 switch (reloc->X_op)
3283 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3284 (int) reloc->X_add_number, (const char *) opname);
3286 reloc = (const expressionS *) 0;
3294 /* For lda $x,0($x)!lituse_base!y, don't use load_expression, since
3295 it is really too general for our needs. Instead just generate the
3299 || tok[0].X_op != O_register
3300 || !is_ir_num (tok[0].X_add_number)
3301 || tok[1].X_op != O_constant
3302 || tok[2].X_op != O_pregister
3303 || !is_ir_num (tok[2].X_add_number))
3305 as_bad (_("bad instruction format for lda !%s!%ld"), r->name,
3306 (long) reloc->X_add_number);
3308 reloc = (const expressionS *) 0;
3313 emit_loadstore (tok, ntok, "lda");
3320 basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register);
3322 basereg = tok[2].X_add_number;
3324 (void) load_expression (tok[0].X_add_number, &tok[1], &basereg, NULL, reloc);
3327 /* The ldah macro differs from the ldah instruction in that it has $31
3328 as an implied base register. */
3331 emit_ldah (tok, ntok, unused)
3332 const expressionS *tok;
3333 int ntok ATTRIBUTE_UNUSED;
3334 const PTR unused ATTRIBUTE_UNUSED;
3336 expressionS newtok[3];
3339 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3341 const expressionS *reloc_exp = &tok[ntok - 1];
3342 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
3343 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3344 (int) reloc_exp->X_add_number, "ldah");
3351 set_tok_preg (newtok[2], AXP_REG_ZERO);
3353 assemble_tokens ("ldah", newtok, 3, 0);
3356 /* Handle all "simple" integer register loads -- ldq, ldq_l, ldq_u,
3357 etc. They differ from the real instructions in that they do simple
3358 expressions like the lda macro. */
3361 emit_ir_load (tok, ntok, opname)
3362 const expressionS *tok;
3366 int basereg, lituse;
3367 expressionS newtok[3];
3368 struct alpha_insn insn;
3371 const expressionS *reloc = (const expressionS *) 0;
3373 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3375 const struct alpha_reloc_op_tag *r;
3377 reloc = &tok[ntok - 1];
3378 switch (reloc->X_op)
3385 if (strcmp ((const char *) opname, "ldq") == 0)
3387 emit_lda (tok, ntok, opname);
3394 r = ALPHA_RELOC_TABLE (reloc->X_op);
3395 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3396 (int) reloc->X_add_number, (const char *) opname);
3402 basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register);
3404 basereg = tok[2].X_add_number;
3406 lituse = load_expression (tok[0].X_add_number, &tok[1], &basereg,
3407 &newtok[1], (const expressionS *) 0);
3410 set_tok_preg (newtok[2], basereg);
3412 assemble_tokens_to_insn ((const char *) opname, newtok, 3, &insn);
3417 int nfixups = insn.nfixups;
3418 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc->X_op);
3420 assert (nfixups < MAX_INSN_FIXUPS);
3421 insn.fixups[nfixups].reloc = r->reloc;
3422 insn.fixups[nfixups].exp.X_op = O_symbol;
3423 insn.fixups[nfixups].exp.X_add_symbol = section_symbol (now_seg);
3424 insn.fixups[nfixups].exp.X_add_number = r->lituse;
3425 insn.sequence[nfixups] = reloc->X_add_number;
3432 assert (insn.nfixups < MAX_INSN_FIXUPS);
3433 if (insn.nfixups > 0)
3435 memmove (&insn.fixups[1], &insn.fixups[0],
3436 sizeof (struct alpha_fixup) * insn.nfixups);
3439 insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
3440 insn.fixups[0].exp.X_op = O_symbol;
3441 insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
3442 insn.fixups[0].exp.X_add_number = LITUSE_BASE;
3448 /* Handle fp register loads, and both integer and fp register stores.
3449 Again, we handle simple expressions. */
3452 emit_loadstore (tok, ntok, opname)
3453 const expressionS *tok;
3457 int basereg, lituse;
3458 expressionS newtok[3];
3459 struct alpha_insn insn;
3462 const expressionS *reloc = (const expressionS *) 0;
3464 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3466 reloc = &tok[--ntok];
3467 if (reloc->X_op != O_lituse_base)
3469 const struct alpha_reloc_op_tag *r = &alpha_reloc_op[reloc->X_md];
3470 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3471 (int) reloc->X_add_number, (const char *) opname);
3477 basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register);
3479 basereg = tok[2].X_add_number;
3481 if (tok[1].X_op != O_constant || !range_signed_16 (tok[1].X_add_number))
3484 as_bad (_("macro requires $at register while noat in effect"));
3486 lituse = load_expression (AXP_REG_AT, &tok[1], &basereg, &newtok[1],
3487 (const expressionS *) 0);
3496 set_tok_preg (newtok[2], basereg);
3498 assemble_tokens_to_insn ((const char *) opname, newtok, 3, &insn);
3503 int nfixups = insn.nfixups;
3504 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc->X_op);
3506 assert (nfixups < MAX_INSN_FIXUPS);
3507 insn.fixups[nfixups].reloc = r->reloc;
3508 insn.fixups[nfixups].exp.X_op = O_symbol;
3509 insn.fixups[nfixups].exp.X_add_symbol = section_symbol (now_seg);
3510 insn.fixups[nfixups].exp.X_add_number = r->lituse;
3511 insn.sequence[nfixups] = reloc->X_add_number;
3518 assert (insn.nfixups < MAX_INSN_FIXUPS);
3519 if (insn.nfixups > 0)
3521 memmove (&insn.fixups[1], &insn.fixups[0],
3522 sizeof (struct alpha_fixup) * insn.nfixups);
3525 insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
3526 insn.fixups[0].exp.X_op = O_symbol;
3527 insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
3528 insn.fixups[0].exp.X_add_number = LITUSE_BASE;
3534 /* Load a half-word or byte as an unsigned value. */
3537 emit_ldXu (tok, ntok, vlgsize)
3538 const expressionS *tok;
3542 if (alpha_target & AXP_OPCODE_BWX)
3543 emit_ir_load (tok, ntok, ldXu_op[(long) vlgsize]);
3546 expressionS newtok[3];
3549 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3551 const expressionS *reloc_exp = &tok[ntok - 1];
3552 const struct alpha_reloc_op_tag *r
3553 = ALPHA_RELOC_TABLE (reloc_exp->X_op);
3555 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3556 (int) reloc_exp->X_add_number, "ldbu/ldwu");
3562 as_bad (_("macro requires $at register while noat in effect"));
3564 /* emit "lda $at, exp" */
3566 memcpy (newtok, tok, sizeof (expressionS) * ntok);
3567 newtok[0].X_add_number = AXP_REG_AT;
3568 assemble_tokens ("lda", newtok, ntok, 1);
3570 /* emit "ldq_u targ, 0($at)" */
3573 set_tok_const (newtok[1], 0);
3574 set_tok_preg (newtok[2], AXP_REG_AT);
3575 assemble_tokens ("ldq_u", newtok, 3, 1);
3577 /* emit "extXl targ, $at, targ" */
3579 set_tok_reg (newtok[1], AXP_REG_AT);
3580 newtok[2] = newtok[0];
3581 assemble_tokens (extXl_op[(long) vlgsize], newtok, 3, 1);
3585 /* Load a half-word or byte as a signed value. */
3588 emit_ldX (tok, ntok, vlgsize)
3589 const expressionS *tok;
3593 emit_ldXu (tok, ntok, vlgsize);
3594 assemble_tokens (sextX_op[(long) vlgsize], tok, 1, 1);
3597 /* Load an integral value from an unaligned address as an unsigned
3601 emit_uldXu (tok, ntok, vlgsize)
3602 const expressionS *tok;
3606 long lgsize = (long) vlgsize;
3607 expressionS newtok[3];
3610 as_bad (_("macro requires $at register while noat in effect"));
3612 /* emit "lda $at, exp" */
3614 memcpy (newtok, tok, sizeof (expressionS) * ntok);
3615 newtok[0].X_add_number = AXP_REG_AT;
3616 assemble_tokens ("lda", newtok, ntok, 1);
3618 /* emit "ldq_u $t9, 0($at)" */
3620 set_tok_reg (newtok[0], AXP_REG_T9);
3621 set_tok_const (newtok[1], 0);
3622 set_tok_preg (newtok[2], AXP_REG_AT);
3623 assemble_tokens ("ldq_u", newtok, 3, 1);
3625 /* emit "ldq_u $t10, size-1($at)" */
3627 set_tok_reg (newtok[0], AXP_REG_T10);
3628 set_tok_const (newtok[1], (1 << lgsize) - 1);
3629 assemble_tokens ("ldq_u", newtok, 3, 1);
3631 /* emit "extXl $t9, $at, $t9" */
3633 set_tok_reg (newtok[0], AXP_REG_T9);
3634 set_tok_reg (newtok[1], AXP_REG_AT);
3635 set_tok_reg (newtok[2], AXP_REG_T9);
3636 assemble_tokens (extXl_op[lgsize], newtok, 3, 1);
3638 /* emit "extXh $t10, $at, $t10" */
3640 set_tok_reg (newtok[0], AXP_REG_T10);
3641 set_tok_reg (newtok[2], AXP_REG_T10);
3642 assemble_tokens (extXh_op[lgsize], newtok, 3, 1);
3644 /* emit "or $t9, $t10, targ" */
3646 set_tok_reg (newtok[0], AXP_REG_T9);
3647 set_tok_reg (newtok[1], AXP_REG_T10);
3649 assemble_tokens ("or", newtok, 3, 1);
3652 /* Load an integral value from an unaligned address as a signed value.
3653 Note that quads should get funneled to the unsigned load since we
3654 don't have to do the sign extension. */
3657 emit_uldX (tok, ntok, vlgsize)
3658 const expressionS *tok;
3662 emit_uldXu (tok, ntok, vlgsize);
3663 assemble_tokens (sextX_op[(long) vlgsize], tok, 1, 1);
3666 /* Implement the ldil macro. */
3669 emit_ldil (tok, ntok, unused)
3670 const expressionS *tok;
3672 const PTR unused ATTRIBUTE_UNUSED;
3674 expressionS newtok[2];
3677 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3679 const expressionS *reloc_exp = &tok[ntok - 1];
3680 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
3681 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3682 (int) reloc_exp->X_add_number, "ldil");
3687 memcpy (newtok, tok, sizeof (newtok));
3688 newtok[1].X_add_number = sign_extend_32 (tok[1].X_add_number);
3690 assemble_tokens ("lda", newtok, ntok, 1);
3693 /* Store a half-word or byte. */
3696 emit_stX (tok, ntok, vlgsize)
3697 const expressionS *tok;
3701 int lgsize = (int) (long) vlgsize;
3703 if (alpha_target & AXP_OPCODE_BWX)
3704 emit_loadstore (tok, ntok, stX_op[lgsize]);
3707 expressionS newtok[3];
3710 as_bad (_("macro requires $at register while noat in effect"));
3712 /* emit "lda $at, exp" */
3714 memcpy (newtok, tok, sizeof (expressionS) * ntok);
3715 newtok[0].X_add_number = AXP_REG_AT;
3716 assemble_tokens ("lda", newtok, ntok, 1);
3718 /* emit "ldq_u $t9, 0($at)" */
3720 set_tok_reg (newtok[0], AXP_REG_T9);
3721 set_tok_const (newtok[1], 0);
3722 set_tok_preg (newtok[2], AXP_REG_AT);
3723 assemble_tokens ("ldq_u", newtok, 3, 1);
3725 /* emit "insXl src, $at, $t10" */
3728 set_tok_reg (newtok[1], AXP_REG_AT);
3729 set_tok_reg (newtok[2], AXP_REG_T10);
3730 assemble_tokens (insXl_op[lgsize], newtok, 3, 1);
3732 /* emit "mskXl $t9, $at, $t9" */
3734 set_tok_reg (newtok[0], AXP_REG_T9);
3735 newtok[2] = newtok[0];
3736 assemble_tokens (mskXl_op[lgsize], newtok, 3, 1);
3738 /* emit "or $t9, $t10, $t9" */
3740 set_tok_reg (newtok[1], AXP_REG_T10);
3741 assemble_tokens ("or", newtok, 3, 1);
3743 /* emit "stq_u $t9, 0($at) */
3745 set_tok_const (newtok[1], 0);
3746 set_tok_preg (newtok[2], AXP_REG_AT);
3747 assemble_tokens ("stq_u", newtok, 3, 1);
3751 /* Store an integer to an unaligned address. */
3754 emit_ustX (tok, ntok, vlgsize)
3755 const expressionS *tok;
3759 int lgsize = (int) (long) vlgsize;
3760 expressionS newtok[3];
3762 /* emit "lda $at, exp" */
3764 memcpy (newtok, tok, sizeof (expressionS) * ntok);
3765 newtok[0].X_add_number = AXP_REG_AT;
3766 assemble_tokens ("lda", newtok, ntok, 1);
3768 /* emit "ldq_u $9, 0($at)" */
3770 set_tok_reg (newtok[0], AXP_REG_T9);
3771 set_tok_const (newtok[1], 0);
3772 set_tok_preg (newtok[2], AXP_REG_AT);
3773 assemble_tokens ("ldq_u", newtok, 3, 1);
3775 /* emit "ldq_u $10, size-1($at)" */
3777 set_tok_reg (newtok[0], AXP_REG_T10);
3778 set_tok_const (newtok[1], (1 << lgsize) - 1);
3779 assemble_tokens ("ldq_u", newtok, 3, 1);
3781 /* emit "insXl src, $at, $t11" */
3784 set_tok_reg (newtok[1], AXP_REG_AT);
3785 set_tok_reg (newtok[2], AXP_REG_T11);
3786 assemble_tokens (insXl_op[lgsize], newtok, 3, 1);
3788 /* emit "insXh src, $at, $t12" */
3790 set_tok_reg (newtok[2], AXP_REG_T12);
3791 assemble_tokens (insXh_op[lgsize], newtok, 3, 1);
3793 /* emit "mskXl $t9, $at, $t9" */
3795 set_tok_reg (newtok[0], AXP_REG_T9);
3796 newtok[2] = newtok[0];
3797 assemble_tokens (mskXl_op[lgsize], newtok, 3, 1);
3799 /* emit "mskXh $t10, $at, $t10" */
3801 set_tok_reg (newtok[0], AXP_REG_T10);
3802 newtok[2] = newtok[0];
3803 assemble_tokens (mskXh_op[lgsize], newtok, 3, 1);
3805 /* emit "or $t9, $t11, $t9" */
3807 set_tok_reg (newtok[0], AXP_REG_T9);
3808 set_tok_reg (newtok[1], AXP_REG_T11);
3809 newtok[2] = newtok[0];
3810 assemble_tokens ("or", newtok, 3, 1);
3812 /* emit "or $t10, $t12, $t10" */
3814 set_tok_reg (newtok[0], AXP_REG_T10);
3815 set_tok_reg (newtok[1], AXP_REG_T12);
3816 newtok[2] = newtok[0];
3817 assemble_tokens ("or", newtok, 3, 1);
3819 /* emit "stq_u $t9, 0($at)" */
3821 set_tok_reg (newtok[0], AXP_REG_T9);
3822 set_tok_const (newtok[1], 0);
3823 set_tok_preg (newtok[2], AXP_REG_AT);
3824 assemble_tokens ("stq_u", newtok, 3, 1);
3826 /* emit "stq_u $t10, size-1($at)" */
3828 set_tok_reg (newtok[0], AXP_REG_T10);
3829 set_tok_const (newtok[1], (1 << lgsize) - 1);
3830 assemble_tokens ("stq_u", newtok, 3, 1);
3833 /* Sign extend a half-word or byte. The 32-bit sign extend is
3834 implemented as "addl $31, $r, $t" in the opcode table. */
3837 emit_sextX (tok, ntok, vlgsize)
3838 const expressionS *tok;
3842 long lgsize = (long) vlgsize;
3844 if (alpha_target & AXP_OPCODE_BWX)
3845 assemble_tokens (sextX_op[lgsize], tok, ntok, 0);
3848 int bitshift = 64 - 8 * (1 << lgsize);
3849 expressionS newtok[3];
3852 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3854 const expressionS *reloc_exp = &tok[ntok - 1];
3855 const struct alpha_reloc_op_tag *r
3856 = ALPHA_RELOC_TABLE (reloc_exp->X_op);
3858 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3859 (int) reloc_exp->X_add_number, "setxt");
3864 /* emit "sll src,bits,dst" */
3867 set_tok_const (newtok[1], bitshift);
3868 newtok[2] = tok[ntok - 1];
3869 assemble_tokens ("sll", newtok, 3, 1);
3871 /* emit "sra dst,bits,dst" */
3873 newtok[0] = newtok[2];
3874 assemble_tokens ("sra", newtok, 3, 1);
3878 /* Implement the division and modulus macros. */
3882 /* Make register usage like in normal procedure call.
3883 Don't clobber PV and RA. */
3886 emit_division (tok, ntok, symname)
3887 const expressionS *tok;
3891 /* DIVISION and MODULUS. Yech.
3896 * mov x,R16 # if x != R16
3897 * mov y,R17 # if y != R17
3902 * with appropriate optimizations if R0,R16,R17 are the registers
3903 * specified by the compiler.
3908 expressionS newtok[3];
3911 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3913 const expressionS *reloc_exp = &tok[ntok - 1];
3914 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
3915 as_bad (_("Cannot use !%s!%d with %s"), r->name,
3916 (int) reloc_exp->X_add_number, (char char *) symname);
3921 xr = regno (tok[0].X_add_number);
3922 yr = regno (tok[1].X_add_number);
3927 rr = regno (tok[2].X_add_number);
3929 /* Move the operands into the right place */
3930 if (yr == AXP_REG_R16 && xr == AXP_REG_R17)
3932 /* They are in exactly the wrong order -- swap through AT */
3935 as_bad (_("macro requires $at register while noat in effect"));
3937 set_tok_reg (newtok[0], AXP_REG_R16);
3938 set_tok_reg (newtok[1], AXP_REG_AT);
3939 assemble_tokens ("mov", newtok, 2, 1);
3941 set_tok_reg (newtok[0], AXP_REG_R17);
3942 set_tok_reg (newtok[1], AXP_REG_R16);
3943 assemble_tokens ("mov", newtok, 2, 1);
3945 set_tok_reg (newtok[0], AXP_REG_AT);
3946 set_tok_reg (newtok[1], AXP_REG_R17);
3947 assemble_tokens ("mov", newtok, 2, 1);
3951 if (yr == AXP_REG_R16)
3953 set_tok_reg (newtok[0], AXP_REG_R16);
3954 set_tok_reg (newtok[1], AXP_REG_R17);
3955 assemble_tokens ("mov", newtok, 2, 1);
3958 if (xr != AXP_REG_R16)
3960 set_tok_reg (newtok[0], xr);
3961 set_tok_reg (newtok[1], AXP_REG_R16);
3962 assemble_tokens ("mov", newtok, 2, 1);
3965 if (yr != AXP_REG_R16 && yr != AXP_REG_R17)
3967 set_tok_reg (newtok[0], yr);
3968 set_tok_reg (newtok[1], AXP_REG_R17);
3969 assemble_tokens ("mov", newtok, 2, 1);
3973 sym = symbol_find_or_make ((const char *) symname);
3975 set_tok_reg (newtok[0], AXP_REG_AT);
3976 set_tok_sym (newtok[1], sym, 0);
3977 assemble_tokens ("lda", newtok, 2, 1);
3979 /* Call the division routine */
3980 set_tok_reg (newtok[0], AXP_REG_AT);
3981 set_tok_cpreg (newtok[1], AXP_REG_AT);
3982 set_tok_const (newtok[2], 0);
3983 assemble_tokens ("jsr", newtok, 3, 1);
3985 /* Move the result to the right place */
3986 if (rr != AXP_REG_R0)
3988 set_tok_reg (newtok[0], AXP_REG_R0);
3989 set_tok_reg (newtok[1], rr);
3990 assemble_tokens ("mov", newtok, 2, 1);
3994 #else /* !OBJ_EVAX */
3997 emit_division (tok, ntok, symname)
3998 const expressionS *tok;
4002 /* DIVISION and MODULUS. Yech.
4012 * with appropriate optimizations if t10,t11,t12 are the registers
4013 * specified by the compiler.
4018 expressionS newtok[3];
4021 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
4023 const expressionS *reloc_exp = &tok[ntok - 1];
4024 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
4025 as_bad (_("Cannot use !%s!%d with %s"), r->name,
4026 (int) reloc_exp->X_add_number, (const char *) symname);
4031 xr = regno (tok[0].X_add_number);
4032 yr = regno (tok[1].X_add_number);
4037 rr = regno (tok[2].X_add_number);
4039 sym = symbol_find_or_make ((const char *) symname);
4041 /* Move the operands into the right place */
4042 if (yr == AXP_REG_T10 && xr == AXP_REG_T11)
4044 /* They are in exactly the wrong order -- swap through AT */
4047 as_bad (_("macro requires $at register while noat in effect"));
4049 set_tok_reg (newtok[0], AXP_REG_T10);
4050 set_tok_reg (newtok[1], AXP_REG_AT);
4051 assemble_tokens ("mov", newtok, 2, 1);
4053 set_tok_reg (newtok[0], AXP_REG_T11);
4054 set_tok_reg (newtok[1], AXP_REG_T10);
4055 assemble_tokens ("mov", newtok, 2, 1);
4057 set_tok_reg (newtok[0], AXP_REG_AT);
4058 set_tok_reg (newtok[1], AXP_REG_T11);
4059 assemble_tokens ("mov", newtok, 2, 1);
4063 if (yr == AXP_REG_T10)
4065 set_tok_reg (newtok[0], AXP_REG_T10);
4066 set_tok_reg (newtok[1], AXP_REG_T11);
4067 assemble_tokens ("mov", newtok, 2, 1);
4070 if (xr != AXP_REG_T10)
4072 set_tok_reg (newtok[0], xr);
4073 set_tok_reg (newtok[1], AXP_REG_T10);
4074 assemble_tokens ("mov", newtok, 2, 1);
4077 if (yr != AXP_REG_T10 && yr != AXP_REG_T11)
4079 set_tok_reg (newtok[0], yr);
4080 set_tok_reg (newtok[1], AXP_REG_T11);
4081 assemble_tokens ("mov", newtok, 2, 1);
4085 /* Call the division routine */
4086 set_tok_reg (newtok[0], AXP_REG_T9);
4087 set_tok_sym (newtok[1], sym, 0);
4088 assemble_tokens ("jsr", newtok, 2, 1);
4090 /* Reload the GP register */
4094 #if defined(OBJ_ECOFF) || defined(OBJ_ELF)
4095 set_tok_reg (newtok[0], alpha_gp_register);
4096 set_tok_const (newtok[1], 0);
4097 set_tok_preg (newtok[2], AXP_REG_T9);
4098 assemble_tokens ("ldgp", newtok, 3, 1);
4101 /* Move the result to the right place */
4102 if (rr != AXP_REG_T12)
4104 set_tok_reg (newtok[0], AXP_REG_T12);
4105 set_tok_reg (newtok[1], rr);
4106 assemble_tokens ("mov", newtok, 2, 1);
4110 #endif /* !OBJ_EVAX */
4112 /* The jsr and jmp macros differ from their instruction counterparts
4113 in that they can load the target address and default most
4117 emit_jsrjmp (tok, ntok, vopname)
4118 const expressionS *tok;
4122 const char *opname = (const char *) vopname;
4123 struct alpha_insn insn;
4124 expressionS newtok[3];
4125 int r, tokidx = 0, lituse = 0;
4128 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
4130 const expressionS *reloc_exp = &tok[ntok - 1];
4131 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
4132 as_bad (_("Cannot use !%s!%d with %s"), r->name,
4133 (int) reloc_exp->X_add_number, opname);
4138 if (tokidx < ntok && tok[tokidx].X_op == O_register)
4139 r = regno (tok[tokidx++].X_add_number);
4141 r = strcmp (opname, "jmp") == 0 ? AXP_REG_ZERO : AXP_REG_RA;
4143 set_tok_reg (newtok[0], r);
4145 if (tokidx < ntok &&
4146 (tok[tokidx].X_op == O_pregister || tok[tokidx].X_op == O_cpregister))
4147 r = regno (tok[tokidx++].X_add_number);
4149 /* keep register if jsr $n.<sym> */
4153 int basereg = alpha_gp_register;
4154 lituse = load_expression (r = AXP_REG_PV, &tok[tokidx], &basereg, NULL,
4155 (const expressionS *) 0);
4159 set_tok_cpreg (newtok[1], r);
4162 /* FIXME: Add hint relocs to BFD for evax. */
4165 newtok[2] = tok[tokidx];
4168 set_tok_const (newtok[2], 0);
4170 assemble_tokens_to_insn (opname, newtok, 3, &insn);
4172 /* add the LITUSE fixup */
4175 assert (insn.nfixups < MAX_INSN_FIXUPS);
4176 if (insn.nfixups > 0)
4178 memmove (&insn.fixups[1], &insn.fixups[0],
4179 sizeof (struct alpha_fixup) * insn.nfixups);
4182 insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
4183 insn.fixups[0].exp.X_op = O_symbol;
4184 insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
4185 insn.fixups[0].exp.X_add_number = LITUSE_JSR;
4191 /* The ret and jcr instructions differ from their instruction
4192 counterparts in that everything can be defaulted. */
4195 emit_retjcr (tok, ntok, vopname)
4196 const expressionS *tok;
4200 const char *opname = (const char *) vopname;
4201 expressionS newtok[3];
4205 if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
4207 const expressionS *reloc_exp = &tok[ntok - 1];
4208 const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op);
4209 as_bad (_("Cannot use !%s!%d with %s"), r->name,
4210 (int) reloc_exp->X_add_number, opname);
4215 if (tokidx < ntok && tok[tokidx].X_op == O_register)
4216 r = regno (tok[tokidx++].X_add_number);
4220 set_tok_reg (newtok[0], r);
4222 if (tokidx < ntok &&
4223 (tok[tokidx].X_op == O_pregister || tok[tokidx].X_op == O_cpregister))
4224 r = regno (tok[tokidx++].X_add_number);
4228 set_tok_cpreg (newtok[1], r);
4231 newtok[2] = tok[tokidx];
4233 set_tok_const (newtok[2], strcmp (opname, "ret") == 0);
4235 assemble_tokens (opname, newtok, 3, 0);
4238 /* Assembler directives */
4240 /* Handle the .text pseudo-op. This is like the usual one, but it
4241 clears alpha_insn_label and restores auto alignment. */
4249 alpha_insn_label = NULL;
4250 alpha_auto_align_on = 1;
4251 alpha_current_align = 0;
4254 /* Handle the .data pseudo-op. This is like the usual one, but it
4255 clears alpha_insn_label and restores auto alignment. */
4262 alpha_insn_label = NULL;
4263 alpha_auto_align_on = 1;
4264 alpha_current_align = 0;
4267 #if defined (OBJ_ECOFF) || defined (OBJ_EVAX)
4269 /* Handle the OSF/1 and openVMS .comm pseudo quirks.
4270 openVMS constructs a section for every common symbol. */
4273 s_alpha_comm (ignore)
4276 register char *name;
4280 register symbolS *symbolP;
4283 segT current_section = now_seg;
4284 int current_subsec = now_subseg;
4288 name = input_line_pointer;
4289 c = get_symbol_end ();
4291 /* just after name is now '\0' */
4292 p = input_line_pointer;
4297 /* Alpha OSF/1 compiler doesn't provide the comma, gcc does. */
4298 if (*input_line_pointer == ',')
4300 input_line_pointer++;
4303 if ((temp = get_absolute_expression ()) < 0)
4305 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
4306 ignore_rest_of_line ();
4311 symbolP = symbol_find_or_make (name);
4314 /* Make a section for the common symbol. */
4315 new_seg = subseg_new (xstrdup (name), 0);
4321 /* alignment might follow */
4322 if (*input_line_pointer == ',')
4326 input_line_pointer++;
4327 align = get_absolute_expression ();
4328 bfd_set_section_alignment (stdoutput, new_seg, align);
4332 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
4334 as_bad (_("Ignoring attempt to re-define symbol"));
4335 ignore_rest_of_line ();
4340 if (bfd_section_size (stdoutput, new_seg) > 0)
4342 if (bfd_section_size (stdoutput, new_seg) != temp)
4343 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
4344 S_GET_NAME (symbolP),
4345 (long) bfd_section_size (stdoutput, new_seg),
4349 if (S_GET_VALUE (symbolP))
4351 if (S_GET_VALUE (symbolP) != (valueT) temp)
4352 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
4353 S_GET_NAME (symbolP),
4354 (long) S_GET_VALUE (symbolP),
4361 subseg_set (new_seg, 0);
4362 p = frag_more (temp);
4363 new_seg->flags |= SEC_IS_COMMON;
4364 if (! S_IS_DEFINED (symbolP))
4365 S_SET_SEGMENT (symbolP, new_seg);
4367 S_SET_VALUE (symbolP, (valueT) temp);
4369 S_SET_EXTERNAL (symbolP);
4373 subseg_set (current_section, current_subsec);
4376 know (symbol_get_frag (symbolP) == &zero_address_frag);
4378 demand_empty_rest_of_line ();
4381 #endif /* ! OBJ_ELF */
4385 /* Handle the .rdata pseudo-op. This is like the usual one, but it
4386 clears alpha_insn_label and restores auto alignment. */
4389 s_alpha_rdata (ignore)
4394 temp = get_absolute_expression ();
4395 subseg_new (".rdata", 0);
4396 demand_empty_rest_of_line ();
4397 alpha_insn_label = NULL;
4398 alpha_auto_align_on = 1;
4399 alpha_current_align = 0;
4406 /* Handle the .sdata pseudo-op. This is like the usual one, but it
4407 clears alpha_insn_label and restores auto alignment. */
4410 s_alpha_sdata (ignore)
4415 temp = get_absolute_expression ();
4416 subseg_new (".sdata", 0);
4417 demand_empty_rest_of_line ();
4418 alpha_insn_label = NULL;
4419 alpha_auto_align_on = 1;
4420 alpha_current_align = 0;
4426 /* Handle the .section pseudo-op. This is like the usual one, but it
4427 clears alpha_insn_label and restores auto alignment. */
4430 s_alpha_section (ignore)
4433 obj_elf_section (ignore);
4435 alpha_insn_label = NULL;
4436 alpha_auto_align_on = 1;
4437 alpha_current_align = 0;
4442 int dummy ATTRIBUTE_UNUSED;
4444 if (ECOFF_DEBUGGING)
4445 ecoff_directive_ent (0);
4448 char *name, name_end;
4449 name = input_line_pointer;
4450 name_end = get_symbol_end ();
4452 if (! is_name_beginner (*name))
4454 as_warn (_(".ent directive has no name"));
4455 *input_line_pointer = name_end;
4461 if (alpha_cur_ent_sym)
4462 as_warn (_("nested .ent directives"));
4464 sym = symbol_find_or_make (name);
4465 symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
4466 alpha_cur_ent_sym = sym;
4468 /* The .ent directive is sometimes followed by a number. Not sure
4469 what it really means, but ignore it. */
4470 *input_line_pointer = name_end;
4472 if (*input_line_pointer == ',')
4474 input_line_pointer++;
4477 if (isdigit (*input_line_pointer) || *input_line_pointer == '-')
4478 (void) get_absolute_expression ();
4480 demand_empty_rest_of_line ();
4486 int dummy ATTRIBUTE_UNUSED;
4488 if (ECOFF_DEBUGGING)
4489 ecoff_directive_end (0);
4492 char *name, name_end;
4493 name = input_line_pointer;
4494 name_end = get_symbol_end ();
4496 if (! is_name_beginner (*name))
4498 as_warn (_(".end directive has no name"));
4499 *input_line_pointer = name_end;
4505 sym = symbol_find (name);
4506 if (sym != alpha_cur_ent_sym)
4507 as_warn (_(".end directive names different symbol than .ent"));
4509 /* Create an expression to calculate the size of the function. */
4512 symbol_get_obj (sym)->size =
4513 (expressionS *) xmalloc (sizeof (expressionS));
4514 symbol_get_obj (sym)->size->X_op = O_subtract;
4515 symbol_get_obj (sym)->size->X_add_symbol
4516 = symbol_new ("L0\001", now_seg, frag_now_fix (), frag_now);
4517 symbol_get_obj (sym)->size->X_op_symbol = sym;
4518 symbol_get_obj (sym)->size->X_add_number = 0;
4521 alpha_cur_ent_sym = NULL;
4523 *input_line_pointer = name_end;
4525 demand_empty_rest_of_line ();
4533 if (ECOFF_DEBUGGING)
4536 ecoff_directive_fmask (0);
4538 ecoff_directive_mask (0);
4541 discard_rest_of_line ();
4545 s_alpha_frame (dummy)
4546 int dummy ATTRIBUTE_UNUSED;
4548 if (ECOFF_DEBUGGING)
4549 ecoff_directive_frame (0);
4551 discard_rest_of_line ();
4555 s_alpha_prologue (ignore)
4556 int ignore ATTRIBUTE_UNUSED;
4561 arg = get_absolute_expression ();
4562 demand_empty_rest_of_line ();
4564 if (ECOFF_DEBUGGING)
4565 sym = ecoff_get_cur_proc_sym ();
4567 sym = alpha_cur_ent_sym;
4572 case 0: /* No PV required. */
4573 S_SET_OTHER (sym, STO_ALPHA_NOPV
4574 | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
4576 case 1: /* Std GP load. */
4577 S_SET_OTHER (sym, STO_ALPHA_STD_GPLOAD
4578 | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
4580 case 2: /* Non-std use of PV. */
4584 as_bad (_("Invalid argument %d to .prologue."), arg);
4589 static char *first_file_directive;
4592 s_alpha_file (ignore)
4593 int ignore ATTRIBUTE_UNUSED;
4595 /* Save the first .file directive we see, so that we can change our
4596 minds about whether ecoff debugging should or shouldn't be enabled. */
4597 if (alpha_flag_mdebug < 0 && ! first_file_directive)
4599 char *start = input_line_pointer;
4602 discard_rest_of_line ();
4604 len = input_line_pointer - start;
4605 first_file_directive = xmalloc (len + 1);
4606 memcpy (first_file_directive, start, len);
4607 first_file_directive[len] = '\0';
4609 input_line_pointer = start;
4612 if (ECOFF_DEBUGGING)
4613 ecoff_directive_file (0);
4615 dwarf2_directive_file (0);
4619 s_alpha_loc (ignore)
4620 int ignore ATTRIBUTE_UNUSED;
4622 if (ECOFF_DEBUGGING)
4623 ecoff_directive_loc (0);
4625 dwarf2_directive_loc (0);
4632 /* If we've been undecided about mdebug, make up our minds in favour. */
4633 if (alpha_flag_mdebug < 0)
4635 segT sec = subseg_new (".mdebug", 0);
4636 bfd_set_section_flags (stdoutput, sec, SEC_HAS_CONTENTS | SEC_READONLY);
4637 bfd_set_section_alignment (stdoutput, sec, 3);
4639 ecoff_read_begin_hook ();
4641 if (first_file_directive)
4643 char *save_ilp = input_line_pointer;
4644 input_line_pointer = first_file_directive;
4645 ecoff_directive_file (0);
4646 input_line_pointer = save_ilp;
4647 free (first_file_directive);
4650 alpha_flag_mdebug = 1;
4656 s_alpha_coff_wrapper (which)
4659 static void (* const fns[]) PARAMS ((int)) = {
4660 ecoff_directive_begin,
4661 ecoff_directive_bend,
4662 ecoff_directive_def,
4663 ecoff_directive_dim,
4664 ecoff_directive_endef,
4665 ecoff_directive_scl,
4666 ecoff_directive_tag,
4667 ecoff_directive_val,
4670 assert (which >= 0 && which < (int) (sizeof (fns)/sizeof (*fns)));
4672 if (ECOFF_DEBUGGING)
4676 as_bad (_("ECOFF debugging is disabled."));
4677 ignore_rest_of_line ();
4680 #endif /* OBJ_ELF */
4684 /* Handle the section specific pseudo-op. */
4687 s_alpha_section (secid)
4691 #define EVAX_SECTION_COUNT 5
4692 static char *section_name[EVAX_SECTION_COUNT + 1] =
4693 { "NULL", ".rdata", ".comm", ".link", ".ctors", ".dtors" };
4695 if ((secid <= 0) || (secid > EVAX_SECTION_COUNT))
4697 as_fatal (_("Unknown section directive"));
4698 demand_empty_rest_of_line ();
4701 temp = get_absolute_expression ();
4702 subseg_new (section_name[secid], 0);
4703 demand_empty_rest_of_line ();
4704 alpha_insn_label = NULL;
4705 alpha_auto_align_on = 1;
4706 alpha_current_align = 0;
4709 /* Parse .ent directives. */
4712 s_alpha_ent (ignore)
4716 expressionS symexpr;
4718 alpha_evax_proc.pdsckind = 0;
4719 alpha_evax_proc.framereg = -1;
4720 alpha_evax_proc.framesize = 0;
4721 alpha_evax_proc.rsa_offset = 0;
4722 alpha_evax_proc.ra_save = AXP_REG_RA;
4723 alpha_evax_proc.fp_save = -1;
4724 alpha_evax_proc.imask = 0;
4725 alpha_evax_proc.fmask = 0;
4726 alpha_evax_proc.prologue = 0;
4727 alpha_evax_proc.type = 0;
4729 expression (&symexpr);
4731 if (symexpr.X_op != O_symbol)
4733 as_fatal (_(".ent directive has no symbol"));
4734 demand_empty_rest_of_line ();
4738 symbol = make_expr_symbol (&symexpr);
4739 symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
4740 alpha_evax_proc.symbol = symbol;
4742 demand_empty_rest_of_line ();
4746 /* Parse .frame <framreg>,<framesize>,RA,<rsa_offset> directives. */
4749 s_alpha_frame (ignore)
4754 alpha_evax_proc.framereg = tc_get_register (1);
4757 if (*input_line_pointer++ != ','
4758 || get_absolute_expression_and_terminator (&val) != ',')
4760 as_warn (_("Bad .frame directive 1./2. param"));
4761 --input_line_pointer;
4762 demand_empty_rest_of_line ();
4766 alpha_evax_proc.framesize = val;
4768 (void) tc_get_register (1);
4770 if (*input_line_pointer++ != ',')
4772 as_warn (_("Bad .frame directive 3./4. param"));
4773 --input_line_pointer;
4774 demand_empty_rest_of_line ();
4777 alpha_evax_proc.rsa_offset = get_absolute_expression ();
4783 s_alpha_pdesc (ignore)
4793 segment_info_type *seginfo = seg_info (alpha_link_section);
4795 if (now_seg != alpha_link_section)
4797 as_bad (_(".pdesc directive not in link (.link) section"));
4798 demand_empty_rest_of_line ();
4802 if ((alpha_evax_proc.symbol == 0)
4803 || (!S_IS_DEFINED (alpha_evax_proc.symbol)))
4805 as_fatal (_(".pdesc has no matching .ent"));
4806 demand_empty_rest_of_line ();
4810 *symbol_get_obj (alpha_evax_proc.symbol) =
4811 (valueT) seginfo->literal_pool_size;
4814 if (exp.X_op != O_symbol)
4816 as_warn (_(".pdesc directive has no entry symbol"));
4817 demand_empty_rest_of_line ();
4821 entry_sym = make_expr_symbol (&exp);
4822 /* Save bfd symbol of proc desc in function symbol. */
4823 symbol_get_bfdsym (alpha_evax_proc.symbol)->udata.p
4824 = symbol_get_bfdsym (entry_sym);
4827 if (*input_line_pointer++ != ',')
4829 as_warn (_("No comma after .pdesc <entryname>"));
4830 demand_empty_rest_of_line ();
4835 name = input_line_pointer;
4836 name_end = get_symbol_end ();
4838 if (strncmp (name, "stack", 5) == 0)
4840 alpha_evax_proc.pdsckind = PDSC_S_K_KIND_FP_STACK;
4842 else if (strncmp (name, "reg", 3) == 0)
4844 alpha_evax_proc.pdsckind = PDSC_S_K_KIND_FP_REGISTER;
4846 else if (strncmp (name, "null", 4) == 0)
4848 alpha_evax_proc.pdsckind = PDSC_S_K_KIND_NULL;
4852 as_fatal (_("unknown procedure kind"));
4853 demand_empty_rest_of_line ();
4857 *input_line_pointer = name_end;
4858 demand_empty_rest_of_line ();
4860 #ifdef md_flush_pending_output
4861 md_flush_pending_output ();
4864 frag_align (3, 0, 0);
4866 fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
4868 seginfo->literal_pool_size += 16;
4870 *p = alpha_evax_proc.pdsckind
4871 | ((alpha_evax_proc.framereg == 29) ? PDSC_S_M_BASE_REG_IS_FP : 0);
4872 *(p + 1) = PDSC_S_M_NATIVE | PDSC_S_M_NO_JACKET;
4874 switch (alpha_evax_proc.pdsckind)
4876 case PDSC_S_K_KIND_NULL:
4880 case PDSC_S_K_KIND_FP_REGISTER:
4881 *(p + 2) = alpha_evax_proc.fp_save;
4882 *(p + 3) = alpha_evax_proc.ra_save;
4884 case PDSC_S_K_KIND_FP_STACK:
4885 md_number_to_chars (p + 2, (valueT) alpha_evax_proc.rsa_offset, 2);
4887 default: /* impossible */
4892 *(p + 5) = alpha_evax_proc.type & 0x0f;
4894 /* Signature offset. */
4895 md_number_to_chars (p + 6, (valueT) 0, 2);
4897 fix_new_exp (frag_now, p - frag_now->fr_literal+8, 8, &exp, 0, BFD_RELOC_64);
4899 if (alpha_evax_proc.pdsckind == PDSC_S_K_KIND_NULL)
4902 /* Add dummy fix to make add_to_link_pool work. */
4904 fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
4906 seginfo->literal_pool_size += 8;
4908 /* pdesc+16: Size. */
4909 md_number_to_chars (p, (valueT) alpha_evax_proc.framesize, 4);
4911 md_number_to_chars (p + 4, (valueT) 0, 2);
4914 md_number_to_chars (p + 6, alpha_evax_proc.prologue, 2);
4916 if (alpha_evax_proc.pdsckind == PDSC_S_K_KIND_FP_REGISTER)
4919 /* Add dummy fix to make add_to_link_pool work. */
4921 fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
4923 seginfo->literal_pool_size += 8;
4925 /* pdesc+24: register masks. */
4927 md_number_to_chars (p, alpha_evax_proc.imask, 4);
4928 md_number_to_chars (p + 4, alpha_evax_proc.fmask, 4);
4933 /* Support for crash debug on vms. */
4936 s_alpha_name (ignore)
4941 segment_info_type *seginfo = seg_info (alpha_link_section);
4943 if (now_seg != alpha_link_section)
4945 as_bad (_(".name directive not in link (.link) section"));
4946 demand_empty_rest_of_line ();
4951 if (exp.X_op != O_symbol)
4953 as_warn (_(".name directive has no symbol"));
4954 demand_empty_rest_of_line ();
4958 demand_empty_rest_of_line ();
4960 #ifdef md_flush_pending_output
4961 md_flush_pending_output ();
4964 frag_align (3, 0, 0);
4966 seginfo->literal_pool_size += 8;
4968 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &exp, 0, BFD_RELOC_64);
4974 s_alpha_linkage (ignore)
4980 #ifdef md_flush_pending_output
4981 md_flush_pending_output ();
4985 if (exp.X_op != O_symbol)
4987 as_fatal (_("No symbol after .linkage"));
4991 p = frag_more (LKP_S_K_SIZE);
4992 memset (p, 0, LKP_S_K_SIZE);
4993 fix_new_exp (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,\
4994 BFD_RELOC_ALPHA_LINKAGE);
4996 demand_empty_rest_of_line ();
5002 s_alpha_code_address (ignore)
5008 #ifdef md_flush_pending_output
5009 md_flush_pending_output ();
5013 if (exp.X_op != O_symbol)
5015 as_fatal (_("No symbol after .code_address"));
5021 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &exp, 0,\
5022 BFD_RELOC_ALPHA_CODEADDR);
5024 demand_empty_rest_of_line ();
5030 s_alpha_fp_save (ignore)
5034 alpha_evax_proc.fp_save = tc_get_register (1);
5036 demand_empty_rest_of_line ();
5041 s_alpha_mask (ignore)
5046 if (get_absolute_expression_and_terminator (&val) != ',')
5048 as_warn (_("Bad .mask directive"));
5049 --input_line_pointer;
5053 alpha_evax_proc.imask = val;
5054 (void) get_absolute_expression ();
5056 demand_empty_rest_of_line ();
5062 s_alpha_fmask (ignore)
5067 if (get_absolute_expression_and_terminator (&val) != ',')
5069 as_warn (_("Bad .fmask directive"));
5070 --input_line_pointer;
5074 alpha_evax_proc.fmask = val;
5075 (void) get_absolute_expression ();
5077 demand_empty_rest_of_line ();
5083 s_alpha_end (ignore)
5088 c = get_symbol_end ();
5089 *input_line_pointer = c;
5090 demand_empty_rest_of_line ();
5091 alpha_evax_proc.symbol = 0;
5097 s_alpha_file (ignore)
5102 static char case_hack[32];
5104 extern char *demand_copy_string PARAMS ((int *lenP));
5106 sprintf (case_hack, "<CASE:%01d%01d>",
5107 alpha_flag_hash_long_names, alpha_flag_show_after_trunc);
5109 s = symbol_find_or_make (case_hack);
5110 symbol_get_bfdsym (s)->flags |= BSF_FILE;
5112 get_absolute_expression ();
5113 s = symbol_find_or_make (demand_copy_string (&length));
5114 symbol_get_bfdsym (s)->flags |= BSF_FILE;
5115 demand_empty_rest_of_line ();
5119 #endif /* OBJ_EVAX */
5121 /* Handle the .gprel32 pseudo op. */
5124 s_alpha_gprel32 (ignore)
5125 int ignore ATTRIBUTE_UNUSED;
5137 e.X_add_symbol = section_symbol (absolute_section);
5150 e.X_add_symbol = section_symbol (absolute_section);
5153 e.X_op = O_subtract;
5154 e.X_op_symbol = alpha_gp_symbol;
5162 if (alpha_auto_align_on && alpha_current_align < 2)
5163 alpha_align (2, (char *) NULL, alpha_insn_label, 0);
5164 if (alpha_current_align > 2)
5165 alpha_current_align = 2;
5166 alpha_insn_label = NULL;
5170 fix_new_exp (frag_now, p - frag_now->fr_literal, 4,
5171 &e, 0, BFD_RELOC_GPREL32);
5174 /* Handle floating point allocation pseudo-ops. This is like the
5175 generic vresion, but it makes sure the current label, if any, is
5176 correctly aligned. */
5179 s_alpha_float_cons (type)
5206 if (alpha_auto_align_on && alpha_current_align < log_size)
5207 alpha_align (log_size, (char *) NULL, alpha_insn_label, 0);
5208 if (alpha_current_align > log_size)
5209 alpha_current_align = log_size;
5210 alpha_insn_label = NULL;
5215 /* Handle the .proc pseudo op. We don't really do much with it except
5219 s_alpha_proc (is_static)
5220 int is_static ATTRIBUTE_UNUSED;
5228 /* Takes ".proc name,nargs" */
5230 name = input_line_pointer;
5231 c = get_symbol_end ();
5232 p = input_line_pointer;
5233 symbolP = symbol_find_or_make (name);
5236 if (*input_line_pointer != ',')
5239 as_warn (_("Expected comma after name \"%s\""), name);
5242 ignore_rest_of_line ();
5246 input_line_pointer++;
5247 temp = get_absolute_expression ();
5249 /* *symbol_get_obj (symbolP) = (signed char) temp; */
5250 as_warn (_("unhandled: .proc %s,%d"), name, temp);
5251 demand_empty_rest_of_line ();
5254 /* Handle the .set pseudo op. This is used to turn on and off most of
5255 the assembler features. */
5259 int x ATTRIBUTE_UNUSED;
5265 name = input_line_pointer;
5266 ch = get_symbol_end ();
5269 if (s[0] == 'n' && s[1] == 'o')
5274 if (!strcmp ("reorder", s))
5276 else if (!strcmp ("at", s))
5277 alpha_noat_on = !yesno;
5278 else if (!strcmp ("macro", s))
5279 alpha_macros_on = yesno;
5280 else if (!strcmp ("move", s))
5282 else if (!strcmp ("volatile", s))
5285 as_warn (_("Tried to .set unrecognized mode `%s'"), name);
5287 *input_line_pointer = ch;
5288 demand_empty_rest_of_line ();
5291 /* Handle the .base pseudo op. This changes the assembler's notion of
5292 the $gp register. */
5295 s_alpha_base (ignore)
5296 int ignore ATTRIBUTE_UNUSED;
5299 if (first_32bit_quadrant)
5301 /* not fatal, but it might not work in the end */
5302 as_warn (_("File overrides no-base-register option."));
5303 first_32bit_quadrant = 0;
5308 if (*input_line_pointer == '$')
5310 input_line_pointer++;
5311 if (*input_line_pointer == 'r')
5312 input_line_pointer++;
5315 alpha_gp_register = get_absolute_expression ();
5316 if (alpha_gp_register < 0 || alpha_gp_register > 31)
5318 alpha_gp_register = AXP_REG_GP;
5319 as_warn (_("Bad base register, using $%d."), alpha_gp_register);
5322 demand_empty_rest_of_line ();
5325 /* Handle the .align pseudo-op. This aligns to a power of two. It
5326 also adjusts any current instruction label. We treat this the same
5327 way the MIPS port does: .align 0 turns off auto alignment. */
5330 s_alpha_align (ignore)
5331 int ignore ATTRIBUTE_UNUSED;
5335 long max_alignment = 15;
5337 align = get_absolute_expression ();
5338 if (align > max_alignment)
5340 align = max_alignment;
5341 as_bad (_("Alignment too large: %d. assumed"), align);
5345 as_warn (_("Alignment negative: 0 assumed"));
5349 if (*input_line_pointer == ',')
5351 input_line_pointer++;
5352 fill = get_absolute_expression ();
5360 alpha_auto_align_on = 1;
5361 alpha_align (align, pfill, alpha_insn_label, 1);
5365 alpha_auto_align_on = 0;
5368 demand_empty_rest_of_line ();
5371 /* Hook the normal string processor to reset known alignment. */
5374 s_alpha_stringer (terminate)
5377 alpha_current_align = 0;
5378 alpha_insn_label = NULL;
5379 stringer (terminate);
5382 /* Hook the normal space processing to reset known alignment. */
5385 s_alpha_space (ignore)
5388 alpha_current_align = 0;
5389 alpha_insn_label = NULL;
5393 /* Hook into cons for auto-alignment. */
5396 alpha_cons_align (size)
5402 while ((size >>= 1) != 0)
5405 if (alpha_auto_align_on && alpha_current_align < log_size)
5406 alpha_align (log_size, (char *) NULL, alpha_insn_label, 0);
5407 if (alpha_current_align > log_size)
5408 alpha_current_align = log_size;
5409 alpha_insn_label = NULL;
5412 /* Here come the .uword, .ulong, and .uquad explicitly unaligned
5413 pseudos. We just turn off auto-alignment and call down to cons. */
5416 s_alpha_ucons (bytes)
5419 int hold = alpha_auto_align_on;
5420 alpha_auto_align_on = 0;
5422 alpha_auto_align_on = hold;
5425 /* Switch the working cpu type. */
5428 s_alpha_arch (ignored)
5429 int ignored ATTRIBUTE_UNUSED;
5432 const struct cpu_type *p;
5435 name = input_line_pointer;
5436 ch = get_symbol_end ();
5438 for (p = cpu_types; p->name; ++p)
5439 if (strcmp (name, p->name) == 0)
5441 alpha_target_name = p->name, alpha_target = p->flags;
5444 as_warn ("Unknown CPU identifier `%s'", name);
5447 *input_line_pointer = ch;
5448 demand_empty_rest_of_line ();
5452 /* print token expression with alpha specific extension. */
5455 alpha_print_token (f, exp)
5457 const expressionS *exp;
5467 expressionS nexp = *exp;
5468 nexp.X_op = O_register;
5469 print_expr (f, &nexp);
5474 print_expr (f, exp);
5481 /* The target specific pseudo-ops which we support. */
5483 const pseudo_typeS md_pseudo_table[] = {
5485 {"comm", s_alpha_comm, 0}, /* osf1 compiler does this */
5486 {"rdata", s_alpha_rdata, 0},
5488 {"text", s_alpha_text, 0},
5489 {"data", s_alpha_data, 0},
5491 {"sdata", s_alpha_sdata, 0},
5494 {"section", s_alpha_section, 0},
5495 {"section.s", s_alpha_section, 0},
5496 {"sect", s_alpha_section, 0},
5497 {"sect.s", s_alpha_section, 0},
5500 { "pdesc", s_alpha_pdesc, 0},
5501 { "name", s_alpha_name, 0},
5502 { "linkage", s_alpha_linkage, 0},
5503 { "code_address", s_alpha_code_address, 0},
5504 { "ent", s_alpha_ent, 0},
5505 { "frame", s_alpha_frame, 0},
5506 { "fp_save", s_alpha_fp_save, 0},
5507 { "mask", s_alpha_mask, 0},
5508 { "fmask", s_alpha_fmask, 0},
5509 { "end", s_alpha_end, 0},
5510 { "file", s_alpha_file, 0},
5511 { "rdata", s_alpha_section, 1},
5512 { "comm", s_alpha_comm, 0},
5513 { "link", s_alpha_section, 3},
5514 { "ctors", s_alpha_section, 4},
5515 { "dtors", s_alpha_section, 5},
5518 /* Frame related pseudos. */
5519 {"ent", s_alpha_ent, 0},
5520 {"end", s_alpha_end, 0},
5521 {"mask", s_alpha_mask, 0},
5522 {"fmask", s_alpha_mask, 1},
5523 {"frame", s_alpha_frame, 0},
5524 {"prologue", s_alpha_prologue, 0},
5525 {"file", s_alpha_file, 5},
5526 {"loc", s_alpha_loc, 9},
5527 {"stabs", s_alpha_stab, 's'},
5528 {"stabn", s_alpha_stab, 'n'},
5529 /* COFF debugging related pseudos. */
5530 {"begin", s_alpha_coff_wrapper, 0},
5531 {"bend", s_alpha_coff_wrapper, 1},
5532 {"def", s_alpha_coff_wrapper, 2},
5533 {"dim", s_alpha_coff_wrapper, 3},
5534 {"endef", s_alpha_coff_wrapper, 4},
5535 {"scl", s_alpha_coff_wrapper, 5},
5536 {"tag", s_alpha_coff_wrapper, 6},
5537 {"val", s_alpha_coff_wrapper, 7},
5539 {"prologue", s_ignore, 0},
5541 {"gprel32", s_alpha_gprel32, 0},
5542 {"t_floating", s_alpha_float_cons, 'd'},
5543 {"s_floating", s_alpha_float_cons, 'f'},
5544 {"f_floating", s_alpha_float_cons, 'F'},
5545 {"g_floating", s_alpha_float_cons, 'G'},
5546 {"d_floating", s_alpha_float_cons, 'D'},
5548 {"proc", s_alpha_proc, 0},
5549 {"aproc", s_alpha_proc, 1},
5550 {"set", s_alpha_set, 0},
5551 {"reguse", s_ignore, 0},
5552 {"livereg", s_ignore, 0},
5553 {"base", s_alpha_base, 0}, /*??*/
5554 {"option", s_ignore, 0},
5555 {"aent", s_ignore, 0},
5556 {"ugen", s_ignore, 0},
5557 {"eflag", s_ignore, 0},
5559 {"align", s_alpha_align, 0},
5560 {"double", s_alpha_float_cons, 'd'},
5561 {"float", s_alpha_float_cons, 'f'},
5562 {"single", s_alpha_float_cons, 'f'},
5563 {"ascii", s_alpha_stringer, 0},
5564 {"asciz", s_alpha_stringer, 1},
5565 {"string", s_alpha_stringer, 1},
5566 {"space", s_alpha_space, 0},
5567 {"skip", s_alpha_space, 0},
5568 {"zero", s_alpha_space, 0},
5570 /* Unaligned data pseudos. */
5571 {"uword", s_alpha_ucons, 2},
5572 {"ulong", s_alpha_ucons, 4},
5573 {"uquad", s_alpha_ucons, 8},
5576 /* Dwarf wants these versions of unaligned. */
5577 {"2byte", s_alpha_ucons, 2},
5578 {"4byte", s_alpha_ucons, 4},
5579 {"8byte", s_alpha_ucons, 8},
5582 /* We don't do any optimizing, so we can safely ignore these. */
5583 {"noalias", s_ignore, 0},
5584 {"alias", s_ignore, 0},
5586 {"arch", s_alpha_arch, 0},
5591 /* Build a BFD section with its flags set appropriately for the .lita,
5592 .lit8, or .lit4 sections. */
5595 create_literal_section (name, secp, symp)
5600 segT current_section = now_seg;
5601 int current_subsec = now_subseg;
5604 *secp = new_sec = subseg_new (name, 0);
5605 subseg_set (current_section, current_subsec);
5606 bfd_set_section_alignment (stdoutput, new_sec, 4);
5607 bfd_set_section_flags (stdoutput, new_sec,
5608 SEC_RELOC | SEC_ALLOC | SEC_LOAD | SEC_READONLY
5611 S_CLEAR_EXTERNAL (*symp = section_symbol (new_sec));
5616 /* @@@ GP selection voodoo. All of this seems overly complicated and
5617 unnecessary; which is the primary reason it's for ECOFF only. */
5626 vma = bfd_get_section_vma (foo, sec);
5627 if (vma && vma < alpha_gp_value)
5628 alpha_gp_value = vma;
5634 assert (alpha_gp_value == 0);
5636 /* Get minus-one in whatever width... */
5640 /* Select the smallest VMA of these existing sections. */
5641 maybe_set_gp (alpha_lita_section);
5643 /* These were disabled before -- should we use them? */
5644 maybe_set_gp (sdata);
5645 maybe_set_gp (lit8_sec);
5646 maybe_set_gp (lit4_sec);
5649 /* @@ Will a simple 0x8000 work here? If not, why not? */
5650 #define GP_ADJUSTMENT (0x8000 - 0x10)
5652 alpha_gp_value += GP_ADJUSTMENT;
5654 S_SET_VALUE (alpha_gp_symbol, alpha_gp_value);
5657 printf (_("Chose GP value of %lx\n"), alpha_gp_value);
5660 #endif /* OBJ_ECOFF */
5662 /* Called internally to handle all alignment needs. This takes care
5663 of eliding calls to frag_align if'n the cached current alignment
5664 says we've already got it, as well as taking care of the auto-align
5665 feature wrt labels. */
5668 alpha_align (n, pfill, label, force)
5672 int force ATTRIBUTE_UNUSED;
5674 if (alpha_current_align >= n)
5679 if (subseg_text_p (now_seg))
5680 frag_align_code (n, 0);
5682 frag_align (n, 0, 0);
5685 frag_align (n, *pfill, 0);
5687 alpha_current_align = n;
5689 if (label != NULL && S_GET_SEGMENT (label) == now_seg)
5691 symbol_set_frag (label, frag_now);
5692 S_SET_VALUE (label, (valueT) frag_now_fix ());
5695 record_alignment (now_seg, n);
5697 /* ??? If alpha_flag_relax && force && elf, record the requested alignment
5698 in a reloc for the linker to see. */
5701 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
5702 of an rs_align_code fragment. */
5705 alpha_handle_align (fragp)
5708 static char const unop[4] = { 0x00, 0x00, 0xe0, 0x2f };
5709 static char const nopunop[8] = {
5710 0x1f, 0x04, 0xff, 0x47,
5711 0x00, 0x00, 0xe0, 0x2f
5717 if (fragp->fr_type != rs_align_code)
5720 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
5721 p = fragp->fr_literal + fragp->fr_fix;
5734 memcpy (p, unop, 4);
5740 memcpy (p, nopunop, 8);
5742 fragp->fr_fix += fix;
5746 /* The Alpha has support for some VAX floating point types, as well as for
5747 IEEE floating point. We consider IEEE to be the primary floating point
5748 format, and sneak in the VAX floating point support here. */
5749 #define md_atof vax_md_atof
5750 #include "config/atof-vax.c"