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