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