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