Line number bug fix patch from David Mosberger.
[external/binutils.git] / gas / config / tc-ia64.c
1 /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to
20    the Free Software Foundation, 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 /*
24   TODO:
25
26   - optional operands
27   - directives:
28         .eb
29         .estate
30         .lb
31         .popsection
32         .previous
33         .psr
34         .pushsection
35   - labels are wrong if automatic alignment is introduced
36     (e.g., checkout the second real10 definition in test-data.s)
37   - DV-related stuff:
38         <reg>.safe_across_calls and any other DV-related directives I don't
39           have documentation for.
40         verify mod-sched-brs reads/writes are checked/marked (and other
41         notes)
42
43  */
44
45 #include "as.h"
46 #include "safe-ctype.h"
47 #include "dwarf2dbg.h"
48 #include "subsegs.h"
49
50 #include "opcode/ia64.h"
51
52 #include "elf/ia64.h"
53
54 #define NELEMS(a)       ((int) (sizeof (a)/sizeof ((a)[0])))
55 #define MIN(a,b)        ((a) < (b) ? (a) : (b))
56
57 #define NUM_SLOTS       4
58 #define PREV_SLOT       md.slot[(md.curr_slot + NUM_SLOTS - 1) % NUM_SLOTS]
59 #define CURR_SLOT       md.slot[md.curr_slot]
60
61 #define O_pseudo_fixup (O_max + 1)
62
63 enum special_section
64   {
65     /* IA-64 ABI section pseudo-ops.  */
66     SPECIAL_SECTION_BSS = 0,
67     SPECIAL_SECTION_SBSS,
68     SPECIAL_SECTION_SDATA,
69     SPECIAL_SECTION_RODATA,
70     SPECIAL_SECTION_COMMENT,
71     SPECIAL_SECTION_UNWIND,
72     SPECIAL_SECTION_UNWIND_INFO,
73     /* HPUX specific section pseudo-ops.  */
74     SPECIAL_SECTION_INIT_ARRAY,
75     SPECIAL_SECTION_FINI_ARRAY,
76   };
77
78 enum reloc_func
79   {
80     FUNC_DTP_MODULE,
81     FUNC_DTP_RELATIVE,
82     FUNC_FPTR_RELATIVE,
83     FUNC_GP_RELATIVE,
84     FUNC_LT_RELATIVE,
85     FUNC_LT_RELATIVE_X,
86     FUNC_PC_RELATIVE,
87     FUNC_PLT_RELATIVE,
88     FUNC_SEC_RELATIVE,
89     FUNC_SEG_RELATIVE,
90     FUNC_TP_RELATIVE,
91     FUNC_LTV_RELATIVE,
92     FUNC_LT_FPTR_RELATIVE,
93     FUNC_LT_DTP_MODULE,
94     FUNC_LT_DTP_RELATIVE,
95     FUNC_LT_TP_RELATIVE,
96     FUNC_IPLT_RELOC,
97   };
98
99 enum reg_symbol
100   {
101     REG_GR      = 0,
102     REG_FR      = (REG_GR + 128),
103     REG_AR      = (REG_FR + 128),
104     REG_CR      = (REG_AR + 128),
105     REG_P       = (REG_CR + 128),
106     REG_BR      = (REG_P  + 64),
107     REG_IP      = (REG_BR + 8),
108     REG_CFM,
109     REG_PR,
110     REG_PR_ROT,
111     REG_PSR,
112     REG_PSR_L,
113     REG_PSR_UM,
114     /* The following are pseudo-registers for use by gas only.  */
115     IND_CPUID,
116     IND_DBR,
117     IND_DTR,
118     IND_ITR,
119     IND_IBR,
120     IND_MEM,
121     IND_MSR,
122     IND_PKR,
123     IND_PMC,
124     IND_PMD,
125     IND_RR,
126     /* The following pseudo-registers are used for unwind directives only:  */
127     REG_PSP,
128     REG_PRIUNAT,
129     REG_NUM
130   };
131
132 enum dynreg_type
133   {
134     DYNREG_GR = 0,      /* dynamic general purpose register */
135     DYNREG_FR,          /* dynamic floating point register */
136     DYNREG_PR,          /* dynamic predicate register */
137     DYNREG_NUM_TYPES
138   };
139
140 enum operand_match_result
141   {
142     OPERAND_MATCH,
143     OPERAND_OUT_OF_RANGE,
144     OPERAND_MISMATCH
145   };
146
147 /* On the ia64, we can't know the address of a text label until the
148    instructions are packed into a bundle.  To handle this, we keep
149    track of the list of labels that appear in front of each
150    instruction.  */
151 struct label_fix
152 {
153   struct label_fix *next;
154   struct symbol *sym;
155 };
156
157 /* This is the endianness of the current section.  */
158 extern int target_big_endian;
159
160 /* This is the default endianness.  */
161 static int default_big_endian = TARGET_BYTES_BIG_ENDIAN;
162
163 void (*ia64_number_to_chars) PARAMS ((char *, valueT, int));
164
165 static void ia64_float_to_chars_bigendian
166   PARAMS ((char *, LITTLENUM_TYPE *, int));
167 static void ia64_float_to_chars_littleendian
168   PARAMS ((char *, LITTLENUM_TYPE *, int));
169 static void (*ia64_float_to_chars)
170   PARAMS ((char *, LITTLENUM_TYPE *, int));
171
172 static struct hash_control *alias_hash;
173 static struct hash_control *alias_name_hash;
174 static struct hash_control *secalias_hash;
175 static struct hash_control *secalias_name_hash;
176
177 /* Characters which always start a comment.  */
178 const char comment_chars[] = "";
179
180 /* Characters which start a comment at the beginning of a line.  */
181 const char line_comment_chars[] = "#";
182
183 /* Characters which may be used to separate multiple commands on a
184    single line.  */
185 const char line_separator_chars[] = ";";
186
187 /* Characters which are used to indicate an exponent in a floating
188    point number.  */
189 const char EXP_CHARS[] = "eE";
190
191 /* Characters which mean that a number is a floating point constant,
192    as in 0d1.0.  */
193 const char FLT_CHARS[] = "rRsSfFdDxXpP";
194
195 /* ia64-specific option processing:  */
196
197 const char *md_shortopts = "m:N:x::";
198
199 struct option md_longopts[] =
200   {
201 #define OPTION_MCONSTANT_GP (OPTION_MD_BASE + 1)
202     {"mconstant-gp", no_argument, NULL, OPTION_MCONSTANT_GP},
203 #define OPTION_MAUTO_PIC (OPTION_MD_BASE + 2)
204     {"mauto-pic", no_argument, NULL, OPTION_MAUTO_PIC}
205   };
206
207 size_t md_longopts_size = sizeof (md_longopts);
208
209 static struct
210   {
211     struct hash_control *pseudo_hash;   /* pseudo opcode hash table */
212     struct hash_control *reg_hash;      /* register name hash table */
213     struct hash_control *dynreg_hash;   /* dynamic register hash table */
214     struct hash_control *const_hash;    /* constant hash table */
215     struct hash_control *entry_hash;    /* code entry hint hash table */
216
217     symbolS *regsym[REG_NUM];
218
219     /* If X_op is != O_absent, the registername for the instruction's
220        qualifying predicate.  If NULL, p0 is assumed for instructions
221        that are predicatable.  */
222     expressionS qp;
223
224     unsigned int
225       manual_bundling : 1,
226       debug_dv: 1,
227       detect_dv: 1,
228       explicit_mode : 1,            /* which mode we're in */
229       default_explicit_mode : 1,    /* which mode is the default */
230       mode_explicitly_set : 1,      /* was the current mode explicitly set? */
231       auto_align : 1,
232       keep_pending_output : 1;
233
234     /* Each bundle consists of up to three instructions.  We keep
235        track of four most recent instructions so we can correctly set
236        the end_of_insn_group for the last instruction in a bundle.  */
237     int curr_slot;
238     int num_slots_in_use;
239     struct slot
240       {
241         unsigned int
242           end_of_insn_group : 1,
243           manual_bundling_on : 1,
244           manual_bundling_off : 1,
245           loc_directive_seen : 1;
246         signed char user_template;      /* user-selected template, if any */
247         unsigned char qp_regno;         /* qualifying predicate */
248         /* This duplicates a good fraction of "struct fix" but we
249            can't use a "struct fix" instead since we can't call
250            fix_new_exp() until we know the address of the instruction.  */
251         int num_fixups;
252         struct insn_fix
253           {
254             bfd_reloc_code_real_type code;
255             enum ia64_opnd opnd;        /* type of operand in need of fix */
256             unsigned int is_pcrel : 1;  /* is operand pc-relative? */
257             expressionS expr;           /* the value to be inserted */
258           }
259         fixup[2];                       /* at most two fixups per insn */
260         struct ia64_opcode *idesc;
261         struct label_fix *label_fixups;
262         struct label_fix *tag_fixups;
263         struct unw_rec_list *unwind_record;     /* Unwind directive.  */
264         expressionS opnd[6];
265         char *src_file;
266         unsigned int src_line;
267         struct dwarf2_line_info debug_line;
268       }
269     slot[NUM_SLOTS];
270
271     segT last_text_seg;
272
273     struct dynreg
274       {
275         struct dynreg *next;            /* next dynamic register */
276         const char *name;
277         unsigned short base;            /* the base register number */
278         unsigned short num_regs;        /* # of registers in this set */
279       }
280     *dynreg[DYNREG_NUM_TYPES], in, loc, out, rot;
281
282     flagword flags;                     /* ELF-header flags */
283
284     struct mem_offset {
285       unsigned hint:1;              /* is this hint currently valid? */
286       bfd_vma offset;               /* mem.offset offset */
287       bfd_vma base;                 /* mem.offset base */
288     } mem_offset;
289
290     int path;                       /* number of alt. entry points seen */
291     const char **entry_labels;      /* labels of all alternate paths in
292                                        the current DV-checking block.  */
293     int maxpaths;                   /* size currently allocated for
294                                        entry_labels */
295     /* Support for hardware errata workarounds.  */
296
297     /* Record data about the last three insn groups.  */
298     struct group
299     {
300       /* B-step workaround.
301          For each predicate register, this is set if the corresponding insn
302          group conditionally sets this register with one of the affected
303          instructions.  */
304       int p_reg_set[64];
305       /* B-step workaround.
306          For each general register, this is set if the corresponding insn
307          a) is conditional one one of the predicate registers for which
308             P_REG_SET is 1 in the corresponding entry of the previous group,
309          b) sets this general register with one of the affected
310             instructions.  */
311       int g_reg_set_conditionally[128];
312     } last_groups[3];
313     int group_idx;
314
315     int pointer_size;       /* size in bytes of a pointer */
316     int pointer_size_shift; /* shift size of a pointer for alignment */
317   }
318 md;
319
320 /* application registers:  */
321
322 #define AR_K0           0
323 #define AR_K7           7
324 #define AR_RSC          16
325 #define AR_BSP          17
326 #define AR_BSPSTORE     18
327 #define AR_RNAT         19
328 #define AR_UNAT         36
329 #define AR_FPSR         40
330 #define AR_ITC          44
331 #define AR_PFS          64
332 #define AR_LC           65
333
334 static const struct
335   {
336     const char *name;
337     int regnum;
338   }
339 ar[] =
340   {
341     {"ar.k0", 0}, {"ar.k1", 1}, {"ar.k2", 2}, {"ar.k3", 3},
342     {"ar.k4", 4}, {"ar.k5", 5}, {"ar.k6", 6}, {"ar.k7", 7},
343     {"ar.rsc",          16}, {"ar.bsp",         17},
344     {"ar.bspstore",     18}, {"ar.rnat",        19},
345     {"ar.fcr",          21}, {"ar.eflag",       24},
346     {"ar.csd",          25}, {"ar.ssd",         26},
347     {"ar.cflg",         27}, {"ar.fsr",         28},
348     {"ar.fir",          29}, {"ar.fdr",         30},
349     {"ar.ccv",          32}, {"ar.unat",        36},
350     {"ar.fpsr",         40}, {"ar.itc",         44},
351     {"ar.pfs",          64}, {"ar.lc",          65},
352     {"ar.ec",           66},
353   };
354
355 #define CR_IPSR         16
356 #define CR_ISR          17
357 #define CR_IIP          19
358 #define CR_IFA          20
359 #define CR_ITIR         21
360 #define CR_IIPA         22
361 #define CR_IFS          23
362 #define CR_IIM          24
363 #define CR_IHA          25
364 #define CR_IVR          65
365 #define CR_TPR          66
366 #define CR_EOI          67
367 #define CR_IRR0         68
368 #define CR_IRR3         71
369 #define CR_LRR0         80
370 #define CR_LRR1         81
371
372 /* control registers:  */
373 static const struct
374   {
375     const char *name;
376     int regnum;
377   }
378 cr[] =
379   {
380     {"cr.dcr",   0},
381     {"cr.itm",   1},
382     {"cr.iva",   2},
383     {"cr.pta",   8},
384     {"cr.gpta",  9},
385     {"cr.ipsr", 16},
386     {"cr.isr",  17},
387     {"cr.iip",  19},
388     {"cr.ifa",  20},
389     {"cr.itir", 21},
390     {"cr.iipa", 22},
391     {"cr.ifs",  23},
392     {"cr.iim",  24},
393     {"cr.iha",  25},
394     {"cr.lid",  64},
395     {"cr.ivr",  65},
396     {"cr.tpr",  66},
397     {"cr.eoi",  67},
398     {"cr.irr0", 68},
399     {"cr.irr1", 69},
400     {"cr.irr2", 70},
401     {"cr.irr3", 71},
402     {"cr.itv",  72},
403     {"cr.pmv",  73},
404     {"cr.cmcv", 74},
405     {"cr.lrr0", 80},
406     {"cr.lrr1", 81}
407   };
408
409 #define PSR_MFL         4
410 #define PSR_IC          13
411 #define PSR_DFL         18
412 #define PSR_CPL         32
413
414 static const struct const_desc
415   {
416     const char *name;
417     valueT value;
418   }
419 const_bits[] =
420   {
421     /* PSR constant masks:  */
422
423     /* 0: reserved */
424     {"psr.be",  ((valueT) 1) << 1},
425     {"psr.up",  ((valueT) 1) << 2},
426     {"psr.ac",  ((valueT) 1) << 3},
427     {"psr.mfl", ((valueT) 1) << 4},
428     {"psr.mfh", ((valueT) 1) << 5},
429     /* 6-12: reserved */
430     {"psr.ic",  ((valueT) 1) << 13},
431     {"psr.i",   ((valueT) 1) << 14},
432     {"psr.pk",  ((valueT) 1) << 15},
433     /* 16: reserved */
434     {"psr.dt",  ((valueT) 1) << 17},
435     {"psr.dfl", ((valueT) 1) << 18},
436     {"psr.dfh", ((valueT) 1) << 19},
437     {"psr.sp",  ((valueT) 1) << 20},
438     {"psr.pp",  ((valueT) 1) << 21},
439     {"psr.di",  ((valueT) 1) << 22},
440     {"psr.si",  ((valueT) 1) << 23},
441     {"psr.db",  ((valueT) 1) << 24},
442     {"psr.lp",  ((valueT) 1) << 25},
443     {"psr.tb",  ((valueT) 1) << 26},
444     {"psr.rt",  ((valueT) 1) << 27},
445     /* 28-31: reserved */
446     /* 32-33: cpl (current privilege level) */
447     {"psr.is",  ((valueT) 1) << 34},
448     {"psr.mc",  ((valueT) 1) << 35},
449     {"psr.it",  ((valueT) 1) << 36},
450     {"psr.id",  ((valueT) 1) << 37},
451     {"psr.da",  ((valueT) 1) << 38},
452     {"psr.dd",  ((valueT) 1) << 39},
453     {"psr.ss",  ((valueT) 1) << 40},
454     /* 41-42: ri (restart instruction) */
455     {"psr.ed",  ((valueT) 1) << 43},
456     {"psr.bn",  ((valueT) 1) << 44},
457   };
458
459 /* indirect register-sets/memory:  */
460
461 static const struct
462   {
463     const char *name;
464     int regnum;
465   }
466 indirect_reg[] =
467   {
468     { "CPUID",  IND_CPUID },
469     { "cpuid",  IND_CPUID },
470     { "dbr",    IND_DBR },
471     { "dtr",    IND_DTR },
472     { "itr",    IND_ITR },
473     { "ibr",    IND_IBR },
474     { "msr",    IND_MSR },
475     { "pkr",    IND_PKR },
476     { "pmc",    IND_PMC },
477     { "pmd",    IND_PMD },
478     { "rr",     IND_RR },
479   };
480
481 /* Pseudo functions used to indicate relocation types (these functions
482    start with an at sign (@).  */
483 static struct
484   {
485     const char *name;
486     enum pseudo_type
487       {
488         PSEUDO_FUNC_NONE,
489         PSEUDO_FUNC_RELOC,
490         PSEUDO_FUNC_CONST,
491         PSEUDO_FUNC_REG,
492         PSEUDO_FUNC_FLOAT
493       }
494     type;
495     union
496       {
497         unsigned long ival;
498         symbolS *sym;
499       }
500     u;
501   }
502 pseudo_func[] =
503   {
504     /* reloc pseudo functions (these must come first!):  */
505     { "dtpmod", PSEUDO_FUNC_RELOC, { 0 } },
506     { "dtprel", PSEUDO_FUNC_RELOC, { 0 } },
507     { "fptr",   PSEUDO_FUNC_RELOC, { 0 } },
508     { "gprel",  PSEUDO_FUNC_RELOC, { 0 } },
509     { "ltoff",  PSEUDO_FUNC_RELOC, { 0 } },
510     { "ltoffx", PSEUDO_FUNC_RELOC, { 0 } },
511     { "pcrel",  PSEUDO_FUNC_RELOC, { 0 } },
512     { "pltoff", PSEUDO_FUNC_RELOC, { 0 } },
513     { "secrel", PSEUDO_FUNC_RELOC, { 0 } },
514     { "segrel", PSEUDO_FUNC_RELOC, { 0 } },
515     { "tprel",  PSEUDO_FUNC_RELOC, { 0 } },
516     { "ltv",    PSEUDO_FUNC_RELOC, { 0 } },
517     { "", 0, { 0 } },   /* placeholder for FUNC_LT_FPTR_RELATIVE */
518     { "", 0, { 0 } },   /* placeholder for FUNC_LT_DTP_MODULE */
519     { "", 0, { 0 } },   /* placeholder for FUNC_LT_DTP_RELATIVE */
520     { "", 0, { 0 } },   /* placeholder for FUNC_LT_TP_RELATIVE */
521     { "iplt",   PSEUDO_FUNC_RELOC, { 0 } },
522
523     /* mbtype4 constants:  */
524     { "alt",    PSEUDO_FUNC_CONST, { 0xa } },
525     { "brcst",  PSEUDO_FUNC_CONST, { 0x0 } },
526     { "mix",    PSEUDO_FUNC_CONST, { 0x8 } },
527     { "rev",    PSEUDO_FUNC_CONST, { 0xb } },
528     { "shuf",   PSEUDO_FUNC_CONST, { 0x9 } },
529
530     /* fclass constants:  */
531     { "nat",    PSEUDO_FUNC_CONST, { 0x100 } },
532     { "qnan",   PSEUDO_FUNC_CONST, { 0x080 } },
533     { "snan",   PSEUDO_FUNC_CONST, { 0x040 } },
534     { "pos",    PSEUDO_FUNC_CONST, { 0x001 } },
535     { "neg",    PSEUDO_FUNC_CONST, { 0x002 } },
536     { "zero",   PSEUDO_FUNC_CONST, { 0x004 } },
537     { "unorm",  PSEUDO_FUNC_CONST, { 0x008 } },
538     { "norm",   PSEUDO_FUNC_CONST, { 0x010 } },
539     { "inf",    PSEUDO_FUNC_CONST, { 0x020 } },
540
541     { "natval", PSEUDO_FUNC_CONST, { 0x100 } }, /* old usage */
542
543     /* hint constants: */
544     { "pause",  PSEUDO_FUNC_CONST, { 0x0 } },
545
546     /* unwind-related constants:  */
547     { "svr4",   PSEUDO_FUNC_CONST,      { ELFOSABI_NONE } },
548     { "hpux",   PSEUDO_FUNC_CONST,      { ELFOSABI_HPUX } },
549     { "nt",     PSEUDO_FUNC_CONST,      { 2 } },                /* conflicts w/ELFOSABI_NETBSD */
550     { "linux",  PSEUDO_FUNC_CONST,      { ELFOSABI_LINUX } },
551     { "freebsd", PSEUDO_FUNC_CONST,     { ELFOSABI_FREEBSD } },
552     { "openvms", PSEUDO_FUNC_CONST,     { ELFOSABI_OPENVMS } },
553     { "nsk",    PSEUDO_FUNC_CONST,      { ELFOSABI_NSK } },
554
555     /* unwind-related registers:  */
556     { "priunat",PSEUDO_FUNC_REG, { REG_PRIUNAT } }
557   };
558
559 /* 41-bit nop opcodes (one per unit):  */
560 static const bfd_vma nop[IA64_NUM_UNITS] =
561   {
562     0x0000000000LL,     /* NIL => break 0 */
563     0x0008000000LL,     /* I-unit nop */
564     0x0008000000LL,     /* M-unit nop */
565     0x4000000000LL,     /* B-unit nop */
566     0x0008000000LL,     /* F-unit nop */
567     0x0008000000LL,     /* L-"unit" nop */
568     0x0008000000LL,     /* X-unit nop */
569   };
570
571 /* Can't be `const' as it's passed to input routines (which have the
572    habit of setting temporary sentinels.  */
573 static char special_section_name[][20] =
574   {
575     {".bss"}, {".sbss"}, {".sdata"}, {".rodata"}, {".comment"},
576     {".IA_64.unwind"}, {".IA_64.unwind_info"},
577     {".init_array"}, {".fini_array"}
578   };
579
580 /* The best template for a particular sequence of up to three
581    instructions:  */
582 #define N       IA64_NUM_TYPES
583 static unsigned char best_template[N][N][N];
584 #undef N
585
586 /* Resource dependencies currently in effect */
587 static struct rsrc {
588   int depind;                       /* dependency index */
589   const struct ia64_dependency *dependency; /* actual dependency */
590   unsigned specific:1,              /* is this a specific bit/regno? */
591     link_to_qp_branch:1;           /* will a branch on the same QP clear it?*/
592   int index;                        /* specific regno/bit within dependency */
593   int note;                         /* optional qualifying note (0 if none) */
594 #define STATE_NONE 0
595 #define STATE_STOP 1
596 #define STATE_SRLZ 2
597   int insn_srlz;                    /* current insn serialization state */
598   int data_srlz;                    /* current data serialization state */
599   int qp_regno;                     /* qualifying predicate for this usage */
600   char *file;                       /* what file marked this dependency */
601   unsigned int line;                /* what line marked this dependency */
602   struct mem_offset mem_offset;     /* optional memory offset hint */
603   enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
604   int path;                         /* corresponding code entry index */
605 } *regdeps = NULL;
606 static int regdepslen = 0;
607 static int regdepstotlen = 0;
608 static const char *dv_mode[] = { "RAW", "WAW", "WAR" };
609 static const char *dv_sem[] = { "none", "implied", "impliedf",
610                                 "data", "instr", "specific", "stop", "other" };
611 static const char *dv_cmp_type[] = { "none", "OR", "AND" };
612
613 /* Current state of PR mutexation */
614 static struct qpmutex {
615   valueT prmask;
616   int path;
617 } *qp_mutexes = NULL;          /* QP mutex bitmasks */
618 static int qp_mutexeslen = 0;
619 static int qp_mutexestotlen = 0;
620 static valueT qp_safe_across_calls = 0;
621
622 /* Current state of PR implications */
623 static struct qp_imply {
624   unsigned p1:6;
625   unsigned p2:6;
626   unsigned p2_branched:1;
627   int path;
628 } *qp_implies = NULL;
629 static int qp_implieslen = 0;
630 static int qp_impliestotlen = 0;
631
632 /* Keep track of static GR values so that indirect register usage can
633    sometimes be tracked.  */
634 static struct gr {
635   unsigned known:1;
636   int path;
637   valueT value;
638 } gr_values[128] = {{ 1, 0, 0 }};
639
640 /* Remember the alignment frag.  */
641 static fragS *align_frag;
642
643 /* These are the routines required to output the various types of
644    unwind records.  */
645
646 /* A slot_number is a frag address plus the slot index (0-2).  We use the
647    frag address here so that if there is a section switch in the middle of
648    a function, then instructions emitted to a different section are not
649    counted.  Since there may be more than one frag for a function, this
650    means we also need to keep track of which frag this address belongs to
651    so we can compute inter-frag distances.  This also nicely solves the
652    problem with nops emitted for align directives, which can't easily be
653    counted, but can easily be derived from frag sizes.  */
654
655 typedef struct unw_rec_list {
656   unwind_record r;
657   unsigned long slot_number;
658   fragS *slot_frag;
659   unsigned long next_slot_number;
660   fragS *next_slot_frag;
661   struct unw_rec_list *next;
662 } unw_rec_list;
663
664 #define SLOT_NUM_NOT_SET        (unsigned)-1
665
666 /* Linked list of saved prologue counts.  A very poor
667    implementation of a map from label numbers to prologue counts.  */
668 typedef struct label_prologue_count
669 {
670   struct label_prologue_count *next;
671   unsigned long label_number;
672   unsigned int prologue_count;
673 } label_prologue_count;
674
675 static struct
676 {
677   /* Maintain a list of unwind entries for the current function.  */
678   unw_rec_list *list;
679   unw_rec_list *tail;
680
681   /* Any unwind entires that should be attached to the current slot
682      that an insn is being constructed for.  */
683   unw_rec_list *current_entry;
684
685   /* These are used to create the unwind table entry for this function.  */
686   symbolS *proc_start;
687   symbolS *proc_end;
688   symbolS *info;                /* pointer to unwind info */
689   symbolS *personality_routine;
690   segT saved_text_seg;
691   subsegT saved_text_subseg;
692   unsigned int force_unwind_entry : 1;  /* force generation of unwind entry? */
693
694   /* TRUE if processing unwind directives in a prologue region.  */
695   int prologue;
696   int prologue_mask;
697   unsigned int prologue_count;  /* number of .prologues seen so far */
698   /* Prologue counts at previous .label_state directives.  */
699   struct label_prologue_count * saved_prologue_counts;
700 } unwind;
701
702 /* The input value is a negated offset from psp, and specifies an address
703    psp - offset.  The encoded value is psp + 16 - (4 * offset).  Thus we
704    must add 16 and divide by 4 to get the encoded value.  */
705
706 #define ENCODED_PSP_OFFSET(OFFSET) (((OFFSET) + 16) / 4)
707
708 typedef void (*vbyte_func) PARAMS ((int, char *, char *));
709
710 /* Forward declarations:  */
711 static void set_section PARAMS ((char *name));
712 static unsigned int set_regstack PARAMS ((unsigned int, unsigned int,
713                                           unsigned int, unsigned int));
714 static void dot_align (int);
715 static void dot_radix PARAMS ((int));
716 static void dot_special_section PARAMS ((int));
717 static void dot_proc PARAMS ((int));
718 static void dot_fframe PARAMS ((int));
719 static void dot_vframe PARAMS ((int));
720 static void dot_vframesp PARAMS ((int));
721 static void dot_vframepsp PARAMS ((int));
722 static void dot_save PARAMS ((int));
723 static void dot_restore PARAMS ((int));
724 static void dot_restorereg PARAMS ((int));
725 static void dot_restorereg_p PARAMS ((int));
726 static void dot_handlerdata  PARAMS ((int));
727 static void dot_unwentry PARAMS ((int));
728 static void dot_altrp PARAMS ((int));
729 static void dot_savemem PARAMS ((int));
730 static void dot_saveg PARAMS ((int));
731 static void dot_savef PARAMS ((int));
732 static void dot_saveb PARAMS ((int));
733 static void dot_savegf PARAMS ((int));
734 static void dot_spill PARAMS ((int));
735 static void dot_spillreg PARAMS ((int));
736 static void dot_spillmem PARAMS ((int));
737 static void dot_spillreg_p PARAMS ((int));
738 static void dot_spillmem_p PARAMS ((int));
739 static void dot_label_state PARAMS ((int));
740 static void dot_copy_state PARAMS ((int));
741 static void dot_unwabi PARAMS ((int));
742 static void dot_personality PARAMS ((int));
743 static void dot_body PARAMS ((int));
744 static void dot_prologue PARAMS ((int));
745 static void dot_endp PARAMS ((int));
746 static void dot_template PARAMS ((int));
747 static void dot_regstk PARAMS ((int));
748 static void dot_rot PARAMS ((int));
749 static void dot_byteorder PARAMS ((int));
750 static void dot_psr PARAMS ((int));
751 static void dot_alias PARAMS ((int));
752 static void dot_ln PARAMS ((int));
753 static char *parse_section_name PARAMS ((void));
754 static void dot_xdata PARAMS ((int));
755 static void stmt_float_cons PARAMS ((int));
756 static void stmt_cons_ua PARAMS ((int));
757 static void dot_xfloat_cons PARAMS ((int));
758 static void dot_xstringer PARAMS ((int));
759 static void dot_xdata_ua PARAMS ((int));
760 static void dot_xfloat_cons_ua PARAMS ((int));
761 static void print_prmask PARAMS ((valueT mask));
762 static void dot_pred_rel PARAMS ((int));
763 static void dot_reg_val PARAMS ((int));
764 static void dot_serialize PARAMS ((int));
765 static void dot_dv_mode PARAMS ((int));
766 static void dot_entry PARAMS ((int));
767 static void dot_mem_offset PARAMS ((int));
768 static void add_unwind_entry PARAMS((unw_rec_list *ptr));
769 static symbolS *declare_register PARAMS ((const char *name, int regnum));
770 static void declare_register_set PARAMS ((const char *, int, int));
771 static unsigned int operand_width PARAMS ((enum ia64_opnd));
772 static enum operand_match_result operand_match PARAMS ((const struct ia64_opcode *idesc,
773                                                         int index,
774                                                         expressionS *e));
775 static int parse_operand PARAMS ((expressionS *e));
776 static struct ia64_opcode * parse_operands PARAMS ((struct ia64_opcode *));
777 static int errata_nop_necessary_p PARAMS ((struct slot *, enum ia64_unit));
778 static void build_insn PARAMS ((struct slot *, bfd_vma *));
779 static void emit_one_bundle PARAMS ((void));
780 static void fix_insn PARAMS ((fixS *, const struct ia64_operand *, valueT));
781 static bfd_reloc_code_real_type ia64_gen_real_reloc_type PARAMS ((struct symbol *sym,
782                                                                   bfd_reloc_code_real_type r_type));
783 static void insn_group_break PARAMS ((int, int, int));
784 static void mark_resource PARAMS ((struct ia64_opcode *, const struct ia64_dependency *,
785                                    struct rsrc *, int depind, int path));
786 static void add_qp_mutex PARAMS((valueT mask));
787 static void add_qp_imply PARAMS((int p1, int p2));
788 static void clear_qp_branch_flag PARAMS((valueT mask));
789 static void clear_qp_mutex PARAMS((valueT mask));
790 static void clear_qp_implies PARAMS((valueT p1_mask, valueT p2_mask));
791 static int has_suffix_p PARAMS((const char *, const char *));
792 static void clear_register_values PARAMS ((void));
793 static void print_dependency PARAMS ((const char *action, int depind));
794 static void instruction_serialization PARAMS ((void));
795 static void data_serialization PARAMS ((void));
796 static void remove_marked_resource PARAMS ((struct rsrc *));
797 static int is_conditional_branch PARAMS ((struct ia64_opcode *));
798 static int is_taken_branch PARAMS ((struct ia64_opcode *));
799 static int is_interruption_or_rfi PARAMS ((struct ia64_opcode *));
800 static int depends_on PARAMS ((int, struct ia64_opcode *));
801 static int specify_resource PARAMS ((const struct ia64_dependency *,
802                                      struct ia64_opcode *, int, struct rsrc [], int, int));
803 static int check_dv PARAMS((struct ia64_opcode *idesc));
804 static void check_dependencies PARAMS((struct ia64_opcode *));
805 static void mark_resources PARAMS((struct ia64_opcode *));
806 static void update_dependencies PARAMS((struct ia64_opcode *));
807 static void note_register_values PARAMS((struct ia64_opcode *));
808 static int qp_mutex PARAMS ((int, int, int));
809 static int resources_match PARAMS ((struct rsrc *, struct ia64_opcode *, int, int, int));
810 static void output_vbyte_mem PARAMS ((int, char *, char *));
811 static void count_output PARAMS ((int, char *, char *));
812 static void output_R1_format PARAMS ((vbyte_func, unw_record_type, int));
813 static void output_R2_format PARAMS ((vbyte_func, int, int, unsigned long));
814 static void output_R3_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
815 static void output_P1_format PARAMS ((vbyte_func, int));
816 static void output_P2_format PARAMS ((vbyte_func, int, int));
817 static void output_P3_format PARAMS ((vbyte_func, unw_record_type, int));
818 static void output_P4_format PARAMS ((vbyte_func, unsigned char *, unsigned long));
819 static void output_P5_format PARAMS ((vbyte_func, int, unsigned long));
820 static void output_P6_format PARAMS ((vbyte_func, unw_record_type, int));
821 static void output_P7_format PARAMS ((vbyte_func, unw_record_type, unsigned long, unsigned long));
822 static void output_P8_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
823 static void output_P9_format PARAMS ((vbyte_func, int, int));
824 static void output_P10_format PARAMS ((vbyte_func, int, int));
825 static void output_B1_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
826 static void output_B2_format PARAMS ((vbyte_func, unsigned long, unsigned long));
827 static void output_B3_format PARAMS ((vbyte_func, unsigned long, unsigned long));
828 static void output_B4_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
829 static char format_ab_reg PARAMS ((int, int));
830 static void output_X1_format PARAMS ((vbyte_func, unw_record_type, int, int, unsigned long,
831                                       unsigned long));
832 static void output_X2_format PARAMS ((vbyte_func, int, int, int, int, int, unsigned long));
833 static void output_X3_format PARAMS ((vbyte_func, unw_record_type, int, int, int, unsigned long,
834                                       unsigned long));
835 static void output_X4_format PARAMS ((vbyte_func, int, int, int, int, int, int, unsigned long));
836 static unw_rec_list *output_endp PARAMS ((void));
837 static unw_rec_list *output_prologue PARAMS ((void));
838 static unw_rec_list *output_prologue_gr PARAMS ((unsigned int, unsigned int));
839 static unw_rec_list *output_body PARAMS ((void));
840 static unw_rec_list *output_mem_stack_f PARAMS ((unsigned int));
841 static unw_rec_list *output_mem_stack_v PARAMS ((void));
842 static unw_rec_list *output_psp_gr PARAMS ((unsigned int));
843 static unw_rec_list *output_psp_sprel PARAMS ((unsigned int));
844 static unw_rec_list *output_rp_when PARAMS ((void));
845 static unw_rec_list *output_rp_gr PARAMS ((unsigned int));
846 static unw_rec_list *output_rp_br PARAMS ((unsigned int));
847 static unw_rec_list *output_rp_psprel PARAMS ((unsigned int));
848 static unw_rec_list *output_rp_sprel PARAMS ((unsigned int));
849 static unw_rec_list *output_pfs_when PARAMS ((void));
850 static unw_rec_list *output_pfs_gr PARAMS ((unsigned int));
851 static unw_rec_list *output_pfs_psprel PARAMS ((unsigned int));
852 static unw_rec_list *output_pfs_sprel PARAMS ((unsigned int));
853 static unw_rec_list *output_preds_when PARAMS ((void));
854 static unw_rec_list *output_preds_gr PARAMS ((unsigned int));
855 static unw_rec_list *output_preds_psprel PARAMS ((unsigned int));
856 static unw_rec_list *output_preds_sprel PARAMS ((unsigned int));
857 static unw_rec_list *output_fr_mem PARAMS ((unsigned int));
858 static unw_rec_list *output_frgr_mem PARAMS ((unsigned int, unsigned int));
859 static unw_rec_list *output_gr_gr PARAMS ((unsigned int, unsigned int));
860 static unw_rec_list *output_gr_mem PARAMS ((unsigned int));
861 static unw_rec_list *output_br_mem PARAMS ((unsigned int));
862 static unw_rec_list *output_br_gr PARAMS ((unsigned int, unsigned int));
863 static unw_rec_list *output_spill_base PARAMS ((unsigned int));
864 static unw_rec_list *output_unat_when PARAMS ((void));
865 static unw_rec_list *output_unat_gr PARAMS ((unsigned int));
866 static unw_rec_list *output_unat_psprel PARAMS ((unsigned int));
867 static unw_rec_list *output_unat_sprel PARAMS ((unsigned int));
868 static unw_rec_list *output_lc_when PARAMS ((void));
869 static unw_rec_list *output_lc_gr PARAMS ((unsigned int));
870 static unw_rec_list *output_lc_psprel PARAMS ((unsigned int));
871 static unw_rec_list *output_lc_sprel PARAMS ((unsigned int));
872 static unw_rec_list *output_fpsr_when PARAMS ((void));
873 static unw_rec_list *output_fpsr_gr PARAMS ((unsigned int));
874 static unw_rec_list *output_fpsr_psprel PARAMS ((unsigned int));
875 static unw_rec_list *output_fpsr_sprel PARAMS ((unsigned int));
876 static unw_rec_list *output_priunat_when_gr PARAMS ((void));
877 static unw_rec_list *output_priunat_when_mem PARAMS ((void));
878 static unw_rec_list *output_priunat_gr PARAMS ((unsigned int));
879 static unw_rec_list *output_priunat_psprel PARAMS ((unsigned int));
880 static unw_rec_list *output_priunat_sprel PARAMS ((unsigned int));
881 static unw_rec_list *output_bsp_when PARAMS ((void));
882 static unw_rec_list *output_bsp_gr PARAMS ((unsigned int));
883 static unw_rec_list *output_bsp_psprel PARAMS ((unsigned int));
884 static unw_rec_list *output_bsp_sprel PARAMS ((unsigned int));
885 static unw_rec_list *output_bspstore_when PARAMS ((void));
886 static unw_rec_list *output_bspstore_gr PARAMS ((unsigned int));
887 static unw_rec_list *output_bspstore_psprel PARAMS ((unsigned int));
888 static unw_rec_list *output_bspstore_sprel PARAMS ((unsigned int));
889 static unw_rec_list *output_rnat_when PARAMS ((void));
890 static unw_rec_list *output_rnat_gr PARAMS ((unsigned int));
891 static unw_rec_list *output_rnat_psprel PARAMS ((unsigned int));
892 static unw_rec_list *output_rnat_sprel PARAMS ((unsigned int));
893 static unw_rec_list *output_unwabi PARAMS ((unsigned long, unsigned long));
894 static unw_rec_list *output_epilogue PARAMS ((unsigned long));
895 static unw_rec_list *output_label_state PARAMS ((unsigned long));
896 static unw_rec_list *output_copy_state PARAMS ((unsigned long));
897 static unw_rec_list *output_spill_psprel PARAMS ((unsigned int, unsigned int, unsigned int));
898 static unw_rec_list *output_spill_sprel PARAMS ((unsigned int, unsigned int, unsigned int));
899 static unw_rec_list *output_spill_psprel_p PARAMS ((unsigned int, unsigned int, unsigned int,
900                                                     unsigned int));
901 static unw_rec_list *output_spill_sprel_p PARAMS ((unsigned int, unsigned int, unsigned int,
902                                                    unsigned int));
903 static unw_rec_list *output_spill_reg PARAMS ((unsigned int, unsigned int, unsigned int,
904                                                unsigned int));
905 static unw_rec_list *output_spill_reg_p PARAMS ((unsigned int, unsigned int, unsigned int,
906                                                  unsigned int, unsigned int));
907 static void process_one_record PARAMS ((unw_rec_list *, vbyte_func));
908 static void process_unw_records PARAMS ((unw_rec_list *, vbyte_func));
909 static int calc_record_size PARAMS ((unw_rec_list *));
910 static void set_imask PARAMS ((unw_rec_list *, unsigned long, unsigned long, unsigned int));
911 static unsigned long slot_index PARAMS ((unsigned long, fragS *,
912                                          unsigned long, fragS *,
913                                          int));
914 static unw_rec_list *optimize_unw_records PARAMS ((unw_rec_list *));
915 static void fixup_unw_records PARAMS ((unw_rec_list *, int));
916 static int convert_expr_to_ab_reg PARAMS ((expressionS *, unsigned int *, unsigned int *));
917 static int convert_expr_to_xy_reg PARAMS ((expressionS *, unsigned int *, unsigned int *));
918 static unsigned int get_saved_prologue_count PARAMS ((unsigned long));
919 static void save_prologue_count PARAMS ((unsigned long, unsigned int));
920 static void free_saved_prologue_counts PARAMS ((void));
921
922 /* Determine if application register REGNUM resides only in the integer
923    unit (as opposed to the memory unit).  */
924 static int
925 ar_is_only_in_integer_unit (int reg)
926 {
927   reg -= REG_AR;
928   return reg >= 64 && reg <= 111;
929 }
930
931 /* Determine if application register REGNUM resides only in the memory 
932    unit (as opposed to the integer unit).  */
933 static int
934 ar_is_only_in_memory_unit (int reg)
935 {
936   reg -= REG_AR;
937   return reg >= 0 && reg <= 47;
938 }
939
940 /* Switch to section NAME and create section if necessary.  It's
941    rather ugly that we have to manipulate input_line_pointer but I
942    don't see any other way to accomplish the same thing without
943    changing obj-elf.c (which may be the Right Thing, in the end).  */
944 static void
945 set_section (name)
946      char *name;
947 {
948   char *saved_input_line_pointer;
949
950   saved_input_line_pointer = input_line_pointer;
951   input_line_pointer = name;
952   obj_elf_section (0);
953   input_line_pointer = saved_input_line_pointer;
954 }
955
956 /* Map 's' to SHF_IA_64_SHORT.  */
957
958 int
959 ia64_elf_section_letter (letter, ptr_msg)
960      int letter;
961      char **ptr_msg;
962 {
963   if (letter == 's')
964     return SHF_IA_64_SHORT;
965   else if (letter == 'o')
966     return SHF_LINK_ORDER;
967
968   *ptr_msg = _("Bad .section directive: want a,o,s,w,x,M,S,G,T in string");
969   return -1;
970 }
971
972 /* Map SHF_IA_64_SHORT to SEC_SMALL_DATA.  */
973
974 flagword
975 ia64_elf_section_flags (flags, attr, type)
976      flagword flags;
977      int attr, type ATTRIBUTE_UNUSED;
978 {
979   if (attr & SHF_IA_64_SHORT)
980     flags |= SEC_SMALL_DATA;
981   return flags;
982 }
983
984 int
985 ia64_elf_section_type (str, len)
986      const char *str;
987      size_t len;
988 {
989 #define STREQ(s) ((len == sizeof (s) - 1) && (strncmp (str, s, sizeof (s) - 1) == 0))
990
991   if (STREQ (ELF_STRING_ia64_unwind_info))
992     return SHT_PROGBITS;
993
994   if (STREQ (ELF_STRING_ia64_unwind_info_once))
995     return SHT_PROGBITS;
996
997   if (STREQ (ELF_STRING_ia64_unwind))
998     return SHT_IA_64_UNWIND;
999
1000   if (STREQ (ELF_STRING_ia64_unwind_once))
1001     return SHT_IA_64_UNWIND;
1002
1003   if (STREQ ("unwind"))
1004     return SHT_IA_64_UNWIND;
1005
1006   return -1;
1007 #undef STREQ
1008 }
1009
1010 static unsigned int
1011 set_regstack (ins, locs, outs, rots)
1012      unsigned int ins, locs, outs, rots;
1013 {
1014   /* Size of frame.  */
1015   unsigned int sof;
1016
1017   sof = ins + locs + outs;
1018   if (sof > 96)
1019     {
1020       as_bad ("Size of frame exceeds maximum of 96 registers");
1021       return 0;
1022     }
1023   if (rots > sof)
1024     {
1025       as_warn ("Size of rotating registers exceeds frame size");
1026       return 0;
1027     }
1028   md.in.base = REG_GR + 32;
1029   md.loc.base = md.in.base + ins;
1030   md.out.base = md.loc.base + locs;
1031
1032   md.in.num_regs  = ins;
1033   md.loc.num_regs = locs;
1034   md.out.num_regs = outs;
1035   md.rot.num_regs = rots;
1036   return sof;
1037 }
1038
1039 void
1040 ia64_flush_insns ()
1041 {
1042   struct label_fix *lfix;
1043   segT saved_seg;
1044   subsegT saved_subseg;
1045   unw_rec_list *ptr;
1046
1047   if (!md.last_text_seg)
1048     return;
1049
1050   saved_seg = now_seg;
1051   saved_subseg = now_subseg;
1052
1053   subseg_set (md.last_text_seg, 0);
1054
1055   while (md.num_slots_in_use > 0)
1056     emit_one_bundle ();         /* force out queued instructions */
1057
1058   /* In case there are labels following the last instruction, resolve
1059      those now:  */
1060   for (lfix = CURR_SLOT.label_fixups; lfix; lfix = lfix->next)
1061     {
1062       S_SET_VALUE (lfix->sym, frag_now_fix ());
1063       symbol_set_frag (lfix->sym, frag_now);
1064     }
1065   CURR_SLOT.label_fixups = 0;
1066   for (lfix = CURR_SLOT.tag_fixups; lfix; lfix = lfix->next)
1067     {
1068       S_SET_VALUE (lfix->sym, frag_now_fix ());
1069       symbol_set_frag (lfix->sym, frag_now);
1070     }
1071   CURR_SLOT.tag_fixups = 0;
1072
1073   /* In case there are unwind directives following the last instruction,
1074      resolve those now.  We only handle prologue, body, and endp directives
1075      here.  Give an error for others.  */
1076   for (ptr = unwind.current_entry; ptr; ptr = ptr->next)
1077     {
1078       switch (ptr->r.type)
1079         {
1080         case prologue:
1081         case prologue_gr:
1082         case body:
1083         case endp:
1084           ptr->slot_number = (unsigned long) frag_more (0);
1085           ptr->slot_frag = frag_now;
1086           break;
1087
1088           /* Allow any record which doesn't have a "t" field (i.e.,
1089              doesn't relate to a particular instruction).  */
1090         case unwabi:
1091         case br_gr:
1092         case copy_state:
1093         case fr_mem:
1094         case frgr_mem:
1095         case gr_gr:
1096         case gr_mem:
1097         case label_state:
1098         case rp_br:
1099         case spill_base:
1100         case spill_mask:
1101           /* nothing */
1102           break;
1103
1104         default:
1105           as_bad (_("Unwind directive not followed by an instruction."));
1106           break;
1107         }
1108     }
1109   unwind.current_entry = NULL;
1110
1111   subseg_set (saved_seg, saved_subseg);
1112
1113   if (md.qp.X_op == O_register)
1114     as_bad ("qualifying predicate not followed by instruction");
1115 }
1116
1117 static void
1118 ia64_do_align (int nbytes)
1119 {
1120   char *saved_input_line_pointer = input_line_pointer;
1121
1122   input_line_pointer = "";
1123   s_align_bytes (nbytes);
1124   input_line_pointer = saved_input_line_pointer;
1125 }
1126
1127 void
1128 ia64_cons_align (nbytes)
1129      int nbytes;
1130 {
1131   if (md.auto_align)
1132     {
1133       char *saved_input_line_pointer = input_line_pointer;
1134       input_line_pointer = "";
1135       s_align_bytes (nbytes);
1136       input_line_pointer = saved_input_line_pointer;
1137     }
1138 }
1139
1140 /* Output COUNT bytes to a memory location.  */
1141 static unsigned char *vbyte_mem_ptr = NULL;
1142
1143 void
1144 output_vbyte_mem (count, ptr, comment)
1145      int count;
1146      char *ptr;
1147      char *comment ATTRIBUTE_UNUSED;
1148 {
1149   int x;
1150   if (vbyte_mem_ptr == NULL)
1151     abort ();
1152
1153   if (count == 0)
1154     return;
1155   for (x = 0; x < count; x++)
1156     *(vbyte_mem_ptr++) = ptr[x];
1157 }
1158
1159 /* Count the number of bytes required for records.  */
1160 static int vbyte_count = 0;
1161 void
1162 count_output (count, ptr, comment)
1163      int count;
1164      char *ptr ATTRIBUTE_UNUSED;
1165      char *comment ATTRIBUTE_UNUSED;
1166 {
1167   vbyte_count += count;
1168 }
1169
1170 static void
1171 output_R1_format (f, rtype, rlen)
1172      vbyte_func f;
1173      unw_record_type rtype;
1174      int rlen;
1175 {
1176   int r = 0;
1177   char byte;
1178   if (rlen > 0x1f)
1179     {
1180       output_R3_format (f, rtype, rlen);
1181       return;
1182     }
1183
1184   if (rtype == body)
1185     r = 1;
1186   else if (rtype != prologue)
1187     as_bad ("record type is not valid");
1188
1189   byte = UNW_R1 | (r << 5) | (rlen & 0x1f);
1190   (*f) (1, &byte, NULL);
1191 }
1192
1193 static void
1194 output_R2_format (f, mask, grsave, rlen)
1195      vbyte_func f;
1196      int mask, grsave;
1197      unsigned long rlen;
1198 {
1199   char bytes[20];
1200   int count = 2;
1201   mask = (mask & 0x0f);
1202   grsave = (grsave & 0x7f);
1203
1204   bytes[0] = (UNW_R2 | (mask >> 1));
1205   bytes[1] = (((mask & 0x01) << 7) | grsave);
1206   count += output_leb128 (bytes + 2, rlen, 0);
1207   (*f) (count, bytes, NULL);
1208 }
1209
1210 static void
1211 output_R3_format (f, rtype, rlen)
1212      vbyte_func f;
1213      unw_record_type rtype;
1214      unsigned long rlen;
1215 {
1216   int r = 0, count;
1217   char bytes[20];
1218   if (rlen <= 0x1f)
1219     {
1220       output_R1_format (f, rtype, rlen);
1221       return;
1222     }
1223
1224   if (rtype == body)
1225     r = 1;
1226   else if (rtype != prologue)
1227     as_bad ("record type is not valid");
1228   bytes[0] = (UNW_R3 | r);
1229   count = output_leb128 (bytes + 1, rlen, 0);
1230   (*f) (count + 1, bytes, NULL);
1231 }
1232
1233 static void
1234 output_P1_format (f, brmask)
1235      vbyte_func f;
1236      int brmask;
1237 {
1238   char byte;
1239   byte = UNW_P1 | (brmask & 0x1f);
1240   (*f) (1, &byte, NULL);
1241 }
1242
1243 static void
1244 output_P2_format (f, brmask, gr)
1245      vbyte_func f;
1246      int brmask;
1247      int gr;
1248 {
1249   char bytes[2];
1250   brmask = (brmask & 0x1f);
1251   bytes[0] = UNW_P2 | (brmask >> 1);
1252   bytes[1] = (((brmask & 1) << 7) | gr);
1253   (*f) (2, bytes, NULL);
1254 }
1255
1256 static void
1257 output_P3_format (f, rtype, reg)
1258      vbyte_func f;
1259      unw_record_type rtype;
1260      int reg;
1261 {
1262   char bytes[2];
1263   int r = 0;
1264   reg = (reg & 0x7f);
1265   switch (rtype)
1266     {
1267     case psp_gr:
1268       r = 0;
1269       break;
1270     case rp_gr:
1271       r = 1;
1272       break;
1273     case pfs_gr:
1274       r = 2;
1275       break;
1276     case preds_gr:
1277       r = 3;
1278       break;
1279     case unat_gr:
1280       r = 4;
1281       break;
1282     case lc_gr:
1283       r = 5;
1284       break;
1285     case rp_br:
1286       r = 6;
1287       break;
1288     case rnat_gr:
1289       r = 7;
1290       break;
1291     case bsp_gr:
1292       r = 8;
1293       break;
1294     case bspstore_gr:
1295       r = 9;
1296       break;
1297     case fpsr_gr:
1298       r = 10;
1299       break;
1300     case priunat_gr:
1301       r = 11;
1302       break;
1303     default:
1304       as_bad ("Invalid record type for P3 format.");
1305     }
1306   bytes[0] = (UNW_P3 | (r >> 1));
1307   bytes[1] = (((r & 1) << 7) | reg);
1308   (*f) (2, bytes, NULL);
1309 }
1310
1311 static void
1312 output_P4_format (f, imask, imask_size)
1313      vbyte_func f;
1314      unsigned char *imask;
1315      unsigned long imask_size;
1316 {
1317   imask[0] = UNW_P4;
1318   (*f) (imask_size, imask, NULL);
1319 }
1320
1321 static void
1322 output_P5_format (f, grmask, frmask)
1323      vbyte_func f;
1324      int grmask;
1325      unsigned long frmask;
1326 {
1327   char bytes[4];
1328   grmask = (grmask & 0x0f);
1329
1330   bytes[0] = UNW_P5;
1331   bytes[1] = ((grmask << 4) | ((frmask & 0x000f0000) >> 16));
1332   bytes[2] = ((frmask & 0x0000ff00) >> 8);
1333   bytes[3] = (frmask & 0x000000ff);
1334   (*f) (4, bytes, NULL);
1335 }
1336
1337 static void
1338 output_P6_format (f, rtype, rmask)
1339      vbyte_func f;
1340      unw_record_type rtype;
1341      int rmask;
1342 {
1343   char byte;
1344   int r = 0;
1345
1346   if (rtype == gr_mem)
1347     r = 1;
1348   else if (rtype != fr_mem)
1349     as_bad ("Invalid record type for format P6");
1350   byte = (UNW_P6 | (r << 4) | (rmask & 0x0f));
1351   (*f) (1, &byte, NULL);
1352 }
1353
1354 static void
1355 output_P7_format (f, rtype, w1, w2)
1356      vbyte_func f;
1357      unw_record_type rtype;
1358      unsigned long w1;
1359      unsigned long w2;
1360 {
1361   char bytes[20];
1362   int count = 1;
1363   int r = 0;
1364   count += output_leb128 (bytes + 1, w1, 0);
1365   switch (rtype)
1366     {
1367     case mem_stack_f:
1368       r = 0;
1369       count += output_leb128 (bytes + count, w2 >> 4, 0);
1370       break;
1371     case mem_stack_v:
1372       r = 1;
1373       break;
1374     case spill_base:
1375       r = 2;
1376       break;
1377     case psp_sprel:
1378       r = 3;
1379       break;
1380     case rp_when:
1381       r = 4;
1382       break;
1383     case rp_psprel:
1384       r = 5;
1385       break;
1386     case pfs_when:
1387       r = 6;
1388       break;
1389     case pfs_psprel:
1390       r = 7;
1391       break;
1392     case preds_when:
1393       r = 8;
1394       break;
1395     case preds_psprel:
1396       r = 9;
1397       break;
1398     case lc_when:
1399       r = 10;
1400       break;
1401     case lc_psprel:
1402       r = 11;
1403       break;
1404     case unat_when:
1405       r = 12;
1406       break;
1407     case unat_psprel:
1408       r = 13;
1409       break;
1410     case fpsr_when:
1411       r = 14;
1412       break;
1413     case fpsr_psprel:
1414       r = 15;
1415       break;
1416     default:
1417       break;
1418     }
1419   bytes[0] = (UNW_P7 | r);
1420   (*f) (count, bytes, NULL);
1421 }
1422
1423 static void
1424 output_P8_format (f, rtype, t)
1425      vbyte_func f;
1426      unw_record_type rtype;
1427      unsigned long t;
1428 {
1429   char bytes[20];
1430   int r = 0;
1431   int count = 2;
1432   bytes[0] = UNW_P8;
1433   switch (rtype)
1434     {
1435     case rp_sprel:
1436       r = 1;
1437       break;
1438     case pfs_sprel:
1439       r = 2;
1440       break;
1441     case preds_sprel:
1442       r = 3;
1443       break;
1444     case lc_sprel:
1445       r = 4;
1446       break;
1447     case unat_sprel:
1448       r = 5;
1449       break;
1450     case fpsr_sprel:
1451       r = 6;
1452       break;
1453     case bsp_when:
1454       r = 7;
1455       break;
1456     case bsp_psprel:
1457       r = 8;
1458       break;
1459     case bsp_sprel:
1460       r = 9;
1461       break;
1462     case bspstore_when:
1463       r = 10;
1464       break;
1465     case bspstore_psprel:
1466       r = 11;
1467       break;
1468     case bspstore_sprel:
1469       r = 12;
1470       break;
1471     case rnat_when:
1472       r = 13;
1473       break;
1474     case rnat_psprel:
1475       r = 14;
1476       break;
1477     case rnat_sprel:
1478       r = 15;
1479       break;
1480     case priunat_when_gr:
1481       r = 16;
1482       break;
1483     case priunat_psprel:
1484       r = 17;
1485       break;
1486     case priunat_sprel:
1487       r = 18;
1488       break;
1489     case priunat_when_mem:
1490       r = 19;
1491       break;
1492     default:
1493       break;
1494     }
1495   bytes[1] = r;
1496   count += output_leb128 (bytes + 2, t, 0);
1497   (*f) (count, bytes, NULL);
1498 }
1499
1500 static void
1501 output_P9_format (f, grmask, gr)
1502      vbyte_func f;
1503      int grmask;
1504      int gr;
1505 {
1506   char bytes[3];
1507   bytes[0] = UNW_P9;
1508   bytes[1] = (grmask & 0x0f);
1509   bytes[2] = (gr & 0x7f);
1510   (*f) (3, bytes, NULL);
1511 }
1512
1513 static void
1514 output_P10_format (f, abi, context)
1515      vbyte_func f;
1516      int abi;
1517      int context;
1518 {
1519   char bytes[3];
1520   bytes[0] = UNW_P10;
1521   bytes[1] = (abi & 0xff);
1522   bytes[2] = (context & 0xff);
1523   (*f) (3, bytes, NULL);
1524 }
1525
1526 static void
1527 output_B1_format (f, rtype, label)
1528      vbyte_func f;
1529      unw_record_type rtype;
1530      unsigned long label;
1531 {
1532   char byte;
1533   int r = 0;
1534   if (label > 0x1f)
1535     {
1536       output_B4_format (f, rtype, label);
1537       return;
1538     }
1539   if (rtype == copy_state)
1540     r = 1;
1541   else if (rtype != label_state)
1542     as_bad ("Invalid record type for format B1");
1543
1544   byte = (UNW_B1 | (r << 5) | (label & 0x1f));
1545   (*f) (1, &byte, NULL);
1546 }
1547
1548 static void
1549 output_B2_format (f, ecount, t)
1550      vbyte_func f;
1551      unsigned long ecount;
1552      unsigned long t;
1553 {
1554   char bytes[20];
1555   int count = 1;
1556   if (ecount > 0x1f)
1557     {
1558       output_B3_format (f, ecount, t);
1559       return;
1560     }
1561   bytes[0] = (UNW_B2 | (ecount & 0x1f));
1562   count += output_leb128 (bytes + 1, t, 0);
1563   (*f) (count, bytes, NULL);
1564 }
1565
1566 static void
1567 output_B3_format (f, ecount, t)
1568      vbyte_func f;
1569      unsigned long ecount;
1570      unsigned long t;
1571 {
1572   char bytes[20];
1573   int count = 1;
1574   if (ecount <= 0x1f)
1575     {
1576       output_B2_format (f, ecount, t);
1577       return;
1578     }
1579   bytes[0] = UNW_B3;
1580   count += output_leb128 (bytes + 1, t, 0);
1581   count += output_leb128 (bytes + count, ecount, 0);
1582   (*f) (count, bytes, NULL);
1583 }
1584
1585 static void
1586 output_B4_format (f, rtype, label)
1587      vbyte_func f;
1588      unw_record_type rtype;
1589      unsigned long label;
1590 {
1591   char bytes[20];
1592   int r = 0;
1593   int count = 1;
1594   if (label <= 0x1f)
1595     {
1596       output_B1_format (f, rtype, label);
1597       return;
1598     }
1599
1600   if (rtype == copy_state)
1601     r = 1;
1602   else if (rtype != label_state)
1603     as_bad ("Invalid record type for format B1");
1604
1605   bytes[0] = (UNW_B4 | (r << 3));
1606   count += output_leb128 (bytes + 1, label, 0);
1607   (*f) (count, bytes, NULL);
1608 }
1609
1610 static char
1611 format_ab_reg (ab, reg)
1612      int ab;
1613      int reg;
1614 {
1615   int ret;
1616   ab = (ab & 3);
1617   reg = (reg & 0x1f);
1618   ret = (ab << 5) | reg;
1619   return ret;
1620 }
1621
1622 static void
1623 output_X1_format (f, rtype, ab, reg, t, w1)
1624      vbyte_func f;
1625      unw_record_type rtype;
1626      int ab, reg;
1627      unsigned long t;
1628      unsigned long w1;
1629 {
1630   char bytes[20];
1631   int r = 0;
1632   int count = 2;
1633   bytes[0] = UNW_X1;
1634
1635   if (rtype == spill_sprel)
1636     r = 1;
1637   else if (rtype != spill_psprel)
1638     as_bad ("Invalid record type for format X1");
1639   bytes[1] = ((r << 7) | format_ab_reg (ab, reg));
1640   count += output_leb128 (bytes + 2, t, 0);
1641   count += output_leb128 (bytes + count, w1, 0);
1642   (*f) (count, bytes, NULL);
1643 }
1644
1645 static void
1646 output_X2_format (f, ab, reg, x, y, treg, t)
1647      vbyte_func f;
1648      int ab, reg;
1649      int x, y, treg;
1650      unsigned long t;
1651 {
1652   char bytes[20];
1653   int count = 3;
1654   bytes[0] = UNW_X2;
1655   bytes[1] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1656   bytes[2] = (((y & 1) << 7) | (treg & 0x7f));
1657   count += output_leb128 (bytes + 3, t, 0);
1658   (*f) (count, bytes, NULL);
1659 }
1660
1661 static void
1662 output_X3_format (f, rtype, qp, ab, reg, t, w1)
1663      vbyte_func f;
1664      unw_record_type rtype;
1665      int qp;
1666      int ab, reg;
1667      unsigned long t;
1668      unsigned long w1;
1669 {
1670   char bytes[20];
1671   int r = 0;
1672   int count = 3;
1673   bytes[0] = UNW_X3;
1674
1675   if (rtype == spill_sprel_p)
1676     r = 1;
1677   else if (rtype != spill_psprel_p)
1678     as_bad ("Invalid record type for format X3");
1679   bytes[1] = ((r << 7) | (qp & 0x3f));
1680   bytes[2] = format_ab_reg (ab, reg);
1681   count += output_leb128 (bytes + 3, t, 0);
1682   count += output_leb128 (bytes + count, w1, 0);
1683   (*f) (count, bytes, NULL);
1684 }
1685
1686 static void
1687 output_X4_format (f, qp, ab, reg, x, y, treg, t)
1688      vbyte_func f;
1689      int qp;
1690      int ab, reg;
1691      int x, y, treg;
1692      unsigned long t;
1693 {
1694   char bytes[20];
1695   int count = 4;
1696   bytes[0] = UNW_X4;
1697   bytes[1] = (qp & 0x3f);
1698   bytes[2] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1699   bytes[3] = (((y & 1) << 7) | (treg & 0x7f));
1700   count += output_leb128 (bytes + 4, t, 0);
1701   (*f) (count, bytes, NULL);
1702 }
1703
1704 /* This function allocates a record list structure, and initializes fields.  */
1705
1706 static unw_rec_list *
1707 alloc_record (unw_record_type t)
1708 {
1709   unw_rec_list *ptr;
1710   ptr = xmalloc (sizeof (*ptr));
1711   ptr->next = NULL;
1712   ptr->slot_number = SLOT_NUM_NOT_SET;
1713   ptr->r.type = t;
1714   ptr->next_slot_number = 0;
1715   ptr->next_slot_frag = 0;
1716   return ptr;
1717 }
1718
1719 /* Dummy unwind record used for calculating the length of the last prologue or
1720    body region.  */
1721
1722 static unw_rec_list *
1723 output_endp ()
1724 {
1725   unw_rec_list *ptr = alloc_record (endp);
1726   return ptr;
1727 }
1728
1729 static unw_rec_list *
1730 output_prologue ()
1731 {
1732   unw_rec_list *ptr = alloc_record (prologue);
1733   memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1734   return ptr;
1735 }
1736
1737 static unw_rec_list *
1738 output_prologue_gr (saved_mask, reg)
1739      unsigned int saved_mask;
1740      unsigned int reg;
1741 {
1742   unw_rec_list *ptr = alloc_record (prologue_gr);
1743   memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1744   ptr->r.record.r.grmask = saved_mask;
1745   ptr->r.record.r.grsave = reg;
1746   return ptr;
1747 }
1748
1749 static unw_rec_list *
1750 output_body ()
1751 {
1752   unw_rec_list *ptr = alloc_record (body);
1753   return ptr;
1754 }
1755
1756 static unw_rec_list *
1757 output_mem_stack_f (size)
1758      unsigned int size;
1759 {
1760   unw_rec_list *ptr = alloc_record (mem_stack_f);
1761   ptr->r.record.p.size = size;
1762   return ptr;
1763 }
1764
1765 static unw_rec_list *
1766 output_mem_stack_v ()
1767 {
1768   unw_rec_list *ptr = alloc_record (mem_stack_v);
1769   return ptr;
1770 }
1771
1772 static unw_rec_list *
1773 output_psp_gr (gr)
1774      unsigned int gr;
1775 {
1776   unw_rec_list *ptr = alloc_record (psp_gr);
1777   ptr->r.record.p.gr = gr;
1778   return ptr;
1779 }
1780
1781 static unw_rec_list *
1782 output_psp_sprel (offset)
1783      unsigned int offset;
1784 {
1785   unw_rec_list *ptr = alloc_record (psp_sprel);
1786   ptr->r.record.p.spoff = offset / 4;
1787   return ptr;
1788 }
1789
1790 static unw_rec_list *
1791 output_rp_when ()
1792 {
1793   unw_rec_list *ptr = alloc_record (rp_when);
1794   return ptr;
1795 }
1796
1797 static unw_rec_list *
1798 output_rp_gr (gr)
1799      unsigned int gr;
1800 {
1801   unw_rec_list *ptr = alloc_record (rp_gr);
1802   ptr->r.record.p.gr = gr;
1803   return ptr;
1804 }
1805
1806 static unw_rec_list *
1807 output_rp_br (br)
1808      unsigned int br;
1809 {
1810   unw_rec_list *ptr = alloc_record (rp_br);
1811   ptr->r.record.p.br = br;
1812   return ptr;
1813 }
1814
1815 static unw_rec_list *
1816 output_rp_psprel (offset)
1817      unsigned int offset;
1818 {
1819   unw_rec_list *ptr = alloc_record (rp_psprel);
1820   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1821   return ptr;
1822 }
1823
1824 static unw_rec_list *
1825 output_rp_sprel (offset)
1826      unsigned int offset;
1827 {
1828   unw_rec_list *ptr = alloc_record (rp_sprel);
1829   ptr->r.record.p.spoff = offset / 4;
1830   return ptr;
1831 }
1832
1833 static unw_rec_list *
1834 output_pfs_when ()
1835 {
1836   unw_rec_list *ptr = alloc_record (pfs_when);
1837   return ptr;
1838 }
1839
1840 static unw_rec_list *
1841 output_pfs_gr (gr)
1842      unsigned int gr;
1843 {
1844   unw_rec_list *ptr = alloc_record (pfs_gr);
1845   ptr->r.record.p.gr = gr;
1846   return ptr;
1847 }
1848
1849 static unw_rec_list *
1850 output_pfs_psprel (offset)
1851      unsigned int offset;
1852 {
1853   unw_rec_list *ptr = alloc_record (pfs_psprel);
1854   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1855   return ptr;
1856 }
1857
1858 static unw_rec_list *
1859 output_pfs_sprel (offset)
1860      unsigned int offset;
1861 {
1862   unw_rec_list *ptr = alloc_record (pfs_sprel);
1863   ptr->r.record.p.spoff = offset / 4;
1864   return ptr;
1865 }
1866
1867 static unw_rec_list *
1868 output_preds_when ()
1869 {
1870   unw_rec_list *ptr = alloc_record (preds_when);
1871   return ptr;
1872 }
1873
1874 static unw_rec_list *
1875 output_preds_gr (gr)
1876      unsigned int gr;
1877 {
1878   unw_rec_list *ptr = alloc_record (preds_gr);
1879   ptr->r.record.p.gr = gr;
1880   return ptr;
1881 }
1882
1883 static unw_rec_list *
1884 output_preds_psprel (offset)
1885      unsigned int offset;
1886 {
1887   unw_rec_list *ptr = alloc_record (preds_psprel);
1888   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1889   return ptr;
1890 }
1891
1892 static unw_rec_list *
1893 output_preds_sprel (offset)
1894      unsigned int offset;
1895 {
1896   unw_rec_list *ptr = alloc_record (preds_sprel);
1897   ptr->r.record.p.spoff = offset / 4;
1898   return ptr;
1899 }
1900
1901 static unw_rec_list *
1902 output_fr_mem (mask)
1903      unsigned int mask;
1904 {
1905   unw_rec_list *ptr = alloc_record (fr_mem);
1906   ptr->r.record.p.rmask = mask;
1907   return ptr;
1908 }
1909
1910 static unw_rec_list *
1911 output_frgr_mem (gr_mask, fr_mask)
1912      unsigned int gr_mask;
1913      unsigned int fr_mask;
1914 {
1915   unw_rec_list *ptr = alloc_record (frgr_mem);
1916   ptr->r.record.p.grmask = gr_mask;
1917   ptr->r.record.p.frmask = fr_mask;
1918   return ptr;
1919 }
1920
1921 static unw_rec_list *
1922 output_gr_gr (mask, reg)
1923      unsigned int mask;
1924      unsigned int reg;
1925 {
1926   unw_rec_list *ptr = alloc_record (gr_gr);
1927   ptr->r.record.p.grmask = mask;
1928   ptr->r.record.p.gr = reg;
1929   return ptr;
1930 }
1931
1932 static unw_rec_list *
1933 output_gr_mem (mask)
1934      unsigned int mask;
1935 {
1936   unw_rec_list *ptr = alloc_record (gr_mem);
1937   ptr->r.record.p.rmask = mask;
1938   return ptr;
1939 }
1940
1941 static unw_rec_list *
1942 output_br_mem (unsigned int mask)
1943 {
1944   unw_rec_list *ptr = alloc_record (br_mem);
1945   ptr->r.record.p.brmask = mask;
1946   return ptr;
1947 }
1948
1949 static unw_rec_list *
1950 output_br_gr (save_mask, reg)
1951      unsigned int save_mask;
1952      unsigned int reg;
1953 {
1954   unw_rec_list *ptr = alloc_record (br_gr);
1955   ptr->r.record.p.brmask = save_mask;
1956   ptr->r.record.p.gr = reg;
1957   return ptr;
1958 }
1959
1960 static unw_rec_list *
1961 output_spill_base (offset)
1962      unsigned int offset;
1963 {
1964   unw_rec_list *ptr = alloc_record (spill_base);
1965   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1966   return ptr;
1967 }
1968
1969 static unw_rec_list *
1970 output_unat_when ()
1971 {
1972   unw_rec_list *ptr = alloc_record (unat_when);
1973   return ptr;
1974 }
1975
1976 static unw_rec_list *
1977 output_unat_gr (gr)
1978      unsigned int gr;
1979 {
1980   unw_rec_list *ptr = alloc_record (unat_gr);
1981   ptr->r.record.p.gr = gr;
1982   return ptr;
1983 }
1984
1985 static unw_rec_list *
1986 output_unat_psprel (offset)
1987      unsigned int offset;
1988 {
1989   unw_rec_list *ptr = alloc_record (unat_psprel);
1990   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1991   return ptr;
1992 }
1993
1994 static unw_rec_list *
1995 output_unat_sprel (offset)
1996      unsigned int offset;
1997 {
1998   unw_rec_list *ptr = alloc_record (unat_sprel);
1999   ptr->r.record.p.spoff = offset / 4;
2000   return ptr;
2001 }
2002
2003 static unw_rec_list *
2004 output_lc_when ()
2005 {
2006   unw_rec_list *ptr = alloc_record (lc_when);
2007   return ptr;
2008 }
2009
2010 static unw_rec_list *
2011 output_lc_gr (gr)
2012      unsigned int gr;
2013 {
2014   unw_rec_list *ptr = alloc_record (lc_gr);
2015   ptr->r.record.p.gr = gr;
2016   return ptr;
2017 }
2018
2019 static unw_rec_list *
2020 output_lc_psprel (offset)
2021      unsigned int offset;
2022 {
2023   unw_rec_list *ptr = alloc_record (lc_psprel);
2024   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2025   return ptr;
2026 }
2027
2028 static unw_rec_list *
2029 output_lc_sprel (offset)
2030      unsigned int offset;
2031 {
2032   unw_rec_list *ptr = alloc_record (lc_sprel);
2033   ptr->r.record.p.spoff = offset / 4;
2034   return ptr;
2035 }
2036
2037 static unw_rec_list *
2038 output_fpsr_when ()
2039 {
2040   unw_rec_list *ptr = alloc_record (fpsr_when);
2041   return ptr;
2042 }
2043
2044 static unw_rec_list *
2045 output_fpsr_gr (gr)
2046      unsigned int gr;
2047 {
2048   unw_rec_list *ptr = alloc_record (fpsr_gr);
2049   ptr->r.record.p.gr = gr;
2050   return ptr;
2051 }
2052
2053 static unw_rec_list *
2054 output_fpsr_psprel (offset)
2055      unsigned int offset;
2056 {
2057   unw_rec_list *ptr = alloc_record (fpsr_psprel);
2058   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2059   return ptr;
2060 }
2061
2062 static unw_rec_list *
2063 output_fpsr_sprel (offset)
2064      unsigned int offset;
2065 {
2066   unw_rec_list *ptr = alloc_record (fpsr_sprel);
2067   ptr->r.record.p.spoff = offset / 4;
2068   return ptr;
2069 }
2070
2071 static unw_rec_list *
2072 output_priunat_when_gr ()
2073 {
2074   unw_rec_list *ptr = alloc_record (priunat_when_gr);
2075   return ptr;
2076 }
2077
2078 static unw_rec_list *
2079 output_priunat_when_mem ()
2080 {
2081   unw_rec_list *ptr = alloc_record (priunat_when_mem);
2082   return ptr;
2083 }
2084
2085 static unw_rec_list *
2086 output_priunat_gr (gr)
2087      unsigned int gr;
2088 {
2089   unw_rec_list *ptr = alloc_record (priunat_gr);
2090   ptr->r.record.p.gr = gr;
2091   return ptr;
2092 }
2093
2094 static unw_rec_list *
2095 output_priunat_psprel (offset)
2096      unsigned int offset;
2097 {
2098   unw_rec_list *ptr = alloc_record (priunat_psprel);
2099   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2100   return ptr;
2101 }
2102
2103 static unw_rec_list *
2104 output_priunat_sprel (offset)
2105      unsigned int offset;
2106 {
2107   unw_rec_list *ptr = alloc_record (priunat_sprel);
2108   ptr->r.record.p.spoff = offset / 4;
2109   return ptr;
2110 }
2111
2112 static unw_rec_list *
2113 output_bsp_when ()
2114 {
2115   unw_rec_list *ptr = alloc_record (bsp_when);
2116   return ptr;
2117 }
2118
2119 static unw_rec_list *
2120 output_bsp_gr (gr)
2121      unsigned int gr;
2122 {
2123   unw_rec_list *ptr = alloc_record (bsp_gr);
2124   ptr->r.record.p.gr = gr;
2125   return ptr;
2126 }
2127
2128 static unw_rec_list *
2129 output_bsp_psprel (offset)
2130      unsigned int offset;
2131 {
2132   unw_rec_list *ptr = alloc_record (bsp_psprel);
2133   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2134   return ptr;
2135 }
2136
2137 static unw_rec_list *
2138 output_bsp_sprel (offset)
2139      unsigned int offset;
2140 {
2141   unw_rec_list *ptr = alloc_record (bsp_sprel);
2142   ptr->r.record.p.spoff = offset / 4;
2143   return ptr;
2144 }
2145
2146 static unw_rec_list *
2147 output_bspstore_when ()
2148 {
2149   unw_rec_list *ptr = alloc_record (bspstore_when);
2150   return ptr;
2151 }
2152
2153 static unw_rec_list *
2154 output_bspstore_gr (gr)
2155      unsigned int gr;
2156 {
2157   unw_rec_list *ptr = alloc_record (bspstore_gr);
2158   ptr->r.record.p.gr = gr;
2159   return ptr;
2160 }
2161
2162 static unw_rec_list *
2163 output_bspstore_psprel (offset)
2164      unsigned int offset;
2165 {
2166   unw_rec_list *ptr = alloc_record (bspstore_psprel);
2167   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2168   return ptr;
2169 }
2170
2171 static unw_rec_list *
2172 output_bspstore_sprel (offset)
2173      unsigned int offset;
2174 {
2175   unw_rec_list *ptr = alloc_record (bspstore_sprel);
2176   ptr->r.record.p.spoff = offset / 4;
2177   return ptr;
2178 }
2179
2180 static unw_rec_list *
2181 output_rnat_when ()
2182 {
2183   unw_rec_list *ptr = alloc_record (rnat_when);
2184   return ptr;
2185 }
2186
2187 static unw_rec_list *
2188 output_rnat_gr (gr)
2189      unsigned int gr;
2190 {
2191   unw_rec_list *ptr = alloc_record (rnat_gr);
2192   ptr->r.record.p.gr = gr;
2193   return ptr;
2194 }
2195
2196 static unw_rec_list *
2197 output_rnat_psprel (offset)
2198      unsigned int offset;
2199 {
2200   unw_rec_list *ptr = alloc_record (rnat_psprel);
2201   ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2202   return ptr;
2203 }
2204
2205 static unw_rec_list *
2206 output_rnat_sprel (offset)
2207      unsigned int offset;
2208 {
2209   unw_rec_list *ptr = alloc_record (rnat_sprel);
2210   ptr->r.record.p.spoff = offset / 4;
2211   return ptr;
2212 }
2213
2214 static unw_rec_list *
2215 output_unwabi (abi, context)
2216      unsigned long abi;
2217      unsigned long context;
2218 {
2219   unw_rec_list *ptr = alloc_record (unwabi);
2220   ptr->r.record.p.abi = abi;
2221   ptr->r.record.p.context = context;
2222   return ptr;
2223 }
2224
2225 static unw_rec_list *
2226 output_epilogue (unsigned long ecount)
2227 {
2228   unw_rec_list *ptr = alloc_record (epilogue);
2229   ptr->r.record.b.ecount = ecount;
2230   return ptr;
2231 }
2232
2233 static unw_rec_list *
2234 output_label_state (unsigned long label)
2235 {
2236   unw_rec_list *ptr = alloc_record (label_state);
2237   ptr->r.record.b.label = label;
2238   return ptr;
2239 }
2240
2241 static unw_rec_list *
2242 output_copy_state (unsigned long label)
2243 {
2244   unw_rec_list *ptr = alloc_record (copy_state);
2245   ptr->r.record.b.label = label;
2246   return ptr;
2247 }
2248
2249 static unw_rec_list *
2250 output_spill_psprel (ab, reg, offset)
2251      unsigned int ab;
2252      unsigned int reg;
2253      unsigned int offset;
2254 {
2255   unw_rec_list *ptr = alloc_record (spill_psprel);
2256   ptr->r.record.x.ab = ab;
2257   ptr->r.record.x.reg = reg;
2258   ptr->r.record.x.pspoff = ENCODED_PSP_OFFSET (offset);
2259   return ptr;
2260 }
2261
2262 static unw_rec_list *
2263 output_spill_sprel (ab, reg, offset)
2264      unsigned int ab;
2265      unsigned int reg;
2266      unsigned int offset;
2267 {
2268   unw_rec_list *ptr = alloc_record (spill_sprel);
2269   ptr->r.record.x.ab = ab;
2270   ptr->r.record.x.reg = reg;
2271   ptr->r.record.x.spoff = offset / 4;
2272   return ptr;
2273 }
2274
2275 static unw_rec_list *
2276 output_spill_psprel_p (ab, reg, offset, predicate)
2277      unsigned int ab;
2278      unsigned int reg;
2279      unsigned int offset;
2280      unsigned int predicate;
2281 {
2282   unw_rec_list *ptr = alloc_record (spill_psprel_p);
2283   ptr->r.record.x.ab = ab;
2284   ptr->r.record.x.reg = reg;
2285   ptr->r.record.x.pspoff = ENCODED_PSP_OFFSET (offset);
2286   ptr->r.record.x.qp = predicate;
2287   return ptr;
2288 }
2289
2290 static unw_rec_list *
2291 output_spill_sprel_p (ab, reg, offset, predicate)
2292      unsigned int ab;
2293      unsigned int reg;
2294      unsigned int offset;
2295      unsigned int predicate;
2296 {
2297   unw_rec_list *ptr = alloc_record (spill_sprel_p);
2298   ptr->r.record.x.ab = ab;
2299   ptr->r.record.x.reg = reg;
2300   ptr->r.record.x.spoff = offset / 4;
2301   ptr->r.record.x.qp = predicate;
2302   return ptr;
2303 }
2304
2305 static unw_rec_list *
2306 output_spill_reg (ab, reg, targ_reg, xy)
2307      unsigned int ab;
2308      unsigned int reg;
2309      unsigned int targ_reg;
2310      unsigned int xy;
2311 {
2312   unw_rec_list *ptr = alloc_record (spill_reg);
2313   ptr->r.record.x.ab = ab;
2314   ptr->r.record.x.reg = reg;
2315   ptr->r.record.x.treg = targ_reg;
2316   ptr->r.record.x.xy = xy;
2317   return ptr;
2318 }
2319
2320 static unw_rec_list *
2321 output_spill_reg_p (ab, reg, targ_reg, xy, predicate)
2322      unsigned int ab;
2323      unsigned int reg;
2324      unsigned int targ_reg;
2325      unsigned int xy;
2326      unsigned int predicate;
2327 {
2328   unw_rec_list *ptr = alloc_record (spill_reg_p);
2329   ptr->r.record.x.ab = ab;
2330   ptr->r.record.x.reg = reg;
2331   ptr->r.record.x.treg = targ_reg;
2332   ptr->r.record.x.xy = xy;
2333   ptr->r.record.x.qp = predicate;
2334   return ptr;
2335 }
2336
2337 /* Given a unw_rec_list process the correct format with the
2338    specified function.  */
2339
2340 static void
2341 process_one_record (ptr, f)
2342      unw_rec_list *ptr;
2343      vbyte_func f;
2344 {
2345   unsigned long fr_mask, gr_mask;
2346
2347   switch (ptr->r.type)
2348     {
2349       /* This is a dummy record that takes up no space in the output.  */
2350     case endp:
2351       break;
2352
2353     case gr_mem:
2354     case fr_mem:
2355     case br_mem:
2356     case frgr_mem:
2357       /* These are taken care of by prologue/prologue_gr.  */
2358       break;
2359
2360     case prologue_gr:
2361     case prologue:
2362       if (ptr->r.type == prologue_gr)
2363         output_R2_format (f, ptr->r.record.r.grmask,
2364                           ptr->r.record.r.grsave, ptr->r.record.r.rlen);
2365       else
2366         output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2367
2368       /* Output descriptor(s) for union of register spills (if any).  */
2369       gr_mask = ptr->r.record.r.mask.gr_mem;
2370       fr_mask = ptr->r.record.r.mask.fr_mem;
2371       if (fr_mask)
2372         {
2373           if ((fr_mask & ~0xfUL) == 0)
2374             output_P6_format (f, fr_mem, fr_mask);
2375           else
2376             {
2377               output_P5_format (f, gr_mask, fr_mask);
2378               gr_mask = 0;
2379             }
2380         }
2381       if (gr_mask)
2382         output_P6_format (f, gr_mem, gr_mask);
2383       if (ptr->r.record.r.mask.br_mem)
2384         output_P1_format (f, ptr->r.record.r.mask.br_mem);
2385
2386       /* output imask descriptor if necessary:  */
2387       if (ptr->r.record.r.mask.i)
2388         output_P4_format (f, ptr->r.record.r.mask.i,
2389                           ptr->r.record.r.imask_size);
2390       break;
2391
2392     case body:
2393       output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2394       break;
2395     case mem_stack_f:
2396     case mem_stack_v:
2397       output_P7_format (f, ptr->r.type, ptr->r.record.p.t,
2398                         ptr->r.record.p.size);
2399       break;
2400     case psp_gr:
2401     case rp_gr:
2402     case pfs_gr:
2403     case preds_gr:
2404     case unat_gr:
2405     case lc_gr:
2406     case fpsr_gr:
2407     case priunat_gr:
2408     case bsp_gr:
2409     case bspstore_gr:
2410     case rnat_gr:
2411       output_P3_format (f, ptr->r.type, ptr->r.record.p.gr);
2412       break;
2413     case rp_br:
2414       output_P3_format (f, rp_br, ptr->r.record.p.br);
2415       break;
2416     case psp_sprel:
2417       output_P7_format (f, psp_sprel, ptr->r.record.p.spoff, 0);
2418       break;
2419     case rp_when:
2420     case pfs_when:
2421     case preds_when:
2422     case unat_when:
2423     case lc_when:
2424     case fpsr_when:
2425       output_P7_format (f, ptr->r.type, ptr->r.record.p.t, 0);
2426       break;
2427     case rp_psprel:
2428     case pfs_psprel:
2429     case preds_psprel:
2430     case unat_psprel:
2431     case lc_psprel:
2432     case fpsr_psprel:
2433     case spill_base:
2434       output_P7_format (f, ptr->r.type, ptr->r.record.p.pspoff, 0);
2435       break;
2436     case rp_sprel:
2437     case pfs_sprel:
2438     case preds_sprel:
2439     case unat_sprel:
2440     case lc_sprel:
2441     case fpsr_sprel:
2442     case priunat_sprel:
2443     case bsp_sprel:
2444     case bspstore_sprel:
2445     case rnat_sprel:
2446       output_P8_format (f, ptr->r.type, ptr->r.record.p.spoff);
2447       break;
2448     case gr_gr:
2449       output_P9_format (f, ptr->r.record.p.grmask, ptr->r.record.p.gr);
2450       break;
2451     case br_gr:
2452       output_P2_format (f, ptr->r.record.p.brmask, ptr->r.record.p.gr);
2453       break;
2454     case spill_mask:
2455       as_bad ("spill_mask record unimplemented.");
2456       break;
2457     case priunat_when_gr:
2458     case priunat_when_mem:
2459     case bsp_when:
2460     case bspstore_when:
2461     case rnat_when:
2462       output_P8_format (f, ptr->r.type, ptr->r.record.p.t);
2463       break;
2464     case priunat_psprel:
2465     case bsp_psprel:
2466     case bspstore_psprel:
2467     case rnat_psprel:
2468       output_P8_format (f, ptr->r.type, ptr->r.record.p.pspoff);
2469       break;
2470     case unwabi:
2471       output_P10_format (f, ptr->r.record.p.abi, ptr->r.record.p.context);
2472       break;
2473     case epilogue:
2474       output_B3_format (f, ptr->r.record.b.ecount, ptr->r.record.b.t);
2475       break;
2476     case label_state:
2477     case copy_state:
2478       output_B4_format (f, ptr->r.type, ptr->r.record.b.label);
2479       break;
2480     case spill_psprel:
2481       output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2482                         ptr->r.record.x.reg, ptr->r.record.x.t,
2483                         ptr->r.record.x.pspoff);
2484       break;
2485     case spill_sprel:
2486       output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2487                         ptr->r.record.x.reg, ptr->r.record.x.t,
2488                         ptr->r.record.x.spoff);
2489       break;
2490     case spill_reg:
2491       output_X2_format (f, ptr->r.record.x.ab, ptr->r.record.x.reg,
2492                         ptr->r.record.x.xy >> 1, ptr->r.record.x.xy,
2493                         ptr->r.record.x.treg, ptr->r.record.x.t);
2494       break;
2495     case spill_psprel_p:
2496       output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2497                         ptr->r.record.x.ab, ptr->r.record.x.reg,
2498                         ptr->r.record.x.t, ptr->r.record.x.pspoff);
2499       break;
2500     case spill_sprel_p:
2501       output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2502                         ptr->r.record.x.ab, ptr->r.record.x.reg,
2503                         ptr->r.record.x.t, ptr->r.record.x.spoff);
2504       break;
2505     case spill_reg_p:
2506       output_X4_format (f, ptr->r.record.x.qp, ptr->r.record.x.ab,
2507                         ptr->r.record.x.reg, ptr->r.record.x.xy >> 1,
2508                         ptr->r.record.x.xy, ptr->r.record.x.treg,
2509                         ptr->r.record.x.t);
2510       break;
2511     default:
2512       as_bad ("record_type_not_valid");
2513       break;
2514     }
2515 }
2516
2517 /* Given a unw_rec_list list, process all the records with
2518    the specified function.  */
2519 static void
2520 process_unw_records (list, f)
2521      unw_rec_list *list;
2522      vbyte_func f;
2523 {
2524   unw_rec_list *ptr;
2525   for (ptr = list; ptr; ptr = ptr->next)
2526     process_one_record (ptr, f);
2527 }
2528
2529 /* Determine the size of a record list in bytes.  */
2530 static int
2531 calc_record_size (list)
2532      unw_rec_list *list;
2533 {
2534   vbyte_count = 0;
2535   process_unw_records (list, count_output);
2536   return vbyte_count;
2537 }
2538
2539 /* Update IMASK bitmask to reflect the fact that one or more registers
2540    of type TYPE are saved starting at instruction with index T.  If N
2541    bits are set in REGMASK, it is assumed that instructions T through
2542    T+N-1 save these registers.
2543
2544    TYPE values:
2545         0: no save
2546         1: instruction saves next fp reg
2547         2: instruction saves next general reg
2548         3: instruction saves next branch reg */
2549 static void
2550 set_imask (region, regmask, t, type)
2551      unw_rec_list *region;
2552      unsigned long regmask;
2553      unsigned long t;
2554      unsigned int type;
2555 {
2556   unsigned char *imask;
2557   unsigned long imask_size;
2558   unsigned int i;
2559   int pos;
2560
2561   imask = region->r.record.r.mask.i;
2562   imask_size = region->r.record.r.imask_size;
2563   if (!imask)
2564     {
2565       imask_size = (region->r.record.r.rlen * 2 + 7) / 8 + 1;
2566       imask = xmalloc (imask_size);
2567       memset (imask, 0, imask_size);
2568
2569       region->r.record.r.imask_size = imask_size;
2570       region->r.record.r.mask.i = imask;
2571     }
2572
2573   i = (t / 4) + 1;
2574   pos = 2 * (3 - t % 4);
2575   while (regmask)
2576     {
2577       if (i >= imask_size)
2578         {
2579           as_bad ("Ignoring attempt to spill beyond end of region");
2580           return;
2581         }
2582
2583       imask[i] |= (type & 0x3) << pos;
2584
2585       regmask &= (regmask - 1);
2586       pos -= 2;
2587       if (pos < 0)
2588         {
2589           pos = 0;
2590           ++i;
2591         }
2592     }
2593 }
2594
2595 /* Return the number of instruction slots from FIRST_ADDR to SLOT_ADDR.
2596    SLOT_FRAG is the frag containing SLOT_ADDR, and FIRST_FRAG is the frag
2597    containing FIRST_ADDR.  If BEFORE_RELAX, then we use worst-case estimates
2598    for frag sizes.  */
2599
2600 unsigned long
2601 slot_index (slot_addr, slot_frag, first_addr, first_frag, before_relax)
2602      unsigned long slot_addr;
2603      fragS *slot_frag;
2604      unsigned long first_addr;
2605      fragS *first_frag;
2606      int before_relax;
2607 {
2608   unsigned long index = 0;
2609
2610   /* First time we are called, the initial address and frag are invalid.  */
2611   if (first_addr == 0)
2612     return 0;
2613
2614   /* If the two addresses are in different frags, then we need to add in
2615      the remaining size of this frag, and then the entire size of intermediate
2616      frags.  */
2617   while (slot_frag != first_frag)
2618     {
2619       unsigned long start_addr = (unsigned long) &first_frag->fr_literal;
2620
2621       if (! before_relax)
2622         {
2623           /* We can get the final addresses only during and after
2624              relaxation.  */
2625           if (first_frag->fr_next && first_frag->fr_next->fr_address)
2626             index += 3 * ((first_frag->fr_next->fr_address
2627                            - first_frag->fr_address
2628                              - first_frag->fr_fix) >> 4);
2629         }
2630       else
2631         /* We don't know what the final addresses will be. We try our
2632            best to estimate.  */
2633         switch (first_frag->fr_type)
2634           {
2635           default:
2636             break;
2637
2638           case rs_space:
2639             as_fatal ("only constant space allocation is supported");
2640             break;
2641
2642           case rs_align:
2643           case rs_align_code:
2644           case rs_align_test:
2645             /* Take alignment into account.  Assume the worst case
2646                before relaxation.  */
2647             index += 3 * ((1 << first_frag->fr_offset) >> 4);
2648             break;
2649
2650           case rs_org:
2651             if (first_frag->fr_symbol)
2652               {
2653                 as_fatal ("only constant offsets are supported");
2654                 break;
2655               }
2656           case rs_fill:
2657             index += 3 * (first_frag->fr_offset >> 4);
2658             break;
2659           }
2660
2661       /* Add in the full size of the frag converted to instruction slots.  */
2662       index += 3 * (first_frag->fr_fix >> 4);
2663       /* Subtract away the initial part before first_addr.  */
2664       index -= (3 * ((first_addr >> 4) - (start_addr >> 4))
2665                 + ((first_addr & 0x3) - (start_addr & 0x3)));
2666
2667       /* Move to the beginning of the next frag.  */
2668       first_frag = first_frag->fr_next;
2669       first_addr = (unsigned long) &first_frag->fr_literal;
2670     }
2671
2672   /* Add in the used part of the last frag.  */
2673   index += (3 * ((slot_addr >> 4) - (first_addr >> 4))
2674             + ((slot_addr & 0x3) - (first_addr & 0x3)));
2675   return index;
2676 }
2677
2678 /* Optimize unwind record directives.  */
2679
2680 static unw_rec_list *
2681 optimize_unw_records (list)
2682      unw_rec_list *list;
2683 {
2684   if (!list)
2685     return NULL;
2686
2687   /* If the only unwind record is ".prologue" or ".prologue" followed
2688      by ".body", then we can optimize the unwind directives away.  */
2689   if (list->r.type == prologue
2690       && (list->next->r.type == endp
2691           || (list->next->r.type == body && list->next->next->r.type == endp)))
2692     return NULL;
2693
2694   return list;
2695 }
2696
2697 /* Given a complete record list, process any records which have
2698    unresolved fields, (ie length counts for a prologue).  After
2699    this has been run, all necessary information should be available
2700    within each record to generate an image.  */
2701
2702 static void
2703 fixup_unw_records (list, before_relax)
2704      unw_rec_list *list;
2705      int before_relax;
2706 {
2707   unw_rec_list *ptr, *region = 0;
2708   unsigned long first_addr = 0, rlen = 0, t;
2709   fragS *first_frag = 0;
2710
2711   for (ptr = list; ptr; ptr = ptr->next)
2712     {
2713       if (ptr->slot_number == SLOT_NUM_NOT_SET)
2714         as_bad (" Insn slot not set in unwind record.");
2715       t = slot_index (ptr->slot_number, ptr->slot_frag,
2716                       first_addr, first_frag, before_relax);
2717       switch (ptr->r.type)
2718         {
2719         case prologue:
2720         case prologue_gr:
2721         case body:
2722           {
2723             unw_rec_list *last;
2724             int size;
2725             unsigned long last_addr = 0;
2726             fragS *last_frag = NULL;
2727
2728             first_addr = ptr->slot_number;
2729             first_frag = ptr->slot_frag;
2730             /* Find either the next body/prologue start, or the end of
2731                the function, and determine the size of the region.  */
2732             for (last = ptr->next; last != NULL; last = last->next)
2733               if (last->r.type == prologue || last->r.type == prologue_gr
2734                   || last->r.type == body || last->r.type == endp)
2735                 {
2736                   last_addr = last->slot_number;
2737                   last_frag = last->slot_frag;
2738                   break;
2739                 }
2740             size = slot_index (last_addr, last_frag, first_addr, first_frag,
2741                                before_relax);
2742             rlen = ptr->r.record.r.rlen = size;
2743             if (ptr->r.type == body)
2744               /* End of region.  */
2745               region = 0;
2746             else
2747               region = ptr;
2748             break;
2749           }
2750         case epilogue:
2751           if (t < rlen)
2752             ptr->r.record.b.t = rlen - 1 - t;
2753           else
2754             /* This happens when a memory-stack-less procedure uses a
2755                ".restore sp" directive at the end of a region to pop
2756                the frame state.  */
2757             ptr->r.record.b.t = 0;
2758           break;
2759
2760         case mem_stack_f:
2761         case mem_stack_v:
2762         case rp_when:
2763         case pfs_when:
2764         case preds_when:
2765         case unat_when:
2766         case lc_when:
2767         case fpsr_when:
2768         case priunat_when_gr:
2769         case priunat_when_mem:
2770         case bsp_when:
2771         case bspstore_when:
2772         case rnat_when:
2773           ptr->r.record.p.t = t;
2774           break;
2775
2776         case spill_reg:
2777         case spill_sprel:
2778         case spill_psprel:
2779         case spill_reg_p:
2780         case spill_sprel_p:
2781         case spill_psprel_p:
2782           ptr->r.record.x.t = t;
2783           break;
2784
2785         case frgr_mem:
2786           if (!region)
2787             {
2788               as_bad ("frgr_mem record before region record!\n");
2789               return;
2790             }
2791           region->r.record.r.mask.fr_mem |= ptr->r.record.p.frmask;
2792           region->r.record.r.mask.gr_mem |= ptr->r.record.p.grmask;
2793           set_imask (region, ptr->r.record.p.frmask, t, 1);
2794           set_imask (region, ptr->r.record.p.grmask, t, 2);
2795           break;
2796         case fr_mem:
2797           if (!region)
2798             {
2799               as_bad ("fr_mem record before region record!\n");
2800               return;
2801             }
2802           region->r.record.r.mask.fr_mem |= ptr->r.record.p.rmask;
2803           set_imask (region, ptr->r.record.p.rmask, t, 1);
2804           break;
2805         case gr_mem:
2806           if (!region)
2807             {
2808               as_bad ("gr_mem record before region record!\n");
2809               return;
2810             }
2811           region->r.record.r.mask.gr_mem |= ptr->r.record.p.rmask;
2812           set_imask (region, ptr->r.record.p.rmask, t, 2);
2813           break;
2814         case br_mem:
2815           if (!region)
2816             {
2817               as_bad ("br_mem record before region record!\n");
2818               return;
2819             }
2820           region->r.record.r.mask.br_mem |= ptr->r.record.p.brmask;
2821           set_imask (region, ptr->r.record.p.brmask, t, 3);
2822           break;
2823
2824         case gr_gr:
2825           if (!region)
2826             {
2827               as_bad ("gr_gr record before region record!\n");
2828               return;
2829             }
2830           set_imask (region, ptr->r.record.p.grmask, t, 2);
2831           break;
2832         case br_gr:
2833           if (!region)
2834             {
2835               as_bad ("br_gr record before region record!\n");
2836               return;
2837             }
2838           set_imask (region, ptr->r.record.p.brmask, t, 3);
2839           break;
2840
2841         default:
2842           break;
2843         }
2844     }
2845 }
2846
2847 /* Estimate the size of a frag before relaxing.  We only have one type of frag
2848    to handle here, which is the unwind info frag.  */
2849
2850 int
2851 ia64_estimate_size_before_relax (fragS *frag,
2852                                  asection *segtype ATTRIBUTE_UNUSED)
2853 {
2854   unw_rec_list *list;
2855   int len, size, pad;
2856
2857   /* ??? This code is identical to the first part of ia64_convert_frag.  */
2858   list = (unw_rec_list *) frag->fr_opcode;
2859   fixup_unw_records (list, 0);
2860
2861   len = calc_record_size (list);
2862   /* pad to pointer-size boundary.  */
2863   pad = len % md.pointer_size;
2864   if (pad != 0)
2865     len += md.pointer_size - pad;
2866   /* Add 8 for the header + a pointer for the personality offset.  */
2867   size = len + 8 + md.pointer_size;
2868
2869   /* fr_var carries the max_chars that we created the fragment with.
2870      We must, of course, have allocated enough memory earlier.  */
2871   assert (frag->fr_var >= size);
2872
2873   return frag->fr_fix + size;
2874 }
2875
2876 /* This function converts a rs_machine_dependent variant frag into a
2877   normal fill frag with the unwind image from the the record list.  */
2878 void
2879 ia64_convert_frag (fragS *frag)
2880 {
2881   unw_rec_list *list;
2882   int len, size, pad;
2883   valueT flag_value;
2884
2885   /* ??? This code is identical to ia64_estimate_size_before_relax.  */
2886   list = (unw_rec_list *) frag->fr_opcode;
2887   fixup_unw_records (list, 0);
2888
2889   len = calc_record_size (list);
2890   /* pad to pointer-size boundary.  */
2891   pad = len % md.pointer_size;
2892   if (pad != 0)
2893     len += md.pointer_size - pad;
2894   /* Add 8 for the header + a pointer for the personality offset.  */
2895   size = len + 8 + md.pointer_size;
2896
2897   /* fr_var carries the max_chars that we created the fragment with.
2898      We must, of course, have allocated enough memory earlier.  */
2899   assert (frag->fr_var >= size);
2900
2901   /* Initialize the header area. fr_offset is initialized with
2902      unwind.personality_routine.  */
2903   if (frag->fr_offset)
2904     {
2905       if (md.flags & EF_IA_64_ABI64)
2906         flag_value = (bfd_vma) 3 << 32;
2907       else
2908         /* 32-bit unwind info block.  */
2909         flag_value = (bfd_vma) 0x1003 << 32;
2910     }
2911   else
2912     flag_value = 0;
2913
2914  md_number_to_chars (frag->fr_literal,
2915                      (((bfd_vma) 1 << 48) /* Version.  */
2916                       | flag_value        /* U & E handler flags.  */
2917                       | (len / md.pointer_size)), /* Length.  */
2918                      8);
2919
2920   /* Skip the header.  */
2921   vbyte_mem_ptr = frag->fr_literal + 8;
2922   process_unw_records (list, output_vbyte_mem);
2923
2924   /* Fill the padding bytes with zeros.  */
2925   if (pad != 0)
2926     md_number_to_chars (frag->fr_literal + len + 8 - md.pointer_size + pad, 0,
2927                         md.pointer_size - pad);
2928
2929   frag->fr_fix += size;
2930   frag->fr_type = rs_fill;
2931   frag->fr_var = 0;
2932   frag->fr_offset = 0;
2933 }
2934
2935 static int
2936 convert_expr_to_ab_reg (e, ab, regp)
2937      expressionS *e;
2938      unsigned int *ab;
2939      unsigned int *regp;
2940 {
2941   unsigned int reg;
2942
2943   if (e->X_op != O_register)
2944     return 0;
2945
2946   reg = e->X_add_number;
2947   if (reg >= (REG_GR + 4) && reg <= (REG_GR + 7))
2948     {
2949       *ab = 0;
2950       *regp = reg - REG_GR;
2951     }
2952   else if ((reg >= (REG_FR + 2) && reg <= (REG_FR + 5))
2953            || (reg >= (REG_FR + 16) && reg <= (REG_FR + 31)))
2954     {
2955       *ab = 1;
2956       *regp = reg - REG_FR;
2957     }
2958   else if (reg >= (REG_BR + 1) && reg <= (REG_BR + 5))
2959     {
2960       *ab = 2;
2961       *regp = reg - REG_BR;
2962     }
2963   else
2964     {
2965       *ab = 3;
2966       switch (reg)
2967         {
2968         case REG_PR:            *regp =  0; break;
2969         case REG_PSP:           *regp =  1; break;
2970         case REG_PRIUNAT:       *regp =  2; break;
2971         case REG_BR + 0:        *regp =  3; break;
2972         case REG_AR + AR_BSP:   *regp =  4; break;
2973         case REG_AR + AR_BSPSTORE: *regp = 5; break;
2974         case REG_AR + AR_RNAT:  *regp =  6; break;
2975         case REG_AR + AR_UNAT:  *regp =  7; break;
2976         case REG_AR + AR_FPSR:  *regp =  8; break;
2977         case REG_AR + AR_PFS:   *regp =  9; break;
2978         case REG_AR + AR_LC:    *regp = 10; break;
2979
2980         default:
2981           return 0;
2982         }
2983     }
2984   return 1;
2985 }
2986
2987 static int
2988 convert_expr_to_xy_reg (e, xy, regp)
2989      expressionS *e;
2990      unsigned int *xy;
2991      unsigned int *regp;
2992 {
2993   unsigned int reg;
2994
2995   if (e->X_op != O_register)
2996     return 0;
2997
2998   reg = e->X_add_number;
2999
3000   if (/* reg >= REG_GR && */ reg <= (REG_GR + 127))
3001     {
3002       *xy = 0;
3003       *regp = reg - REG_GR;
3004     }
3005   else if (reg >= REG_FR && reg <= (REG_FR + 127))
3006     {
3007       *xy = 1;
3008       *regp = reg - REG_FR;
3009     }
3010   else if (reg >= REG_BR && reg <= (REG_BR + 7))
3011     {
3012       *xy = 2;
3013       *regp = reg - REG_BR;
3014     }
3015   else
3016     return -1;
3017   return 1;
3018 }
3019
3020 static void
3021 dot_align (int arg)
3022 {
3023   /* The current frag is an alignment frag.  */
3024   align_frag = frag_now;
3025   s_align_bytes (arg);
3026 }
3027
3028 static void
3029 dot_radix (dummy)
3030      int dummy ATTRIBUTE_UNUSED;
3031 {
3032   int radix;
3033
3034   SKIP_WHITESPACE ();
3035   radix = *input_line_pointer++;
3036
3037   if (radix != 'C' && !is_end_of_line[(unsigned char) radix])
3038     {
3039       as_bad ("Radix `%c' unsupported", *input_line_pointer);
3040       ignore_rest_of_line ();
3041       return;
3042     }
3043 }
3044
3045 /* Helper function for .loc directives.  If the assembler is not generating
3046    line number info, then we need to remember which instructions have a .loc
3047    directive, and only call dwarf2_gen_line_info for those instructions.  */
3048
3049 static void
3050 dot_loc (int x)
3051 {
3052   CURR_SLOT.loc_directive_seen = 1;
3053   dwarf2_directive_loc (x);
3054 }
3055
3056 /* .sbss, .bss etc. are macros that expand into ".section SECNAME".  */
3057 static void
3058 dot_special_section (which)
3059      int which;
3060 {
3061   set_section ((char *) special_section_name[which]);
3062 }
3063
3064 static void
3065 add_unwind_entry (ptr)
3066      unw_rec_list *ptr;
3067 {
3068   if (unwind.tail)
3069     unwind.tail->next = ptr;
3070   else
3071     unwind.list = ptr;
3072   unwind.tail = ptr;
3073
3074   /* The current entry can in fact be a chain of unwind entries.  */
3075   if (unwind.current_entry == NULL)
3076     unwind.current_entry = ptr;
3077 }
3078
3079 static void
3080 dot_fframe (dummy)
3081      int dummy ATTRIBUTE_UNUSED;
3082 {
3083   expressionS e;
3084
3085   parse_operand (&e);
3086
3087   if (e.X_op != O_constant)
3088     as_bad ("Operand to .fframe must be a constant");
3089   else
3090     add_unwind_entry (output_mem_stack_f (e.X_add_number));
3091 }
3092
3093 static void
3094 dot_vframe (dummy)
3095      int dummy ATTRIBUTE_UNUSED;
3096 {
3097   expressionS e;
3098   unsigned reg;
3099
3100   parse_operand (&e);
3101   reg = e.X_add_number - REG_GR;
3102   if (e.X_op == O_register && reg < 128)
3103     {
3104       add_unwind_entry (output_mem_stack_v ());
3105       if (! (unwind.prologue_mask & 2))
3106         add_unwind_entry (output_psp_gr (reg));
3107     }
3108   else
3109     as_bad ("First operand to .vframe must be a general register");
3110 }
3111
3112 static void
3113 dot_vframesp (dummy)
3114      int dummy ATTRIBUTE_UNUSED;
3115 {
3116   expressionS e;
3117
3118   parse_operand (&e);
3119   if (e.X_op == O_constant)
3120     {
3121       add_unwind_entry (output_mem_stack_v ());
3122       add_unwind_entry (output_psp_sprel (e.X_add_number));
3123     }
3124   else
3125     as_bad ("Operand to .vframesp must be a constant (sp-relative offset)");
3126 }
3127
3128 static void
3129 dot_vframepsp (dummy)
3130      int dummy ATTRIBUTE_UNUSED;
3131 {
3132   expressionS e;
3133
3134   parse_operand (&e);
3135   if (e.X_op == O_constant)
3136     {
3137       add_unwind_entry (output_mem_stack_v ());
3138       add_unwind_entry (output_psp_sprel (e.X_add_number));
3139     }
3140   else
3141     as_bad ("Operand to .vframepsp must be a constant (psp-relative offset)");
3142 }
3143
3144 static void
3145 dot_save (dummy)
3146      int dummy ATTRIBUTE_UNUSED;
3147 {
3148   expressionS e1, e2;
3149   int sep;
3150   int reg1, reg2;
3151
3152   sep = parse_operand (&e1);
3153   if (sep != ',')
3154     as_bad ("No second operand to .save");
3155   sep = parse_operand (&e2);
3156
3157   reg1 = e1.X_add_number;
3158   reg2 = e2.X_add_number - REG_GR;
3159
3160   /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'.  */
3161   if (e1.X_op == O_register)
3162     {
3163       if (e2.X_op == O_register && reg2 >= 0 && reg2 < 128)
3164         {
3165           switch (reg1)
3166             {
3167             case REG_AR + AR_BSP:
3168               add_unwind_entry (output_bsp_when ());
3169               add_unwind_entry (output_bsp_gr (reg2));
3170               break;
3171             case REG_AR + AR_BSPSTORE:
3172               add_unwind_entry (output_bspstore_when ());
3173               add_unwind_entry (output_bspstore_gr (reg2));
3174               break;
3175             case REG_AR + AR_RNAT:
3176               add_unwind_entry (output_rnat_when ());
3177               add_unwind_entry (output_rnat_gr (reg2));
3178               break;
3179             case REG_AR + AR_UNAT:
3180               add_unwind_entry (output_unat_when ());
3181               add_unwind_entry (output_unat_gr (reg2));
3182               break;
3183             case REG_AR + AR_FPSR:
3184               add_unwind_entry (output_fpsr_when ());
3185               add_unwind_entry (output_fpsr_gr (reg2));
3186               break;
3187             case REG_AR + AR_PFS:
3188               add_unwind_entry (output_pfs_when ());
3189               if (! (unwind.prologue_mask & 4))
3190                 add_unwind_entry (output_pfs_gr (reg2));
3191               break;
3192             case REG_AR + AR_LC:
3193               add_unwind_entry (output_lc_when ());
3194               add_unwind_entry (output_lc_gr (reg2));
3195               break;
3196             case REG_BR:
3197               add_unwind_entry (output_rp_when ());
3198               if (! (unwind.prologue_mask & 8))
3199                 add_unwind_entry (output_rp_gr (reg2));
3200               break;
3201             case REG_PR:
3202               add_unwind_entry (output_preds_when ());
3203               if (! (unwind.prologue_mask & 1))
3204                 add_unwind_entry (output_preds_gr (reg2));
3205               break;
3206             case REG_PRIUNAT:
3207               add_unwind_entry (output_priunat_when_gr ());
3208               add_unwind_entry (output_priunat_gr (reg2));
3209               break;
3210             default:
3211               as_bad ("First operand not a valid register");
3212             }
3213         }
3214       else
3215         as_bad (" Second operand not a valid register");
3216     }
3217   else
3218     as_bad ("First operand not a register");
3219 }
3220
3221 static void
3222 dot_restore (dummy)
3223      int dummy ATTRIBUTE_UNUSED;
3224 {
3225   expressionS e1, e2;
3226   unsigned long ecount; /* # of _additional_ regions to pop */
3227   int sep;
3228
3229   sep = parse_operand (&e1);
3230   if (e1.X_op != O_register || e1.X_add_number != REG_GR + 12)
3231     {
3232       as_bad ("First operand to .restore must be stack pointer (sp)");
3233       return;
3234     }
3235
3236   if (sep == ',')
3237     {
3238       parse_operand (&e2);
3239       if (e2.X_op != O_constant || e2.X_add_number < 0)
3240         {
3241           as_bad ("Second operand to .restore must be a constant >= 0");
3242           return;
3243         }
3244       ecount = e2.X_add_number;
3245     }
3246   else
3247     ecount = unwind.prologue_count - 1;
3248
3249   if (ecount >= unwind.prologue_count)
3250     {
3251       as_bad ("Epilogue count of %lu exceeds number of nested prologues (%u)",
3252               ecount + 1, unwind.prologue_count);
3253       return;
3254     }
3255
3256   add_unwind_entry (output_epilogue (ecount));
3257
3258   if (ecount < unwind.prologue_count)
3259     unwind.prologue_count -= ecount + 1;
3260   else
3261     unwind.prologue_count = 0;
3262 }
3263
3264 static void
3265 dot_restorereg (dummy)
3266      int dummy ATTRIBUTE_UNUSED;
3267 {
3268   unsigned int ab, reg;
3269   expressionS e;
3270
3271   parse_operand (&e);
3272
3273   if (!convert_expr_to_ab_reg (&e, &ab, &reg))
3274     {
3275       as_bad ("First operand to .restorereg must be a preserved register");
3276       return;
3277     }
3278   add_unwind_entry (output_spill_reg (ab, reg, 0, 0));
3279 }
3280
3281 static void
3282 dot_restorereg_p (dummy)
3283      int dummy ATTRIBUTE_UNUSED;
3284 {
3285   unsigned int qp, ab, reg;
3286   expressionS e1, e2;
3287   int sep;
3288
3289   sep = parse_operand (&e1);
3290   if (sep != ',')
3291     {
3292       as_bad ("No second operand to .restorereg.p");
3293       return;
3294     }
3295
3296   parse_operand (&e2);
3297
3298   qp = e1.X_add_number - REG_P;
3299   if (e1.X_op != O_register || qp > 63)
3300     {
3301       as_bad ("First operand to .restorereg.p must be a predicate");
3302       return;
3303     }
3304
3305   if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3306     {
3307       as_bad ("Second operand to .restorereg.p must be a preserved register");
3308       return;
3309     }
3310   add_unwind_entry (output_spill_reg_p (ab, reg, 0, 0, qp));
3311 }
3312
3313 static char *special_linkonce_name[] =
3314   {
3315     ".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
3316   };
3317
3318 static void
3319 start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty)
3320 {
3321   /*
3322     Use a slightly ugly scheme to derive the unwind section names from
3323     the text section name:
3324
3325     text sect.  unwind table sect.
3326     name:       name:                      comments:
3327     ----------  -----------------          --------------------------------
3328     .text       .IA_64.unwind
3329     .text.foo   .IA_64.unwind.text.foo
3330     .foo        .IA_64.unwind.foo
3331     .gnu.linkonce.t.foo
3332                 .gnu.linkonce.ia64unw.foo
3333     _info       .IA_64.unwind_info         gas issues error message (ditto)
3334     _infoFOO    .IA_64.unwind_infoFOO      gas issues error message (ditto)
3335
3336     This mapping is done so that:
3337
3338         (a) An object file with unwind info only in .text will use
3339             unwind section names .IA_64.unwind and .IA_64.unwind_info.
3340             This follows the letter of the ABI and also ensures backwards
3341             compatibility with older toolchains.
3342
3343         (b) An object file with unwind info in multiple text sections
3344             will use separate unwind sections for each text section.
3345             This allows us to properly set the "sh_info" and "sh_link"
3346             fields in SHT_IA_64_UNWIND as required by the ABI and also
3347             lets GNU ld support programs with multiple segments
3348             containing unwind info (as might be the case for certain
3349             embedded applications).
3350
3351         (c) An error is issued if there would be a name clash.
3352   */
3353
3354   const char *text_name, *sec_text_name;
3355   char *sec_name;
3356   const char *prefix = special_section_name [sec_index];
3357   const char *suffix;
3358   size_t prefix_len, suffix_len, sec_name_len;
3359
3360   sec_text_name = segment_name (text_seg);
3361   text_name = sec_text_name;
3362   if (strncmp (text_name, "_info", 5) == 0)
3363     {
3364       as_bad ("Illegal section name `%s' (causes unwind section name clash)",
3365               text_name);
3366       ignore_rest_of_line ();
3367       return;
3368     }
3369   if (strcmp (text_name, ".text") == 0)
3370     text_name = "";
3371
3372   /* Build the unwind section name by appending the (possibly stripped)
3373      text section name to the unwind prefix.  */
3374   suffix = text_name;
3375   if (strncmp (text_name, ".gnu.linkonce.t.",
3376                sizeof (".gnu.linkonce.t.") - 1) == 0)
3377     {
3378       prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND];
3379       suffix += sizeof (".gnu.linkonce.t.") - 1;
3380     }
3381   else if (linkonce_empty)
3382     return;
3383
3384   prefix_len = strlen (prefix);
3385   suffix_len = strlen (suffix);
3386   sec_name_len = prefix_len + suffix_len;
3387   sec_name = alloca (sec_name_len + 1);
3388   memcpy (sec_name, prefix, prefix_len);
3389   memcpy (sec_name + prefix_len, suffix, suffix_len);
3390   sec_name [sec_name_len] = '\0';
3391
3392   /* Handle COMDAT group.  */
3393   if (suffix == text_name && (text_seg->flags & SEC_LINK_ONCE) != 0)
3394     {
3395       char *section;
3396       size_t len, group_name_len;
3397       const char *group_name = elf_group_name (text_seg);
3398
3399       if (group_name == NULL)
3400         {
3401           as_bad ("Group section `%s' has no group signature",
3402                   sec_text_name);
3403           ignore_rest_of_line ();
3404           return;
3405         }
3406       /* We have to construct a fake section directive. */
3407       group_name_len = strlen (group_name);
3408       len = (sec_name_len
3409              + 16                       /* ,"aG",@progbits,  */
3410              + group_name_len           /* ,group_name  */
3411              + 7);                      /* ,comdat  */
3412
3413       section = alloca (len + 1);
3414       memcpy (section, sec_name, sec_name_len);
3415       memcpy (section + sec_name_len, ",\"aG\",@progbits,", 16);
3416       memcpy (section + sec_name_len + 16, group_name, group_name_len);
3417       memcpy (section + len - 7, ",comdat", 7);
3418       section [len] = '\0';
3419       set_section (section);
3420     }
3421   else
3422     {
3423       set_section (sec_name);
3424       bfd_set_section_flags (stdoutput, now_seg,
3425                              SEC_LOAD | SEC_ALLOC | SEC_READONLY);
3426     }
3427
3428   elf_linked_to_section (now_seg) = text_seg;
3429 }
3430
3431 static void
3432 generate_unwind_image (const segT text_seg)
3433 {
3434   int size, pad;
3435   unw_rec_list *list;
3436
3437   /* Mark the end of the unwind info, so that we can compute the size of the
3438      last unwind region.  */
3439   add_unwind_entry (output_endp ());
3440
3441   /* Force out pending instructions, to make sure all unwind records have
3442      a valid slot_number field.  */
3443   ia64_flush_insns ();
3444
3445   /* Generate the unwind record.  */
3446   list = optimize_unw_records (unwind.list);
3447   fixup_unw_records (list, 1);
3448   size = calc_record_size (list);
3449
3450   if (size > 0 || unwind.force_unwind_entry)
3451     {
3452       unwind.force_unwind_entry = 0;
3453       /* pad to pointer-size boundary.  */
3454       pad = size % md.pointer_size;
3455       if (pad != 0)
3456         size += md.pointer_size - pad;
3457       /* Add 8 for the header + a pointer for the personality
3458          offset.  */
3459       size += 8 + md.pointer_size;
3460     }
3461
3462   /* If there are unwind records, switch sections, and output the info.  */
3463   if (size != 0)
3464     {
3465       expressionS exp;
3466       bfd_reloc_code_real_type reloc;
3467
3468       start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0);
3469
3470       /* Make sure the section has 4 byte alignment for ILP32 and
3471          8 byte alignment for LP64.  */
3472       frag_align (md.pointer_size_shift, 0, 0);
3473       record_alignment (now_seg, md.pointer_size_shift);
3474
3475       /* Set expression which points to start of unwind descriptor area.  */
3476       unwind.info = expr_build_dot ();
3477       
3478       frag_var (rs_machine_dependent, size, size, 0, 0,
3479                 (offsetT) (long) unwind.personality_routine,
3480                 (char *) list);
3481
3482       /* Add the personality address to the image.  */
3483       if (unwind.personality_routine != 0)
3484         {
3485           exp.X_op = O_symbol;
3486           exp.X_add_symbol = unwind.personality_routine;
3487           exp.X_add_number = 0;
3488
3489           if (md.flags & EF_IA_64_BE)
3490             {
3491               if (md.flags & EF_IA_64_ABI64)
3492                 reloc = BFD_RELOC_IA64_LTOFF_FPTR64MSB;
3493               else
3494                 reloc = BFD_RELOC_IA64_LTOFF_FPTR32MSB;
3495             }
3496           else
3497             {
3498               if (md.flags & EF_IA_64_ABI64)
3499                 reloc = BFD_RELOC_IA64_LTOFF_FPTR64LSB;
3500               else
3501                 reloc = BFD_RELOC_IA64_LTOFF_FPTR32LSB;
3502             }
3503
3504           fix_new_exp (frag_now, frag_now_fix () - md.pointer_size,
3505                        md.pointer_size, &exp, 0, reloc);
3506           unwind.personality_routine = 0;
3507         }
3508     }
3509   else
3510     start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1);
3511
3512   free_saved_prologue_counts ();
3513   unwind.list = unwind.tail = unwind.current_entry = NULL;
3514 }
3515
3516 static void
3517 dot_handlerdata (dummy)
3518      int dummy ATTRIBUTE_UNUSED;
3519 {
3520   unwind.force_unwind_entry = 1;
3521
3522   /* Remember which segment we're in so we can switch back after .endp */
3523   unwind.saved_text_seg = now_seg;
3524   unwind.saved_text_subseg = now_subseg;
3525
3526   /* Generate unwind info into unwind-info section and then leave that
3527      section as the currently active one so dataXX directives go into
3528      the language specific data area of the unwind info block.  */
3529   generate_unwind_image (now_seg);
3530   demand_empty_rest_of_line ();
3531 }
3532
3533 static void
3534 dot_unwentry (dummy)
3535      int dummy ATTRIBUTE_UNUSED;
3536 {
3537   unwind.force_unwind_entry = 1;
3538   demand_empty_rest_of_line ();
3539 }
3540
3541 static void
3542 dot_altrp (dummy)
3543      int dummy ATTRIBUTE_UNUSED;
3544 {
3545   expressionS e;
3546   unsigned reg;
3547
3548   parse_operand (&e);
3549   reg = e.X_add_number - REG_BR;
3550   if (e.X_op == O_register && reg < 8)
3551     add_unwind_entry (output_rp_br (reg));
3552   else
3553     as_bad ("First operand not a valid branch register");
3554 }
3555
3556 static void
3557 dot_savemem (psprel)
3558      int psprel;
3559 {
3560   expressionS e1, e2;
3561   int sep;
3562   int reg1, val;
3563
3564   sep = parse_operand (&e1);
3565   if (sep != ',')
3566     as_bad ("No second operand to .save%ssp", psprel ? "p" : "");
3567   sep = parse_operand (&e2);
3568
3569   reg1 = e1.X_add_number;
3570   val = e2.X_add_number;
3571
3572   /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'.  */
3573   if (e1.X_op == O_register)
3574     {
3575       if (e2.X_op == O_constant)
3576         {
3577           switch (reg1)
3578             {
3579             case REG_AR + AR_BSP:
3580               add_unwind_entry (output_bsp_when ());
3581               add_unwind_entry ((psprel
3582                                  ? output_bsp_psprel
3583                                  : output_bsp_sprel) (val));
3584               break;
3585             case REG_AR + AR_BSPSTORE:
3586               add_unwind_entry (output_bspstore_when ());
3587               add_unwind_entry ((psprel
3588                                  ? output_bspstore_psprel
3589                                  : output_bspstore_sprel) (val));
3590               break;
3591             case REG_AR + AR_RNAT:
3592               add_unwind_entry (output_rnat_when ());
3593               add_unwind_entry ((psprel
3594                                  ? output_rnat_psprel
3595                                  : output_rnat_sprel) (val));
3596               break;
3597             case REG_AR + AR_UNAT:
3598               add_unwind_entry (output_unat_when ());
3599               add_unwind_entry ((psprel
3600                                  ? output_unat_psprel
3601                                  : output_unat_sprel) (val));
3602               break;
3603             case REG_AR + AR_FPSR:
3604               add_unwind_entry (output_fpsr_when ());
3605               add_unwind_entry ((psprel
3606                                  ? output_fpsr_psprel
3607                                  : output_fpsr_sprel) (val));
3608               break;
3609             case REG_AR + AR_PFS:
3610               add_unwind_entry (output_pfs_when ());
3611               add_unwind_entry ((psprel
3612                                  ? output_pfs_psprel
3613                                  : output_pfs_sprel) (val));
3614               break;
3615             case REG_AR + AR_LC:
3616               add_unwind_entry (output_lc_when ());
3617               add_unwind_entry ((psprel
3618                                  ? output_lc_psprel
3619                                  : output_lc_sprel) (val));
3620               break;
3621             case REG_BR:
3622               add_unwind_entry (output_rp_when ());
3623               add_unwind_entry ((psprel
3624                                  ? output_rp_psprel
3625                                  : output_rp_sprel) (val));
3626               break;
3627             case REG_PR:
3628               add_unwind_entry (output_preds_when ());
3629               add_unwind_entry ((psprel
3630                                  ? output_preds_psprel
3631                                  : output_preds_sprel) (val));
3632               break;
3633             case REG_PRIUNAT:
3634               add_unwind_entry (output_priunat_when_mem ());
3635               add_unwind_entry ((psprel
3636                                  ? output_priunat_psprel
3637                                  : output_priunat_sprel) (val));
3638               break;
3639             default:
3640               as_bad ("First operand not a valid register");
3641             }
3642         }
3643       else
3644         as_bad (" Second operand not a valid constant");
3645     }
3646   else
3647     as_bad ("First operand not a register");
3648 }
3649
3650 static void
3651 dot_saveg (dummy)
3652      int dummy ATTRIBUTE_UNUSED;
3653 {
3654   expressionS e1, e2;
3655   int sep;
3656   sep = parse_operand (&e1);
3657   if (sep == ',')
3658     parse_operand (&e2);
3659
3660   if (e1.X_op != O_constant)
3661     as_bad ("First operand to .save.g must be a constant.");
3662   else
3663     {
3664       int grmask = e1.X_add_number;
3665       if (sep != ',')
3666         add_unwind_entry (output_gr_mem (grmask));
3667       else
3668         {
3669           int reg = e2.X_add_number - REG_GR;
3670           if (e2.X_op == O_register && reg >= 0 && reg < 128)
3671             add_unwind_entry (output_gr_gr (grmask, reg));
3672           else
3673             as_bad ("Second operand is an invalid register.");
3674         }
3675     }
3676 }
3677
3678 static void
3679 dot_savef (dummy)
3680      int dummy ATTRIBUTE_UNUSED;
3681 {
3682   expressionS e1;
3683   int sep;
3684   sep = parse_operand (&e1);
3685
3686   if (e1.X_op != O_constant)
3687     as_bad ("Operand to .save.f must be a constant.");
3688   else
3689     add_unwind_entry (output_fr_mem (e1.X_add_number));
3690 }
3691
3692 static void
3693 dot_saveb (dummy)
3694      int dummy ATTRIBUTE_UNUSED;
3695 {
3696   expressionS e1, e2;
3697   unsigned int reg;
3698   unsigned char sep;
3699   int brmask;
3700
3701   sep = parse_operand (&e1);
3702   if (e1.X_op != O_constant)
3703     {
3704       as_bad ("First operand to .save.b must be a constant.");
3705       return;
3706     }
3707   brmask = e1.X_add_number;
3708
3709   if (sep == ',')
3710     {
3711       sep = parse_operand (&e2);
3712       reg = e2.X_add_number - REG_GR;
3713       if (e2.X_op != O_register || reg > 127)
3714         {
3715           as_bad ("Second operand to .save.b must be a general register.");
3716           return;
3717         }
3718       add_unwind_entry (output_br_gr (brmask, e2.X_add_number));
3719     }
3720   else
3721     add_unwind_entry (output_br_mem (brmask));
3722
3723   if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3724     demand_empty_rest_of_line ();
3725 }
3726
3727 static void
3728 dot_savegf (dummy)
3729      int dummy ATTRIBUTE_UNUSED;
3730 {
3731   expressionS e1, e2;
3732   int sep;
3733   sep = parse_operand (&e1);
3734   if (sep == ',')
3735     parse_operand (&e2);
3736
3737   if (e1.X_op != O_constant || sep != ',' || e2.X_op != O_constant)
3738     as_bad ("Both operands of .save.gf must be constants.");
3739   else
3740     {
3741       int grmask = e1.X_add_number;
3742       int frmask = e2.X_add_number;
3743       add_unwind_entry (output_frgr_mem (grmask, frmask));
3744     }
3745 }
3746
3747 static void
3748 dot_spill (dummy)
3749      int dummy ATTRIBUTE_UNUSED;
3750 {
3751   expressionS e;
3752   unsigned char sep;
3753
3754   sep = parse_operand (&e);
3755   if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3756     demand_empty_rest_of_line ();
3757
3758   if (e.X_op != O_constant)
3759     as_bad ("Operand to .spill must be a constant");
3760   else
3761     add_unwind_entry (output_spill_base (e.X_add_number));
3762 }
3763
3764 static void
3765 dot_spillreg (dummy)
3766      int dummy ATTRIBUTE_UNUSED;
3767 {
3768   int sep, ab, xy, reg, treg;
3769   expressionS e1, e2;
3770
3771   sep = parse_operand (&e1);
3772   if (sep != ',')
3773     {
3774       as_bad ("No second operand to .spillreg");
3775       return;
3776     }
3777
3778   parse_operand (&e2);
3779
3780   if (!convert_expr_to_ab_reg (&e1, &ab, &reg))
3781     {
3782       as_bad ("First operand to .spillreg must be a preserved register");
3783       return;
3784     }
3785
3786   if (!convert_expr_to_xy_reg (&e2, &xy, &treg))
3787     {
3788       as_bad ("Second operand to .spillreg must be a register");
3789       return;
3790     }
3791
3792   add_unwind_entry (output_spill_reg (ab, reg, treg, xy));
3793 }
3794
3795 static void
3796 dot_spillmem (psprel)
3797      int psprel;
3798 {
3799   expressionS e1, e2;
3800   int sep, ab, reg;
3801
3802   sep = parse_operand (&e1);
3803   if (sep != ',')
3804     {
3805       as_bad ("Second operand missing");
3806       return;
3807     }
3808
3809   parse_operand (&e2);
3810
3811   if (!convert_expr_to_ab_reg (&e1, &ab, &reg))
3812     {
3813       as_bad ("First operand to .spill%s must be a preserved register",
3814               psprel ? "psp" : "sp");
3815       return;
3816     }
3817
3818   if (e2.X_op != O_constant)
3819     {
3820       as_bad ("Second operand to .spill%s must be a constant",
3821               psprel ? "psp" : "sp");
3822       return;
3823     }
3824
3825   if (psprel)
3826     add_unwind_entry (output_spill_psprel (ab, reg, e2.X_add_number));
3827   else
3828     add_unwind_entry (output_spill_sprel (ab, reg, e2.X_add_number));
3829 }
3830
3831 static void
3832 dot_spillreg_p (dummy)
3833      int dummy ATTRIBUTE_UNUSED;
3834 {
3835   int sep, ab, xy, reg, treg;
3836   expressionS e1, e2, e3;
3837   unsigned int qp;
3838
3839   sep = parse_operand (&e1);
3840   if (sep != ',')
3841     {
3842       as_bad ("No second and third operand to .spillreg.p");
3843       return;
3844     }
3845
3846   sep = parse_operand (&e2);
3847   if (sep != ',')
3848     {
3849       as_bad ("No third operand to .spillreg.p");
3850       return;
3851     }
3852
3853   parse_operand (&e3);
3854
3855   qp = e1.X_add_number - REG_P;
3856
3857   if (e1.X_op != O_register || qp > 63)
3858     {
3859       as_bad ("First operand to .spillreg.p must be a predicate");
3860       return;
3861     }
3862
3863   if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3864     {
3865       as_bad ("Second operand to .spillreg.p must be a preserved register");
3866       return;
3867     }
3868
3869   if (!convert_expr_to_xy_reg (&e3, &xy, &treg))
3870     {
3871       as_bad ("Third operand to .spillreg.p must be a register");
3872       return;
3873     }
3874
3875   add_unwind_entry (output_spill_reg_p (ab, reg, treg, xy, qp));
3876 }
3877
3878 static void
3879 dot_spillmem_p (psprel)
3880      int psprel;
3881 {
3882   expressionS e1, e2, e3;
3883   int sep, ab, reg;
3884   unsigned int qp;
3885
3886   sep = parse_operand (&e1);
3887   if (sep != ',')
3888     {
3889       as_bad ("Second operand missing");
3890       return;
3891     }
3892
3893   parse_operand (&e2);
3894   if (sep != ',')
3895     {
3896       as_bad ("Second operand missing");
3897       return;
3898     }
3899
3900   parse_operand (&e3);
3901
3902   qp = e1.X_add_number - REG_P;
3903   if (e1.X_op != O_register || qp > 63)
3904     {
3905       as_bad ("First operand to .spill%s_p must be a predicate",
3906               psprel ? "psp" : "sp");
3907       return;
3908     }
3909
3910   if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3911     {
3912       as_bad ("Second operand to .spill%s_p must be a preserved register",
3913               psprel ? "psp" : "sp");
3914       return;
3915     }
3916
3917   if (e3.X_op != O_constant)
3918     {
3919       as_bad ("Third operand to .spill%s_p must be a constant",
3920               psprel ? "psp" : "sp");
3921       return;
3922     }
3923
3924   if (psprel)
3925     add_unwind_entry (output_spill_psprel_p (ab, reg, e3.X_add_number, qp));
3926   else
3927     add_unwind_entry (output_spill_sprel_p (ab, reg, e3.X_add_number, qp));
3928 }
3929
3930 static unsigned int
3931 get_saved_prologue_count (lbl)
3932      unsigned long lbl;
3933 {
3934   label_prologue_count *lpc = unwind.saved_prologue_counts;
3935
3936   while (lpc != NULL && lpc->label_number != lbl)
3937     lpc = lpc->next;
3938
3939   if (lpc != NULL)
3940     return lpc->prologue_count;
3941
3942   as_bad ("Missing .label_state %ld", lbl);
3943   return 1;
3944 }
3945
3946 static void
3947 save_prologue_count (lbl, count)
3948      unsigned long lbl;
3949      unsigned int count;
3950 {
3951   label_prologue_count *lpc = unwind.saved_prologue_counts;
3952
3953   while (lpc != NULL && lpc->label_number != lbl)
3954     lpc = lpc->next;
3955
3956   if (lpc != NULL)
3957     lpc->prologue_count = count;
3958   else
3959     {
3960       label_prologue_count *new_lpc = xmalloc (sizeof (* new_lpc));
3961
3962       new_lpc->next = unwind.saved_prologue_counts;
3963       new_lpc->label_number = lbl;
3964       new_lpc->prologue_count = count;
3965       unwind.saved_prologue_counts = new_lpc;
3966     }
3967 }
3968
3969 static void
3970 free_saved_prologue_counts ()
3971 {
3972   label_prologue_count *lpc = unwind.saved_prologue_counts;
3973   label_prologue_count *next;
3974
3975   while (lpc != NULL)
3976     {
3977       next = lpc->next;
3978       free (lpc);
3979       lpc = next;
3980     }
3981
3982   unwind.saved_prologue_counts = NULL;
3983 }
3984
3985 static void
3986 dot_label_state (dummy)
3987      int dummy ATTRIBUTE_UNUSED;
3988 {
3989   expressionS e;
3990
3991   parse_operand (&e);
3992   if (e.X_op != O_constant)
3993     {
3994       as_bad ("Operand to .label_state must be a constant");
3995       return;
3996     }
3997   add_unwind_entry (output_label_state (e.X_add_number));
3998   save_prologue_count (e.X_add_number, unwind.prologue_count);
3999 }
4000
4001 static void
4002 dot_copy_state (dummy)
4003      int dummy ATTRIBUTE_UNUSED;
4004 {
4005   expressionS e;
4006
4007   parse_operand (&e);
4008   if (e.X_op != O_constant)
4009     {
4010       as_bad ("Operand to .copy_state must be a constant");
4011       return;
4012     }
4013   add_unwind_entry (output_copy_state (e.X_add_number));
4014   unwind.prologue_count = get_saved_prologue_count (e.X_add_number);
4015 }
4016
4017 static void
4018 dot_unwabi (dummy)
4019      int dummy ATTRIBUTE_UNUSED;
4020 {
4021   expressionS e1, e2;
4022   unsigned char sep;
4023
4024   sep = parse_operand (&e1);
4025   if (sep != ',')
4026     {
4027       as_bad ("Second operand to .unwabi missing");
4028       return;
4029     }
4030   sep = parse_operand (&e2);
4031   if (!is_end_of_line[sep] && !is_it_end_of_statement ())
4032     demand_empty_rest_of_line ();
4033
4034   if (e1.X_op != O_constant)
4035     {
4036       as_bad ("First operand to .unwabi must be a constant");
4037       return;
4038     }
4039
4040   if (e2.X_op != O_constant)
4041     {
4042       as_bad ("Second operand to .unwabi must be a constant");
4043       return;
4044     }
4045
4046   add_unwind_entry (output_unwabi (e1.X_add_number, e2.X_add_number));
4047 }
4048
4049 static void
4050 dot_personality (dummy)
4051      int dummy ATTRIBUTE_UNUSED;
4052 {
4053   char *name, *p, c;
4054   SKIP_WHITESPACE ();
4055   name = input_line_pointer;
4056   c = get_symbol_end ();
4057   p = input_line_pointer;
4058   unwind.personality_routine = symbol_find_or_make (name);
4059   unwind.force_unwind_entry = 1;
4060   *p = c;
4061   SKIP_WHITESPACE ();
4062   demand_empty_rest_of_line ();
4063 }
4064
4065 static void
4066 dot_proc (dummy)
4067      int dummy ATTRIBUTE_UNUSED;
4068 {
4069   char *name, *p, c;
4070   symbolS *sym;
4071
4072   unwind.proc_start = expr_build_dot ();
4073   /* Parse names of main and alternate entry points and mark them as
4074      function symbols:  */
4075   while (1)
4076     {
4077       SKIP_WHITESPACE ();
4078       name = input_line_pointer;
4079       c = get_symbol_end ();
4080       p = input_line_pointer;
4081       sym = symbol_find_or_make (name);
4082       if (unwind.proc_start == 0)
4083         {
4084           unwind.proc_start = sym;
4085         }
4086       symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
4087       *p = c;
4088       SKIP_WHITESPACE ();
4089       if (*input_line_pointer != ',')
4090         break;
4091       ++input_line_pointer;
4092     }
4093   demand_empty_rest_of_line ();
4094   ia64_do_align (16);
4095
4096   unwind.prologue_count = 0;
4097   unwind.list = unwind.tail = unwind.current_entry = NULL;
4098   unwind.personality_routine = 0;
4099 }
4100
4101 static void
4102 dot_body (dummy)
4103      int dummy ATTRIBUTE_UNUSED;
4104 {
4105   unwind.prologue = 0;
4106   unwind.prologue_mask = 0;
4107
4108   add_unwind_entry (output_body ());
4109   demand_empty_rest_of_line ();
4110 }
4111
4112 static void
4113 dot_prologue (dummy)
4114      int dummy ATTRIBUTE_UNUSED;
4115 {
4116   unsigned char sep;
4117   int mask = 0, grsave = 0;
4118
4119   if (!is_it_end_of_statement ())
4120     {
4121       expressionS e1, e2;
4122       sep = parse_operand (&e1);
4123       if (sep != ',')
4124         as_bad ("No second operand to .prologue");
4125       sep = parse_operand (&e2);
4126       if (!is_end_of_line[sep] && !is_it_end_of_statement ())
4127         demand_empty_rest_of_line ();
4128
4129       if (e1.X_op == O_constant)
4130         {
4131           mask = e1.X_add_number;
4132
4133           if (e2.X_op == O_constant)
4134             grsave = e2.X_add_number;
4135           else if (e2.X_op == O_register
4136                    && (grsave = e2.X_add_number - REG_GR) < 128)
4137             ;
4138           else
4139             as_bad ("Second operand not a constant or general register");
4140
4141           add_unwind_entry (output_prologue_gr (mask, grsave));
4142         }
4143       else
4144         as_bad ("First operand not a constant");
4145     }
4146   else
4147     add_unwind_entry (output_prologue ());
4148
4149   unwind.prologue = 1;
4150   unwind.prologue_mask = mask;
4151   ++unwind.prologue_count;
4152 }
4153
4154 static void
4155 dot_endp (dummy)
4156      int dummy ATTRIBUTE_UNUSED;
4157 {
4158   expressionS e;
4159   unsigned char *ptr;
4160   int bytes_per_address;
4161   long where;
4162   segT saved_seg;
4163   subsegT saved_subseg;
4164   char *name, *p, c;
4165   symbolS *sym;
4166
4167   if (unwind.saved_text_seg)
4168     {
4169       saved_seg = unwind.saved_text_seg;
4170       saved_subseg = unwind.saved_text_subseg;
4171       unwind.saved_text_seg = NULL;
4172     }
4173   else
4174     {
4175       saved_seg = now_seg;
4176       saved_subseg = now_subseg;
4177     }
4178
4179   insn_group_break (1, 0, 0);
4180
4181   /* If there wasn't a .handlerdata, we haven't generated an image yet.  */
4182   if (!unwind.info)
4183     generate_unwind_image (saved_seg);
4184
4185   if (unwind.info || unwind.force_unwind_entry)
4186     {
4187       subseg_set (md.last_text_seg, 0);
4188       unwind.proc_end = expr_build_dot ();
4189
4190       start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0);
4191
4192       /* Make sure that section has 4 byte alignment for ILP32 and
4193          8 byte alignment for LP64.  */
4194       record_alignment (now_seg, md.pointer_size_shift);
4195
4196       /* Need space for 3 pointers for procedure start, procedure end,
4197          and unwind info.  */
4198       ptr = frag_more (3 * md.pointer_size);
4199       where = frag_now_fix () - (3 * md.pointer_size);
4200       bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
4201
4202       /* Issue the values of  a) Proc Begin, b) Proc End, c) Unwind Record.  */
4203       e.X_op = O_pseudo_fixup;
4204       e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4205       e.X_add_number = 0;
4206       e.X_add_symbol = unwind.proc_start;
4207       ia64_cons_fix_new (frag_now, where, bytes_per_address, &e);
4208
4209       e.X_op = O_pseudo_fixup;
4210       e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4211       e.X_add_number = 0;
4212       e.X_add_symbol = unwind.proc_end;
4213       ia64_cons_fix_new (frag_now, where + bytes_per_address,
4214                          bytes_per_address, &e);
4215
4216       if (unwind.info)
4217         {
4218           e.X_op = O_pseudo_fixup;
4219           e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4220           e.X_add_number = 0;
4221           e.X_add_symbol = unwind.info;
4222           ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2),
4223                              bytes_per_address, &e);
4224         }
4225       else
4226         md_number_to_chars (ptr + (bytes_per_address * 2), 0,
4227                             bytes_per_address);
4228
4229     }
4230   else
4231     start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1);
4232
4233   subseg_set (saved_seg, saved_subseg);
4234
4235   /* Parse names of main and alternate entry points and set symbol sizes.  */
4236   while (1)
4237     {
4238       SKIP_WHITESPACE ();
4239       name = input_line_pointer;
4240       c = get_symbol_end ();
4241       p = input_line_pointer;
4242       sym = symbol_find (name);
4243       if (sym && unwind.proc_start
4244           && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION)
4245           && S_GET_SIZE (sym) == 0 && symbol_get_obj (sym)->size == NULL)
4246         {
4247           fragS *fr = symbol_get_frag (unwind.proc_start);
4248           fragS *frag = symbol_get_frag (sym);
4249
4250           /* Check whether the function label is at or beyond last
4251              .proc directive.  */
4252           while (fr && fr != frag)
4253             fr = fr->fr_next;
4254           if (fr)
4255             {
4256               if (frag == frag_now && SEG_NORMAL (now_seg))
4257                 S_SET_SIZE (sym, frag_now_fix () - S_GET_VALUE (sym));
4258               else
4259                 {
4260                   symbol_get_obj (sym)->size =
4261                     (expressionS *) xmalloc (sizeof (expressionS));
4262                   symbol_get_obj (sym)->size->X_op = O_subtract;
4263                   symbol_get_obj (sym)->size->X_add_symbol
4264                     = symbol_new (FAKE_LABEL_NAME, now_seg,
4265                                   frag_now_fix (), frag_now);
4266                   symbol_get_obj (sym)->size->X_op_symbol = sym;
4267                   symbol_get_obj (sym)->size->X_add_number = 0;
4268                 }
4269             }
4270         }
4271       *p = c;
4272       SKIP_WHITESPACE ();
4273       if (*input_line_pointer != ',')
4274         break;
4275       ++input_line_pointer;
4276     }
4277   demand_empty_rest_of_line ();
4278   unwind.proc_start = unwind.proc_end = unwind.info = 0;
4279 }
4280
4281 static void
4282 dot_template (template)
4283      int template;
4284 {
4285   CURR_SLOT.user_template = template;
4286 }
4287
4288 static void
4289 dot_regstk (dummy)
4290      int dummy ATTRIBUTE_UNUSED;
4291 {
4292   int ins, locs, outs, rots;
4293
4294   if (is_it_end_of_statement ())
4295     ins = locs = outs = rots = 0;
4296   else
4297     {
4298       ins = get_absolute_expression ();
4299       if (*input_line_pointer++ != ',')
4300         goto err;
4301       locs = get_absolute_expression ();
4302       if (*input_line_pointer++ != ',')
4303         goto err;
4304       outs = get_absolute_expression ();
4305       if (*input_line_pointer++ != ',')
4306         goto err;
4307       rots = get_absolute_expression ();
4308     }
4309   set_regstack (ins, locs, outs, rots);
4310   return;
4311
4312  err:
4313   as_bad ("Comma expected");
4314   ignore_rest_of_line ();
4315 }
4316
4317 static void
4318 dot_rot (type)
4319      int type;
4320 {
4321   unsigned num_regs, num_alloced = 0;
4322   struct dynreg **drpp, *dr;
4323   int ch, base_reg = 0;
4324   char *name, *start;
4325   size_t len;
4326
4327   switch (type)
4328     {
4329     case DYNREG_GR: base_reg = REG_GR + 32; break;
4330     case DYNREG_FR: base_reg = REG_FR + 32; break;
4331     case DYNREG_PR: base_reg = REG_P + 16; break;
4332     default: break;
4333     }
4334
4335   /* First, remove existing names from hash table.  */
4336   for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
4337     {
4338       hash_delete (md.dynreg_hash, dr->name);
4339       dr->num_regs = 0;
4340     }
4341
4342   drpp = &md.dynreg[type];
4343   while (1)
4344     {
4345       start = input_line_pointer;
4346       ch = get_symbol_end ();
4347       *input_line_pointer = ch;
4348       len = (input_line_pointer - start);
4349
4350       SKIP_WHITESPACE ();
4351       if (*input_line_pointer != '[')
4352         {
4353           as_bad ("Expected '['");
4354           goto err;
4355         }
4356       ++input_line_pointer;     /* skip '[' */
4357
4358       num_regs = get_absolute_expression ();
4359
4360       if (*input_line_pointer++ != ']')
4361         {
4362           as_bad ("Expected ']'");
4363           goto err;
4364         }
4365       SKIP_WHITESPACE ();
4366
4367       num_alloced += num_regs;
4368       switch (type)
4369         {
4370         case DYNREG_GR:
4371           if (num_alloced > md.rot.num_regs)
4372             {
4373               as_bad ("Used more than the declared %d rotating registers",
4374                       md.rot.num_regs);
4375               goto err;
4376             }
4377           break;
4378         case DYNREG_FR:
4379           if (num_alloced > 96)
4380             {
4381               as_bad ("Used more than the available 96 rotating registers");
4382               goto err;
4383             }
4384           break;
4385         case DYNREG_PR:
4386           if (num_alloced > 48)
4387             {
4388               as_bad ("Used more than the available 48 rotating registers");
4389               goto err;
4390             }
4391           break;
4392
4393         default:
4394           break;
4395         }
4396
4397       name = obstack_alloc (&notes, len + 1);
4398       memcpy (name, start, len);
4399       name[len] = '\0';
4400
4401       if (!*drpp)
4402         {
4403           *drpp = obstack_alloc (&notes, sizeof (*dr));
4404           memset (*drpp, 0, sizeof (*dr));
4405         }
4406
4407       dr = *drpp;
4408       dr->name = name;
4409       dr->num_regs = num_regs;
4410       dr->base = base_reg;
4411       drpp = &dr->next;
4412       base_reg += num_regs;
4413
4414       if (hash_insert (md.dynreg_hash, name, dr))
4415         {
4416           as_bad ("Attempt to redefine register set `%s'", name);
4417           goto err;
4418         }
4419
4420       if (*input_line_pointer != ',')
4421         break;
4422       ++input_line_pointer;     /* skip comma */
4423       SKIP_WHITESPACE ();
4424     }
4425   demand_empty_rest_of_line ();
4426   return;
4427
4428  err:
4429   ignore_rest_of_line ();
4430 }
4431
4432 static void
4433 dot_byteorder (byteorder)
4434      int byteorder;
4435 {
4436   segment_info_type *seginfo = seg_info (now_seg);
4437
4438   if (byteorder == -1)
4439     {
4440       if (seginfo->tc_segment_info_data.endian == 0)
4441         seginfo->tc_segment_info_data.endian = default_big_endian ? 1 : 2;
4442       byteorder = seginfo->tc_segment_info_data.endian == 1;
4443     }
4444   else
4445     seginfo->tc_segment_info_data.endian = byteorder ? 1 : 2;
4446
4447   if (target_big_endian != byteorder)
4448     {
4449       target_big_endian = byteorder;
4450       if (target_big_endian)
4451         {
4452           ia64_number_to_chars = number_to_chars_bigendian;
4453           ia64_float_to_chars = ia64_float_to_chars_bigendian;
4454         }
4455       else
4456         {
4457           ia64_number_to_chars = number_to_chars_littleendian;
4458           ia64_float_to_chars = ia64_float_to_chars_littleendian;
4459         }
4460     }
4461 }
4462
4463 static void
4464 dot_psr (dummy)
4465      int dummy ATTRIBUTE_UNUSED;
4466 {
4467   char *option;
4468   int ch;
4469
4470   while (1)
4471     {
4472       option = input_line_pointer;
4473       ch = get_symbol_end ();
4474       if (strcmp (option, "lsb") == 0)
4475         md.flags &= ~EF_IA_64_BE;
4476       else if (strcmp (option, "msb") == 0)
4477         md.flags |= EF_IA_64_BE;
4478       else if (strcmp (option, "abi32") == 0)
4479         md.flags &= ~EF_IA_64_ABI64;
4480       else if (strcmp (option, "abi64") == 0)
4481         md.flags |= EF_IA_64_ABI64;
4482       else
4483         as_bad ("Unknown psr option `%s'", option);
4484       *input_line_pointer = ch;
4485
4486       SKIP_WHITESPACE ();
4487       if (*input_line_pointer != ',')
4488         break;
4489
4490       ++input_line_pointer;
4491       SKIP_WHITESPACE ();
4492     }
4493   demand_empty_rest_of_line ();
4494 }
4495
4496 static void
4497 dot_ln (dummy)
4498      int dummy ATTRIBUTE_UNUSED;
4499 {
4500   new_logical_line (0, get_absolute_expression ());
4501   demand_empty_rest_of_line ();
4502 }
4503
4504 static char *
4505 parse_section_name ()
4506 {
4507   char *name;
4508   int len;
4509
4510   SKIP_WHITESPACE ();
4511   if (*input_line_pointer != '"')
4512     {
4513       as_bad ("Missing section name");
4514       ignore_rest_of_line ();
4515       return 0;
4516     }
4517   name = demand_copy_C_string (&len);
4518   if (!name)
4519     {
4520       ignore_rest_of_line ();
4521       return 0;
4522     }
4523   SKIP_WHITESPACE ();
4524   if (*input_line_pointer != ',')
4525     {
4526       as_bad ("Comma expected after section name");
4527       ignore_rest_of_line ();
4528       return 0;
4529     }
4530   ++input_line_pointer;         /* skip comma */
4531   return name;
4532 }
4533
4534 static void
4535 dot_xdata (size)
4536      int size;
4537 {
4538   char *name = parse_section_name ();
4539   if (!name)
4540     return;
4541
4542   md.keep_pending_output = 1;
4543   set_section (name);
4544   cons (size);
4545   obj_elf_previous (0);
4546   md.keep_pending_output = 0;
4547 }
4548
4549 /* Why doesn't float_cons() call md_cons_align() the way cons() does?  */
4550
4551 static void
4552 stmt_float_cons (kind)
4553      int kind;
4554 {
4555   size_t alignment;
4556
4557   switch (kind)
4558     {
4559     case 'd':
4560       alignment = 8;
4561       break;
4562
4563     case 'x':
4564     case 'X':
4565       alignment = 16;
4566       break;
4567
4568     case 'f':
4569     default:
4570       alignment = 4;
4571       break;
4572     }
4573   ia64_do_align (alignment);
4574   float_cons (kind);
4575 }
4576
4577 static void
4578 stmt_cons_ua (size)
4579      int size;
4580 {
4581   int saved_auto_align = md.auto_align;
4582
4583   md.auto_align = 0;
4584   cons (size);
4585   md.auto_align = saved_auto_align;
4586 }
4587
4588 static void
4589 dot_xfloat_cons (kind)
4590      int kind;
4591 {
4592   char *name = parse_section_name ();
4593   if (!name)
4594     return;
4595
4596   md.keep_pending_output = 1;
4597   set_section (name);
4598   stmt_float_cons (kind);
4599   obj_elf_previous (0);
4600   md.keep_pending_output = 0;
4601 }
4602
4603 static void
4604 dot_xstringer (zero)
4605      int zero;
4606 {
4607   char *name = parse_section_name ();
4608   if (!name)
4609     return;
4610
4611   md.keep_pending_output = 1;
4612   set_section (name);
4613   stringer (zero);
4614   obj_elf_previous (0);
4615   md.keep_pending_output = 0;
4616 }
4617
4618 static void
4619 dot_xdata_ua (size)
4620      int size;
4621 {
4622   int saved_auto_align = md.auto_align;
4623   char *name = parse_section_name ();
4624   if (!name)
4625     return;
4626
4627   md.keep_pending_output = 1;
4628   set_section (name);
4629   md.auto_align = 0;
4630   cons (size);
4631   md.auto_align = saved_auto_align;
4632   obj_elf_previous (0);
4633   md.keep_pending_output = 0;
4634 }
4635
4636 static void
4637 dot_xfloat_cons_ua (kind)
4638      int kind;
4639 {
4640   int saved_auto_align = md.auto_align;
4641   char *name = parse_section_name ();
4642   if (!name)
4643     return;
4644
4645   md.keep_pending_output = 1;
4646   set_section (name);
4647   md.auto_align = 0;
4648   stmt_float_cons (kind);
4649   md.auto_align = saved_auto_align;
4650   obj_elf_previous (0);
4651   md.keep_pending_output = 0;
4652 }
4653
4654 /* .reg.val <regname>,value */
4655
4656 static void
4657 dot_reg_val (dummy)
4658      int dummy ATTRIBUTE_UNUSED;
4659 {
4660   expressionS reg;
4661
4662   expression (&reg);
4663   if (reg.X_op != O_register)
4664     {
4665       as_bad (_("Register name expected"));
4666       ignore_rest_of_line ();
4667     }
4668   else if (*input_line_pointer++ != ',')
4669     {
4670       as_bad (_("Comma expected"));
4671       ignore_rest_of_line ();
4672     }
4673   else
4674     {
4675       valueT value = get_absolute_expression ();
4676       int regno = reg.X_add_number;
4677       if (regno < REG_GR || regno > REG_GR + 128)
4678         as_warn (_("Register value annotation ignored"));
4679       else
4680         {
4681           gr_values[regno - REG_GR].known = 1;
4682           gr_values[regno - REG_GR].value = value;
4683           gr_values[regno - REG_GR].path = md.path;
4684         }
4685     }
4686   demand_empty_rest_of_line ();
4687 }
4688
4689 /*
4690   .serialize.data
4691   .serialize.instruction
4692  */
4693 static void
4694 dot_serialize (type)
4695      int type;
4696 {
4697   insn_group_break (0, 0, 0);
4698   if (type)
4699     instruction_serialization ();
4700   else
4701     data_serialization ();
4702   insn_group_break (0, 0, 0);
4703   demand_empty_rest_of_line ();
4704 }
4705
4706 /* select dv checking mode
4707    .auto
4708    .explicit
4709    .default
4710
4711    A stop is inserted when changing modes
4712  */
4713
4714 static void
4715 dot_dv_mode (type)
4716      int type;
4717 {
4718   if (md.manual_bundling)
4719     as_warn (_("Directive invalid within a bundle"));
4720
4721   if (type == 'E' || type == 'A')
4722     md.mode_explicitly_set = 0;
4723   else
4724     md.mode_explicitly_set = 1;
4725
4726   md.detect_dv = 1;
4727   switch (type)
4728     {
4729     case 'A':
4730     case 'a':
4731       if (md.explicit_mode)
4732         insn_group_break (1, 0, 0);
4733       md.explicit_mode = 0;
4734       break;
4735     case 'E':
4736     case 'e':
4737       if (!md.explicit_mode)
4738         insn_group_break (1, 0, 0);
4739       md.explicit_mode = 1;
4740       break;
4741     default:
4742     case 'd':
4743       if (md.explicit_mode != md.default_explicit_mode)
4744         insn_group_break (1, 0, 0);
4745       md.explicit_mode = md.default_explicit_mode;
4746       md.mode_explicitly_set = 0;
4747       break;
4748     }
4749 }
4750
4751 static void
4752 print_prmask (mask)
4753      valueT mask;
4754 {
4755   int regno;
4756   char *comma = "";
4757   for (regno = 0; regno < 64; regno++)
4758     {
4759       if (mask & ((valueT) 1 << regno))
4760         {
4761           fprintf (stderr, "%s p%d", comma, regno);
4762           comma = ",";
4763         }
4764     }
4765 }
4766
4767 /*
4768   .pred.rel.clear [p1 [,p2 [,...]]]     (also .pred.rel "clear")
4769   .pred.rel.imply p1, p2                (also .pred.rel "imply")
4770   .pred.rel.mutex p1, p2 [,...]         (also .pred.rel "mutex")
4771   .pred.safe_across_calls p1 [, p2 [,...]]
4772  */
4773
4774 static void
4775 dot_pred_rel (type)
4776      int type;
4777 {
4778   valueT mask = 0;
4779   int count = 0;
4780   int p1 = -1, p2 = -1;
4781
4782   if (type == 0)
4783     {
4784       if (*input_line_pointer != '"')
4785         {
4786           as_bad (_("Missing predicate relation type"));
4787           ignore_rest_of_line ();
4788           return;
4789         }
4790       else
4791         {
4792           int len;
4793           char *form = demand_copy_C_string (&len);
4794           if (strcmp (form, "mutex") == 0)
4795             type = 'm';
4796           else if (strcmp (form, "clear") == 0)
4797             type = 'c';
4798           else if (strcmp (form, "imply") == 0)
4799             type = 'i';
4800           else
4801             {
4802               as_bad (_("Unrecognized predicate relation type"));
4803               ignore_rest_of_line ();
4804               return;
4805             }
4806         }
4807       if (*input_line_pointer == ',')
4808         ++input_line_pointer;
4809       SKIP_WHITESPACE ();
4810     }
4811
4812   SKIP_WHITESPACE ();
4813   while (1)
4814     {
4815       valueT bit = 1;
4816       int regno;
4817
4818       if (TOUPPER (*input_line_pointer) != 'P'
4819           || (regno = atoi (++input_line_pointer)) < 0
4820           || regno > 63)
4821         {
4822           as_bad (_("Predicate register expected"));
4823           ignore_rest_of_line ();
4824           return;
4825         }
4826       while (ISDIGIT (*input_line_pointer))
4827         ++input_line_pointer;
4828       if (p1 == -1)
4829         p1 = regno;
4830       else if (p2 == -1)
4831         p2 = regno;
4832       bit <<= regno;
4833       if (mask & bit)
4834         as_warn (_("Duplicate predicate register ignored"));
4835       mask |= bit;
4836       count++;
4837       /* See if it's a range.  */
4838       if (*input_line_pointer == '-')
4839         {
4840           valueT stop = 1;
4841           ++input_line_pointer;
4842
4843           if (TOUPPER (*input_line_pointer) != 'P'
4844               || (regno = atoi (++input_line_pointer)) < 0
4845               || regno > 63)
4846             {
4847               as_bad (_("Predicate register expected"));
4848               ignore_rest_of_line ();
4849               return;
4850             }
4851           while (ISDIGIT (*input_line_pointer))
4852             ++input_line_pointer;
4853           stop <<= regno;
4854           if (bit >= stop)
4855             {
4856               as_bad (_("Bad register range"));
4857               ignore_rest_of_line ();
4858               return;
4859             }
4860           while (bit < stop)
4861             {
4862               bit <<= 1;
4863               mask |= bit;
4864               count++;
4865             }
4866           SKIP_WHITESPACE ();
4867         }
4868       if (*input_line_pointer != ',')
4869         break;
4870       ++input_line_pointer;
4871       SKIP_WHITESPACE ();
4872     }
4873
4874   switch (type)
4875     {
4876     case 'c':
4877       if (count == 0)
4878         mask = ~(valueT) 0;
4879       clear_qp_mutex (mask);
4880       clear_qp_implies (mask, (valueT) 0);
4881       break;
4882     case 'i':
4883       if (count != 2 || p1 == -1 || p2 == -1)
4884         as_bad (_("Predicate source and target required"));
4885       else if (p1 == 0 || p2 == 0)
4886         as_bad (_("Use of p0 is not valid in this context"));
4887       else
4888         add_qp_imply (p1, p2);
4889       break;
4890     case 'm':
4891       if (count < 2)
4892         {
4893           as_bad (_("At least two PR arguments expected"));
4894           break;
4895         }
4896       else if (mask & 1)
4897         {
4898           as_bad (_("Use of p0 is not valid in this context"));
4899           break;
4900         }
4901       add_qp_mutex (mask);
4902       break;
4903     case 's':
4904       /* note that we don't override any existing relations */
4905       if (count == 0)
4906         {
4907           as_bad (_("At least one PR argument expected"));
4908           break;
4909         }
4910       if (md.debug_dv)
4911         {
4912           fprintf (stderr, "Safe across calls: ");
4913           print_prmask (mask);
4914           fprintf (stderr, "\n");
4915         }
4916       qp_safe_across_calls = mask;
4917       break;
4918     }
4919   demand_empty_rest_of_line ();
4920 }
4921
4922 /* .entry label [, label [, ...]]
4923    Hint to DV code that the given labels are to be considered entry points.
4924    Otherwise, only global labels are considered entry points.  */
4925
4926 static void
4927 dot_entry (dummy)
4928      int dummy ATTRIBUTE_UNUSED;
4929 {
4930   const char *err;
4931   char *name;
4932   int c;
4933   symbolS *symbolP;
4934
4935   do
4936     {
4937       name = input_line_pointer;
4938       c = get_symbol_end ();
4939       symbolP = symbol_find_or_make (name);
4940
4941       err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (PTR) symbolP);
4942       if (err)
4943         as_fatal (_("Inserting \"%s\" into entry hint table failed: %s"),
4944                   name, err);
4945
4946       *input_line_pointer = c;
4947       SKIP_WHITESPACE ();
4948       c = *input_line_pointer;
4949       if (c == ',')
4950         {
4951           input_line_pointer++;
4952           SKIP_WHITESPACE ();
4953           if (*input_line_pointer == '\n')
4954             c = '\n';
4955         }
4956     }
4957   while (c == ',');
4958
4959   demand_empty_rest_of_line ();
4960 }
4961
4962 /* .mem.offset offset, base
4963    "base" is used to distinguish between offsets from a different base.  */
4964
4965 static void
4966 dot_mem_offset (dummy)
4967   int dummy ATTRIBUTE_UNUSED;
4968 {
4969   md.mem_offset.hint = 1;
4970   md.mem_offset.offset = get_absolute_expression ();
4971   if (*input_line_pointer != ',')
4972     {
4973       as_bad (_("Comma expected"));
4974       ignore_rest_of_line ();
4975       return;
4976     }
4977   ++input_line_pointer;
4978   md.mem_offset.base = get_absolute_expression ();
4979   demand_empty_rest_of_line ();
4980 }
4981
4982 /* ia64-specific pseudo-ops:  */
4983 const pseudo_typeS md_pseudo_table[] =
4984   {
4985     { "radix", dot_radix, 0 },
4986     { "lcomm", s_lcomm_bytes, 1 },
4987     { "loc", dot_loc, 0 },
4988     { "bss", dot_special_section, SPECIAL_SECTION_BSS },
4989     { "sbss", dot_special_section, SPECIAL_SECTION_SBSS },
4990     { "sdata", dot_special_section, SPECIAL_SECTION_SDATA },
4991     { "rodata", dot_special_section, SPECIAL_SECTION_RODATA },
4992     { "comment", dot_special_section, SPECIAL_SECTION_COMMENT },
4993     { "ia_64.unwind", dot_special_section, SPECIAL_SECTION_UNWIND },
4994     { "ia_64.unwind_info", dot_special_section, SPECIAL_SECTION_UNWIND_INFO },
4995     { "init_array", dot_special_section, SPECIAL_SECTION_INIT_ARRAY },
4996     { "fini_array", dot_special_section, SPECIAL_SECTION_FINI_ARRAY },
4997     { "proc", dot_proc, 0 },
4998     { "body", dot_body, 0 },
4999     { "prologue", dot_prologue, 0 },
5000     { "endp", dot_endp, 0 },
5001
5002     { "fframe", dot_fframe, 0 },
5003     { "vframe", dot_vframe, 0 },
5004     { "vframesp", dot_vframesp, 0 },
5005     { "vframepsp", dot_vframepsp, 0 },
5006     { "save", dot_save, 0 },
5007     { "restore", dot_restore, 0 },
5008     { "restorereg", dot_restorereg, 0 },
5009     { "restorereg.p", dot_restorereg_p, 0 },
5010     { "handlerdata", dot_handlerdata, 0 },
5011     { "unwentry", dot_unwentry, 0 },
5012     { "altrp", dot_altrp, 0 },
5013     { "savesp", dot_savemem, 0 },
5014     { "savepsp", dot_savemem, 1 },
5015     { "save.g", dot_saveg, 0 },
5016     { "save.f", dot_savef, 0 },
5017     { "save.b", dot_saveb, 0 },
5018     { "save.gf", dot_savegf, 0 },
5019     { "spill", dot_spill, 0 },
5020     { "spillreg", dot_spillreg, 0 },
5021     { "spillsp", dot_spillmem, 0 },
5022     { "spillpsp", dot_spillmem, 1 },
5023     { "spillreg.p", dot_spillreg_p, 0 },
5024     { "spillsp.p", dot_spillmem_p, 0 },
5025     { "spillpsp.p", dot_spillmem_p, 1 },
5026     { "label_state", dot_label_state, 0 },
5027     { "copy_state", dot_copy_state, 0 },
5028     { "unwabi", dot_unwabi, 0 },
5029     { "personality", dot_personality, 0 },
5030 #if 0
5031     { "estate", dot_estate, 0 },
5032 #endif
5033     { "mii", dot_template, 0x0 },
5034     { "mli", dot_template, 0x2 }, /* old format, for compatibility */
5035     { "mlx", dot_template, 0x2 },
5036     { "mmi", dot_template, 0x4 },
5037     { "mfi", dot_template, 0x6 },
5038     { "mmf", dot_template, 0x7 },
5039     { "mib", dot_template, 0x8 },
5040     { "mbb", dot_template, 0x9 },
5041     { "bbb", dot_template, 0xb },
5042     { "mmb", dot_template, 0xc },
5043     { "mfb", dot_template, 0xe },
5044 #if 0
5045     { "lb", dot_scope, 0 },
5046     { "le", dot_scope, 1 },
5047 #endif
5048     { "align", dot_align, 0 },
5049     { "regstk", dot_regstk, 0 },
5050     { "rotr", dot_rot, DYNREG_GR },
5051     { "rotf", dot_rot, DYNREG_FR },
5052     { "rotp", dot_rot, DYNREG_PR },
5053     { "lsb", dot_byteorder, 0 },
5054     { "msb", dot_byteorder, 1 },
5055     { "psr", dot_psr, 0 },
5056     { "alias", dot_alias, 0 },
5057     { "secalias", dot_alias, 1 },
5058     { "ln", dot_ln, 0 },                /* source line info (for debugging) */
5059
5060     { "xdata1", dot_xdata, 1 },
5061     { "xdata2", dot_xdata, 2 },
5062     { "xdata4", dot_xdata, 4 },
5063     { "xdata8", dot_xdata, 8 },
5064     { "xreal4", dot_xfloat_cons, 'f' },
5065     { "xreal8", dot_xfloat_cons, 'd' },
5066     { "xreal10", dot_xfloat_cons, 'x' },
5067     { "xreal16", dot_xfloat_cons, 'X' },
5068     { "xstring", dot_xstringer, 0 },
5069     { "xstringz", dot_xstringer, 1 },
5070
5071     /* unaligned versions:  */
5072     { "xdata2.ua", dot_xdata_ua, 2 },
5073     { "xdata4.ua", dot_xdata_ua, 4 },
5074     { "xdata8.ua", dot_xdata_ua, 8 },
5075     { "xreal4.ua", dot_xfloat_cons_ua, 'f' },
5076     { "xreal8.ua", dot_xfloat_cons_ua, 'd' },
5077     { "xreal10.ua", dot_xfloat_cons_ua, 'x' },
5078     { "xreal16.ua", dot_xfloat_cons_ua, 'X' },
5079
5080     /* annotations/DV checking support */
5081     { "entry", dot_entry, 0 },
5082     { "mem.offset", dot_mem_offset, 0 },
5083     { "pred.rel", dot_pred_rel, 0 },
5084     { "pred.rel.clear", dot_pred_rel, 'c' },
5085     { "pred.rel.imply", dot_pred_rel, 'i' },
5086     { "pred.rel.mutex", dot_pred_rel, 'm' },
5087     { "pred.safe_across_calls", dot_pred_rel, 's' },
5088     { "reg.val", dot_reg_val, 0 },
5089     { "serialize.data", dot_serialize, 0 },
5090     { "serialize.instruction", dot_serialize, 1 },
5091     { "auto", dot_dv_mode, 'a' },
5092     { "explicit", dot_dv_mode, 'e' },
5093     { "default", dot_dv_mode, 'd' },
5094
5095     /* ??? These are needed to make gas/testsuite/gas/elf/ehopt.s work.
5096        IA-64 aligns data allocation pseudo-ops by default, so we have to
5097        tell it that these ones are supposed to be unaligned.  Long term,
5098        should rewrite so that only IA-64 specific data allocation pseudo-ops
5099        are aligned by default.  */
5100     {"2byte", stmt_cons_ua, 2},
5101     {"4byte", stmt_cons_ua, 4},
5102     {"8byte", stmt_cons_ua, 8},
5103
5104     { NULL, 0, 0 }
5105   };
5106
5107 static const struct pseudo_opcode
5108   {
5109     const char *name;
5110     void (*handler) (int);
5111     int arg;
5112   }
5113 pseudo_opcode[] =
5114   {
5115     /* these are more like pseudo-ops, but don't start with a dot */
5116     { "data1", cons, 1 },
5117     { "data2", cons, 2 },
5118     { "data4", cons, 4 },
5119     { "data8", cons, 8 },
5120     { "data16", cons, 16 },
5121     { "real4", stmt_float_cons, 'f' },
5122     { "real8", stmt_float_cons, 'd' },
5123     { "real10", stmt_float_cons, 'x' },
5124     { "real16", stmt_float_cons, 'X' },
5125     { "string", stringer, 0 },
5126     { "stringz", stringer, 1 },
5127
5128     /* unaligned versions:  */
5129     { "data2.ua", stmt_cons_ua, 2 },
5130     { "data4.ua", stmt_cons_ua, 4 },
5131     { "data8.ua", stmt_cons_ua, 8 },
5132     { "data16.ua", stmt_cons_ua, 16 },
5133     { "real4.ua", float_cons, 'f' },
5134     { "real8.ua", float_cons, 'd' },
5135     { "real10.ua", float_cons, 'x' },
5136     { "real16.ua", float_cons, 'X' },
5137   };
5138
5139 /* Declare a register by creating a symbol for it and entering it in
5140    the symbol table.  */
5141
5142 static symbolS *
5143 declare_register (name, regnum)
5144      const char *name;
5145      int regnum;
5146 {
5147   const char *err;
5148   symbolS *sym;
5149
5150   sym = symbol_new (name, reg_section, regnum, &zero_address_frag);
5151
5152   err = hash_insert (md.reg_hash, S_GET_NAME (sym), (PTR) sym);
5153   if (err)
5154     as_fatal ("Inserting \"%s\" into register table failed: %s",
5155               name, err);
5156
5157   return sym;
5158 }
5159
5160 static void
5161 declare_register_set (prefix, num_regs, base_regnum)
5162      const char *prefix;
5163      int num_regs;
5164      int base_regnum;
5165 {
5166   char name[8];
5167   int i;
5168
5169   for (i = 0; i < num_regs; ++i)
5170     {
5171       sprintf (name, "%s%u", prefix, i);
5172       declare_register (name, base_regnum + i);
5173     }
5174 }
5175
5176 static unsigned int
5177 operand_width (opnd)
5178      enum ia64_opnd opnd;
5179 {
5180   const struct ia64_operand *odesc = &elf64_ia64_operands[opnd];
5181   unsigned int bits = 0;
5182   int i;
5183
5184   bits = 0;
5185   for (i = 0; i < NELEMS (odesc->field) && odesc->field[i].bits; ++i)
5186     bits += odesc->field[i].bits;
5187
5188   return bits;
5189 }
5190
5191 static enum operand_match_result
5192 operand_match (idesc, index, e)
5193      const struct ia64_opcode *idesc;
5194      int index;
5195      expressionS *e;
5196 {
5197   enum ia64_opnd opnd = idesc->operands[index];
5198   int bits, relocatable = 0;
5199   struct insn_fix *fix;
5200   bfd_signed_vma val;
5201
5202   switch (opnd)
5203     {
5204       /* constants:  */
5205
5206     case IA64_OPND_AR_CCV:
5207       if (e->X_op == O_register && e->X_add_number == REG_AR + 32)
5208         return OPERAND_MATCH;
5209       break;
5210
5211     case IA64_OPND_AR_CSD:
5212       if (e->X_op == O_register && e->X_add_number == REG_AR + 25)
5213         return OPERAND_MATCH;
5214       break;
5215
5216     case IA64_OPND_AR_PFS:
5217       if (e->X_op == O_register && e->X_add_number == REG_AR + 64)
5218         return OPERAND_MATCH;
5219       break;
5220
5221     case IA64_OPND_GR0:
5222       if (e->X_op == O_register && e->X_add_number == REG_GR + 0)
5223         return OPERAND_MATCH;
5224       break;
5225
5226     case IA64_OPND_IP:
5227       if (e->X_op == O_register && e->X_add_number == REG_IP)
5228         return OPERAND_MATCH;
5229       break;
5230
5231     case IA64_OPND_PR:
5232       if (e->X_op == O_register && e->X_add_number == REG_PR)
5233         return OPERAND_MATCH;
5234       break;
5235
5236     case IA64_OPND_PR_ROT:
5237       if (e->X_op == O_register && e->X_add_number == REG_PR_ROT)
5238         return OPERAND_MATCH;
5239       break;
5240
5241     case IA64_OPND_PSR:
5242       if (e->X_op == O_register && e->X_add_number == REG_PSR)
5243         return OPERAND_MATCH;
5244       break;
5245
5246     case IA64_OPND_PSR_L:
5247       if (e->X_op == O_register && e->X_add_number == REG_PSR_L)
5248         return OPERAND_MATCH;
5249       break;
5250
5251     case IA64_OPND_PSR_UM:
5252       if (e->X_op == O_register && e->X_add_number == REG_PSR_UM)
5253         return OPERAND_MATCH;
5254       break;
5255
5256     case IA64_OPND_C1:
5257       if (e->X_op == O_constant)
5258         {
5259           if (e->X_add_number == 1)
5260             return OPERAND_MATCH;
5261           else
5262             return OPERAND_OUT_OF_RANGE;
5263         }
5264       break;
5265
5266     case IA64_OPND_C8:
5267       if (e->X_op == O_constant)
5268         {
5269           if (e->X_add_number == 8)
5270             return OPERAND_MATCH;
5271           else
5272             return OPERAND_OUT_OF_RANGE;
5273         }
5274       break;
5275
5276     case IA64_OPND_C16:
5277       if (e->X_op == O_constant)
5278         {
5279           if (e->X_add_number == 16)
5280             return OPERAND_MATCH;
5281           else
5282             return OPERAND_OUT_OF_RANGE;
5283         }
5284       break;
5285
5286       /* register operands:  */
5287
5288     case IA64_OPND_AR3:
5289       if (e->X_op == O_register && e->X_add_number >= REG_AR
5290           && e->X_add_number < REG_AR + 128)
5291         return OPERAND_MATCH;
5292       break;
5293
5294     case IA64_OPND_B1:
5295     case IA64_OPND_B2:
5296       if (e->X_op == O_register && e->X_add_number >= REG_BR
5297           && e->X_add_number < REG_BR + 8)
5298         return OPERAND_MATCH;
5299       break;
5300
5301     case IA64_OPND_CR3:
5302       if (e->X_op == O_register && e->X_add_number >= REG_CR
5303           && e->X_add_number < REG_CR + 128)
5304         return OPERAND_MATCH;
5305       break;
5306
5307     case IA64_OPND_F1:
5308     case IA64_OPND_F2:
5309     case IA64_OPND_F3:
5310     case IA64_OPND_F4:
5311       if (e->X_op == O_register && e->X_add_number >= REG_FR
5312           && e->X_add_number < REG_FR + 128)
5313         return OPERAND_MATCH;
5314       break;
5315
5316     case IA64_OPND_P1:
5317     case IA64_OPND_P2:
5318       if (e->X_op == O_register && e->X_add_number >= REG_P
5319           && e->X_add_number < REG_P + 64)
5320         return OPERAND_MATCH;
5321       break;
5322
5323     case IA64_OPND_R1:
5324     case IA64_OPND_R2:
5325     case IA64_OPND_R3:
5326       if (e->X_op == O_register && e->X_add_number >= REG_GR
5327           && e->X_add_number < REG_GR + 128)
5328         return OPERAND_MATCH;
5329       break;
5330
5331     case IA64_OPND_R3_2:
5332       if (e->X_op == O_register && e->X_add_number >= REG_GR)
5333         {
5334           if (e->X_add_number < REG_GR + 4)
5335             return OPERAND_MATCH;
5336           else if (e->X_add_number < REG_GR + 128)
5337             return OPERAND_OUT_OF_RANGE;
5338         }
5339       break;
5340
5341       /* indirect operands:  */
5342     case IA64_OPND_CPUID_R3:
5343     case IA64_OPND_DBR_R3:
5344     case IA64_OPND_DTR_R3:
5345     case IA64_OPND_ITR_R3:
5346     case IA64_OPND_IBR_R3:
5347     case IA64_OPND_MSR_R3:
5348     case IA64_OPND_PKR_R3:
5349     case IA64_OPND_PMC_R3:
5350     case IA64_OPND_PMD_R3:
5351     case IA64_OPND_RR_R3:
5352       if (e->X_op == O_index && e->X_op_symbol
5353           && (S_GET_VALUE (e->X_op_symbol) - IND_CPUID
5354               == opnd - IA64_OPND_CPUID_R3))
5355         return OPERAND_MATCH;
5356       break;
5357
5358     case IA64_OPND_MR3:
5359       if (e->X_op == O_index && !e->X_op_symbol)
5360         return OPERAND_MATCH;
5361       break;
5362
5363       /* immediate operands:  */
5364     case IA64_OPND_CNT2a:
5365     case IA64_OPND_LEN4:
5366     case IA64_OPND_LEN6:
5367       bits = operand_width (idesc->operands[index]);
5368       if (e->X_op == O_constant)
5369         {
5370           if ((bfd_vma) (e->X_add_number - 1) < ((bfd_vma) 1 << bits))
5371             return OPERAND_MATCH;
5372           else
5373             return OPERAND_OUT_OF_RANGE;
5374         }
5375       break;
5376
5377     case IA64_OPND_CNT2b:
5378       if (e->X_op == O_constant)
5379         {
5380           if ((bfd_vma) (e->X_add_number - 1) < 3)
5381             return OPERAND_MATCH;
5382           else
5383             return OPERAND_OUT_OF_RANGE;
5384         }
5385       break;
5386
5387     case IA64_OPND_CNT2c:
5388       val = e->X_add_number;
5389       if (e->X_op == O_constant)
5390         {
5391           if ((val == 0 || val == 7 || val == 15 || val == 16))
5392             return OPERAND_MATCH;
5393           else
5394             return OPERAND_OUT_OF_RANGE;
5395         }
5396       break;
5397
5398     case IA64_OPND_SOR:
5399       /* SOR must be an integer multiple of 8 */
5400       if (e->X_op == O_constant && e->X_add_number & 0x7)
5401         return OPERAND_OUT_OF_RANGE;
5402     case IA64_OPND_SOF:
5403     case IA64_OPND_SOL:
5404       if (e->X_op == O_constant)
5405         {
5406           if ((bfd_vma) e->X_add_number <= 96)
5407             return OPERAND_MATCH;
5408           else
5409             return OPERAND_OUT_OF_RANGE;
5410         }
5411       break;
5412
5413     case IA64_OPND_IMMU62:
5414       if (e->X_op == O_constant)
5415         {
5416           if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << 62))
5417             return OPERAND_MATCH;
5418           else
5419             return OPERAND_OUT_OF_RANGE;
5420         }
5421       else
5422         {
5423           /* FIXME -- need 62-bit relocation type */
5424           as_bad (_("62-bit relocation not yet implemented"));
5425         }
5426       break;
5427
5428     case IA64_OPND_IMMU64:
5429       if (e->X_op == O_symbol || e->X_op == O_pseudo_fixup
5430           || e->X_op == O_subtract)
5431         {
5432           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5433           fix->code = BFD_RELOC_IA64_IMM64;
5434           if (e->X_op != O_subtract)
5435             {
5436               fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5437               if (e->X_op == O_pseudo_fixup)
5438                 e->X_op = O_symbol;
5439             }
5440
5441           fix->opnd = idesc->operands[index];
5442           fix->expr = *e;
5443           fix->is_pcrel = 0;
5444           ++CURR_SLOT.num_fixups;
5445           return OPERAND_MATCH;
5446         }
5447       else if (e->X_op == O_constant)
5448         return OPERAND_MATCH;
5449       break;
5450
5451     case IA64_OPND_CCNT5:
5452     case IA64_OPND_CNT5:
5453     case IA64_OPND_CNT6:
5454     case IA64_OPND_CPOS6a:
5455     case IA64_OPND_CPOS6b:
5456     case IA64_OPND_CPOS6c:
5457     case IA64_OPND_IMMU2:
5458     case IA64_OPND_IMMU7a:
5459     case IA64_OPND_IMMU7b:
5460     case IA64_OPND_IMMU21:
5461     case IA64_OPND_IMMU24:
5462     case IA64_OPND_MBTYPE4:
5463     case IA64_OPND_MHTYPE8:
5464     case IA64_OPND_POS6:
5465       bits = operand_width (idesc->operands[index]);
5466       if (e->X_op == O_constant)
5467         {
5468           if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5469             return OPERAND_MATCH;
5470           else
5471             return OPERAND_OUT_OF_RANGE;
5472         }
5473       break;
5474
5475     case IA64_OPND_IMMU9:
5476       bits = operand_width (idesc->operands[index]);
5477       if (e->X_op == O_constant)
5478         {
5479           if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5480             {
5481               int lobits = e->X_add_number & 0x3;
5482               if (((bfd_vma) e->X_add_number & 0x3C) != 0 && lobits == 0)
5483                 e->X_add_number |= (bfd_vma) 0x3;
5484               return OPERAND_MATCH;
5485             }
5486           else
5487             return OPERAND_OUT_OF_RANGE;
5488         }
5489       break;
5490
5491     case IA64_OPND_IMM44:
5492       /* least 16 bits must be zero */
5493       if ((e->X_add_number & 0xffff) != 0)
5494         /* XXX technically, this is wrong: we should not be issuing warning
5495            messages until we're sure this instruction pattern is going to
5496            be used! */
5497         as_warn (_("lower 16 bits of mask ignored"));
5498
5499       if (e->X_op == O_constant)
5500         {
5501           if (((e->X_add_number >= 0
5502                 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 44))
5503                || (e->X_add_number < 0
5504                    && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 44))))
5505             {
5506               /* sign-extend */
5507               if (e->X_add_number >= 0
5508                   && (e->X_add_number & ((bfd_vma) 1 << 43)) != 0)
5509                 {
5510                   e->X_add_number |= ~(((bfd_vma) 1 << 44) - 1);
5511                 }
5512               return OPERAND_MATCH;
5513             }
5514           else
5515             return OPERAND_OUT_OF_RANGE;
5516         }
5517       break;
5518
5519     case IA64_OPND_IMM17:
5520       /* bit 0 is a don't care (pr0 is hardwired to 1) */
5521       if (e->X_op == O_constant)
5522         {
5523           if (((e->X_add_number >= 0
5524                 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 17))
5525                || (e->X_add_number < 0
5526                    && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 17))))
5527             {
5528               /* sign-extend */
5529               if (e->X_add_number >= 0
5530                   && (e->X_add_number & ((bfd_vma) 1 << 16)) != 0)
5531                 {
5532                   e->X_add_number |= ~(((bfd_vma) 1 << 17) - 1);
5533                 }
5534               return OPERAND_MATCH;
5535             }
5536           else
5537             return OPERAND_OUT_OF_RANGE;
5538         }
5539       break;
5540
5541     case IA64_OPND_IMM14:
5542     case IA64_OPND_IMM22:
5543       relocatable = 1;
5544     case IA64_OPND_IMM1:
5545     case IA64_OPND_IMM8:
5546     case IA64_OPND_IMM8U4:
5547     case IA64_OPND_IMM8M1:
5548     case IA64_OPND_IMM8M1U4:
5549     case IA64_OPND_IMM8M1U8:
5550     case IA64_OPND_IMM9a:
5551     case IA64_OPND_IMM9b:
5552       bits = operand_width (idesc->operands[index]);
5553       if (relocatable && (e->X_op == O_symbol
5554                           || e->X_op == O_subtract
5555                           || e->X_op == O_pseudo_fixup))
5556         {
5557           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5558
5559           if (idesc->operands[index] == IA64_OPND_IMM14)
5560             fix->code = BFD_RELOC_IA64_IMM14;
5561           else
5562             fix->code = BFD_RELOC_IA64_IMM22;
5563
5564           if (e->X_op != O_subtract)
5565             {
5566               fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5567               if (e->X_op == O_pseudo_fixup)
5568                 e->X_op = O_symbol;
5569             }
5570
5571           fix->opnd = idesc->operands[index];
5572           fix->expr = *e;
5573           fix->is_pcrel = 0;
5574           ++CURR_SLOT.num_fixups;
5575           return OPERAND_MATCH;
5576         }
5577       else if (e->X_op != O_constant
5578                && ! (e->X_op == O_big && opnd == IA64_OPND_IMM8M1U8))
5579         return OPERAND_MISMATCH;
5580
5581       if (opnd == IA64_OPND_IMM8M1U4)
5582         {
5583           /* Zero is not valid for unsigned compares that take an adjusted
5584              constant immediate range.  */
5585           if (e->X_add_number == 0)
5586             return OPERAND_OUT_OF_RANGE;
5587
5588           /* Sign-extend 32-bit unsigned numbers, so that the following range
5589              checks will work.  */
5590           val = e->X_add_number;
5591           if (((val & (~(bfd_vma) 0 << 32)) == 0)
5592               && ((val & ((bfd_vma) 1 << 31)) != 0))
5593             val = ((val << 32) >> 32);
5594
5595           /* Check for 0x100000000.  This is valid because
5596              0x100000000-1 is the same as ((uint32_t) -1).  */
5597           if (val == ((bfd_signed_vma) 1 << 32))
5598             return OPERAND_MATCH;
5599
5600           val = val - 1;
5601         }
5602       else if (opnd == IA64_OPND_IMM8M1U8)
5603         {
5604           /* Zero is not valid for unsigned compares that take an adjusted
5605              constant immediate range.  */
5606           if (e->X_add_number == 0)
5607             return OPERAND_OUT_OF_RANGE;
5608
5609           /* Check for 0x10000000000000000.  */
5610           if (e->X_op == O_big)
5611             {
5612               if (generic_bignum[0] == 0
5613                   && generic_bignum[1] == 0
5614                   && generic_bignum[2] == 0
5615                   && generic_bignum[3] == 0
5616                   && generic_bignum[4] == 1)
5617                 return OPERAND_MATCH;
5618               else
5619                 return OPERAND_OUT_OF_RANGE;
5620             }
5621           else
5622             val = e->X_add_number - 1;
5623         }
5624       else if (opnd == IA64_OPND_IMM8M1)
5625         val = e->X_add_number - 1;
5626       else if (opnd == IA64_OPND_IMM8U4)
5627         {
5628           /* Sign-extend 32-bit unsigned numbers, so that the following range
5629              checks will work.  */
5630           val = e->X_add_number;
5631           if (((val & (~(bfd_vma) 0 << 32)) == 0)
5632               && ((val & ((bfd_vma) 1 << 31)) != 0))
5633             val = ((val << 32) >> 32);
5634         }
5635       else
5636         val = e->X_add_number;
5637
5638       if ((val >= 0 && (bfd_vma) val < ((bfd_vma) 1 << (bits - 1)))
5639           || (val < 0 && (bfd_vma) -val <= ((bfd_vma) 1 << (bits - 1))))
5640         return OPERAND_MATCH;
5641       else
5642         return OPERAND_OUT_OF_RANGE;
5643
5644     case IA64_OPND_INC3:
5645       /* +/- 1, 4, 8, 16 */
5646       val = e->X_add_number;
5647       if (val < 0)
5648         val = -val;
5649       if (e->X_op == O_constant)
5650         {
5651           if ((val == 1 || val == 4 || val == 8 || val == 16))
5652             return OPERAND_MATCH;
5653           else
5654             return OPERAND_OUT_OF_RANGE;
5655         }
5656       break;
5657
5658     case IA64_OPND_TGT25:
5659     case IA64_OPND_TGT25b:
5660     case IA64_OPND_TGT25c:
5661     case IA64_OPND_TGT64:
5662       if (e->X_op == O_symbol)
5663         {
5664           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5665           if (opnd == IA64_OPND_TGT25)
5666             fix->code = BFD_RELOC_IA64_PCREL21F;
5667           else if (opnd == IA64_OPND_TGT25b)
5668             fix->code = BFD_RELOC_IA64_PCREL21M;
5669           else if (opnd == IA64_OPND_TGT25c)
5670             fix->code = BFD_RELOC_IA64_PCREL21B;
5671           else if (opnd == IA64_OPND_TGT64)
5672             fix->code = BFD_RELOC_IA64_PCREL60B;
5673           else
5674             abort ();
5675
5676           fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5677           fix->opnd = idesc->operands[index];
5678           fix->expr = *e;
5679           fix->is_pcrel = 1;
5680           ++CURR_SLOT.num_fixups;
5681           return OPERAND_MATCH;
5682         }
5683     case IA64_OPND_TAG13:
5684     case IA64_OPND_TAG13b:
5685       switch (e->X_op)
5686         {
5687         case O_constant:
5688           return OPERAND_MATCH;
5689
5690         case O_symbol:
5691           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5692           /* There are no external relocs for TAG13/TAG13b fields, so we
5693              create a dummy reloc.  This will not live past md_apply_fix3.  */
5694           fix->code = BFD_RELOC_UNUSED;
5695           fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5696           fix->opnd = idesc->operands[index];
5697           fix->expr = *e;
5698           fix->is_pcrel = 1;
5699           ++CURR_SLOT.num_fixups;
5700           return OPERAND_MATCH;
5701
5702         default:
5703           break;
5704         }
5705       break;
5706
5707     case IA64_OPND_LDXMOV:
5708       fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5709       fix->code = BFD_RELOC_IA64_LDXMOV;
5710       fix->opnd = idesc->operands[index];
5711       fix->expr = *e;
5712       fix->is_pcrel = 0;
5713       ++CURR_SLOT.num_fixups;
5714       return OPERAND_MATCH;
5715
5716     default:
5717       break;
5718     }
5719   return OPERAND_MISMATCH;
5720 }
5721
5722 static int
5723 parse_operand (e)
5724      expressionS *e;
5725 {
5726   int sep = '\0';
5727
5728   memset (e, 0, sizeof (*e));
5729   e->X_op = O_absent;
5730   SKIP_WHITESPACE ();
5731   if (*input_line_pointer != '}')
5732     expression (e);
5733   sep = *input_line_pointer++;
5734
5735   if (sep == '}')
5736     {
5737       if (!md.manual_bundling)
5738         as_warn ("Found '}' when manual bundling is off");
5739       else
5740         CURR_SLOT.manual_bundling_off = 1;
5741       md.manual_bundling = 0;
5742       sep = '\0';
5743     }
5744   return sep;
5745 }
5746
5747 /* Returns the next entry in the opcode table that matches the one in
5748    IDESC, and frees the entry in IDESC.  If no matching entry is
5749    found, NULL is returned instead.  */
5750
5751 static struct ia64_opcode *
5752 get_next_opcode (struct ia64_opcode *idesc)
5753 {
5754   struct ia64_opcode *next = ia64_find_next_opcode (idesc);
5755   ia64_free_opcode (idesc);
5756   return next;
5757 }
5758
5759 /* Parse the operands for the opcode and find the opcode variant that
5760    matches the specified operands, or NULL if no match is possible.  */
5761
5762 static struct ia64_opcode *
5763 parse_operands (idesc)
5764      struct ia64_opcode *idesc;
5765 {
5766   int i = 0, highest_unmatched_operand, num_operands = 0, num_outputs = 0;
5767   int error_pos, out_of_range_pos, curr_out_of_range_pos, sep = 0;
5768   enum ia64_opnd expected_operand = IA64_OPND_NIL;
5769   enum operand_match_result result;
5770   char mnemonic[129];
5771   char *first_arg = 0, *end, *saved_input_pointer;
5772   unsigned int sof;
5773
5774   assert (strlen (idesc->name) <= 128);
5775
5776   strcpy (mnemonic, idesc->name);
5777   if (idesc->operands[2] == IA64_OPND_SOF)
5778     {
5779       /* To make the common idiom "alloc loc?=ar.pfs,0,1,0,0" work, we
5780          can't parse the first operand until we have parsed the
5781          remaining operands of the "alloc" instruction.  */
5782       SKIP_WHITESPACE ();
5783       first_arg = input_line_pointer;
5784       end = strchr (input_line_pointer, '=');
5785       if (!end)
5786         {
5787           as_bad ("Expected separator `='");
5788           return 0;
5789         }
5790       input_line_pointer = end + 1;
5791       ++i;
5792       ++num_outputs;
5793     }
5794
5795   for (; i < NELEMS (CURR_SLOT.opnd); ++i)
5796     {
5797       sep = parse_operand (CURR_SLOT.opnd + i);
5798       if (CURR_SLOT.opnd[i].X_op == O_absent)
5799         break;
5800
5801       ++num_operands;
5802
5803       if (sep != '=' && sep != ',')
5804         break;
5805
5806       if (sep == '=')
5807         {
5808           if (num_outputs > 0)
5809             as_bad ("Duplicate equal sign (=) in instruction");
5810           else
5811             num_outputs = i + 1;
5812         }
5813     }
5814   if (sep != '\0')
5815     {
5816       as_bad ("Illegal operand separator `%c'", sep);
5817       return 0;
5818     }
5819
5820   if (idesc->operands[2] == IA64_OPND_SOF)
5821     {
5822       /* map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r */
5823       know (strcmp (idesc->name, "alloc") == 0);
5824       if (num_operands == 5 /* first_arg not included in this count! */
5825           && CURR_SLOT.opnd[2].X_op == O_constant
5826           && CURR_SLOT.opnd[3].X_op == O_constant
5827           && CURR_SLOT.opnd[4].X_op == O_constant
5828           && CURR_SLOT.opnd[5].X_op == O_constant)
5829         {
5830           sof = set_regstack (CURR_SLOT.opnd[2].X_add_number,
5831                               CURR_SLOT.opnd[3].X_add_number,
5832                               CURR_SLOT.opnd[4].X_add_number,
5833                               CURR_SLOT.opnd[5].X_add_number);
5834
5835           /* now we can parse the first arg:  */
5836           saved_input_pointer = input_line_pointer;
5837           input_line_pointer = first_arg;
5838           sep = parse_operand (CURR_SLOT.opnd + 0);
5839           if (sep != '=')
5840             --num_outputs;      /* force error */
5841           input_line_pointer = saved_input_pointer;
5842
5843           CURR_SLOT.opnd[2].X_add_number = sof;
5844           CURR_SLOT.opnd[3].X_add_number
5845             = sof - CURR_SLOT.opnd[4].X_add_number;
5846           CURR_SLOT.opnd[4] = CURR_SLOT.opnd[5];
5847         }
5848     }
5849
5850   highest_unmatched_operand = 0;
5851   curr_out_of_range_pos = -1;
5852   error_pos = 0;
5853   expected_operand = idesc->operands[0];
5854   for (; idesc; idesc = get_next_opcode (idesc))
5855     {
5856       if (num_outputs != idesc->num_outputs)
5857         continue;               /* mismatch in # of outputs */
5858
5859       CURR_SLOT.num_fixups = 0;
5860
5861       /* Try to match all operands.  If we see an out-of-range operand,
5862          then continue trying to match the rest of the operands, since if
5863          the rest match, then this idesc will give the best error message.  */
5864
5865       out_of_range_pos = -1;
5866       for (i = 0; i < num_operands && idesc->operands[i]; ++i)
5867         {
5868           result = operand_match (idesc, i, CURR_SLOT.opnd + i);
5869           if (result != OPERAND_MATCH)
5870             {
5871               if (result != OPERAND_OUT_OF_RANGE)
5872                 break;
5873               if (out_of_range_pos < 0)
5874                 /* remember position of the first out-of-range operand: */
5875                 out_of_range_pos = i;
5876             }
5877         }
5878
5879       /* If we did not match all operands, or if at least one operand was
5880          out-of-range, then this idesc does not match.  Keep track of which
5881          idesc matched the most operands before failing.  If we have two
5882          idescs that failed at the same position, and one had an out-of-range
5883          operand, then prefer the out-of-range operand.  Thus if we have
5884          "add r0=0x1000000,r1" we get an error saying the constant is out
5885          of range instead of an error saying that the constant should have been
5886          a register.  */
5887
5888       if (i != num_operands || out_of_range_pos >= 0)
5889         {
5890           if (i > highest_unmatched_operand
5891               || (i == highest_unmatched_operand
5892                   && out_of_range_pos > curr_out_of_range_pos))
5893             {
5894               highest_unmatched_operand = i;
5895               if (out_of_range_pos >= 0)
5896                 {
5897                   expected_operand = idesc->operands[out_of_range_pos];
5898                   error_pos = out_of_range_pos;
5899                 }
5900               else
5901                 {
5902                   expected_operand = idesc->operands[i];
5903                   error_pos = i;
5904                 }
5905               curr_out_of_range_pos = out_of_range_pos;
5906             }
5907           continue;
5908         }
5909
5910       if (num_operands < NELEMS (idesc->operands)
5911           && idesc->operands[num_operands])
5912         continue;               /* mismatch in number of arguments */
5913
5914       break;
5915     }
5916   if (!idesc)
5917     {
5918       if (expected_operand)
5919         as_bad ("Operand %u of `%s' should be %s",
5920                 error_pos + 1, mnemonic,
5921                 elf64_ia64_operands[expected_operand].desc);
5922       else
5923         as_bad ("Operand mismatch");
5924       return 0;
5925     }
5926   return idesc;
5927 }
5928
5929 /* Keep track of state necessary to determine whether a NOP is necessary
5930    to avoid an erratum in A and B step Itanium chips, and return 1 if we
5931    detect a case where additional NOPs may be necessary.  */
5932 static int
5933 errata_nop_necessary_p (slot, insn_unit)
5934      struct slot *slot;
5935      enum ia64_unit insn_unit;
5936 {
5937   int i;
5938   struct group *this_group = md.last_groups + md.group_idx;
5939   struct group *prev_group = md.last_groups + (md.group_idx + 2) % 3;
5940   struct ia64_opcode *idesc = slot->idesc;
5941
5942   /* Test whether this could be the first insn in a problematic sequence.  */
5943   if (insn_unit == IA64_UNIT_F)
5944     {
5945       for (i = 0; i < idesc->num_outputs; i++)
5946         if (idesc->operands[i] == IA64_OPND_P1
5947             || idesc->operands[i] == IA64_OPND_P2)
5948           {
5949             int regno = slot->opnd[i].X_add_number - REG_P;
5950             /* Ignore invalid operands; they generate errors elsewhere.  */
5951             if (regno >= 64)
5952               return 0;
5953             this_group->p_reg_set[regno] = 1;
5954           }
5955     }
5956
5957   /* Test whether this could be the second insn in a problematic sequence.  */
5958   if (insn_unit == IA64_UNIT_M && slot->qp_regno > 0
5959       && prev_group->p_reg_set[slot->qp_regno])
5960     {
5961       for (i = 0; i < idesc->num_outputs; i++)
5962         if (idesc->operands[i] == IA64_OPND_R1
5963             || idesc->operands[i] == IA64_OPND_R2
5964             || idesc->operands[i] == IA64_OPND_R3)
5965           {
5966             int regno = slot->opnd[i].X_add_number - REG_GR;
5967             /* Ignore invalid operands; they generate errors elsewhere.  */
5968             if (regno >= 128)
5969               return 0;
5970             if (strncmp (idesc->name, "add", 3) != 0
5971                 && strncmp (idesc->name, "sub", 3) != 0
5972                 && strncmp (idesc->name, "shladd", 6) != 0
5973                 && (idesc->flags & IA64_OPCODE_POSTINC) == 0)
5974               this_group->g_reg_set_conditionally[regno] = 1;
5975           }
5976     }
5977
5978   /* Test whether this could be the third insn in a problematic sequence.  */
5979   for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; i++)
5980     {
5981       if (/* For fc, ptc, ptr, tak, thash, tpa, ttag, probe, ptr, ptc.  */
5982           idesc->operands[i] == IA64_OPND_R3
5983           /* For mov indirect.  */
5984           || idesc->operands[i] == IA64_OPND_RR_R3
5985           || idesc->operands[i] == IA64_OPND_DBR_R3
5986           || idesc->operands[i] == IA64_OPND_IBR_R3
5987           || idesc->operands[i] == IA64_OPND_PKR_R3
5988           || idesc->operands[i] == IA64_OPND_PMC_R3
5989           || idesc->operands[i] == IA64_OPND_PMD_R3
5990           || idesc->operands[i] == IA64_OPND_MSR_R3
5991           || idesc->operands[i] == IA64_OPND_CPUID_R3
5992           /* For itr.  */
5993           || idesc->operands[i] == IA64_OPND_ITR_R3
5994           || idesc->operands[i] == IA64_OPND_DTR_R3
5995           /* Normal memory addresses (load, store, xchg, cmpxchg, etc.).  */
5996           || idesc->operands[i] == IA64_OPND_MR3)
5997         {
5998           int regno = slot->opnd[i].X_add_number - REG_GR;
5999           /* Ignore invalid operands; they generate errors elsewhere.  */
6000           if (regno >= 128)
6001             return 0;
6002           if (idesc->operands[i] == IA64_OPND_R3)
6003             {
6004               if (strcmp (idesc->name, "fc") != 0
6005                   && strcmp (idesc->name, "tak") != 0
6006                   && strcmp (idesc->name, "thash") != 0
6007                   && strcmp (idesc->name, "tpa") != 0
6008                   && strcmp (idesc->name, "ttag") != 0
6009                   && strncmp (idesc->name, "ptr", 3) != 0
6010                   && strncmp (idesc->name, "ptc", 3) != 0
6011                   && strncmp (idesc->name, "probe", 5) != 0)
6012                 return 0;
6013             }
6014           if (prev_group->g_reg_set_conditionally[regno])
6015             return 1;
6016         }
6017     }
6018   return 0;
6019 }
6020
6021 static void
6022 build_insn (slot, insnp)
6023      struct slot *slot;
6024      bfd_vma *insnp;
6025 {
6026   const struct ia64_operand *odesc, *o2desc;
6027   struct ia64_opcode *idesc = slot->idesc;
6028   bfd_signed_vma insn, val;
6029   const char *err;
6030   int i;
6031
6032   insn = idesc->opcode | slot->qp_regno;
6033
6034   for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; ++i)
6035     {
6036       if (slot->opnd[i].X_op == O_register
6037           || slot->opnd[i].X_op == O_constant
6038           || slot->opnd[i].X_op == O_index)
6039         val = slot->opnd[i].X_add_number;
6040       else if (slot->opnd[i].X_op == O_big)
6041         {
6042           /* This must be the value 0x10000000000000000.  */
6043           assert (idesc->operands[i] == IA64_OPND_IMM8M1U8);
6044           val = 0;
6045         }
6046       else
6047         val = 0;
6048
6049       switch (idesc->operands[i])
6050         {
6051         case IA64_OPND_IMMU64:
6052           *insnp++ = (val >> 22) & 0x1ffffffffffLL;
6053           insn |= (((val & 0x7f) << 13) | (((val >> 7) & 0x1ff) << 27)
6054                    | (((val >> 16) & 0x1f) << 22) | (((val >> 21) & 0x1) << 21)
6055                    | (((val >> 63) & 0x1) << 36));
6056           continue;
6057
6058         case IA64_OPND_IMMU62:
6059           val &= 0x3fffffffffffffffULL;
6060           if (val != slot->opnd[i].X_add_number)
6061             as_warn (_("Value truncated to 62 bits"));
6062           *insnp++ = (val >> 21) & 0x1ffffffffffLL;
6063           insn |= (((val & 0xfffff) << 6) | (((val >> 20) & 0x1) << 36));
6064           continue;
6065
6066         case IA64_OPND_TGT64:
6067           val >>= 4;
6068           *insnp++ = ((val >> 20) & 0x7fffffffffLL) << 2;
6069           insn |= ((((val >> 59) & 0x1) << 36)
6070                    | (((val >> 0) & 0xfffff) << 13));
6071           continue;
6072
6073         case IA64_OPND_AR3:
6074           val -= REG_AR;
6075           break;
6076
6077         case IA64_OPND_B1:
6078         case IA64_OPND_B2:
6079           val -= REG_BR;
6080           break;
6081
6082         case IA64_OPND_CR3:
6083           val -= REG_CR;
6084           break;
6085
6086         case IA64_OPND_F1:
6087         case IA64_OPND_F2:
6088         case IA64_OPND_F3:
6089         case IA64_OPND_F4:
6090           val -= REG_FR;
6091           break;
6092
6093         case IA64_OPND_P1:
6094         case IA64_OPND_P2:
6095           val -= REG_P;
6096           break;
6097
6098         case IA64_OPND_R1:
6099         case IA64_OPND_R2:
6100         case IA64_OPND_R3:
6101         case IA64_OPND_R3_2:
6102         case IA64_OPND_CPUID_R3:
6103         case IA64_OPND_DBR_R3:
6104         case IA64_OPND_DTR_R3:
6105         case IA64_OPND_ITR_R3:
6106         case IA64_OPND_IBR_R3:
6107         case IA64_OPND_MR3:
6108         case IA64_OPND_MSR_R3:
6109         case IA64_OPND_PKR_R3:
6110         case IA64_OPND_PMC_R3:
6111         case IA64_OPND_PMD_R3:
6112         case IA64_OPND_RR_R3:
6113           val -= REG_GR;
6114           break;
6115
6116         default:
6117           break;
6118         }
6119
6120       odesc = elf64_ia64_operands + idesc->operands[i];
6121       err = (*odesc->insert) (odesc, val, &insn);
6122       if (err)
6123         as_bad_where (slot->src_file, slot->src_line,
6124                       "Bad operand value: %s", err);
6125       if (idesc->flags & IA64_OPCODE_PSEUDO)
6126         {
6127           if ((idesc->flags & IA64_OPCODE_F2_EQ_F3)
6128               && odesc == elf64_ia64_operands + IA64_OPND_F3)
6129             {
6130               o2desc = elf64_ia64_operands + IA64_OPND_F2;
6131               (*o2desc->insert) (o2desc, val, &insn);
6132             }
6133           if ((idesc->flags & IA64_OPCODE_LEN_EQ_64MCNT)
6134               && (odesc == elf64_ia64_operands + IA64_OPND_CPOS6a
6135                   || odesc == elf64_ia64_operands + IA64_OPND_POS6))
6136             {
6137               o2desc = elf64_ia64_operands + IA64_OPND_LEN6;
6138               (*o2desc->insert) (o2desc, 64 - val, &insn);
6139             }
6140         }
6141     }
6142   *insnp = insn;
6143 }
6144
6145 static void
6146 emit_one_bundle ()
6147 {
6148   unsigned int manual_bundling_on = 0, manual_bundling_off = 0;
6149   unsigned int manual_bundling = 0;
6150   enum ia64_unit required_unit, insn_unit = 0;
6151   enum ia64_insn_type type[3], insn_type;
6152   unsigned int template, orig_template;
6153   bfd_vma insn[3] = { -1, -1, -1 };
6154   struct ia64_opcode *idesc;
6155   int end_of_insn_group = 0, user_template = -1;
6156   int n, i, j, first, curr;
6157   unw_rec_list *ptr, *last_ptr, *end_ptr;
6158   bfd_vma t0 = 0, t1 = 0;
6159   struct label_fix *lfix;
6160   struct insn_fix *ifix;
6161   char mnemonic[16];
6162   fixS *fix;
6163   char *f;
6164   int addr_mod;
6165
6166   first = (md.curr_slot + NUM_SLOTS - md.num_slots_in_use) % NUM_SLOTS;
6167   know (first >= 0 & first < NUM_SLOTS);
6168   n = MIN (3, md.num_slots_in_use);
6169
6170   /* Determine template: user user_template if specified, best match
6171      otherwise:  */
6172
6173   if (md.slot[first].user_template >= 0)
6174     user_template = template = md.slot[first].user_template;
6175   else
6176     {
6177       /* Auto select appropriate template.  */
6178       memset (type, 0, sizeof (type));
6179       curr = first;
6180       for (i = 0; i < n; ++i)
6181         {
6182           if (md.slot[curr].label_fixups && i != 0)
6183             break;
6184           type[i] = md.slot[curr].idesc->type;
6185           curr = (curr + 1) % NUM_SLOTS;
6186         }
6187       template = best_template[type[0]][type[1]][type[2]];
6188     }
6189
6190   /* initialize instructions with appropriate nops:  */
6191   for (i = 0; i < 3; ++i)
6192     insn[i] = nop[ia64_templ_desc[template].exec_unit[i]];
6193
6194   f = frag_more (16);
6195
6196   /* Check to see if this bundle is at an offset that is a multiple of 16-bytes
6197      from the start of the frag.  */
6198   addr_mod = frag_now_fix () & 15;
6199   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
6200     as_bad (_("instruction address is not a multiple of 16"));
6201   frag_now->insn_addr = addr_mod;
6202   frag_now->has_code = 1;
6203
6204   /* now fill in slots with as many insns as possible:  */
6205   curr = first;
6206   idesc = md.slot[curr].idesc;
6207   end_of_insn_group = 0;
6208   for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
6209     {
6210       /* If we have unwind records, we may need to update some now.  */
6211       ptr = md.slot[curr].unwind_record;
6212       if (ptr)
6213         {
6214           /* Find the last prologue/body record in the list for the current
6215              insn, and set the slot number for all records up to that point.
6216              This needs to be done now, because prologue/body records refer to
6217              the current point, not the point after the instruction has been
6218              issued.  This matters because there may have been nops emitted
6219              meanwhile.  Any non-prologue non-body record followed by a
6220              prologue/body record must also refer to the current point.  */
6221           last_ptr = NULL;
6222           end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6223           for (; ptr != end_ptr; ptr = ptr->next)
6224             if (ptr->r.type == prologue || ptr->r.type == prologue_gr
6225                 || ptr->r.type == body)
6226               last_ptr = ptr;
6227           if (last_ptr)
6228             {
6229               /* Make last_ptr point one after the last prologue/body
6230                  record.  */
6231               last_ptr = last_ptr->next;
6232               for (ptr = md.slot[curr].unwind_record; ptr != last_ptr;
6233                    ptr = ptr->next)
6234                 {
6235                   ptr->slot_number = (unsigned long) f + i;
6236                   ptr->slot_frag = frag_now;
6237                 }
6238               /* Remove the initialized records, so that we won't accidentally
6239                  update them again if we insert a nop and continue.  */
6240               md.slot[curr].unwind_record = last_ptr;
6241             }
6242         }
6243
6244       if (idesc->flags & IA64_OPCODE_SLOT2)
6245         {
6246           if (manual_bundling && i != 2)
6247             as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6248                           "`%s' must be last in bundle", idesc->name);
6249           else
6250             i = 2;
6251         }
6252       if (idesc->flags & IA64_OPCODE_LAST)
6253         {
6254           int required_slot;
6255           unsigned int required_template;
6256
6257           /* If we need a stop bit after an M slot, our only choice is
6258              template 5 (M;;MI).  If we need a stop bit after a B
6259              slot, our only choice is to place it at the end of the
6260              bundle, because the only available templates are MIB,
6261              MBB, BBB, MMB, and MFB.  We don't handle anything other
6262              than M and B slots because these are the only kind of
6263              instructions that can have the IA64_OPCODE_LAST bit set.  */
6264           required_template = template;
6265           switch (idesc->type)
6266             {
6267             case IA64_TYPE_M:
6268               required_slot = 0;
6269               required_template = 5;
6270               break;
6271
6272             case IA64_TYPE_B:
6273               required_slot = 2;
6274               break;
6275
6276             default:
6277               as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6278                             "Internal error: don't know how to force %s to end"
6279                             "of instruction group", idesc->name);
6280               required_slot = i;
6281               break;
6282             }
6283           if (manual_bundling && i != required_slot)
6284             as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6285                           "`%s' must be last in instruction group",
6286                           idesc->name);
6287           if (required_slot < i)
6288             /* Can't fit this instruction.  */
6289             break;
6290
6291           i = required_slot;
6292           if (required_template != template)
6293             {
6294               /* If we switch the template, we need to reset the NOPs
6295                  after slot i.  The slot-types of the instructions ahead
6296                  of i never change, so we don't need to worry about
6297                  changing NOPs in front of this slot.  */
6298               for (j = i; j < 3; ++j)
6299                 insn[j] = nop[ia64_templ_desc[required_template].exec_unit[j]];
6300             }
6301           template = required_template;
6302         }
6303       if (curr != first && md.slot[curr].label_fixups)
6304         {
6305           if (manual_bundling_on)
6306             as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6307                           "Label must be first in a bundle");
6308           /* This insn must go into the first slot of a bundle.  */
6309           break;
6310         }
6311
6312       manual_bundling_on = md.slot[curr].manual_bundling_on;
6313       manual_bundling_off = md.slot[curr].manual_bundling_off;
6314
6315       if (manual_bundling_on)
6316         {
6317           if (curr == first)
6318             manual_bundling = 1;
6319           else
6320             break;                      /* need to start a new bundle */
6321         }
6322
6323       if (end_of_insn_group && md.num_slots_in_use >= 1)
6324         {
6325           /* We need an instruction group boundary in the middle of a
6326              bundle.  See if we can switch to an other template with
6327              an appropriate boundary.  */
6328
6329           orig_template = template;
6330           if (i == 1 && (user_template == 4
6331                          || (user_template < 0
6332                              && (ia64_templ_desc[template].exec_unit[0]
6333                                  == IA64_UNIT_M))))
6334             {
6335               template = 5;
6336               end_of_insn_group = 0;
6337             }
6338           else if (i == 2 && (user_template == 0
6339                               || (user_template < 0
6340                                   && (ia64_templ_desc[template].exec_unit[1]
6341                                       == IA64_UNIT_I)))
6342                    /* This test makes sure we don't switch the template if
6343                       the next instruction is one that needs to be first in
6344                       an instruction group.  Since all those instructions are
6345                       in the M group, there is no way such an instruction can
6346                       fit in this bundle even if we switch the template.  The
6347                       reason we have to check for this is that otherwise we
6348                       may end up generating "MI;;I M.." which has the deadly
6349                       effect that the second M instruction is no longer the
6350                       first in the bundle! --davidm 99/12/16  */
6351                    && (idesc->flags & IA64_OPCODE_FIRST) == 0)
6352             {
6353               template = 1;
6354               end_of_insn_group = 0;
6355             }
6356           else if (curr != first)
6357             /* can't fit this insn */
6358             break;
6359
6360           if (template != orig_template)
6361             /* if we switch the template, we need to reset the NOPs
6362                after slot i.  The slot-types of the instructions ahead
6363                of i never change, so we don't need to worry about
6364                changing NOPs in front of this slot.  */
6365             for (j = i; j < 3; ++j)
6366               insn[j] = nop[ia64_templ_desc[template].exec_unit[j]];
6367         }
6368       required_unit = ia64_templ_desc[template].exec_unit[i];
6369
6370       /* resolve dynamic opcodes such as "break", "hint", and "nop":  */
6371       if (idesc->type == IA64_TYPE_DYN)
6372         {
6373           if ((strcmp (idesc->name, "nop") == 0)
6374               || (strcmp (idesc->name, "hint") == 0)
6375               || (strcmp (idesc->name, "break") == 0))
6376             insn_unit = required_unit;
6377           else if (strcmp (idesc->name, "chk.s") == 0)
6378             {
6379               insn_unit = IA64_UNIT_M;
6380               if (required_unit == IA64_UNIT_I)
6381                 insn_unit = IA64_UNIT_I;
6382             }
6383           else
6384             as_fatal ("emit_one_bundle: unexpected dynamic op");
6385
6386           sprintf (mnemonic, "%s.%c", idesc->name, "?imbf??"[insn_unit]);
6387           ia64_free_opcode (idesc);
6388           md.slot[curr].idesc = idesc = ia64_find_opcode (mnemonic);
6389 #if 0
6390           know (!idesc->next);  /* no resolved dynamic ops have collisions */
6391 #endif
6392         }
6393       else
6394         {
6395           insn_type = idesc->type;
6396           insn_unit = IA64_UNIT_NIL;
6397           switch (insn_type)
6398             {
6399             case IA64_TYPE_A:
6400               if (required_unit == IA64_UNIT_I || required_unit == IA64_UNIT_M)
6401                 insn_unit = required_unit;
6402               break;
6403             case IA64_TYPE_X: insn_unit = IA64_UNIT_L; break;
6404             case IA64_TYPE_I: insn_unit = IA64_UNIT_I; break;
6405             case IA64_TYPE_M: insn_unit = IA64_UNIT_M; break;
6406             case IA64_TYPE_B: insn_unit = IA64_UNIT_B; break;
6407             case IA64_TYPE_F: insn_unit = IA64_UNIT_F; break;
6408             default:                                   break;
6409             }
6410         }
6411
6412       if (insn_unit != required_unit)
6413         {
6414           if (required_unit == IA64_UNIT_L
6415               && insn_unit == IA64_UNIT_I
6416               && !(idesc->flags & IA64_OPCODE_X_IN_MLX))
6417             {
6418               /* we got ourselves an MLX template but the current
6419                  instruction isn't an X-unit, or an I-unit instruction
6420                  that can go into the X slot of an MLX template.  Duh.  */
6421               if (md.num_slots_in_use >= NUM_SLOTS)
6422                 {
6423                   as_bad_where (md.slot[curr].src_file,
6424                                 md.slot[curr].src_line,
6425                                 "`%s' can't go in X slot of "
6426                                 "MLX template", idesc->name);
6427                   /* drop this insn so we don't livelock:  */
6428                   --md.num_slots_in_use;
6429                 }
6430               break;
6431             }
6432           continue;             /* try next slot */
6433         }
6434
6435       if (debug_type == DEBUG_DWARF2 || md.slot[curr].loc_directive_seen)
6436         {
6437           bfd_vma addr = frag_now->fr_address + frag_now_fix () - 16 + i;
6438
6439           md.slot[curr].loc_directive_seen = 0;
6440           dwarf2_gen_line_info (addr, &md.slot[curr].debug_line);
6441         }
6442
6443       if (errata_nop_necessary_p (md.slot + curr, insn_unit))
6444         as_warn (_("Additional NOP may be necessary to workaround Itanium processor A/B step errata"));
6445
6446       build_insn (md.slot + curr, insn + i);
6447
6448       ptr = md.slot[curr].unwind_record;
6449       if (ptr)
6450         {
6451           /* Set slot numbers for all remaining unwind records belonging to the
6452              current insn.  There can not be any prologue/body unwind records
6453              here.  */
6454           end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6455           for (; ptr != end_ptr; ptr = ptr->next)
6456             {
6457               ptr->slot_number = (unsigned long) f + i;
6458               ptr->slot_frag = frag_now;
6459             }
6460           md.slot[curr].unwind_record = NULL;
6461         }
6462
6463       if (required_unit == IA64_UNIT_L)
6464         {
6465           know (i == 1);
6466           /* skip one slot for long/X-unit instructions */
6467           ++i;
6468         }
6469       --md.num_slots_in_use;
6470
6471       /* now is a good time to fix up the labels for this insn:  */
6472       for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next)
6473         {
6474           S_SET_VALUE (lfix->sym, frag_now_fix () - 16);
6475           symbol_set_frag (lfix->sym, frag_now);
6476         }
6477       /* and fix up the tags also.  */
6478       for (lfix = md.slot[curr].tag_fixups; lfix; lfix = lfix->next)
6479         {
6480           S_SET_VALUE (lfix->sym, frag_now_fix () - 16 + i);
6481           symbol_set_frag (lfix->sym, frag_now);
6482         }
6483
6484       for (j = 0; j < md.slot[curr].num_fixups; ++j)
6485         {
6486           ifix = md.slot[curr].fixup + j;
6487           fix = fix_new_exp (frag_now, frag_now_fix () - 16 + i, 8,
6488                              &ifix->expr, ifix->is_pcrel, ifix->code);
6489           fix->tc_fix_data.opnd = ifix->opnd;
6490           fix->fx_plt = (fix->fx_r_type == BFD_RELOC_IA64_PLTOFF22);
6491           fix->fx_file = md.slot[curr].src_file;
6492           fix->fx_line = md.slot[curr].src_line;
6493         }
6494
6495       end_of_insn_group = md.slot[curr].end_of_insn_group;
6496
6497       if (end_of_insn_group)
6498         {
6499           md.group_idx = (md.group_idx + 1) % 3;
6500           memset (md.last_groups + md.group_idx, 0, sizeof md.last_groups[0]);
6501         }
6502
6503       /* clear slot:  */
6504       ia64_free_opcode (md.slot[curr].idesc);
6505       memset (md.slot + curr, 0, sizeof (md.slot[curr]));
6506       md.slot[curr].user_template = -1;
6507
6508       if (manual_bundling_off)
6509         {
6510           manual_bundling = 0;
6511           break;
6512         }
6513       curr = (curr + 1) % NUM_SLOTS;
6514       idesc = md.slot[curr].idesc;
6515     }
6516   if (manual_bundling)
6517     {
6518       if (md.num_slots_in_use > 0)
6519         {
6520           as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6521                         "`%s' does not fit into %s template",
6522                         idesc->name, ia64_templ_desc[template].name);
6523           --md.num_slots_in_use;
6524         }
6525       else
6526         as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6527                       "Missing '}' at end of file");
6528     }
6529   know (md.num_slots_in_use < NUM_SLOTS);
6530
6531   t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
6532   t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
6533
6534   number_to_chars_littleendian (f + 0, t0, 8);
6535   number_to_chars_littleendian (f + 8, t1, 8);
6536
6537   if (unwind.list)
6538     {
6539       unwind.list->next_slot_number = (unsigned long) f + 16;
6540       unwind.list->next_slot_frag = frag_now;
6541     }
6542 }
6543
6544 int
6545 md_parse_option (c, arg)
6546      int c;
6547      char *arg;
6548 {
6549
6550   switch (c)
6551     {
6552     /* Switches from the Intel assembler.  */
6553     case 'm':
6554       if (strcmp (arg, "ilp64") == 0
6555           || strcmp (arg, "lp64") == 0
6556           || strcmp (arg, "p64") == 0)
6557         {
6558           md.flags |= EF_IA_64_ABI64;
6559         }
6560       else if (strcmp (arg, "ilp32") == 0)
6561         {
6562           md.flags &= ~EF_IA_64_ABI64;
6563         }
6564       else if (strcmp (arg, "le") == 0)
6565         {
6566           md.flags &= ~EF_IA_64_BE;
6567           default_big_endian = 0;
6568         }
6569       else if (strcmp (arg, "be") == 0)
6570         {
6571           md.flags |= EF_IA_64_BE;
6572           default_big_endian = 1;
6573         }
6574       else
6575         return 0;
6576       break;
6577
6578     case 'N':
6579       if (strcmp (arg, "so") == 0)
6580         {
6581           /* Suppress signon message.  */
6582         }
6583       else if (strcmp (arg, "pi") == 0)
6584         {
6585           /* Reject privileged instructions.  FIXME */
6586         }
6587       else if (strcmp (arg, "us") == 0)
6588         {
6589           /* Allow union of signed and unsigned range.  FIXME */
6590         }
6591       else if (strcmp (arg, "close_fcalls") == 0)
6592         {
6593           /* Do not resolve global function calls.  */
6594         }
6595       else
6596         return 0;
6597       break;
6598
6599     case 'C':
6600       /* temp[="prefix"]  Insert temporary labels into the object file
6601                           symbol table prefixed by "prefix".
6602                           Default prefix is ":temp:".
6603        */
6604       break;
6605
6606     case 'a':
6607       /* indirect=<tgt> Assume unannotated indirect branches behavior
6608                         according to <tgt> --
6609                         exit:   branch out from the current context (default)
6610                         labels: all labels in context may be branch targets
6611        */
6612       if (strncmp (arg, "indirect=", 9) != 0)
6613         return 0;
6614       break;
6615
6616     case 'x':
6617       /* -X conflicts with an ignored option, use -x instead */
6618       md.detect_dv = 1;
6619       if (!arg || strcmp (arg, "explicit") == 0)
6620         {
6621           /* set default mode to explicit */
6622           md.default_explicit_mode = 1;
6623           break;
6624         }
6625       else if (strcmp (arg, "auto") == 0)
6626         {
6627           md.default_explicit_mode = 0;
6628         }
6629       else if (strcmp (arg, "debug") == 0)
6630         {
6631           md.debug_dv = 1;
6632         }
6633       else if (strcmp (arg, "debugx") == 0)
6634         {
6635           md.default_explicit_mode = 1;
6636           md.debug_dv = 1;
6637         }
6638       else
6639         {
6640           as_bad (_("Unrecognized option '-x%s'"), arg);
6641         }
6642       break;
6643
6644     case 'S':
6645       /* nops           Print nops statistics.  */
6646       break;
6647
6648     /* GNU specific switches for gcc.  */
6649     case OPTION_MCONSTANT_GP:
6650       md.flags |= EF_IA_64_CONS_GP;
6651       break;
6652
6653     case OPTION_MAUTO_PIC:
6654       md.flags |= EF_IA_64_NOFUNCDESC_CONS_GP;
6655       break;
6656
6657     default:
6658       return 0;
6659     }
6660
6661   return 1;
6662 }
6663
6664 void
6665 md_show_usage (stream)
6666      FILE *stream;
6667 {
6668   fputs (_("\
6669 IA-64 options:\n\
6670   --mconstant-gp          mark output file as using the constant-GP model\n\
6671                           (sets ELF header flag EF_IA_64_CONS_GP)\n\
6672   --mauto-pic             mark output file as using the constant-GP model\n\
6673                           without function descriptors (sets ELF header flag\n\
6674                           EF_IA_64_NOFUNCDESC_CONS_GP)\n\
6675   -milp32|-milp64|-mlp64|-mp64  select data model (default -mlp64)\n\
6676   -mle | -mbe             select little- or big-endian byte order (default -mle)\n\
6677   -x | -xexplicit         turn on dependency violation checking (default)\n\
6678   -xauto                  automagically remove dependency violations\n\
6679   -xdebug                 debug dependency violation checker\n"),
6680         stream);
6681 }
6682
6683 void
6684 ia64_after_parse_args ()
6685 {
6686   if (debug_type == DEBUG_STABS)
6687     as_fatal (_("--gstabs is not supported for ia64"));
6688 }
6689
6690 /* Return true if TYPE fits in TEMPL at SLOT.  */
6691
6692 static int
6693 match (int templ, int type, int slot)
6694 {
6695   enum ia64_unit unit;
6696   int result;
6697
6698   unit = ia64_templ_desc[templ].exec_unit[slot];
6699   switch (type)
6700     {
6701     case IA64_TYPE_DYN: result = 1; break; /* for nop and break */
6702     case IA64_TYPE_A:
6703       result = (unit == IA64_UNIT_I || unit == IA64_UNIT_M);
6704       break;
6705     case IA64_TYPE_X:   result = (unit == IA64_UNIT_L); break;
6706     case IA64_TYPE_I:   result = (unit == IA64_UNIT_I); break;
6707     case IA64_TYPE_M:   result = (unit == IA64_UNIT_M); break;
6708     case IA64_TYPE_B:   result = (unit == IA64_UNIT_B); break;
6709     case IA64_TYPE_F:   result = (unit == IA64_UNIT_F); break;
6710     default:            result = 0; break;
6711     }
6712   return result;
6713 }
6714
6715 /* Add a bit of extra goodness if a nop of type F or B would fit
6716    in TEMPL at SLOT.  */
6717
6718 static inline int
6719 extra_goodness (int templ, int slot)
6720 {
6721   if (slot == 1 && match (templ, IA64_TYPE_F, slot))
6722     return 2;
6723   if (slot == 2 && match (templ, IA64_TYPE_B, slot))
6724     return 1;
6725   return 0;
6726 }
6727
6728 /* This function is called once, at assembler startup time.  It sets
6729    up all the tables, etc. that the MD part of the assembler will need
6730    that can be determined before arguments are parsed.  */
6731 void
6732 md_begin ()
6733 {
6734   int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum, ok;
6735   const char *err;
6736   char name[8];
6737
6738   md.auto_align = 1;
6739   md.explicit_mode = md.default_explicit_mode;
6740
6741   bfd_set_section_alignment (stdoutput, text_section, 4);
6742
6743   /* Make sure function pointers get initialized.  */
6744   target_big_endian = -1;
6745   dot_byteorder (default_big_endian);
6746
6747   alias_hash = hash_new ();
6748   alias_name_hash = hash_new ();
6749   secalias_hash = hash_new ();
6750   secalias_name_hash = hash_new ();
6751
6752   pseudo_func[FUNC_DTP_MODULE].u.sym =
6753     symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
6754                 &zero_address_frag);
6755
6756   pseudo_func[FUNC_DTP_RELATIVE].u.sym =
6757     symbol_new (".<dtprel>", undefined_section, FUNC_DTP_RELATIVE,
6758                 &zero_address_frag);
6759
6760   pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
6761     symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
6762                 &zero_address_frag);
6763
6764   pseudo_func[FUNC_GP_RELATIVE].u.sym =
6765     symbol_new (".<gprel>", undefined_section, FUNC_GP_RELATIVE,
6766                 &zero_address_frag);
6767
6768   pseudo_func[FUNC_LT_RELATIVE].u.sym =
6769     symbol_new (".<ltoff>", undefined_section, FUNC_LT_RELATIVE,
6770                 &zero_address_frag);
6771
6772   pseudo_func[FUNC_LT_RELATIVE_X].u.sym =
6773     symbol_new (".<ltoffx>", undefined_section, FUNC_LT_RELATIVE_X,
6774                 &zero_address_frag);
6775
6776   pseudo_func[FUNC_PC_RELATIVE].u.sym =
6777     symbol_new (".<pcrel>", undefined_section, FUNC_PC_RELATIVE,
6778                 &zero_address_frag);
6779
6780   pseudo_func[FUNC_PLT_RELATIVE].u.sym =
6781     symbol_new (".<pltoff>", undefined_section, FUNC_PLT_RELATIVE,
6782                 &zero_address_frag);
6783
6784   pseudo_func[FUNC_SEC_RELATIVE].u.sym =
6785     symbol_new (".<secrel>", undefined_section, FUNC_SEC_RELATIVE,
6786                 &zero_address_frag);
6787
6788   pseudo_func[FUNC_SEG_RELATIVE].u.sym =
6789     symbol_new (".<segrel>", undefined_section, FUNC_SEG_RELATIVE,
6790                 &zero_address_frag);
6791
6792   pseudo_func[FUNC_TP_RELATIVE].u.sym =
6793     symbol_new (".<tprel>", undefined_section, FUNC_TP_RELATIVE,
6794                 &zero_address_frag);
6795
6796   pseudo_func[FUNC_LTV_RELATIVE].u.sym =
6797     symbol_new (".<ltv>", undefined_section, FUNC_LTV_RELATIVE,
6798                 &zero_address_frag);
6799
6800   pseudo_func[FUNC_LT_FPTR_RELATIVE].u.sym =
6801     symbol_new (".<ltoff.fptr>", undefined_section, FUNC_LT_FPTR_RELATIVE,
6802                 &zero_address_frag);
6803
6804   pseudo_func[FUNC_LT_DTP_MODULE].u.sym =
6805     symbol_new (".<ltoff.dtpmod>", undefined_section, FUNC_LT_DTP_MODULE,
6806                 &zero_address_frag);
6807
6808   pseudo_func[FUNC_LT_DTP_RELATIVE].u.sym =
6809     symbol_new (".<ltoff.dptrel>", undefined_section, FUNC_LT_DTP_RELATIVE,
6810                 &zero_address_frag);
6811
6812   pseudo_func[FUNC_LT_TP_RELATIVE].u.sym =
6813     symbol_new (".<ltoff.tprel>", undefined_section, FUNC_LT_TP_RELATIVE,
6814                 &zero_address_frag);
6815
6816   pseudo_func[FUNC_IPLT_RELOC].u.sym =
6817     symbol_new (".<iplt>", undefined_section, FUNC_IPLT_RELOC,
6818                 &zero_address_frag);
6819
6820   /* Compute the table of best templates.  We compute goodness as a
6821      base 4 value, in which each match counts for 3, each F counts
6822      for 2, each B counts for 1.  This should maximize the number of
6823      F and B nops in the chosen bundles, which is good because these
6824      pipelines are least likely to be overcommitted.  */
6825   for (i = 0; i < IA64_NUM_TYPES; ++i)
6826     for (j = 0; j < IA64_NUM_TYPES; ++j)
6827       for (k = 0; k < IA64_NUM_TYPES; ++k)
6828         {
6829           best = 0;
6830           for (t = 0; t < NELEMS (ia64_templ_desc); ++t)
6831             {
6832               goodness = 0;
6833               if (match (t, i, 0))
6834                 {
6835                   if (match (t, j, 1))
6836                     {
6837                       if (match (t, k, 2))
6838                         goodness = 3 + 3 + 3;
6839                       else
6840                         goodness = 3 + 3 + extra_goodness (t, 2);
6841                     }
6842                   else if (match (t, j, 2))
6843                     goodness = 3 + 3 + extra_goodness (t, 1);
6844                   else
6845                     {
6846                       goodness = 3;
6847                       goodness += extra_goodness (t, 1);
6848                       goodness += extra_goodness (t, 2);
6849                     }
6850                 }
6851               else if (match (t, i, 1))
6852                 {
6853                   if (match (t, j, 2))
6854                     goodness = 3 + 3;
6855                   else
6856                     goodness = 3 + extra_goodness (t, 2);
6857                 }
6858               else if (match (t, i, 2))
6859                 goodness = 3 + extra_goodness (t, 1);
6860
6861               if (goodness > best)
6862                 {
6863                   best = goodness;
6864                   best_template[i][j][k] = t;
6865                 }
6866             }
6867         }
6868
6869   for (i = 0; i < NUM_SLOTS; ++i)
6870     md.slot[i].user_template = -1;
6871
6872   md.pseudo_hash = hash_new ();
6873   for (i = 0; i < NELEMS (pseudo_opcode); ++i)
6874     {
6875       err = hash_insert (md.pseudo_hash, pseudo_opcode[i].name,
6876                          (void *) (pseudo_opcode + i));
6877       if (err)
6878         as_fatal ("ia64.md_begin: can't hash `%s': %s",
6879                   pseudo_opcode[i].name, err);
6880     }
6881
6882   md.reg_hash = hash_new ();
6883   md.dynreg_hash = hash_new ();
6884   md.const_hash = hash_new ();
6885   md.entry_hash = hash_new ();
6886
6887   /* general registers:  */
6888
6889   total = 128;
6890   for (i = 0; i < total; ++i)
6891     {
6892       sprintf (name, "r%d", i - REG_GR);
6893       md.regsym[i] = declare_register (name, i);
6894     }
6895
6896   /* floating point registers:  */
6897   total += 128;
6898   for (; i < total; ++i)
6899     {
6900       sprintf (name, "f%d", i - REG_FR);
6901       md.regsym[i] = declare_register (name, i);
6902     }
6903
6904   /* application registers:  */
6905   total += 128;
6906   ar_base = i;
6907   for (; i < total; ++i)
6908     {
6909       sprintf (name, "ar%d", i - REG_AR);
6910       md.regsym[i] = declare_register (name, i);
6911     }
6912
6913   /* control registers:  */
6914   total += 128;
6915   cr_base = i;
6916   for (; i < total; ++i)
6917     {
6918       sprintf (name, "cr%d", i - REG_CR);
6919       md.regsym[i] = declare_register (name, i);
6920     }
6921
6922   /* predicate registers:  */
6923   total += 64;
6924   for (; i < total; ++i)
6925     {
6926       sprintf (name, "p%d", i - REG_P);
6927       md.regsym[i] = declare_register (name, i);
6928     }
6929
6930   /* branch registers:  */
6931   total += 8;
6932   for (; i < total; ++i)
6933     {
6934       sprintf (name, "b%d", i - REG_BR);
6935       md.regsym[i] = declare_register (name, i);
6936     }
6937
6938   md.regsym[REG_IP] = declare_register ("ip", REG_IP);
6939   md.regsym[REG_CFM] = declare_register ("cfm", REG_CFM);
6940   md.regsym[REG_PR] = declare_register ("pr", REG_PR);
6941   md.regsym[REG_PR_ROT] = declare_register ("pr.rot", REG_PR_ROT);
6942   md.regsym[REG_PSR] = declare_register ("psr", REG_PSR);
6943   md.regsym[REG_PSR_L] = declare_register ("psr.l", REG_PSR_L);
6944   md.regsym[REG_PSR_UM] = declare_register ("psr.um", REG_PSR_UM);
6945
6946   for (i = 0; i < NELEMS (indirect_reg); ++i)
6947     {
6948       regnum = indirect_reg[i].regnum;
6949       md.regsym[regnum] = declare_register (indirect_reg[i].name, regnum);
6950     }
6951
6952   /* define synonyms for application registers:  */
6953   for (i = REG_AR; i < REG_AR + NELEMS (ar); ++i)
6954     md.regsym[i] = declare_register (ar[i - REG_AR].name,
6955                                      REG_AR + ar[i - REG_AR].regnum);
6956
6957   /* define synonyms for control registers:  */
6958   for (i = REG_CR; i < REG_CR + NELEMS (cr); ++i)
6959     md.regsym[i] = declare_register (cr[i - REG_CR].name,
6960                                      REG_CR + cr[i - REG_CR].regnum);
6961
6962   declare_register ("gp", REG_GR +  1);
6963   declare_register ("sp", REG_GR + 12);
6964   declare_register ("rp", REG_BR +  0);
6965
6966   /* pseudo-registers used to specify unwind info:  */
6967   declare_register ("psp", REG_PSP);
6968
6969   declare_register_set ("ret", 4, REG_GR + 8);
6970   declare_register_set ("farg", 8, REG_FR + 8);
6971   declare_register_set ("fret", 8, REG_FR + 8);
6972
6973   for (i = 0; i < NELEMS (const_bits); ++i)
6974     {
6975       err = hash_insert (md.const_hash, const_bits[i].name,
6976                          (PTR) (const_bits + i));
6977       if (err)
6978         as_fatal ("Inserting \"%s\" into constant hash table failed: %s",
6979                   name, err);
6980     }
6981
6982   /* Set the architecture and machine depending on defaults and command line
6983      options.  */
6984   if (md.flags & EF_IA_64_ABI64)
6985     ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf64);
6986   else
6987     ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf32);
6988
6989   if (! ok)
6990      as_warn (_("Could not set architecture and machine"));
6991
6992   /* Set the pointer size and pointer shift size depending on md.flags */
6993
6994   if (md.flags & EF_IA_64_ABI64)
6995     {
6996       md.pointer_size = 8;         /* pointers are 8 bytes */
6997       md.pointer_size_shift = 3;   /* alignment is 8 bytes = 2^2 */
6998     }
6999   else
7000     {
7001       md.pointer_size = 4;         /* pointers are 4 bytes */
7002       md.pointer_size_shift = 2;   /* alignment is 4 bytes = 2^2 */
7003     }
7004
7005   md.mem_offset.hint = 0;
7006   md.path = 0;
7007   md.maxpaths = 0;
7008   md.entry_labels = NULL;
7009 }
7010
7011 /* Set the elf type to 64 bit ABI by default.  Cannot do this in md_begin
7012    because that is called after md_parse_option which is where we do the
7013    dynamic changing of md.flags based on -mlp64 or -milp32.  Also, set the
7014    default endianness.  */
7015
7016 void
7017 ia64_init (argc, argv)
7018      int argc ATTRIBUTE_UNUSED;
7019      char **argv ATTRIBUTE_UNUSED;
7020 {
7021   md.flags = MD_FLAGS_DEFAULT;
7022 }
7023
7024 /* Return a string for the target object file format.  */
7025
7026 const char *
7027 ia64_target_format ()
7028 {
7029   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
7030     {
7031       if (md.flags & EF_IA_64_BE)
7032         {
7033           if (md.flags & EF_IA_64_ABI64)
7034 #if defined(TE_AIX50)
7035             return "elf64-ia64-aix-big";
7036 #elif defined(TE_HPUX)
7037             return "elf64-ia64-hpux-big";
7038 #else
7039             return "elf64-ia64-big";
7040 #endif
7041           else
7042 #if defined(TE_AIX50)
7043             return "elf32-ia64-aix-big";
7044 #elif defined(TE_HPUX)
7045             return "elf32-ia64-hpux-big";
7046 #else
7047             return "elf32-ia64-big";
7048 #endif
7049         }
7050       else
7051         {
7052           if (md.flags & EF_IA_64_ABI64)
7053 #ifdef TE_AIX50
7054             return "elf64-ia64-aix-little";
7055 #else
7056             return "elf64-ia64-little";
7057 #endif
7058           else
7059 #ifdef TE_AIX50
7060             return "elf32-ia64-aix-little";
7061 #else
7062             return "elf32-ia64-little";
7063 #endif
7064         }
7065     }
7066   else
7067     return "unknown-format";
7068 }
7069
7070 void
7071 ia64_end_of_source ()
7072 {
7073   /* terminate insn group upon reaching end of file:  */
7074   insn_group_break (1, 0, 0);
7075
7076   /* emits slots we haven't written yet:  */
7077   ia64_flush_insns ();
7078
7079   bfd_set_private_flags (stdoutput, md.flags);
7080
7081   md.mem_offset.hint = 0;
7082 }
7083
7084 void
7085 ia64_start_line ()
7086 {
7087   if (md.qp.X_op == O_register)
7088     as_bad ("qualifying predicate not followed by instruction");
7089   md.qp.X_op = O_absent;
7090
7091   if (ignore_input ())
7092     return;
7093
7094   if (input_line_pointer[0] == ';' && input_line_pointer[-1] == ';')
7095     {
7096       if (md.detect_dv && !md.explicit_mode)
7097         as_warn (_("Explicit stops are ignored in auto mode"));
7098       else
7099         insn_group_break (1, 0, 0);
7100     }
7101 }
7102
7103 /* This is a hook for ia64_frob_label, so that it can distinguish tags from
7104    labels.  */
7105 static int defining_tag = 0;
7106
7107 int
7108 ia64_unrecognized_line (ch)
7109      int ch;
7110 {
7111   switch (ch)
7112     {
7113     case '(':
7114       expression (&md.qp);
7115       if (*input_line_pointer++ != ')')
7116         {
7117           as_bad ("Expected ')'");
7118           return 0;
7119         }
7120       if (md.qp.X_op != O_register)
7121         {
7122           as_bad ("Qualifying predicate expected");
7123           return 0;
7124         }
7125       if (md.qp.X_add_number < REG_P || md.qp.X_add_number >= REG_P + 64)
7126         {
7127           as_bad ("Predicate register expected");
7128           return 0;
7129         }
7130       return 1;
7131
7132     case '{':
7133       if (md.manual_bundling)
7134         as_warn ("Found '{' when manual bundling is already turned on");
7135       else
7136         CURR_SLOT.manual_bundling_on = 1;
7137       md.manual_bundling = 1;
7138
7139       /* Bundling is only acceptable in explicit mode
7140          or when in default automatic mode.  */
7141       if (md.detect_dv && !md.explicit_mode)
7142         {
7143           if (!md.mode_explicitly_set
7144               && !md.default_explicit_mode)
7145             dot_dv_mode ('E');
7146           else
7147             as_warn (_("Found '{' after explicit switch to automatic mode"));
7148         }
7149       return 1;
7150
7151     case '}':
7152       if (!md.manual_bundling)
7153         as_warn ("Found '}' when manual bundling is off");
7154       else
7155         PREV_SLOT.manual_bundling_off = 1;
7156       md.manual_bundling = 0;
7157
7158       /* switch back to automatic mode, if applicable */
7159       if (md.detect_dv
7160           && md.explicit_mode
7161           && !md.mode_explicitly_set
7162           && !md.default_explicit_mode)
7163         dot_dv_mode ('A');
7164
7165       /* Allow '{' to follow on the same line.  We also allow ";;", but that
7166          happens automatically because ';' is an end of line marker.  */
7167       SKIP_WHITESPACE ();
7168       if (input_line_pointer[0] == '{')
7169         {
7170           input_line_pointer++;
7171           return ia64_unrecognized_line ('{');
7172         }
7173
7174       demand_empty_rest_of_line ();
7175       return 1;
7176
7177     case '[':
7178       {
7179         char *s;
7180         char c;
7181         symbolS *tag;
7182         int temp;
7183
7184         if (md.qp.X_op == O_register)
7185           {
7186             as_bad ("Tag must come before qualifying predicate.");
7187             return 0;
7188           }
7189
7190         /* This implements just enough of read_a_source_file in read.c to
7191            recognize labels.  */
7192         if (is_name_beginner (*input_line_pointer))
7193           {
7194             s = input_line_pointer;
7195             c = get_symbol_end ();
7196           }
7197         else if (LOCAL_LABELS_FB
7198                  && ISDIGIT (*input_line_pointer))
7199           {
7200             temp = 0;
7201             while (ISDIGIT (*input_line_pointer))
7202               temp = (temp * 10) + *input_line_pointer++ - '0';
7203             fb_label_instance_inc (temp);
7204             s = fb_label_name (temp, 0);
7205             c = *input_line_pointer;
7206           }
7207         else
7208           {
7209             s = NULL;
7210             c = '\0';
7211           }
7212         if (c != ':')
7213           {
7214             /* Put ':' back for error messages' sake.  */
7215             *input_line_pointer++ = ':';
7216             as_bad ("Expected ':'");
7217             return 0;
7218           }
7219
7220         defining_tag = 1;
7221         tag = colon (s);
7222         defining_tag = 0;
7223         /* Put ':' back for error messages' sake.  */
7224         *input_line_pointer++ = ':';
7225         if (*input_line_pointer++ != ']')
7226           {
7227             as_bad ("Expected ']'");
7228             return 0;
7229           }
7230         if (! tag)
7231           {
7232             as_bad ("Tag name expected");
7233             return 0;
7234           }
7235         return 1;
7236       }
7237
7238     default:
7239       break;
7240     }
7241
7242   /* Not a valid line.  */
7243   return 0;
7244 }
7245
7246 void
7247 ia64_frob_label (sym)
7248      struct symbol *sym;
7249 {
7250   struct label_fix *fix;
7251
7252   /* Tags need special handling since they are not bundle breaks like
7253      labels.  */
7254   if (defining_tag)
7255     {
7256       fix = obstack_alloc (&notes, sizeof (*fix));
7257       fix->sym = sym;
7258       fix->next = CURR_SLOT.tag_fixups;
7259       CURR_SLOT.tag_fixups = fix;
7260
7261       return;
7262     }
7263
7264   if (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7265     {
7266       md.last_text_seg = now_seg;
7267       fix = obstack_alloc (&notes, sizeof (*fix));
7268       fix->sym = sym;
7269       fix->next = CURR_SLOT.label_fixups;
7270       CURR_SLOT.label_fixups = fix;
7271
7272       /* Keep track of how many code entry points we've seen.  */
7273       if (md.path == md.maxpaths)
7274         {
7275           md.maxpaths += 20;
7276           md.entry_labels = (const char **)
7277             xrealloc ((void *) md.entry_labels,
7278                       md.maxpaths * sizeof (char *));
7279         }
7280       md.entry_labels[md.path++] = S_GET_NAME (sym);
7281     }
7282 }
7283
7284 #ifdef TE_HPUX
7285 /* The HP-UX linker will give unresolved symbol errors for symbols
7286    that are declared but unused.  This routine removes declared,
7287    unused symbols from an object.  */
7288 int
7289 ia64_frob_symbol (sym)
7290      struct symbol *sym;
7291 {
7292   if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym) &&
7293        ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT)
7294       || (S_GET_SEGMENT (sym) == &bfd_abs_section
7295           && ! S_IS_EXTERNAL (sym)))
7296     return 1;
7297   return 0;
7298 }
7299 #endif
7300
7301 void
7302 ia64_flush_pending_output ()
7303 {
7304   if (!md.keep_pending_output
7305       && bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7306     {
7307       /* ??? This causes many unnecessary stop bits to be emitted.
7308          Unfortunately, it isn't clear if it is safe to remove this.  */
7309       insn_group_break (1, 0, 0);
7310       ia64_flush_insns ();
7311     }
7312 }
7313
7314 /* Do ia64-specific expression optimization.  All that's done here is
7315    to transform index expressions that are either due to the indexing
7316    of rotating registers or due to the indexing of indirect register
7317    sets.  */
7318 int
7319 ia64_optimize_expr (l, op, r)
7320      expressionS *l;
7321      operatorT op;
7322      expressionS *r;
7323 {
7324   unsigned num_regs;
7325
7326   if (op == O_index)
7327     {
7328       if (l->X_op == O_register && r->X_op == O_constant)
7329         {
7330           num_regs = (l->X_add_number >> 16);
7331           if ((unsigned) r->X_add_number >= num_regs)
7332             {
7333               if (!num_regs)
7334                 as_bad ("No current frame");
7335               else
7336                 as_bad ("Index out of range 0..%u", num_regs - 1);
7337               r->X_add_number = 0;
7338             }
7339           l->X_add_number = (l->X_add_number & 0xffff) + r->X_add_number;
7340           return 1;
7341         }
7342       else if (l->X_op == O_register && r->X_op == O_register)
7343         {
7344           if (l->X_add_number < IND_CPUID || l->X_add_number > IND_RR
7345               || l->X_add_number == IND_MEM)
7346             {
7347               as_bad ("Indirect register set name expected");
7348               l->X_add_number = IND_CPUID;
7349             }
7350           l->X_op = O_index;
7351           l->X_op_symbol = md.regsym[l->X_add_number];
7352           l->X_add_number = r->X_add_number;
7353           return 1;
7354         }
7355     }
7356   return 0;
7357 }
7358
7359 int
7360 ia64_parse_name (name, e)
7361      char *name;
7362      expressionS *e;
7363 {
7364   struct const_desc *cdesc;
7365   struct dynreg *dr = 0;
7366   unsigned int regnum;
7367   struct symbol *sym;
7368   char *end;
7369
7370   /* first see if NAME is a known register name:  */
7371   sym = hash_find (md.reg_hash, name);
7372   if (sym)
7373     {
7374       e->X_op = O_register;
7375       e->X_add_number = S_GET_VALUE (sym);
7376       return 1;
7377     }
7378
7379   cdesc = hash_find (md.const_hash, name);
7380   if (cdesc)
7381     {
7382       e->X_op = O_constant;
7383       e->X_add_number = cdesc->value;
7384       return 1;
7385     }
7386
7387   /* check for inN, locN, or outN:  */
7388   switch (name[0])
7389     {
7390     case 'i':
7391       if (name[1] == 'n' && ISDIGIT (name[2]))
7392         {
7393           dr = &md.in;
7394           name += 2;
7395         }
7396       break;
7397
7398     case 'l':
7399       if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
7400         {
7401           dr = &md.loc;
7402           name += 3;
7403         }
7404       break;
7405
7406     case 'o':
7407       if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
7408         {
7409           dr = &md.out;
7410           name += 3;
7411         }
7412       break;
7413
7414     default:
7415       break;
7416     }
7417
7418   if (dr)
7419     {
7420       /* The name is inN, locN, or outN; parse the register number.  */
7421       regnum = strtoul (name, &end, 10);
7422       if (end > name && *end == '\0')
7423         {
7424           if ((unsigned) regnum >= dr->num_regs)
7425             {
7426               if (!dr->num_regs)
7427                 as_bad ("No current frame");
7428               else
7429                 as_bad ("Register number out of range 0..%u",
7430                         dr->num_regs - 1);
7431               regnum = 0;
7432             }
7433           e->X_op = O_register;
7434           e->X_add_number = dr->base + regnum;
7435           return 1;
7436         }
7437     }
7438
7439   if ((dr = hash_find (md.dynreg_hash, name)))
7440     {
7441       /* We've got ourselves the name of a rotating register set.
7442          Store the base register number in the low 16 bits of
7443          X_add_number and the size of the register set in the top 16
7444          bits.  */
7445       e->X_op = O_register;
7446       e->X_add_number = dr->base | (dr->num_regs << 16);
7447       return 1;
7448     }
7449   return 0;
7450 }
7451
7452 /* Remove the '#' suffix that indicates a symbol as opposed to a register.  */
7453
7454 char *
7455 ia64_canonicalize_symbol_name (name)
7456      char *name;
7457 {
7458   size_t len = strlen (name);
7459   if (len > 1 && name[len - 1] == '#')
7460     name[len - 1] = '\0';
7461   return name;
7462 }
7463
7464 /* Return true if idesc is a conditional branch instruction.  This excludes
7465    the modulo scheduled branches, and br.ia.  Mod-sched branches are excluded
7466    because they always read/write resources regardless of the value of the
7467    qualifying predicate.  br.ia must always use p0, and hence is always
7468    taken.  Thus this function returns true for branches which can fall
7469    through, and which use no resources if they do fall through.  */
7470
7471 static int
7472 is_conditional_branch (idesc)
7473      struct ia64_opcode *idesc;
7474 {
7475   /* br is a conditional branch.  Everything that starts with br. except
7476      br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
7477      Everything that starts with brl is a conditional branch.  */
7478   return (idesc->name[0] == 'b' && idesc->name[1] == 'r'
7479           && (idesc->name[2] == '\0'
7480               || (idesc->name[2] == '.' && idesc->name[3] != 'i'
7481                   && idesc->name[3] != 'c' && idesc->name[3] != 'w')
7482               || idesc->name[2] == 'l'
7483               /* br.cond, br.call, br.clr  */
7484               || (idesc->name[2] == '.' && idesc->name[3] == 'c'
7485                   && (idesc->name[4] == 'a' || idesc->name[4] == 'o'
7486                       || (idesc->name[4] == 'l' && idesc->name[5] == 'r')))));
7487 }
7488
7489 /* Return whether the given opcode is a taken branch.  If there's any doubt,
7490    returns zero.  */
7491
7492 static int
7493 is_taken_branch (idesc)
7494      struct ia64_opcode *idesc;
7495 {
7496   return ((is_conditional_branch (idesc) && CURR_SLOT.qp_regno == 0)
7497           || strncmp (idesc->name, "br.ia", 5) == 0);
7498 }
7499
7500 /* Return whether the given opcode is an interruption or rfi.  If there's any
7501    doubt, returns zero.  */
7502
7503 static int
7504 is_interruption_or_rfi (idesc)
7505      struct ia64_opcode *idesc;
7506 {
7507   if (strcmp (idesc->name, "rfi") == 0)
7508     return 1;
7509   return 0;
7510 }
7511
7512 /* Returns the index of the given dependency in the opcode's list of chks, or
7513    -1 if there is no dependency.  */
7514
7515 static int
7516 depends_on (depind, idesc)
7517      int depind;
7518      struct ia64_opcode *idesc;
7519 {
7520   int i;
7521   const struct ia64_opcode_dependency *dep = idesc->dependencies;
7522   for (i = 0; i < dep->nchks; i++)
7523     {
7524       if (depind == DEP (dep->chks[i]))
7525         return i;
7526     }
7527   return -1;
7528 }
7529
7530 /* Determine a set of specific resources used for a particular resource
7531    class.  Returns the number of specific resources identified  For those
7532    cases which are not determinable statically, the resource returned is
7533    marked nonspecific.
7534
7535    Meanings of value in 'NOTE':
7536    1) only read/write when the register number is explicitly encoded in the
7537    insn.
7538    2) only read CFM when accessing a rotating GR, FR, or PR.  mov pr only
7539    accesses CFM when qualifying predicate is in the rotating region.
7540    3) general register value is used to specify an indirect register; not
7541    determinable statically.
7542    4) only read the given resource when bits 7:0 of the indirect index
7543    register value does not match the register number of the resource; not
7544    determinable statically.
7545    5) all rules are implementation specific.
7546    6) only when both the index specified by the reader and the index specified
7547    by the writer have the same value in bits 63:61; not determinable
7548    statically.
7549    7) only access the specified resource when the corresponding mask bit is
7550    set
7551    8) PSR.dfh is only read when these insns reference FR32-127.  PSR.dfl is
7552    only read when these insns reference FR2-31
7553    9) PSR.mfl is only written when these insns write FR2-31.  PSR.mfh is only
7554    written when these insns write FR32-127
7555    10) The PSR.bn bit is only accessed when one of GR16-31 is specified in the
7556    instruction
7557    11) The target predicates are written independently of PR[qp], but source
7558    registers are only read if PR[qp] is true.  Since the state of PR[qp]
7559    cannot statically be determined, all source registers are marked used.
7560    12) This insn only reads the specified predicate register when that
7561    register is the PR[qp].
7562    13) This reference to ld-c only applies to teh GR whose value is loaded
7563    with data returned from memory, not the post-incremented address register.
7564    14) The RSE resource includes the implementation-specific RSE internal
7565    state resources.  At least one (and possibly more) of these resources are
7566    read by each instruction listed in IC:rse-readers.  At least one (and
7567    possibly more) of these resources are written by each insn listed in
7568    IC:rse-writers.
7569    15+16) Represents reserved instructions, which the assembler does not
7570    generate.
7571
7572    Memory resources (i.e. locations in memory) are *not* marked or tracked by
7573    this code; there are no dependency violations based on memory access.
7574 */
7575
7576 #define MAX_SPECS 256
7577 #define DV_CHK 1
7578 #define DV_REG 0
7579
7580 static int
7581 specify_resource (dep, idesc, type, specs, note, path)
7582      const struct ia64_dependency *dep;
7583      struct ia64_opcode *idesc;
7584      int type;                         /* is this a DV chk or a DV reg? */
7585      struct rsrc specs[MAX_SPECS];     /* returned specific resources */
7586      int note;                         /* resource note for this insn's usage */
7587      int path;                         /* which execution path to examine */
7588 {
7589   int count = 0;
7590   int i;
7591   int rsrc_write = 0;
7592   struct rsrc tmpl;
7593
7594   if (dep->mode == IA64_DV_WAW
7595       || (dep->mode == IA64_DV_RAW && type == DV_REG)
7596       || (dep->mode == IA64_DV_WAR && type == DV_CHK))
7597     rsrc_write = 1;
7598
7599   /* template for any resources we identify */
7600   tmpl.dependency = dep;
7601   tmpl.note = note;
7602   tmpl.insn_srlz = tmpl.data_srlz = 0;
7603   tmpl.qp_regno = CURR_SLOT.qp_regno;
7604   tmpl.link_to_qp_branch = 1;
7605   tmpl.mem_offset.hint = 0;
7606   tmpl.specific = 1;
7607   tmpl.index = 0;
7608   tmpl.cmp_type = CMP_NONE;
7609
7610 #define UNHANDLED \
7611 as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
7612 dep->name, idesc->name, (rsrc_write?"write":"read"), note)
7613 #define KNOWN(REG) (gr_values[REG].known && gr_values[REG].path >= path)
7614
7615   /* we don't need to track these */
7616   if (dep->semantics == IA64_DVS_NONE)
7617     return 0;
7618
7619   switch (dep->specifier)
7620     {
7621     case IA64_RS_AR_K:
7622       if (note == 1)
7623         {
7624           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7625             {
7626               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7627               if (regno >= 0 && regno <= 7)
7628                 {
7629                   specs[count] = tmpl;
7630                   specs[count++].index = regno;
7631                 }
7632             }
7633         }
7634       else if (note == 0)
7635         {
7636           for (i = 0; i < 8; i++)
7637             {
7638               specs[count] = tmpl;
7639               specs[count++].index = i;
7640             }
7641         }
7642       else
7643         {
7644           UNHANDLED;
7645         }
7646       break;
7647
7648     case IA64_RS_AR_UNAT:
7649       /* This is a mov =AR or mov AR= instruction.  */
7650       if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7651         {
7652           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7653           if (regno == AR_UNAT)
7654             {
7655               specs[count++] = tmpl;
7656             }
7657         }
7658       else
7659         {
7660           /* This is a spill/fill, or other instruction that modifies the
7661              unat register.  */
7662
7663           /* Unless we can determine the specific bits used, mark the whole
7664              thing; bits 8:3 of the memory address indicate the bit used in
7665              UNAT.  The .mem.offset hint may be used to eliminate a small
7666              subset of conflicts.  */
7667           specs[count] = tmpl;
7668           if (md.mem_offset.hint)
7669             {
7670               if (md.debug_dv)
7671                 fprintf (stderr, "  Using hint for spill/fill\n");
7672               /* The index isn't actually used, just set it to something
7673                  approximating the bit index.  */
7674               specs[count].index = (md.mem_offset.offset >> 3) & 0x3F;
7675               specs[count].mem_offset.hint = 1;
7676               specs[count].mem_offset.offset = md.mem_offset.offset;
7677               specs[count++].mem_offset.base = md.mem_offset.base;
7678             }
7679           else
7680             {
7681               specs[count++].specific = 0;
7682             }
7683         }
7684       break;
7685
7686     case IA64_RS_AR:
7687       if (note == 1)
7688         {
7689           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7690             {
7691               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7692               if ((regno >= 8 && regno <= 15)
7693                   || (regno >= 20 && regno <= 23)
7694                   || (regno >= 31 && regno <= 39)
7695                   || (regno >= 41 && regno <= 47)
7696                   || (regno >= 67 && regno <= 111))
7697                 {
7698                   specs[count] = tmpl;
7699                   specs[count++].index = regno;
7700                 }
7701             }
7702         }
7703       else
7704         {
7705           UNHANDLED;
7706         }
7707       break;
7708
7709     case IA64_RS_ARb:
7710       if (note == 1)
7711         {
7712           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7713             {
7714               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7715               if ((regno >= 48 && regno <= 63)
7716                   || (regno >= 112 && regno <= 127))
7717                 {
7718                   specs[count] = tmpl;
7719                   specs[count++].index = regno;
7720                 }
7721             }
7722         }
7723       else if (note == 0)
7724         {
7725           for (i = 48; i < 64; i++)
7726             {
7727               specs[count] = tmpl;
7728               specs[count++].index = i;
7729             }
7730           for (i = 112; i < 128; i++)
7731             {
7732               specs[count] = tmpl;
7733               specs[count++].index = i;
7734             }
7735         }
7736       else
7737         {
7738           UNHANDLED;
7739         }
7740       break;
7741
7742     case IA64_RS_BR:
7743       if (note != 1)
7744         {
7745           UNHANDLED;
7746         }
7747       else
7748         {
7749           if (rsrc_write)
7750             {
7751               for (i = 0; i < idesc->num_outputs; i++)
7752                 if (idesc->operands[i] == IA64_OPND_B1
7753                     || idesc->operands[i] == IA64_OPND_B2)
7754                   {
7755                     specs[count] = tmpl;
7756                     specs[count++].index =
7757                       CURR_SLOT.opnd[i].X_add_number - REG_BR;
7758                   }
7759             }
7760           else
7761             {
7762               for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
7763                 if (idesc->operands[i] == IA64_OPND_B1
7764                     || idesc->operands[i] == IA64_OPND_B2)
7765                   {
7766                     specs[count] = tmpl;
7767                     specs[count++].index =
7768                       CURR_SLOT.opnd[i].X_add_number - REG_BR;
7769                   }
7770             }
7771         }
7772       break;
7773
7774     case IA64_RS_CPUID: /* four or more registers */
7775       if (note == 3)
7776         {
7777           if (idesc->operands[!rsrc_write] == IA64_OPND_CPUID_R3)
7778             {
7779               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7780               if (regno >= 0 && regno < NELEMS (gr_values)
7781                   && KNOWN (regno))
7782                 {
7783                   specs[count] = tmpl;
7784                   specs[count++].index = gr_values[regno].value & 0xFF;
7785                 }
7786               else
7787                 {
7788                   specs[count] = tmpl;
7789                   specs[count++].specific = 0;
7790                 }
7791             }
7792         }
7793       else
7794         {
7795           UNHANDLED;
7796         }
7797       break;
7798
7799     case IA64_RS_DBR: /* four or more registers */
7800       if (note == 3)
7801         {
7802           if (idesc->operands[!rsrc_write] == IA64_OPND_DBR_R3)
7803             {
7804               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7805               if (regno >= 0 && regno < NELEMS (gr_values)
7806                   && KNOWN (regno))
7807                 {
7808                   specs[count] = tmpl;
7809                   specs[count++].index = gr_values[regno].value & 0xFF;
7810                 }
7811               else
7812                 {
7813                   specs[count] = tmpl;
7814                   specs[count++].specific = 0;
7815                 }
7816             }
7817         }
7818       else if (note == 0 && !rsrc_write)
7819         {
7820           specs[count] = tmpl;
7821           specs[count++].specific = 0;
7822         }
7823       else
7824         {
7825           UNHANDLED;
7826         }
7827       break;
7828
7829     case IA64_RS_IBR: /* four or more registers */
7830       if (note == 3)
7831         {
7832           if (idesc->operands[!rsrc_write] == IA64_OPND_IBR_R3)
7833             {
7834               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7835               if (regno >= 0 && regno < NELEMS (gr_values)
7836                   && KNOWN (regno))
7837                 {
7838                   specs[count] = tmpl;
7839                   specs[count++].index = gr_values[regno].value & 0xFF;
7840                 }
7841               else
7842                 {
7843                   specs[count] = tmpl;
7844                   specs[count++].specific = 0;
7845                 }
7846             }
7847         }
7848       else
7849         {
7850           UNHANDLED;
7851         }
7852       break;
7853
7854     case IA64_RS_MSR:
7855       if (note == 5)
7856         {
7857           /* These are implementation specific.  Force all references to
7858              conflict with all other references.  */
7859           specs[count] = tmpl;
7860           specs[count++].specific = 0;
7861         }
7862       else
7863         {
7864           UNHANDLED;
7865         }
7866       break;
7867
7868     case IA64_RS_PKR: /* 16 or more registers */
7869       if (note == 3 || note == 4)
7870         {
7871           if (idesc->operands[!rsrc_write] == IA64_OPND_PKR_R3)
7872             {
7873               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7874               if (regno >= 0 && regno < NELEMS (gr_values)
7875                   && KNOWN (regno))
7876                 {
7877                   if (note == 3)
7878                     {
7879                       specs[count] = tmpl;
7880                       specs[count++].index = gr_values[regno].value & 0xFF;
7881                     }
7882                   else
7883                     for (i = 0; i < NELEMS (gr_values); i++)
7884                       {
7885                         /* Uses all registers *except* the one in R3.  */
7886                         if ((unsigned)i != (gr_values[regno].value & 0xFF))
7887                           {
7888                             specs[count] = tmpl;
7889                             specs[count++].index = i;
7890                           }
7891                       }
7892                 }
7893               else
7894                 {
7895                   specs[count] = tmpl;
7896                   specs[count++].specific = 0;
7897                 }
7898             }
7899         }
7900       else if (note == 0)
7901         {
7902           /* probe et al.  */
7903           specs[count] = tmpl;
7904           specs[count++].specific = 0;
7905         }
7906       break;
7907
7908     case IA64_RS_PMC: /* four or more registers */
7909       if (note == 3)
7910         {
7911           if (idesc->operands[!rsrc_write] == IA64_OPND_PMC_R3
7912               || (!rsrc_write && idesc->operands[1] == IA64_OPND_PMD_R3))
7913
7914             {
7915               int index = ((idesc->operands[1] == IA64_OPND_R3 && !rsrc_write)
7916                            ? 1 : !rsrc_write);
7917               int regno = CURR_SLOT.opnd[index].X_add_number - REG_GR;
7918               if (regno >= 0 && regno < NELEMS (gr_values)
7919                   && KNOWN (regno))
7920                 {
7921                   specs[count] = tmpl;
7922                   specs[count++].index = gr_values[regno].value & 0xFF;
7923                 }
7924               else
7925                 {
7926                   specs[count] = tmpl;
7927                   specs[count++].specific = 0;
7928                 }
7929             }
7930         }
7931       else
7932         {
7933           UNHANDLED;
7934         }
7935       break;
7936
7937     case IA64_RS_PMD: /* four or more registers */
7938       if (note == 3)
7939         {
7940           if (idesc->operands[!rsrc_write] == IA64_OPND_PMD_R3)
7941             {
7942               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7943               if (regno >= 0 && regno < NELEMS (gr_values)
7944                   && KNOWN (regno))
7945                 {
7946                   specs[count] = tmpl;
7947                   specs[count++].index = gr_values[regno].value & 0xFF;
7948                 }
7949               else
7950                 {
7951                   specs[count] = tmpl;
7952                   specs[count++].specific = 0;
7953                 }
7954             }
7955         }
7956       else
7957         {
7958           UNHANDLED;
7959         }
7960       break;
7961
7962     case IA64_RS_RR: /* eight registers */
7963       if (note == 6)
7964         {
7965           if (idesc->operands[!rsrc_write] == IA64_OPND_RR_R3)
7966             {
7967               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7968               if (regno >= 0 && regno < NELEMS (gr_values)
7969                   && KNOWN (regno))
7970                 {
7971                   specs[count] = tmpl;
7972                   specs[count++].index = (gr_values[regno].value >> 61) & 0x7;
7973                 }
7974               else
7975                 {
7976                   specs[count] = tmpl;
7977                   specs[count++].specific = 0;
7978                 }
7979             }
7980         }
7981       else if (note == 0 && !rsrc_write)
7982         {
7983           specs[count] = tmpl;
7984           specs[count++].specific = 0;
7985         }
7986       else
7987         {
7988           UNHANDLED;
7989         }
7990       break;
7991
7992     case IA64_RS_CR_IRR:
7993       if (note == 0)
7994         {
7995           /* handle mov-from-CR-IVR; it's a read that writes CR[IRR] */
7996           int regno = CURR_SLOT.opnd[1].X_add_number - REG_CR;
7997           if (rsrc_write
7998               && idesc->operands[1] == IA64_OPND_CR3
7999               && regno == CR_IVR)
8000             {
8001               for (i = 0; i < 4; i++)
8002                 {
8003                   specs[count] = tmpl;
8004                   specs[count++].index = CR_IRR0 + i;
8005                 }
8006             }
8007         }
8008       else if (note == 1)
8009         {
8010           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8011           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8012               && regno >= CR_IRR0
8013               && regno <= CR_IRR3)
8014             {
8015               specs[count] = tmpl;
8016               specs[count++].index = regno;
8017             }
8018         }
8019       else
8020         {
8021           UNHANDLED;
8022         }
8023       break;
8024
8025     case IA64_RS_CR_LRR:
8026       if (note != 1)
8027         {
8028           UNHANDLED;
8029         }
8030       else
8031         {
8032           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8033           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8034               && (regno == CR_LRR0 || regno == CR_LRR1))
8035             {
8036               specs[count] = tmpl;
8037               specs[count++].index = regno;
8038             }
8039         }
8040       break;
8041
8042     case IA64_RS_CR:
8043       if (note == 1)
8044         {
8045           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8046             {
8047               specs[count] = tmpl;
8048               specs[count++].index =
8049                 CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8050             }
8051         }
8052       else
8053         {
8054           UNHANDLED;
8055         }
8056       break;
8057
8058     case IA64_RS_FR:
8059     case IA64_RS_FRb:
8060       if (note != 1)
8061         {
8062           UNHANDLED;
8063         }
8064       else if (rsrc_write)
8065         {
8066           if (dep->specifier == IA64_RS_FRb
8067               && idesc->operands[0] == IA64_OPND_F1)
8068             {
8069               specs[count] = tmpl;
8070               specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_FR;
8071             }
8072         }
8073       else
8074         {
8075           for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8076             {
8077               if (idesc->operands[i] == IA64_OPND_F2
8078                   || idesc->operands[i] == IA64_OPND_F3
8079                   || idesc->operands[i] == IA64_OPND_F4)
8080                 {
8081                   specs[count] = tmpl;
8082                   specs[count++].index =
8083                     CURR_SLOT.opnd[i].X_add_number - REG_FR;
8084                 }
8085             }
8086         }
8087       break;
8088
8089     case IA64_RS_GR:
8090       if (note == 13)
8091         {
8092           /* This reference applies only to the GR whose value is loaded with
8093              data returned from memory.  */
8094           specs[count] = tmpl;
8095           specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_GR;
8096         }
8097       else if (note == 1)
8098         {
8099           if (rsrc_write)
8100             {
8101               for (i = 0; i < idesc->num_outputs; i++)
8102                 if (idesc->operands[i] == IA64_OPND_R1
8103                     || idesc->operands[i] == IA64_OPND_R2
8104                     || idesc->operands[i] == IA64_OPND_R3)
8105                   {
8106                     specs[count] = tmpl;
8107                     specs[count++].index =
8108                       CURR_SLOT.opnd[i].X_add_number - REG_GR;
8109                   }
8110               if (idesc->flags & IA64_OPCODE_POSTINC)
8111                 for (i = 0; i < NELEMS (idesc->operands); i++)
8112                   if (idesc->operands[i] == IA64_OPND_MR3)
8113                     {
8114                       specs[count] = tmpl;
8115                       specs[count++].index =
8116                         CURR_SLOT.opnd[i].X_add_number - REG_GR;
8117                     }
8118             }
8119           else
8120             {
8121               /* Look for anything that reads a GR.  */
8122               for (i = 0; i < NELEMS (idesc->operands); i++)
8123                 {
8124                   if (idesc->operands[i] == IA64_OPND_MR3
8125                       || idesc->operands[i] == IA64_OPND_CPUID_R3
8126                       || idesc->operands[i] == IA64_OPND_DBR_R3
8127                       || idesc->operands[i] == IA64_OPND_IBR_R3
8128                       || idesc->operands[i] == IA64_OPND_MSR_R3
8129                       || idesc->operands[i] == IA64_OPND_PKR_R3
8130                       || idesc->operands[i] == IA64_OPND_PMC_R3
8131                       || idesc->operands[i] == IA64_OPND_PMD_R3
8132                       || idesc->operands[i] == IA64_OPND_RR_R3
8133                       || ((i >= idesc->num_outputs)
8134                           && (idesc->operands[i] == IA64_OPND_R1
8135                               || idesc->operands[i] == IA64_OPND_R2
8136                               || idesc->operands[i] == IA64_OPND_R3
8137                               /* addl source register.  */
8138                               || idesc->operands[i] == IA64_OPND_R3_2)))
8139                     {
8140                       specs[count] = tmpl;
8141                       specs[count++].index =
8142                         CURR_SLOT.opnd[i].X_add_number - REG_GR;
8143                     }
8144                 }
8145             }
8146         }
8147       else
8148         {
8149           UNHANDLED;
8150         }
8151       break;
8152
8153       /* This is the same as IA64_RS_PRr, except that the register range is
8154          from 1 - 15, and there are no rotating register reads/writes here.  */
8155     case IA64_RS_PR:
8156       if (note == 0)
8157         {
8158           for (i = 1; i < 16; i++)
8159             {
8160               specs[count] = tmpl;
8161               specs[count++].index = i;
8162             }
8163         }
8164       else if (note == 7)
8165         {
8166           valueT mask = 0;
8167           /* Mark only those registers indicated by the mask.  */
8168           if (rsrc_write)
8169             {
8170               mask = CURR_SLOT.opnd[2].X_add_number;
8171               for (i = 1; i < 16; i++)
8172                 if (mask & ((valueT) 1 << i))
8173                   {
8174                     specs[count] = tmpl;
8175                     specs[count++].index = i;
8176                   }
8177             }
8178           else
8179             {
8180               UNHANDLED;
8181             }
8182         }
8183       else if (note == 11) /* note 11 implies note 1 as well */
8184         {
8185           if (rsrc_write)
8186             {
8187               for (i = 0; i < idesc->num_outputs; i++)
8188                 {
8189                   if (idesc->operands[i] == IA64_OPND_P1
8190                       || idesc->operands[i] == IA64_OPND_P2)
8191                     {
8192                       int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8193                       if (regno >= 1 && regno < 16)
8194                         {
8195                           specs[count] = tmpl;
8196                           specs[count++].index = regno;
8197                         }
8198                     }
8199                 }
8200             }
8201           else
8202             {
8203               UNHANDLED;
8204             }
8205         }
8206       else if (note == 12)
8207         {
8208           if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8209             {
8210               specs[count] = tmpl;
8211               specs[count++].index = CURR_SLOT.qp_regno;
8212             }
8213         }
8214       else if (note == 1)
8215         {
8216           if (rsrc_write)
8217             {
8218               int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8219               int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8220               int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8221               int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8222
8223               if ((idesc->operands[0] == IA64_OPND_P1
8224                    || idesc->operands[0] == IA64_OPND_P2)
8225                   && p1 >= 1 && p1 < 16)
8226                 {
8227                   specs[count] = tmpl;
8228                   specs[count].cmp_type =
8229                     (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8230                   specs[count++].index = p1;
8231                 }
8232               if ((idesc->operands[1] == IA64_OPND_P1
8233                    || idesc->operands[1] == IA64_OPND_P2)
8234                   && p2 >= 1 && p2 < 16)
8235                 {
8236                   specs[count] = tmpl;
8237                   specs[count].cmp_type =
8238                     (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8239                   specs[count++].index = p2;
8240                 }
8241             }
8242           else
8243             {
8244               if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8245                 {
8246                   specs[count] = tmpl;
8247                   specs[count++].index = CURR_SLOT.qp_regno;
8248                 }
8249               if (idesc->operands[1] == IA64_OPND_PR)
8250                 {
8251                   for (i = 1; i < 16; i++)
8252                     {
8253                       specs[count] = tmpl;
8254                       specs[count++].index = i;
8255                     }
8256                 }
8257             }
8258         }
8259       else
8260         {
8261           UNHANDLED;
8262         }
8263       break;
8264
8265       /* This is the general case for PRs.  IA64_RS_PR and IA64_RS_PR63 are
8266          simplified cases of this.  */
8267     case IA64_RS_PRr:
8268       if (note == 0)
8269         {
8270           for (i = 16; i < 63; i++)
8271             {
8272               specs[count] = tmpl;
8273               specs[count++].index = i;
8274             }
8275         }
8276       else if (note == 7)
8277         {
8278           valueT mask = 0;
8279           /* Mark only those registers indicated by the mask.  */
8280           if (rsrc_write
8281               && idesc->operands[0] == IA64_OPND_PR)
8282             {
8283               mask = CURR_SLOT.opnd[2].X_add_number;
8284               if (mask & ((valueT) 1 << 16))
8285                 for (i = 16; i < 63; i++)
8286                   {
8287                     specs[count] = tmpl;
8288                     specs[count++].index = i;
8289                   }
8290             }
8291           else if (rsrc_write
8292                    && idesc->operands[0] == IA64_OPND_PR_ROT)
8293             {
8294               for (i = 16; i < 63; i++)
8295                 {
8296                   specs[count] = tmpl;
8297                   specs[count++].index = i;
8298                 }
8299             }
8300           else
8301             {
8302               UNHANDLED;
8303             }
8304         }
8305       else if (note == 11) /* note 11 implies note 1 as well */
8306         {
8307           if (rsrc_write)
8308             {
8309               for (i = 0; i < idesc->num_outputs; i++)
8310                 {
8311                   if (idesc->operands[i] == IA64_OPND_P1
8312                       || idesc->operands[i] == IA64_OPND_P2)
8313                     {
8314                       int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8315                       if (regno >= 16 && regno < 63)
8316                         {
8317                           specs[count] = tmpl;
8318                           specs[count++].index = regno;
8319                         }
8320                     }
8321                 }
8322             }
8323           else
8324             {
8325               UNHANDLED;
8326             }
8327         }
8328       else if (note == 12)
8329         {
8330           if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8331             {
8332               specs[count] = tmpl;
8333               specs[count++].index = CURR_SLOT.qp_regno;
8334             }
8335         }
8336       else if (note == 1)
8337         {
8338           if (rsrc_write)
8339             {
8340               int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8341               int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8342               int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8343               int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8344
8345               if ((idesc->operands[0] == IA64_OPND_P1
8346                    || idesc->operands[0] == IA64_OPND_P2)
8347                   && p1 >= 16 && p1 < 63)
8348                 {
8349                   specs[count] = tmpl;
8350                   specs[count].cmp_type =
8351                     (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8352                   specs[count++].index = p1;
8353                 }
8354               if ((idesc->operands[1] == IA64_OPND_P1
8355                    || idesc->operands[1] == IA64_OPND_P2)
8356                   && p2 >= 16 && p2 < 63)
8357                 {
8358                   specs[count] = tmpl;
8359                   specs[count].cmp_type =
8360                     (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8361                   specs[count++].index = p2;
8362                 }
8363             }
8364           else
8365             {
8366               if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8367                 {
8368                   specs[count] = tmpl;
8369                   specs[count++].index = CURR_SLOT.qp_regno;
8370                 }
8371               if (idesc->operands[1] == IA64_OPND_PR)
8372                 {
8373                   for (i = 16; i < 63; i++)
8374                     {
8375                       specs[count] = tmpl;
8376                       specs[count++].index = i;
8377                     }
8378                 }
8379             }
8380         }
8381       else
8382         {
8383           UNHANDLED;
8384         }
8385       break;
8386
8387     case IA64_RS_PSR:
8388       /* Verify that the instruction is using the PSR bit indicated in
8389          dep->regindex.  */
8390       if (note == 0)
8391         {
8392           if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_UM)
8393             {
8394               if (dep->regindex < 6)
8395                 {
8396                   specs[count++] = tmpl;
8397                 }
8398             }
8399           else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR)
8400             {
8401               if (dep->regindex < 32
8402                   || dep->regindex == 35
8403                   || dep->regindex == 36
8404                   || (!rsrc_write && dep->regindex == PSR_CPL))
8405                 {
8406                   specs[count++] = tmpl;
8407                 }
8408             }
8409           else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_L)
8410             {
8411               if (dep->regindex < 32
8412                   || dep->regindex == 35
8413                   || dep->regindex == 36
8414                   || (rsrc_write && dep->regindex == PSR_CPL))
8415                 {
8416                   specs[count++] = tmpl;
8417                 }
8418             }
8419           else
8420             {
8421               /* Several PSR bits have very specific dependencies.  */
8422               switch (dep->regindex)
8423                 {
8424                 default:
8425                   specs[count++] = tmpl;
8426                   break;
8427                 case PSR_IC:
8428                   if (rsrc_write)
8429                     {
8430                       specs[count++] = tmpl;
8431                     }
8432                   else
8433                     {
8434                       /* Only certain CR accesses use PSR.ic */
8435                       if (idesc->operands[0] == IA64_OPND_CR3
8436                           || idesc->operands[1] == IA64_OPND_CR3)
8437                         {
8438                           int index =
8439                             ((idesc->operands[0] == IA64_OPND_CR3)
8440                              ? 0 : 1);
8441                           int regno =
8442                             CURR_SLOT.opnd[index].X_add_number - REG_CR;
8443
8444                           switch (regno)
8445                             {
8446                             default:
8447                               break;
8448                             case CR_ITIR:
8449                             case CR_IFS:
8450                             case CR_IIM:
8451                             case CR_IIP:
8452                             case CR_IPSR:
8453                             case CR_ISR:
8454                             case CR_IFA:
8455                             case CR_IHA:
8456                             case CR_IIPA:
8457                               specs[count++] = tmpl;
8458                               break;
8459                             }
8460                         }
8461                     }
8462                   break;
8463                 case PSR_CPL:
8464                   if (rsrc_write)
8465                     {
8466                       specs[count++] = tmpl;
8467                     }
8468                   else
8469                     {
8470                       /* Only some AR accesses use cpl */
8471                       if (idesc->operands[0] == IA64_OPND_AR3
8472                           || idesc->operands[1] == IA64_OPND_AR3)
8473                         {
8474                           int index =
8475                             ((idesc->operands[0] == IA64_OPND_AR3)
8476                              ? 0 : 1);
8477                           int regno =
8478                             CURR_SLOT.opnd[index].X_add_number - REG_AR;
8479
8480                           if (regno == AR_ITC
8481                               || (index == 0
8482                                   && (regno == AR_ITC
8483                                       || regno == AR_RSC
8484                                       || (regno >= AR_K0
8485                                           && regno <= AR_K7))))
8486                             {
8487                               specs[count++] = tmpl;
8488                             }
8489                         }
8490                       else
8491                         {
8492                           specs[count++] = tmpl;
8493                         }
8494                       break;
8495                     }
8496                 }
8497             }
8498         }
8499       else if (note == 7)
8500         {
8501           valueT mask = 0;
8502           if (idesc->operands[0] == IA64_OPND_IMMU24)
8503             {
8504               mask = CURR_SLOT.opnd[0].X_add_number;
8505             }
8506           else
8507             {
8508               UNHANDLED;
8509             }
8510           if (mask & ((valueT) 1 << dep->regindex))
8511             {
8512               specs[count++] = tmpl;
8513             }
8514         }
8515       else if (note == 8)
8516         {
8517           int min = dep->regindex == PSR_DFL ? 2 : 32;
8518           int max = dep->regindex == PSR_DFL ? 31 : 127;
8519           /* dfh is read on FR32-127; dfl is read on FR2-31 */
8520           for (i = 0; i < NELEMS (idesc->operands); i++)
8521             {
8522               if (idesc->operands[i] == IA64_OPND_F1
8523                   || idesc->operands[i] == IA64_OPND_F2
8524                   || idesc->operands[i] == IA64_OPND_F3
8525                   || idesc->operands[i] == IA64_OPND_F4)
8526                 {
8527                   int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8528                   if (reg >= min && reg <= max)
8529                     {
8530                       specs[count++] = tmpl;
8531                     }
8532                 }
8533             }
8534         }
8535       else if (note == 9)
8536         {
8537           int min = dep->regindex == PSR_MFL ? 2 : 32;
8538           int max = dep->regindex == PSR_MFL ? 31 : 127;
8539           /* mfh is read on writes to FR32-127; mfl is read on writes to
8540              FR2-31 */
8541           for (i = 0; i < idesc->num_outputs; i++)
8542             {
8543               if (idesc->operands[i] == IA64_OPND_F1)
8544                 {
8545                   int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8546                   if (reg >= min && reg <= max)
8547                     {
8548                       specs[count++] = tmpl;
8549                     }
8550                 }
8551             }
8552         }
8553       else if (note == 10)
8554         {
8555           for (i = 0; i < NELEMS (idesc->operands); i++)
8556             {
8557               if (idesc->operands[i] == IA64_OPND_R1
8558                   || idesc->operands[i] == IA64_OPND_R2
8559                   || idesc->operands[i] == IA64_OPND_R3)
8560                 {
8561                   int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8562                   if (regno >= 16 && regno <= 31)
8563                     {
8564                       specs[count++] = tmpl;
8565                     }
8566                 }
8567             }
8568         }
8569       else
8570         {
8571           UNHANDLED;
8572         }
8573       break;
8574
8575     case IA64_RS_AR_FPSR:
8576       if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8577         {
8578           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8579           if (regno == AR_FPSR)
8580             {
8581               specs[count++] = tmpl;
8582             }
8583         }
8584       else
8585         {
8586           specs[count++] = tmpl;
8587         }
8588       break;
8589
8590     case IA64_RS_ARX:
8591       /* Handle all AR[REG] resources */
8592       if (note == 0 || note == 1)
8593         {
8594           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8595           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3
8596               && regno == dep->regindex)
8597             {
8598               specs[count++] = tmpl;
8599             }
8600           /* other AR[REG] resources may be affected by AR accesses */
8601           else if (idesc->operands[0] == IA64_OPND_AR3)
8602             {
8603               /* AR[] writes */
8604               regno = CURR_SLOT.opnd[0].X_add_number - REG_AR;
8605               switch (dep->regindex)
8606                 {
8607                 default:
8608                   break;
8609                 case AR_BSP:
8610                 case AR_RNAT:
8611                   if (regno == AR_BSPSTORE)
8612                     {
8613                       specs[count++] = tmpl;
8614                     }
8615                 case AR_RSC:
8616                   if (!rsrc_write &&
8617                       (regno == AR_BSPSTORE
8618                        || regno == AR_RNAT))
8619                     {
8620                       specs[count++] = tmpl;
8621                     }
8622                   break;
8623                 }
8624             }
8625           else if (idesc->operands[1] == IA64_OPND_AR3)
8626             {
8627               /* AR[] reads */
8628               regno = CURR_SLOT.opnd[1].X_add_number - REG_AR;
8629               switch (dep->regindex)
8630                 {
8631                 default:
8632                   break;
8633                 case AR_RSC:
8634                   if (regno == AR_BSPSTORE || regno == AR_RNAT)
8635                     {
8636                       specs[count++] = tmpl;
8637                     }
8638                   break;
8639                 }
8640             }
8641           else
8642             {
8643               specs[count++] = tmpl;
8644             }
8645         }
8646       else
8647         {
8648           UNHANDLED;
8649         }
8650       break;
8651
8652     case IA64_RS_CRX:
8653       /* Handle all CR[REG] resources */
8654       if (note == 0 || note == 1)
8655         {
8656           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8657             {
8658               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8659               if (regno == dep->regindex)
8660                 {
8661                   specs[count++] = tmpl;
8662                 }
8663               else if (!rsrc_write)
8664                 {
8665                   /* Reads from CR[IVR] affect other resources.  */
8666                   if (regno == CR_IVR)
8667                     {
8668                       if ((dep->regindex >= CR_IRR0
8669                            && dep->regindex <= CR_IRR3)
8670                           || dep->regindex == CR_TPR)
8671                         {
8672                           specs[count++] = tmpl;
8673                         }
8674                     }
8675                 }
8676             }
8677           else
8678             {
8679               specs[count++] = tmpl;
8680             }
8681         }
8682       else
8683         {
8684           UNHANDLED;
8685         }
8686       break;
8687
8688     case IA64_RS_INSERVICE:
8689       /* look for write of EOI (67) or read of IVR (65) */
8690       if ((idesc->operands[0] == IA64_OPND_CR3
8691            && CURR_SLOT.opnd[0].X_add_number - REG_CR == CR_EOI)
8692           || (idesc->operands[1] == IA64_OPND_CR3
8693               && CURR_SLOT.opnd[1].X_add_number - REG_CR == CR_IVR))
8694         {
8695           specs[count++] = tmpl;
8696         }
8697       break;
8698
8699     case IA64_RS_GR0:
8700       if (note == 1)
8701         {
8702           specs[count++] = tmpl;
8703         }
8704       else
8705         {
8706           UNHANDLED;
8707         }
8708       break;
8709
8710     case IA64_RS_CFM:
8711       if (note != 2)
8712         {
8713           specs[count++] = tmpl;
8714         }
8715       else
8716         {
8717           /* Check if any of the registers accessed are in the rotating region.
8718              mov to/from pr accesses CFM only when qp_regno is in the rotating
8719              region */
8720           for (i = 0; i < NELEMS (idesc->operands); i++)
8721             {
8722               if (idesc->operands[i] == IA64_OPND_R1
8723                   || idesc->operands[i] == IA64_OPND_R2
8724                   || idesc->operands[i] == IA64_OPND_R3)
8725                 {
8726                   int num = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8727                   /* Assumes that md.rot.num_regs is always valid */
8728                   if (md.rot.num_regs > 0
8729                       && num > 31
8730                       && num < 31 + md.rot.num_regs)
8731                     {
8732                       specs[count] = tmpl;
8733                       specs[count++].specific = 0;
8734                     }
8735                 }
8736               else if (idesc->operands[i] == IA64_OPND_F1
8737                        || idesc->operands[i] == IA64_OPND_F2
8738                        || idesc->operands[i] == IA64_OPND_F3
8739                        || idesc->operands[i] == IA64_OPND_F4)
8740                 {
8741                   int num = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8742                   if (num > 31)
8743                     {
8744                       specs[count] = tmpl;
8745                       specs[count++].specific = 0;
8746                     }
8747                 }
8748               else if (idesc->operands[i] == IA64_OPND_P1
8749                        || idesc->operands[i] == IA64_OPND_P2)
8750                 {
8751                   int num = CURR_SLOT.opnd[i].X_add_number - REG_P;
8752                   if (num > 15)
8753                     {
8754                       specs[count] = tmpl;
8755                       specs[count++].specific = 0;
8756                     }
8757                 }
8758             }
8759           if (CURR_SLOT.qp_regno > 15)
8760             {
8761               specs[count] = tmpl;
8762               specs[count++].specific = 0;
8763             }
8764         }
8765       break;
8766
8767       /* This is the same as IA64_RS_PRr, except simplified to account for
8768          the fact that there is only one register.  */
8769     case IA64_RS_PR63:
8770       if (note == 0)
8771         {
8772           specs[count++] = tmpl;
8773         }
8774       else if (note == 7)
8775         {
8776           valueT mask = 0;
8777           if (idesc->operands[2] == IA64_OPND_IMM17)
8778             mask = CURR_SLOT.opnd[2].X_add_number;
8779           if (mask & ((valueT) 1 << 63))
8780             specs[count++] = tmpl;
8781         }
8782       else if (note == 11)
8783         {
8784           if ((idesc->operands[0] == IA64_OPND_P1
8785                && CURR_SLOT.opnd[0].X_add_number - REG_P == 63)
8786               || (idesc->operands[1] == IA64_OPND_P2
8787                   && CURR_SLOT.opnd[1].X_add_number - REG_P == 63))
8788             {
8789               specs[count++] = tmpl;
8790             }
8791         }
8792       else if (note == 12)
8793         {
8794           if (CURR_SLOT.qp_regno == 63)
8795             {
8796               specs[count++] = tmpl;
8797             }
8798         }
8799       else if (note == 1)
8800         {
8801           if (rsrc_write)
8802             {
8803               int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8804               int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8805               int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8806               int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8807
8808               if (p1 == 63
8809                   && (idesc->operands[0] == IA64_OPND_P1
8810                       || idesc->operands[0] == IA64_OPND_P2))
8811                 {
8812                   specs[count] = tmpl;
8813                   specs[count++].cmp_type =
8814                     (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8815                 }
8816               if (p2 == 63
8817                   && (idesc->operands[1] == IA64_OPND_P1
8818                       || idesc->operands[1] == IA64_OPND_P2))
8819                 {
8820                   specs[count] = tmpl;
8821                   specs[count++].cmp_type =
8822                     (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8823                 }
8824             }
8825           else
8826             {
8827               if (CURR_SLOT.qp_regno == 63)
8828                 {
8829                   specs[count++] = tmpl;
8830                 }
8831             }
8832         }
8833       else
8834         {
8835           UNHANDLED;
8836         }
8837       break;
8838
8839     case IA64_RS_RSE:
8840       /* FIXME we can identify some individual RSE written resources, but RSE
8841          read resources have not yet been completely identified, so for now
8842          treat RSE as a single resource */
8843       if (strncmp (idesc->name, "mov", 3) == 0)
8844         {
8845           if (rsrc_write)
8846             {
8847               if (idesc->operands[0] == IA64_OPND_AR3
8848                   && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE)
8849                 {
8850                   specs[count] = tmpl;
8851                   specs[count++].index = 0; /* IA64_RSE_BSPLOAD/RNATBITINDEX */
8852                 }
8853             }
8854           else
8855             {
8856               if (idesc->operands[0] == IA64_OPND_AR3)
8857                 {
8858                   if (CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE
8859                       || CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_RNAT)
8860                     {
8861                       specs[count++] = tmpl;
8862                     }
8863                 }
8864               else if (idesc->operands[1] == IA64_OPND_AR3)
8865                 {
8866                   if (CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSP
8867                       || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSPSTORE
8868                       || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_RNAT)
8869                     {
8870                       specs[count++] = tmpl;
8871                     }
8872                 }
8873             }
8874         }
8875       else
8876         {
8877           specs[count++] = tmpl;
8878         }
8879       break;
8880
8881     case IA64_RS_ANY:
8882       /* FIXME -- do any of these need to be non-specific? */
8883       specs[count++] = tmpl;
8884       break;
8885
8886     default:
8887       as_bad (_("Unrecognized dependency specifier %d\n"), dep->specifier);
8888       break;
8889     }
8890
8891   return count;
8892 }
8893
8894 /* Clear branch flags on marked resources.  This breaks the link between the
8895    QP of the marking instruction and a subsequent branch on the same QP.  */
8896
8897 static void
8898 clear_qp_branch_flag (mask)
8899      valueT mask;
8900 {
8901   int i;
8902   for (i = 0; i < regdepslen; i++)
8903     {
8904       valueT bit = ((valueT) 1 << regdeps[i].qp_regno);
8905       if ((bit & mask) != 0)
8906         {
8907           regdeps[i].link_to_qp_branch = 0;
8908         }
8909     }
8910 }
8911
8912 /* MASK contains 2 and only 2 PRs which are mutually exclusive.  Remove
8913    any mutexes which contain one of the PRs and create new ones when
8914    needed.  */
8915
8916 static int
8917 update_qp_mutex (valueT mask)
8918 {
8919   int i;
8920   int add = 0;
8921
8922   i = 0;
8923   while (i < qp_mutexeslen)
8924     {
8925       if ((qp_mutexes[i].prmask & mask) != 0)
8926         {
8927           /* If it destroys and creates the same mutex, do nothing.  */
8928           if (qp_mutexes[i].prmask == mask
8929               && qp_mutexes[i].path == md.path)
8930             {
8931               i++;
8932               add = -1;
8933             }
8934           else
8935             {
8936               int keep = 0;
8937
8938               if (md.debug_dv)
8939                 {
8940                   fprintf (stderr, "  Clearing mutex relation");
8941                   print_prmask (qp_mutexes[i].prmask);
8942                   fprintf (stderr, "\n");
8943                 }
8944               
8945               /* Deal with the old mutex with more than 3+ PRs only if
8946                  the new mutex on the same execution path with it.
8947
8948                  FIXME: The 3+ mutex support is incomplete.
8949                  dot_pred_rel () may be a better place to fix it.  */
8950               if (qp_mutexes[i].path == md.path)
8951                 {
8952                   /* If it is a proper subset of the mutex, create a
8953                      new mutex.  */
8954                   if (add == 0
8955                       && (qp_mutexes[i].prmask & mask) == mask)
8956                     add = 1;
8957                   
8958                   qp_mutexes[i].prmask &= ~mask;
8959                   if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
8960                     {
8961                       /* Modify the mutex if there are more than one
8962                          PR left.  */
8963                       keep = 1;
8964                       i++;
8965                     }
8966                 }
8967               
8968               if (keep == 0)
8969                 /* Remove the mutex.  */
8970                 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
8971             }
8972         }
8973       else
8974         ++i;
8975     }
8976
8977   if (add == 1)
8978     add_qp_mutex (mask);
8979
8980   return add;
8981 }
8982
8983 /* Remove any mutexes which contain any of the PRs indicated in the mask.
8984
8985    Any changes to a PR clears the mutex relations which include that PR.  */
8986
8987 static void
8988 clear_qp_mutex (mask)
8989      valueT mask;
8990 {
8991   int i;
8992
8993   i = 0;
8994   while (i < qp_mutexeslen)
8995     {
8996       if ((qp_mutexes[i].prmask & mask) != 0)
8997         {
8998           if (md.debug_dv)
8999             {
9000               fprintf (stderr, "  Clearing mutex relation");
9001               print_prmask (qp_mutexes[i].prmask);
9002               fprintf (stderr, "\n");
9003             }
9004           qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9005         }
9006       else
9007         ++i;
9008     }
9009 }
9010
9011 /* Clear implies relations which contain PRs in the given masks.
9012    P1_MASK indicates the source of the implies relation, while P2_MASK
9013    indicates the implied PR.  */
9014
9015 static void
9016 clear_qp_implies (p1_mask, p2_mask)
9017      valueT p1_mask;
9018      valueT p2_mask;
9019 {
9020   int i;
9021
9022   i = 0;
9023   while (i < qp_implieslen)
9024     {
9025       if ((((valueT) 1 << qp_implies[i].p1) & p1_mask) != 0
9026           || (((valueT) 1 << qp_implies[i].p2) & p2_mask) != 0)
9027         {
9028           if (md.debug_dv)
9029             fprintf (stderr, "Clearing implied relation PR%d->PR%d\n",
9030                      qp_implies[i].p1, qp_implies[i].p2);
9031           qp_implies[i] = qp_implies[--qp_implieslen];
9032         }
9033       else
9034         ++i;
9035     }
9036 }
9037
9038 /* Add the PRs specified to the list of implied relations.  */
9039
9040 static void
9041 add_qp_imply (p1, p2)
9042      int p1, p2;
9043 {
9044   valueT mask;
9045   valueT bit;
9046   int i;
9047
9048   /* p0 is not meaningful here.  */
9049   if (p1 == 0 || p2 == 0)
9050     abort ();
9051
9052   if (p1 == p2)
9053     return;
9054
9055   /* If it exists already, ignore it.  */
9056   for (i = 0; i < qp_implieslen; i++)
9057     {
9058       if (qp_implies[i].p1 == p1
9059           && qp_implies[i].p2 == p2
9060           && qp_implies[i].path == md.path
9061           && !qp_implies[i].p2_branched)
9062         return;
9063     }
9064
9065   if (qp_implieslen == qp_impliestotlen)
9066     {
9067       qp_impliestotlen += 20;
9068       qp_implies = (struct qp_imply *)
9069         xrealloc ((void *) qp_implies,
9070                   qp_impliestotlen * sizeof (struct qp_imply));
9071     }
9072   if (md.debug_dv)
9073     fprintf (stderr, "  Registering PR%d implies PR%d\n", p1, p2);
9074   qp_implies[qp_implieslen].p1 = p1;
9075   qp_implies[qp_implieslen].p2 = p2;
9076   qp_implies[qp_implieslen].path = md.path;
9077   qp_implies[qp_implieslen++].p2_branched = 0;
9078
9079   /* Add in the implied transitive relations; for everything that p2 implies,
9080      make p1 imply that, too; for everything that implies p1, make it imply p2
9081      as well.  */
9082   for (i = 0; i < qp_implieslen; i++)
9083     {
9084       if (qp_implies[i].p1 == p2)
9085         add_qp_imply (p1, qp_implies[i].p2);
9086       if (qp_implies[i].p2 == p1)
9087         add_qp_imply (qp_implies[i].p1, p2);
9088     }
9089   /* Add in mutex relations implied by this implies relation; for each mutex
9090      relation containing p2, duplicate it and replace p2 with p1.  */
9091   bit = (valueT) 1 << p1;
9092   mask = (valueT) 1 << p2;
9093   for (i = 0; i < qp_mutexeslen; i++)
9094     {
9095       if (qp_mutexes[i].prmask & mask)
9096         add_qp_mutex ((qp_mutexes[i].prmask & ~mask) | bit);
9097     }
9098 }
9099
9100 /* Add the PRs specified in the mask to the mutex list; this means that only
9101    one of the PRs can be true at any time.  PR0 should never be included in
9102    the mask.  */
9103
9104 static void
9105 add_qp_mutex (mask)
9106      valueT mask;
9107 {
9108   if (mask & 0x1)
9109     abort ();
9110
9111   if (qp_mutexeslen == qp_mutexestotlen)
9112     {
9113       qp_mutexestotlen += 20;
9114       qp_mutexes = (struct qpmutex *)
9115         xrealloc ((void *) qp_mutexes,
9116                   qp_mutexestotlen * sizeof (struct qpmutex));
9117     }
9118   if (md.debug_dv)
9119     {
9120       fprintf (stderr, "  Registering mutex on");
9121       print_prmask (mask);
9122       fprintf (stderr, "\n");
9123     }
9124   qp_mutexes[qp_mutexeslen].path = md.path;
9125   qp_mutexes[qp_mutexeslen++].prmask = mask;
9126 }
9127
9128 static int
9129 has_suffix_p (name, suffix)
9130      const char *name;
9131      const char *suffix;
9132 {
9133   size_t namelen = strlen (name);
9134   size_t sufflen = strlen (suffix);
9135
9136   if (namelen <= sufflen)
9137     return 0;
9138   return strcmp (name + namelen - sufflen, suffix) == 0;
9139 }
9140
9141 static void
9142 clear_register_values ()
9143 {
9144   int i;
9145   if (md.debug_dv)
9146     fprintf (stderr, "  Clearing register values\n");
9147   for (i = 1; i < NELEMS (gr_values); i++)
9148     gr_values[i].known = 0;
9149 }
9150
9151 /* Keep track of register values/changes which affect DV tracking.
9152
9153    optimization note: should add a flag to classes of insns where otherwise we
9154    have to examine a group of strings to identify them.  */
9155
9156 static void
9157 note_register_values (idesc)
9158      struct ia64_opcode *idesc;
9159 {
9160   valueT qp_changemask = 0;
9161   int i;
9162
9163   /* Invalidate values for registers being written to.  */
9164   for (i = 0; i < idesc->num_outputs; i++)
9165     {
9166       if (idesc->operands[i] == IA64_OPND_R1
9167           || idesc->operands[i] == IA64_OPND_R2
9168           || idesc->operands[i] == IA64_OPND_R3)
9169         {
9170           int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9171           if (regno > 0 && regno < NELEMS (gr_values))
9172             gr_values[regno].known = 0;
9173         }
9174       else if (idesc->operands[i] == IA64_OPND_R3_2)
9175         {
9176           int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9177           if (regno > 0 && regno < 4)
9178             gr_values[regno].known = 0;
9179         }
9180       else if (idesc->operands[i] == IA64_OPND_P1
9181                || idesc->operands[i] == IA64_OPND_P2)
9182         {
9183           int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
9184           qp_changemask |= (valueT) 1 << regno;
9185         }
9186       else if (idesc->operands[i] == IA64_OPND_PR)
9187         {
9188           if (idesc->operands[2] & (valueT) 0x10000)
9189             qp_changemask = ~(valueT) 0x1FFFF | idesc->operands[2];
9190           else
9191             qp_changemask = idesc->operands[2];
9192           break;
9193         }
9194       else if (idesc->operands[i] == IA64_OPND_PR_ROT)
9195         {
9196           if (idesc->operands[1] & ((valueT) 1 << 43))
9197             qp_changemask = -((valueT) 1 << 44) | idesc->operands[1];
9198           else
9199             qp_changemask = idesc->operands[1];
9200           qp_changemask &= ~(valueT) 0xFFFF;
9201           break;
9202         }
9203     }
9204
9205   /* Always clear qp branch flags on any PR change.  */
9206   /* FIXME there may be exceptions for certain compares.  */
9207   clear_qp_branch_flag (qp_changemask);
9208
9209   /* Invalidate rotating registers on insns which affect RRBs in CFM.  */
9210   if (idesc->flags & IA64_OPCODE_MOD_RRBS)
9211     {
9212       qp_changemask |= ~(valueT) 0xFFFF;
9213       if (strcmp (idesc->name, "clrrrb.pr") != 0)
9214         {
9215           for (i = 32; i < 32 + md.rot.num_regs; i++)
9216             gr_values[i].known = 0;
9217         }
9218       clear_qp_mutex (qp_changemask);
9219       clear_qp_implies (qp_changemask, qp_changemask);
9220     }
9221   /* After a call, all register values are undefined, except those marked
9222      as "safe".  */
9223   else if (strncmp (idesc->name, "br.call", 6) == 0
9224            || strncmp (idesc->name, "brl.call", 7) == 0)
9225     {
9226       /* FIXME keep GR values which are marked as "safe_across_calls"  */
9227       clear_register_values ();
9228       clear_qp_mutex (~qp_safe_across_calls);
9229       clear_qp_implies (~qp_safe_across_calls, ~qp_safe_across_calls);
9230       clear_qp_branch_flag (~qp_safe_across_calls);
9231     }
9232   else if (is_interruption_or_rfi (idesc)
9233            || is_taken_branch (idesc))
9234     {
9235       clear_register_values ();
9236       clear_qp_mutex (~(valueT) 0);
9237       clear_qp_implies (~(valueT) 0, ~(valueT) 0);
9238     }
9239   /* Look for mutex and implies relations.  */
9240   else if ((idesc->operands[0] == IA64_OPND_P1
9241             || idesc->operands[0] == IA64_OPND_P2)
9242            && (idesc->operands[1] == IA64_OPND_P1
9243                || idesc->operands[1] == IA64_OPND_P2))
9244     {
9245       int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9246       int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9247       valueT p1mask = (p1 != 0) ? (valueT) 1 << p1 : 0;
9248       valueT p2mask = (p2 != 0) ? (valueT) 1 << p2 : 0;
9249
9250       /* If both PRs are PR0, we can't really do anything.  */
9251       if (p1 == 0 && p2 == 0)
9252         {
9253           if (md.debug_dv)
9254             fprintf (stderr, "  Ignoring PRs due to inclusion of p0\n");
9255         }
9256       /* In general, clear mutexes and implies which include P1 or P2,
9257          with the following exceptions.  */
9258       else if (has_suffix_p (idesc->name, ".or.andcm")
9259                || has_suffix_p (idesc->name, ".and.orcm"))
9260         {
9261           clear_qp_implies (p2mask, p1mask);
9262         }
9263       else if (has_suffix_p (idesc->name, ".andcm")
9264                || has_suffix_p (idesc->name, ".and"))
9265         {
9266           clear_qp_implies (0, p1mask | p2mask);
9267         }
9268       else if (has_suffix_p (idesc->name, ".orcm")
9269                || has_suffix_p (idesc->name, ".or"))
9270         {
9271           clear_qp_mutex (p1mask | p2mask);
9272           clear_qp_implies (p1mask | p2mask, 0);
9273         }
9274       else
9275         {
9276           int added = 0;
9277
9278           clear_qp_implies (p1mask | p2mask, p1mask | p2mask);
9279
9280           /* If one of the PRs is PR0, we call clear_qp_mutex.  */
9281           if (p1 == 0 || p2 == 0)
9282             clear_qp_mutex (p1mask | p2mask);
9283           else
9284             added = update_qp_mutex (p1mask | p2mask);
9285
9286           if (CURR_SLOT.qp_regno == 0
9287               || has_suffix_p (idesc->name, ".unc"))
9288             {
9289               if (added == 0 && p1 && p2)
9290                 add_qp_mutex (p1mask | p2mask);
9291               if (CURR_SLOT.qp_regno != 0)
9292                 {
9293                   if (p1)
9294                     add_qp_imply (p1, CURR_SLOT.qp_regno);
9295                   if (p2)
9296                     add_qp_imply (p2, CURR_SLOT.qp_regno);
9297                 }
9298             }
9299         }
9300     }
9301   /* Look for mov imm insns into GRs.  */
9302   else if (idesc->operands[0] == IA64_OPND_R1
9303            && (idesc->operands[1] == IA64_OPND_IMM22
9304                || idesc->operands[1] == IA64_OPND_IMMU64)
9305            && (strcmp (idesc->name, "mov") == 0
9306                || strcmp (idesc->name, "movl") == 0))
9307     {
9308       int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
9309       if (regno > 0 && regno < NELEMS (gr_values))
9310         {
9311           gr_values[regno].known = 1;
9312           gr_values[regno].value = CURR_SLOT.opnd[1].X_add_number;
9313           gr_values[regno].path = md.path;
9314           if (md.debug_dv)
9315             {
9316               fprintf (stderr, "  Know gr%d = ", regno);
9317               fprintf_vma (stderr, gr_values[regno].value);
9318               fputs ("\n", stderr);
9319             }
9320         }
9321     }
9322   else
9323     {
9324       clear_qp_mutex (qp_changemask);
9325       clear_qp_implies (qp_changemask, qp_changemask);
9326     }
9327 }
9328
9329 /* Return whether the given predicate registers are currently mutex.  */
9330
9331 static int
9332 qp_mutex (p1, p2, path)
9333      int p1;
9334      int p2;
9335      int path;
9336 {
9337   int i;
9338   valueT mask;
9339
9340   if (p1 != p2)
9341     {
9342       mask = ((valueT) 1 << p1) | (valueT) 1 << p2;
9343       for (i = 0; i < qp_mutexeslen; i++)
9344         {
9345           if (qp_mutexes[i].path >= path
9346               && (qp_mutexes[i].prmask & mask) == mask)
9347             return 1;
9348         }
9349     }
9350   return 0;
9351 }
9352
9353 /* Return whether the given resource is in the given insn's list of chks
9354    Return 1 if the conflict is absolutely determined, 2 if it's a potential
9355    conflict.  */
9356
9357 static int
9358 resources_match (rs, idesc, note, qp_regno, path)
9359      struct rsrc *rs;
9360      struct ia64_opcode *idesc;
9361      int note;
9362      int qp_regno;
9363      int path;
9364 {
9365   struct rsrc specs[MAX_SPECS];
9366   int count;
9367
9368   /* If the marked resource's qp_regno and the given qp_regno are mutex,
9369      we don't need to check.  One exception is note 11, which indicates that
9370      target predicates are written regardless of PR[qp].  */
9371   if (qp_mutex (rs->qp_regno, qp_regno, path)
9372       && note != 11)
9373     return 0;
9374
9375   count = specify_resource (rs->dependency, idesc, DV_CHK, specs, note, path);
9376   while (count-- > 0)
9377     {
9378       /* UNAT checking is a bit more specific than other resources */
9379       if (rs->dependency->specifier == IA64_RS_AR_UNAT
9380           && specs[count].mem_offset.hint
9381           && rs->mem_offset.hint)
9382         {
9383           if (rs->mem_offset.base == specs[count].mem_offset.base)
9384             {
9385               if (((rs->mem_offset.offset >> 3) & 0x3F) ==
9386                   ((specs[count].mem_offset.offset >> 3) & 0x3F))
9387                 return 1;
9388               else
9389                 continue;
9390             }
9391         }
9392
9393       /* Skip apparent PR write conflicts where both writes are an AND or both
9394          writes are an OR.  */
9395       if (rs->dependency->specifier == IA64_RS_PR
9396           || rs->dependency->specifier == IA64_RS_PRr
9397           || rs->dependency->specifier == IA64_RS_PR63)
9398         {
9399           if (specs[count].cmp_type != CMP_NONE
9400               && specs[count].cmp_type == rs->cmp_type)
9401             {
9402               if (md.debug_dv)
9403                 fprintf (stderr, "  %s on parallel compare allowed (PR%d)\n",
9404                          dv_mode[rs->dependency->mode],
9405                          rs->dependency->specifier != IA64_RS_PR63 ?
9406                          specs[count].index : 63);
9407               continue;
9408             }
9409           if (md.debug_dv)
9410             fprintf (stderr,
9411                      "  %s on parallel compare conflict %s vs %s on PR%d\n",
9412                      dv_mode[rs->dependency->mode],
9413                      dv_cmp_type[rs->cmp_type],
9414                      dv_cmp_type[specs[count].cmp_type],
9415                      rs->dependency->specifier != IA64_RS_PR63 ?
9416                      specs[count].index : 63);
9417
9418         }
9419
9420       /* If either resource is not specific, conservatively assume a conflict
9421        */
9422       if (!specs[count].specific || !rs->specific)
9423         return 2;
9424       else if (specs[count].index == rs->index)
9425         return 1;
9426     }
9427 #if 0
9428   if (md.debug_dv)
9429     fprintf (stderr, "  No %s conflicts\n", rs->dependency->name);
9430 #endif
9431
9432   return 0;
9433 }
9434
9435 /* Indicate an instruction group break; if INSERT_STOP is non-zero, then
9436    insert a stop to create the break.  Update all resource dependencies
9437    appropriately.  If QP_REGNO is non-zero, only apply the break to resources
9438    which use the same QP_REGNO and have the link_to_qp_branch flag set.
9439    If SAVE_CURRENT is non-zero, don't affect resources marked by the current
9440    instruction.  */
9441
9442 static void
9443 insn_group_break (insert_stop, qp_regno, save_current)
9444      int insert_stop;
9445      int qp_regno;
9446      int save_current;
9447 {
9448   int i;
9449
9450   if (insert_stop && md.num_slots_in_use > 0)
9451     PREV_SLOT.end_of_insn_group = 1;
9452
9453   if (md.debug_dv)
9454     {
9455       fprintf (stderr, "  Insn group break%s",
9456                (insert_stop ? " (w/stop)" : ""));
9457       if (qp_regno != 0)
9458         fprintf (stderr, " effective for QP=%d", qp_regno);
9459       fprintf (stderr, "\n");
9460     }
9461
9462   i = 0;
9463   while (i < regdepslen)
9464     {
9465       const struct ia64_dependency *dep = regdeps[i].dependency;
9466
9467       if (qp_regno != 0
9468           && regdeps[i].qp_regno != qp_regno)
9469         {
9470           ++i;
9471           continue;
9472         }
9473
9474       if (save_current
9475           && CURR_SLOT.src_file == regdeps[i].file
9476           && CURR_SLOT.src_line == regdeps[i].line)
9477         {
9478           ++i;
9479           continue;
9480         }
9481
9482       /* clear dependencies which are automatically cleared by a stop, or
9483          those that have reached the appropriate state of insn serialization */
9484       if (dep->semantics == IA64_DVS_IMPLIED
9485           || dep->semantics == IA64_DVS_IMPLIEDF
9486           || regdeps[i].insn_srlz == STATE_SRLZ)
9487         {
9488           print_dependency ("Removing", i);
9489           regdeps[i] = regdeps[--regdepslen];
9490         }
9491       else
9492         {
9493           if (dep->semantics == IA64_DVS_DATA
9494               || dep->semantics == IA64_DVS_INSTR
9495               || dep->semantics == IA64_DVS_SPECIFIC)
9496             {
9497               if (regdeps[i].insn_srlz == STATE_NONE)
9498                 regdeps[i].insn_srlz = STATE_STOP;
9499               if (regdeps[i].data_srlz == STATE_NONE)
9500                 regdeps[i].data_srlz = STATE_STOP;
9501             }
9502           ++i;
9503         }
9504     }
9505 }
9506
9507 /* Add the given resource usage spec to the list of active dependencies.  */
9508
9509 static void
9510 mark_resource (idesc, dep, spec, depind, path)
9511      struct ia64_opcode *idesc ATTRIBUTE_UNUSED;
9512      const struct ia64_dependency *dep ATTRIBUTE_UNUSED;
9513      struct rsrc *spec;
9514      int depind;
9515      int path;
9516 {
9517   if (regdepslen == regdepstotlen)
9518     {
9519       regdepstotlen += 20;
9520       regdeps = (struct rsrc *)
9521         xrealloc ((void *) regdeps,
9522                   regdepstotlen * sizeof (struct rsrc));
9523     }
9524
9525   regdeps[regdepslen] = *spec;
9526   regdeps[regdepslen].depind = depind;
9527   regdeps[regdepslen].path = path;
9528   regdeps[regdepslen].file = CURR_SLOT.src_file;
9529   regdeps[regdepslen].line = CURR_SLOT.src_line;
9530
9531   print_dependency ("Adding", regdepslen);
9532
9533   ++regdepslen;
9534 }
9535
9536 static void
9537 print_dependency (action, depind)
9538      const char *action;
9539      int depind;
9540 {
9541   if (md.debug_dv)
9542     {
9543       fprintf (stderr, "  %s %s '%s'",
9544                action, dv_mode[(regdeps[depind].dependency)->mode],
9545                (regdeps[depind].dependency)->name);
9546       if (regdeps[depind].specific && regdeps[depind].index != 0)
9547         fprintf (stderr, " (%d)", regdeps[depind].index);
9548       if (regdeps[depind].mem_offset.hint)
9549         {
9550           fputs (" ", stderr);
9551           fprintf_vma (stderr, regdeps[depind].mem_offset.base);
9552           fputs ("+", stderr);
9553           fprintf_vma (stderr, regdeps[depind].mem_offset.offset);
9554         }
9555       fprintf (stderr, "\n");
9556     }
9557 }
9558
9559 static void
9560 instruction_serialization ()
9561 {
9562   int i;
9563   if (md.debug_dv)
9564     fprintf (stderr, "  Instruction serialization\n");
9565   for (i = 0; i < regdepslen; i++)
9566     if (regdeps[i].insn_srlz == STATE_STOP)
9567       regdeps[i].insn_srlz = STATE_SRLZ;
9568 }
9569
9570 static void
9571 data_serialization ()
9572 {
9573   int i = 0;
9574   if (md.debug_dv)
9575     fprintf (stderr, "  Data serialization\n");
9576   while (i < regdepslen)
9577     {
9578       if (regdeps[i].data_srlz == STATE_STOP
9579           /* Note: as of 991210, all "other" dependencies are cleared by a
9580              data serialization.  This might change with new tables */
9581           || (regdeps[i].dependency)->semantics == IA64_DVS_OTHER)
9582         {
9583           print_dependency ("Removing", i);
9584           regdeps[i] = regdeps[--regdepslen];
9585         }
9586       else
9587         ++i;
9588     }
9589 }
9590
9591 /* Insert stops and serializations as needed to avoid DVs.  */
9592
9593 static void
9594 remove_marked_resource (rs)
9595      struct rsrc *rs;
9596 {
9597   switch (rs->dependency->semantics)
9598     {
9599     case IA64_DVS_SPECIFIC:
9600       if (md.debug_dv)
9601         fprintf (stderr, "Implementation-specific, assume worst case...\n");
9602       /* ...fall through...  */
9603     case IA64_DVS_INSTR:
9604       if (md.debug_dv)
9605         fprintf (stderr, "Inserting instr serialization\n");
9606       if (rs->insn_srlz < STATE_STOP)
9607         insn_group_break (1, 0, 0);
9608       if (rs->insn_srlz < STATE_SRLZ)
9609         {
9610           struct slot oldslot = CURR_SLOT;
9611           /* Manually jam a srlz.i insn into the stream */
9612           memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
9613           CURR_SLOT.idesc = ia64_find_opcode ("srlz.i");
9614           instruction_serialization ();
9615           md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9616           if (++md.num_slots_in_use >= NUM_SLOTS)
9617             emit_one_bundle ();
9618           CURR_SLOT = oldslot;
9619         }
9620       insn_group_break (1, 0, 0);
9621       break;
9622     case IA64_DVS_OTHER: /* as of rev2 (991220) of the DV tables, all
9623                             "other" types of DV are eliminated
9624                             by a data serialization */
9625     case IA64_DVS_DATA:
9626       if (md.debug_dv)
9627         fprintf (stderr, "Inserting data serialization\n");
9628       if (rs->data_srlz < STATE_STOP)
9629         insn_group_break (1, 0, 0);
9630       {
9631         struct slot oldslot = CURR_SLOT;
9632         /* Manually jam a srlz.d insn into the stream */
9633         memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
9634         CURR_SLOT.idesc = ia64_find_opcode ("srlz.d");
9635         data_serialization ();
9636         md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9637         if (++md.num_slots_in_use >= NUM_SLOTS)
9638           emit_one_bundle ();
9639         CURR_SLOT = oldslot;
9640       }
9641       break;
9642     case IA64_DVS_IMPLIED:
9643     case IA64_DVS_IMPLIEDF:
9644       if (md.debug_dv)
9645         fprintf (stderr, "Inserting stop\n");
9646       insn_group_break (1, 0, 0);
9647       break;
9648     default:
9649       break;
9650     }
9651 }
9652
9653 /* Check the resources used by the given opcode against the current dependency
9654    list.
9655
9656    The check is run once for each execution path encountered.  In this case,
9657    a unique execution path is the sequence of instructions following a code
9658    entry point, e.g. the following has three execution paths, one starting
9659    at L0, one at L1, and one at L2.
9660
9661    L0:     nop
9662    L1:     add
9663    L2:     add
9664    br.ret
9665 */
9666
9667 static void
9668 check_dependencies (idesc)
9669      struct ia64_opcode *idesc;
9670 {
9671   const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
9672   int path;
9673   int i;
9674
9675   /* Note that the number of marked resources may change within the
9676      loop if in auto mode.  */
9677   i = 0;
9678   while (i < regdepslen)
9679     {
9680       struct rsrc *rs = &regdeps[i];
9681       const struct ia64_dependency *dep = rs->dependency;
9682       int chkind;
9683       int note;
9684       int start_over = 0;
9685
9686       if (dep->semantics == IA64_DVS_NONE
9687           || (chkind = depends_on (rs->depind, idesc)) == -1)
9688         {
9689           ++i;
9690           continue;
9691         }
9692
9693       note = NOTE (opdeps->chks[chkind]);
9694
9695       /* Check this resource against each execution path seen thus far.  */
9696       for (path = 0; path <= md.path; path++)
9697         {
9698           int matchtype;
9699
9700           /* If the dependency wasn't on the path being checked, ignore it.  */
9701           if (rs->path < path)
9702             continue;
9703
9704           /* If the QP for this insn implies a QP which has branched, don't
9705              bother checking.  Ed. NOTE: I don't think this check is terribly
9706              useful; what's the point of generating code which will only be
9707              reached if its QP is zero?
9708              This code was specifically inserted to handle the following code,
9709              based on notes from Intel's DV checking code, where p1 implies p2.
9710
9711                   mov r4 = 2
9712              (p2) br.cond L
9713              (p1) mov r4 = 7
9714           */
9715           if (CURR_SLOT.qp_regno != 0)
9716             {
9717               int skip = 0;
9718               int implies;
9719               for (implies = 0; implies < qp_implieslen; implies++)
9720                 {
9721                   if (qp_implies[implies].path >= path
9722                       && qp_implies[implies].p1 == CURR_SLOT.qp_regno
9723                       && qp_implies[implies].p2_branched)
9724                     {
9725                       skip = 1;
9726                       break;
9727                     }
9728                 }
9729               if (skip)
9730                 continue;
9731             }
9732
9733           if ((matchtype = resources_match (rs, idesc, note,
9734                                             CURR_SLOT.qp_regno, path)) != 0)
9735             {
9736               char msg[1024];
9737               char pathmsg[256] = "";
9738               char indexmsg[256] = "";
9739               int certain = (matchtype == 1 && CURR_SLOT.qp_regno == 0);
9740
9741               if (path != 0)
9742                 sprintf (pathmsg, " when entry is at label '%s'",
9743                          md.entry_labels[path - 1]);
9744               if (rs->specific && rs->index != 0)
9745                 sprintf (indexmsg, ", specific resource number is %d",
9746                          rs->index);
9747               sprintf (msg, "Use of '%s' %s %s dependency '%s' (%s)%s%s",
9748                        idesc->name,
9749                        (certain ? "violates" : "may violate"),
9750                        dv_mode[dep->mode], dep->name,
9751                        dv_sem[dep->semantics],
9752                        pathmsg, indexmsg);
9753
9754               if (md.explicit_mode)
9755                 {
9756                   as_warn ("%s", msg);
9757                   if (path < md.path)
9758                     as_warn (_("Only the first path encountering the conflict "
9759                                "is reported"));
9760                   as_warn_where (rs->file, rs->line,
9761                                  _("This is the location of the "
9762                                    "conflicting usage"));
9763                   /* Don't bother checking other paths, to avoid duplicating
9764                      the same warning */
9765                   break;
9766                 }
9767               else
9768                 {
9769                   if (md.debug_dv)
9770                     fprintf (stderr, "%s @ %s:%d\n", msg, rs->file, rs->line);
9771
9772                   remove_marked_resource (rs);
9773
9774                   /* since the set of dependencies has changed, start over */
9775                   /* FIXME -- since we're removing dvs as we go, we
9776                      probably don't really need to start over...  */
9777                   start_over = 1;
9778                   break;
9779                 }
9780             }
9781         }
9782       if (start_over)
9783         i = 0;
9784       else
9785         ++i;
9786     }
9787 }
9788
9789 /* Register new dependencies based on the given opcode.  */
9790
9791 static void
9792 mark_resources (idesc)
9793      struct ia64_opcode *idesc;
9794 {
9795   int i;
9796   const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
9797   int add_only_qp_reads = 0;
9798
9799   /* A conditional branch only uses its resources if it is taken; if it is
9800      taken, we stop following that path.  The other branch types effectively
9801      *always* write their resources.  If it's not taken, register only QP
9802      reads.  */
9803   if (is_conditional_branch (idesc) || is_interruption_or_rfi (idesc))
9804     {
9805       add_only_qp_reads = 1;
9806     }
9807
9808   if (md.debug_dv)
9809     fprintf (stderr, "Registering '%s' resource usage\n", idesc->name);
9810
9811   for (i = 0; i < opdeps->nregs; i++)
9812     {
9813       const struct ia64_dependency *dep;
9814       struct rsrc specs[MAX_SPECS];
9815       int note;
9816       int path;
9817       int count;
9818
9819       dep = ia64_find_dependency (opdeps->regs[i]);
9820       note = NOTE (opdeps->regs[i]);
9821
9822       if (add_only_qp_reads
9823           && !(dep->mode == IA64_DV_WAR
9824                && (dep->specifier == IA64_RS_PR
9825                    || dep->specifier == IA64_RS_PRr
9826                    || dep->specifier == IA64_RS_PR63)))
9827         continue;
9828
9829       count = specify_resource (dep, idesc, DV_REG, specs, note, md.path);
9830
9831 #if 0
9832       if (md.debug_dv && !count)
9833         fprintf (stderr, "  No %s %s usage found (path %d)\n",
9834                  dv_mode[dep->mode], dep->name, md.path);
9835 #endif
9836
9837       while (count-- > 0)
9838         {
9839           mark_resource (idesc, dep, &specs[count],
9840                          DEP (opdeps->regs[i]), md.path);
9841         }
9842
9843       /* The execution path may affect register values, which may in turn
9844          affect which indirect-access resources are accessed.  */
9845       switch (dep->specifier)
9846         {
9847         default:
9848           break;
9849         case IA64_RS_CPUID:
9850         case IA64_RS_DBR:
9851         case IA64_RS_IBR:
9852         case IA64_RS_MSR:
9853         case IA64_RS_PKR:
9854         case IA64_RS_PMC:
9855         case IA64_RS_PMD:
9856         case IA64_RS_RR:
9857           for (path = 0; path < md.path; path++)
9858             {
9859               count = specify_resource (dep, idesc, DV_REG, specs, note, path);
9860               while (count-- > 0)
9861                 mark_resource (idesc, dep, &specs[count],
9862                                DEP (opdeps->regs[i]), path);
9863             }
9864           break;
9865         }
9866     }
9867 }
9868
9869 /* Remove dependencies when they no longer apply.  */
9870
9871 static void
9872 update_dependencies (idesc)
9873      struct ia64_opcode *idesc;
9874 {
9875   int i;
9876
9877   if (strcmp (idesc->name, "srlz.i") == 0)
9878     {
9879       instruction_serialization ();
9880     }
9881   else if (strcmp (idesc->name, "srlz.d") == 0)
9882     {
9883       data_serialization ();
9884     }
9885   else if (is_interruption_or_rfi (idesc)
9886            || is_taken_branch (idesc))
9887     {
9888       /* Although technically the taken branch doesn't clear dependencies
9889          which require a srlz.[id], we don't follow the branch; the next
9890          instruction is assumed to start with a clean slate.  */
9891       regdepslen = 0;
9892       md.path = 0;
9893     }
9894   else if (is_conditional_branch (idesc)
9895            && CURR_SLOT.qp_regno != 0)
9896     {
9897       int is_call = strstr (idesc->name, ".call") != NULL;
9898
9899       for (i = 0; i < qp_implieslen; i++)
9900         {
9901           /* If the conditional branch's predicate is implied by the predicate
9902              in an existing dependency, remove that dependency.  */
9903           if (qp_implies[i].p2 == CURR_SLOT.qp_regno)
9904             {
9905               int depind = 0;
9906               /* Note that this implied predicate takes a branch so that if
9907                  a later insn generates a DV but its predicate implies this
9908                  one, we can avoid the false DV warning.  */
9909               qp_implies[i].p2_branched = 1;
9910               while (depind < regdepslen)
9911                 {
9912                   if (regdeps[depind].qp_regno == qp_implies[i].p1)
9913                     {
9914                       print_dependency ("Removing", depind);
9915                       regdeps[depind] = regdeps[--regdepslen];
9916                     }
9917                   else
9918                     ++depind;
9919                 }
9920             }
9921         }
9922       /* Any marked resources which have this same predicate should be
9923          cleared, provided that the QP hasn't been modified between the
9924          marking instruction and the branch.  */
9925       if (is_call)
9926         {
9927           insn_group_break (0, CURR_SLOT.qp_regno, 1);
9928         }
9929       else
9930         {
9931           i = 0;
9932           while (i < regdepslen)
9933             {
9934               if (regdeps[i].qp_regno == CURR_SLOT.qp_regno
9935                   && regdeps[i].link_to_qp_branch
9936                   && (regdeps[i].file != CURR_SLOT.src_file
9937                       || regdeps[i].line != CURR_SLOT.src_line))
9938                 {
9939                   /* Treat like a taken branch */
9940                   print_dependency ("Removing", i);
9941                   regdeps[i] = regdeps[--regdepslen];
9942                 }
9943               else
9944                 ++i;
9945             }
9946         }
9947     }
9948 }
9949
9950 /* Examine the current instruction for dependency violations.  */
9951
9952 static int
9953 check_dv (idesc)
9954      struct ia64_opcode *idesc;
9955 {
9956   if (md.debug_dv)
9957     {
9958       fprintf (stderr, "Checking %s for violations (line %d, %d/%d)\n",
9959                idesc->name, CURR_SLOT.src_line,
9960                idesc->dependencies->nchks,
9961                idesc->dependencies->nregs);
9962     }
9963
9964   /* Look through the list of currently marked resources; if the current
9965      instruction has the dependency in its chks list which uses that resource,
9966      check against the specific resources used.  */
9967   check_dependencies (idesc);
9968
9969   /* Look up the instruction's regdeps (RAW writes, WAW writes, and WAR reads),
9970      then add them to the list of marked resources.  */
9971   mark_resources (idesc);
9972
9973   /* There are several types of dependency semantics, and each has its own
9974      requirements for being cleared
9975
9976      Instruction serialization (insns separated by interruption, rfi, or
9977      writer + srlz.i + reader, all in separate groups) clears DVS_INSTR.
9978
9979      Data serialization (instruction serialization, or writer + srlz.d +
9980      reader, where writer and srlz.d are in separate groups) clears
9981      DVS_DATA. (This also clears DVS_OTHER, but that is not guaranteed to
9982      always be the case).
9983
9984      Instruction group break (groups separated by stop, taken branch,
9985      interruption or rfi) clears DVS_IMPLIED and DVS_IMPLIEDF.
9986    */
9987   update_dependencies (idesc);
9988
9989   /* Sometimes, knowing a register value allows us to avoid giving a false DV
9990      warning.  Keep track of as many as possible that are useful.  */
9991   note_register_values (idesc);
9992
9993   /* We don't need or want this anymore.  */
9994   md.mem_offset.hint = 0;
9995
9996   return 0;
9997 }
9998
9999 /* Translate one line of assembly.  Pseudo ops and labels do not show
10000    here.  */
10001 void
10002 md_assemble (str)
10003      char *str;
10004 {
10005   char *saved_input_line_pointer, *mnemonic;
10006   const struct pseudo_opcode *pdesc;
10007   struct ia64_opcode *idesc;
10008   unsigned char qp_regno;
10009   unsigned int flags;
10010   int ch;
10011
10012   saved_input_line_pointer = input_line_pointer;
10013   input_line_pointer = str;
10014
10015   /* extract the opcode (mnemonic):  */
10016
10017   mnemonic = input_line_pointer;
10018   ch = get_symbol_end ();
10019   pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
10020   if (pdesc)
10021     {
10022       *input_line_pointer = ch;
10023       (*pdesc->handler) (pdesc->arg);
10024       goto done;
10025     }
10026
10027   /* Find the instruction descriptor matching the arguments.  */
10028
10029   idesc = ia64_find_opcode (mnemonic);
10030   *input_line_pointer = ch;
10031   if (!idesc)
10032     {
10033       as_bad ("Unknown opcode `%s'", mnemonic);
10034       goto done;
10035     }
10036
10037   idesc = parse_operands (idesc);
10038   if (!idesc)
10039     goto done;
10040
10041   /* Handle the dynamic ops we can handle now:  */
10042   if (idesc->type == IA64_TYPE_DYN)
10043     {
10044       if (strcmp (idesc->name, "add") == 0)
10045         {
10046           if (CURR_SLOT.opnd[2].X_op == O_register
10047               && CURR_SLOT.opnd[2].X_add_number < 4)
10048             mnemonic = "addl";
10049           else
10050             mnemonic = "adds";
10051           ia64_free_opcode (idesc);
10052           idesc = ia64_find_opcode (mnemonic);
10053 #if 0
10054           know (!idesc->next);
10055 #endif
10056         }
10057       else if (strcmp (idesc->name, "mov") == 0)
10058         {
10059           enum ia64_opnd opnd1, opnd2;
10060           int rop;
10061
10062           opnd1 = idesc->operands[0];
10063           opnd2 = idesc->operands[1];
10064           if (opnd1 == IA64_OPND_AR3)
10065             rop = 0;
10066           else if (opnd2 == IA64_OPND_AR3)
10067             rop = 1;
10068           else
10069             abort ();
10070           if (CURR_SLOT.opnd[rop].X_op == O_register)
10071             {
10072               if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10073                 mnemonic = "mov.i";
10074               else
10075                 mnemonic = "mov.m";
10076             }
10077           else
10078             abort ();
10079           ia64_free_opcode (idesc);
10080           idesc = ia64_find_opcode (mnemonic);
10081           while (idesc != NULL
10082                  && (idesc->operands[0] != opnd1
10083                      || idesc->operands[1] != opnd2))
10084             idesc = get_next_opcode (idesc);
10085         }
10086     }
10087   else if (strcmp (idesc->name, "mov.i") == 0
10088            || strcmp (idesc->name, "mov.m") == 0)
10089     {
10090       enum ia64_opnd opnd1, opnd2;
10091       int rop;
10092       
10093       opnd1 = idesc->operands[0];
10094       opnd2 = idesc->operands[1];
10095       if (opnd1 == IA64_OPND_AR3)
10096         rop = 0;
10097       else if (opnd2 == IA64_OPND_AR3)
10098         rop = 1;
10099       else
10100         abort ();
10101       if (CURR_SLOT.opnd[rop].X_op == O_register)
10102         {
10103           char unit = 'a';
10104           if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10105             unit = 'i';
10106           else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10107             unit = 'm';
10108           if (unit != 'a' && unit != idesc->name [4])
10109             as_bad ("AR %d cannot be accessed by %c-unit",
10110                     (int) (CURR_SLOT.opnd[rop].X_add_number - REG_AR),
10111                     TOUPPER (unit));
10112         }
10113     }
10114
10115   qp_regno = 0;
10116   if (md.qp.X_op == O_register)
10117     {
10118       qp_regno = md.qp.X_add_number - REG_P;
10119       md.qp.X_op = O_absent;
10120     }
10121
10122   flags = idesc->flags;
10123
10124   if ((flags & IA64_OPCODE_FIRST) != 0)
10125     {
10126       /* The alignment frag has to end with a stop bit only if the
10127          next instruction after the alignment directive has to be
10128          the first instruction in an instruction group.  */
10129       if (align_frag)
10130         {
10131           while (align_frag->fr_type != rs_align_code)
10132             {
10133               align_frag = align_frag->fr_next;
10134               if (!align_frag)
10135                 break;
10136             }
10137           /* align_frag can be NULL if there are directives in
10138              between.  */
10139           if (align_frag && align_frag->fr_next == frag_now)
10140             align_frag->tc_frag_data = 1;
10141         }
10142
10143       insn_group_break (1, 0, 0);
10144     }
10145   align_frag = NULL;
10146
10147   if ((flags & IA64_OPCODE_NO_PRED) != 0 && qp_regno != 0)
10148     {
10149       as_bad ("`%s' cannot be predicated", idesc->name);
10150       goto done;
10151     }
10152
10153   /* Build the instruction.  */
10154   CURR_SLOT.qp_regno = qp_regno;
10155   CURR_SLOT.idesc = idesc;
10156   as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
10157   dwarf2_where (&CURR_SLOT.debug_line);
10158
10159   /* Add unwind entry, if there is one.  */
10160   if (unwind.current_entry)
10161     {
10162       CURR_SLOT.unwind_record = unwind.current_entry;
10163       unwind.current_entry = NULL;
10164     }
10165
10166   /* Check for dependency violations.  */
10167   if (md.detect_dv)
10168     check_dv (idesc);
10169
10170   md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
10171   if (++md.num_slots_in_use >= NUM_SLOTS)
10172     emit_one_bundle ();
10173
10174   if ((flags & IA64_OPCODE_LAST) != 0)
10175     insn_group_break (1, 0, 0);
10176
10177   md.last_text_seg = now_seg;
10178
10179  done:
10180   input_line_pointer = saved_input_line_pointer;
10181 }
10182
10183 /* Called when symbol NAME cannot be found in the symbol table.
10184    Should be used for dynamic valued symbols only.  */
10185
10186 symbolS *
10187 md_undefined_symbol (name)
10188      char *name ATTRIBUTE_UNUSED;
10189 {
10190   return 0;
10191 }
10192
10193 /* Called for any expression that can not be recognized.  When the
10194    function is called, `input_line_pointer' will point to the start of
10195    the expression.  */
10196
10197 void
10198 md_operand (e)
10199      expressionS *e;
10200 {
10201   enum pseudo_type pseudo_type;
10202   const char *name;
10203   size_t len;
10204   int ch, i;
10205
10206   switch (*input_line_pointer)
10207     {
10208     case '@':
10209       /* Find what relocation pseudo-function we're dealing with.  */
10210       pseudo_type = 0;
10211       ch = *++input_line_pointer;
10212       for (i = 0; i < NELEMS (pseudo_func); ++i)
10213         if (pseudo_func[i].name && pseudo_func[i].name[0] == ch)
10214           {
10215             len = strlen (pseudo_func[i].name);
10216             if (strncmp (pseudo_func[i].name + 1,
10217                          input_line_pointer + 1, len - 1) == 0
10218                 && !is_part_of_name (input_line_pointer[len]))
10219               {
10220                 input_line_pointer += len;
10221                 pseudo_type = pseudo_func[i].type;
10222                 break;
10223               }
10224           }
10225       switch (pseudo_type)
10226         {
10227         case PSEUDO_FUNC_RELOC:
10228           SKIP_WHITESPACE ();
10229           if (*input_line_pointer != '(')
10230             {
10231               as_bad ("Expected '('");
10232               goto err;
10233             }
10234           /* Skip '('.  */
10235           ++input_line_pointer;
10236           expression (e);
10237           if (*input_line_pointer++ != ')')
10238             {
10239               as_bad ("Missing ')'");
10240               goto err;
10241             }
10242           if (e->X_op != O_symbol)
10243             {
10244               if (e->X_op != O_pseudo_fixup)
10245                 {
10246                   as_bad ("Not a symbolic expression");
10247                   goto err;
10248                 }
10249               if (i != FUNC_LT_RELATIVE)
10250                 {
10251                   as_bad ("Illegal combination of relocation functions");
10252                   goto err;
10253                 }
10254               switch (S_GET_VALUE (e->X_op_symbol))
10255                 {
10256                 case FUNC_FPTR_RELATIVE:
10257                   i = FUNC_LT_FPTR_RELATIVE; break;
10258                 case FUNC_DTP_MODULE:
10259                   i = FUNC_LT_DTP_MODULE; break;
10260                 case FUNC_DTP_RELATIVE:
10261                   i = FUNC_LT_DTP_RELATIVE; break;
10262                 case FUNC_TP_RELATIVE:
10263                   i = FUNC_LT_TP_RELATIVE; break;
10264                 default:
10265                   as_bad ("Illegal combination of relocation functions");
10266                   goto err;
10267                 }
10268             }
10269           /* Make sure gas doesn't get rid of local symbols that are used
10270              in relocs.  */
10271           e->X_op = O_pseudo_fixup;
10272           e->X_op_symbol = pseudo_func[i].u.sym;
10273           break;
10274
10275         case PSEUDO_FUNC_CONST:
10276           e->X_op = O_constant;
10277           e->X_add_number = pseudo_func[i].u.ival;
10278           break;
10279
10280         case PSEUDO_FUNC_REG:
10281           e->X_op = O_register;
10282           e->X_add_number = pseudo_func[i].u.ival;
10283           break;
10284
10285         default:
10286           name = input_line_pointer - 1;
10287           get_symbol_end ();
10288           as_bad ("Unknown pseudo function `%s'", name);
10289           goto err;
10290         }
10291       break;
10292
10293     case '[':
10294       ++input_line_pointer;
10295       expression (e);
10296       if (*input_line_pointer != ']')
10297         {
10298           as_bad ("Closing bracket misssing");
10299           goto err;
10300         }
10301       else
10302         {
10303           if (e->X_op != O_register)
10304             as_bad ("Register expected as index");
10305
10306           ++input_line_pointer;
10307           e->X_op = O_index;
10308         }
10309       break;
10310
10311     default:
10312       break;
10313     }
10314   return;
10315
10316  err:
10317   ignore_rest_of_line ();
10318 }
10319
10320 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
10321    a section symbol plus some offset.  For relocs involving @fptr(),
10322    directives we don't want such adjustments since we need to have the
10323    original symbol's name in the reloc.  */
10324 int
10325 ia64_fix_adjustable (fix)
10326      fixS *fix;
10327 {
10328   /* Prevent all adjustments to global symbols */
10329   if (S_IS_EXTERN (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
10330     return 0;
10331
10332   switch (fix->fx_r_type)
10333     {
10334     case BFD_RELOC_IA64_FPTR64I:
10335     case BFD_RELOC_IA64_FPTR32MSB:
10336     case BFD_RELOC_IA64_FPTR32LSB:
10337     case BFD_RELOC_IA64_FPTR64MSB:
10338     case BFD_RELOC_IA64_FPTR64LSB:
10339     case BFD_RELOC_IA64_LTOFF_FPTR22:
10340     case BFD_RELOC_IA64_LTOFF_FPTR64I:
10341       return 0;
10342     default:
10343       break;
10344     }
10345
10346   return 1;
10347 }
10348
10349 int
10350 ia64_force_relocation (fix)
10351      fixS *fix;
10352 {
10353   switch (fix->fx_r_type)
10354     {
10355     case BFD_RELOC_IA64_FPTR64I:
10356     case BFD_RELOC_IA64_FPTR32MSB:
10357     case BFD_RELOC_IA64_FPTR32LSB:
10358     case BFD_RELOC_IA64_FPTR64MSB:
10359     case BFD_RELOC_IA64_FPTR64LSB:
10360
10361     case BFD_RELOC_IA64_LTOFF22:
10362     case BFD_RELOC_IA64_LTOFF64I:
10363     case BFD_RELOC_IA64_LTOFF_FPTR22:
10364     case BFD_RELOC_IA64_LTOFF_FPTR64I:
10365     case BFD_RELOC_IA64_PLTOFF22:
10366     case BFD_RELOC_IA64_PLTOFF64I:
10367     case BFD_RELOC_IA64_PLTOFF64MSB:
10368     case BFD_RELOC_IA64_PLTOFF64LSB:
10369
10370     case BFD_RELOC_IA64_LTOFF22X:
10371     case BFD_RELOC_IA64_LDXMOV:
10372       return 1;
10373
10374     default:
10375       break;
10376     }
10377
10378   return generic_force_reloc (fix);
10379 }
10380
10381 /* Decide from what point a pc-relative relocation is relative to,
10382    relative to the pc-relative fixup.  Er, relatively speaking.  */
10383 long
10384 ia64_pcrel_from_section (fix, sec)
10385      fixS *fix;
10386      segT sec;
10387 {
10388   unsigned long off = fix->fx_frag->fr_address + fix->fx_where;
10389
10390   if (bfd_get_section_flags (stdoutput, sec) & SEC_CODE)
10391     off &= ~0xfUL;
10392
10393   return off;
10394 }
10395
10396
10397 /* Used to emit section-relative relocs for the dwarf2 debug data.  */
10398 void
10399 ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
10400 {
10401   expressionS expr;
10402
10403   expr.X_op = O_pseudo_fixup;
10404   expr.X_op_symbol = pseudo_func[FUNC_SEC_RELATIVE].u.sym;
10405   expr.X_add_number = 0;
10406   expr.X_add_symbol = symbol;
10407   emit_expr (&expr, size);
10408 }
10409
10410 /* This is called whenever some data item (not an instruction) needs a
10411    fixup.  We pick the right reloc code depending on the byteorder
10412    currently in effect.  */
10413 void
10414 ia64_cons_fix_new (f, where, nbytes, exp)
10415      fragS *f;
10416      int where;
10417      int nbytes;
10418      expressionS *exp;
10419 {
10420   bfd_reloc_code_real_type code;
10421   fixS *fix;
10422
10423   switch (nbytes)
10424     {
10425       /* There are no reloc for 8 and 16 bit quantities, but we allow
10426          them here since they will work fine as long as the expression
10427          is fully defined at the end of the pass over the source file.  */
10428     case 1: code = BFD_RELOC_8; break;
10429     case 2: code = BFD_RELOC_16; break;
10430     case 4:
10431       if (target_big_endian)
10432         code = BFD_RELOC_IA64_DIR32MSB;
10433       else
10434         code = BFD_RELOC_IA64_DIR32LSB;
10435       break;
10436
10437     case 8:
10438       /* In 32-bit mode, data8 could mean function descriptors too.  */
10439       if (exp->X_op == O_pseudo_fixup
10440           && exp->X_op_symbol
10441           && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC
10442           && !(md.flags & EF_IA_64_ABI64))
10443         {
10444           if (target_big_endian)
10445             code = BFD_RELOC_IA64_IPLTMSB;
10446           else
10447             code = BFD_RELOC_IA64_IPLTLSB;
10448           exp->X_op = O_symbol;
10449           break;
10450         }
10451       else
10452         {
10453           if (target_big_endian)
10454             code = BFD_RELOC_IA64_DIR64MSB;
10455           else
10456             code = BFD_RELOC_IA64_DIR64LSB;
10457           break;
10458         }
10459
10460     case 16:
10461       if (exp->X_op == O_pseudo_fixup
10462           && exp->X_op_symbol
10463           && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC)
10464         {
10465           if (target_big_endian)
10466             code = BFD_RELOC_IA64_IPLTMSB;
10467           else
10468             code = BFD_RELOC_IA64_IPLTLSB;
10469           exp->X_op = O_symbol;
10470           break;
10471         }
10472       /* FALLTHRU */
10473
10474     default:
10475       as_bad ("Unsupported fixup size %d", nbytes);
10476       ignore_rest_of_line ();
10477       return;
10478     }
10479
10480   if (exp->X_op == O_pseudo_fixup)
10481     {
10482       exp->X_op = O_symbol;
10483       code = ia64_gen_real_reloc_type (exp->X_op_symbol, code);
10484       /* ??? If code unchanged, unsupported.  */
10485     }
10486
10487   fix = fix_new_exp (f, where, nbytes, exp, 0, code);
10488   /* We need to store the byte order in effect in case we're going
10489      to fix an 8 or 16 bit relocation (for which there no real
10490      relocs available).  See md_apply_fix3().  */
10491   fix->tc_fix_data.bigendian = target_big_endian;
10492 }
10493
10494 /* Return the actual relocation we wish to associate with the pseudo
10495    reloc described by SYM and R_TYPE.  SYM should be one of the
10496    symbols in the pseudo_func array, or NULL.  */
10497
10498 static bfd_reloc_code_real_type
10499 ia64_gen_real_reloc_type (sym, r_type)
10500      struct symbol *sym;
10501      bfd_reloc_code_real_type r_type;
10502 {
10503   bfd_reloc_code_real_type new = 0;
10504
10505   if (sym == NULL)
10506     {
10507       return r_type;
10508     }
10509
10510   switch (S_GET_VALUE (sym))
10511     {
10512     case FUNC_FPTR_RELATIVE:
10513       switch (r_type)
10514         {
10515         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_FPTR64I; break;
10516         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_FPTR32MSB; break;
10517         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_FPTR32LSB; break;
10518         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_FPTR64MSB; break;
10519         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_FPTR64LSB; break;
10520         default:                        break;
10521         }
10522       break;
10523
10524     case FUNC_GP_RELATIVE:
10525       switch (r_type)
10526         {
10527         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_GPREL22; break;
10528         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_GPREL64I; break;
10529         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_GPREL32MSB; break;
10530         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_GPREL32LSB; break;
10531         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_GPREL64MSB; break;
10532         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_GPREL64LSB; break;
10533         default:                        break;
10534         }
10535       break;
10536
10537     case FUNC_LT_RELATIVE:
10538       switch (r_type)
10539         {
10540         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_LTOFF22; break;
10541         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_LTOFF64I; break;
10542         default:                        break;
10543         }
10544       break;
10545
10546     case FUNC_LT_RELATIVE_X:
10547       switch (r_type)
10548         {
10549         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_LTOFF22X; break;
10550         default:                        break;
10551         }
10552       break;
10553
10554     case FUNC_PC_RELATIVE:
10555       switch (r_type)
10556         {
10557         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_PCREL22; break;
10558         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_PCREL64I; break;
10559         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_PCREL32MSB; break;
10560         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_PCREL32LSB; break;
10561         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_PCREL64MSB; break;
10562         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_PCREL64LSB; break;
10563         default:                        break;
10564         }
10565       break;
10566
10567     case FUNC_PLT_RELATIVE:
10568       switch (r_type)
10569         {
10570         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_PLTOFF22; break;
10571         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_PLTOFF64I; break;
10572         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_PLTOFF64MSB;break;
10573         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_PLTOFF64LSB;break;
10574         default:                        break;
10575         }
10576       break;
10577
10578     case FUNC_SEC_RELATIVE:
10579       switch (r_type)
10580         {
10581         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_SECREL32MSB;break;
10582         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_SECREL32LSB;break;
10583         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_SECREL64MSB;break;
10584         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_SECREL64LSB;break;
10585         default:                        break;
10586         }
10587       break;
10588
10589     case FUNC_SEG_RELATIVE:
10590       switch (r_type)
10591         {
10592         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_SEGREL32MSB;break;
10593         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_SEGREL32LSB;break;
10594         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_SEGREL64MSB;break;
10595         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_SEGREL64LSB;break;
10596         default:                        break;
10597         }
10598       break;
10599
10600     case FUNC_LTV_RELATIVE:
10601       switch (r_type)
10602         {
10603         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_LTV32MSB; break;
10604         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_LTV32LSB; break;
10605         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_LTV64MSB; break;
10606         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_LTV64LSB; break;
10607         default:                        break;
10608         }
10609       break;
10610
10611     case FUNC_LT_FPTR_RELATIVE:
10612       switch (r_type)
10613         {
10614         case BFD_RELOC_IA64_IMM22:
10615           new = BFD_RELOC_IA64_LTOFF_FPTR22; break;
10616         case BFD_RELOC_IA64_IMM64:
10617           new = BFD_RELOC_IA64_LTOFF_FPTR64I; break;
10618         default:
10619           break;
10620         }
10621       break;
10622
10623     case FUNC_TP_RELATIVE:
10624       switch (r_type)
10625         {
10626         case BFD_RELOC_IA64_IMM14:
10627           new = BFD_RELOC_IA64_TPREL14; break;
10628         case BFD_RELOC_IA64_IMM22:
10629           new = BFD_RELOC_IA64_TPREL22; break;
10630         case BFD_RELOC_IA64_IMM64:
10631           new = BFD_RELOC_IA64_TPREL64I; break;
10632         default:
10633           break;
10634         }
10635       break;
10636
10637     case FUNC_LT_TP_RELATIVE:
10638       switch (r_type)
10639         {
10640         case BFD_RELOC_IA64_IMM22:
10641           new = BFD_RELOC_IA64_LTOFF_TPREL22; break;
10642         default:
10643           break;
10644         }
10645       break;
10646
10647     case FUNC_LT_DTP_MODULE:
10648       switch (r_type)
10649         {
10650         case BFD_RELOC_IA64_IMM22:
10651           new = BFD_RELOC_IA64_LTOFF_DTPMOD22; break;
10652         default:
10653           break;
10654         }
10655       break;
10656
10657     case FUNC_DTP_RELATIVE:
10658       switch (r_type)
10659         {
10660         case BFD_RELOC_IA64_DIR64MSB:
10661           new = BFD_RELOC_IA64_DTPREL64MSB; break;
10662         case BFD_RELOC_IA64_DIR64LSB:
10663           new = BFD_RELOC_IA64_DTPREL64LSB; break;
10664         case BFD_RELOC_IA64_IMM14:
10665           new = BFD_RELOC_IA64_DTPREL14; break;
10666         case BFD_RELOC_IA64_IMM22:
10667           new = BFD_RELOC_IA64_DTPREL22; break;
10668         case BFD_RELOC_IA64_IMM64:
10669           new = BFD_RELOC_IA64_DTPREL64I; break;
10670         default:
10671           break;
10672         }
10673       break;
10674
10675     case FUNC_LT_DTP_RELATIVE:
10676       switch (r_type)
10677         {
10678         case BFD_RELOC_IA64_IMM22:
10679           new = BFD_RELOC_IA64_LTOFF_DTPREL22; break;
10680         default:
10681           break;
10682         }
10683       break;
10684
10685     case FUNC_IPLT_RELOC:
10686       break;
10687
10688     default:
10689       abort ();
10690     }
10691
10692   /* Hmmmm.  Should this ever occur?  */
10693   if (new)
10694     return new;
10695   else
10696     return r_type;
10697 }
10698
10699 /* Here is where generate the appropriate reloc for pseudo relocation
10700    functions.  */
10701 void
10702 ia64_validate_fix (fix)
10703      fixS *fix;
10704 {
10705   switch (fix->fx_r_type)
10706     {
10707     case BFD_RELOC_IA64_FPTR64I:
10708     case BFD_RELOC_IA64_FPTR32MSB:
10709     case BFD_RELOC_IA64_FPTR64LSB:
10710     case BFD_RELOC_IA64_LTOFF_FPTR22:
10711     case BFD_RELOC_IA64_LTOFF_FPTR64I:
10712       if (fix->fx_offset != 0)
10713         as_bad_where (fix->fx_file, fix->fx_line,
10714                       "No addend allowed in @fptr() relocation");
10715       break;
10716     default:
10717       break;
10718     }
10719 }
10720
10721 static void
10722 fix_insn (fix, odesc, value)
10723      fixS *fix;
10724      const struct ia64_operand *odesc;
10725      valueT value;
10726 {
10727   bfd_vma insn[3], t0, t1, control_bits;
10728   const char *err;
10729   char *fixpos;
10730   long slot;
10731
10732   slot = fix->fx_where & 0x3;
10733   fixpos = fix->fx_frag->fr_literal + (fix->fx_where - slot);
10734
10735   /* Bundles are always in little-endian byte order */
10736   t0 = bfd_getl64 (fixpos);
10737   t1 = bfd_getl64 (fixpos + 8);
10738   control_bits = t0 & 0x1f;
10739   insn[0] = (t0 >>  5) & 0x1ffffffffffLL;
10740   insn[1] = ((t0 >> 46) & 0x3ffff) | ((t1 & 0x7fffff) << 18);
10741   insn[2] = (t1 >> 23) & 0x1ffffffffffLL;
10742
10743   err = NULL;
10744   if (odesc - elf64_ia64_operands == IA64_OPND_IMMU64)
10745     {
10746       insn[1] = (value >> 22) & 0x1ffffffffffLL;
10747       insn[2] |= (((value & 0x7f) << 13)
10748                   | (((value >> 7) & 0x1ff) << 27)
10749                   | (((value >> 16) & 0x1f) << 22)
10750                   | (((value >> 21) & 0x1) << 21)
10751                   | (((value >> 63) & 0x1) << 36));
10752     }
10753   else if (odesc - elf64_ia64_operands == IA64_OPND_IMMU62)
10754     {
10755       if (value & ~0x3fffffffffffffffULL)
10756         err = "integer operand out of range";
10757       insn[1] = (value >> 21) & 0x1ffffffffffLL;
10758       insn[2] |= (((value & 0xfffff) << 6) | (((value >> 20) & 0x1) << 36));
10759     }
10760   else if (odesc - elf64_ia64_operands == IA64_OPND_TGT64)
10761     {
10762       value >>= 4;
10763       insn[1] = ((value >> 20) & 0x7fffffffffLL) << 2;
10764       insn[2] |= ((((value >> 59) & 0x1) << 36)
10765                   | (((value >> 0) & 0xfffff) << 13));
10766     }
10767   else
10768     err = (*odesc->insert) (odesc, value, insn + slot);
10769
10770   if (err)
10771     as_bad_where (fix->fx_file, fix->fx_line, err);
10772
10773   t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
10774   t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
10775   number_to_chars_littleendian (fixpos + 0, t0, 8);
10776   number_to_chars_littleendian (fixpos + 8, t1, 8);
10777 }
10778
10779 /* Attempt to simplify or even eliminate a fixup.  The return value is
10780    ignored; perhaps it was once meaningful, but now it is historical.
10781    To indicate that a fixup has been eliminated, set FIXP->FX_DONE.
10782
10783    If fixp->fx_addsy is non-NULL, we'll have to generate a reloc entry
10784    (if possible).  */
10785
10786 void
10787 md_apply_fix3 (fix, valP, seg)
10788      fixS *fix;
10789      valueT *valP;
10790      segT seg ATTRIBUTE_UNUSED;
10791 {
10792   char *fixpos;
10793   valueT value = *valP;
10794
10795   fixpos = fix->fx_frag->fr_literal + fix->fx_where;
10796
10797   if (fix->fx_pcrel)
10798     {
10799       switch (fix->fx_r_type)
10800         {
10801         case BFD_RELOC_IA64_DIR32MSB:
10802           fix->fx_r_type = BFD_RELOC_IA64_PCREL32MSB;
10803           break;
10804
10805         case BFD_RELOC_IA64_DIR32LSB:
10806           fix->fx_r_type = BFD_RELOC_IA64_PCREL32LSB;
10807           break;
10808
10809         case BFD_RELOC_IA64_DIR64MSB:
10810           fix->fx_r_type = BFD_RELOC_IA64_PCREL64MSB;
10811           break;
10812
10813         case BFD_RELOC_IA64_DIR64LSB:
10814           fix->fx_r_type = BFD_RELOC_IA64_PCREL64LSB;
10815           break;
10816
10817         default:
10818           break;
10819         }
10820     }
10821   if (fix->fx_addsy)
10822     {
10823       switch (fix->fx_r_type)
10824         {
10825         case BFD_RELOC_UNUSED:
10826           /* This must be a TAG13 or TAG13b operand.  There are no external
10827              relocs defined for them, so we must give an error.  */
10828           as_bad_where (fix->fx_file, fix->fx_line,
10829                         "%s must have a constant value",
10830                         elf64_ia64_operands[fix->tc_fix_data.opnd].desc);
10831           fix->fx_done = 1;
10832           return;
10833
10834         case BFD_RELOC_IA64_TPREL14:
10835         case BFD_RELOC_IA64_TPREL22:
10836         case BFD_RELOC_IA64_TPREL64I:
10837         case BFD_RELOC_IA64_LTOFF_TPREL22:
10838         case BFD_RELOC_IA64_LTOFF_DTPMOD22:
10839         case BFD_RELOC_IA64_DTPREL14:
10840         case BFD_RELOC_IA64_DTPREL22:
10841         case BFD_RELOC_IA64_DTPREL64I:
10842         case BFD_RELOC_IA64_LTOFF_DTPREL22:
10843           S_SET_THREAD_LOCAL (fix->fx_addsy);
10844           break;
10845
10846         default:
10847           break;
10848         }
10849     }
10850   else if (fix->tc_fix_data.opnd == IA64_OPND_NIL)
10851     {
10852       if (fix->tc_fix_data.bigendian)
10853         number_to_chars_bigendian (fixpos, value, fix->fx_size);
10854       else
10855         number_to_chars_littleendian (fixpos, value, fix->fx_size);
10856       fix->fx_done = 1;
10857     }
10858   else
10859     {
10860       fix_insn (fix, elf64_ia64_operands + fix->tc_fix_data.opnd, value);
10861       fix->fx_done = 1;
10862     }
10863 }
10864
10865 /* Generate the BFD reloc to be stuck in the object file from the
10866    fixup used internally in the assembler.  */
10867
10868 arelent *
10869 tc_gen_reloc (sec, fixp)
10870      asection *sec ATTRIBUTE_UNUSED;
10871      fixS *fixp;
10872 {
10873   arelent *reloc;
10874
10875   reloc = xmalloc (sizeof (*reloc));
10876   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
10877   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
10878   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
10879   reloc->addend = fixp->fx_offset;
10880   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
10881
10882   if (!reloc->howto)
10883     {
10884       as_bad_where (fixp->fx_file, fixp->fx_line,
10885                     "Cannot represent %s relocation in object file",
10886                     bfd_get_reloc_code_name (fixp->fx_r_type));
10887     }
10888   return reloc;
10889 }
10890
10891 /* Turn a string in input_line_pointer into a floating point constant
10892    of type TYPE, and store the appropriate bytes in *LIT.  The number
10893    of LITTLENUMS emitted is stored in *SIZE.  An error message is
10894    returned, or NULL on OK.  */
10895
10896 #define MAX_LITTLENUMS 5
10897
10898 char *
10899 md_atof (type, lit, size)
10900      int type;
10901      char *lit;
10902      int *size;
10903 {
10904   LITTLENUM_TYPE words[MAX_LITTLENUMS];
10905   char *t;
10906   int prec;
10907
10908   switch (type)
10909     {
10910       /* IEEE floats */
10911     case 'f':
10912     case 'F':
10913     case 's':
10914     case 'S':
10915       prec = 2;
10916       break;
10917
10918     case 'd':
10919     case 'D':
10920     case 'r':
10921     case 'R':
10922       prec = 4;
10923       break;
10924
10925     case 'x':
10926     case 'X':
10927     case 'p':
10928     case 'P':
10929       prec = 5;
10930       break;
10931
10932     default:
10933       *size = 0;
10934       return "Bad call to MD_ATOF()";
10935     }
10936   t = atof_ieee (input_line_pointer, type, words);
10937   if (t)
10938     input_line_pointer = t;
10939
10940   (*ia64_float_to_chars) (lit, words, prec);
10941
10942   if (type == 'X')
10943     {
10944       /* It is 10 byte floating point with 6 byte padding.  */
10945       memset (&lit [10], 0, 6);
10946       *size = 8 * sizeof (LITTLENUM_TYPE);
10947     }
10948   else
10949     *size = prec * sizeof (LITTLENUM_TYPE);
10950
10951   return 0;
10952 }
10953
10954 /* Handle ia64 specific semantics of the align directive.  */
10955
10956 void
10957 ia64_md_do_align (n, fill, len, max)
10958      int n ATTRIBUTE_UNUSED;
10959      const char *fill ATTRIBUTE_UNUSED;
10960      int len ATTRIBUTE_UNUSED;
10961      int max ATTRIBUTE_UNUSED;
10962 {
10963   if (subseg_text_p (now_seg))
10964     ia64_flush_insns ();
10965 }
10966
10967 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
10968    of an rs_align_code fragment.  */
10969
10970 void
10971 ia64_handle_align (fragp)
10972      fragS *fragp;
10973 {
10974   /* Use mfi bundle of nops with no stop bits.  */
10975   static const unsigned char le_nop[]
10976     = { 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
10977         0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
10978   static const unsigned char le_nop_stop[]
10979     = { 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
10980         0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
10981
10982   int bytes;
10983   char *p;
10984   const unsigned char *nop;
10985
10986   if (fragp->fr_type != rs_align_code)
10987     return;
10988
10989   /* Check if this frag has to end with a stop bit.  */
10990   nop = fragp->tc_frag_data ? le_nop_stop : le_nop;
10991
10992   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
10993   p = fragp->fr_literal + fragp->fr_fix;
10994
10995   /* If no paddings are needed, we check if we need a stop bit.  */ 
10996   if (!bytes && fragp->tc_frag_data)
10997     {
10998       if (fragp->fr_fix < 16)
10999 #if 1
11000         /* FIXME: It won't work with
11001            .align 16
11002            alloc r32=ar.pfs,1,2,4,0
11003          */
11004         ;
11005 #else
11006         as_bad_where (fragp->fr_file, fragp->fr_line,
11007                       _("Can't add stop bit to mark end of instruction group"));
11008 #endif
11009       else
11010         /* Bundles are always in little-endian byte order. Make sure
11011            the previous bundle has the stop bit.  */
11012         *(p - 16) |= 1;
11013     }
11014
11015   /* Make sure we are on a 16-byte boundary, in case someone has been
11016      putting data into a text section.  */
11017   if (bytes & 15)
11018     {
11019       int fix = bytes & 15;
11020       memset (p, 0, fix);
11021       p += fix;
11022       bytes -= fix;
11023       fragp->fr_fix += fix;
11024     }
11025
11026   /* Instruction bundles are always little-endian.  */
11027   memcpy (p, nop, 16);
11028   fragp->fr_var = 16;
11029 }
11030
11031 static void
11032 ia64_float_to_chars_bigendian (char *lit, LITTLENUM_TYPE *words,
11033                                int prec)
11034 {
11035   while (prec--)
11036     {
11037       number_to_chars_bigendian (lit, (long) (*words++),
11038                                  sizeof (LITTLENUM_TYPE));
11039       lit += sizeof (LITTLENUM_TYPE);
11040     }
11041 }
11042
11043 static void
11044 ia64_float_to_chars_littleendian (char *lit, LITTLENUM_TYPE *words,
11045                                   int prec)
11046 {
11047   while (prec--)
11048     {
11049       number_to_chars_littleendian (lit, (long) (words[prec]),
11050                                     sizeof (LITTLENUM_TYPE));
11051       lit += sizeof (LITTLENUM_TYPE);
11052     }
11053 }
11054
11055 void
11056 ia64_elf_section_change_hook  (void)
11057 {
11058   if (elf_section_type (now_seg) == SHT_IA_64_UNWIND
11059       && elf_linked_to_section (now_seg) == NULL)
11060     elf_linked_to_section (now_seg) = text_section;
11061   dot_byteorder (-1);
11062 }
11063
11064 /* Check if a label should be made global.  */
11065 void
11066 ia64_check_label (symbolS *label)
11067 {
11068   if (*input_line_pointer == ':')
11069     {
11070       S_SET_EXTERNAL (label);
11071       input_line_pointer++;
11072     }
11073 }
11074
11075 /* Used to remember where .alias and .secalias directives are seen. We
11076    will rename symbol and section names when we are about to output
11077    the relocatable file.  */
11078 struct alias
11079 {
11080   char *file;           /* The file where the directive is seen.  */
11081   unsigned int line;    /* The line number the directive is at.  */
11082   const char *name;     /* The orignale name of the symbol.  */
11083 };
11084
11085 /* Called for .alias and .secalias directives. If SECTION is 1, it is
11086    .secalias. Otherwise, it is .alias.  */
11087 static void
11088 dot_alias (int section)
11089 {
11090   char *name, *alias;
11091   char delim;
11092   char *end_name;
11093   int len;
11094   const char *error_string;
11095   struct alias *h;
11096   const char *a;
11097   struct hash_control *ahash, *nhash;
11098   const char *kind;
11099
11100   name = input_line_pointer;
11101   delim = get_symbol_end ();
11102   end_name = input_line_pointer;
11103   *end_name = delim;
11104
11105   if (name == end_name)
11106     {
11107       as_bad (_("expected symbol name"));
11108       discard_rest_of_line ();
11109       return;
11110     }
11111
11112   SKIP_WHITESPACE ();
11113
11114   if (*input_line_pointer != ',')
11115     {
11116       *end_name = 0;
11117       as_bad (_("expected comma after \"%s\""), name);
11118       *end_name = delim;
11119       ignore_rest_of_line ();
11120       return;
11121     }
11122
11123   input_line_pointer++;
11124   *end_name = 0;
11125
11126   /* We call demand_copy_C_string to check if alias string is valid.
11127      There should be a closing `"' and no `\0' in the string.  */
11128   alias = demand_copy_C_string (&len);
11129   if (alias == NULL)
11130     {
11131       ignore_rest_of_line ();
11132       return;
11133     }
11134
11135   /* Make a copy of name string.  */
11136   len = strlen (name) + 1;
11137   obstack_grow (&notes, name, len);
11138   name = obstack_finish (&notes);
11139
11140   if (section)
11141     {
11142       kind = "section";
11143       ahash = secalias_hash;
11144       nhash = secalias_name_hash;
11145     }
11146   else
11147     {
11148       kind = "symbol";
11149       ahash = alias_hash;
11150       nhash = alias_name_hash;
11151     }
11152
11153   /* Check if alias has been used before.  */
11154   h = (struct alias *) hash_find (ahash, alias);
11155   if (h)
11156     {
11157       if (strcmp (h->name, name))
11158         as_bad (_("`%s' is already the alias of %s `%s'"),
11159                 alias, kind, h->name);
11160       goto out;
11161     }
11162
11163   /* Check if name already has an alias.  */
11164   a = (const char *) hash_find (nhash, name);
11165   if (a)
11166     {
11167       if (strcmp (a, alias))
11168         as_bad (_("%s `%s' already has an alias `%s'"), kind, name, a);
11169       goto out;
11170     }
11171
11172   h = (struct alias *) xmalloc (sizeof (struct alias));
11173   as_where (&h->file, &h->line);
11174   h->name = name;
11175   
11176   error_string = hash_jam (ahash, alias, (PTR) h);
11177   if (error_string)
11178     {
11179       as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
11180                 alias, kind, error_string);
11181       goto out;
11182     }
11183
11184   error_string = hash_jam (nhash, name, (PTR) alias);
11185   if (error_string)
11186     {
11187       as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
11188                 alias, kind, error_string);
11189 out:
11190       obstack_free (&notes, name);
11191       obstack_free (&notes, alias);
11192     }
11193
11194   demand_empty_rest_of_line ();
11195 }
11196
11197 /* It renames the original symbol name to its alias.  */
11198 static void
11199 do_alias (const char *alias, PTR value)
11200 {
11201   struct alias *h = (struct alias *) value;
11202   symbolS *sym = symbol_find (h->name);
11203
11204   if (sym == NULL)
11205     as_warn_where (h->file, h->line,
11206                    _("symbol `%s' aliased to `%s' is not used"),
11207                    h->name, alias);
11208     else
11209       S_SET_NAME (sym, (char *) alias);
11210 }
11211
11212 /* Called from write_object_file.  */
11213 void
11214 ia64_adjust_symtab (void)
11215 {
11216   hash_traverse (alias_hash, do_alias);
11217 }
11218
11219 /* It renames the original section name to its alias.  */
11220 static void
11221 do_secalias (const char *alias, PTR value)
11222 {
11223   struct alias *h = (struct alias *) value;
11224   segT sec = bfd_get_section_by_name (stdoutput, h->name);
11225
11226   if (sec == NULL)
11227     as_warn_where (h->file, h->line,
11228                    _("section `%s' aliased to `%s' is not used"),
11229                    h->name, alias);
11230   else
11231     sec->name = alias;
11232 }
11233
11234 /* Called from write_object_file.  */
11235 void
11236 ia64_frob_file (void)
11237 {
11238   hash_traverse (secalias_hash, do_secalias);
11239 }