Move struc-symbol.h to symbols.c
[external/binutils.git] / gas / config / tc-alpha.c
1 /* tc-alpha.c - Processor-specific code for the DEC Alpha AXP CPU.
2    Copyright (C) 1989-2018 Free Software Foundation, Inc.
3    Contributed by Carnegie Mellon University, 1993.
4    Written by Alessandro Forin, based on earlier gas-1.38 target CPU files.
5    Modified by Ken Raeburn for gas-2.x and ECOFF support.
6    Modified by Richard Henderson for ELF support.
7    Modified by Klaus K"ampf for EVAX (OpenVMS/Alpha) support.
8
9    This file is part of GAS, the GNU Assembler.
10
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3, or (at your option)
14    any later version.
15
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25
26 /* Mach Operating System
27    Copyright (c) 1993 Carnegie Mellon University
28    All Rights Reserved.
29
30    Permission to use, copy, modify and distribute this software and its
31    documentation is hereby granted, provided that both the copyright
32    notice and this permission notice appear in all copies of the
33    software, derivative works or modified versions, and any portions
34    thereof, and that both notices appear in supporting documentation.
35
36    CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
37    CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38    ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39
40    Carnegie Mellon requests users of this software to return to
41
42     Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
43     School of Computer Science
44     Carnegie Mellon University
45     Pittsburgh PA 15213-3890
46
47    any improvements or extensions that they make and grant Carnegie the
48    rights to redistribute these changes.  */
49
50 #include "as.h"
51 #include "subsegs.h"
52 #include "ecoff.h"
53
54 #include "opcode/alpha.h"
55
56 #ifdef OBJ_ELF
57 #include "elf/alpha.h"
58 #endif
59
60 #ifdef OBJ_EVAX
61 #include "vms.h"
62 #include "vms/egps.h"
63 #endif
64
65 #include "dwarf2dbg.h"
66 #include "dw2gencfi.h"
67 #include "safe-ctype.h"
68 \f
69 /* Local types.  */
70
71 #define TOKENIZE_ERROR          -1
72 #define TOKENIZE_ERROR_REPORT   -2
73 #define MAX_INSN_FIXUPS          2
74 #define MAX_INSN_ARGS            5
75
76 /* Used since new relocation types are introduced in this
77    file (DUMMY_RELOC_LITUSE_*) */
78 typedef int extended_bfd_reloc_code_real_type;
79
80 struct alpha_fixup
81 {
82   expressionS exp;
83   /* bfd_reloc_code_real_type reloc; */
84   extended_bfd_reloc_code_real_type reloc;
85 #ifdef OBJ_EVAX
86   /* The symbol of the item in the linkage section.  */
87   symbolS *xtrasym;
88
89   /* The symbol of the procedure descriptor.  */
90   symbolS *procsym;
91 #endif
92 };
93
94 struct alpha_insn
95 {
96   unsigned insn;
97   int nfixups;
98   struct alpha_fixup fixups[MAX_INSN_FIXUPS];
99   long sequence;
100 };
101
102 enum alpha_macro_arg
103   {
104     MACRO_EOA = 1,
105     MACRO_IR,
106     MACRO_PIR,
107     MACRO_OPIR,
108     MACRO_CPIR,
109     MACRO_FPR,
110     MACRO_EXP
111   };
112
113 struct alpha_macro
114 {
115   const char *name;
116   void (*emit) (const expressionS *, int, const void *);
117   const void * arg;
118   enum alpha_macro_arg argsets[16];
119 };
120
121 /* Extra expression types.  */
122
123 #define O_pregister     O_md1   /* O_register, in parentheses.  */
124 #define O_cpregister    O_md2   /* + a leading comma.  */
125
126 /* The alpha_reloc_op table below depends on the ordering of these.  */
127 #define O_literal       O_md3           /* !literal relocation.  */
128 #define O_lituse_addr   O_md4           /* !lituse_addr relocation.  */
129 #define O_lituse_base   O_md5           /* !lituse_base relocation.  */
130 #define O_lituse_bytoff O_md6           /* !lituse_bytoff relocation.  */
131 #define O_lituse_jsr    O_md7           /* !lituse_jsr relocation.  */
132 #define O_lituse_tlsgd  O_md8           /* !lituse_tlsgd relocation.  */
133 #define O_lituse_tlsldm O_md9           /* !lituse_tlsldm relocation.  */
134 #define O_lituse_jsrdirect O_md10       /* !lituse_jsrdirect relocation.  */
135 #define O_gpdisp        O_md11          /* !gpdisp relocation.  */
136 #define O_gprelhigh     O_md12          /* !gprelhigh relocation.  */
137 #define O_gprellow      O_md13          /* !gprellow relocation.  */
138 #define O_gprel         O_md14          /* !gprel relocation.  */
139 #define O_samegp        O_md15          /* !samegp relocation.  */
140 #define O_tlsgd         O_md16          /* !tlsgd relocation.  */
141 #define O_tlsldm        O_md17          /* !tlsldm relocation.  */
142 #define O_gotdtprel     O_md18          /* !gotdtprel relocation.  */
143 #define O_dtprelhi      O_md19          /* !dtprelhi relocation.  */
144 #define O_dtprello      O_md20          /* !dtprello relocation.  */
145 #define O_dtprel        O_md21          /* !dtprel relocation.  */
146 #define O_gottprel      O_md22          /* !gottprel relocation.  */
147 #define O_tprelhi       O_md23          /* !tprelhi relocation.  */
148 #define O_tprello       O_md24          /* !tprello relocation.  */
149 #define O_tprel         O_md25          /* !tprel relocation.  */
150
151 #define DUMMY_RELOC_LITUSE_ADDR         (BFD_RELOC_UNUSED + 1)
152 #define DUMMY_RELOC_LITUSE_BASE         (BFD_RELOC_UNUSED + 2)
153 #define DUMMY_RELOC_LITUSE_BYTOFF       (BFD_RELOC_UNUSED + 3)
154 #define DUMMY_RELOC_LITUSE_JSR          (BFD_RELOC_UNUSED + 4)
155 #define DUMMY_RELOC_LITUSE_TLSGD        (BFD_RELOC_UNUSED + 5)
156 #define DUMMY_RELOC_LITUSE_TLSLDM       (BFD_RELOC_UNUSED + 6)
157 #define DUMMY_RELOC_LITUSE_JSRDIRECT    (BFD_RELOC_UNUSED + 7)
158
159 #define USER_RELOC_P(R) ((R) >= O_literal && (R) <= O_tprel)
160
161 /* Macros for extracting the type and number of encoded register tokens.  */
162
163 #define is_ir_num(x)            (((x) & 32) == 0)
164 #define is_fpr_num(x)           (((x) & 32) != 0)
165 #define regno(x)                ((x) & 31)
166
167 /* Something odd inherited from the old assembler.  */
168
169 #define note_gpreg(R)           (alpha_gprmask |= (1 << (R)))
170 #define note_fpreg(R)           (alpha_fprmask |= (1 << (R)))
171
172 /* Predicates for 16- and 32-bit ranges */
173 /* XXX: The non-shift version appears to trigger a compiler bug when
174    cross-assembling from x86 w/ gcc 2.7.2.  */
175
176 #if 1
177 #define range_signed_16(x) \
178         (((offsetT) (x) >> 15) == 0 || ((offsetT) (x) >> 15) == -1)
179 #define range_signed_32(x) \
180         (((offsetT) (x) >> 31) == 0 || ((offsetT) (x) >> 31) == -1)
181 #else
182 #define range_signed_16(x)      ((offsetT) (x) >= -(offsetT) 0x8000 &&  \
183                                  (offsetT) (x) <=  (offsetT) 0x7FFF)
184 #define range_signed_32(x)      ((offsetT) (x) >= -(offsetT) 0x80000000 && \
185                                  (offsetT) (x) <=  (offsetT) 0x7FFFFFFF)
186 #endif
187
188 /* Macros for sign extending from 16- and 32-bits.  */
189 /* XXX: The cast macros will work on all the systems that I care about,
190    but really a predicate should be found to use the non-cast forms.  */
191
192 #if 1
193 #define sign_extend_16(x)       ((short) (x))
194 #define sign_extend_32(x)       ((int) (x))
195 #else
196 #define sign_extend_16(x)       ((offsetT) (((x) & 0xFFFF) ^ 0x8000) - 0x8000)
197 #define sign_extend_32(x)       ((offsetT) (((x) & 0xFFFFFFFF) \
198                                            ^ 0x80000000) - 0x80000000)
199 #endif
200
201 /* Macros to build tokens.  */
202
203 #define set_tok_reg(t, r)       (memset (&(t), 0, sizeof (t)),          \
204                                  (t).X_op = O_register,                 \
205                                  (t).X_add_number = (r))
206 #define set_tok_preg(t, r)      (memset (&(t), 0, sizeof (t)),          \
207                                  (t).X_op = O_pregister,                \
208                                  (t).X_add_number = (r))
209 #define set_tok_cpreg(t, r)     (memset (&(t), 0, sizeof (t)),          \
210                                  (t).X_op = O_cpregister,               \
211                                  (t).X_add_number = (r))
212 #define set_tok_freg(t, r)      (memset (&(t), 0, sizeof (t)),          \
213                                  (t).X_op = O_register,                 \
214                                  (t).X_add_number = (r) + 32)
215 #define set_tok_sym(t, s, a)    (memset (&(t), 0, sizeof (t)),          \
216                                  (t).X_op = O_symbol,                   \
217                                  (t).X_add_symbol = (s),                \
218                                  (t).X_add_number = (a))
219 #define set_tok_const(t, n)     (memset (&(t), 0, sizeof (t)),          \
220                                  (t).X_op = O_constant,                 \
221                                  (t).X_add_number = (n))
222 \f
223 /* Generic assembler global variables which must be defined by all
224    targets.  */
225
226 /* Characters which always start a comment.  */
227 const char comment_chars[] = "#";
228
229 /* Characters which start a comment at the beginning of a line.  */
230 const char line_comment_chars[] = "#";
231
232 /* Characters which may be used to separate multiple commands on a
233    single line.  */
234 const char line_separator_chars[] = ";";
235
236 /* Characters which are used to indicate an exponent in a floating
237    point number.  */
238 const char EXP_CHARS[] = "eE";
239
240 /* Characters which mean that a number is a floating point constant,
241    as in 0d1.0.  */
242 /* XXX: Do all of these really get used on the alpha??  */
243 const char FLT_CHARS[] = "rRsSfFdDxXpP";
244
245 #ifdef OBJ_EVAX
246 const char *md_shortopts = "Fm:g+1h:HG:";
247 #else
248 const char *md_shortopts = "Fm:gG:";
249 #endif
250
251 struct option md_longopts[] =
252   {
253 #define OPTION_32ADDR (OPTION_MD_BASE)
254     { "32addr", no_argument, NULL, OPTION_32ADDR },
255 #define OPTION_RELAX (OPTION_32ADDR + 1)
256     { "relax", no_argument, NULL, OPTION_RELAX },
257 #ifdef OBJ_ELF
258 #define OPTION_MDEBUG (OPTION_RELAX + 1)
259 #define OPTION_NO_MDEBUG (OPTION_MDEBUG + 1)
260     { "mdebug", no_argument, NULL, OPTION_MDEBUG },
261     { "no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG },
262 #endif
263 #ifdef OBJ_EVAX
264 #define OPTION_REPLACE (OPTION_RELAX + 1)
265 #define OPTION_NOREPLACE (OPTION_REPLACE+1)
266     { "replace", no_argument, NULL, OPTION_REPLACE },
267     { "noreplace", no_argument, NULL, OPTION_NOREPLACE },
268 #endif
269     { NULL, no_argument, NULL, 0 }
270   };
271
272 size_t md_longopts_size = sizeof (md_longopts);
273 \f
274 #ifdef OBJ_EVAX
275 #define AXP_REG_R0     0
276 #define AXP_REG_R16    16
277 #define AXP_REG_R17    17
278 #undef AXP_REG_T9
279 #define AXP_REG_T9     22
280 #undef AXP_REG_T10
281 #define AXP_REG_T10    23
282 #undef AXP_REG_T11
283 #define AXP_REG_T11    24
284 #undef AXP_REG_T12
285 #define AXP_REG_T12    25
286 #define AXP_REG_AI     25
287 #undef AXP_REG_FP
288 #define AXP_REG_FP     29
289
290 #undef AXP_REG_GP
291 #define AXP_REG_GP AXP_REG_PV
292
293 #endif /* OBJ_EVAX  */
294
295 /* The cpu for which we are generating code.  */
296 static unsigned alpha_target = AXP_OPCODE_BASE;
297 static const char *alpha_target_name = "<all>";
298
299 /* The hash table of instruction opcodes.  */
300 static struct hash_control *alpha_opcode_hash;
301
302 /* The hash table of macro opcodes.  */
303 static struct hash_control *alpha_macro_hash;
304
305 #ifdef OBJ_ECOFF
306 /* The $gp relocation symbol.  */
307 static symbolS *alpha_gp_symbol;
308
309 /* XXX: what is this, and why is it exported? */
310 valueT alpha_gp_value;
311 #endif
312
313 /* The current $gp register.  */
314 static int alpha_gp_register = AXP_REG_GP;
315
316 /* A table of the register symbols.  */
317 static symbolS *alpha_register_table[64];
318
319 /* Constant sections, or sections of constants.  */
320 #ifdef OBJ_ECOFF
321 static segT alpha_lita_section;
322 #endif
323 #ifdef OBJ_EVAX
324 segT alpha_link_section;
325 #endif
326 #ifndef OBJ_EVAX
327 static segT alpha_lit8_section;
328 #endif
329
330 /* Symbols referring to said sections.  */
331 #ifdef OBJ_ECOFF
332 static symbolS *alpha_lita_symbol;
333 #endif
334 #ifdef OBJ_EVAX
335 static symbolS *alpha_link_symbol;
336 #endif
337 #ifndef OBJ_EVAX
338 static symbolS *alpha_lit8_symbol;
339 #endif
340
341 /* Literal for .litX+0x8000 within .lita.  */
342 #ifdef OBJ_ECOFF
343 static offsetT alpha_lit8_literal;
344 #endif
345
346 /* Is the assembler not allowed to use $at?  */
347 static int alpha_noat_on = 0;
348
349 /* Are macros enabled?  */
350 static int alpha_macros_on = 1;
351
352 /* Are floats disabled?  */
353 static int alpha_nofloats_on = 0;
354
355 /* Are addresses 32 bit?  */
356 static int alpha_addr32_on = 0;
357
358 /* Symbol labelling the current insn.  When the Alpha gas sees
359      foo:
360        .quad 0
361    and the section happens to not be on an eight byte boundary, it
362    will align both the symbol and the .quad to an eight byte boundary.  */
363 static symbolS *alpha_insn_label;
364 #if defined(OBJ_ELF) || defined (OBJ_EVAX)
365 static symbolS *alpha_prologue_label;
366 #endif
367
368 #ifdef OBJ_EVAX
369 /* Symbol associate with the current jsr instruction.  */
370 static symbolS *alpha_linkage_symbol;
371 #endif
372
373 /* Whether we should automatically align data generation pseudo-ops.
374    .align 0 will turn this off.  */
375 static int alpha_auto_align_on = 1;
376
377 /* The known current alignment of the current section.  */
378 static int alpha_current_align;
379
380 /* These are exported to ECOFF code.  */
381 unsigned long alpha_gprmask, alpha_fprmask;
382
383 /* Whether the debugging option was seen.  */
384 static int alpha_debug;
385
386 #ifdef OBJ_ELF
387 /* Whether we are emitting an mdebug section.  */
388 int alpha_flag_mdebug = -1;
389 #endif
390
391 #ifdef OBJ_EVAX
392 /* Whether to perform the VMS procedure call optimization.  */
393 int alpha_flag_replace = 1;
394 #endif
395
396 /* Don't fully resolve relocations, allowing code movement in the linker.  */
397 static int alpha_flag_relax;
398
399 /* What value to give to bfd_set_gp_size.  */
400 static int g_switch_value = 8;
401
402 #ifdef OBJ_EVAX
403 /* Collect information about current procedure here.  */
404 struct alpha_evax_procs
405 {
406   symbolS *symbol;      /* Proc pdesc symbol.  */
407   int pdsckind;
408   int framereg;         /* Register for frame pointer.  */
409   int framesize;        /* Size of frame.  */
410   int rsa_offset;
411   int ra_save;
412   int fp_save;
413   long imask;
414   long fmask;
415   int type;
416   int prologue;
417   symbolS *handler;
418   int handler_data;
419 };
420
421 /* Linked list of .linkage fixups.  */
422 struct alpha_linkage_fixups *alpha_linkage_fixup_root;
423 static struct alpha_linkage_fixups *alpha_linkage_fixup_tail;
424
425 /* Current procedure descriptor.  */
426 static struct alpha_evax_procs *alpha_evax_proc;
427 static struct alpha_evax_procs alpha_evax_proc_data;
428
429 static int alpha_flag_hash_long_names = 0;              /* -+ */
430 static int alpha_flag_show_after_trunc = 0;             /* -H */
431
432 /* If the -+ switch is given, then a hash is appended to any name that is
433    longer than 64 characters, else longer symbol names are truncated.  */
434
435 #endif
436 \f
437 #ifdef RELOC_OP_P
438 /* A table to map the spelling of a relocation operand into an appropriate
439    bfd_reloc_code_real_type type.  The table is assumed to be ordered such
440    that op-O_literal indexes into it.  */
441
442 #define ALPHA_RELOC_TABLE(op)                                           \
443 (&alpha_reloc_op[ ((!USER_RELOC_P (op))                                 \
444                   ? (abort (), 0)                                       \
445                   : (int) (op) - (int) O_literal) ])
446
447 #define DEF(NAME, RELOC, REQ, ALLOW) \
448  { #NAME, sizeof(#NAME)-1, O_##NAME, RELOC, REQ, ALLOW}
449
450 static const struct alpha_reloc_op_tag
451 {
452   const char *name;                             /* String to lookup.  */
453   size_t length;                                /* Size of the string.  */
454   operatorT op;                                 /* Which operator to use.  */
455   extended_bfd_reloc_code_real_type reloc;
456   unsigned int require_seq : 1;                 /* Require a sequence number.  */
457   unsigned int allow_seq : 1;                   /* Allow a sequence number.  */
458 }
459 alpha_reloc_op[] =
460 {
461   DEF (literal, BFD_RELOC_ALPHA_ELF_LITERAL, 0, 1),
462   DEF (lituse_addr, DUMMY_RELOC_LITUSE_ADDR, 1, 1),
463   DEF (lituse_base, DUMMY_RELOC_LITUSE_BASE, 1, 1),
464   DEF (lituse_bytoff, DUMMY_RELOC_LITUSE_BYTOFF, 1, 1),
465   DEF (lituse_jsr, DUMMY_RELOC_LITUSE_JSR, 1, 1),
466   DEF (lituse_tlsgd, DUMMY_RELOC_LITUSE_TLSGD, 1, 1),
467   DEF (lituse_tlsldm, DUMMY_RELOC_LITUSE_TLSLDM, 1, 1),
468   DEF (lituse_jsrdirect, DUMMY_RELOC_LITUSE_JSRDIRECT, 1, 1),
469   DEF (gpdisp, BFD_RELOC_ALPHA_GPDISP, 1, 1),
470   DEF (gprelhigh, BFD_RELOC_ALPHA_GPREL_HI16, 0, 0),
471   DEF (gprellow, BFD_RELOC_ALPHA_GPREL_LO16, 0, 0),
472   DEF (gprel, BFD_RELOC_GPREL16, 0, 0),
473   DEF (samegp, BFD_RELOC_ALPHA_BRSGP, 0, 0),
474   DEF (tlsgd, BFD_RELOC_ALPHA_TLSGD, 0, 1),
475   DEF (tlsldm, BFD_RELOC_ALPHA_TLSLDM, 0, 1),
476   DEF (gotdtprel, BFD_RELOC_ALPHA_GOTDTPREL16, 0, 0),
477   DEF (dtprelhi, BFD_RELOC_ALPHA_DTPREL_HI16, 0, 0),
478   DEF (dtprello, BFD_RELOC_ALPHA_DTPREL_LO16, 0, 0),
479   DEF (dtprel, BFD_RELOC_ALPHA_DTPREL16, 0, 0),
480   DEF (gottprel, BFD_RELOC_ALPHA_GOTTPREL16, 0, 0),
481   DEF (tprelhi, BFD_RELOC_ALPHA_TPREL_HI16, 0, 0),
482   DEF (tprello, BFD_RELOC_ALPHA_TPREL_LO16, 0, 0),
483   DEF (tprel, BFD_RELOC_ALPHA_TPREL16, 0, 0),
484 };
485
486 #undef DEF
487
488 static const int alpha_num_reloc_op
489   = sizeof (alpha_reloc_op) / sizeof (*alpha_reloc_op);
490 #endif /* RELOC_OP_P */
491
492 /* Maximum # digits needed to hold the largest sequence #.  */
493 #define ALPHA_RELOC_DIGITS 25
494
495 /* Structure to hold explicit sequence information.  */
496 struct alpha_reloc_tag
497 {
498   fixS *master;                 /* The literal reloc.  */
499 #ifdef OBJ_EVAX
500   struct symbol *sym;           /* Linkage section item symbol.  */
501   struct symbol *psym;          /* Pdesc symbol.  */
502 #endif
503   fixS *slaves;                 /* Head of linked list of lituses.  */
504   segT segment;                 /* Segment relocs are in or undefined_section.  */
505   long sequence;                /* Sequence #.  */
506   unsigned n_master;            /* # of literals.  */
507   unsigned n_slaves;            /* # of lituses.  */
508   unsigned saw_tlsgd : 1;       /* True if ...  */
509   unsigned saw_tlsldm : 1;
510   unsigned saw_lu_tlsgd : 1;
511   unsigned saw_lu_tlsldm : 1;
512   unsigned multi_section_p : 1; /* True if more than one section was used.  */
513   char string[1];               /* Printable form of sequence to hash with.  */
514 };
515
516 /* Hash table to link up literals with the appropriate lituse.  */
517 static struct hash_control *alpha_literal_hash;
518
519 /* Sequence numbers for internal use by macros.  */
520 static long next_sequence_num = -1;
521 \f
522 /* A table of CPU names and opcode sets.  */
523
524 static const struct cpu_type
525 {
526   const char *name;
527   unsigned flags;
528 }
529 cpu_types[] =
530 {
531   /* Ad hoc convention: cpu number gets palcode, process code doesn't.
532      This supports usage under DU 4.0b that does ".arch ev4", and
533      usage in MILO that does -m21064.  Probably something more
534      specific like -m21064-pal should be used, but oh well.  */
535
536   { "21064", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
537   { "21064a", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
538   { "21066", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
539   { "21068", AXP_OPCODE_BASE|AXP_OPCODE_EV4 },
540   { "21164", AXP_OPCODE_BASE|AXP_OPCODE_EV5 },
541   { "21164a", AXP_OPCODE_BASE|AXP_OPCODE_EV5|AXP_OPCODE_BWX },
542   { "21164pc", (AXP_OPCODE_BASE|AXP_OPCODE_EV5|AXP_OPCODE_BWX
543                 |AXP_OPCODE_MAX) },
544   { "21264", (AXP_OPCODE_BASE|AXP_OPCODE_EV6|AXP_OPCODE_BWX
545               |AXP_OPCODE_MAX|AXP_OPCODE_CIX) },
546   { "21264a", (AXP_OPCODE_BASE|AXP_OPCODE_EV6|AXP_OPCODE_BWX
547               |AXP_OPCODE_MAX|AXP_OPCODE_CIX) },
548   { "21264b", (AXP_OPCODE_BASE|AXP_OPCODE_EV6|AXP_OPCODE_BWX
549               |AXP_OPCODE_MAX|AXP_OPCODE_CIX) },
550
551   { "ev4", AXP_OPCODE_BASE },
552   { "ev45", AXP_OPCODE_BASE },
553   { "lca45", AXP_OPCODE_BASE },
554   { "ev5", AXP_OPCODE_BASE },
555   { "ev56", AXP_OPCODE_BASE|AXP_OPCODE_BWX },
556   { "pca56", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX },
557   { "ev6", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX|AXP_OPCODE_CIX },
558   { "ev67", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX|AXP_OPCODE_CIX },
559   { "ev68", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX|AXP_OPCODE_CIX },
560
561   { "all", AXP_OPCODE_BASE },
562   { 0, 0 }
563 };
564
565 /* Some instruction sets indexed by lg(size).  */
566 static const char * const sextX_op[] = { "sextb", "sextw", "sextl", NULL };
567 static const char * const insXl_op[] = { "insbl", "inswl", "insll", "insql" };
568 static const char * const insXh_op[] = { NULL,    "inswh", "inslh", "insqh" };
569 static const char * const extXl_op[] = { "extbl", "extwl", "extll", "extql" };
570 static const char * const extXh_op[] = { NULL,    "extwh", "extlh", "extqh" };
571 static const char * const mskXl_op[] = { "mskbl", "mskwl", "mskll", "mskql" };
572 static const char * const mskXh_op[] = { NULL,    "mskwh", "msklh", "mskqh" };
573 static const char * const stX_op[] = { "stb", "stw", "stl", "stq" };
574 static const char * const ldXu_op[] = { "ldbu", "ldwu", NULL, NULL };
575
576 static void assemble_insn (const struct alpha_opcode *, const expressionS *, int, struct alpha_insn *, extended_bfd_reloc_code_real_type);
577 static void emit_insn (struct alpha_insn *);
578 static void assemble_tokens (const char *, const expressionS *, int, int);
579 #ifdef OBJ_EVAX
580 static const char *s_alpha_section_name (void);
581 static symbolS *add_to_link_pool (symbolS *, offsetT);
582 #endif
583 \f
584 static struct alpha_reloc_tag *
585 get_alpha_reloc_tag (long sequence)
586 {
587   char buffer[ALPHA_RELOC_DIGITS];
588   struct alpha_reloc_tag *info;
589
590   sprintf (buffer, "!%ld", sequence);
591
592   info = (struct alpha_reloc_tag *) hash_find (alpha_literal_hash, buffer);
593   if (! info)
594     {
595       size_t len = strlen (buffer);
596       const char *errmsg;
597
598       info = (struct alpha_reloc_tag *)
599           xcalloc (sizeof (struct alpha_reloc_tag) + len, 1);
600
601       info->segment = now_seg;
602       info->sequence = sequence;
603       strcpy (info->string, buffer);
604       errmsg = hash_insert (alpha_literal_hash, info->string, (void *) info);
605       if (errmsg)
606         as_fatal ("%s", errmsg);
607 #ifdef OBJ_EVAX
608       info->sym = 0;
609       info->psym = 0;
610 #endif
611     }
612
613   return info;
614 }
615
616 #ifndef OBJ_EVAX
617
618 static void
619 alpha_adjust_relocs (bfd *abfd ATTRIBUTE_UNUSED,
620                      asection *sec,
621                      void * ptr ATTRIBUTE_UNUSED)
622 {
623   segment_info_type *seginfo = seg_info (sec);
624   fixS **prevP;
625   fixS *fixp;
626   fixS *next;
627   fixS *slave;
628
629   /* If seginfo is NULL, we did not create this section; don't do
630      anything with it.  By using a pointer to a pointer, we can update
631      the links in place.  */
632   if (seginfo == NULL)
633     return;
634
635   /* If there are no relocations, skip the section.  */
636   if (! seginfo->fix_root)
637     return;
638
639   /* First rebuild the fixup chain without the explicit lituse and
640      gpdisp_lo16 relocs.  */
641   prevP = &seginfo->fix_root;
642   for (fixp = seginfo->fix_root; fixp; fixp = next)
643     {
644       next = fixp->fx_next;
645       fixp->fx_next = (fixS *) 0;
646
647       switch (fixp->fx_r_type)
648         {
649         case BFD_RELOC_ALPHA_LITUSE:
650           if (fixp->tc_fix_data.info->n_master == 0)
651             as_bad_where (fixp->fx_file, fixp->fx_line,
652                           _("No !literal!%ld was found"),
653                           fixp->tc_fix_data.info->sequence);
654 #ifdef RELOC_OP_P
655           if (fixp->fx_offset == LITUSE_ALPHA_TLSGD)
656             {
657               if (! fixp->tc_fix_data.info->saw_tlsgd)
658                 as_bad_where (fixp->fx_file, fixp->fx_line,
659                               _("No !tlsgd!%ld was found"),
660                               fixp->tc_fix_data.info->sequence);
661             }
662           else if (fixp->fx_offset == LITUSE_ALPHA_TLSLDM)
663             {
664               if (! fixp->tc_fix_data.info->saw_tlsldm)
665                 as_bad_where (fixp->fx_file, fixp->fx_line,
666                               _("No !tlsldm!%ld was found"),
667                               fixp->tc_fix_data.info->sequence);
668             }
669 #endif
670           break;
671
672         case BFD_RELOC_ALPHA_GPDISP_LO16:
673           if (fixp->tc_fix_data.info->n_master == 0)
674             as_bad_where (fixp->fx_file, fixp->fx_line,
675                           _("No ldah !gpdisp!%ld was found"),
676                           fixp->tc_fix_data.info->sequence);
677           break;
678
679         case BFD_RELOC_ALPHA_ELF_LITERAL:
680           if (fixp->tc_fix_data.info
681               && (fixp->tc_fix_data.info->saw_tlsgd
682                   || fixp->tc_fix_data.info->saw_tlsldm))
683             break;
684           /* FALLTHRU */
685
686         default:
687           *prevP = fixp;
688           prevP = &fixp->fx_next;
689           break;
690         }
691     }
692
693   /* Go back and re-chain dependent relocations.  They are currently
694      linked through the next_reloc field in reverse order, so as we
695      go through the next_reloc chain, we effectively reverse the chain
696      once again.
697
698      Except if there is more than one !literal for a given sequence
699      number.  In that case, the programmer and/or compiler is not sure
700      how control flows from literal to lituse, and we can't be sure to
701      get the relaxation correct.
702
703      ??? Well, actually we could, if there are enough lituses such that
704      we can make each literal have at least one of each lituse type
705      present.  Not implemented.
706
707      Also suppress the optimization if the !literals/!lituses are spread
708      in different segments.  This can happen with "interesting" uses of
709      inline assembly; examples are present in the Linux kernel semaphores.  */
710
711   for (fixp = seginfo->fix_root; fixp; fixp = next)
712     {
713       next = fixp->fx_next;
714       switch (fixp->fx_r_type)
715         {
716         case BFD_RELOC_ALPHA_TLSGD:
717         case BFD_RELOC_ALPHA_TLSLDM:
718           if (!fixp->tc_fix_data.info)
719             break;
720           if (fixp->tc_fix_data.info->n_master == 0)
721             break;
722           else if (fixp->tc_fix_data.info->n_master > 1)
723             {
724               as_bad_where (fixp->fx_file, fixp->fx_line,
725                             _("too many !literal!%ld for %s"),
726                             fixp->tc_fix_data.info->sequence,
727                             (fixp->fx_r_type == BFD_RELOC_ALPHA_TLSGD
728                              ? "!tlsgd" : "!tlsldm"));
729               break;
730             }
731
732           fixp->tc_fix_data.info->master->fx_next = fixp->fx_next;
733           fixp->fx_next = fixp->tc_fix_data.info->master;
734           fixp = fixp->fx_next;
735           /* Fall through.  */
736
737         case BFD_RELOC_ALPHA_ELF_LITERAL:
738           if (fixp->tc_fix_data.info
739               && fixp->tc_fix_data.info->n_master == 1
740               && ! fixp->tc_fix_data.info->multi_section_p)
741             {
742               for (slave = fixp->tc_fix_data.info->slaves;
743                    slave != (fixS *) 0;
744                    slave = slave->tc_fix_data.next_reloc)
745                 {
746                   slave->fx_next = fixp->fx_next;
747                   fixp->fx_next = slave;
748                 }
749             }
750           break;
751
752         case BFD_RELOC_ALPHA_GPDISP_HI16:
753           if (fixp->tc_fix_data.info->n_slaves == 0)
754             as_bad_where (fixp->fx_file, fixp->fx_line,
755                           _("No lda !gpdisp!%ld was found"),
756                           fixp->tc_fix_data.info->sequence);
757           else
758             {
759               slave = fixp->tc_fix_data.info->slaves;
760               slave->fx_next = next;
761               fixp->fx_next = slave;
762             }
763           break;
764
765         default:
766           break;
767         }
768     }
769 }
770
771 /* Before the relocations are written, reorder them, so that user
772    supplied !lituse relocations follow the appropriate !literal
773    relocations, and similarly for !gpdisp relocations.  */
774
775 void
776 alpha_before_fix (void)
777 {
778   if (alpha_literal_hash)
779     bfd_map_over_sections (stdoutput, alpha_adjust_relocs, NULL);
780 }
781
782 #endif
783 \f
784 #ifdef DEBUG_ALPHA
785 static void
786 debug_exp (expressionS tok[], int ntok)
787 {
788   int i;
789
790   fprintf (stderr, "debug_exp: %d tokens", ntok);
791   for (i = 0; i < ntok; i++)
792     {
793       expressionS *t = &tok[i];
794       const char *name;
795
796       switch (t->X_op)
797         {
798         default:                        name = "unknown";               break;
799         case O_illegal:                 name = "O_illegal";             break;
800         case O_absent:                  name = "O_absent";              break;
801         case O_constant:                name = "O_constant";            break;
802         case O_symbol:                  name = "O_symbol";              break;
803         case O_symbol_rva:              name = "O_symbol_rva";          break;
804         case O_register:                name = "O_register";            break;
805         case O_big:                     name = "O_big";                 break;
806         case O_uminus:                  name = "O_uminus";              break;
807         case O_bit_not:                 name = "O_bit_not";             break;
808         case O_logical_not:             name = "O_logical_not";         break;
809         case O_multiply:                name = "O_multiply";            break;
810         case O_divide:                  name = "O_divide";              break;
811         case O_modulus:                 name = "O_modulus";             break;
812         case O_left_shift:              name = "O_left_shift";          break;
813         case O_right_shift:             name = "O_right_shift";         break;
814         case O_bit_inclusive_or:        name = "O_bit_inclusive_or";    break;
815         case O_bit_or_not:              name = "O_bit_or_not";          break;
816         case O_bit_exclusive_or:        name = "O_bit_exclusive_or";    break;
817         case O_bit_and:                 name = "O_bit_and";             break;
818         case O_add:                     name = "O_add";                 break;
819         case O_subtract:                name = "O_subtract";            break;
820         case O_eq:                      name = "O_eq";                  break;
821         case O_ne:                      name = "O_ne";                  break;
822         case O_lt:                      name = "O_lt";                  break;
823         case O_le:                      name = "O_le";                  break;
824         case O_ge:                      name = "O_ge";                  break;
825         case O_gt:                      name = "O_gt";                  break;
826         case O_logical_and:             name = "O_logical_and";         break;
827         case O_logical_or:              name = "O_logical_or";          break;
828         case O_index:                   name = "O_index";               break;
829         case O_pregister:               name = "O_pregister";           break;
830         case O_cpregister:              name = "O_cpregister";          break;
831         case O_literal:                 name = "O_literal";             break;
832         case O_lituse_addr:             name = "O_lituse_addr";         break;
833         case O_lituse_base:             name = "O_lituse_base";         break;
834         case O_lituse_bytoff:           name = "O_lituse_bytoff";       break;
835         case O_lituse_jsr:              name = "O_lituse_jsr";          break;
836         case O_lituse_tlsgd:            name = "O_lituse_tlsgd";        break;
837         case O_lituse_tlsldm:           name = "O_lituse_tlsldm";       break;
838         case O_lituse_jsrdirect:        name = "O_lituse_jsrdirect";    break;
839         case O_gpdisp:                  name = "O_gpdisp";              break;
840         case O_gprelhigh:               name = "O_gprelhigh";           break;
841         case O_gprellow:                name = "O_gprellow";            break;
842         case O_gprel:                   name = "O_gprel";               break;
843         case O_samegp:                  name = "O_samegp";              break;
844         case O_tlsgd:                   name = "O_tlsgd";               break;
845         case O_tlsldm:                  name = "O_tlsldm";              break;
846         case O_gotdtprel:               name = "O_gotdtprel";           break;
847         case O_dtprelhi:                name = "O_dtprelhi";            break;
848         case O_dtprello:                name = "O_dtprello";            break;
849         case O_dtprel:                  name = "O_dtprel";              break;
850         case O_gottprel:                name = "O_gottprel";            break;
851         case O_tprelhi:                 name = "O_tprelhi";             break;
852         case O_tprello:                 name = "O_tprello";             break;
853         case O_tprel:                   name = "O_tprel";               break;
854         }
855
856       fprintf (stderr, ", %s(%s, %s, %d)", name,
857                (t->X_add_symbol) ? S_GET_NAME (t->X_add_symbol) : "--",
858                (t->X_op_symbol) ? S_GET_NAME (t->X_op_symbol) : "--",
859                (int) t->X_add_number);
860     }
861   fprintf (stderr, "\n");
862   fflush (stderr);
863 }
864 #endif
865
866 /* Parse the arguments to an opcode.  */
867
868 static int
869 tokenize_arguments (char *str,
870                     expressionS tok[],
871                     int ntok)
872 {
873   expressionS *end_tok = tok + ntok;
874   char *old_input_line_pointer;
875   int saw_comma = 0, saw_arg = 0;
876 #ifdef DEBUG_ALPHA
877   expressionS *orig_tok = tok;
878 #endif
879 #ifdef RELOC_OP_P
880   char *p;
881   const struct alpha_reloc_op_tag *r;
882   int c, i;
883   size_t len;
884   int reloc_found_p = 0;
885 #endif
886
887   memset (tok, 0, sizeof (*tok) * ntok);
888
889   /* Save and restore input_line_pointer around this function.  */
890   old_input_line_pointer = input_line_pointer;
891   input_line_pointer = str;
892
893 #ifdef RELOC_OP_P
894   /* ??? Wrest control of ! away from the regular expression parser.  */
895   is_end_of_line[(unsigned char) '!'] = 1;
896 #endif
897
898   while (tok < end_tok && *input_line_pointer)
899     {
900       SKIP_WHITESPACE ();
901       switch (*input_line_pointer)
902         {
903         case '\0':
904           goto fini;
905
906 #ifdef RELOC_OP_P
907         case '!':
908           /* A relocation operand can be placed after the normal operand on an
909              assembly language statement, and has the following form:
910                 !relocation_type!sequence_number.  */
911           if (reloc_found_p)
912             {
913               /* Only support one relocation op per insn.  */
914               as_bad (_("More than one relocation op per insn"));
915               goto err_report;
916             }
917
918           if (!saw_arg)
919             goto err;
920
921           ++input_line_pointer;
922           SKIP_WHITESPACE ();
923           c = get_symbol_name (&p);
924
925           /* Parse !relocation_type.  */
926           len = input_line_pointer - p;
927           if (len == 0)
928             {
929               as_bad (_("No relocation operand"));
930               goto err_report;
931             }
932
933           r = &alpha_reloc_op[0];
934           for (i = alpha_num_reloc_op - 1; i >= 0; i--, r++)
935             if (len == r->length && memcmp (p, r->name, len) == 0)
936               break;
937           if (i < 0)
938             {
939               as_bad (_("Unknown relocation operand: !%s"), p);
940               goto err_report;
941             }
942
943           *input_line_pointer = c;
944           SKIP_WHITESPACE_AFTER_NAME ();
945           if (*input_line_pointer != '!')
946             {
947               if (r->require_seq)
948                 {
949                   as_bad (_("no sequence number after !%s"), p);
950                   goto err_report;
951                 }
952
953               tok->X_add_number = 0;
954             }
955           else
956             {
957               if (! r->allow_seq)
958                 {
959                   as_bad (_("!%s does not use a sequence number"), p);
960                   goto err_report;
961                 }
962
963               input_line_pointer++;
964
965               /* Parse !sequence_number.  */
966               expression (tok);
967               if (tok->X_op != O_constant || tok->X_add_number <= 0)
968                 {
969                   as_bad (_("Bad sequence number: !%s!%s"),
970                           r->name, input_line_pointer);
971                   goto err_report;
972                 }
973             }
974
975           tok->X_op = r->op;
976           reloc_found_p = 1;
977           ++tok;
978           break;
979 #endif /* RELOC_OP_P */
980
981         case ',':
982           ++input_line_pointer;
983           if (saw_comma || !saw_arg)
984             goto err;
985           saw_comma = 1;
986           break;
987
988         case '(':
989           {
990             char *hold = input_line_pointer++;
991
992             /* First try for parenthesized register ...  */
993             expression (tok);
994             if (*input_line_pointer == ')' && tok->X_op == O_register)
995               {
996                 tok->X_op = (saw_comma ? O_cpregister : O_pregister);
997                 saw_comma = 0;
998                 saw_arg = 1;
999                 ++input_line_pointer;
1000                 ++tok;
1001                 break;
1002               }
1003
1004             /* ... then fall through to plain expression.  */
1005             input_line_pointer = hold;
1006           }
1007           /* Fall through.  */
1008
1009         default:
1010           if (saw_arg && !saw_comma)
1011             goto err;
1012
1013           expression (tok);
1014           if (tok->X_op == O_illegal || tok->X_op == O_absent)
1015             goto err;
1016
1017           saw_comma = 0;
1018           saw_arg = 1;
1019           ++tok;
1020           break;
1021         }
1022     }
1023
1024 fini:
1025   if (saw_comma)
1026     goto err;
1027   input_line_pointer = old_input_line_pointer;
1028
1029 #ifdef DEBUG_ALPHA
1030   debug_exp (orig_tok, ntok - (end_tok - tok));
1031 #endif
1032 #ifdef RELOC_OP_P
1033   is_end_of_line[(unsigned char) '!'] = 0;
1034 #endif
1035
1036   return ntok - (end_tok - tok);
1037
1038 err:
1039 #ifdef RELOC_OP_P
1040   is_end_of_line[(unsigned char) '!'] = 0;
1041 #endif
1042   input_line_pointer = old_input_line_pointer;
1043   return TOKENIZE_ERROR;
1044
1045 #ifdef RELOC_OP_P
1046 err_report:
1047   is_end_of_line[(unsigned char) '!'] = 0;
1048 #endif
1049   input_line_pointer = old_input_line_pointer;
1050   return TOKENIZE_ERROR_REPORT;
1051 }
1052
1053 /* Search forward through all variants of an opcode looking for a
1054    syntax match.  */
1055
1056 static const struct alpha_opcode *
1057 find_opcode_match (const struct alpha_opcode *first_opcode,
1058                    const expressionS *tok,
1059                    int *pntok,
1060                    int *pcpumatch)
1061 {
1062   const struct alpha_opcode *opcode = first_opcode;
1063   int ntok = *pntok;
1064   int got_cpu_match = 0;
1065
1066   do
1067     {
1068       const unsigned char *opidx;
1069       int tokidx = 0;
1070
1071       /* Don't match opcodes that don't exist on this architecture.  */
1072       if (!(opcode->flags & alpha_target))
1073         goto match_failed;
1074
1075       got_cpu_match = 1;
1076
1077       for (opidx = opcode->operands; *opidx; ++opidx)
1078         {
1079           const struct alpha_operand *operand = &alpha_operands[*opidx];
1080
1081           /* Only take input from real operands.  */
1082           if (operand->flags & AXP_OPERAND_FAKE)
1083             continue;
1084
1085           /* When we expect input, make sure we have it.  */
1086           if (tokidx >= ntok)
1087             {
1088               if ((operand->flags & AXP_OPERAND_OPTIONAL_MASK) == 0)
1089                 goto match_failed;
1090               continue;
1091             }
1092
1093           /* Match operand type with expression type.  */
1094           switch (operand->flags & AXP_OPERAND_TYPECHECK_MASK)
1095             {
1096             case AXP_OPERAND_IR:
1097               if (tok[tokidx].X_op != O_register
1098                   || !is_ir_num (tok[tokidx].X_add_number))
1099                 goto match_failed;
1100               break;
1101             case AXP_OPERAND_FPR:
1102               if (tok[tokidx].X_op != O_register
1103                   || !is_fpr_num (tok[tokidx].X_add_number))
1104                 goto match_failed;
1105               break;
1106             case AXP_OPERAND_IR | AXP_OPERAND_PARENS:
1107               if (tok[tokidx].X_op != O_pregister
1108                   || !is_ir_num (tok[tokidx].X_add_number))
1109                 goto match_failed;
1110               break;
1111             case AXP_OPERAND_IR | AXP_OPERAND_PARENS | AXP_OPERAND_COMMA:
1112               if (tok[tokidx].X_op != O_cpregister
1113                   || !is_ir_num (tok[tokidx].X_add_number))
1114                 goto match_failed;
1115               break;
1116
1117             case AXP_OPERAND_RELATIVE:
1118             case AXP_OPERAND_SIGNED:
1119             case AXP_OPERAND_UNSIGNED:
1120               switch (tok[tokidx].X_op)
1121                 {
1122                 case O_illegal:
1123                 case O_absent:
1124                 case O_register:
1125                 case O_pregister:
1126                 case O_cpregister:
1127                   goto match_failed;
1128
1129                 default:
1130                   break;
1131                 }
1132               break;
1133
1134             default:
1135               /* Everything else should have been fake.  */
1136               abort ();
1137             }
1138           ++tokidx;
1139         }
1140
1141       /* Possible match -- did we use all of our input?  */
1142       if (tokidx == ntok)
1143         {
1144           *pntok = ntok;
1145           return opcode;
1146         }
1147
1148     match_failed:;
1149     }
1150   while (++opcode - alpha_opcodes < (int) alpha_num_opcodes
1151          && !strcmp (opcode->name, first_opcode->name));
1152
1153   if (*pcpumatch)
1154     *pcpumatch = got_cpu_match;
1155
1156   return NULL;
1157 }
1158
1159 /* Given an opcode name and a pre-tokenized set of arguments, assemble
1160    the insn, but do not emit it.
1161
1162    Note that this implies no macros allowed, since we can't store more
1163    than one insn in an insn structure.  */
1164
1165 static void
1166 assemble_tokens_to_insn (const char *opname,
1167                          const expressionS *tok,
1168                          int ntok,
1169                          struct alpha_insn *insn)
1170 {
1171   const struct alpha_opcode *opcode;
1172
1173   /* Search opcodes.  */
1174   opcode = (const struct alpha_opcode *) hash_find (alpha_opcode_hash, opname);
1175   if (opcode)
1176     {
1177       int cpumatch;
1178       opcode = find_opcode_match (opcode, tok, &ntok, &cpumatch);
1179       if (opcode)
1180         {
1181           assemble_insn (opcode, tok, ntok, insn, BFD_RELOC_UNUSED);
1182           return;
1183         }
1184       else if (cpumatch)
1185         as_bad (_("inappropriate arguments for opcode `%s'"), opname);
1186       else
1187         as_bad (_("opcode `%s' not supported for target %s"), opname,
1188                 alpha_target_name);
1189     }
1190   else
1191     as_bad (_("unknown opcode `%s'"), opname);
1192 }
1193
1194 /* Build a BFD section with its flags set appropriately for the .lita,
1195    .lit8, or .lit4 sections.  */
1196
1197 static void
1198 create_literal_section (const char *name,
1199                         segT *secp,
1200                         symbolS **symp)
1201 {
1202   segT current_section = now_seg;
1203   int current_subsec = now_subseg;
1204   segT new_sec;
1205
1206   *secp = new_sec = subseg_new (name, 0);
1207   subseg_set (current_section, current_subsec);
1208   bfd_set_section_alignment (stdoutput, new_sec, 4);
1209   bfd_set_section_flags (stdoutput, new_sec,
1210                          SEC_RELOC | SEC_ALLOC | SEC_LOAD | SEC_READONLY
1211                          | SEC_DATA);
1212
1213   S_CLEAR_EXTERNAL (*symp = section_symbol (new_sec));
1214 }
1215
1216 /* Load a (partial) expression into a target register.
1217
1218    If poffset is not null, after the call it will either contain
1219    O_constant 0, or a 16-bit offset appropriate for any MEM format
1220    instruction.  In addition, pbasereg will be modified to point to
1221    the base register to use in that MEM format instruction.
1222
1223    In any case, *pbasereg should contain a base register to add to the
1224    expression.  This will normally be either AXP_REG_ZERO or
1225    alpha_gp_register.  Symbol addresses will always be loaded via $gp,
1226    so "foo($0)" is interpreted as adding the address of foo to $0;
1227    i.e. "ldq $targ, LIT($gp); addq $targ, $0, $targ".  Odd, perhaps,
1228    but this is what OSF/1 does.
1229
1230    If explicit relocations of the form !literal!<number> are allowed,
1231    and used, then explicit_reloc with be an expression pointer.
1232
1233    Finally, the return value is nonzero if the calling macro may emit
1234    a LITUSE reloc if otherwise appropriate; the return value is the
1235    sequence number to use.  */
1236
1237 static long
1238 load_expression (int targreg,
1239                  const expressionS *exp,
1240                  int *pbasereg,
1241                  expressionS *poffset,
1242                  const char *opname)
1243 {
1244   long emit_lituse = 0;
1245   offsetT addend = exp->X_add_number;
1246   int basereg = *pbasereg;
1247   struct alpha_insn insn;
1248   expressionS newtok[3];
1249
1250   switch (exp->X_op)
1251     {
1252     case O_symbol:
1253       {
1254 #ifdef OBJ_ECOFF
1255         offsetT lit;
1256
1257         /* Attempt to reduce .lit load by splitting the offset from
1258            its symbol when possible, but don't create a situation in
1259            which we'd fail.  */
1260         if (!range_signed_32 (addend) &&
1261             (alpha_noat_on || targreg == AXP_REG_AT))
1262           {
1263             lit = add_to_literal_pool (exp->X_add_symbol, addend,
1264                                        alpha_lita_section, 8);
1265             addend = 0;
1266           }
1267         else
1268           lit = add_to_literal_pool (exp->X_add_symbol, 0,
1269                                      alpha_lita_section, 8);
1270
1271         if (lit >= 0x8000)
1272           as_fatal (_("overflow in literal (.lita) table"));
1273
1274         /* Emit "ldq r, lit(gp)".  */
1275
1276         if (basereg != alpha_gp_register && targreg == basereg)
1277           {
1278             if (alpha_noat_on)
1279               as_bad (_("macro requires $at register while noat in effect"));
1280             if (targreg == AXP_REG_AT)
1281               as_bad (_("macro requires $at while $at in use"));
1282
1283             set_tok_reg (newtok[0], AXP_REG_AT);
1284           }
1285         else
1286           set_tok_reg (newtok[0], targreg);
1287
1288         set_tok_sym (newtok[1], alpha_lita_symbol, lit);
1289         set_tok_preg (newtok[2], alpha_gp_register);
1290
1291         assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
1292
1293         gas_assert (insn.nfixups == 1);
1294         insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITERAL;
1295         insn.sequence = emit_lituse = next_sequence_num--;
1296 #endif /* OBJ_ECOFF */
1297 #ifdef OBJ_ELF
1298         /* Emit "ldq r, gotoff(gp)".  */
1299
1300         if (basereg != alpha_gp_register && targreg == basereg)
1301           {
1302             if (alpha_noat_on)
1303               as_bad (_("macro requires $at register while noat in effect"));
1304             if (targreg == AXP_REG_AT)
1305               as_bad (_("macro requires $at while $at in use"));
1306
1307             set_tok_reg (newtok[0], AXP_REG_AT);
1308           }
1309         else
1310           set_tok_reg (newtok[0], targreg);
1311
1312         /* XXX: Disable this .got minimizing optimization so that we can get
1313            better instruction offset knowledge in the compiler.  This happens
1314            very infrequently anyway.  */
1315         if (1
1316             || (!range_signed_32 (addend)
1317                 && (alpha_noat_on || targreg == AXP_REG_AT)))
1318           {
1319             newtok[1] = *exp;
1320             addend = 0;
1321           }
1322         else
1323           set_tok_sym (newtok[1], exp->X_add_symbol, 0);
1324
1325         set_tok_preg (newtok[2], alpha_gp_register);
1326
1327         assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
1328
1329         gas_assert (insn.nfixups == 1);
1330         insn.fixups[0].reloc = BFD_RELOC_ALPHA_ELF_LITERAL;
1331         insn.sequence = emit_lituse = next_sequence_num--;
1332 #endif /* OBJ_ELF */
1333 #ifdef OBJ_EVAX
1334         /* Find symbol or symbol pointer in link section.  */
1335
1336         if (exp->X_add_symbol == alpha_evax_proc->symbol)
1337           {
1338             /* Linkage-relative expression.  */
1339             set_tok_reg (newtok[0], targreg);
1340
1341             if (range_signed_16 (addend))
1342               {
1343                 set_tok_const (newtok[1], addend);
1344                 addend = 0;
1345               }
1346             else
1347               {
1348                 set_tok_const (newtok[1], 0);
1349               }
1350             set_tok_preg (newtok[2], basereg);
1351             assemble_tokens_to_insn ("lda", newtok, 3, &insn);
1352           }
1353         else
1354           {
1355             const char *symname = S_GET_NAME (exp->X_add_symbol);
1356             const char *ptr1, *ptr2;
1357             int symlen = strlen (symname);
1358
1359             if ((symlen > 4 &&
1360                  strcmp (ptr2 = &symname [symlen - 4], "..lk") == 0))
1361               {
1362                 /* Access to an item whose address is stored in the linkage
1363                    section.  Just read the address.  */
1364                 set_tok_reg (newtok[0], targreg);
1365
1366                 newtok[1] = *exp;
1367                 newtok[1].X_op = O_subtract;
1368                 newtok[1].X_op_symbol = alpha_evax_proc->symbol;
1369
1370                 set_tok_preg (newtok[2], basereg);
1371                 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
1372                 alpha_linkage_symbol = exp->X_add_symbol;
1373
1374                 if (poffset)
1375                   set_tok_const (*poffset, 0);
1376
1377                 if (alpha_flag_replace && targreg == 26)
1378                   {
1379                     /* Add a NOP fixup for 'ldX $26,YYY..NAME..lk'.  */
1380                     char *ensymname;
1381                     symbolS *ensym;
1382
1383                     /* Build the entry name as 'NAME..en'.  */
1384                     ptr1 = strstr (symname, "..") + 2;
1385                     if (ptr1 > ptr2)
1386                       ptr1 = symname;
1387                     ensymname = XNEWVEC (char, ptr2 - ptr1 + 5);
1388                     memcpy (ensymname, ptr1, ptr2 - ptr1);
1389                     memcpy (ensymname + (ptr2 - ptr1), "..en", 5);
1390
1391                     gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
1392                     insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_NOP;
1393                     ensym = symbol_find_or_make (ensymname);
1394                     free (ensymname);
1395                     symbol_mark_used (ensym);
1396                     /* The fixup must be the same as the BFD_RELOC_ALPHA_BOH
1397                        case in emit_jsrjmp.  See B.4.5.2 of the OpenVMS Linker
1398                        Utility Manual.  */
1399                     insn.fixups[insn.nfixups].exp.X_op = O_symbol;
1400                     insn.fixups[insn.nfixups].exp.X_add_symbol = ensym;
1401                     insn.fixups[insn.nfixups].exp.X_add_number = 0;
1402                     insn.fixups[insn.nfixups].xtrasym = alpha_linkage_symbol;
1403                     insn.fixups[insn.nfixups].procsym = alpha_evax_proc->symbol;
1404                     insn.nfixups++;
1405
1406                     /* ??? Force bsym to be instantiated now, as it will be
1407                        too late to do so in tc_gen_reloc.  */
1408                     symbol_get_bfdsym (exp->X_add_symbol);
1409                   }
1410                 else if (alpha_flag_replace && targreg == 27)
1411                   {
1412                     /* Add a lda fixup for 'ldX $27,YYY.NAME..lk+8'.  */
1413                     char *psymname;
1414                     symbolS *psym;
1415
1416                     /* Extract NAME.  */
1417                     ptr1 = strstr (symname, "..") + 2;
1418                     if (ptr1 > ptr2)
1419                       ptr1 = symname;
1420                     psymname = xmemdup0 (ptr1, ptr2 - ptr1);
1421
1422                     gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
1423                     insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_LDA;
1424                     psym = symbol_find_or_make (psymname);
1425                     free (psymname);
1426                     symbol_mark_used (psym);
1427                     insn.fixups[insn.nfixups].exp.X_op = O_subtract;
1428                     insn.fixups[insn.nfixups].exp.X_add_symbol = psym;
1429                     insn.fixups[insn.nfixups].exp.X_op_symbol = alpha_evax_proc->symbol;
1430                     insn.fixups[insn.nfixups].exp.X_add_number = 0;
1431                     insn.fixups[insn.nfixups].xtrasym = alpha_linkage_symbol;
1432                     insn.fixups[insn.nfixups].procsym = alpha_evax_proc->symbol;
1433                     insn.nfixups++;
1434                   }
1435
1436                 emit_insn (&insn);
1437                 return 0;
1438               }
1439             else
1440               {
1441                 /* Not in the linkage section.  Put the value into the linkage
1442                    section.  */
1443                 symbolS *linkexp;
1444
1445                 if (!range_signed_32 (addend))
1446                   addend = sign_extend_32 (addend);
1447                 linkexp = add_to_link_pool (exp->X_add_symbol, 0);
1448                 set_tok_reg (newtok[0], targreg);
1449                 set_tok_sym (newtok[1], linkexp, 0);
1450                 set_tok_preg (newtok[2], basereg);
1451                 assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
1452               }
1453           }
1454 #endif /* OBJ_EVAX */
1455
1456         emit_insn (&insn);
1457
1458 #ifndef OBJ_EVAX
1459         if (basereg != alpha_gp_register && basereg != AXP_REG_ZERO)
1460           {
1461             /* Emit "addq r, base, r".  */
1462
1463             set_tok_reg (newtok[1], basereg);
1464             set_tok_reg (newtok[2], targreg);
1465             assemble_tokens ("addq", newtok, 3, 0);
1466           }
1467 #endif
1468         basereg = targreg;
1469       }
1470       break;
1471
1472     case O_constant:
1473       break;
1474
1475     case O_subtract:
1476       /* Assume that this difference expression will be resolved to an
1477          absolute value and that that value will fit in 16 bits.  */
1478
1479       set_tok_reg (newtok[0], targreg);
1480       newtok[1] = *exp;
1481       set_tok_preg (newtok[2], basereg);
1482       assemble_tokens (opname, newtok, 3, 0);
1483
1484       if (poffset)
1485         set_tok_const (*poffset, 0);
1486       return 0;
1487
1488     case O_big:
1489       if (exp->X_add_number > 0)
1490         as_bad (_("bignum invalid; zero assumed"));
1491       else
1492         as_bad (_("floating point number invalid; zero assumed"));
1493       addend = 0;
1494       break;
1495
1496     default:
1497       as_bad (_("can't handle expression"));
1498       addend = 0;
1499       break;
1500     }
1501
1502   if (!range_signed_32 (addend))
1503     {
1504 #ifdef OBJ_EVAX
1505       symbolS *litexp;
1506 #else
1507       offsetT lit;
1508       long seq_num = next_sequence_num--;
1509 #endif
1510
1511       /* For 64-bit addends, just put it in the literal pool.  */
1512 #ifdef OBJ_EVAX
1513       /* Emit "ldq targreg, lit(basereg)".  */
1514       litexp = add_to_link_pool (section_symbol (absolute_section), addend);
1515       set_tok_reg (newtok[0], targreg);
1516       set_tok_sym (newtok[1], litexp, 0);
1517       set_tok_preg (newtok[2], alpha_gp_register);
1518       assemble_tokens ("ldq", newtok, 3, 0);
1519 #else
1520
1521       if (alpha_lit8_section == NULL)
1522         {
1523           create_literal_section (".lit8",
1524                                   &alpha_lit8_section,
1525                                   &alpha_lit8_symbol);
1526
1527 #ifdef OBJ_ECOFF
1528           alpha_lit8_literal = add_to_literal_pool (alpha_lit8_symbol, 0x8000,
1529                                                     alpha_lita_section, 8);
1530           if (alpha_lit8_literal >= 0x8000)
1531             as_fatal (_("overflow in literal (.lita) table"));
1532 #endif
1533         }
1534
1535       lit = add_to_literal_pool (NULL, addend, alpha_lit8_section, 8) - 0x8000;
1536       if (lit >= 0x8000)
1537         as_fatal (_("overflow in literal (.lit8) table"));
1538
1539       /* Emit "lda litreg, .lit8+0x8000".  */
1540
1541       if (targreg == basereg)
1542         {
1543           if (alpha_noat_on)
1544             as_bad (_("macro requires $at register while noat in effect"));
1545           if (targreg == AXP_REG_AT)
1546             as_bad (_("macro requires $at while $at in use"));
1547
1548           set_tok_reg (newtok[0], AXP_REG_AT);
1549         }
1550       else
1551         set_tok_reg (newtok[0], targreg);
1552 #ifdef OBJ_ECOFF
1553       set_tok_sym (newtok[1], alpha_lita_symbol, alpha_lit8_literal);
1554 #endif
1555 #ifdef OBJ_ELF
1556       set_tok_sym (newtok[1], alpha_lit8_symbol, 0x8000);
1557 #endif
1558       set_tok_preg (newtok[2], alpha_gp_register);
1559
1560       assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
1561
1562       gas_assert (insn.nfixups == 1);
1563 #ifdef OBJ_ECOFF
1564       insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITERAL;
1565 #endif
1566 #ifdef OBJ_ELF
1567       insn.fixups[0].reloc = BFD_RELOC_ALPHA_ELF_LITERAL;
1568 #endif
1569       insn.sequence = seq_num;
1570
1571       emit_insn (&insn);
1572
1573       /* Emit "ldq litreg, lit(litreg)".  */
1574
1575       set_tok_const (newtok[1], lit);
1576       set_tok_preg (newtok[2], newtok[0].X_add_number);
1577
1578       assemble_tokens_to_insn ("ldq", newtok, 3, &insn);
1579
1580       gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
1581       insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BASE;
1582       insn.fixups[insn.nfixups].exp.X_op = O_absent;
1583       insn.nfixups++;
1584       insn.sequence = seq_num;
1585       emit_lituse = 0;
1586
1587       emit_insn (&insn);
1588
1589       /* Emit "addq litreg, base, target".  */
1590
1591       if (basereg != AXP_REG_ZERO)
1592         {
1593           set_tok_reg (newtok[1], basereg);
1594           set_tok_reg (newtok[2], targreg);
1595           assemble_tokens ("addq", newtok, 3, 0);
1596         }
1597 #endif /* !OBJ_EVAX */
1598
1599       if (poffset)
1600         set_tok_const (*poffset, 0);
1601       *pbasereg = targreg;
1602     }
1603   else
1604     {
1605       offsetT low, high, extra, tmp;
1606
1607       /* For 32-bit operands, break up the addend.  */
1608
1609       low = sign_extend_16 (addend);
1610       tmp = addend - low;
1611       high = sign_extend_16 (tmp >> 16);
1612
1613       if (tmp - (high << 16))
1614         {
1615           extra = 0x4000;
1616           tmp -= 0x40000000;
1617           high = sign_extend_16 (tmp >> 16);
1618         }
1619       else
1620         extra = 0;
1621
1622       set_tok_reg (newtok[0], targreg);
1623       set_tok_preg (newtok[2], basereg);
1624
1625       if (extra)
1626         {
1627           /* Emit "ldah r, extra(r).  */
1628           set_tok_const (newtok[1], extra);
1629           assemble_tokens ("ldah", newtok, 3, 0);
1630           set_tok_preg (newtok[2], basereg = targreg);
1631         }
1632
1633       if (high)
1634         {
1635           /* Emit "ldah r, high(r).  */
1636           set_tok_const (newtok[1], high);
1637           assemble_tokens ("ldah", newtok, 3, 0);
1638           basereg = targreg;
1639           set_tok_preg (newtok[2], basereg);
1640         }
1641
1642       if ((low && !poffset) || (!poffset && basereg != targreg))
1643         {
1644           /* Emit "lda r, low(base)".  */
1645           set_tok_const (newtok[1], low);
1646           assemble_tokens ("lda", newtok, 3, 0);
1647           basereg = targreg;
1648           low = 0;
1649         }
1650
1651       if (poffset)
1652         set_tok_const (*poffset, low);
1653       *pbasereg = basereg;
1654     }
1655
1656   return emit_lituse;
1657 }
1658
1659 /* The lda macro differs from the lda instruction in that it handles
1660    most simple expressions, particularly symbol address loads and
1661    large constants.  */
1662
1663 static void
1664 emit_lda (const expressionS *tok,
1665           int ntok,
1666           const void * unused ATTRIBUTE_UNUSED)
1667 {
1668   int basereg;
1669
1670   if (ntok == 2)
1671     basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register);
1672   else
1673     basereg = tok[2].X_add_number;
1674
1675   (void) load_expression (tok[0].X_add_number, &tok[1], &basereg, NULL, "lda");
1676 }
1677
1678 /* The ldah macro differs from the ldah instruction in that it has $31
1679    as an implied base register.  */
1680
1681 static void
1682 emit_ldah (const expressionS *tok,
1683            int ntok ATTRIBUTE_UNUSED,
1684            const void * unused ATTRIBUTE_UNUSED)
1685 {
1686   expressionS newtok[3];
1687
1688   newtok[0] = tok[0];
1689   newtok[1] = tok[1];
1690   set_tok_preg (newtok[2], AXP_REG_ZERO);
1691
1692   assemble_tokens ("ldah", newtok, 3, 0);
1693 }
1694
1695 /* Called internally to handle all alignment needs.  This takes care
1696    of eliding calls to frag_align if'n the cached current alignment
1697    says we've already got it, as well as taking care of the auto-align
1698    feature wrt labels.  */
1699
1700 static void
1701 alpha_align (int n,
1702              char *pfill,
1703              symbolS *label,
1704              int force ATTRIBUTE_UNUSED)
1705 {
1706   if (alpha_current_align >= n)
1707     return;
1708
1709   if (pfill == NULL)
1710     {
1711       if (subseg_text_p (now_seg))
1712         frag_align_code (n, 0);
1713       else
1714         frag_align (n, 0, 0);
1715     }
1716   else
1717     frag_align (n, *pfill, 0);
1718
1719   alpha_current_align = n;
1720
1721   if (label != NULL && S_GET_SEGMENT (label) == now_seg)
1722     {
1723       symbol_set_frag (label, frag_now);
1724       S_SET_VALUE (label, (valueT) frag_now_fix ());
1725     }
1726
1727   record_alignment (now_seg, n);
1728
1729   /* ??? If alpha_flag_relax && force && elf, record the requested alignment
1730      in a reloc for the linker to see.  */
1731 }
1732
1733 /* Actually output an instruction with its fixup.  */
1734
1735 static void
1736 emit_insn (struct alpha_insn *insn)
1737 {
1738   char *f;
1739   int i;
1740
1741   /* Take care of alignment duties.  */
1742   if (alpha_auto_align_on && alpha_current_align < 2)
1743     alpha_align (2, (char *) NULL, alpha_insn_label, 0);
1744   if (alpha_current_align > 2)
1745     alpha_current_align = 2;
1746   alpha_insn_label = NULL;
1747
1748   /* Write out the instruction.  */
1749   f = frag_more (4);
1750   md_number_to_chars (f, insn->insn, 4);
1751
1752 #ifdef OBJ_ELF
1753   dwarf2_emit_insn (4);
1754 #endif
1755
1756   /* Apply the fixups in order.  */
1757   for (i = 0; i < insn->nfixups; ++i)
1758     {
1759       const struct alpha_operand *operand = (const struct alpha_operand *) 0;
1760       struct alpha_fixup *fixup = &insn->fixups[i];
1761       struct alpha_reloc_tag *info = NULL;
1762       int size, pcrel;
1763       fixS *fixP;
1764
1765       /* Some fixups are only used internally and so have no howto.  */
1766       if ((int) fixup->reloc < 0)
1767         {
1768           operand = &alpha_operands[-(int) fixup->reloc];
1769           size = 4;
1770           pcrel = ((operand->flags & AXP_OPERAND_RELATIVE) != 0);
1771         }
1772       else if (fixup->reloc > BFD_RELOC_UNUSED
1773                || fixup->reloc == BFD_RELOC_ALPHA_GPDISP_HI16
1774                || fixup->reloc == BFD_RELOC_ALPHA_GPDISP_LO16)
1775         {
1776           size = 2;
1777           pcrel = 0;
1778         }
1779       else
1780         {
1781           reloc_howto_type *reloc_howto =
1782               bfd_reloc_type_lookup (stdoutput,
1783                                      (bfd_reloc_code_real_type) fixup->reloc);
1784           gas_assert (reloc_howto);
1785
1786           size = bfd_get_reloc_size (reloc_howto);
1787
1788           switch (fixup->reloc)
1789             {
1790 #ifdef OBJ_EVAX
1791             case BFD_RELOC_ALPHA_NOP:
1792             case BFD_RELOC_ALPHA_BSR:
1793             case BFD_RELOC_ALPHA_LDA:
1794             case BFD_RELOC_ALPHA_BOH:
1795               break;
1796 #endif
1797             default:
1798               gas_assert (size >= 1 && size <= 4);
1799             }
1800
1801           pcrel = reloc_howto->pc_relative;
1802         }
1803
1804       fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size,
1805                           &fixup->exp, pcrel, (bfd_reloc_code_real_type) fixup->reloc);
1806
1807       /* Turn off complaints that the addend is too large for some fixups,
1808          and copy in the sequence number for the explicit relocations.  */
1809       switch (fixup->reloc)
1810         {
1811         case BFD_RELOC_ALPHA_HINT:
1812         case BFD_RELOC_GPREL32:
1813         case BFD_RELOC_GPREL16:
1814         case BFD_RELOC_ALPHA_GPREL_HI16:
1815         case BFD_RELOC_ALPHA_GPREL_LO16:
1816         case BFD_RELOC_ALPHA_GOTDTPREL16:
1817         case BFD_RELOC_ALPHA_DTPREL_HI16:
1818         case BFD_RELOC_ALPHA_DTPREL_LO16:
1819         case BFD_RELOC_ALPHA_DTPREL16:
1820         case BFD_RELOC_ALPHA_GOTTPREL16:
1821         case BFD_RELOC_ALPHA_TPREL_HI16:
1822         case BFD_RELOC_ALPHA_TPREL_LO16:
1823         case BFD_RELOC_ALPHA_TPREL16:
1824           fixP->fx_no_overflow = 1;
1825           break;
1826
1827         case BFD_RELOC_ALPHA_GPDISP_HI16:
1828           fixP->fx_no_overflow = 1;
1829           fixP->fx_addsy = section_symbol (now_seg);
1830           fixP->fx_offset = 0;
1831
1832           info = get_alpha_reloc_tag (insn->sequence);
1833           if (++info->n_master > 1)
1834             as_bad (_("too many ldah insns for !gpdisp!%ld"), insn->sequence);
1835           if (info->segment != now_seg)
1836             as_bad (_("both insns for !gpdisp!%ld must be in the same section"),
1837                     insn->sequence);
1838           fixP->tc_fix_data.info = info;
1839           break;
1840
1841         case BFD_RELOC_ALPHA_GPDISP_LO16:
1842           fixP->fx_no_overflow = 1;
1843
1844           info = get_alpha_reloc_tag (insn->sequence);
1845           if (++info->n_slaves > 1)
1846             as_bad (_("too many lda insns for !gpdisp!%ld"), insn->sequence);
1847           if (info->segment != now_seg)
1848             as_bad (_("both insns for !gpdisp!%ld must be in the same section"),
1849                     insn->sequence);
1850           fixP->tc_fix_data.info = info;
1851           info->slaves = fixP;
1852           break;
1853
1854         case BFD_RELOC_ALPHA_LITERAL:
1855         case BFD_RELOC_ALPHA_ELF_LITERAL:
1856           fixP->fx_no_overflow = 1;
1857
1858           if (insn->sequence == 0)
1859             break;
1860           info = get_alpha_reloc_tag (insn->sequence);
1861           info->master = fixP;
1862           info->n_master++;
1863           if (info->segment != now_seg)
1864             info->multi_section_p = 1;
1865           fixP->tc_fix_data.info = info;
1866           break;
1867
1868 #ifdef RELOC_OP_P
1869         case DUMMY_RELOC_LITUSE_ADDR:
1870           fixP->fx_offset = LITUSE_ALPHA_ADDR;
1871           goto do_lituse;
1872         case DUMMY_RELOC_LITUSE_BASE:
1873           fixP->fx_offset = LITUSE_ALPHA_BASE;
1874           goto do_lituse;
1875         case DUMMY_RELOC_LITUSE_BYTOFF:
1876           fixP->fx_offset = LITUSE_ALPHA_BYTOFF;
1877           goto do_lituse;
1878         case DUMMY_RELOC_LITUSE_JSR:
1879           fixP->fx_offset = LITUSE_ALPHA_JSR;
1880           goto do_lituse;
1881         case DUMMY_RELOC_LITUSE_TLSGD:
1882           fixP->fx_offset = LITUSE_ALPHA_TLSGD;
1883           goto do_lituse;
1884         case DUMMY_RELOC_LITUSE_TLSLDM:
1885           fixP->fx_offset = LITUSE_ALPHA_TLSLDM;
1886           goto do_lituse;
1887         case DUMMY_RELOC_LITUSE_JSRDIRECT:
1888           fixP->fx_offset = LITUSE_ALPHA_JSRDIRECT;
1889           goto do_lituse;
1890         do_lituse:
1891           fixP->fx_addsy = section_symbol (now_seg);
1892           fixP->fx_r_type = BFD_RELOC_ALPHA_LITUSE;
1893
1894           info = get_alpha_reloc_tag (insn->sequence);
1895           if (fixup->reloc == DUMMY_RELOC_LITUSE_TLSGD)
1896             info->saw_lu_tlsgd = 1;
1897           else if (fixup->reloc == DUMMY_RELOC_LITUSE_TLSLDM)
1898             info->saw_lu_tlsldm = 1;
1899           if (++info->n_slaves > 1)
1900             {
1901               if (info->saw_lu_tlsgd)
1902                 as_bad (_("too many lituse insns for !lituse_tlsgd!%ld"),
1903                         insn->sequence);
1904               else if (info->saw_lu_tlsldm)
1905                 as_bad (_("too many lituse insns for !lituse_tlsldm!%ld"),
1906                         insn->sequence);
1907             }
1908           fixP->tc_fix_data.info = info;
1909           fixP->tc_fix_data.next_reloc = info->slaves;
1910           info->slaves = fixP;
1911           if (info->segment != now_seg)
1912             info->multi_section_p = 1;
1913           break;
1914
1915         case BFD_RELOC_ALPHA_TLSGD:
1916           fixP->fx_no_overflow = 1;
1917
1918           if (insn->sequence == 0)
1919             break;
1920           info = get_alpha_reloc_tag (insn->sequence);
1921           if (info->saw_tlsgd)
1922             as_bad (_("duplicate !tlsgd!%ld"), insn->sequence);
1923           else if (info->saw_tlsldm)
1924             as_bad (_("sequence number in use for !tlsldm!%ld"),
1925                     insn->sequence);
1926           else
1927             info->saw_tlsgd = 1;
1928           fixP->tc_fix_data.info = info;
1929           break;
1930
1931         case BFD_RELOC_ALPHA_TLSLDM:
1932           fixP->fx_no_overflow = 1;
1933
1934           if (insn->sequence == 0)
1935             break;
1936           info = get_alpha_reloc_tag (insn->sequence);
1937           if (info->saw_tlsldm)
1938             as_bad (_("duplicate !tlsldm!%ld"), insn->sequence);
1939           else if (info->saw_tlsgd)
1940             as_bad (_("sequence number in use for !tlsgd!%ld"),
1941                     insn->sequence);
1942           else
1943             info->saw_tlsldm = 1;
1944           fixP->tc_fix_data.info = info;
1945           break;
1946 #endif
1947 #ifdef OBJ_EVAX
1948         case BFD_RELOC_ALPHA_NOP:
1949         case BFD_RELOC_ALPHA_LDA:
1950         case BFD_RELOC_ALPHA_BSR:
1951         case BFD_RELOC_ALPHA_BOH:
1952           info = get_alpha_reloc_tag (next_sequence_num--);
1953           fixP->tc_fix_data.info = info;
1954           fixP->tc_fix_data.info->sym = fixup->xtrasym;
1955           fixP->tc_fix_data.info->psym = fixup->procsym;
1956           break;
1957 #endif
1958
1959         default:
1960           if ((int) fixup->reloc < 0)
1961             {
1962               if (operand->flags & AXP_OPERAND_NOOVERFLOW)
1963                 fixP->fx_no_overflow = 1;
1964             }
1965           break;
1966         }
1967     }
1968 }
1969
1970 /* Insert an operand value into an instruction.  */
1971
1972 static unsigned
1973 insert_operand (unsigned insn,
1974                 const struct alpha_operand *operand,
1975                 offsetT val,
1976                 const char *file,
1977                 unsigned line)
1978 {
1979   if (operand->bits != 32 && !(operand->flags & AXP_OPERAND_NOOVERFLOW))
1980     {
1981       offsetT min, max;
1982
1983       if (operand->flags & AXP_OPERAND_SIGNED)
1984         {
1985           max = (1 << (operand->bits - 1)) - 1;
1986           min = -(1 << (operand->bits - 1));
1987         }
1988       else
1989         {
1990           max = (1 << operand->bits) - 1;
1991           min = 0;
1992         }
1993
1994       if (val < min || val > max)
1995         as_bad_value_out_of_range (_("operand"), val, min, max, file, line);
1996     }
1997
1998   if (operand->insert)
1999     {
2000       const char *errmsg = NULL;
2001
2002       insn = (*operand->insert) (insn, val, &errmsg);
2003       if (errmsg)
2004         as_warn ("%s", errmsg);
2005     }
2006   else
2007     insn |= ((val & ((1 << operand->bits) - 1)) << operand->shift);
2008
2009   return insn;
2010 }
2011
2012 /* Turn an opcode description and a set of arguments into
2013    an instruction and a fixup.  */
2014
2015 static void
2016 assemble_insn (const struct alpha_opcode *opcode,
2017                const expressionS *tok,
2018                int ntok,
2019                struct alpha_insn *insn,
2020                extended_bfd_reloc_code_real_type reloc)
2021 {
2022   const struct alpha_operand *reloc_operand = NULL;
2023   const expressionS *reloc_exp = NULL;
2024   const unsigned char *argidx;
2025   unsigned image;
2026   int tokidx = 0;
2027
2028   memset (insn, 0, sizeof (*insn));
2029   image = opcode->opcode;
2030
2031   for (argidx = opcode->operands; *argidx; ++argidx)
2032     {
2033       const struct alpha_operand *operand = &alpha_operands[*argidx];
2034       const expressionS *t = (const expressionS *) 0;
2035
2036       if (operand->flags & AXP_OPERAND_FAKE)
2037         {
2038           /* Fake operands take no value and generate no fixup.  */
2039           image = insert_operand (image, operand, 0, NULL, 0);
2040           continue;
2041         }
2042
2043       if (tokidx >= ntok)
2044         {
2045           switch (operand->flags & AXP_OPERAND_OPTIONAL_MASK)
2046             {
2047             case AXP_OPERAND_DEFAULT_FIRST:
2048               t = &tok[0];
2049               break;
2050             case AXP_OPERAND_DEFAULT_SECOND:
2051               t = &tok[1];
2052               break;
2053             case AXP_OPERAND_DEFAULT_ZERO:
2054               {
2055                 static expressionS zero_exp;
2056                 t = &zero_exp;
2057                 zero_exp.X_op = O_constant;
2058                 zero_exp.X_unsigned = 1;
2059               }
2060               break;
2061             default:
2062               abort ();
2063             }
2064         }
2065       else
2066         t = &tok[tokidx++];
2067
2068       switch (t->X_op)
2069         {
2070         case O_register:
2071         case O_pregister:
2072         case O_cpregister:
2073           image = insert_operand (image, operand, regno (t->X_add_number),
2074                                   NULL, 0);
2075           break;
2076
2077         case O_constant:
2078           image = insert_operand (image, operand, t->X_add_number, NULL, 0);
2079           gas_assert (reloc_operand == NULL);
2080           reloc_operand = operand;
2081           reloc_exp = t;
2082           break;
2083
2084         default:
2085           /* This is only 0 for fields that should contain registers,
2086              which means this pattern shouldn't have matched.  */
2087           if (operand->default_reloc == 0)
2088             abort ();
2089
2090           /* There is one special case for which an insn receives two
2091              relocations, and thus the user-supplied reloc does not
2092              override the operand reloc.  */
2093           if (operand->default_reloc == BFD_RELOC_ALPHA_HINT)
2094             {
2095               struct alpha_fixup *fixup;
2096
2097               if (insn->nfixups >= MAX_INSN_FIXUPS)
2098                 as_fatal (_("too many fixups"));
2099
2100               fixup = &insn->fixups[insn->nfixups++];
2101               fixup->exp = *t;
2102               fixup->reloc = BFD_RELOC_ALPHA_HINT;
2103             }
2104           else
2105             {
2106               if (reloc == BFD_RELOC_UNUSED)
2107                 reloc = operand->default_reloc;
2108
2109               gas_assert (reloc_operand == NULL);
2110               reloc_operand = operand;
2111               reloc_exp = t;
2112             }
2113           break;
2114         }
2115     }
2116
2117   if (reloc != BFD_RELOC_UNUSED)
2118     {
2119       struct alpha_fixup *fixup;
2120
2121       if (insn->nfixups >= MAX_INSN_FIXUPS)
2122         as_fatal (_("too many fixups"));
2123
2124       /* ??? My but this is hacky.  But the OSF/1 assembler uses the same
2125          relocation tag for both ldah and lda with gpdisp.  Choose the
2126          correct internal relocation based on the opcode.  */
2127       if (reloc == BFD_RELOC_ALPHA_GPDISP)
2128         {
2129           if (strcmp (opcode->name, "ldah") == 0)
2130             reloc = BFD_RELOC_ALPHA_GPDISP_HI16;
2131           else if (strcmp (opcode->name, "lda") == 0)
2132             reloc = BFD_RELOC_ALPHA_GPDISP_LO16;
2133           else
2134             as_bad (_("invalid relocation for instruction"));
2135         }
2136
2137       /* If this is a real relocation (as opposed to a lituse hint), then
2138          the relocation width should match the operand width.
2139          Take care of -MDISP in operand table.  */
2140       else if (reloc < BFD_RELOC_UNUSED && reloc > 0)
2141         {
2142           reloc_howto_type *reloc_howto
2143               = bfd_reloc_type_lookup (stdoutput,
2144                                        (bfd_reloc_code_real_type) reloc);
2145           if (reloc_operand == NULL
2146               || reloc_howto->bitsize != reloc_operand->bits)
2147             {
2148               as_bad (_("invalid relocation for field"));
2149               return;
2150             }
2151         }
2152
2153       fixup = &insn->fixups[insn->nfixups++];
2154       if (reloc_exp)
2155         fixup->exp = *reloc_exp;
2156       else
2157         fixup->exp.X_op = O_absent;
2158       fixup->reloc = reloc;
2159     }
2160
2161   insn->insn = image;
2162 }
2163
2164 /* Handle all "simple" integer register loads -- ldq, ldq_l, ldq_u,
2165    etc.  They differ from the real instructions in that they do simple
2166    expressions like the lda macro.  */
2167
2168 static void
2169 emit_ir_load (const expressionS *tok,
2170               int ntok,
2171               const void * opname)
2172 {
2173   int basereg;
2174   long lituse;
2175   expressionS newtok[3];
2176   struct alpha_insn insn;
2177   const char *symname
2178     = tok[1].X_add_symbol ? S_GET_NAME (tok[1].X_add_symbol): "";
2179   int symlen = strlen (symname);
2180
2181   if (ntok == 2)
2182     basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register);
2183   else
2184     basereg = tok[2].X_add_number;
2185
2186   lituse = load_expression (tok[0].X_add_number, &tok[1],
2187                             &basereg, &newtok[1], (const char *) opname);
2188
2189   if (basereg == alpha_gp_register &&
2190       (symlen > 4 && strcmp (&symname [symlen - 4], "..lk") == 0))
2191     return;
2192
2193   newtok[0] = tok[0];
2194   set_tok_preg (newtok[2], basereg);
2195
2196   assemble_tokens_to_insn ((const char *) opname, newtok, 3, &insn);
2197
2198   if (lituse)
2199     {
2200       gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2201       insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BASE;
2202       insn.fixups[insn.nfixups].exp.X_op = O_absent;
2203       insn.nfixups++;
2204       insn.sequence = lituse;
2205     }
2206
2207   emit_insn (&insn);
2208 }
2209
2210 /* Handle fp register loads, and both integer and fp register stores.
2211    Again, we handle simple expressions.  */
2212
2213 static void
2214 emit_loadstore (const expressionS *tok,
2215                 int ntok,
2216                 const void * opname)
2217 {
2218   int basereg;
2219   long lituse;
2220   expressionS newtok[3];
2221   struct alpha_insn insn;
2222
2223   if (ntok == 2)
2224     basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register);
2225   else
2226     basereg = tok[2].X_add_number;
2227
2228   if (tok[1].X_op != O_constant || !range_signed_16 (tok[1].X_add_number))
2229     {
2230       if (alpha_noat_on)
2231         as_bad (_("macro requires $at register while noat in effect"));
2232
2233       lituse = load_expression (AXP_REG_AT, &tok[1],
2234                                 &basereg, &newtok[1], (const char *) opname);
2235     }
2236   else
2237     {
2238       newtok[1] = tok[1];
2239       lituse = 0;
2240     }
2241
2242   newtok[0] = tok[0];
2243   set_tok_preg (newtok[2], basereg);
2244
2245   assemble_tokens_to_insn ((const char *) opname, newtok, 3, &insn);
2246
2247   if (lituse)
2248     {
2249       gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2250       insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BASE;
2251       insn.fixups[insn.nfixups].exp.X_op = O_absent;
2252       insn.nfixups++;
2253       insn.sequence = lituse;
2254     }
2255
2256   emit_insn (&insn);
2257 }
2258
2259 /* Load a half-word or byte as an unsigned value.  */
2260
2261 static void
2262 emit_ldXu (const expressionS *tok,
2263            int ntok,
2264            const void * vlgsize)
2265 {
2266   if (alpha_target & AXP_OPCODE_BWX)
2267     emit_ir_load (tok, ntok, ldXu_op[(long) vlgsize]);
2268   else
2269     {
2270       expressionS newtok[3];
2271       struct alpha_insn insn;
2272       int basereg;
2273       long lituse;
2274
2275       if (alpha_noat_on)
2276         as_bad (_("macro requires $at register while noat in effect"));
2277
2278       if (ntok == 2)
2279         basereg = (tok[1].X_op == O_constant
2280                    ? AXP_REG_ZERO : alpha_gp_register);
2281       else
2282         basereg = tok[2].X_add_number;
2283
2284       /* Emit "lda $at, exp".  */
2285       lituse = load_expression (AXP_REG_AT, &tok[1], &basereg, NULL, "lda");
2286
2287       /* Emit "ldq_u targ, 0($at)".  */
2288       newtok[0] = tok[0];
2289       set_tok_const (newtok[1], 0);
2290       set_tok_preg (newtok[2], basereg);
2291       assemble_tokens_to_insn ("ldq_u", newtok, 3, &insn);
2292
2293       if (lituse)
2294         {
2295           gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2296           insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BASE;
2297           insn.fixups[insn.nfixups].exp.X_op = O_absent;
2298           insn.nfixups++;
2299           insn.sequence = lituse;
2300         }
2301
2302       emit_insn (&insn);
2303
2304       /* Emit "extXl targ, $at, targ".  */
2305       set_tok_reg (newtok[1], basereg);
2306       newtok[2] = newtok[0];
2307       assemble_tokens_to_insn (extXl_op[(long) vlgsize], newtok, 3, &insn);
2308
2309       if (lituse)
2310         {
2311           gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2312           insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BYTOFF;
2313           insn.fixups[insn.nfixups].exp.X_op = O_absent;
2314           insn.nfixups++;
2315           insn.sequence = lituse;
2316         }
2317
2318       emit_insn (&insn);
2319     }
2320 }
2321
2322 /* Load a half-word or byte as a signed value.  */
2323
2324 static void
2325 emit_ldX (const expressionS *tok,
2326           int ntok,
2327           const void * vlgsize)
2328 {
2329   emit_ldXu (tok, ntok, vlgsize);
2330   assemble_tokens (sextX_op[(long) vlgsize], tok, 1, 1);
2331 }
2332
2333 /* Load an integral value from an unaligned address as an unsigned
2334    value.  */
2335
2336 static void
2337 emit_uldXu (const expressionS *tok,
2338             int ntok,
2339             const void * vlgsize)
2340 {
2341   long lgsize = (long) vlgsize;
2342   expressionS newtok[3];
2343
2344   if (alpha_noat_on)
2345     as_bad (_("macro requires $at register while noat in effect"));
2346
2347   /* Emit "lda $at, exp".  */
2348   memcpy (newtok, tok, sizeof (expressionS) * ntok);
2349   newtok[0].X_add_number = AXP_REG_AT;
2350   assemble_tokens ("lda", newtok, ntok, 1);
2351
2352   /* Emit "ldq_u $t9, 0($at)".  */
2353   set_tok_reg (newtok[0], AXP_REG_T9);
2354   set_tok_const (newtok[1], 0);
2355   set_tok_preg (newtok[2], AXP_REG_AT);
2356   assemble_tokens ("ldq_u", newtok, 3, 1);
2357
2358   /* Emit "ldq_u $t10, size-1($at)".  */
2359   set_tok_reg (newtok[0], AXP_REG_T10);
2360   set_tok_const (newtok[1], (1 << lgsize) - 1);
2361   assemble_tokens ("ldq_u", newtok, 3, 1);
2362
2363   /* Emit "extXl $t9, $at, $t9".  */
2364   set_tok_reg (newtok[0], AXP_REG_T9);
2365   set_tok_reg (newtok[1], AXP_REG_AT);
2366   set_tok_reg (newtok[2], AXP_REG_T9);
2367   assemble_tokens (extXl_op[lgsize], newtok, 3, 1);
2368
2369   /* Emit "extXh $t10, $at, $t10".  */
2370   set_tok_reg (newtok[0], AXP_REG_T10);
2371   set_tok_reg (newtok[2], AXP_REG_T10);
2372   assemble_tokens (extXh_op[lgsize], newtok, 3, 1);
2373
2374   /* Emit "or $t9, $t10, targ".  */
2375   set_tok_reg (newtok[0], AXP_REG_T9);
2376   set_tok_reg (newtok[1], AXP_REG_T10);
2377   newtok[2] = tok[0];
2378   assemble_tokens ("or", newtok, 3, 1);
2379 }
2380
2381 /* Load an integral value from an unaligned address as a signed value.
2382    Note that quads should get funneled to the unsigned load since we
2383    don't have to do the sign extension.  */
2384
2385 static void
2386 emit_uldX (const expressionS *tok,
2387            int ntok,
2388            const void * vlgsize)
2389 {
2390   emit_uldXu (tok, ntok, vlgsize);
2391   assemble_tokens (sextX_op[(long) vlgsize], tok, 1, 1);
2392 }
2393
2394 /* Implement the ldil macro.  */
2395
2396 static void
2397 emit_ldil (const expressionS *tok,
2398            int ntok,
2399            const void * unused ATTRIBUTE_UNUSED)
2400 {
2401   expressionS newtok[2];
2402
2403   memcpy (newtok, tok, sizeof (newtok));
2404   newtok[1].X_add_number = sign_extend_32 (tok[1].X_add_number);
2405
2406   assemble_tokens ("lda", newtok, ntok, 1);
2407 }
2408
2409 /* Store a half-word or byte.  */
2410
2411 static void
2412 emit_stX (const expressionS *tok,
2413           int ntok,
2414           const void * vlgsize)
2415 {
2416   int lgsize = (int) (long) vlgsize;
2417
2418   if (alpha_target & AXP_OPCODE_BWX)
2419     emit_loadstore (tok, ntok, stX_op[lgsize]);
2420   else
2421     {
2422       expressionS newtok[3];
2423       struct alpha_insn insn;
2424       int basereg;
2425       long lituse;
2426
2427       if (alpha_noat_on)
2428         as_bad (_("macro requires $at register while noat in effect"));
2429
2430       if (ntok == 2)
2431         basereg = (tok[1].X_op == O_constant
2432                    ? AXP_REG_ZERO : alpha_gp_register);
2433       else
2434         basereg = tok[2].X_add_number;
2435
2436       /* Emit "lda $at, exp".  */
2437       lituse = load_expression (AXP_REG_AT, &tok[1], &basereg, NULL, "lda");
2438
2439       /* Emit "ldq_u $t9, 0($at)".  */
2440       set_tok_reg (newtok[0], AXP_REG_T9);
2441       set_tok_const (newtok[1], 0);
2442       set_tok_preg (newtok[2], basereg);
2443       assemble_tokens_to_insn ("ldq_u", newtok, 3, &insn);
2444
2445       if (lituse)
2446         {
2447           gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2448           insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BASE;
2449           insn.fixups[insn.nfixups].exp.X_op = O_absent;
2450           insn.nfixups++;
2451           insn.sequence = lituse;
2452         }
2453
2454       emit_insn (&insn);
2455
2456       /* Emit "insXl src, $at, $t10".  */
2457       newtok[0] = tok[0];
2458       set_tok_reg (newtok[1], basereg);
2459       set_tok_reg (newtok[2], AXP_REG_T10);
2460       assemble_tokens_to_insn (insXl_op[lgsize], newtok, 3, &insn);
2461
2462       if (lituse)
2463         {
2464           gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2465           insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BYTOFF;
2466           insn.fixups[insn.nfixups].exp.X_op = O_absent;
2467           insn.nfixups++;
2468           insn.sequence = lituse;
2469         }
2470
2471       emit_insn (&insn);
2472
2473       /* Emit "mskXl $t9, $at, $t9".  */
2474       set_tok_reg (newtok[0], AXP_REG_T9);
2475       newtok[2] = newtok[0];
2476       assemble_tokens_to_insn (mskXl_op[lgsize], newtok, 3, &insn);
2477
2478       if (lituse)
2479         {
2480           gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2481           insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BYTOFF;
2482           insn.fixups[insn.nfixups].exp.X_op = O_absent;
2483           insn.nfixups++;
2484           insn.sequence = lituse;
2485         }
2486
2487       emit_insn (&insn);
2488
2489       /* Emit "or $t9, $t10, $t9".  */
2490       set_tok_reg (newtok[1], AXP_REG_T10);
2491       assemble_tokens ("or", newtok, 3, 1);
2492
2493       /* Emit "stq_u $t9, 0($at).  */
2494       set_tok_const(newtok[1], 0);
2495       set_tok_preg (newtok[2], AXP_REG_AT);
2496       assemble_tokens_to_insn ("stq_u", newtok, 3, &insn);
2497
2498       if (lituse)
2499         {
2500           gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2501           insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_BASE;
2502           insn.fixups[insn.nfixups].exp.X_op = O_absent;
2503           insn.nfixups++;
2504           insn.sequence = lituse;
2505         }
2506
2507       emit_insn (&insn);
2508     }
2509 }
2510
2511 /* Store an integer to an unaligned address.  */
2512
2513 static void
2514 emit_ustX (const expressionS *tok,
2515            int ntok,
2516            const void * vlgsize)
2517 {
2518   int lgsize = (int) (long) vlgsize;
2519   expressionS newtok[3];
2520
2521   /* Emit "lda $at, exp".  */
2522   memcpy (newtok, tok, sizeof (expressionS) * ntok);
2523   newtok[0].X_add_number = AXP_REG_AT;
2524   assemble_tokens ("lda", newtok, ntok, 1);
2525
2526   /* Emit "ldq_u $9, 0($at)".  */
2527   set_tok_reg (newtok[0], AXP_REG_T9);
2528   set_tok_const (newtok[1], 0);
2529   set_tok_preg (newtok[2], AXP_REG_AT);
2530   assemble_tokens ("ldq_u", newtok, 3, 1);
2531
2532   /* Emit "ldq_u $10, size-1($at)".  */
2533   set_tok_reg (newtok[0], AXP_REG_T10);
2534   set_tok_const (newtok[1], (1 << lgsize) - 1);
2535   assemble_tokens ("ldq_u", newtok, 3, 1);
2536
2537   /* Emit "insXl src, $at, $t11".  */
2538   newtok[0] = tok[0];
2539   set_tok_reg (newtok[1], AXP_REG_AT);
2540   set_tok_reg (newtok[2], AXP_REG_T11);
2541   assemble_tokens (insXl_op[lgsize], newtok, 3, 1);
2542
2543   /* Emit "insXh src, $at, $t12".  */
2544   set_tok_reg (newtok[2], AXP_REG_T12);
2545   assemble_tokens (insXh_op[lgsize], newtok, 3, 1);
2546
2547   /* Emit "mskXl $t9, $at, $t9".  */
2548   set_tok_reg (newtok[0], AXP_REG_T9);
2549   newtok[2] = newtok[0];
2550   assemble_tokens (mskXl_op[lgsize], newtok, 3, 1);
2551
2552   /* Emit "mskXh $t10, $at, $t10".  */
2553   set_tok_reg (newtok[0], AXP_REG_T10);
2554   newtok[2] = newtok[0];
2555   assemble_tokens (mskXh_op[lgsize], newtok, 3, 1);
2556
2557   /* Emit "or $t9, $t11, $t9".  */
2558   set_tok_reg (newtok[0], AXP_REG_T9);
2559   set_tok_reg (newtok[1], AXP_REG_T11);
2560   newtok[2] = newtok[0];
2561   assemble_tokens ("or", newtok, 3, 1);
2562
2563   /* Emit "or $t10, $t12, $t10".  */
2564   set_tok_reg (newtok[0], AXP_REG_T10);
2565   set_tok_reg (newtok[1], AXP_REG_T12);
2566   newtok[2] = newtok[0];
2567   assemble_tokens ("or", newtok, 3, 1);
2568
2569   /* Emit "stq_u $t10, size-1($at)".  */
2570   set_tok_reg (newtok[0], AXP_REG_T10);
2571   set_tok_const (newtok[1], (1 << lgsize) - 1);
2572   set_tok_preg (newtok[2], AXP_REG_AT);
2573   assemble_tokens ("stq_u", newtok, 3, 1);
2574
2575   /* Emit "stq_u $t9, 0($at)".  */
2576   set_tok_reg (newtok[0], AXP_REG_T9);
2577   set_tok_const (newtok[1], 0);
2578   assemble_tokens ("stq_u", newtok, 3, 1);
2579 }
2580
2581 /* Sign extend a half-word or byte.  The 32-bit sign extend is
2582    implemented as "addl $31, $r, $t" in the opcode table.  */
2583
2584 static void
2585 emit_sextX (const expressionS *tok,
2586             int ntok,
2587             const void * vlgsize)
2588 {
2589   long lgsize = (long) vlgsize;
2590
2591   if (alpha_target & AXP_OPCODE_BWX)
2592     assemble_tokens (sextX_op[lgsize], tok, ntok, 0);
2593   else
2594     {
2595       int bitshift = 64 - 8 * (1 << lgsize);
2596       expressionS newtok[3];
2597
2598       /* Emit "sll src,bits,dst".  */
2599       newtok[0] = tok[0];
2600       set_tok_const (newtok[1], bitshift);
2601       newtok[2] = tok[ntok - 1];
2602       assemble_tokens ("sll", newtok, 3, 1);
2603
2604       /* Emit "sra dst,bits,dst".  */
2605       newtok[0] = newtok[2];
2606       assemble_tokens ("sra", newtok, 3, 1);
2607     }
2608 }
2609
2610 /* Implement the division and modulus macros.  */
2611
2612 #ifdef OBJ_EVAX
2613
2614 /* Make register usage like in normal procedure call.
2615    Don't clobber PV and RA.  */
2616
2617 static void
2618 emit_division (const expressionS *tok,
2619                int ntok,
2620                const void * symname)
2621 {
2622   /* DIVISION and MODULUS. Yech.
2623
2624      Convert
2625         OP x,y,result
2626      to
2627         mov x,R16       # if x != R16
2628         mov y,R17       # if y != R17
2629         lda AT,__OP
2630         jsr AT,(AT),0
2631         mov R0,result
2632
2633      with appropriate optimizations if R0,R16,R17 are the registers
2634      specified by the compiler.  */
2635
2636   int xr, yr, rr;
2637   symbolS *sym;
2638   expressionS newtok[3];
2639
2640   xr = regno (tok[0].X_add_number);
2641   yr = regno (tok[1].X_add_number);
2642
2643   if (ntok < 3)
2644     rr = xr;
2645   else
2646     rr = regno (tok[2].X_add_number);
2647
2648   /* Move the operands into the right place.  */
2649   if (yr == AXP_REG_R16 && xr == AXP_REG_R17)
2650     {
2651       /* They are in exactly the wrong order -- swap through AT.  */
2652       if (alpha_noat_on)
2653         as_bad (_("macro requires $at register while noat in effect"));
2654
2655       set_tok_reg (newtok[0], AXP_REG_R16);
2656       set_tok_reg (newtok[1], AXP_REG_AT);
2657       assemble_tokens ("mov", newtok, 2, 1);
2658
2659       set_tok_reg (newtok[0], AXP_REG_R17);
2660       set_tok_reg (newtok[1], AXP_REG_R16);
2661       assemble_tokens ("mov", newtok, 2, 1);
2662
2663       set_tok_reg (newtok[0], AXP_REG_AT);
2664       set_tok_reg (newtok[1], AXP_REG_R17);
2665       assemble_tokens ("mov", newtok, 2, 1);
2666     }
2667   else
2668     {
2669       if (yr == AXP_REG_R16)
2670         {
2671           set_tok_reg (newtok[0], AXP_REG_R16);
2672           set_tok_reg (newtok[1], AXP_REG_R17);
2673           assemble_tokens ("mov", newtok, 2, 1);
2674         }
2675
2676       if (xr != AXP_REG_R16)
2677         {
2678           set_tok_reg (newtok[0], xr);
2679           set_tok_reg (newtok[1], AXP_REG_R16);
2680           assemble_tokens ("mov", newtok, 2, 1);
2681         }
2682
2683       if (yr != AXP_REG_R16 && yr != AXP_REG_R17)
2684         {
2685           set_tok_reg (newtok[0], yr);
2686           set_tok_reg (newtok[1], AXP_REG_R17);
2687           assemble_tokens ("mov", newtok, 2, 1);
2688         }
2689     }
2690
2691   sym = symbol_find_or_make ((const char *) symname);
2692
2693   set_tok_reg (newtok[0], AXP_REG_AT);
2694   set_tok_sym (newtok[1], sym, 0);
2695   assemble_tokens ("lda", newtok, 2, 1);
2696
2697   /* Call the division routine.  */
2698   set_tok_reg (newtok[0], AXP_REG_AT);
2699   set_tok_cpreg (newtok[1], AXP_REG_AT);
2700   set_tok_const (newtok[2], 0);
2701   assemble_tokens ("jsr", newtok, 3, 1);
2702
2703   /* Move the result to the right place.  */
2704   if (rr != AXP_REG_R0)
2705     {
2706       set_tok_reg (newtok[0], AXP_REG_R0);
2707       set_tok_reg (newtok[1], rr);
2708       assemble_tokens ("mov", newtok, 2, 1);
2709     }
2710 }
2711
2712 #else /* !OBJ_EVAX */
2713
2714 static void
2715 emit_division (const expressionS *tok,
2716                int ntok,
2717                const void * symname)
2718 {
2719   /* DIVISION and MODULUS. Yech.
2720      Convert
2721         OP x,y,result
2722      to
2723         lda pv,__OP
2724         mov x,t10
2725         mov y,t11
2726         jsr t9,(pv),__OP
2727         mov t12,result
2728
2729      with appropriate optimizations if t10,t11,t12 are the registers
2730      specified by the compiler.  */
2731
2732   int xr, yr, rr;
2733   symbolS *sym;
2734   expressionS newtok[3];
2735
2736   xr = regno (tok[0].X_add_number);
2737   yr = regno (tok[1].X_add_number);
2738
2739   if (ntok < 3)
2740     rr = xr;
2741   else
2742     rr = regno (tok[2].X_add_number);
2743
2744   sym = symbol_find_or_make ((const char *) symname);
2745
2746   /* Move the operands into the right place.  */
2747   if (yr == AXP_REG_T10 && xr == AXP_REG_T11)
2748     {
2749       /* They are in exactly the wrong order -- swap through AT.  */
2750       if (alpha_noat_on)
2751         as_bad (_("macro requires $at register while noat in effect"));
2752
2753       set_tok_reg (newtok[0], AXP_REG_T10);
2754       set_tok_reg (newtok[1], AXP_REG_AT);
2755       assemble_tokens ("mov", newtok, 2, 1);
2756
2757       set_tok_reg (newtok[0], AXP_REG_T11);
2758       set_tok_reg (newtok[1], AXP_REG_T10);
2759       assemble_tokens ("mov", newtok, 2, 1);
2760
2761       set_tok_reg (newtok[0], AXP_REG_AT);
2762       set_tok_reg (newtok[1], AXP_REG_T11);
2763       assemble_tokens ("mov", newtok, 2, 1);
2764     }
2765   else
2766     {
2767       if (yr == AXP_REG_T10)
2768         {
2769           set_tok_reg (newtok[0], AXP_REG_T10);
2770           set_tok_reg (newtok[1], AXP_REG_T11);
2771           assemble_tokens ("mov", newtok, 2, 1);
2772         }
2773
2774       if (xr != AXP_REG_T10)
2775         {
2776           set_tok_reg (newtok[0], xr);
2777           set_tok_reg (newtok[1], AXP_REG_T10);
2778           assemble_tokens ("mov", newtok, 2, 1);
2779         }
2780
2781       if (yr != AXP_REG_T10 && yr != AXP_REG_T11)
2782         {
2783           set_tok_reg (newtok[0], yr);
2784           set_tok_reg (newtok[1], AXP_REG_T11);
2785           assemble_tokens ("mov", newtok, 2, 1);
2786         }
2787     }
2788
2789   /* Call the division routine.  */
2790   set_tok_reg (newtok[0], AXP_REG_T9);
2791   set_tok_sym (newtok[1], sym, 0);
2792   assemble_tokens ("jsr", newtok, 2, 1);
2793
2794   /* Reload the GP register.  */
2795 #ifdef OBJ_AOUT
2796 FIXME
2797 #endif
2798 #if defined(OBJ_ECOFF) || defined(OBJ_ELF)
2799   set_tok_reg (newtok[0], alpha_gp_register);
2800   set_tok_const (newtok[1], 0);
2801   set_tok_preg (newtok[2], AXP_REG_T9);
2802   assemble_tokens ("ldgp", newtok, 3, 1);
2803 #endif
2804
2805   /* Move the result to the right place.  */
2806   if (rr != AXP_REG_T12)
2807     {
2808       set_tok_reg (newtok[0], AXP_REG_T12);
2809       set_tok_reg (newtok[1], rr);
2810       assemble_tokens ("mov", newtok, 2, 1);
2811     }
2812 }
2813
2814 #endif /* !OBJ_EVAX */
2815
2816 /* The jsr and jmp macros differ from their instruction counterparts
2817    in that they can load the target address and default most
2818    everything.  */
2819
2820 static void
2821 emit_jsrjmp (const expressionS *tok,
2822              int ntok,
2823              const void * vopname)
2824 {
2825   const char *opname = (const char *) vopname;
2826   struct alpha_insn insn;
2827   expressionS newtok[3];
2828   int r, tokidx = 0;
2829   long lituse = 0;
2830
2831   if (tokidx < ntok && tok[tokidx].X_op == O_register)
2832     r = regno (tok[tokidx++].X_add_number);
2833   else
2834     r = strcmp (opname, "jmp") == 0 ? AXP_REG_ZERO : AXP_REG_RA;
2835
2836   set_tok_reg (newtok[0], r);
2837
2838   if (tokidx < ntok &&
2839       (tok[tokidx].X_op == O_pregister || tok[tokidx].X_op == O_cpregister))
2840     r = regno (tok[tokidx++].X_add_number);
2841 #ifdef OBJ_EVAX
2842   /* Keep register if jsr $n.<sym>.  */
2843 #else
2844   else
2845     {
2846       int basereg = alpha_gp_register;
2847       lituse = load_expression (r = AXP_REG_PV, &tok[tokidx],
2848                                 &basereg, NULL, opname);
2849     }
2850 #endif
2851
2852   set_tok_cpreg (newtok[1], r);
2853
2854 #ifndef OBJ_EVAX
2855   if (tokidx < ntok)
2856     newtok[2] = tok[tokidx];
2857   else
2858 #endif
2859     set_tok_const (newtok[2], 0);
2860
2861   assemble_tokens_to_insn (opname, newtok, 3, &insn);
2862
2863   if (lituse)
2864     {
2865       gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2866       insn.fixups[insn.nfixups].reloc = DUMMY_RELOC_LITUSE_JSR;
2867       insn.fixups[insn.nfixups].exp.X_op = O_absent;
2868       insn.nfixups++;
2869       insn.sequence = lituse;
2870     }
2871
2872 #ifdef OBJ_EVAX
2873   if (alpha_flag_replace
2874       && r == AXP_REG_RA
2875       && tok[tokidx].X_add_symbol
2876       && alpha_linkage_symbol)
2877     {
2878       /* Create a BOH reloc for 'jsr $27,NAME'.  */
2879       const char *symname = S_GET_NAME (tok[tokidx].X_add_symbol);
2880       int symlen = strlen (symname);
2881       char *ensymname;
2882
2883       /* Build the entry name as 'NAME..en'.  */
2884       ensymname = XNEWVEC (char, symlen + 5);
2885       memcpy (ensymname, symname, symlen);
2886       memcpy (ensymname + symlen, "..en", 5);
2887
2888       gas_assert (insn.nfixups < MAX_INSN_FIXUPS);
2889       if (insn.nfixups > 0)
2890         {
2891           memmove (&insn.fixups[1], &insn.fixups[0],
2892                    sizeof(struct alpha_fixup) * insn.nfixups);
2893         }
2894
2895       /* The fixup must be the same as the BFD_RELOC_ALPHA_NOP
2896          case in load_expression.  See B.4.5.2 of the OpenVMS
2897          Linker Utility Manual.  */
2898       insn.fixups[0].reloc = BFD_RELOC_ALPHA_BOH;
2899       insn.fixups[0].exp.X_op = O_symbol;
2900       insn.fixups[0].exp.X_add_symbol = symbol_find_or_make (ensymname);
2901       insn.fixups[0].exp.X_add_number = 0;
2902       insn.fixups[0].xtrasym = alpha_linkage_symbol;
2903       insn.fixups[0].procsym = alpha_evax_proc->symbol;
2904       insn.nfixups++;
2905       alpha_linkage_symbol = 0;
2906       free (ensymname);
2907     }
2908 #endif
2909
2910   emit_insn (&insn);
2911 }
2912
2913 /* The ret and jcr instructions differ from their instruction
2914    counterparts in that everything can be defaulted.  */
2915
2916 static void
2917 emit_retjcr (const expressionS *tok,
2918              int ntok,
2919              const void * vopname)
2920 {
2921   const char *opname = (const char *) vopname;
2922   expressionS newtok[3];
2923   int r, tokidx = 0;
2924
2925   if (tokidx < ntok && tok[tokidx].X_op == O_register)
2926     r = regno (tok[tokidx++].X_add_number);
2927   else
2928     r = AXP_REG_ZERO;
2929
2930   set_tok_reg (newtok[0], r);
2931
2932   if (tokidx < ntok &&
2933       (tok[tokidx].X_op == O_pregister || tok[tokidx].X_op == O_cpregister))
2934     r = regno (tok[tokidx++].X_add_number);
2935   else
2936     r = AXP_REG_RA;
2937
2938   set_tok_cpreg (newtok[1], r);
2939
2940   if (tokidx < ntok)
2941     newtok[2] = tok[tokidx];
2942   else
2943     set_tok_const (newtok[2], strcmp (opname, "ret") == 0);
2944
2945   assemble_tokens (opname, newtok, 3, 0);
2946 }
2947
2948 /* Implement the ldgp macro.  */
2949
2950 static void
2951 emit_ldgp (const expressionS *tok ATTRIBUTE_UNUSED,
2952            int ntok ATTRIBUTE_UNUSED,
2953            const void * unused ATTRIBUTE_UNUSED)
2954 {
2955 #ifdef OBJ_AOUT
2956 FIXME
2957 #endif
2958 #if defined(OBJ_ECOFF) || defined(OBJ_ELF)
2959   /* from "ldgp r1,n(r2)", generate "ldah r1,X(R2); lda r1,Y(r1)"
2960      with appropriate constants and relocations.  */
2961   struct alpha_insn insn;
2962   expressionS newtok[3];
2963   expressionS addend;
2964
2965 #ifdef OBJ_ECOFF
2966   if (regno (tok[2].X_add_number) == AXP_REG_PV)
2967     ecoff_set_gp_prolog_size (0);
2968 #endif
2969
2970   newtok[0] = tok[0];
2971   set_tok_const (newtok[1], 0);
2972   newtok[2] = tok[2];
2973
2974   assemble_tokens_to_insn ("ldah", newtok, 3, &insn);
2975
2976   addend = tok[1];
2977
2978 #ifdef OBJ_ECOFF
2979   if (addend.X_op != O_constant)
2980     as_bad (_("can not resolve expression"));
2981   addend.X_op = O_symbol;
2982   addend.X_add_symbol = alpha_gp_symbol;
2983 #endif
2984
2985   insn.nfixups = 1;
2986   insn.fixups[0].exp = addend;
2987   insn.fixups[0].reloc = BFD_RELOC_ALPHA_GPDISP_HI16;
2988   insn.sequence = next_sequence_num;
2989
2990   emit_insn (&insn);
2991
2992   set_tok_preg (newtok[2], tok[0].X_add_number);
2993
2994   assemble_tokens_to_insn ("lda", newtok, 3, &insn);
2995
2996 #ifdef OBJ_ECOFF
2997   addend.X_add_number += 4;
2998 #endif
2999
3000   insn.nfixups = 1;
3001   insn.fixups[0].exp = addend;
3002   insn.fixups[0].reloc = BFD_RELOC_ALPHA_GPDISP_LO16;
3003   insn.sequence = next_sequence_num--;
3004
3005   emit_insn (&insn);
3006 #endif /* OBJ_ECOFF || OBJ_ELF */
3007 }
3008
3009 /* The macro table.  */
3010
3011 static const struct alpha_macro alpha_macros[] =
3012 {
3013 /* Load/Store macros.  */
3014   { "lda",      emit_lda, NULL,
3015     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3016   { "ldah",     emit_ldah, NULL,
3017     { MACRO_IR, MACRO_EXP, MACRO_EOA } },
3018
3019   { "ldl",      emit_ir_load, "ldl",
3020     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3021   { "ldl_l",    emit_ir_load, "ldl_l",
3022     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3023   { "ldq",      emit_ir_load, "ldq",
3024     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3025   { "ldq_l",    emit_ir_load, "ldq_l",
3026     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3027   { "ldq_u",    emit_ir_load, "ldq_u",
3028     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3029   { "ldf",      emit_loadstore, "ldf",
3030     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3031   { "ldg",      emit_loadstore, "ldg",
3032     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3033   { "lds",      emit_loadstore, "lds",
3034     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3035   { "ldt",      emit_loadstore, "ldt",
3036     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3037
3038   { "ldb",      emit_ldX, (void *) 0,
3039     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3040   { "ldbu",     emit_ldXu, (void *) 0,
3041     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3042   { "ldw",      emit_ldX, (void *) 1,
3043     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3044   { "ldwu",     emit_ldXu, (void *) 1,
3045     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3046
3047   { "uldw",     emit_uldX, (void *) 1,
3048     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3049   { "uldwu",    emit_uldXu, (void *) 1,
3050     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3051   { "uldl",     emit_uldX, (void *) 2,
3052     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3053   { "uldlu",    emit_uldXu, (void *) 2,
3054     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3055   { "uldq",     emit_uldXu, (void *) 3,
3056     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3057
3058   { "ldgp",     emit_ldgp, NULL,
3059     { MACRO_IR, MACRO_EXP, MACRO_PIR, MACRO_EOA } },
3060
3061   { "ldi",      emit_lda, NULL,
3062     { MACRO_IR, MACRO_EXP, MACRO_EOA } },
3063   { "ldil",     emit_ldil, NULL,
3064     { MACRO_IR, MACRO_EXP, MACRO_EOA } },
3065   { "ldiq",     emit_lda, NULL,
3066     { MACRO_IR, MACRO_EXP, MACRO_EOA } },
3067
3068   { "stl",      emit_loadstore, "stl",
3069     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3070   { "stl_c",    emit_loadstore, "stl_c",
3071     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3072   { "stq",      emit_loadstore, "stq",
3073     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3074   { "stq_c",    emit_loadstore, "stq_c",
3075     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3076   { "stq_u",    emit_loadstore, "stq_u",
3077     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3078   { "stf",      emit_loadstore, "stf",
3079     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3080   { "stg",      emit_loadstore, "stg",
3081     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3082   { "sts",      emit_loadstore, "sts",
3083     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3084   { "stt",      emit_loadstore, "stt",
3085     { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3086
3087   { "stb",      emit_stX, (void *) 0,
3088     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3089   { "stw",      emit_stX, (void *) 1,
3090     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3091   { "ustw",     emit_ustX, (void *) 1,
3092     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3093   { "ustl",     emit_ustX, (void *) 2,
3094     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3095   { "ustq",     emit_ustX, (void *) 3,
3096     { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_EOA } },
3097
3098 /* Arithmetic macros.  */
3099
3100   { "sextb",    emit_sextX, (void *) 0,
3101     { MACRO_IR, MACRO_IR, MACRO_EOA,
3102       MACRO_IR, MACRO_EOA,
3103       /* MACRO_EXP, MACRO_IR, MACRO_EOA */ } },
3104   { "sextw",    emit_sextX, (void *) 1,
3105     { MACRO_IR, MACRO_IR, MACRO_EOA,
3106       MACRO_IR, MACRO_EOA,
3107       /* MACRO_EXP, MACRO_IR, MACRO_EOA */ } },
3108
3109   { "divl",     emit_division, "__divl",
3110     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3111       MACRO_IR, MACRO_IR, MACRO_EOA,
3112       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3113       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3114   { "divlu",    emit_division, "__divlu",
3115     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3116       MACRO_IR, MACRO_IR, MACRO_EOA,
3117       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3118       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3119   { "divq",     emit_division, "__divq",
3120     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3121       MACRO_IR, MACRO_IR, MACRO_EOA,
3122       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3123       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3124   { "divqu",    emit_division, "__divqu",
3125     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3126       MACRO_IR, MACRO_IR, MACRO_EOA,
3127       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3128       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3129   { "reml",     emit_division, "__reml",
3130     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3131       MACRO_IR, MACRO_IR, MACRO_EOA,
3132       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3133       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3134   { "remlu",    emit_division, "__remlu",
3135     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3136       MACRO_IR, MACRO_IR, MACRO_EOA,
3137       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3138       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3139   { "remq",     emit_division, "__remq",
3140     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3141       MACRO_IR, MACRO_IR, MACRO_EOA,
3142       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3143       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3144   { "remqu",    emit_division, "__remqu",
3145     { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA,
3146       MACRO_IR, MACRO_IR, MACRO_EOA,
3147       /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA,
3148       MACRO_IR, MACRO_EXP, MACRO_EOA */ } },
3149
3150   { "jsr",      emit_jsrjmp, "jsr",
3151     { MACRO_PIR, MACRO_EXP, MACRO_EOA,
3152       MACRO_PIR, MACRO_EOA,
3153       MACRO_IR,  MACRO_EXP, MACRO_EOA,
3154       MACRO_EXP, MACRO_EOA } },
3155   { "jmp",      emit_jsrjmp, "jmp",
3156     { MACRO_PIR, MACRO_EXP, MACRO_EOA,
3157       MACRO_PIR, MACRO_EOA,
3158       MACRO_IR,  MACRO_EXP, MACRO_EOA,
3159       MACRO_EXP, MACRO_EOA } },
3160   { "ret",      emit_retjcr, "ret",
3161     { MACRO_IR, MACRO_EXP, MACRO_EOA,
3162       MACRO_IR, MACRO_EOA,
3163       MACRO_PIR, MACRO_EXP, MACRO_EOA,
3164       MACRO_PIR, MACRO_EOA,
3165       MACRO_EXP, MACRO_EOA,
3166       MACRO_EOA } },
3167   { "jcr",      emit_retjcr, "jcr",
3168     { MACRO_IR,  MACRO_EXP, MACRO_EOA,
3169       MACRO_IR,  MACRO_EOA,
3170       MACRO_PIR, MACRO_EXP, MACRO_EOA,
3171       MACRO_PIR, MACRO_EOA,
3172       MACRO_EXP, MACRO_EOA,
3173       MACRO_EOA } },
3174   { "jsr_coroutine",    emit_retjcr, "jcr",
3175     { MACRO_IR,  MACRO_EXP, MACRO_EOA,
3176       MACRO_IR,  MACRO_EOA,
3177       MACRO_PIR, MACRO_EXP, MACRO_EOA,
3178       MACRO_PIR, MACRO_EOA,
3179       MACRO_EXP, MACRO_EOA,
3180       MACRO_EOA } },
3181 };
3182
3183 static const unsigned int alpha_num_macros
3184   = sizeof (alpha_macros) / sizeof (*alpha_macros);
3185
3186 /* Search forward through all variants of a macro looking for a syntax
3187    match.  */
3188
3189 static const struct alpha_macro *
3190 find_macro_match (const struct alpha_macro *first_macro,
3191                   const expressionS *tok,
3192                   int *pntok)
3193
3194 {
3195   const struct alpha_macro *macro = first_macro;
3196   int ntok = *pntok;
3197
3198   do
3199     {
3200       const enum alpha_macro_arg *arg = macro->argsets;
3201       int tokidx = 0;
3202
3203       while (*arg)
3204         {
3205           switch (*arg)
3206             {
3207             case MACRO_EOA:
3208               if (tokidx == ntok)
3209                 return macro;
3210               else
3211                 tokidx = 0;
3212               break;
3213
3214               /* Index register.  */
3215             case MACRO_IR:
3216               if (tokidx >= ntok || tok[tokidx].X_op != O_register
3217                   || !is_ir_num (tok[tokidx].X_add_number))
3218                 goto match_failed;
3219               ++tokidx;
3220               break;
3221
3222               /* Parenthesized index register.  */
3223             case MACRO_PIR:
3224               if (tokidx >= ntok || tok[tokidx].X_op != O_pregister
3225                   || !is_ir_num (tok[tokidx].X_add_number))
3226                 goto match_failed;
3227               ++tokidx;
3228               break;
3229
3230               /* Optional parenthesized index register.  */
3231             case MACRO_OPIR:
3232               if (tokidx < ntok && tok[tokidx].X_op == O_pregister
3233                   && is_ir_num (tok[tokidx].X_add_number))
3234                 ++tokidx;
3235               break;
3236
3237               /* Leading comma with a parenthesized index register.  */
3238             case MACRO_CPIR:
3239               if (tokidx >= ntok || tok[tokidx].X_op != O_cpregister
3240                   || !is_ir_num (tok[tokidx].X_add_number))
3241                 goto match_failed;
3242               ++tokidx;
3243               break;
3244
3245               /* Floating point register.  */
3246             case MACRO_FPR:
3247               if (tokidx >= ntok || tok[tokidx].X_op != O_register
3248                   || !is_fpr_num (tok[tokidx].X_add_number))
3249                 goto match_failed;
3250               ++tokidx;
3251               break;
3252
3253               /* Normal expression.  */
3254             case MACRO_EXP:
3255               if (tokidx >= ntok)
3256                 goto match_failed;
3257               switch (tok[tokidx].X_op)
3258                 {
3259                 case O_illegal:
3260                 case O_absent:
3261                 case O_register:
3262                 case O_pregister:
3263                 case O_cpregister:
3264                 case O_literal:
3265                 case O_lituse_base:
3266                 case O_lituse_bytoff:
3267                 case O_lituse_jsr:
3268                 case O_gpdisp:
3269                 case O_gprelhigh:
3270                 case O_gprellow:
3271                 case O_gprel:
3272                 case O_samegp:
3273                   goto match_failed;
3274
3275                 default:
3276                   break;
3277                 }
3278               ++tokidx;
3279               break;
3280
3281             match_failed:
3282               while (*arg != MACRO_EOA)
3283                 ++arg;
3284               tokidx = 0;
3285               break;
3286             }
3287           ++arg;
3288         }
3289     }
3290   while (++macro - alpha_macros < (int) alpha_num_macros
3291          && !strcmp (macro->name, first_macro->name));
3292
3293   return NULL;
3294 }
3295
3296 /* Given an opcode name and a pre-tokenized set of arguments, take the
3297    opcode all the way through emission.  */
3298
3299 static void
3300 assemble_tokens (const char *opname,
3301                  const expressionS *tok,
3302                  int ntok,
3303                  int local_macros_on)
3304 {
3305   int found_something = 0;
3306   const struct alpha_opcode *opcode;
3307   const struct alpha_macro *macro;
3308   int cpumatch = 1;
3309   extended_bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
3310
3311 #ifdef RELOC_OP_P
3312   /* If a user-specified relocation is present, this is not a macro.  */
3313   if (ntok && USER_RELOC_P (tok[ntok - 1].X_op))
3314     {
3315       reloc = ALPHA_RELOC_TABLE (tok[ntok - 1].X_op)->reloc;
3316       ntok--;
3317     }
3318   else
3319 #endif
3320   if (local_macros_on)
3321     {
3322       macro = ((const struct alpha_macro *)
3323                hash_find (alpha_macro_hash, opname));
3324       if (macro)
3325         {
3326           found_something = 1;
3327           macro = find_macro_match (macro, tok, &ntok);
3328           if (macro)
3329             {
3330               (*macro->emit) (tok, ntok, macro->arg);
3331               return;
3332             }
3333         }
3334     }
3335
3336   /* Search opcodes.  */
3337   opcode = (const struct alpha_opcode *) hash_find (alpha_opcode_hash, opname);
3338   if (opcode)
3339     {
3340       found_something = 1;
3341       opcode = find_opcode_match (opcode, tok, &ntok, &cpumatch);
3342       if (opcode)
3343         {
3344           struct alpha_insn insn;
3345           assemble_insn (opcode, tok, ntok, &insn, reloc);
3346
3347           /* Copy the sequence number for the reloc from the reloc token.  */
3348           if (reloc != BFD_RELOC_UNUSED)
3349             insn.sequence = tok[ntok].X_add_number;
3350
3351           emit_insn (&insn);
3352           return;
3353         }
3354     }
3355
3356   if (found_something)
3357     {
3358       if (cpumatch)
3359         as_bad (_("inappropriate arguments for opcode `%s'"), opname);
3360       else
3361         as_bad (_("opcode `%s' not supported for target %s"), opname,
3362                 alpha_target_name);
3363     }
3364   else
3365     as_bad (_("unknown opcode `%s'"), opname);
3366 }
3367 \f
3368 #ifdef OBJ_EVAX
3369
3370 /* Add sym+addend to link pool.
3371    Return offset from current procedure value (pv) to entry in link pool.
3372
3373    Add new fixup only if offset isn't 16bit.  */
3374
3375 static symbolS *
3376 add_to_link_pool (symbolS *sym, offsetT addend)
3377 {
3378   symbolS *basesym;
3379   segT current_section = now_seg;
3380   int current_subsec = now_subseg;
3381   char *p;
3382   segment_info_type *seginfo = seg_info (alpha_link_section);
3383   fixS *fixp;
3384   symbolS *linksym, *expsym;
3385   expressionS e;
3386
3387   basesym = alpha_evax_proc->symbol;
3388
3389   /* @@ This assumes all entries in a given section will be of the same
3390      size...  Probably correct, but unwise to rely on.  */
3391   /* This must always be called with the same subsegment.  */
3392
3393   if (seginfo->frchainP)
3394     for (fixp = seginfo->frchainP->fix_root;
3395          fixp != (fixS *) NULL;
3396          fixp = fixp->fx_next)
3397       {
3398         if (fixp->fx_addsy == sym
3399             && fixp->fx_offset == (valueT)addend
3400             && fixp->tc_fix_data.info
3401             && fixp->tc_fix_data.info->sym
3402             && symbol_symbolS (fixp->tc_fix_data.info->sym)
3403             && (symbol_get_value_expression (fixp->tc_fix_data.info->sym)
3404                 ->X_op_symbol == basesym))
3405           return fixp->tc_fix_data.info->sym;
3406       }
3407
3408   /* Not found, add a new entry.  */
3409   subseg_set (alpha_link_section, 0);
3410   linksym = symbol_new
3411     (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
3412   p = frag_more (8);
3413   memset (p, 0, 8);
3414
3415   /* Create a symbol for 'basesym - linksym' (offset of the added entry).  */
3416   e.X_op = O_subtract;
3417   e.X_add_symbol = linksym;
3418   e.X_op_symbol = basesym;
3419   e.X_add_number = 0;
3420   expsym = make_expr_symbol (&e);
3421
3422   /* Create a fixup for the entry.  */
3423   fixp = fix_new
3424     (frag_now, p - frag_now->fr_literal, 8, sym, addend, 0, BFD_RELOC_64);
3425   fixp->tc_fix_data.info = get_alpha_reloc_tag (next_sequence_num--);
3426   fixp->tc_fix_data.info->sym = expsym;
3427
3428   subseg_set (current_section, current_subsec);
3429
3430   /* Return the symbol.  */
3431   return expsym;
3432 }
3433 #endif /* OBJ_EVAX */
3434 \f
3435 /* Assembler directives.  */
3436
3437 /* Handle the .text pseudo-op.  This is like the usual one, but it
3438    clears alpha_insn_label and restores auto alignment.  */
3439
3440 static void
3441 s_alpha_text (int i)
3442 {
3443 #ifdef OBJ_ELF
3444   obj_elf_text (i);
3445 #else
3446   s_text (i);
3447 #endif
3448 #ifdef OBJ_EVAX
3449   {
3450     symbolS * symbolP;
3451
3452     symbolP = symbol_find (".text");
3453     if (symbolP == NULL)
3454       {
3455         symbolP = symbol_make (".text");
3456         S_SET_SEGMENT (symbolP, text_section);
3457         symbol_table_insert (symbolP);
3458       }
3459   }
3460 #endif
3461   alpha_insn_label = NULL;
3462   alpha_auto_align_on = 1;
3463   alpha_current_align = 0;
3464 }
3465
3466 /* Handle the .data pseudo-op.  This is like the usual one, but it
3467    clears alpha_insn_label and restores auto alignment.  */
3468
3469 static void
3470 s_alpha_data (int i)
3471 {
3472 #ifdef OBJ_ELF
3473   obj_elf_data (i);
3474 #else
3475   s_data (i);
3476 #endif
3477   alpha_insn_label = NULL;
3478   alpha_auto_align_on = 1;
3479   alpha_current_align = 0;
3480 }
3481
3482 #if defined (OBJ_ECOFF) || defined (OBJ_EVAX)
3483
3484 /* Handle the OSF/1 and openVMS .comm pseudo quirks.  */
3485
3486 static void
3487 s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
3488 {
3489   char *name;
3490   char c;
3491   char *p;
3492   offsetT size;
3493   symbolS *symbolP;
3494 #ifdef OBJ_EVAX
3495   offsetT temp;
3496   int log_align = 0;
3497 #endif
3498
3499   c = get_symbol_name (&name);
3500
3501   /* Just after name is now '\0'.  */
3502   p = input_line_pointer;
3503   *p = c;
3504
3505   SKIP_WHITESPACE_AFTER_NAME ();
3506
3507   /* Alpha OSF/1 compiler doesn't provide the comma, gcc does.  */
3508   if (*input_line_pointer == ',')
3509     {
3510       input_line_pointer++;
3511       SKIP_WHITESPACE ();
3512     }
3513   if ((size = get_absolute_expression ()) < 0)
3514     {
3515       as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
3516       ignore_rest_of_line ();
3517       return;
3518     }
3519
3520   *p = 0;
3521   symbolP = symbol_find_or_make (name);
3522   *p = c;
3523
3524   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
3525     {
3526       as_bad (_("Ignoring attempt to re-define symbol"));
3527       ignore_rest_of_line ();
3528       return;
3529     }
3530
3531 #ifdef OBJ_EVAX
3532   if (*input_line_pointer != ',')
3533     temp = 8; /* Default alignment.  */
3534   else
3535     {
3536       input_line_pointer++;
3537       SKIP_WHITESPACE ();
3538       temp = get_absolute_expression ();
3539     }
3540
3541   /* ??? Unlike on OSF/1, the alignment factor is not in log units.  */
3542   while ((temp >>= 1) != 0)
3543     ++log_align;
3544
3545   if (*input_line_pointer == ',')
3546     {
3547       /* Extended form of the directive
3548
3549            .comm symbol, size, alignment, section
3550
3551          where the "common" semantics is transferred to the section.
3552          The symbol is effectively an alias for the section name.  */
3553
3554       segT sec;
3555       const char *sec_name;
3556       symbolS *sec_symbol;
3557       segT current_seg = now_seg;
3558       subsegT current_subseg = now_subseg;
3559       int cur_size;
3560
3561       input_line_pointer++;
3562       SKIP_WHITESPACE ();
3563       sec_name = s_alpha_section_name ();
3564       sec_symbol = symbol_find_or_make (sec_name);
3565       sec = subseg_new (sec_name, 0);
3566       S_SET_SEGMENT (sec_symbol, sec);
3567       symbol_get_bfdsym (sec_symbol)->flags |= BSF_SECTION_SYM;
3568       bfd_vms_set_section_flags (stdoutput, sec, 0,
3569                                  EGPS__V_OVR | EGPS__V_GBL | EGPS__V_NOMOD);
3570       record_alignment (sec, log_align);
3571
3572       /* Reuse stab_string_size to store the size of the section.  */
3573       cur_size = seg_info (sec)->stabu.stab_string_size;
3574       if ((int) size > cur_size)
3575         {
3576           char *pfrag
3577             = frag_var (rs_fill, 1, 1, (relax_substateT)0, NULL,
3578                         (valueT)size - (valueT)cur_size, NULL);
3579           *pfrag = 0;
3580           seg_info (sec)->stabu.stab_string_size = (int)size;
3581         }
3582
3583       S_SET_SEGMENT (symbolP, sec);
3584
3585       subseg_set (current_seg, current_subseg);
3586     }
3587   else
3588     {
3589       /* Regular form of the directive
3590
3591            .comm symbol, size, alignment
3592
3593          where the "common" semantics in on the symbol.
3594          These symbols are assembled in the .bss section.  */
3595
3596       char *pfrag;
3597       segT current_seg = now_seg;
3598       subsegT current_subseg = now_subseg;
3599
3600       subseg_set (bss_section, 1);
3601       frag_align (log_align, 0, 0);
3602       record_alignment (bss_section, log_align);
3603
3604       symbol_set_frag (symbolP, frag_now);
3605       pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
3606                         size, NULL);
3607       *pfrag = 0;
3608
3609       S_SET_SEGMENT (symbolP, bss_section);
3610
3611       subseg_set (current_seg, current_subseg);
3612     }
3613 #endif
3614
3615   if (S_GET_VALUE (symbolP))
3616     {
3617       if (S_GET_VALUE (symbolP) != (valueT) size)
3618         as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
3619                 S_GET_NAME (symbolP),
3620                 (long) S_GET_VALUE (symbolP),
3621                 (long) size);
3622     }
3623   else
3624     {
3625 #ifndef OBJ_EVAX
3626       S_SET_VALUE (symbolP, (valueT) size);
3627 #endif
3628       S_SET_EXTERNAL (symbolP);
3629     }
3630
3631 #ifndef OBJ_EVAX
3632   know (symbol_get_frag (symbolP) == &zero_address_frag);
3633 #endif
3634   demand_empty_rest_of_line ();
3635 }
3636
3637 #endif /* ! OBJ_ELF */
3638
3639 #ifdef OBJ_ECOFF
3640
3641 /* Handle the .rdata pseudo-op.  This is like the usual one, but it
3642    clears alpha_insn_label and restores auto alignment.  */
3643
3644 static void
3645 s_alpha_rdata (int ignore ATTRIBUTE_UNUSED)
3646 {
3647   get_absolute_expression ();
3648   subseg_new (".rdata", 0);
3649   demand_empty_rest_of_line ();
3650   alpha_insn_label = NULL;
3651   alpha_auto_align_on = 1;
3652   alpha_current_align = 0;
3653 }
3654
3655 #endif
3656
3657 #ifdef OBJ_ECOFF
3658
3659 /* Handle the .sdata pseudo-op.  This is like the usual one, but it
3660    clears alpha_insn_label and restores auto alignment.  */
3661
3662 static void
3663 s_alpha_sdata (int ignore ATTRIBUTE_UNUSED)
3664 {
3665   get_absolute_expression ();
3666   subseg_new (".sdata", 0);
3667   demand_empty_rest_of_line ();
3668   alpha_insn_label = NULL;
3669   alpha_auto_align_on = 1;
3670   alpha_current_align = 0;
3671 }
3672 #endif
3673
3674 #ifdef OBJ_ELF
3675 struct alpha_elf_frame_data
3676 {
3677   symbolS *func_sym;
3678   symbolS *func_end_sym;
3679   symbolS *prologue_sym;
3680   unsigned int mask;
3681   unsigned int fmask;
3682   int fp_regno;
3683   int ra_regno;
3684   offsetT frame_size;
3685   offsetT mask_offset;
3686   offsetT fmask_offset;
3687
3688   struct alpha_elf_frame_data *next;
3689 };
3690
3691 static struct alpha_elf_frame_data *all_frame_data;
3692 static struct alpha_elf_frame_data **plast_frame_data = &all_frame_data;
3693 static struct alpha_elf_frame_data *cur_frame_data;
3694
3695 extern int all_cfi_sections;
3696
3697 /* Handle the .section pseudo-op.  This is like the usual one, but it
3698    clears alpha_insn_label and restores auto alignment.  */
3699
3700 static void
3701 s_alpha_section (int ignore ATTRIBUTE_UNUSED)
3702 {
3703   obj_elf_section (ignore);
3704
3705   alpha_insn_label = NULL;
3706   alpha_auto_align_on = 1;
3707   alpha_current_align = 0;
3708 }
3709
3710 static void
3711 s_alpha_ent (int dummy ATTRIBUTE_UNUSED)
3712 {
3713   if (ECOFF_DEBUGGING)
3714     ecoff_directive_ent (0);
3715   else
3716     {
3717       char *name, name_end;
3718
3719       name_end = get_symbol_name (&name);
3720       /* CFI_EMIT_eh_frame is the default.  */
3721       all_cfi_sections = CFI_EMIT_eh_frame;
3722
3723       if (! is_name_beginner (*name))
3724         {
3725           as_warn (_(".ent directive has no name"));
3726           (void) restore_line_pointer (name_end);
3727         }
3728       else
3729         {
3730           symbolS *sym;
3731
3732           if (cur_frame_data)
3733             as_warn (_("nested .ent directives"));
3734
3735           sym = symbol_find_or_make (name);
3736           symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
3737
3738           cur_frame_data = XCNEW (struct alpha_elf_frame_data);
3739           cur_frame_data->func_sym = sym;
3740
3741           /* Provide sensible defaults.  */
3742           cur_frame_data->fp_regno = 30;        /* sp */
3743           cur_frame_data->ra_regno = 26;        /* ra */
3744
3745           *plast_frame_data = cur_frame_data;
3746           plast_frame_data = &cur_frame_data->next;
3747
3748           /* The .ent directive is sometimes followed by a number.  Not sure
3749              what it really means, but ignore it.  */
3750           *input_line_pointer = name_end;
3751           SKIP_WHITESPACE_AFTER_NAME ();
3752           if (*input_line_pointer == ',')
3753             {
3754               input_line_pointer++;
3755               SKIP_WHITESPACE ();
3756             }
3757           if (ISDIGIT (*input_line_pointer) || *input_line_pointer == '-')
3758             (void) get_absolute_expression ();
3759         }
3760       demand_empty_rest_of_line ();
3761     }
3762 }
3763
3764 static void
3765 s_alpha_end (int dummy ATTRIBUTE_UNUSED)
3766 {
3767   if (ECOFF_DEBUGGING)
3768     ecoff_directive_end (0);
3769   else
3770     {
3771       char *name, name_end;
3772
3773       name_end = get_symbol_name (&name);
3774
3775       if (! is_name_beginner (*name))
3776         {
3777           as_warn (_(".end directive has no name"));
3778         }
3779       else
3780         {
3781           symbolS *sym;
3782
3783           sym = symbol_find (name);
3784           if (!cur_frame_data)
3785             as_warn (_(".end directive without matching .ent"));
3786           else if (sym != cur_frame_data->func_sym)
3787             as_warn (_(".end directive names different symbol than .ent"));
3788
3789           /* Create an expression to calculate the size of the function.  */
3790           if (sym && cur_frame_data)
3791             {
3792               OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (sym);
3793               expressionS *exp = XNEW (expressionS);
3794
3795               obj->size = exp;
3796               exp->X_op = O_subtract;
3797               exp->X_add_symbol = symbol_temp_new_now ();
3798               exp->X_op_symbol = sym;
3799               exp->X_add_number = 0;
3800
3801               cur_frame_data->func_end_sym = exp->X_add_symbol;
3802             }
3803
3804           cur_frame_data = NULL;
3805         }
3806
3807       (void) restore_line_pointer (name_end);
3808       demand_empty_rest_of_line ();
3809     }
3810 }
3811
3812 static void
3813 s_alpha_mask (int fp)
3814 {
3815   if (ECOFF_DEBUGGING)
3816     {
3817       if (fp)
3818         ecoff_directive_fmask (0);
3819       else
3820         ecoff_directive_mask (0);
3821     }
3822   else
3823     {
3824       long val;
3825       offsetT offset;
3826
3827       if (!cur_frame_data)
3828         {
3829           if (fp)
3830             as_warn (_(".fmask outside of .ent"));
3831           else
3832             as_warn (_(".mask outside of .ent"));
3833           discard_rest_of_line ();
3834           return;
3835         }
3836
3837       if (get_absolute_expression_and_terminator (&val) != ',')
3838         {
3839           if (fp)
3840             as_warn (_("bad .fmask directive"));
3841           else
3842             as_warn (_("bad .mask directive"));
3843           --input_line_pointer;
3844           discard_rest_of_line ();
3845           return;
3846         }
3847
3848       offset = get_absolute_expression ();
3849       demand_empty_rest_of_line ();
3850
3851       if (fp)
3852         {
3853           cur_frame_data->fmask = val;
3854           cur_frame_data->fmask_offset = offset;
3855         }
3856       else
3857         {
3858           cur_frame_data->mask = val;
3859           cur_frame_data->mask_offset = offset;
3860         }
3861     }
3862 }
3863
3864 static void
3865 s_alpha_frame (int dummy ATTRIBUTE_UNUSED)
3866 {
3867   if (ECOFF_DEBUGGING)
3868     ecoff_directive_frame (0);
3869   else
3870     {
3871       long val;
3872
3873       if (!cur_frame_data)
3874         {
3875           as_warn (_(".frame outside of .ent"));
3876           discard_rest_of_line ();
3877           return;
3878         }
3879
3880       cur_frame_data->fp_regno = tc_get_register (1);
3881
3882       SKIP_WHITESPACE ();
3883       if (*input_line_pointer++ != ','
3884           || get_absolute_expression_and_terminator (&val) != ',')
3885         {
3886           as_warn (_("bad .frame directive"));
3887           --input_line_pointer;
3888           discard_rest_of_line ();
3889           return;
3890         }
3891       cur_frame_data->frame_size = val;
3892
3893       cur_frame_data->ra_regno = tc_get_register (0);
3894
3895       /* Next comes the "offset of saved $a0 from $sp".  In gcc terms
3896          this is current_function_pretend_args_size.  There's no place
3897          to put this value, so ignore it.  */
3898       s_ignore (42);
3899     }
3900 }
3901
3902 static void
3903 s_alpha_prologue (int ignore ATTRIBUTE_UNUSED)
3904 {
3905   symbolS *sym;
3906   int arg;
3907
3908   arg = get_absolute_expression ();
3909   demand_empty_rest_of_line ();
3910   alpha_prologue_label = symbol_new
3911     (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
3912
3913   if (ECOFF_DEBUGGING)
3914     sym = ecoff_get_cur_proc_sym ();
3915   else
3916     sym = cur_frame_data ? cur_frame_data->func_sym : NULL;
3917
3918   if (sym == NULL)
3919     {
3920       as_bad (_(".prologue directive without a preceding .ent directive"));
3921       return;
3922     }
3923
3924   switch (arg)
3925     {
3926     case 0: /* No PV required.  */
3927       S_SET_OTHER (sym, STO_ALPHA_NOPV
3928                    | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
3929       break;
3930     case 1: /* Std GP load.  */
3931       S_SET_OTHER (sym, STO_ALPHA_STD_GPLOAD
3932                    | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
3933       break;
3934     case 2: /* Non-std use of PV.  */
3935       break;
3936
3937     default:
3938       as_bad (_("Invalid argument %d to .prologue."), arg);
3939       break;
3940     }
3941
3942   if (cur_frame_data)
3943     cur_frame_data->prologue_sym = symbol_temp_new_now ();
3944 }
3945
3946 static char *first_file_directive;
3947
3948 static void
3949 s_alpha_file (int ignore ATTRIBUTE_UNUSED)
3950 {
3951   /* Save the first .file directive we see, so that we can change our
3952      minds about whether ecoff debugging should or shouldn't be enabled.  */
3953   if (alpha_flag_mdebug < 0 && ! first_file_directive)
3954     {
3955       char *start = input_line_pointer;
3956       size_t len;
3957
3958       discard_rest_of_line ();
3959
3960       len = input_line_pointer - start;
3961       first_file_directive = xmemdup0 (start, len);
3962
3963       input_line_pointer = start;
3964     }
3965
3966   if (ECOFF_DEBUGGING)
3967     ecoff_directive_file (0);
3968   else
3969     dwarf2_directive_file (0);
3970 }
3971
3972 static void
3973 s_alpha_loc (int ignore ATTRIBUTE_UNUSED)
3974 {
3975   if (ECOFF_DEBUGGING)
3976     ecoff_directive_loc (0);
3977   else
3978     dwarf2_directive_loc (0);
3979 }
3980
3981 static void
3982 s_alpha_stab (int n)
3983 {
3984   /* If we've been undecided about mdebug, make up our minds in favour.  */
3985   if (alpha_flag_mdebug < 0)
3986     {
3987       segT sec = subseg_new (".mdebug", 0);
3988       bfd_set_section_flags (stdoutput, sec, SEC_HAS_CONTENTS | SEC_READONLY);
3989       bfd_set_section_alignment (stdoutput, sec, 3);
3990
3991       ecoff_read_begin_hook ();
3992
3993       if (first_file_directive)
3994         {
3995           char *save_ilp = input_line_pointer;
3996           input_line_pointer = first_file_directive;
3997           ecoff_directive_file (0);
3998           input_line_pointer = save_ilp;
3999           free (first_file_directive);
4000         }
4001
4002       alpha_flag_mdebug = 1;
4003     }
4004   s_stab (n);
4005 }
4006
4007 static void
4008 s_alpha_coff_wrapper (int which)
4009 {
4010   static void (* const fns[]) (int) = {
4011     ecoff_directive_begin,
4012     ecoff_directive_bend,
4013     ecoff_directive_def,
4014     ecoff_directive_dim,
4015     ecoff_directive_endef,
4016     ecoff_directive_scl,
4017     ecoff_directive_tag,
4018     ecoff_directive_val,
4019   };
4020
4021   gas_assert (which >= 0 && which < (int) (sizeof (fns)/sizeof (*fns)));
4022
4023   if (ECOFF_DEBUGGING)
4024     (*fns[which]) (0);
4025   else
4026     {
4027       as_bad (_("ECOFF debugging is disabled."));
4028       ignore_rest_of_line ();
4029     }
4030 }
4031
4032 /* Called at the end of assembly.  Here we emit unwind info for frames
4033    unless the compiler has done it for us.  */
4034
4035 void
4036 alpha_elf_md_end (void)
4037 {
4038   struct alpha_elf_frame_data *p;
4039
4040   if (cur_frame_data)
4041     as_warn (_(".ent directive without matching .end"));
4042
4043   /* If someone has generated the unwind info themselves, great.  */
4044   if (bfd_get_section_by_name (stdoutput, ".eh_frame") != NULL)
4045     return;
4046
4047   /* ??? In theory we could look for functions for which we have
4048      generated unwind info via CFI directives, and those we have not.
4049      Those we have not could still get their unwind info from here.
4050      For now, do nothing if we've seen any CFI directives.  Note that
4051      the above test will not trigger, as we've not emitted data yet.  */
4052   if (all_fde_data != NULL)
4053     return;
4054
4055   /* Generate .eh_frame data for the unwind directives specified.  */
4056   for (p = all_frame_data; p ; p = p->next)
4057     if (p->prologue_sym)
4058       {
4059         /* Create a temporary symbol at the same location as our
4060            function symbol.  This prevents problems with globals.  */
4061         cfi_new_fde (symbol_temp_new (S_GET_SEGMENT (p->func_sym),
4062                                       S_GET_VALUE (p->func_sym),
4063                                       symbol_get_frag (p->func_sym)));
4064
4065         cfi_set_sections ();
4066         cfi_set_return_column (p->ra_regno);
4067         cfi_add_CFA_def_cfa_register (30);
4068         if (p->fp_regno != 30 || p->mask || p->fmask || p->frame_size)
4069           {
4070             unsigned int mask;
4071             offsetT offset;
4072
4073             cfi_add_advance_loc (p->prologue_sym);
4074
4075             if (p->fp_regno != 30)
4076               if (p->frame_size != 0)
4077                 cfi_add_CFA_def_cfa (p->fp_regno, p->frame_size);
4078               else
4079                 cfi_add_CFA_def_cfa_register (p->fp_regno);
4080             else if (p->frame_size != 0)
4081               cfi_add_CFA_def_cfa_offset (p->frame_size);
4082
4083             mask = p->mask;
4084             offset = p->mask_offset;
4085
4086             /* Recall that $26 is special-cased and stored first.  */
4087             if ((mask >> 26) & 1)
4088               {
4089                 cfi_add_CFA_offset (26, offset);
4090                 offset += 8;
4091                 mask &= ~(1 << 26);
4092               }
4093             while (mask)
4094               {
4095                 unsigned int i;
4096                 i = mask & -mask;
4097                 mask ^= i;
4098                 i = ffs (i) - 1;
4099
4100                 cfi_add_CFA_offset (i, offset);
4101                 offset += 8;
4102               }
4103
4104             mask = p->fmask;
4105             offset = p->fmask_offset;
4106             while (mask)
4107               {
4108                 unsigned int i;
4109                 i = mask & -mask;
4110                 mask ^= i;
4111                 i = ffs (i) - 1;
4112
4113                 cfi_add_CFA_offset (i + 32, offset);
4114                 offset += 8;
4115               }
4116           }
4117
4118         cfi_end_fde (p->func_end_sym);
4119       }
4120 }
4121
4122 static void
4123 s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
4124 {
4125   char *name, name_end;
4126   char *which, which_end;
4127   symbolS *sym;
4128   int other;
4129
4130   name_end = get_symbol_name (&name);
4131
4132   if (! is_name_beginner (*name))
4133     {
4134       as_bad (_(".usepv directive has no name"));
4135       (void) restore_line_pointer (name_end);
4136       ignore_rest_of_line ();
4137       return;
4138     }
4139
4140   sym = symbol_find_or_make (name);
4141   name_end = restore_line_pointer (name_end);
4142   if (! is_end_of_line[(unsigned char) name_end])
4143     input_line_pointer++;
4144
4145   if (name_end != ',')
4146     {
4147       as_bad (_(".usepv directive has no type"));
4148       ignore_rest_of_line ();
4149       return;
4150     }
4151
4152   SKIP_WHITESPACE ();
4153
4154   which_end = get_symbol_name (&which);
4155
4156   if (strcmp (which, "no") == 0)
4157     other = STO_ALPHA_NOPV;
4158   else if (strcmp (which, "std") == 0)
4159     other = STO_ALPHA_STD_GPLOAD;
4160   else
4161     {
4162       as_bad (_("unknown argument for .usepv"));
4163       other = 0;
4164     }
4165
4166   (void) restore_line_pointer (which_end);
4167   demand_empty_rest_of_line ();
4168
4169   S_SET_OTHER (sym, other | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
4170 }
4171 #endif /* OBJ_ELF */
4172
4173 /* Standard calling conventions leaves the CFA at $30 on entry.  */
4174
4175 void
4176 alpha_cfi_frame_initial_instructions (void)
4177 {
4178   cfi_add_CFA_def_cfa_register (30);
4179 }
4180
4181 #ifdef OBJ_EVAX
4182
4183 /* Get name of section.  */
4184 static const char *
4185 s_alpha_section_name (void)
4186 {
4187   char *name;
4188
4189   SKIP_WHITESPACE ();
4190   if (*input_line_pointer == '"')
4191     {
4192       int dummy;
4193
4194       name = demand_copy_C_string (&dummy);
4195       if (name == NULL)
4196         {
4197           ignore_rest_of_line ();
4198           return NULL;
4199         }
4200     }
4201   else
4202     {
4203       char *end = input_line_pointer;
4204
4205       while (0 == strchr ("\n\t,; ", *end))
4206         end++;
4207       if (end == input_line_pointer)
4208         {
4209           as_warn (_("missing name"));
4210           ignore_rest_of_line ();
4211           return NULL;
4212         }
4213
4214       name = xmemdup0 (input_line_pointer, end - input_line_pointer);
4215       input_line_pointer = end;
4216     }
4217   SKIP_WHITESPACE ();
4218   return name;
4219 }
4220
4221 /* Put clear/set flags in one flagword.  The LSBs are flags to be set,
4222    the MSBs are the flags to be cleared.  */
4223
4224 #define EGPS__V_NO_SHIFT 16
4225 #define EGPS__V_MASK     0xffff
4226
4227 /* Parse one VMS section flag.  */
4228
4229 static flagword
4230 s_alpha_section_word (char *str, size_t len)
4231 {
4232   int no = 0;
4233   flagword flag = 0;
4234
4235   if (len == 5 && strncmp (str, "NO", 2) == 0)
4236     {
4237       no = 1;
4238       str += 2;
4239       len -= 2;
4240     }
4241
4242   if (len == 3)
4243     {
4244       if (strncmp (str, "PIC", 3) == 0)
4245         flag = EGPS__V_PIC;
4246       else if (strncmp (str, "LIB", 3) == 0)
4247         flag = EGPS__V_LIB;
4248       else if (strncmp (str, "OVR", 3) == 0)
4249         flag = EGPS__V_OVR;
4250       else if (strncmp (str, "REL", 3) == 0)
4251         flag = EGPS__V_REL;
4252       else if (strncmp (str, "GBL", 3) == 0)
4253         flag = EGPS__V_GBL;
4254       else if (strncmp (str, "SHR", 3) == 0)
4255         flag = EGPS__V_SHR;
4256       else if (strncmp (str, "EXE", 3) == 0)
4257         flag = EGPS__V_EXE;
4258       else if (strncmp (str, "WRT", 3) == 0)
4259         flag = EGPS__V_WRT;
4260       else if (strncmp (str, "VEC", 3) == 0)
4261         flag = EGPS__V_VEC;
4262       else if (strncmp (str, "MOD", 3) == 0)
4263         {
4264           flag = no ? EGPS__V_NOMOD : EGPS__V_NOMOD << EGPS__V_NO_SHIFT;
4265           no = 0;
4266         }
4267       else if (strncmp (str, "COM", 3) == 0)
4268         flag = EGPS__V_COM;
4269     }
4270
4271   if (flag == 0)
4272     {
4273       char c = str[len];
4274       str[len] = 0;
4275       as_warn (_("unknown section attribute %s"), str);
4276       str[len] = c;
4277       return 0;
4278     }
4279
4280   if (no)
4281     return flag << EGPS__V_NO_SHIFT;
4282   else
4283     return flag;
4284 }
4285
4286 /* Handle the section specific pseudo-op.  */
4287
4288 #define EVAX_SECTION_COUNT 5
4289
4290 static const char *section_name[EVAX_SECTION_COUNT + 1] =
4291   { "NULL", ".rdata", ".comm", ".link", ".ctors", ".dtors" };
4292
4293 static void
4294 s_alpha_section (int secid)
4295 {
4296   const char *name;
4297   char *beg;
4298   segT sec;
4299   flagword vms_flags = 0;
4300   symbolS *symbol;
4301
4302   if (secid == 0)
4303     {
4304       name = s_alpha_section_name ();
4305       if (name == NULL)
4306         return;
4307       sec = subseg_new (name, 0);
4308       if (*input_line_pointer == ',')
4309         {
4310           /* Skip the comma.  */
4311           ++input_line_pointer;
4312           SKIP_WHITESPACE ();
4313
4314           do
4315             {
4316               char c;
4317
4318               SKIP_WHITESPACE ();
4319               c = get_symbol_name (&beg);
4320               *input_line_pointer = c;
4321
4322               vms_flags |= s_alpha_section_word (beg, input_line_pointer - beg);
4323
4324               SKIP_WHITESPACE_AFTER_NAME ();
4325             }
4326           while (*input_line_pointer++ == ',');
4327
4328           --input_line_pointer;
4329         }
4330
4331         symbol = symbol_find_or_make (name);
4332         S_SET_SEGMENT (symbol, sec);
4333         symbol_get_bfdsym (symbol)->flags |= BSF_SECTION_SYM;
4334         bfd_vms_set_section_flags
4335           (stdoutput, sec,
4336            (vms_flags >> EGPS__V_NO_SHIFT) & EGPS__V_MASK,
4337            vms_flags & EGPS__V_MASK);
4338     }
4339   else
4340     {
4341       get_absolute_expression ();
4342       subseg_new (section_name[secid], 0);
4343     }
4344
4345   demand_empty_rest_of_line ();
4346   alpha_insn_label = NULL;
4347   alpha_auto_align_on = 1;
4348   alpha_current_align = 0;
4349 }
4350
4351 static void
4352 s_alpha_literals (int ignore ATTRIBUTE_UNUSED)
4353 {
4354   subseg_new (".literals", 0);
4355   demand_empty_rest_of_line ();
4356   alpha_insn_label = NULL;
4357   alpha_auto_align_on = 1;
4358   alpha_current_align = 0;
4359 }
4360
4361 /* Parse .ent directives.  */
4362
4363 static void
4364 s_alpha_ent (int ignore ATTRIBUTE_UNUSED)
4365 {
4366   symbolS *symbol;
4367   expressionS symexpr;
4368
4369   if (alpha_evax_proc != NULL)
4370     as_bad (_("previous .ent not closed by a .end"));
4371
4372   alpha_evax_proc = &alpha_evax_proc_data;
4373
4374   alpha_evax_proc->pdsckind = 0;
4375   alpha_evax_proc->framereg = -1;
4376   alpha_evax_proc->framesize = 0;
4377   alpha_evax_proc->rsa_offset = 0;
4378   alpha_evax_proc->ra_save = AXP_REG_RA;
4379   alpha_evax_proc->fp_save = -1;
4380   alpha_evax_proc->imask = 0;
4381   alpha_evax_proc->fmask = 0;
4382   alpha_evax_proc->prologue = 0;
4383   alpha_evax_proc->type = 0;
4384   alpha_evax_proc->handler = 0;
4385   alpha_evax_proc->handler_data = 0;
4386
4387   expression (&symexpr);
4388
4389   if (symexpr.X_op != O_symbol)
4390     {
4391       as_fatal (_(".ent directive has no symbol"));
4392       demand_empty_rest_of_line ();
4393       return;
4394     }
4395
4396   symbol = make_expr_symbol (&symexpr);
4397   symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
4398   alpha_evax_proc->symbol = symbol;
4399
4400   demand_empty_rest_of_line ();
4401 }
4402
4403 static void
4404 s_alpha_handler (int is_data)
4405 {
4406   if (is_data)
4407     alpha_evax_proc->handler_data = get_absolute_expression ();
4408   else
4409     {
4410       char *name, name_end;
4411
4412       name_end = get_symbol_name (&name);
4413
4414       if (! is_name_beginner (*name))
4415         {
4416           as_warn (_(".handler directive has no name"));
4417         }
4418       else
4419         {
4420           symbolS *sym;
4421
4422           sym = symbol_find_or_make (name);
4423           symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
4424           alpha_evax_proc->handler = sym;
4425         }
4426
4427       (void) restore_line_pointer (name_end);
4428     }
4429
4430   demand_empty_rest_of_line ();
4431 }
4432
4433 /* Parse .frame <framreg>,<framesize>,RA,<rsa_offset> directives.  */
4434
4435 static void
4436 s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
4437 {
4438   long val;
4439   int ra;
4440
4441   alpha_evax_proc->framereg = tc_get_register (1);
4442
4443   SKIP_WHITESPACE ();
4444   if (*input_line_pointer++ != ','
4445       || get_absolute_expression_and_terminator (&val) != ',')
4446     {
4447       as_warn (_("Bad .frame directive 1./2. param"));
4448       --input_line_pointer;
4449       demand_empty_rest_of_line ();
4450       return;
4451     }
4452
4453   alpha_evax_proc->framesize = val;
4454
4455   ra = tc_get_register (1);
4456   if (ra != AXP_REG_RA)
4457     as_warn (_("Bad RA (%d) register for .frame"), ra);
4458
4459   SKIP_WHITESPACE ();
4460   if (*input_line_pointer++ != ',')
4461     {
4462       as_warn (_("Bad .frame directive 3./4. param"));
4463       --input_line_pointer;
4464       demand_empty_rest_of_line ();
4465       return;
4466     }
4467   alpha_evax_proc->rsa_offset = get_absolute_expression ();
4468 }
4469
4470 /* Parse .prologue.  */
4471
4472 static void
4473 s_alpha_prologue (int ignore ATTRIBUTE_UNUSED)
4474 {
4475   demand_empty_rest_of_line ();
4476   alpha_prologue_label = symbol_new
4477     (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
4478 }
4479
4480 /* Parse .pdesc <entry_name>,{null|stack|reg}
4481    Insert a procedure descriptor.  */
4482
4483 static void
4484 s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
4485 {
4486   char *name;
4487   char name_end;
4488   char *p;
4489   expressionS exp;
4490   symbolS *entry_sym;
4491   const char *entry_sym_name;
4492   const char *pdesc_sym_name;
4493   fixS *fixp;
4494   size_t len;
4495
4496   if (now_seg != alpha_link_section)
4497     {
4498       as_bad (_(".pdesc directive not in link (.link) section"));
4499       return;
4500     }
4501
4502   expression (&exp);
4503   if (exp.X_op != O_symbol)
4504     {
4505       as_bad (_(".pdesc directive has no entry symbol"));
4506       return;
4507     }
4508
4509   entry_sym = make_expr_symbol (&exp);
4510   entry_sym_name = S_GET_NAME (entry_sym);
4511
4512   /* Strip "..en".  */
4513   len = strlen (entry_sym_name);
4514   if (len < 4 || strcmp (entry_sym_name + len - 4, "..en") != 0)
4515     {
4516       as_bad (_(".pdesc has a bad entry symbol"));
4517       return;
4518     }
4519   len -= 4;
4520   pdesc_sym_name = S_GET_NAME (alpha_evax_proc->symbol);
4521
4522   if (!alpha_evax_proc
4523       || !S_IS_DEFINED (alpha_evax_proc->symbol)
4524       || strlen (pdesc_sym_name) != len
4525       || memcmp (entry_sym_name, pdesc_sym_name, len) != 0)
4526     {
4527       as_fatal (_(".pdesc doesn't match with last .ent"));
4528       return;
4529     }
4530
4531   /* Define pdesc symbol.  */
4532   symbol_set_value_now (alpha_evax_proc->symbol);
4533
4534   /* Save bfd symbol of proc entry in function symbol.  */
4535   ((struct evax_private_udata_struct *)
4536      symbol_get_bfdsym (alpha_evax_proc->symbol)->udata.p)->enbsym
4537        = symbol_get_bfdsym (entry_sym);
4538
4539   SKIP_WHITESPACE ();
4540   if (*input_line_pointer++ != ',')
4541     {
4542       as_warn (_("No comma after .pdesc <entryname>"));
4543       demand_empty_rest_of_line ();
4544       return;
4545     }
4546
4547   SKIP_WHITESPACE ();
4548   name_end = get_symbol_name (&name);
4549
4550   if (strncmp (name, "stack", 5) == 0)
4551     alpha_evax_proc->pdsckind = PDSC_S_K_KIND_FP_STACK;
4552
4553   else if (strncmp (name, "reg", 3) == 0)
4554     alpha_evax_proc->pdsckind = PDSC_S_K_KIND_FP_REGISTER;
4555
4556   else if (strncmp (name, "null", 4) == 0)
4557     alpha_evax_proc->pdsckind = PDSC_S_K_KIND_NULL;
4558
4559   else
4560     {
4561       (void) restore_line_pointer (name_end);
4562       as_fatal (_("unknown procedure kind"));
4563       demand_empty_rest_of_line ();
4564       return;
4565     }
4566
4567   (void) restore_line_pointer (name_end);
4568   demand_empty_rest_of_line ();
4569
4570 #ifdef md_flush_pending_output
4571   md_flush_pending_output ();
4572 #endif
4573
4574   frag_align (3, 0, 0);
4575   p = frag_more (16);
4576   fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
4577   fixp->fx_done = 1;
4578
4579   *p = alpha_evax_proc->pdsckind
4580     | ((alpha_evax_proc->framereg == 29) ? PDSC_S_M_BASE_REG_IS_FP : 0)
4581     | ((alpha_evax_proc->handler) ? PDSC_S_M_HANDLER_VALID : 0)
4582     | ((alpha_evax_proc->handler_data) ? PDSC_S_M_HANDLER_DATA_VALID : 0);
4583   *(p + 1) = PDSC_S_M_NATIVE | PDSC_S_M_NO_JACKET;
4584
4585   switch (alpha_evax_proc->pdsckind)
4586     {
4587     case PDSC_S_K_KIND_NULL:
4588       *(p + 2) = 0;
4589       *(p + 3) = 0;
4590       break;
4591     case PDSC_S_K_KIND_FP_REGISTER:
4592       *(p + 2) = alpha_evax_proc->fp_save;
4593       *(p + 3) = alpha_evax_proc->ra_save;
4594       break;
4595     case PDSC_S_K_KIND_FP_STACK:
4596       md_number_to_chars (p + 2, (valueT) alpha_evax_proc->rsa_offset, 2);
4597       break;
4598     default:            /* impossible */
4599       break;
4600     }
4601
4602   *(p + 4) = 0;
4603   *(p + 5) = alpha_evax_proc->type & 0x0f;
4604
4605   /* Signature offset.  */
4606   md_number_to_chars (p + 6, (valueT) 0, 2);
4607
4608   fix_new_exp (frag_now, p - frag_now->fr_literal + 8,
4609                8, &exp, 0, BFD_RELOC_64);
4610
4611   if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_NULL)
4612     return;
4613
4614   /* pdesc+16: Size.  */
4615   p = frag_more (6);
4616   md_number_to_chars (p, (valueT) alpha_evax_proc->framesize, 4);
4617   md_number_to_chars (p + 4, (valueT) 0, 2);
4618
4619   /* Entry length.  */
4620   exp.X_op = O_subtract;
4621   exp.X_add_symbol = alpha_prologue_label;
4622   exp.X_op_symbol = entry_sym;
4623   emit_expr (&exp, 2);
4624
4625   if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_FP_REGISTER)
4626     return;
4627
4628   /* pdesc+24: register masks.  */
4629   p = frag_more (8);
4630   md_number_to_chars (p, alpha_evax_proc->imask, 4);
4631   md_number_to_chars (p + 4, alpha_evax_proc->fmask, 4);
4632
4633   if (alpha_evax_proc->handler)
4634     {
4635       p = frag_more (8);
4636       fixp = fix_new (frag_now, p - frag_now->fr_literal, 8,
4637                       alpha_evax_proc->handler, 0, 0, BFD_RELOC_64);
4638     }
4639
4640   if (alpha_evax_proc->handler_data)
4641     {
4642       p = frag_more (8);
4643       md_number_to_chars (p, alpha_evax_proc->handler_data, 8);
4644     }
4645 }
4646
4647 /* Support for crash debug on vms.  */
4648
4649 static void
4650 s_alpha_name (int ignore ATTRIBUTE_UNUSED)
4651 {
4652   char *p;
4653   expressionS exp;
4654
4655   if (now_seg != alpha_link_section)
4656     {
4657       as_bad (_(".name directive not in link (.link) section"));
4658       demand_empty_rest_of_line ();
4659       return;
4660     }
4661
4662   expression (&exp);
4663   if (exp.X_op != O_symbol)
4664     {
4665       as_warn (_(".name directive has no symbol"));
4666       demand_empty_rest_of_line ();
4667       return;
4668     }
4669
4670   demand_empty_rest_of_line ();
4671
4672 #ifdef md_flush_pending_output
4673   md_flush_pending_output ();
4674 #endif
4675
4676   frag_align (3, 0, 0);
4677   p = frag_more (8);
4678
4679   fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &exp, 0, BFD_RELOC_64);
4680 }
4681
4682 /* Parse .linkage <symbol>.
4683    Create a linkage pair relocation.  */
4684
4685 static void
4686 s_alpha_linkage (int ignore ATTRIBUTE_UNUSED)
4687 {
4688   expressionS exp;
4689   char *p;
4690   fixS *fixp;
4691
4692 #ifdef md_flush_pending_output
4693   md_flush_pending_output ();
4694 #endif
4695
4696   expression (&exp);
4697   if (exp.X_op != O_symbol)
4698     {
4699       as_fatal (_("No symbol after .linkage"));
4700     }
4701   else
4702     {
4703       struct alpha_linkage_fixups *linkage_fixup;
4704
4705       p = frag_more (LKP_S_K_SIZE);
4706       memset (p, 0, LKP_S_K_SIZE);
4707       fixp = fix_new_exp
4708         (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,
4709          BFD_RELOC_ALPHA_LINKAGE);
4710
4711       if (alpha_insn_label == NULL)
4712         alpha_insn_label = symbol_new
4713           (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
4714
4715       /* Create a linkage element.  */
4716       linkage_fixup = XNEW (struct alpha_linkage_fixups);
4717       linkage_fixup->fixp = fixp;
4718       linkage_fixup->next = NULL;
4719       linkage_fixup->label = alpha_insn_label;
4720
4721       /* Append it to the list.  */
4722       if (alpha_linkage_fixup_root == NULL)
4723         alpha_linkage_fixup_root = linkage_fixup;
4724       else
4725         alpha_linkage_fixup_tail->next = linkage_fixup;
4726       alpha_linkage_fixup_tail = linkage_fixup;
4727     }
4728   demand_empty_rest_of_line ();
4729 }
4730
4731 /* Parse .code_address <symbol>.
4732    Create a code address relocation.  */
4733
4734 static void
4735 s_alpha_code_address (int ignore ATTRIBUTE_UNUSED)
4736 {
4737   expressionS exp;
4738   char *p;
4739
4740 #ifdef md_flush_pending_output
4741   md_flush_pending_output ();
4742 #endif
4743
4744   expression (&exp);
4745   if (exp.X_op != O_symbol)
4746     as_fatal (_("No symbol after .code_address"));
4747   else
4748     {
4749       p = frag_more (8);
4750       memset (p, 0, 8);
4751       fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &exp, 0,\
4752                    BFD_RELOC_ALPHA_CODEADDR);
4753     }
4754   demand_empty_rest_of_line ();
4755 }
4756
4757 static void
4758 s_alpha_fp_save (int ignore ATTRIBUTE_UNUSED)
4759 {
4760   alpha_evax_proc->fp_save = tc_get_register (1);
4761
4762   demand_empty_rest_of_line ();
4763 }
4764
4765 static void
4766 s_alpha_mask (int ignore ATTRIBUTE_UNUSED)
4767 {
4768   long val;
4769
4770   if (get_absolute_expression_and_terminator (&val) != ',')
4771     {
4772       as_warn (_("Bad .mask directive"));
4773       --input_line_pointer;
4774     }
4775   else
4776     {
4777       alpha_evax_proc->imask = val;
4778       (void) get_absolute_expression ();
4779     }
4780   demand_empty_rest_of_line ();
4781 }
4782
4783 static void
4784 s_alpha_fmask (int ignore ATTRIBUTE_UNUSED)
4785 {
4786   long val;
4787
4788   if (get_absolute_expression_and_terminator (&val) != ',')
4789     {
4790       as_warn (_("Bad .fmask directive"));
4791       --input_line_pointer;
4792     }
4793   else
4794     {
4795       alpha_evax_proc->fmask = val;
4796       (void) get_absolute_expression ();
4797     }
4798   demand_empty_rest_of_line ();
4799 }
4800
4801 static void
4802 s_alpha_end (int ignore ATTRIBUTE_UNUSED)
4803 {
4804   char *name;
4805   char c;
4806
4807   c = get_symbol_name (&name);
4808   (void) restore_line_pointer (c);
4809   demand_empty_rest_of_line ();
4810   alpha_evax_proc = NULL;
4811 }
4812
4813 static void
4814 s_alpha_file (int ignore ATTRIBUTE_UNUSED)
4815 {
4816   symbolS *s;
4817   int length;
4818   static char case_hack[32];
4819
4820   sprintf (case_hack, "<CASE:%01d%01d>",
4821            alpha_flag_hash_long_names, alpha_flag_show_after_trunc);
4822
4823   s = symbol_find_or_make (case_hack);
4824   symbol_get_bfdsym (s)->flags |= BSF_FILE;
4825
4826   get_absolute_expression ();
4827   s = symbol_find_or_make (demand_copy_string (&length));
4828   symbol_get_bfdsym (s)->flags |= BSF_FILE;
4829   demand_empty_rest_of_line ();
4830 }
4831 #endif /* OBJ_EVAX  */
4832
4833 /* Handle the .gprel32 pseudo op.  */
4834
4835 static void
4836 s_alpha_gprel32 (int ignore ATTRIBUTE_UNUSED)
4837 {
4838   expressionS e;
4839   char *p;
4840
4841   SKIP_WHITESPACE ();
4842   expression (&e);
4843
4844 #ifdef OBJ_ELF
4845   switch (e.X_op)
4846     {
4847     case O_constant:
4848       e.X_add_symbol = section_symbol (absolute_section);
4849       e.X_op = O_symbol;
4850       /* FALLTHRU */
4851     case O_symbol:
4852       break;
4853     default:
4854       abort ();
4855     }
4856 #else
4857 #ifdef OBJ_ECOFF
4858   switch (e.X_op)
4859     {
4860     case O_constant:
4861       e.X_add_symbol = section_symbol (absolute_section);
4862       /* fall through */
4863     case O_symbol:
4864       e.X_op = O_subtract;
4865       e.X_op_symbol = alpha_gp_symbol;
4866       break;
4867     default:
4868       abort ();
4869     }
4870 #endif
4871 #endif
4872
4873   if (alpha_auto_align_on && alpha_current_align < 2)
4874     alpha_align (2, (char *) NULL, alpha_insn_label, 0);
4875   if (alpha_current_align > 2)
4876     alpha_current_align = 2;
4877   alpha_insn_label = NULL;
4878
4879   p = frag_more (4);
4880   memset (p, 0, 4);
4881   fix_new_exp (frag_now, p - frag_now->fr_literal, 4,
4882                &e, 0, BFD_RELOC_GPREL32);
4883 }
4884
4885 /* Handle floating point allocation pseudo-ops.  This is like the
4886    generic version, but it makes sure the current label, if any, is
4887    correctly aligned.  */
4888
4889 static void
4890 s_alpha_float_cons (int type)
4891 {
4892   int log_size;
4893
4894   switch (type)
4895     {
4896     default:
4897     case 'f':
4898     case 'F':
4899       log_size = 2;
4900       break;
4901
4902     case 'd':
4903     case 'D':
4904     case 'G':
4905       log_size = 3;
4906       break;
4907
4908     case 'x':
4909     case 'X':
4910     case 'p':
4911     case 'P':
4912       log_size = 4;
4913       break;
4914     }
4915
4916   if (alpha_auto_align_on && alpha_current_align < log_size)
4917     alpha_align (log_size, (char *) NULL, alpha_insn_label, 0);
4918   if (alpha_current_align > log_size)
4919     alpha_current_align = log_size;
4920   alpha_insn_label = NULL;
4921
4922   float_cons (type);
4923 }
4924
4925 /* Handle the .proc pseudo op.  We don't really do much with it except
4926    parse it.  */
4927
4928 static void
4929 s_alpha_proc (int is_static ATTRIBUTE_UNUSED)
4930 {
4931   char *name;
4932   char c;
4933   char *p;
4934   symbolS *symbolP;
4935   int temp;
4936
4937   /* Takes ".proc name,nargs".  */
4938   SKIP_WHITESPACE ();
4939   c = get_symbol_name (&name);
4940   p = input_line_pointer;
4941   symbolP = symbol_find_or_make (name);
4942   *p = c;
4943   SKIP_WHITESPACE_AFTER_NAME ();
4944   if (*input_line_pointer != ',')
4945     {
4946       *p = 0;
4947       as_warn (_("Expected comma after name \"%s\""), name);
4948       *p = c;
4949       temp = 0;
4950       ignore_rest_of_line ();
4951     }
4952   else
4953     {
4954       input_line_pointer++;
4955       temp = get_absolute_expression ();
4956     }
4957   /*  *symbol_get_obj (symbolP) = (signed char) temp; */
4958   (void) symbolP;
4959   as_warn (_("unhandled: .proc %s,%d"), name, temp);
4960   demand_empty_rest_of_line ();
4961 }
4962
4963 /* Handle the .set pseudo op.  This is used to turn on and off most of
4964    the assembler features.  */
4965
4966 static void
4967 s_alpha_set (int x ATTRIBUTE_UNUSED)
4968 {
4969   char *name, ch, *s;
4970   int yesno = 1;
4971
4972   SKIP_WHITESPACE ();
4973
4974   ch = get_symbol_name (&name);
4975   s = name;
4976   if (s[0] == 'n' && s[1] == 'o')
4977     {
4978       yesno = 0;
4979       s += 2;
4980     }
4981   if (!strcmp ("reorder", s))
4982     /* ignore */ ;
4983   else if (!strcmp ("at", s))
4984     alpha_noat_on = !yesno;
4985   else if (!strcmp ("macro", s))
4986     alpha_macros_on = yesno;
4987   else if (!strcmp ("move", s))
4988     /* ignore */ ;
4989   else if (!strcmp ("volatile", s))
4990     /* ignore */ ;
4991   else
4992     as_warn (_("Tried to .set unrecognized mode `%s'"), name);
4993
4994   (void) restore_line_pointer (ch);
4995   demand_empty_rest_of_line ();
4996 }
4997
4998 /* Handle the .base pseudo op.  This changes the assembler's notion of
4999    the $gp register.  */
5000
5001 static void
5002 s_alpha_base (int ignore ATTRIBUTE_UNUSED)
5003 {
5004   SKIP_WHITESPACE ();
5005
5006   if (*input_line_pointer == '$')
5007     {
5008       /* $rNN form.  */
5009       input_line_pointer++;
5010       if (*input_line_pointer == 'r')
5011         input_line_pointer++;
5012     }
5013
5014   alpha_gp_register = get_absolute_expression ();
5015   if (alpha_gp_register < 0 || alpha_gp_register > 31)
5016     {
5017       alpha_gp_register = AXP_REG_GP;
5018       as_warn (_("Bad base register, using $%d."), alpha_gp_register);
5019     }
5020
5021   demand_empty_rest_of_line ();
5022 }
5023
5024 /* Handle the .align pseudo-op.  This aligns to a power of two.  It
5025    also adjusts any current instruction label.  We treat this the same
5026    way the MIPS port does: .align 0 turns off auto alignment.  */
5027
5028 static void
5029 s_alpha_align (int ignore ATTRIBUTE_UNUSED)
5030 {
5031   int align;
5032   char fill, *pfill;
5033   long max_alignment = 16;
5034
5035   align = get_absolute_expression ();
5036   if (align > max_alignment)
5037     {
5038       align = max_alignment;
5039       as_bad (_("Alignment too large: %d. assumed"), align);
5040     }
5041   else if (align < 0)
5042     {
5043       as_warn (_("Alignment negative: 0 assumed"));
5044       align = 0;
5045     }
5046
5047   if (*input_line_pointer == ',')
5048     {
5049       input_line_pointer++;
5050       fill = get_absolute_expression ();
5051       pfill = &fill;
5052     }
5053   else
5054     pfill = NULL;
5055
5056   if (align != 0)
5057     {
5058       alpha_auto_align_on = 1;
5059       alpha_align (align, pfill, NULL, 1);
5060     }
5061   else
5062     {
5063       alpha_auto_align_on = 0;
5064     }
5065   alpha_insn_label = NULL;
5066
5067   demand_empty_rest_of_line ();
5068 }
5069
5070 /* Hook the normal string processor to reset known alignment.  */
5071
5072 static void
5073 s_alpha_stringer (int terminate)
5074 {
5075   alpha_current_align = 0;
5076   alpha_insn_label = NULL;
5077   stringer (8 + terminate);
5078 }
5079
5080 /* Hook the normal space processing to reset known alignment.  */
5081
5082 static void
5083 s_alpha_space (int ignore)
5084 {
5085   alpha_current_align = 0;
5086   alpha_insn_label = NULL;
5087   s_space (ignore);
5088 }
5089
5090 /* Hook into cons for auto-alignment.  */
5091
5092 void
5093 alpha_cons_align (int size)
5094 {
5095   int log_size;
5096
5097   log_size = 0;
5098   while ((size >>= 1) != 0)
5099     ++log_size;
5100
5101   if (alpha_auto_align_on && alpha_current_align < log_size)
5102     alpha_align (log_size, (char *) NULL, alpha_insn_label, 0);
5103   if (alpha_current_align > log_size)
5104     alpha_current_align = log_size;
5105   alpha_insn_label = NULL;
5106 }
5107
5108 /* Here come the .uword, .ulong, and .uquad explicitly unaligned
5109    pseudos.  We just turn off auto-alignment and call down to cons.  */
5110
5111 static void
5112 s_alpha_ucons (int bytes)
5113 {
5114   int hold = alpha_auto_align_on;
5115   alpha_auto_align_on = 0;
5116   cons (bytes);
5117   alpha_auto_align_on = hold;
5118 }
5119
5120 /* Switch the working cpu type.  */
5121
5122 static void
5123 s_alpha_arch (int ignored ATTRIBUTE_UNUSED)
5124 {
5125   char *name, ch;
5126   const struct cpu_type *p;
5127
5128   SKIP_WHITESPACE ();
5129
5130   ch = get_symbol_name (&name);
5131
5132   for (p = cpu_types; p->name; ++p)
5133     if (strcmp (name, p->name) == 0)
5134       {
5135         alpha_target_name = p->name, alpha_target = p->flags;
5136         goto found;
5137       }
5138   as_warn (_("Unknown CPU identifier `%s'"), name);
5139
5140 found:
5141   (void) restore_line_pointer (ch);
5142   demand_empty_rest_of_line ();
5143 }
5144 \f
5145 #ifdef DEBUG1
5146 /* print token expression with alpha specific extension.  */
5147
5148 static void
5149 alpha_print_token (FILE *f, const expressionS *exp)
5150 {
5151   switch (exp->X_op)
5152     {
5153     case O_cpregister:
5154       putc (',', f);
5155       /* FALLTHRU */
5156     case O_pregister:
5157       putc ('(', f);
5158       {
5159         expressionS nexp = *exp;
5160         nexp.X_op = O_register;
5161         print_expr_1 (f, &nexp);
5162       }
5163       putc (')', f);
5164       break;
5165     default:
5166       print_expr_1 (f, exp);
5167       break;
5168     }
5169 }
5170 #endif
5171 \f
5172 /* The target specific pseudo-ops which we support.  */
5173
5174 const pseudo_typeS md_pseudo_table[] =
5175 {
5176 #ifdef OBJ_ECOFF
5177   {"comm", s_alpha_comm, 0},    /* OSF1 compiler does this.  */
5178   {"rdata", s_alpha_rdata, 0},
5179 #endif
5180   {"text", s_alpha_text, 0},
5181   {"data", s_alpha_data, 0},
5182 #ifdef OBJ_ECOFF
5183   {"sdata", s_alpha_sdata, 0},
5184 #endif
5185 #ifdef OBJ_ELF
5186   {"section", s_alpha_section, 0},
5187   {"section.s", s_alpha_section, 0},
5188   {"sect", s_alpha_section, 0},
5189   {"sect.s", s_alpha_section, 0},
5190 #endif
5191 #ifdef OBJ_EVAX
5192   {"section", s_alpha_section, 0},
5193   {"literals", s_alpha_literals, 0},
5194   {"pdesc", s_alpha_pdesc, 0},
5195   {"name", s_alpha_name, 0},
5196   {"linkage", s_alpha_linkage, 0},
5197   {"code_address", s_alpha_code_address, 0},
5198   {"ent", s_alpha_ent, 0},
5199   {"frame", s_alpha_frame, 0},
5200   {"fp_save", s_alpha_fp_save, 0},
5201   {"mask", s_alpha_mask, 0},
5202   {"fmask", s_alpha_fmask, 0},
5203   {"end", s_alpha_end, 0},
5204   {"file", s_alpha_file, 0},
5205   {"rdata", s_alpha_section, 1},
5206   {"comm", s_alpha_comm, 0},
5207   {"link", s_alpha_section, 3},
5208   {"ctors", s_alpha_section, 4},
5209   {"dtors", s_alpha_section, 5},
5210   {"handler", s_alpha_handler, 0},
5211   {"handler_data", s_alpha_handler, 1},
5212 #endif
5213 #ifdef OBJ_ELF
5214   /* Frame related pseudos.  */
5215   {"ent", s_alpha_ent, 0},
5216   {"end", s_alpha_end, 0},
5217   {"mask", s_alpha_mask, 0},
5218   {"fmask", s_alpha_mask, 1},
5219   {"frame", s_alpha_frame, 0},
5220   {"prologue", s_alpha_prologue, 0},
5221   {"file", s_alpha_file, 5},
5222   {"loc", s_alpha_loc, 9},
5223   {"stabs", s_alpha_stab, 's'},
5224   {"stabn", s_alpha_stab, 'n'},
5225   {"usepv", s_alpha_usepv, 0},
5226   /* COFF debugging related pseudos.  */
5227   {"begin", s_alpha_coff_wrapper, 0},
5228   {"bend", s_alpha_coff_wrapper, 1},
5229   {"def", s_alpha_coff_wrapper, 2},
5230   {"dim", s_alpha_coff_wrapper, 3},
5231   {"endef", s_alpha_coff_wrapper, 4},
5232   {"scl", s_alpha_coff_wrapper, 5},
5233   {"tag", s_alpha_coff_wrapper, 6},
5234   {"val", s_alpha_coff_wrapper, 7},
5235 #else
5236 #ifdef OBJ_EVAX
5237   {"prologue", s_alpha_prologue, 0},
5238 #else
5239   {"prologue", s_ignore, 0},
5240 #endif
5241 #endif
5242   {"gprel32", s_alpha_gprel32, 0},
5243   {"t_floating", s_alpha_float_cons, 'd'},
5244   {"s_floating", s_alpha_float_cons, 'f'},
5245   {"f_floating", s_alpha_float_cons, 'F'},
5246   {"g_floating", s_alpha_float_cons, 'G'},
5247   {"d_floating", s_alpha_float_cons, 'D'},
5248
5249   {"proc", s_alpha_proc, 0},
5250   {"aproc", s_alpha_proc, 1},
5251   {"set", s_alpha_set, 0},
5252   {"reguse", s_ignore, 0},
5253   {"livereg", s_ignore, 0},
5254   {"base", s_alpha_base, 0},            /*??*/
5255   {"option", s_ignore, 0},
5256   {"aent", s_ignore, 0},
5257   {"ugen", s_ignore, 0},
5258   {"eflag", s_ignore, 0},
5259
5260   {"align", s_alpha_align, 0},
5261   {"double", s_alpha_float_cons, 'd'},
5262   {"float", s_alpha_float_cons, 'f'},
5263   {"single", s_alpha_float_cons, 'f'},
5264   {"ascii", s_alpha_stringer, 0},
5265   {"asciz", s_alpha_stringer, 1},
5266   {"string", s_alpha_stringer, 1},
5267   {"space", s_alpha_space, 0},
5268   {"skip", s_alpha_space, 0},
5269   {"zero", s_alpha_space, 0},
5270
5271 /* Unaligned data pseudos.  */
5272   {"uword", s_alpha_ucons, 2},
5273   {"ulong", s_alpha_ucons, 4},
5274   {"uquad", s_alpha_ucons, 8},
5275
5276 #ifdef OBJ_ELF
5277 /* Dwarf wants these versions of unaligned.  */
5278   {"2byte", s_alpha_ucons, 2},
5279   {"4byte", s_alpha_ucons, 4},
5280   {"8byte", s_alpha_ucons, 8},
5281 #endif
5282
5283 /* We don't do any optimizing, so we can safely ignore these.  */
5284   {"noalias", s_ignore, 0},
5285   {"alias", s_ignore, 0},
5286
5287   {"arch", s_alpha_arch, 0},
5288
5289   {NULL, 0, 0},
5290 };
5291 \f
5292 #ifdef OBJ_ECOFF
5293
5294 /* @@@ GP selection voodoo.  All of this seems overly complicated and
5295    unnecessary; which is the primary reason it's for ECOFF only.  */
5296
5297 static inline void
5298 maybe_set_gp (asection *sec)
5299 {
5300   bfd_vma vma;
5301
5302   if (!sec)
5303     return;
5304   vma = bfd_get_section_vma (sec->owner, sec);
5305   if (vma && vma < alpha_gp_value)
5306     alpha_gp_value = vma;
5307 }
5308
5309 static void
5310 select_gp_value (void)
5311 {
5312   gas_assert (alpha_gp_value == 0);
5313
5314   /* Get minus-one in whatever width...  */
5315   alpha_gp_value = 0;
5316   alpha_gp_value--;
5317
5318   /* Select the smallest VMA of these existing sections.  */
5319   maybe_set_gp (alpha_lita_section);
5320
5321 /* @@ Will a simple 0x8000 work here?  If not, why not?  */
5322 #define GP_ADJUSTMENT   (0x8000 - 0x10)
5323
5324   alpha_gp_value += GP_ADJUSTMENT;
5325
5326   S_SET_VALUE (alpha_gp_symbol, alpha_gp_value);
5327
5328 #ifdef DEBUG1
5329   printf (_("Chose GP value of %lx\n"), alpha_gp_value);
5330 #endif
5331 }
5332 #endif /* OBJ_ECOFF */
5333
5334 #ifdef OBJ_ELF
5335 /* Map 's' to SHF_ALPHA_GPREL.  */
5336
5337 bfd_vma
5338 alpha_elf_section_letter (int letter, const char **ptr_msg)
5339 {
5340   if (letter == 's')
5341     return SHF_ALPHA_GPREL;
5342
5343   *ptr_msg = _("bad .section directive: want a,s,w,x,M,S,G,T in string");
5344   return -1;
5345 }
5346
5347 /* Map SHF_ALPHA_GPREL to SEC_SMALL_DATA.  */
5348
5349 flagword
5350 alpha_elf_section_flags (flagword flags, bfd_vma attr, int type ATTRIBUTE_UNUSED)
5351 {
5352   if (attr & SHF_ALPHA_GPREL)
5353     flags |= SEC_SMALL_DATA;
5354   return flags;
5355 }
5356 #endif /* OBJ_ELF */
5357
5358 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
5359    of an rs_align_code fragment.  */
5360
5361 void
5362 alpha_handle_align (fragS *fragp)
5363 {
5364   static unsigned char const unop[4] = { 0x00, 0x00, 0xfe, 0x2f };
5365   static unsigned char const nopunop[8] =
5366   {
5367     0x1f, 0x04, 0xff, 0x47,
5368     0x00, 0x00, 0xfe, 0x2f
5369   };
5370
5371   int bytes, fix;
5372   char *p;
5373
5374   if (fragp->fr_type != rs_align_code)
5375     return;
5376
5377   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
5378   p = fragp->fr_literal + fragp->fr_fix;
5379   fix = 0;
5380
5381   if (bytes & 3)
5382     {
5383       fix = bytes & 3;
5384       memset (p, 0, fix);
5385       p += fix;
5386       bytes -= fix;
5387     }
5388
5389   if (bytes & 4)
5390     {
5391       memcpy (p, unop, 4);
5392       p += 4;
5393       bytes -= 4;
5394       fix += 4;
5395     }
5396
5397   memcpy (p, nopunop, 8);
5398
5399   fragp->fr_fix += fix;
5400   fragp->fr_var = 8;
5401 }
5402 \f
5403 /* Public interface functions.  */
5404
5405 /* This function is called once, at assembler startup time.  It sets
5406    up all the tables, etc. that the MD part of the assembler will
5407    need, that can be determined before arguments are parsed.  */
5408
5409 void
5410 md_begin (void)
5411 {
5412   unsigned int i;
5413
5414   /* Verify that X_op field is wide enough.  */
5415   {
5416     expressionS e;
5417
5418     e.X_op = O_max;
5419     gas_assert (e.X_op == O_max);
5420   }
5421
5422   /* Create the opcode hash table.  */
5423   alpha_opcode_hash = hash_new ();
5424
5425   for (i = 0; i < alpha_num_opcodes;)
5426     {
5427       const char *name, *retval, *slash;
5428
5429       name = alpha_opcodes[i].name;
5430       retval = hash_insert (alpha_opcode_hash, name, (void *) &alpha_opcodes[i]);
5431       if (retval)
5432         as_fatal (_("internal error: can't hash opcode `%s': %s"),
5433                   name, retval);
5434
5435       /* Some opcodes include modifiers of various sorts with a "/mod"
5436          syntax, like the architecture manual suggests.  However, for
5437          use with gcc at least, we also need access to those same opcodes
5438          without the "/".  */
5439
5440       if ((slash = strchr (name, '/')) != NULL)
5441         {
5442           char *p = XNEWVEC (char, strlen (name));
5443
5444           memcpy (p, name, slash - name);
5445           strcpy (p + (slash - name), slash + 1);
5446
5447           (void) hash_insert (alpha_opcode_hash, p, (void *) &alpha_opcodes[i]);
5448           /* Ignore failures -- the opcode table does duplicate some
5449              variants in different forms, like "hw_stq" and "hw_st/q".  */
5450         }
5451
5452       while (++i < alpha_num_opcodes
5453              && (alpha_opcodes[i].name == name
5454                  || !strcmp (alpha_opcodes[i].name, name)))
5455         continue;
5456     }
5457
5458   /* Create the macro hash table.  */
5459   alpha_macro_hash = hash_new ();
5460
5461   for (i = 0; i < alpha_num_macros;)
5462     {
5463       const char *name, *retval;
5464
5465       name = alpha_macros[i].name;
5466       retval = hash_insert (alpha_macro_hash, name, (void *) &alpha_macros[i]);
5467       if (retval)
5468         as_fatal (_("internal error: can't hash macro `%s': %s"),
5469                   name, retval);
5470
5471       while (++i < alpha_num_macros
5472              && (alpha_macros[i].name == name
5473                  || !strcmp (alpha_macros[i].name, name)))
5474         continue;
5475     }
5476
5477   /* Construct symbols for each of the registers.  */
5478   for (i = 0; i < 32; ++i)
5479     {
5480       char name[4];
5481
5482       sprintf (name, "$%d", i);
5483       alpha_register_table[i] = symbol_create (name, reg_section, i,
5484                                                &zero_address_frag);
5485     }
5486
5487   for (; i < 64; ++i)
5488     {
5489       char name[5];
5490
5491       sprintf (name, "$f%d", i - 32);
5492       alpha_register_table[i] = symbol_create (name, reg_section, i,
5493                                                &zero_address_frag);
5494     }
5495
5496   /* Create the special symbols and sections we'll be using.  */
5497
5498   /* So .sbss will get used for tiny objects.  */
5499   bfd_set_gp_size (stdoutput, g_switch_value);
5500
5501 #ifdef OBJ_ECOFF
5502   create_literal_section (".lita", &alpha_lita_section, &alpha_lita_symbol);
5503
5504   /* For handling the GP, create a symbol that won't be output in the
5505      symbol table.  We'll edit it out of relocs later.  */
5506   alpha_gp_symbol = symbol_create ("<GP value>", alpha_lita_section, 0x8000,
5507                                    &zero_address_frag);
5508 #endif
5509
5510 #ifdef OBJ_EVAX
5511   create_literal_section (".link", &alpha_link_section, &alpha_link_symbol);
5512 #endif
5513
5514 #ifdef OBJ_ELF
5515   if (ECOFF_DEBUGGING)
5516     {
5517       segT sec = subseg_new (".mdebug", (subsegT) 0);
5518       bfd_set_section_flags (stdoutput, sec, SEC_HAS_CONTENTS | SEC_READONLY);
5519       bfd_set_section_alignment (stdoutput, sec, 3);
5520     }
5521 #endif
5522
5523   /* Create literal lookup hash table.  */
5524   alpha_literal_hash = hash_new ();
5525
5526   subseg_set (text_section, 0);
5527 }
5528
5529 /* The public interface to the instruction assembler.  */
5530
5531 void
5532 md_assemble (char *str)
5533 {
5534   /* Current maximum is 13.  */
5535   char opname[32];
5536   expressionS tok[MAX_INSN_ARGS];
5537   int ntok, trunclen;
5538   size_t opnamelen;
5539
5540   /* Split off the opcode.  */
5541   opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/46819");
5542   trunclen = (opnamelen < sizeof (opname) - 1
5543               ? opnamelen
5544               : sizeof (opname) - 1);
5545   memcpy (opname, str, trunclen);
5546   opname[trunclen] = '\0';
5547
5548   /* Tokenize the rest of the line.  */
5549   if ((ntok = tokenize_arguments (str + opnamelen, tok, MAX_INSN_ARGS)) < 0)
5550     {
5551       if (ntok != TOKENIZE_ERROR_REPORT)
5552         as_bad (_("syntax error"));
5553
5554       return;
5555     }
5556
5557   /* Finish it off.  */
5558   assemble_tokens (opname, tok, ntok, alpha_macros_on);
5559 }
5560
5561 /* Round up a section's size to the appropriate boundary.  */
5562
5563 valueT
5564 md_section_align (segT seg, valueT size)
5565 {
5566   int align = bfd_get_section_alignment (stdoutput, seg);
5567   valueT mask = ((valueT) 1 << align) - 1;
5568
5569   return (size + mask) & ~mask;
5570 }
5571
5572 /* Turn a string in input_line_pointer into a floating point constant
5573    of type TYPE, and store the appropriate bytes in *LITP.  The number
5574    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
5575    returned, or NULL on OK.  */
5576
5577 const char *
5578 md_atof (int type, char *litP, int *sizeP)
5579 {
5580   extern const char *vax_md_atof (int, char *, int *);
5581
5582   switch (type)
5583     {
5584       /* VAX floats.  */
5585     case 'G':
5586       /* vax_md_atof() doesn't like "G" for some reason.  */
5587       type = 'g';
5588       /* Fall through.  */
5589     case 'F':
5590     case 'D':
5591       return vax_md_atof (type, litP, sizeP);
5592
5593     default:
5594       return ieee_md_atof (type, litP, sizeP, FALSE);
5595     }
5596 }
5597
5598 /* Take care of the target-specific command-line options.  */
5599
5600 int
5601 md_parse_option (int c, const char *arg)
5602 {
5603   switch (c)
5604     {
5605     case 'F':
5606       alpha_nofloats_on = 1;
5607       break;
5608
5609     case OPTION_32ADDR:
5610       alpha_addr32_on = 1;
5611       break;
5612
5613     case 'g':
5614       alpha_debug = 1;
5615       break;
5616
5617     case 'G':
5618       g_switch_value = atoi (arg);
5619       break;
5620
5621     case 'm':
5622       {
5623         const struct cpu_type *p;
5624
5625         for (p = cpu_types; p->name; ++p)
5626           if (strcmp (arg, p->name) == 0)
5627             {
5628               alpha_target_name = p->name, alpha_target = p->flags;
5629               goto found;
5630             }
5631         as_warn (_("Unknown CPU identifier `%s'"), arg);
5632       found:;
5633       }
5634       break;
5635
5636 #ifdef OBJ_EVAX
5637     case '+':                   /* For g++.  Hash any name > 63 chars long.  */
5638       alpha_flag_hash_long_names = 1;
5639       break;
5640
5641     case 'H':                   /* Show new symbol after hash truncation.  */
5642       alpha_flag_show_after_trunc = 1;
5643       break;
5644
5645     case 'h':                   /* For gnu-c/vax compatibility.  */
5646       break;
5647
5648     case OPTION_REPLACE:
5649       alpha_flag_replace = 1;
5650       break;
5651
5652     case OPTION_NOREPLACE:
5653       alpha_flag_replace = 0;
5654       break;
5655 #endif
5656
5657     case OPTION_RELAX:
5658       alpha_flag_relax = 1;
5659       break;
5660
5661 #ifdef OBJ_ELF
5662     case OPTION_MDEBUG:
5663       alpha_flag_mdebug = 1;
5664       break;
5665     case OPTION_NO_MDEBUG:
5666       alpha_flag_mdebug = 0;
5667       break;
5668 #endif
5669
5670     default:
5671       return 0;
5672     }
5673
5674   return 1;
5675 }
5676
5677 /* Print a description of the command-line options that we accept.  */
5678
5679 void
5680 md_show_usage (FILE *stream)
5681 {
5682   fputs (_("\
5683 Alpha options:\n\
5684 -32addr                 treat addresses as 32-bit values\n\
5685 -F                      lack floating point instructions support\n\
5686 -mev4 | -mev45 | -mev5 | -mev56 | -mpca56 | -mev6 | -mev67 | -mev68 | -mall\n\
5687                         specify variant of Alpha architecture\n\
5688 -m21064 | -m21066 | -m21164 | -m21164a | -m21164pc | -m21264 | -m21264a | -m21264b\n\
5689                         these variants include PALcode opcodes\n"),
5690         stream);
5691 #ifdef OBJ_EVAX
5692   fputs (_("\
5693 VMS options:\n\
5694 -+                      encode (don't truncate) names longer than 64 characters\n\
5695 -H                      show new symbol after hash truncation\n\
5696 -replace/-noreplace     enable or disable the optimization of procedure calls\n"),
5697         stream);
5698 #endif
5699 }
5700
5701 /* Decide from what point a pc-relative relocation is relative to,
5702    relative to the pc-relative fixup.  Er, relatively speaking.  */
5703
5704 long
5705 md_pcrel_from (fixS *fixP)
5706 {
5707   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
5708
5709   switch (fixP->fx_r_type)
5710     {
5711     case BFD_RELOC_23_PCREL_S2:
5712     case BFD_RELOC_ALPHA_HINT:
5713     case BFD_RELOC_ALPHA_BRSGP:
5714       return addr + 4;
5715     default:
5716       return addr;
5717     }
5718 }
5719
5720 /* Attempt to simplify or even eliminate a fixup.  The return value is
5721    ignored; perhaps it was once meaningful, but now it is historical.
5722    To indicate that a fixup has been eliminated, set fixP->fx_done.
5723
5724    For ELF, here it is that we transform the GPDISP_HI16 reloc we used
5725    internally into the GPDISP reloc used externally.  We had to do
5726    this so that we'd have the GPDISP_LO16 reloc as a tag to compute
5727    the distance to the "lda" instruction for setting the addend to
5728    GPDISP.  */
5729
5730 void
5731 md_apply_fix (fixS *fixP, valueT * valP, segT seg)
5732 {
5733   char * const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5734   valueT value = * valP;
5735   unsigned image, size;
5736
5737   switch (fixP->fx_r_type)
5738     {
5739       /* The GPDISP relocations are processed internally with a symbol
5740          referring to the current function's section;  we need to drop
5741          in a value which, when added to the address of the start of
5742          the function, gives the desired GP.  */
5743     case BFD_RELOC_ALPHA_GPDISP_HI16:
5744       {
5745         fixS *next = fixP->fx_next;
5746
5747         /* With user-specified !gpdisp relocations, we can be missing
5748            the matching LO16 reloc.  We will have already issued an
5749            error message.  */
5750         if (next)
5751           fixP->fx_offset = (next->fx_frag->fr_address + next->fx_where
5752                              - fixP->fx_frag->fr_address - fixP->fx_where);
5753
5754         value = (value - sign_extend_16 (value)) >> 16;
5755       }
5756 #ifdef OBJ_ELF
5757       fixP->fx_r_type = BFD_RELOC_ALPHA_GPDISP;
5758 #endif
5759       goto do_reloc_gp;
5760
5761     case BFD_RELOC_ALPHA_GPDISP_LO16:
5762       value = sign_extend_16 (value);
5763       fixP->fx_offset = 0;
5764 #ifdef OBJ_ELF
5765       fixP->fx_done = 1;
5766 #endif
5767
5768     do_reloc_gp:
5769       fixP->fx_addsy = section_symbol (seg);
5770       md_number_to_chars (fixpos, value, 2);
5771       break;
5772
5773     case BFD_RELOC_8:
5774       if (fixP->fx_pcrel)
5775         fixP->fx_r_type = BFD_RELOC_8_PCREL;
5776       size = 1;
5777       goto do_reloc_xx;
5778
5779     case BFD_RELOC_16:
5780       if (fixP->fx_pcrel)
5781         fixP->fx_r_type = BFD_RELOC_16_PCREL;
5782       size = 2;
5783       goto do_reloc_xx;
5784
5785     case BFD_RELOC_32:
5786       if (fixP->fx_pcrel)
5787         fixP->fx_r_type = BFD_RELOC_32_PCREL;
5788       size = 4;
5789       goto do_reloc_xx;
5790
5791     case BFD_RELOC_64:
5792       if (fixP->fx_pcrel)
5793         fixP->fx_r_type = BFD_RELOC_64_PCREL;
5794       size = 8;
5795
5796     do_reloc_xx:
5797       if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0)
5798         {
5799           md_number_to_chars (fixpos, value, size);
5800           goto done;
5801         }
5802       return;
5803
5804 #ifdef OBJ_ECOFF
5805     case BFD_RELOC_GPREL32:
5806       gas_assert (fixP->fx_subsy == alpha_gp_symbol);
5807       fixP->fx_subsy = 0;
5808       /* FIXME: inherited this obliviousness of `value' -- why?  */
5809       md_number_to_chars (fixpos, -alpha_gp_value, 4);
5810       break;
5811 #else
5812     case BFD_RELOC_GPREL32:
5813 #endif
5814     case BFD_RELOC_GPREL16:
5815     case BFD_RELOC_ALPHA_GPREL_HI16:
5816     case BFD_RELOC_ALPHA_GPREL_LO16:
5817       return;
5818
5819     case BFD_RELOC_23_PCREL_S2:
5820       if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0)
5821         {
5822           image = bfd_getl32 (fixpos);
5823           image = (image & ~0x1FFFFF) | ((value >> 2) & 0x1FFFFF);
5824           goto write_done;
5825         }
5826       return;
5827
5828     case BFD_RELOC_ALPHA_HINT:
5829       if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0)
5830         {
5831           image = bfd_getl32 (fixpos);
5832           image = (image & ~0x3FFF) | ((value >> 2) & 0x3FFF);
5833           goto write_done;
5834         }
5835       return;
5836
5837 #ifdef OBJ_ELF
5838     case BFD_RELOC_ALPHA_BRSGP:
5839       return;
5840
5841     case BFD_RELOC_ALPHA_TLSGD:
5842     case BFD_RELOC_ALPHA_TLSLDM:
5843     case BFD_RELOC_ALPHA_GOTDTPREL16:
5844     case BFD_RELOC_ALPHA_DTPREL_HI16:
5845     case BFD_RELOC_ALPHA_DTPREL_LO16:
5846     case BFD_RELOC_ALPHA_DTPREL16:
5847     case BFD_RELOC_ALPHA_GOTTPREL16:
5848     case BFD_RELOC_ALPHA_TPREL_HI16:
5849     case BFD_RELOC_ALPHA_TPREL_LO16:
5850     case BFD_RELOC_ALPHA_TPREL16:
5851       if (fixP->fx_addsy)
5852         S_SET_THREAD_LOCAL (fixP->fx_addsy);
5853       return;
5854 #endif
5855
5856 #ifdef OBJ_ECOFF
5857     case BFD_RELOC_ALPHA_LITERAL:
5858       md_number_to_chars (fixpos, value, 2);
5859       return;
5860 #endif
5861     case BFD_RELOC_ALPHA_ELF_LITERAL:
5862     case BFD_RELOC_ALPHA_LITUSE:
5863     case BFD_RELOC_ALPHA_LINKAGE:
5864     case BFD_RELOC_ALPHA_CODEADDR:
5865       return;
5866
5867 #ifdef OBJ_EVAX
5868     case BFD_RELOC_ALPHA_NOP:
5869       value -= (8 + 4); /* PC-relative, base is jsr+4.  */
5870
5871       /* From B.4.5.2 of the OpenVMS Linker Utility Manual:
5872          "Finally, the ETIR$C_STC_BSR command passes the same address
5873           as ETIR$C_STC_NOP (so that they will fail or succeed together),
5874           and the same test is done again."  */
5875       if (S_GET_SEGMENT (fixP->fx_addsy) == undefined_section)
5876         {
5877           fixP->fx_addnumber = -value;
5878           return;
5879         }
5880
5881       if ((abs (value) >> 2) & ~0xfffff)
5882         goto done;
5883       else
5884         {
5885           /* Change to a nop.  */
5886           image = 0x47FF041F;
5887           goto write_done;
5888         }
5889
5890     case BFD_RELOC_ALPHA_LDA:
5891       /* fixup_segment sets fixP->fx_addsy to NULL when it can pre-compute
5892          the value for an O_subtract.  */
5893       if (fixP->fx_addsy
5894           && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section)
5895         {
5896           fixP->fx_addnumber = symbol_get_bfdsym (fixP->fx_subsy)->value;
5897           return;
5898         }
5899
5900       if ((abs (value)) & ~0x7fff)
5901         goto done;
5902       else
5903         {
5904           /* Change to an lda.  */
5905           image = 0x237B0000 | (value & 0xFFFF);
5906           goto write_done;
5907         }
5908
5909     case BFD_RELOC_ALPHA_BSR:
5910     case BFD_RELOC_ALPHA_BOH:
5911       value -= 4; /* PC-relative, base is jsr+4.  */
5912
5913       /* See comment in the BFD_RELOC_ALPHA_NOP case above.  */
5914       if (S_GET_SEGMENT (fixP->fx_addsy) == undefined_section)
5915         {
5916           fixP->fx_addnumber = -value;
5917           return;
5918         }
5919
5920       if ((abs (value) >> 2) & ~0xfffff)
5921         {
5922           /* Out of range.  */
5923           if (fixP->fx_r_type == BFD_RELOC_ALPHA_BOH)
5924             {
5925               /* Add a hint.  */
5926               image = bfd_getl32(fixpos);
5927               image = (image & ~0x3FFF) | ((value >> 2) & 0x3FFF);
5928               goto write_done;
5929             }
5930           goto done;
5931         }
5932       else
5933         {
5934           /* Change to a branch.  */
5935           image = 0xD3400000 | ((value >> 2) & 0x1FFFFF);
5936           goto write_done;
5937         }
5938 #endif
5939
5940     case BFD_RELOC_VTABLE_INHERIT:
5941     case BFD_RELOC_VTABLE_ENTRY:
5942       return;
5943
5944     default:
5945       {
5946         const struct alpha_operand *operand;
5947
5948         if ((int) fixP->fx_r_type >= 0)
5949           as_fatal (_("unhandled relocation type %s"),
5950                     bfd_get_reloc_code_name (fixP->fx_r_type));
5951
5952         gas_assert (-(int) fixP->fx_r_type < (int) alpha_num_operands);
5953         operand = &alpha_operands[-(int) fixP->fx_r_type];
5954
5955         /* The rest of these fixups only exist internally during symbol
5956            resolution and have no representation in the object file.
5957            Therefore they must be completely resolved as constants.  */
5958
5959         if (fixP->fx_addsy != 0
5960             && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section)
5961           as_bad_where (fixP->fx_file, fixP->fx_line,
5962                         _("non-absolute expression in constant field"));
5963
5964         image = bfd_getl32 (fixpos);
5965         image = insert_operand (image, operand, (offsetT) value,
5966                                 fixP->fx_file, fixP->fx_line);
5967       }
5968       goto write_done;
5969     }
5970
5971   if (fixP->fx_addsy != 0 || fixP->fx_pcrel != 0)
5972     return;
5973   else
5974     {
5975       as_warn_where (fixP->fx_file, fixP->fx_line,
5976                      _("type %d reloc done?\n"), (int) fixP->fx_r_type);
5977       goto done;
5978     }
5979
5980 write_done:
5981   md_number_to_chars (fixpos, image, 4);
5982
5983 done:
5984   fixP->fx_done = 1;
5985 }
5986
5987 /* Look for a register name in the given symbol.  */
5988
5989 symbolS *
5990 md_undefined_symbol (char *name)
5991 {
5992   if (*name == '$')
5993     {
5994       int is_float = 0, num;
5995
5996       switch (*++name)
5997         {
5998         case 'f':
5999           if (name[1] == 'p' && name[2] == '\0')
6000             return alpha_register_table[AXP_REG_FP];
6001           is_float = 32;
6002           /* Fall through.  */
6003
6004         case 'r':
6005           if (!ISDIGIT (*++name))
6006             break;
6007           /* Fall through.  */
6008
6009         case '0': case '1': case '2': case '3': case '4':
6010         case '5': case '6': case '7': case '8': case '9':
6011           if (name[1] == '\0')
6012             num = name[0] - '0';
6013           else if (name[0] != '0' && ISDIGIT (name[1]) && name[2] == '\0')
6014             {
6015               num = (name[0] - '0') * 10 + name[1] - '0';
6016               if (num >= 32)
6017                 break;
6018             }
6019           else
6020             break;
6021
6022           if (!alpha_noat_on && (num + is_float) == AXP_REG_AT)
6023             as_warn (_("Used $at without \".set noat\""));
6024           return alpha_register_table[num + is_float];
6025
6026         case 'a':
6027           if (name[1] == 't' && name[2] == '\0')
6028             {
6029               if (!alpha_noat_on)
6030                 as_warn (_("Used $at without \".set noat\""));
6031               return alpha_register_table[AXP_REG_AT];
6032             }
6033           break;
6034
6035         case 'g':
6036           if (name[1] == 'p' && name[2] == '\0')
6037             return alpha_register_table[alpha_gp_register];
6038           break;
6039
6040         case 's':
6041           if (name[1] == 'p' && name[2] == '\0')
6042             return alpha_register_table[AXP_REG_SP];
6043           break;
6044         }
6045     }
6046   return NULL;
6047 }
6048
6049 #ifdef OBJ_ECOFF
6050 /* @@@ Magic ECOFF bits.  */
6051
6052 void
6053 alpha_frob_ecoff_data (void)
6054 {
6055   select_gp_value ();
6056   /* $zero and $f31 are read-only.  */
6057   alpha_gprmask &= ~1;
6058   alpha_fprmask &= ~1;
6059 }
6060 #endif
6061
6062 /* Hook to remember a recently defined label so that the auto-align
6063    code can adjust the symbol after we know what alignment will be
6064    required.  */
6065
6066 void
6067 alpha_define_label (symbolS *sym)
6068 {
6069   alpha_insn_label = sym;
6070 #ifdef OBJ_ELF
6071   dwarf2_emit_label (sym);
6072 #endif
6073 }
6074
6075 /* Return true if we must always emit a reloc for a type and false if
6076    there is some hope of resolving it at assembly time.  */
6077
6078 int
6079 alpha_force_relocation (fixS *f)
6080 {
6081   if (alpha_flag_relax)
6082     return 1;
6083
6084   switch (f->fx_r_type)
6085     {
6086     case BFD_RELOC_ALPHA_GPDISP_HI16:
6087     case BFD_RELOC_ALPHA_GPDISP_LO16:
6088     case BFD_RELOC_ALPHA_GPDISP:
6089     case BFD_RELOC_ALPHA_LITERAL:
6090     case BFD_RELOC_ALPHA_ELF_LITERAL:
6091     case BFD_RELOC_ALPHA_LITUSE:
6092     case BFD_RELOC_GPREL16:
6093     case BFD_RELOC_GPREL32:
6094     case BFD_RELOC_ALPHA_GPREL_HI16:
6095     case BFD_RELOC_ALPHA_GPREL_LO16:
6096     case BFD_RELOC_ALPHA_LINKAGE:
6097     case BFD_RELOC_ALPHA_CODEADDR:
6098     case BFD_RELOC_ALPHA_BRSGP:
6099     case BFD_RELOC_ALPHA_TLSGD:
6100     case BFD_RELOC_ALPHA_TLSLDM:
6101     case BFD_RELOC_ALPHA_GOTDTPREL16:
6102     case BFD_RELOC_ALPHA_DTPREL_HI16:
6103     case BFD_RELOC_ALPHA_DTPREL_LO16:
6104     case BFD_RELOC_ALPHA_DTPREL16:
6105     case BFD_RELOC_ALPHA_GOTTPREL16:
6106     case BFD_RELOC_ALPHA_TPREL_HI16:
6107     case BFD_RELOC_ALPHA_TPREL_LO16:
6108     case BFD_RELOC_ALPHA_TPREL16:
6109 #ifdef OBJ_EVAX
6110     case BFD_RELOC_ALPHA_NOP:
6111     case BFD_RELOC_ALPHA_BSR:
6112     case BFD_RELOC_ALPHA_LDA:
6113     case BFD_RELOC_ALPHA_BOH:
6114 #endif
6115       return 1;
6116
6117     default:
6118       break;
6119     }
6120
6121   return generic_force_reloc (f);
6122 }
6123
6124 /* Return true if we can partially resolve a relocation now.  */
6125
6126 int
6127 alpha_fix_adjustable (fixS *f)
6128 {
6129   /* Are there any relocation types for which we must generate a
6130      reloc but we can adjust the values contained within it?   */
6131   switch (f->fx_r_type)
6132     {
6133     case BFD_RELOC_ALPHA_GPDISP_HI16:
6134     case BFD_RELOC_ALPHA_GPDISP_LO16:
6135     case BFD_RELOC_ALPHA_GPDISP:
6136       return 0;
6137
6138     case BFD_RELOC_ALPHA_LITERAL:
6139     case BFD_RELOC_ALPHA_ELF_LITERAL:
6140     case BFD_RELOC_ALPHA_LITUSE:
6141     case BFD_RELOC_ALPHA_LINKAGE:
6142     case BFD_RELOC_ALPHA_CODEADDR:
6143       return 1;
6144
6145     case BFD_RELOC_VTABLE_ENTRY:
6146     case BFD_RELOC_VTABLE_INHERIT:
6147       return 0;
6148
6149     case BFD_RELOC_GPREL16:
6150     case BFD_RELOC_GPREL32:
6151     case BFD_RELOC_ALPHA_GPREL_HI16:
6152     case BFD_RELOC_ALPHA_GPREL_LO16:
6153     case BFD_RELOC_23_PCREL_S2:
6154     case BFD_RELOC_16:
6155     case BFD_RELOC_32:
6156     case BFD_RELOC_64:
6157     case BFD_RELOC_ALPHA_HINT:
6158       return 1;
6159
6160     case BFD_RELOC_ALPHA_TLSGD:
6161     case BFD_RELOC_ALPHA_TLSLDM:
6162     case BFD_RELOC_ALPHA_GOTDTPREL16:
6163     case BFD_RELOC_ALPHA_DTPREL_HI16:
6164     case BFD_RELOC_ALPHA_DTPREL_LO16:
6165     case BFD_RELOC_ALPHA_DTPREL16:
6166     case BFD_RELOC_ALPHA_GOTTPREL16:
6167     case BFD_RELOC_ALPHA_TPREL_HI16:
6168     case BFD_RELOC_ALPHA_TPREL_LO16:
6169     case BFD_RELOC_ALPHA_TPREL16:
6170       /* ??? No idea why we can't return a reference to .tbss+10, but
6171          we're preventing this in the other assemblers.  Follow for now.  */
6172       return 0;
6173
6174 #ifdef OBJ_ELF
6175     case BFD_RELOC_ALPHA_BRSGP:
6176       /* If we have a BRSGP reloc to a local symbol, adjust it to BRADDR and
6177          let it get resolved at assembly time.  */
6178       {
6179         symbolS *sym = f->fx_addsy;
6180         const char *name;
6181         int offset = 0;
6182
6183         if (generic_force_reloc (f))
6184           return 0;
6185
6186         switch (S_GET_OTHER (sym) & STO_ALPHA_STD_GPLOAD)
6187           {
6188           case STO_ALPHA_NOPV:
6189             break;
6190           case STO_ALPHA_STD_GPLOAD:
6191             offset = 8;
6192             break;
6193           default:
6194             if (S_IS_LOCAL (sym))
6195               name = "<local>";
6196             else
6197               name = S_GET_NAME (sym);
6198             as_bad_where (f->fx_file, f->fx_line,
6199                 _("!samegp reloc against symbol without .prologue: %s"),
6200                 name);
6201             break;
6202           }
6203         f->fx_r_type = BFD_RELOC_23_PCREL_S2;
6204         f->fx_offset += offset;
6205         return 1;
6206       }
6207 #endif
6208 #ifdef OBJ_EVAX
6209     case BFD_RELOC_ALPHA_NOP:
6210     case BFD_RELOC_ALPHA_BSR:
6211     case BFD_RELOC_ALPHA_LDA:
6212     case BFD_RELOC_ALPHA_BOH:
6213       return 1;
6214 #endif
6215
6216     default:
6217       return 1;
6218     }
6219 }
6220
6221 /* Generate the BFD reloc to be stuck in the object file from the
6222    fixup used internally in the assembler.  */
6223
6224 arelent *
6225 tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED,
6226               fixS *fixp)
6227 {
6228   arelent *reloc;
6229
6230   reloc = XNEW (arelent);
6231   reloc->sym_ptr_ptr = XNEW (asymbol *);
6232   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
6233   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6234
6235   /* Make sure none of our internal relocations make it this far.
6236      They'd better have been fully resolved by this point.  */
6237   gas_assert ((int) fixp->fx_r_type > 0);
6238
6239   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
6240   if (reloc->howto == NULL)
6241     {
6242       as_bad_where (fixp->fx_file, fixp->fx_line,
6243                     _("cannot represent `%s' relocation in object file"),
6244                     bfd_get_reloc_code_name (fixp->fx_r_type));
6245       return NULL;
6246     }
6247
6248   if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
6249     as_fatal (_("internal error? cannot generate `%s' relocation"),
6250               bfd_get_reloc_code_name (fixp->fx_r_type));
6251
6252   gas_assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
6253
6254   reloc->addend = fixp->fx_offset;
6255
6256 #ifdef OBJ_ECOFF
6257   /* Fake out bfd_perform_relocation. sigh.  */
6258   /* ??? Better would be to use the special_function hook.  */
6259   if (fixp->fx_r_type == BFD_RELOC_ALPHA_LITERAL)
6260     reloc->addend = -alpha_gp_value;
6261 #endif
6262
6263 #ifdef OBJ_EVAX
6264   switch (fixp->fx_r_type)
6265     {
6266       struct evax_private_udata_struct *udata;
6267       const char *pname;
6268       int pname_len;
6269
6270     case BFD_RELOC_ALPHA_LINKAGE:
6271       /* Copy the linkage index.  */
6272       reloc->addend = fixp->fx_addnumber;
6273       break;
6274
6275     case BFD_RELOC_ALPHA_NOP:
6276     case BFD_RELOC_ALPHA_BSR:
6277     case BFD_RELOC_ALPHA_LDA:
6278     case BFD_RELOC_ALPHA_BOH:
6279       pname = symbol_get_bfdsym (fixp->fx_addsy)->name;
6280
6281       /* We need the non-suffixed name of the procedure.  Beware that
6282       the main symbol might be equated so look it up and take its name.  */
6283       pname_len = strlen (pname);
6284       if (pname_len > 4 && strcmp (pname + pname_len - 4, "..en") == 0)
6285         {
6286           symbolS *sym;
6287           char *my_pname = xmemdup0 (pname, pname_len - 4);
6288           sym = symbol_find (my_pname);
6289           free (my_pname);
6290           if (sym == NULL)
6291             abort ();
6292
6293           while (symbol_equated_reloc_p (sym))
6294             {
6295               symbolS *n = symbol_get_value_expression (sym)->X_add_symbol;
6296
6297               /* We must avoid looping, as that can occur with a badly
6298                  written program.  */
6299               if (n == sym)
6300                 break;
6301               sym = n;
6302             }
6303           pname = symbol_get_bfdsym (sym)->name;
6304         }
6305
6306       udata = XNEW (struct evax_private_udata_struct);
6307       udata->enbsym = symbol_get_bfdsym (fixp->fx_addsy);
6308       udata->bsym = symbol_get_bfdsym (fixp->tc_fix_data.info->psym);
6309       udata->origname = (char *)pname;
6310       udata->lkindex = ((struct evax_private_udata_struct *)
6311         symbol_get_bfdsym (fixp->tc_fix_data.info->sym)->udata.p)->lkindex;
6312       reloc->sym_ptr_ptr = (void *)udata;
6313       reloc->addend = fixp->fx_addnumber;
6314
6315     default:
6316       break;
6317     }
6318 #endif
6319
6320   return reloc;
6321 }
6322
6323 /* Parse a register name off of the input_line and return a register
6324    number.  Gets md_undefined_symbol above to do the register name
6325    matching for us.
6326
6327    Only called as a part of processing the ECOFF .frame directive.  */
6328
6329 int
6330 tc_get_register (int frame ATTRIBUTE_UNUSED)
6331 {
6332   int framereg = AXP_REG_SP;
6333
6334   SKIP_WHITESPACE ();
6335   if (*input_line_pointer == '$')
6336     {
6337       char *s;
6338       char c = get_symbol_name (&s);
6339       symbolS *sym = md_undefined_symbol (s);
6340
6341       *strchr (s, '\0') = c;
6342       if (sym && (framereg = S_GET_VALUE (sym)) <= 31)
6343         goto found;
6344     }
6345   as_warn (_("frame reg expected, using $%d."), framereg);
6346
6347 found:
6348   note_gpreg (framereg);
6349   return framereg;
6350 }
6351
6352 /* This is called before the symbol table is processed.  In order to
6353    work with gcc when using mips-tfile, we must keep all local labels.
6354    However, in other cases, we want to discard them.  If we were
6355    called with -g, but we didn't see any debugging information, it may
6356    mean that gcc is smuggling debugging information through to
6357    mips-tfile, in which case we must generate all local labels.  */
6358
6359 #ifdef OBJ_ECOFF
6360
6361 void
6362 alpha_frob_file_before_adjust (void)
6363 {
6364   if (alpha_debug != 0
6365       && ! ecoff_debugging_seen)
6366     flag_keep_locals = 1;
6367 }
6368
6369 #endif /* OBJ_ECOFF */
6370
6371 /* The Alpha has support for some VAX floating point types, as well as for
6372    IEEE floating point.  We consider IEEE to be the primary floating point
6373    format, and sneak in the VAX floating point support here.  */
6374 #include "config/atof-vax.c"