gas/
[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 static void
3059 unwind_diagnostic (const char * region, const char *directive)
3060 {
3061   if (md.unwind_check == unwind_check_warning)
3062     as_warn (".%s outside of %s", directive, region);
3063   else
3064     {
3065       as_bad (".%s outside of %s", directive, region);
3066       ignore_rest_of_line ();
3067     }
3068 }
3069
3070 static int
3071 in_procedure (const char *directive)
3072 {
3073   if (unwind.proc_start
3074       && (!unwind.saved_text_seg || strcmp (directive, "endp") == 0))
3075     return 1;
3076   unwind_diagnostic ("procedure", directive);
3077   return 0;
3078 }
3079
3080 static int
3081 in_prologue (const char *directive)
3082 {
3083   if (in_procedure (directive))
3084     {
3085       /* We are in a procedure. Check if we are in a prologue.  */
3086       if (unwind.prologue)
3087         return 1;
3088       unwind_diagnostic ("prologue", directive);
3089     }
3090   return 0;
3091 }
3092
3093 static int
3094 in_body (const char *directive)
3095 {
3096   if (in_procedure (directive))
3097     {
3098       /* We are in a procedure. Check if we are in a body.  */
3099       if (unwind.body)
3100         return 1;
3101       unwind_diagnostic ("body region", directive);
3102     }
3103   return 0;
3104 }
3105
3106 static void
3107 add_unwind_entry (ptr)
3108      unw_rec_list *ptr;
3109 {
3110   if (unwind.tail)
3111     unwind.tail->next = ptr;
3112   else
3113     unwind.list = ptr;
3114   unwind.tail = ptr;
3115
3116   /* The current entry can in fact be a chain of unwind entries.  */
3117   if (unwind.current_entry == NULL)
3118     unwind.current_entry = ptr;
3119 }
3120
3121 static void
3122 dot_fframe (dummy)
3123      int dummy ATTRIBUTE_UNUSED;
3124 {
3125   expressionS e;
3126
3127   if (!in_prologue ("fframe"))
3128     return;
3129
3130   parse_operand (&e);
3131
3132   if (e.X_op != O_constant)
3133     as_bad ("Operand to .fframe must be a constant");
3134   else
3135     add_unwind_entry (output_mem_stack_f (e.X_add_number));
3136 }
3137
3138 static void
3139 dot_vframe (dummy)
3140      int dummy ATTRIBUTE_UNUSED;
3141 {
3142   expressionS e;
3143   unsigned reg;
3144
3145   if (!in_prologue ("vframe"))
3146     return;
3147
3148   parse_operand (&e);
3149   reg = e.X_add_number - REG_GR;
3150   if (e.X_op == O_register && reg < 128)
3151     {
3152       add_unwind_entry (output_mem_stack_v ());
3153       if (! (unwind.prologue_mask & 2))
3154         add_unwind_entry (output_psp_gr (reg));
3155     }
3156   else
3157     as_bad ("First operand to .vframe must be a general register");
3158 }
3159
3160 static void
3161 dot_vframesp (dummy)
3162      int dummy ATTRIBUTE_UNUSED;
3163 {
3164   expressionS e;
3165
3166   if (!in_prologue ("vframesp"))
3167     return;
3168
3169   parse_operand (&e);
3170   if (e.X_op == O_constant)
3171     {
3172       add_unwind_entry (output_mem_stack_v ());
3173       add_unwind_entry (output_psp_sprel (e.X_add_number));
3174     }
3175   else
3176     as_bad ("Operand to .vframesp must be a constant (sp-relative offset)");
3177 }
3178
3179 static void
3180 dot_vframepsp (dummy)
3181      int dummy ATTRIBUTE_UNUSED;
3182 {
3183   expressionS e;
3184
3185   if (!in_prologue ("vframepsp"))
3186     return;
3187
3188   parse_operand (&e);
3189   if (e.X_op == O_constant)
3190     {
3191       add_unwind_entry (output_mem_stack_v ());
3192       add_unwind_entry (output_psp_sprel (e.X_add_number));
3193     }
3194   else
3195     as_bad ("Operand to .vframepsp must be a constant (psp-relative offset)");
3196 }
3197
3198 static void
3199 dot_save (dummy)
3200      int dummy ATTRIBUTE_UNUSED;
3201 {
3202   expressionS e1, e2;
3203   int sep;
3204   int reg1, reg2;
3205
3206   if (!in_prologue ("save"))
3207     return;
3208
3209   sep = parse_operand (&e1);
3210   if (sep != ',')
3211     as_bad ("No second operand to .save");
3212   sep = parse_operand (&e2);
3213
3214   reg1 = e1.X_add_number;
3215   reg2 = e2.X_add_number - REG_GR;
3216
3217   /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'.  */
3218   if (e1.X_op == O_register)
3219     {
3220       if (e2.X_op == O_register && reg2 >= 0 && reg2 < 128)
3221         {
3222           switch (reg1)
3223             {
3224             case REG_AR + AR_BSP:
3225               add_unwind_entry (output_bsp_when ());
3226               add_unwind_entry (output_bsp_gr (reg2));
3227               break;
3228             case REG_AR + AR_BSPSTORE:
3229               add_unwind_entry (output_bspstore_when ());
3230               add_unwind_entry (output_bspstore_gr (reg2));
3231               break;
3232             case REG_AR + AR_RNAT:
3233               add_unwind_entry (output_rnat_when ());
3234               add_unwind_entry (output_rnat_gr (reg2));
3235               break;
3236             case REG_AR + AR_UNAT:
3237               add_unwind_entry (output_unat_when ());
3238               add_unwind_entry (output_unat_gr (reg2));
3239               break;
3240             case REG_AR + AR_FPSR:
3241               add_unwind_entry (output_fpsr_when ());
3242               add_unwind_entry (output_fpsr_gr (reg2));
3243               break;
3244             case REG_AR + AR_PFS:
3245               add_unwind_entry (output_pfs_when ());
3246               if (! (unwind.prologue_mask & 4))
3247                 add_unwind_entry (output_pfs_gr (reg2));
3248               break;
3249             case REG_AR + AR_LC:
3250               add_unwind_entry (output_lc_when ());
3251               add_unwind_entry (output_lc_gr (reg2));
3252               break;
3253             case REG_BR:
3254               add_unwind_entry (output_rp_when ());
3255               if (! (unwind.prologue_mask & 8))
3256                 add_unwind_entry (output_rp_gr (reg2));
3257               break;
3258             case REG_PR:
3259               add_unwind_entry (output_preds_when ());
3260               if (! (unwind.prologue_mask & 1))
3261                 add_unwind_entry (output_preds_gr (reg2));
3262               break;
3263             case REG_PRIUNAT:
3264               add_unwind_entry (output_priunat_when_gr ());
3265               add_unwind_entry (output_priunat_gr (reg2));
3266               break;
3267             default:
3268               as_bad ("First operand not a valid register");
3269             }
3270         }
3271       else
3272         as_bad (" Second operand not a valid register");
3273     }
3274   else
3275     as_bad ("First operand not a register");
3276 }
3277
3278 static void
3279 dot_restore (dummy)
3280      int dummy ATTRIBUTE_UNUSED;
3281 {
3282   expressionS e1, e2;
3283   unsigned long ecount; /* # of _additional_ regions to pop */
3284   int sep;
3285
3286   if (!in_body ("restore"))
3287     return;
3288
3289   sep = parse_operand (&e1);
3290   if (e1.X_op != O_register || e1.X_add_number != REG_GR + 12)
3291     {
3292       as_bad ("First operand to .restore must be stack pointer (sp)");
3293       return;
3294     }
3295
3296   if (sep == ',')
3297     {
3298       parse_operand (&e2);
3299       if (e2.X_op != O_constant || e2.X_add_number < 0)
3300         {
3301           as_bad ("Second operand to .restore must be a constant >= 0");
3302           return;
3303         }
3304       ecount = e2.X_add_number;
3305     }
3306   else
3307     ecount = unwind.prologue_count - 1;
3308
3309   if (ecount >= unwind.prologue_count)
3310     {
3311       as_bad ("Epilogue count of %lu exceeds number of nested prologues (%u)",
3312               ecount + 1, unwind.prologue_count);
3313       return;
3314     }
3315
3316   add_unwind_entry (output_epilogue (ecount));
3317
3318   if (ecount < unwind.prologue_count)
3319     unwind.prologue_count -= ecount + 1;
3320   else
3321     unwind.prologue_count = 0;
3322 }
3323
3324 static void
3325 dot_restorereg (dummy)
3326      int dummy ATTRIBUTE_UNUSED;
3327 {
3328   unsigned int ab, reg;
3329   expressionS e;
3330
3331   if (!in_procedure ("restorereg"))
3332     return;
3333
3334   parse_operand (&e);
3335
3336   if (!convert_expr_to_ab_reg (&e, &ab, &reg))
3337     {
3338       as_bad ("First operand to .restorereg must be a preserved register");
3339       return;
3340     }
3341   add_unwind_entry (output_spill_reg (ab, reg, 0, 0));
3342 }
3343
3344 static void
3345 dot_restorereg_p (dummy)
3346      int dummy ATTRIBUTE_UNUSED;
3347 {
3348   unsigned int qp, ab, reg;
3349   expressionS e1, e2;
3350   int sep;
3351
3352   if (!in_procedure ("restorereg.p"))
3353     return;
3354
3355   sep = parse_operand (&e1);
3356   if (sep != ',')
3357     {
3358       as_bad ("No second operand to .restorereg.p");
3359       return;
3360     }
3361
3362   parse_operand (&e2);
3363
3364   qp = e1.X_add_number - REG_P;
3365   if (e1.X_op != O_register || qp > 63)
3366     {
3367       as_bad ("First operand to .restorereg.p must be a predicate");
3368       return;
3369     }
3370
3371   if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3372     {
3373       as_bad ("Second operand to .restorereg.p must be a preserved register");
3374       return;
3375     }
3376   add_unwind_entry (output_spill_reg_p (ab, reg, 0, 0, qp));
3377 }
3378
3379 static char *special_linkonce_name[] =
3380   {
3381     ".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
3382   };
3383
3384 static void
3385 start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty)
3386 {
3387   /*
3388     Use a slightly ugly scheme to derive the unwind section names from
3389     the text section name:
3390
3391     text sect.  unwind table sect.
3392     name:       name:                      comments:
3393     ----------  -----------------          --------------------------------
3394     .text       .IA_64.unwind
3395     .text.foo   .IA_64.unwind.text.foo
3396     .foo        .IA_64.unwind.foo
3397     .gnu.linkonce.t.foo
3398                 .gnu.linkonce.ia64unw.foo
3399     _info       .IA_64.unwind_info         gas issues error message (ditto)
3400     _infoFOO    .IA_64.unwind_infoFOO      gas issues error message (ditto)
3401
3402     This mapping is done so that:
3403
3404         (a) An object file with unwind info only in .text will use
3405             unwind section names .IA_64.unwind and .IA_64.unwind_info.
3406             This follows the letter of the ABI and also ensures backwards
3407             compatibility with older toolchains.
3408
3409         (b) An object file with unwind info in multiple text sections
3410             will use separate unwind sections for each text section.
3411             This allows us to properly set the "sh_info" and "sh_link"
3412             fields in SHT_IA_64_UNWIND as required by the ABI and also
3413             lets GNU ld support programs with multiple segments
3414             containing unwind info (as might be the case for certain
3415             embedded applications).
3416
3417         (c) An error is issued if there would be a name clash.
3418   */
3419
3420   const char *text_name, *sec_text_name;
3421   char *sec_name;
3422   const char *prefix = special_section_name [sec_index];
3423   const char *suffix;
3424   size_t prefix_len, suffix_len, sec_name_len;
3425
3426   sec_text_name = segment_name (text_seg);
3427   text_name = sec_text_name;
3428   if (strncmp (text_name, "_info", 5) == 0)
3429     {
3430       as_bad ("Illegal section name `%s' (causes unwind section name clash)",
3431               text_name);
3432       ignore_rest_of_line ();
3433       return;
3434     }
3435   if (strcmp (text_name, ".text") == 0)
3436     text_name = "";
3437
3438   /* Build the unwind section name by appending the (possibly stripped)
3439      text section name to the unwind prefix.  */
3440   suffix = text_name;
3441   if (strncmp (text_name, ".gnu.linkonce.t.",
3442                sizeof (".gnu.linkonce.t.") - 1) == 0)
3443     {
3444       prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND];
3445       suffix += sizeof (".gnu.linkonce.t.") - 1;
3446     }
3447   else if (linkonce_empty)
3448     return;
3449
3450   prefix_len = strlen (prefix);
3451   suffix_len = strlen (suffix);
3452   sec_name_len = prefix_len + suffix_len;
3453   sec_name = alloca (sec_name_len + 1);
3454   memcpy (sec_name, prefix, prefix_len);
3455   memcpy (sec_name + prefix_len, suffix, suffix_len);
3456   sec_name [sec_name_len] = '\0';
3457
3458   /* Handle COMDAT group.  */
3459   if (suffix == text_name && (text_seg->flags & SEC_LINK_ONCE) != 0)
3460     {
3461       char *section;
3462       size_t len, group_name_len;
3463       const char *group_name = elf_group_name (text_seg);
3464
3465       if (group_name == NULL)
3466         {
3467           as_bad ("Group section `%s' has no group signature",
3468                   sec_text_name);
3469           ignore_rest_of_line ();
3470           return;
3471         }
3472       /* We have to construct a fake section directive. */
3473       group_name_len = strlen (group_name);
3474       len = (sec_name_len
3475              + 16                       /* ,"aG",@progbits,  */
3476              + group_name_len           /* ,group_name  */
3477              + 7);                      /* ,comdat  */
3478
3479       section = alloca (len + 1);
3480       memcpy (section, sec_name, sec_name_len);
3481       memcpy (section + sec_name_len, ",\"aG\",@progbits,", 16);
3482       memcpy (section + sec_name_len + 16, group_name, group_name_len);
3483       memcpy (section + len - 7, ",comdat", 7);
3484       section [len] = '\0';
3485       set_section (section);
3486     }
3487   else
3488     {
3489       set_section (sec_name);
3490       bfd_set_section_flags (stdoutput, now_seg,
3491                              SEC_LOAD | SEC_ALLOC | SEC_READONLY);
3492     }
3493
3494   elf_linked_to_section (now_seg) = text_seg;
3495 }
3496
3497 static void
3498 generate_unwind_image (const segT text_seg)
3499 {
3500   int size, pad;
3501   unw_rec_list *list;
3502
3503   /* Mark the end of the unwind info, so that we can compute the size of the
3504      last unwind region.  */
3505   add_unwind_entry (output_endp ());
3506
3507   /* Force out pending instructions, to make sure all unwind records have
3508      a valid slot_number field.  */
3509   ia64_flush_insns ();
3510
3511   /* Generate the unwind record.  */
3512   list = optimize_unw_records (unwind.list);
3513   fixup_unw_records (list, 1);
3514   size = calc_record_size (list);
3515
3516   if (size > 0 || unwind.force_unwind_entry)
3517     {
3518       unwind.force_unwind_entry = 0;
3519       /* pad to pointer-size boundary.  */
3520       pad = size % md.pointer_size;
3521       if (pad != 0)
3522         size += md.pointer_size - pad;
3523       /* Add 8 for the header.  */
3524       size += 8;
3525       /* Add a pointer for the personality offset.  */
3526       if (unwind.personality_routine)
3527         size += md.pointer_size;
3528     }
3529
3530   /* If there are unwind records, switch sections, and output the info.  */
3531   if (size != 0)
3532     {
3533       expressionS exp;
3534       bfd_reloc_code_real_type reloc;
3535
3536       start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0);
3537
3538       /* Make sure the section has 4 byte alignment for ILP32 and
3539          8 byte alignment for LP64.  */
3540       frag_align (md.pointer_size_shift, 0, 0);
3541       record_alignment (now_seg, md.pointer_size_shift);
3542
3543       /* Set expression which points to start of unwind descriptor area.  */
3544       unwind.info = expr_build_dot ();
3545       
3546       frag_var (rs_machine_dependent, size, size, 0, 0,
3547                 (offsetT) (long) unwind.personality_routine,
3548                 (char *) list);
3549
3550       /* Add the personality address to the image.  */
3551       if (unwind.personality_routine != 0)
3552         {
3553           exp.X_op = O_symbol;
3554           exp.X_add_symbol = unwind.personality_routine;
3555           exp.X_add_number = 0;
3556
3557           if (md.flags & EF_IA_64_BE)
3558             {
3559               if (md.flags & EF_IA_64_ABI64)
3560                 reloc = BFD_RELOC_IA64_LTOFF_FPTR64MSB;
3561               else
3562                 reloc = BFD_RELOC_IA64_LTOFF_FPTR32MSB;
3563             }
3564           else
3565             {
3566               if (md.flags & EF_IA_64_ABI64)
3567                 reloc = BFD_RELOC_IA64_LTOFF_FPTR64LSB;
3568               else
3569                 reloc = BFD_RELOC_IA64_LTOFF_FPTR32LSB;
3570             }
3571
3572           fix_new_exp (frag_now, frag_now_fix () - md.pointer_size,
3573                        md.pointer_size, &exp, 0, reloc);
3574           unwind.personality_routine = 0;
3575         }
3576     }
3577   else
3578     start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1);
3579
3580   free_saved_prologue_counts ();
3581   unwind.list = unwind.tail = unwind.current_entry = NULL;
3582 }
3583
3584 static void
3585 dot_handlerdata (dummy)
3586      int dummy ATTRIBUTE_UNUSED;
3587 {
3588   if (!in_procedure ("handlerdata"))
3589     return;
3590   unwind.force_unwind_entry = 1;
3591
3592   /* Remember which segment we're in so we can switch back after .endp */
3593   unwind.saved_text_seg = now_seg;
3594   unwind.saved_text_subseg = now_subseg;
3595
3596   /* Generate unwind info into unwind-info section and then leave that
3597      section as the currently active one so dataXX directives go into
3598      the language specific data area of the unwind info block.  */
3599   generate_unwind_image (now_seg);
3600   demand_empty_rest_of_line ();
3601 }
3602
3603 static void
3604 dot_unwentry (dummy)
3605      int dummy ATTRIBUTE_UNUSED;
3606 {
3607   if (!in_procedure ("unwentry"))
3608     return;
3609   unwind.force_unwind_entry = 1;
3610   demand_empty_rest_of_line ();
3611 }
3612
3613 static void
3614 dot_altrp (dummy)
3615      int dummy ATTRIBUTE_UNUSED;
3616 {
3617   expressionS e;
3618   unsigned reg;
3619
3620   if (!in_prologue ("altrp"))
3621     return;
3622
3623   parse_operand (&e);
3624   reg = e.X_add_number - REG_BR;
3625   if (e.X_op == O_register && reg < 8)
3626     add_unwind_entry (output_rp_br (reg));
3627   else
3628     as_bad ("First operand not a valid branch register");
3629 }
3630
3631 static void
3632 dot_savemem (psprel)
3633      int psprel;
3634 {
3635   expressionS e1, e2;
3636   int sep;
3637   int reg1, val;
3638
3639   if (!in_prologue (psprel ? "savepsp" : "savesp"))
3640     return;
3641
3642   sep = parse_operand (&e1);
3643   if (sep != ',')
3644     as_bad ("No second operand to .save%ssp", psprel ? "p" : "");
3645   sep = parse_operand (&e2);
3646
3647   reg1 = e1.X_add_number;
3648   val = e2.X_add_number;
3649
3650   /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'.  */
3651   if (e1.X_op == O_register)
3652     {
3653       if (e2.X_op == O_constant)
3654         {
3655           switch (reg1)
3656             {
3657             case REG_AR + AR_BSP:
3658               add_unwind_entry (output_bsp_when ());
3659               add_unwind_entry ((psprel
3660                                  ? output_bsp_psprel
3661                                  : output_bsp_sprel) (val));
3662               break;
3663             case REG_AR + AR_BSPSTORE:
3664               add_unwind_entry (output_bspstore_when ());
3665               add_unwind_entry ((psprel
3666                                  ? output_bspstore_psprel
3667                                  : output_bspstore_sprel) (val));
3668               break;
3669             case REG_AR + AR_RNAT:
3670               add_unwind_entry (output_rnat_when ());
3671               add_unwind_entry ((psprel
3672                                  ? output_rnat_psprel
3673                                  : output_rnat_sprel) (val));
3674               break;
3675             case REG_AR + AR_UNAT:
3676               add_unwind_entry (output_unat_when ());
3677               add_unwind_entry ((psprel
3678                                  ? output_unat_psprel
3679                                  : output_unat_sprel) (val));
3680               break;
3681             case REG_AR + AR_FPSR:
3682               add_unwind_entry (output_fpsr_when ());
3683               add_unwind_entry ((psprel
3684                                  ? output_fpsr_psprel
3685                                  : output_fpsr_sprel) (val));
3686               break;
3687             case REG_AR + AR_PFS:
3688               add_unwind_entry (output_pfs_when ());
3689               add_unwind_entry ((psprel
3690                                  ? output_pfs_psprel
3691                                  : output_pfs_sprel) (val));
3692               break;
3693             case REG_AR + AR_LC:
3694               add_unwind_entry (output_lc_when ());
3695               add_unwind_entry ((psprel
3696                                  ? output_lc_psprel
3697                                  : output_lc_sprel) (val));
3698               break;
3699             case REG_BR:
3700               add_unwind_entry (output_rp_when ());
3701               add_unwind_entry ((psprel
3702                                  ? output_rp_psprel
3703                                  : output_rp_sprel) (val));
3704               break;
3705             case REG_PR:
3706               add_unwind_entry (output_preds_when ());
3707               add_unwind_entry ((psprel
3708                                  ? output_preds_psprel
3709                                  : output_preds_sprel) (val));
3710               break;
3711             case REG_PRIUNAT:
3712               add_unwind_entry (output_priunat_when_mem ());
3713               add_unwind_entry ((psprel
3714                                  ? output_priunat_psprel
3715                                  : output_priunat_sprel) (val));
3716               break;
3717             default:
3718               as_bad ("First operand not a valid register");
3719             }
3720         }
3721       else
3722         as_bad (" Second operand not a valid constant");
3723     }
3724   else
3725     as_bad ("First operand not a register");
3726 }
3727
3728 static void
3729 dot_saveg (dummy)
3730      int dummy ATTRIBUTE_UNUSED;
3731 {
3732   expressionS e1, e2;
3733   int sep;
3734
3735   if (!in_prologue ("save.g"))
3736     return;
3737
3738   sep = parse_operand (&e1);
3739   if (sep == ',')
3740     parse_operand (&e2);
3741
3742   if (e1.X_op != O_constant)
3743     as_bad ("First operand to .save.g must be a constant.");
3744   else
3745     {
3746       int grmask = e1.X_add_number;
3747       if (sep != ',')
3748         add_unwind_entry (output_gr_mem (grmask));
3749       else
3750         {
3751           int reg = e2.X_add_number - REG_GR;
3752           if (e2.X_op == O_register && reg >= 0 && reg < 128)
3753             add_unwind_entry (output_gr_gr (grmask, reg));
3754           else
3755             as_bad ("Second operand is an invalid register.");
3756         }
3757     }
3758 }
3759
3760 static void
3761 dot_savef (dummy)
3762      int dummy ATTRIBUTE_UNUSED;
3763 {
3764   expressionS e1;
3765   int sep;
3766
3767   if (!in_prologue ("save.f"))
3768     return;
3769
3770   sep = parse_operand (&e1);
3771
3772   if (e1.X_op != O_constant)
3773     as_bad ("Operand to .save.f must be a constant.");
3774   else
3775     add_unwind_entry (output_fr_mem (e1.X_add_number));
3776 }
3777
3778 static void
3779 dot_saveb (dummy)
3780      int dummy ATTRIBUTE_UNUSED;
3781 {
3782   expressionS e1, e2;
3783   unsigned int reg;
3784   unsigned char sep;
3785   int brmask;
3786
3787   if (!in_prologue ("save.b"))
3788     return;
3789
3790   sep = parse_operand (&e1);
3791   if (e1.X_op != O_constant)
3792     {
3793       as_bad ("First operand to .save.b must be a constant.");
3794       return;
3795     }
3796   brmask = e1.X_add_number;
3797
3798   if (sep == ',')
3799     {
3800       sep = parse_operand (&e2);
3801       reg = e2.X_add_number - REG_GR;
3802       if (e2.X_op != O_register || reg > 127)
3803         {
3804           as_bad ("Second operand to .save.b must be a general register.");
3805           return;
3806         }
3807       add_unwind_entry (output_br_gr (brmask, e2.X_add_number));
3808     }
3809   else
3810     add_unwind_entry (output_br_mem (brmask));
3811
3812   if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3813     demand_empty_rest_of_line ();
3814 }
3815
3816 static void
3817 dot_savegf (dummy)
3818      int dummy ATTRIBUTE_UNUSED;
3819 {
3820   expressionS e1, e2;
3821   int sep;
3822
3823   if (!in_prologue ("save.gf"))
3824     return;
3825
3826   sep = parse_operand (&e1);
3827   if (sep == ',')
3828     parse_operand (&e2);
3829
3830   if (e1.X_op != O_constant || sep != ',' || e2.X_op != O_constant)
3831     as_bad ("Both operands of .save.gf must be constants.");
3832   else
3833     {
3834       int grmask = e1.X_add_number;
3835       int frmask = e2.X_add_number;
3836       add_unwind_entry (output_frgr_mem (grmask, frmask));
3837     }
3838 }
3839
3840 static void
3841 dot_spill (dummy)
3842      int dummy ATTRIBUTE_UNUSED;
3843 {
3844   expressionS e;
3845   unsigned char sep;
3846
3847   if (!in_prologue ("spill"))
3848     return;
3849
3850   sep = parse_operand (&e);
3851   if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3852     demand_empty_rest_of_line ();
3853
3854   if (e.X_op != O_constant)
3855     as_bad ("Operand to .spill must be a constant");
3856   else
3857     add_unwind_entry (output_spill_base (e.X_add_number));
3858 }
3859
3860 static void
3861 dot_spillreg (dummy)
3862      int dummy ATTRIBUTE_UNUSED;
3863 {
3864   int sep, ab, xy, reg, treg;
3865   expressionS e1, e2;
3866
3867   if (!in_procedure ("spillreg"))
3868     return;
3869
3870   sep = parse_operand (&e1);
3871   if (sep != ',')
3872     {
3873       as_bad ("No second operand to .spillreg");
3874       return;
3875     }
3876
3877   parse_operand (&e2);
3878
3879   if (!convert_expr_to_ab_reg (&e1, &ab, &reg))
3880     {
3881       as_bad ("First operand to .spillreg must be a preserved register");
3882       return;
3883     }
3884
3885   if (!convert_expr_to_xy_reg (&e2, &xy, &treg))
3886     {
3887       as_bad ("Second operand to .spillreg must be a register");
3888       return;
3889     }
3890
3891   add_unwind_entry (output_spill_reg (ab, reg, treg, xy));
3892 }
3893
3894 static void
3895 dot_spillmem (psprel)
3896      int psprel;
3897 {
3898   expressionS e1, e2;
3899   int sep, ab, reg;
3900
3901   if (!in_procedure ("spillmem"))
3902     return;
3903
3904   sep = parse_operand (&e1);
3905   if (sep != ',')
3906     {
3907       as_bad ("Second operand missing");
3908       return;
3909     }
3910
3911   parse_operand (&e2);
3912
3913   if (!convert_expr_to_ab_reg (&e1, &ab, &reg))
3914     {
3915       as_bad ("First operand to .spill%s must be a preserved register",
3916               psprel ? "psp" : "sp");
3917       return;
3918     }
3919
3920   if (e2.X_op != O_constant)
3921     {
3922       as_bad ("Second operand to .spill%s must be a constant",
3923               psprel ? "psp" : "sp");
3924       return;
3925     }
3926
3927   if (psprel)
3928     add_unwind_entry (output_spill_psprel (ab, reg, e2.X_add_number));
3929   else
3930     add_unwind_entry (output_spill_sprel (ab, reg, e2.X_add_number));
3931 }
3932
3933 static void
3934 dot_spillreg_p (dummy)
3935      int dummy ATTRIBUTE_UNUSED;
3936 {
3937   int sep, ab, xy, reg, treg;
3938   expressionS e1, e2, e3;
3939   unsigned int qp;
3940
3941   if (!in_procedure ("spillreg.p"))
3942     return;
3943
3944   sep = parse_operand (&e1);
3945   if (sep != ',')
3946     {
3947       as_bad ("No second and third operand to .spillreg.p");
3948       return;
3949     }
3950
3951   sep = parse_operand (&e2);
3952   if (sep != ',')
3953     {
3954       as_bad ("No third operand to .spillreg.p");
3955       return;
3956     }
3957
3958   parse_operand (&e3);
3959
3960   qp = e1.X_add_number - REG_P;
3961
3962   if (e1.X_op != O_register || qp > 63)
3963     {
3964       as_bad ("First operand to .spillreg.p must be a predicate");
3965       return;
3966     }
3967
3968   if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3969     {
3970       as_bad ("Second operand to .spillreg.p must be a preserved register");
3971       return;
3972     }
3973
3974   if (!convert_expr_to_xy_reg (&e3, &xy, &treg))
3975     {
3976       as_bad ("Third operand to .spillreg.p must be a register");
3977       return;
3978     }
3979
3980   add_unwind_entry (output_spill_reg_p (ab, reg, treg, xy, qp));
3981 }
3982
3983 static void
3984 dot_spillmem_p (psprel)
3985      int psprel;
3986 {
3987   expressionS e1, e2, e3;
3988   int sep, ab, reg;
3989   unsigned int qp;
3990
3991   if (!in_procedure ("spillmem.p"))
3992     return;
3993
3994   sep = parse_operand (&e1);
3995   if (sep != ',')
3996     {
3997       as_bad ("Second operand missing");
3998       return;
3999     }
4000
4001   parse_operand (&e2);
4002   if (sep != ',')
4003     {
4004       as_bad ("Second operand missing");
4005       return;
4006     }
4007
4008   parse_operand (&e3);
4009
4010   qp = e1.X_add_number - REG_P;
4011   if (e1.X_op != O_register || qp > 63)
4012     {
4013       as_bad ("First operand to .spill%s_p must be a predicate",
4014               psprel ? "psp" : "sp");
4015       return;
4016     }
4017
4018   if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
4019     {
4020       as_bad ("Second operand to .spill%s_p must be a preserved register",
4021               psprel ? "psp" : "sp");
4022       return;
4023     }
4024
4025   if (e3.X_op != O_constant)
4026     {
4027       as_bad ("Third operand to .spill%s_p must be a constant",
4028               psprel ? "psp" : "sp");
4029       return;
4030     }
4031
4032   if (psprel)
4033     add_unwind_entry (output_spill_psprel_p (ab, reg, e3.X_add_number, qp));
4034   else
4035     add_unwind_entry (output_spill_sprel_p (ab, reg, e3.X_add_number, qp));
4036 }
4037
4038 static unsigned int
4039 get_saved_prologue_count (lbl)
4040      unsigned long lbl;
4041 {
4042   label_prologue_count *lpc = unwind.saved_prologue_counts;
4043
4044   while (lpc != NULL && lpc->label_number != lbl)
4045     lpc = lpc->next;
4046
4047   if (lpc != NULL)
4048     return lpc->prologue_count;
4049
4050   as_bad ("Missing .label_state %ld", lbl);
4051   return 1;
4052 }
4053
4054 static void
4055 save_prologue_count (lbl, count)
4056      unsigned long lbl;
4057      unsigned int count;
4058 {
4059   label_prologue_count *lpc = unwind.saved_prologue_counts;
4060
4061   while (lpc != NULL && lpc->label_number != lbl)
4062     lpc = lpc->next;
4063
4064   if (lpc != NULL)
4065     lpc->prologue_count = count;
4066   else
4067     {
4068       label_prologue_count *new_lpc = xmalloc (sizeof (* new_lpc));
4069
4070       new_lpc->next = unwind.saved_prologue_counts;
4071       new_lpc->label_number = lbl;
4072       new_lpc->prologue_count = count;
4073       unwind.saved_prologue_counts = new_lpc;
4074     }
4075 }
4076
4077 static void
4078 free_saved_prologue_counts ()
4079 {
4080   label_prologue_count *lpc = unwind.saved_prologue_counts;
4081   label_prologue_count *next;
4082
4083   while (lpc != NULL)
4084     {
4085       next = lpc->next;
4086       free (lpc);
4087       lpc = next;
4088     }
4089
4090   unwind.saved_prologue_counts = NULL;
4091 }
4092
4093 static void
4094 dot_label_state (dummy)
4095      int dummy ATTRIBUTE_UNUSED;
4096 {
4097   expressionS e;
4098
4099   if (!in_body ("label_state"))
4100     return;
4101
4102   parse_operand (&e);
4103   if (e.X_op != O_constant)
4104     {
4105       as_bad ("Operand to .label_state must be a constant");
4106       return;
4107     }
4108   add_unwind_entry (output_label_state (e.X_add_number));
4109   save_prologue_count (e.X_add_number, unwind.prologue_count);
4110 }
4111
4112 static void
4113 dot_copy_state (dummy)
4114      int dummy ATTRIBUTE_UNUSED;
4115 {
4116   expressionS e;
4117
4118   if (!in_body ("copy_state"))
4119     return;
4120
4121   parse_operand (&e);
4122   if (e.X_op != O_constant)
4123     {
4124       as_bad ("Operand to .copy_state must be a constant");
4125       return;
4126     }
4127   add_unwind_entry (output_copy_state (e.X_add_number));
4128   unwind.prologue_count = get_saved_prologue_count (e.X_add_number);
4129 }
4130
4131 static void
4132 dot_unwabi (dummy)
4133      int dummy ATTRIBUTE_UNUSED;
4134 {
4135   expressionS e1, e2;
4136   unsigned char sep;
4137
4138   if (!in_procedure ("unwabi"))
4139     return;
4140
4141   sep = parse_operand (&e1);
4142   if (sep != ',')
4143     {
4144       as_bad ("Second operand to .unwabi missing");
4145       return;
4146     }
4147   sep = parse_operand (&e2);
4148   if (!is_end_of_line[sep] && !is_it_end_of_statement ())
4149     demand_empty_rest_of_line ();
4150
4151   if (e1.X_op != O_constant)
4152     {
4153       as_bad ("First operand to .unwabi must be a constant");
4154       return;
4155     }
4156
4157   if (e2.X_op != O_constant)
4158     {
4159       as_bad ("Second operand to .unwabi must be a constant");
4160       return;
4161     }
4162
4163   add_unwind_entry (output_unwabi (e1.X_add_number, e2.X_add_number));
4164 }
4165
4166 static void
4167 dot_personality (dummy)
4168      int dummy ATTRIBUTE_UNUSED;
4169 {
4170   char *name, *p, c;
4171   if (!in_procedure ("personality"))
4172     return;
4173   SKIP_WHITESPACE ();
4174   name = input_line_pointer;
4175   c = get_symbol_end ();
4176   p = input_line_pointer;
4177   unwind.personality_routine = symbol_find_or_make (name);
4178   unwind.force_unwind_entry = 1;
4179   *p = c;
4180   SKIP_WHITESPACE ();
4181   demand_empty_rest_of_line ();
4182 }
4183
4184 static void
4185 dot_proc (dummy)
4186      int dummy ATTRIBUTE_UNUSED;
4187 {
4188   char *name, *p, c;
4189   symbolS *sym;
4190
4191   unwind.proc_start = 0;
4192   /* Parse names of main and alternate entry points and mark them as
4193      function symbols:  */
4194   while (1)
4195     {
4196       SKIP_WHITESPACE ();
4197       name = input_line_pointer;
4198       c = get_symbol_end ();
4199       p = input_line_pointer;
4200       if (!*name)
4201         as_bad ("Empty argument of .proc");
4202       else
4203         {
4204           sym = symbol_find_or_make (name);
4205           if (S_IS_DEFINED (sym))
4206             as_bad ("`%s' was already defined", name);
4207           else if (unwind.proc_start == 0)
4208             {
4209               unwind.proc_start = sym;
4210             }
4211           symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
4212         }
4213       *p = c;
4214       SKIP_WHITESPACE ();
4215       if (*input_line_pointer != ',')
4216         break;
4217       ++input_line_pointer;
4218     }
4219   if (unwind.proc_start == 0)
4220     unwind.proc_start = expr_build_dot ();
4221   demand_empty_rest_of_line ();
4222   ia64_do_align (16);
4223
4224   unwind.prologue = 0;
4225   unwind.prologue_count = 0;
4226   unwind.body = 0;
4227   unwind.insn = 0;
4228   unwind.list = unwind.tail = unwind.current_entry = NULL;
4229   unwind.personality_routine = 0;
4230 }
4231
4232 static void
4233 dot_body (dummy)
4234      int dummy ATTRIBUTE_UNUSED;
4235 {
4236   if (!in_procedure ("body"))
4237     return;
4238   if (!unwind.prologue && !unwind.body && unwind.insn)
4239     as_warn ("Initial .body should precede any instructions");
4240
4241   unwind.prologue = 0;
4242   unwind.prologue_mask = 0;
4243   unwind.body = 1;
4244
4245   add_unwind_entry (output_body ());
4246   demand_empty_rest_of_line ();
4247 }
4248
4249 static void
4250 dot_prologue (dummy)
4251      int dummy ATTRIBUTE_UNUSED;
4252 {
4253   unsigned char sep;
4254   int mask = 0, grsave = 0;
4255
4256   if (!in_procedure ("prologue"))
4257     return;
4258   if (unwind.prologue)
4259     {
4260       as_bad (".prologue within prologue");
4261       ignore_rest_of_line ();
4262       return;
4263     }
4264   if (!unwind.body && unwind.insn)
4265     as_warn ("Initial .prologue should precede any instructions");
4266
4267   if (!is_it_end_of_statement ())
4268     {
4269       expressionS e1, e2;
4270       sep = parse_operand (&e1);
4271       if (sep != ',')
4272         as_bad ("No second operand to .prologue");
4273       sep = parse_operand (&e2);
4274       if (!is_end_of_line[sep] && !is_it_end_of_statement ())
4275         demand_empty_rest_of_line ();
4276
4277       if (e1.X_op == O_constant)
4278         {
4279           mask = e1.X_add_number;
4280
4281           if (e2.X_op == O_constant)
4282             grsave = e2.X_add_number;
4283           else if (e2.X_op == O_register
4284                    && (grsave = e2.X_add_number - REG_GR) < 128)
4285             ;
4286           else
4287             as_bad ("Second operand not a constant or general register");
4288
4289           add_unwind_entry (output_prologue_gr (mask, grsave));
4290         }
4291       else
4292         as_bad ("First operand not a constant");
4293     }
4294   else
4295     add_unwind_entry (output_prologue ());
4296
4297   unwind.prologue = 1;
4298   unwind.prologue_mask = mask;
4299   unwind.body = 0;
4300   ++unwind.prologue_count;
4301 }
4302
4303 static void
4304 dot_endp (dummy)
4305      int dummy ATTRIBUTE_UNUSED;
4306 {
4307   expressionS e;
4308   unsigned char *ptr;
4309   int bytes_per_address;
4310   long where;
4311   segT saved_seg;
4312   subsegT saved_subseg;
4313   char *name, *default_name, *p, c;
4314   symbolS *sym;
4315   int unwind_check = md.unwind_check;
4316
4317   md.unwind_check = unwind_check_error;
4318   if (!in_procedure ("endp"))
4319     return;
4320   md.unwind_check = unwind_check;
4321
4322   if (unwind.saved_text_seg)
4323     {
4324       saved_seg = unwind.saved_text_seg;
4325       saved_subseg = unwind.saved_text_subseg;
4326       unwind.saved_text_seg = NULL;
4327     }
4328   else
4329     {
4330       saved_seg = now_seg;
4331       saved_subseg = now_subseg;
4332     }
4333
4334   insn_group_break (1, 0, 0);
4335
4336   /* If there wasn't a .handlerdata, we haven't generated an image yet.  */
4337   if (!unwind.info)
4338     generate_unwind_image (saved_seg);
4339
4340   if (unwind.info || unwind.force_unwind_entry)
4341     {
4342       symbolS *proc_end;
4343
4344       subseg_set (md.last_text_seg, 0);
4345       proc_end = expr_build_dot ();
4346
4347       start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0);
4348
4349       /* Make sure that section has 4 byte alignment for ILP32 and
4350          8 byte alignment for LP64.  */
4351       record_alignment (now_seg, md.pointer_size_shift);
4352
4353       /* Need space for 3 pointers for procedure start, procedure end,
4354          and unwind info.  */
4355       ptr = frag_more (3 * md.pointer_size);
4356       where = frag_now_fix () - (3 * md.pointer_size);
4357       bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
4358
4359       /* Issue the values of  a) Proc Begin, b) Proc End, c) Unwind Record.  */
4360       e.X_op = O_pseudo_fixup;
4361       e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4362       e.X_add_number = 0;
4363       e.X_add_symbol = unwind.proc_start;
4364       ia64_cons_fix_new (frag_now, where, bytes_per_address, &e);
4365
4366       e.X_op = O_pseudo_fixup;
4367       e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4368       e.X_add_number = 0;
4369       e.X_add_symbol = proc_end;
4370       ia64_cons_fix_new (frag_now, where + bytes_per_address,
4371                          bytes_per_address, &e);
4372
4373       if (unwind.info)
4374         {
4375           e.X_op = O_pseudo_fixup;
4376           e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4377           e.X_add_number = 0;
4378           e.X_add_symbol = unwind.info;
4379           ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2),
4380                              bytes_per_address, &e);
4381         }
4382       else
4383         md_number_to_chars (ptr + (bytes_per_address * 2), 0,
4384                             bytes_per_address);
4385
4386     }
4387   else
4388     start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1);
4389
4390   subseg_set (saved_seg, saved_subseg);
4391
4392   if (unwind.proc_start)
4393     default_name = (char *) S_GET_NAME (unwind.proc_start);
4394   else
4395     default_name = NULL;
4396
4397   /* Parse names of main and alternate entry points and set symbol sizes.  */
4398   while (1)
4399     {
4400       SKIP_WHITESPACE ();
4401       name = input_line_pointer;
4402       c = get_symbol_end ();
4403       p = input_line_pointer;
4404       if (!*name)
4405         {
4406           if (md.unwind_check == unwind_check_warning)
4407             {
4408               if (default_name)
4409                 {
4410                   as_warn ("Empty argument of .endp. Use the default name `%s'",
4411                            default_name);
4412                   name = default_name;
4413                 }
4414               else
4415                 as_warn ("Empty argument of .endp");
4416             }
4417           else
4418             as_bad ("Empty argument of .endp");
4419         }
4420       if (*name)
4421         {
4422           sym = symbol_find (name);
4423           if (!sym
4424               && md.unwind_check == unwind_check_warning
4425               && default_name
4426               && default_name != name)
4427             {
4428               /* We have a bad name. Try the default one if needed.  */
4429               as_warn ("`%s' was not defined within procedure. Use the default name `%s'",
4430                        name, default_name);
4431               name = default_name;
4432               sym = symbol_find (name);
4433             }
4434           if (!sym || !S_IS_DEFINED (sym))
4435             as_bad ("`%s' was not defined within procedure", name);
4436           else if (unwind.proc_start
4437               && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION)
4438               && S_GET_SIZE (sym) == 0 && symbol_get_obj (sym)->size == NULL)
4439             {
4440               fragS *fr = symbol_get_frag (unwind.proc_start);
4441               fragS *frag = symbol_get_frag (sym);
4442
4443               /* Check whether the function label is at or beyond last
4444                  .proc directive.  */
4445               while (fr && fr != frag)
4446                 fr = fr->fr_next;
4447               if (fr)
4448                 {
4449                   if (frag == frag_now && SEG_NORMAL (now_seg))
4450                     S_SET_SIZE (sym, frag_now_fix () - S_GET_VALUE (sym));
4451                   else
4452                     {
4453                       symbol_get_obj (sym)->size =
4454                         (expressionS *) xmalloc (sizeof (expressionS));
4455                       symbol_get_obj (sym)->size->X_op = O_subtract;
4456                       symbol_get_obj (sym)->size->X_add_symbol
4457                         = symbol_new (FAKE_LABEL_NAME, now_seg,
4458                                       frag_now_fix (), frag_now);
4459                       symbol_get_obj (sym)->size->X_op_symbol = sym;
4460                       symbol_get_obj (sym)->size->X_add_number = 0;
4461                     }
4462                 }
4463             }
4464         }
4465       *p = c;
4466       SKIP_WHITESPACE ();
4467       if (*input_line_pointer != ',')
4468         break;
4469       ++input_line_pointer;
4470     }
4471   demand_empty_rest_of_line ();
4472   unwind.proc_start = unwind.info = 0;
4473 }
4474
4475 static void
4476 dot_template (template)
4477      int template;
4478 {
4479   CURR_SLOT.user_template = template;
4480 }
4481
4482 static void
4483 dot_regstk (dummy)
4484      int dummy ATTRIBUTE_UNUSED;
4485 {
4486   int ins, locs, outs, rots;
4487
4488   if (is_it_end_of_statement ())
4489     ins = locs = outs = rots = 0;
4490   else
4491     {
4492       ins = get_absolute_expression ();
4493       if (*input_line_pointer++ != ',')
4494         goto err;
4495       locs = get_absolute_expression ();
4496       if (*input_line_pointer++ != ',')
4497         goto err;
4498       outs = get_absolute_expression ();
4499       if (*input_line_pointer++ != ',')
4500         goto err;
4501       rots = get_absolute_expression ();
4502     }
4503   set_regstack (ins, locs, outs, rots);
4504   return;
4505
4506  err:
4507   as_bad ("Comma expected");
4508   ignore_rest_of_line ();
4509 }
4510
4511 static void
4512 dot_rot (type)
4513      int type;
4514 {
4515   unsigned num_regs, num_alloced = 0;
4516   struct dynreg **drpp, *dr;
4517   int ch, base_reg = 0;
4518   char *name, *start;
4519   size_t len;
4520
4521   switch (type)
4522     {
4523     case DYNREG_GR: base_reg = REG_GR + 32; break;
4524     case DYNREG_FR: base_reg = REG_FR + 32; break;
4525     case DYNREG_PR: base_reg = REG_P + 16; break;
4526     default: break;
4527     }
4528
4529   /* First, remove existing names from hash table.  */
4530   for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
4531     {
4532       hash_delete (md.dynreg_hash, dr->name);
4533       dr->num_regs = 0;
4534     }
4535
4536   drpp = &md.dynreg[type];
4537   while (1)
4538     {
4539       start = input_line_pointer;
4540       ch = get_symbol_end ();
4541       *input_line_pointer = ch;
4542       len = (input_line_pointer - start);
4543
4544       SKIP_WHITESPACE ();
4545       if (*input_line_pointer != '[')
4546         {
4547           as_bad ("Expected '['");
4548           goto err;
4549         }
4550       ++input_line_pointer;     /* skip '[' */
4551
4552       num_regs = get_absolute_expression ();
4553
4554       if (*input_line_pointer++ != ']')
4555         {
4556           as_bad ("Expected ']'");
4557           goto err;
4558         }
4559       SKIP_WHITESPACE ();
4560
4561       num_alloced += num_regs;
4562       switch (type)
4563         {
4564         case DYNREG_GR:
4565           if (num_alloced > md.rot.num_regs)
4566             {
4567               as_bad ("Used more than the declared %d rotating registers",
4568                       md.rot.num_regs);
4569               goto err;
4570             }
4571           break;
4572         case DYNREG_FR:
4573           if (num_alloced > 96)
4574             {
4575               as_bad ("Used more than the available 96 rotating registers");
4576               goto err;
4577             }
4578           break;
4579         case DYNREG_PR:
4580           if (num_alloced > 48)
4581             {
4582               as_bad ("Used more than the available 48 rotating registers");
4583               goto err;
4584             }
4585           break;
4586
4587         default:
4588           break;
4589         }
4590
4591       name = obstack_alloc (&notes, len + 1);
4592       memcpy (name, start, len);
4593       name[len] = '\0';
4594
4595       if (!*drpp)
4596         {
4597           *drpp = obstack_alloc (&notes, sizeof (*dr));
4598           memset (*drpp, 0, sizeof (*dr));
4599         }
4600
4601       dr = *drpp;
4602       dr->name = name;
4603       dr->num_regs = num_regs;
4604       dr->base = base_reg;
4605       drpp = &dr->next;
4606       base_reg += num_regs;
4607
4608       if (hash_insert (md.dynreg_hash, name, dr))
4609         {
4610           as_bad ("Attempt to redefine register set `%s'", name);
4611           goto err;
4612         }
4613
4614       if (*input_line_pointer != ',')
4615         break;
4616       ++input_line_pointer;     /* skip comma */
4617       SKIP_WHITESPACE ();
4618     }
4619   demand_empty_rest_of_line ();
4620   return;
4621
4622  err:
4623   ignore_rest_of_line ();
4624 }
4625
4626 static void
4627 dot_byteorder (byteorder)
4628      int byteorder;
4629 {
4630   segment_info_type *seginfo = seg_info (now_seg);
4631
4632   if (byteorder == -1)
4633     {
4634       if (seginfo->tc_segment_info_data.endian == 0)
4635         seginfo->tc_segment_info_data.endian = default_big_endian ? 1 : 2;
4636       byteorder = seginfo->tc_segment_info_data.endian == 1;
4637     }
4638   else
4639     seginfo->tc_segment_info_data.endian = byteorder ? 1 : 2;
4640
4641   if (target_big_endian != byteorder)
4642     {
4643       target_big_endian = byteorder;
4644       if (target_big_endian)
4645         {
4646           ia64_number_to_chars = number_to_chars_bigendian;
4647           ia64_float_to_chars = ia64_float_to_chars_bigendian;
4648         }
4649       else
4650         {
4651           ia64_number_to_chars = number_to_chars_littleendian;
4652           ia64_float_to_chars = ia64_float_to_chars_littleendian;
4653         }
4654     }
4655 }
4656
4657 static void
4658 dot_psr (dummy)
4659      int dummy ATTRIBUTE_UNUSED;
4660 {
4661   char *option;
4662   int ch;
4663
4664   while (1)
4665     {
4666       option = input_line_pointer;
4667       ch = get_symbol_end ();
4668       if (strcmp (option, "lsb") == 0)
4669         md.flags &= ~EF_IA_64_BE;
4670       else if (strcmp (option, "msb") == 0)
4671         md.flags |= EF_IA_64_BE;
4672       else if (strcmp (option, "abi32") == 0)
4673         md.flags &= ~EF_IA_64_ABI64;
4674       else if (strcmp (option, "abi64") == 0)
4675         md.flags |= EF_IA_64_ABI64;
4676       else
4677         as_bad ("Unknown psr option `%s'", option);
4678       *input_line_pointer = ch;
4679
4680       SKIP_WHITESPACE ();
4681       if (*input_line_pointer != ',')
4682         break;
4683
4684       ++input_line_pointer;
4685       SKIP_WHITESPACE ();
4686     }
4687   demand_empty_rest_of_line ();
4688 }
4689
4690 static void
4691 dot_ln (dummy)
4692      int dummy ATTRIBUTE_UNUSED;
4693 {
4694   new_logical_line (0, get_absolute_expression ());
4695   demand_empty_rest_of_line ();
4696 }
4697
4698 static char *
4699 parse_section_name ()
4700 {
4701   char *name;
4702   int len;
4703
4704   SKIP_WHITESPACE ();
4705   if (*input_line_pointer == '"')
4706       name = demand_copy_C_string (&len);
4707   else
4708     {
4709       char *start = input_line_pointer;
4710       char c = get_symbol_end ();
4711
4712       if (input_line_pointer == start)
4713         {
4714           as_bad ("Missing section name");
4715           ignore_rest_of_line ();
4716           return 0;
4717         }
4718       name = obstack_copy (&notes, start, input_line_pointer - start + 1);
4719       *input_line_pointer = c;
4720     }
4721   if (!name)
4722     {
4723       ignore_rest_of_line ();
4724       return 0;
4725     }
4726   SKIP_WHITESPACE ();
4727   if (*input_line_pointer != ',')
4728     {
4729       as_bad ("Comma expected after section name");
4730       ignore_rest_of_line ();
4731       return 0;
4732     }
4733   ++input_line_pointer;         /* skip comma */
4734   return name;
4735 }
4736
4737 static void
4738 dot_xdata (size)
4739      int size;
4740 {
4741   char *name = parse_section_name ();
4742   if (!name)
4743     return;
4744
4745   md.keep_pending_output = 1;
4746   set_section (name);
4747   obstack_free (&notes, name);
4748   cons (size);
4749   obj_elf_previous (0);
4750   md.keep_pending_output = 0;
4751 }
4752
4753 /* Why doesn't float_cons() call md_cons_align() the way cons() does?  */
4754
4755 static void
4756 stmt_float_cons (kind)
4757      int kind;
4758 {
4759   size_t alignment;
4760
4761   switch (kind)
4762     {
4763     case 'd':
4764       alignment = 8;
4765       break;
4766
4767     case 'x':
4768     case 'X':
4769       alignment = 16;
4770       break;
4771
4772     case 'f':
4773     default:
4774       alignment = 4;
4775       break;
4776     }
4777   ia64_do_align (alignment);
4778   float_cons (kind);
4779 }
4780
4781 static void
4782 stmt_cons_ua (size)
4783      int size;
4784 {
4785   int saved_auto_align = md.auto_align;
4786
4787   md.auto_align = 0;
4788   cons (size);
4789   md.auto_align = saved_auto_align;
4790 }
4791
4792 static void
4793 dot_xfloat_cons (kind)
4794      int kind;
4795 {
4796   char *name = parse_section_name ();
4797   if (!name)
4798     return;
4799
4800   md.keep_pending_output = 1;
4801   set_section (name);
4802   obstack_free (&notes, name);
4803   stmt_float_cons (kind);
4804   obj_elf_previous (0);
4805   md.keep_pending_output = 0;
4806 }
4807
4808 static void
4809 dot_xstringer (zero)
4810      int zero;
4811 {
4812   char *name = parse_section_name ();
4813   if (!name)
4814     return;
4815
4816   md.keep_pending_output = 1;
4817   set_section (name);
4818   obstack_free (&notes, name);
4819   stringer (zero);
4820   obj_elf_previous (0);
4821   md.keep_pending_output = 0;
4822 }
4823
4824 static void
4825 dot_xdata_ua (size)
4826      int size;
4827 {
4828   int saved_auto_align = md.auto_align;
4829   char *name = parse_section_name ();
4830   if (!name)
4831     return;
4832
4833   md.keep_pending_output = 1;
4834   set_section (name);
4835   obstack_free (&notes, name);
4836   md.auto_align = 0;
4837   cons (size);
4838   md.auto_align = saved_auto_align;
4839   obj_elf_previous (0);
4840   md.keep_pending_output = 0;
4841 }
4842
4843 static void
4844 dot_xfloat_cons_ua (kind)
4845      int kind;
4846 {
4847   int saved_auto_align = md.auto_align;
4848   char *name = parse_section_name ();
4849   if (!name)
4850     return;
4851
4852   md.keep_pending_output = 1;
4853   set_section (name);
4854   obstack_free (&notes, name);
4855   md.auto_align = 0;
4856   stmt_float_cons (kind);
4857   md.auto_align = saved_auto_align;
4858   obj_elf_previous (0);
4859   md.keep_pending_output = 0;
4860 }
4861
4862 /* .reg.val <regname>,value */
4863
4864 static void
4865 dot_reg_val (dummy)
4866      int dummy ATTRIBUTE_UNUSED;
4867 {
4868   expressionS reg;
4869
4870   expression (&reg);
4871   if (reg.X_op != O_register)
4872     {
4873       as_bad (_("Register name expected"));
4874       ignore_rest_of_line ();
4875     }
4876   else if (*input_line_pointer++ != ',')
4877     {
4878       as_bad (_("Comma expected"));
4879       ignore_rest_of_line ();
4880     }
4881   else
4882     {
4883       valueT value = get_absolute_expression ();
4884       int regno = reg.X_add_number;
4885       if (regno < REG_GR || regno > REG_GR + 128)
4886         as_warn (_("Register value annotation ignored"));
4887       else
4888         {
4889           gr_values[regno - REG_GR].known = 1;
4890           gr_values[regno - REG_GR].value = value;
4891           gr_values[regno - REG_GR].path = md.path;
4892         }
4893     }
4894   demand_empty_rest_of_line ();
4895 }
4896
4897 /*
4898   .serialize.data
4899   .serialize.instruction
4900  */
4901 static void
4902 dot_serialize (type)
4903      int type;
4904 {
4905   insn_group_break (0, 0, 0);
4906   if (type)
4907     instruction_serialization ();
4908   else
4909     data_serialization ();
4910   insn_group_break (0, 0, 0);
4911   demand_empty_rest_of_line ();
4912 }
4913
4914 /* select dv checking mode
4915    .auto
4916    .explicit
4917    .default
4918
4919    A stop is inserted when changing modes
4920  */
4921
4922 static void
4923 dot_dv_mode (type)
4924      int type;
4925 {
4926   if (md.manual_bundling)
4927     as_warn (_("Directive invalid within a bundle"));
4928
4929   if (type == 'E' || type == 'A')
4930     md.mode_explicitly_set = 0;
4931   else
4932     md.mode_explicitly_set = 1;
4933
4934   md.detect_dv = 1;
4935   switch (type)
4936     {
4937     case 'A':
4938     case 'a':
4939       if (md.explicit_mode)
4940         insn_group_break (1, 0, 0);
4941       md.explicit_mode = 0;
4942       break;
4943     case 'E':
4944     case 'e':
4945       if (!md.explicit_mode)
4946         insn_group_break (1, 0, 0);
4947       md.explicit_mode = 1;
4948       break;
4949     default:
4950     case 'd':
4951       if (md.explicit_mode != md.default_explicit_mode)
4952         insn_group_break (1, 0, 0);
4953       md.explicit_mode = md.default_explicit_mode;
4954       md.mode_explicitly_set = 0;
4955       break;
4956     }
4957 }
4958
4959 static void
4960 print_prmask (mask)
4961      valueT mask;
4962 {
4963   int regno;
4964   char *comma = "";
4965   for (regno = 0; regno < 64; regno++)
4966     {
4967       if (mask & ((valueT) 1 << regno))
4968         {
4969           fprintf (stderr, "%s p%d", comma, regno);
4970           comma = ",";
4971         }
4972     }
4973 }
4974
4975 /*
4976   .pred.rel.clear [p1 [,p2 [,...]]]     (also .pred.rel "clear" or @clear)
4977   .pred.rel.imply p1, p2                (also .pred.rel "imply" or @imply)
4978   .pred.rel.mutex p1, p2 [,...]         (also .pred.rel "mutex" or @mutex)
4979   .pred.safe_across_calls p1 [, p2 [,...]]
4980  */
4981
4982 static void
4983 dot_pred_rel (type)
4984      int type;
4985 {
4986   valueT mask = 0;
4987   int count = 0;
4988   int p1 = -1, p2 = -1;
4989
4990   if (type == 0)
4991     {
4992       if (*input_line_pointer == '"')
4993         {
4994           int len;
4995           char *form = demand_copy_C_string (&len);
4996
4997           if (strcmp (form, "mutex") == 0)
4998             type = 'm';
4999           else if (strcmp (form, "clear") == 0)
5000             type = 'c';
5001           else if (strcmp (form, "imply") == 0)
5002             type = 'i';
5003           obstack_free (&notes, form);
5004         }
5005       else if (*input_line_pointer == '@')
5006         {
5007           char *form = ++input_line_pointer;
5008           char c = get_symbol_end();
5009
5010           if (strcmp (form, "mutex") == 0)
5011             type = 'm';
5012           else if (strcmp (form, "clear") == 0)
5013             type = 'c';
5014           else if (strcmp (form, "imply") == 0)
5015             type = 'i';
5016           *input_line_pointer = c;
5017         }
5018       else
5019         {
5020           as_bad (_("Missing predicate relation type"));
5021           ignore_rest_of_line ();
5022           return;
5023         }
5024       if (type == 0)
5025         {
5026           as_bad (_("Unrecognized predicate relation type"));
5027           ignore_rest_of_line ();
5028           return;
5029         }
5030       if (*input_line_pointer == ',')
5031         ++input_line_pointer;
5032       SKIP_WHITESPACE ();
5033     }
5034
5035   SKIP_WHITESPACE ();
5036   while (1)
5037     {
5038       valueT bit = 1;
5039       int regno;
5040
5041       if (TOUPPER (*input_line_pointer) != 'P'
5042           || (regno = atoi (++input_line_pointer)) < 0
5043           || regno > 63)
5044         {
5045           as_bad (_("Predicate register expected"));
5046           ignore_rest_of_line ();
5047           return;
5048         }
5049       while (ISDIGIT (*input_line_pointer))
5050         ++input_line_pointer;
5051       if (p1 == -1)
5052         p1 = regno;
5053       else if (p2 == -1)
5054         p2 = regno;
5055       bit <<= regno;
5056       if (mask & bit)
5057         as_warn (_("Duplicate predicate register ignored"));
5058       mask |= bit;
5059       count++;
5060       /* See if it's a range.  */
5061       if (*input_line_pointer == '-')
5062         {
5063           valueT stop = 1;
5064           ++input_line_pointer;
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           stop <<= regno;
5077           if (bit >= stop)
5078             {
5079               as_bad (_("Bad register range"));
5080               ignore_rest_of_line ();
5081               return;
5082             }
5083           while (bit < stop)
5084             {
5085               bit <<= 1;
5086               mask |= bit;
5087               count++;
5088             }
5089           SKIP_WHITESPACE ();
5090         }
5091       if (*input_line_pointer != ',')
5092         break;
5093       ++input_line_pointer;
5094       SKIP_WHITESPACE ();
5095     }
5096
5097   switch (type)
5098     {
5099     case 'c':
5100       if (count == 0)
5101         mask = ~(valueT) 0;
5102       clear_qp_mutex (mask);
5103       clear_qp_implies (mask, (valueT) 0);
5104       break;
5105     case 'i':
5106       if (count != 2 || p1 == -1 || p2 == -1)
5107         as_bad (_("Predicate source and target required"));
5108       else if (p1 == 0 || p2 == 0)
5109         as_bad (_("Use of p0 is not valid in this context"));
5110       else
5111         add_qp_imply (p1, p2);
5112       break;
5113     case 'm':
5114       if (count < 2)
5115         {
5116           as_bad (_("At least two PR arguments expected"));
5117           break;
5118         }
5119       else if (mask & 1)
5120         {
5121           as_bad (_("Use of p0 is not valid in this context"));
5122           break;
5123         }
5124       add_qp_mutex (mask);
5125       break;
5126     case 's':
5127       /* note that we don't override any existing relations */
5128       if (count == 0)
5129         {
5130           as_bad (_("At least one PR argument expected"));
5131           break;
5132         }
5133       if (md.debug_dv)
5134         {
5135           fprintf (stderr, "Safe across calls: ");
5136           print_prmask (mask);
5137           fprintf (stderr, "\n");
5138         }
5139       qp_safe_across_calls = mask;
5140       break;
5141     }
5142   demand_empty_rest_of_line ();
5143 }
5144
5145 /* .entry label [, label [, ...]]
5146    Hint to DV code that the given labels are to be considered entry points.
5147    Otherwise, only global labels are considered entry points.  */
5148
5149 static void
5150 dot_entry (dummy)
5151      int dummy ATTRIBUTE_UNUSED;
5152 {
5153   const char *err;
5154   char *name;
5155   int c;
5156   symbolS *symbolP;
5157
5158   do
5159     {
5160       name = input_line_pointer;
5161       c = get_symbol_end ();
5162       symbolP = symbol_find_or_make (name);
5163
5164       err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (PTR) symbolP);
5165       if (err)
5166         as_fatal (_("Inserting \"%s\" into entry hint table failed: %s"),
5167                   name, err);
5168
5169       *input_line_pointer = c;
5170       SKIP_WHITESPACE ();
5171       c = *input_line_pointer;
5172       if (c == ',')
5173         {
5174           input_line_pointer++;
5175           SKIP_WHITESPACE ();
5176           if (*input_line_pointer == '\n')
5177             c = '\n';
5178         }
5179     }
5180   while (c == ',');
5181
5182   demand_empty_rest_of_line ();
5183 }
5184
5185 /* .mem.offset offset, base
5186    "base" is used to distinguish between offsets from a different base.  */
5187
5188 static void
5189 dot_mem_offset (dummy)
5190   int dummy ATTRIBUTE_UNUSED;
5191 {
5192   md.mem_offset.hint = 1;
5193   md.mem_offset.offset = get_absolute_expression ();
5194   if (*input_line_pointer != ',')
5195     {
5196       as_bad (_("Comma expected"));
5197       ignore_rest_of_line ();
5198       return;
5199     }
5200   ++input_line_pointer;
5201   md.mem_offset.base = get_absolute_expression ();
5202   demand_empty_rest_of_line ();
5203 }
5204
5205 /* ia64-specific pseudo-ops:  */
5206 const pseudo_typeS md_pseudo_table[] =
5207   {
5208     { "radix", dot_radix, 0 },
5209     { "lcomm", s_lcomm_bytes, 1 },
5210     { "loc", dot_loc, 0 },
5211     { "bss", dot_special_section, SPECIAL_SECTION_BSS },
5212     { "sbss", dot_special_section, SPECIAL_SECTION_SBSS },
5213     { "sdata", dot_special_section, SPECIAL_SECTION_SDATA },
5214     { "rodata", dot_special_section, SPECIAL_SECTION_RODATA },
5215     { "comment", dot_special_section, SPECIAL_SECTION_COMMENT },
5216     { "ia_64.unwind", dot_special_section, SPECIAL_SECTION_UNWIND },
5217     { "ia_64.unwind_info", dot_special_section, SPECIAL_SECTION_UNWIND_INFO },
5218     { "init_array", dot_special_section, SPECIAL_SECTION_INIT_ARRAY },
5219     { "fini_array", dot_special_section, SPECIAL_SECTION_FINI_ARRAY },
5220     { "proc", dot_proc, 0 },
5221     { "body", dot_body, 0 },
5222     { "prologue", dot_prologue, 0 },
5223     { "endp", dot_endp, 0 },
5224
5225     { "fframe", dot_fframe, 0 },
5226     { "vframe", dot_vframe, 0 },
5227     { "vframesp", dot_vframesp, 0 },
5228     { "vframepsp", dot_vframepsp, 0 },
5229     { "save", dot_save, 0 },
5230     { "restore", dot_restore, 0 },
5231     { "restorereg", dot_restorereg, 0 },
5232     { "restorereg.p", dot_restorereg_p, 0 },
5233     { "handlerdata", dot_handlerdata, 0 },
5234     { "unwentry", dot_unwentry, 0 },
5235     { "altrp", dot_altrp, 0 },
5236     { "savesp", dot_savemem, 0 },
5237     { "savepsp", dot_savemem, 1 },
5238     { "save.g", dot_saveg, 0 },
5239     { "save.f", dot_savef, 0 },
5240     { "save.b", dot_saveb, 0 },
5241     { "save.gf", dot_savegf, 0 },
5242     { "spill", dot_spill, 0 },
5243     { "spillreg", dot_spillreg, 0 },
5244     { "spillsp", dot_spillmem, 0 },
5245     { "spillpsp", dot_spillmem, 1 },
5246     { "spillreg.p", dot_spillreg_p, 0 },
5247     { "spillsp.p", dot_spillmem_p, 0 },
5248     { "spillpsp.p", dot_spillmem_p, 1 },
5249     { "label_state", dot_label_state, 0 },
5250     { "copy_state", dot_copy_state, 0 },
5251     { "unwabi", dot_unwabi, 0 },
5252     { "personality", dot_personality, 0 },
5253     { "mii", dot_template, 0x0 },
5254     { "mli", dot_template, 0x2 }, /* old format, for compatibility */
5255     { "mlx", dot_template, 0x2 },
5256     { "mmi", dot_template, 0x4 },
5257     { "mfi", dot_template, 0x6 },
5258     { "mmf", dot_template, 0x7 },
5259     { "mib", dot_template, 0x8 },
5260     { "mbb", dot_template, 0x9 },
5261     { "bbb", dot_template, 0xb },
5262     { "mmb", dot_template, 0xc },
5263     { "mfb", dot_template, 0xe },
5264     { "align", dot_align, 0 },
5265     { "regstk", dot_regstk, 0 },
5266     { "rotr", dot_rot, DYNREG_GR },
5267     { "rotf", dot_rot, DYNREG_FR },
5268     { "rotp", dot_rot, DYNREG_PR },
5269     { "lsb", dot_byteorder, 0 },
5270     { "msb", dot_byteorder, 1 },
5271     { "psr", dot_psr, 0 },
5272     { "alias", dot_alias, 0 },
5273     { "secalias", dot_alias, 1 },
5274     { "ln", dot_ln, 0 },                /* source line info (for debugging) */
5275
5276     { "xdata1", dot_xdata, 1 },
5277     { "xdata2", dot_xdata, 2 },
5278     { "xdata4", dot_xdata, 4 },
5279     { "xdata8", dot_xdata, 8 },
5280     { "xdata16", dot_xdata, 16 },
5281     { "xreal4", dot_xfloat_cons, 'f' },
5282     { "xreal8", dot_xfloat_cons, 'd' },
5283     { "xreal10", dot_xfloat_cons, 'x' },
5284     { "xreal16", dot_xfloat_cons, 'X' },
5285     { "xstring", dot_xstringer, 0 },
5286     { "xstringz", dot_xstringer, 1 },
5287
5288     /* unaligned versions:  */
5289     { "xdata2.ua", dot_xdata_ua, 2 },
5290     { "xdata4.ua", dot_xdata_ua, 4 },
5291     { "xdata8.ua", dot_xdata_ua, 8 },
5292     { "xdata16.ua", dot_xdata_ua, 16 },
5293     { "xreal4.ua", dot_xfloat_cons_ua, 'f' },
5294     { "xreal8.ua", dot_xfloat_cons_ua, 'd' },
5295     { "xreal10.ua", dot_xfloat_cons_ua, 'x' },
5296     { "xreal16.ua", dot_xfloat_cons_ua, 'X' },
5297
5298     /* annotations/DV checking support */
5299     { "entry", dot_entry, 0 },
5300     { "mem.offset", dot_mem_offset, 0 },
5301     { "pred.rel", dot_pred_rel, 0 },
5302     { "pred.rel.clear", dot_pred_rel, 'c' },
5303     { "pred.rel.imply", dot_pred_rel, 'i' },
5304     { "pred.rel.mutex", dot_pred_rel, 'm' },
5305     { "pred.safe_across_calls", dot_pred_rel, 's' },
5306     { "reg.val", dot_reg_val, 0 },
5307     { "serialize.data", dot_serialize, 0 },
5308     { "serialize.instruction", dot_serialize, 1 },
5309     { "auto", dot_dv_mode, 'a' },
5310     { "explicit", dot_dv_mode, 'e' },
5311     { "default", dot_dv_mode, 'd' },
5312
5313     /* ??? These are needed to make gas/testsuite/gas/elf/ehopt.s work.
5314        IA-64 aligns data allocation pseudo-ops by default, so we have to
5315        tell it that these ones are supposed to be unaligned.  Long term,
5316        should rewrite so that only IA-64 specific data allocation pseudo-ops
5317        are aligned by default.  */
5318     {"2byte", stmt_cons_ua, 2},
5319     {"4byte", stmt_cons_ua, 4},
5320     {"8byte", stmt_cons_ua, 8},
5321
5322     { NULL, 0, 0 }
5323   };
5324
5325 static const struct pseudo_opcode
5326   {
5327     const char *name;
5328     void (*handler) (int);
5329     int arg;
5330   }
5331 pseudo_opcode[] =
5332   {
5333     /* these are more like pseudo-ops, but don't start with a dot */
5334     { "data1", cons, 1 },
5335     { "data2", cons, 2 },
5336     { "data4", cons, 4 },
5337     { "data8", cons, 8 },
5338     { "data16", cons, 16 },
5339     { "real4", stmt_float_cons, 'f' },
5340     { "real8", stmt_float_cons, 'd' },
5341     { "real10", stmt_float_cons, 'x' },
5342     { "real16", stmt_float_cons, 'X' },
5343     { "string", stringer, 0 },
5344     { "stringz", stringer, 1 },
5345
5346     /* unaligned versions:  */
5347     { "data2.ua", stmt_cons_ua, 2 },
5348     { "data4.ua", stmt_cons_ua, 4 },
5349     { "data8.ua", stmt_cons_ua, 8 },
5350     { "data16.ua", stmt_cons_ua, 16 },
5351     { "real4.ua", float_cons, 'f' },
5352     { "real8.ua", float_cons, 'd' },
5353     { "real10.ua", float_cons, 'x' },
5354     { "real16.ua", float_cons, 'X' },
5355   };
5356
5357 /* Declare a register by creating a symbol for it and entering it in
5358    the symbol table.  */
5359
5360 static symbolS *
5361 declare_register (name, regnum)
5362      const char *name;
5363      int regnum;
5364 {
5365   const char *err;
5366   symbolS *sym;
5367
5368   sym = symbol_new (name, reg_section, regnum, &zero_address_frag);
5369
5370   err = hash_insert (md.reg_hash, S_GET_NAME (sym), (PTR) sym);
5371   if (err)
5372     as_fatal ("Inserting \"%s\" into register table failed: %s",
5373               name, err);
5374
5375   return sym;
5376 }
5377
5378 static void
5379 declare_register_set (prefix, num_regs, base_regnum)
5380      const char *prefix;
5381      int num_regs;
5382      int base_regnum;
5383 {
5384   char name[8];
5385   int i;
5386
5387   for (i = 0; i < num_regs; ++i)
5388     {
5389       sprintf (name, "%s%u", prefix, i);
5390       declare_register (name, base_regnum + i);
5391     }
5392 }
5393
5394 static unsigned int
5395 operand_width (opnd)
5396      enum ia64_opnd opnd;
5397 {
5398   const struct ia64_operand *odesc = &elf64_ia64_operands[opnd];
5399   unsigned int bits = 0;
5400   int i;
5401
5402   bits = 0;
5403   for (i = 0; i < NELEMS (odesc->field) && odesc->field[i].bits; ++i)
5404     bits += odesc->field[i].bits;
5405
5406   return bits;
5407 }
5408
5409 static enum operand_match_result
5410 operand_match (idesc, index, e)
5411      const struct ia64_opcode *idesc;
5412      int index;
5413      expressionS *e;
5414 {
5415   enum ia64_opnd opnd = idesc->operands[index];
5416   int bits, relocatable = 0;
5417   struct insn_fix *fix;
5418   bfd_signed_vma val;
5419
5420   switch (opnd)
5421     {
5422       /* constants:  */
5423
5424     case IA64_OPND_AR_CCV:
5425       if (e->X_op == O_register && e->X_add_number == REG_AR + 32)
5426         return OPERAND_MATCH;
5427       break;
5428
5429     case IA64_OPND_AR_CSD:
5430       if (e->X_op == O_register && e->X_add_number == REG_AR + 25)
5431         return OPERAND_MATCH;
5432       break;
5433
5434     case IA64_OPND_AR_PFS:
5435       if (e->X_op == O_register && e->X_add_number == REG_AR + 64)
5436         return OPERAND_MATCH;
5437       break;
5438
5439     case IA64_OPND_GR0:
5440       if (e->X_op == O_register && e->X_add_number == REG_GR + 0)
5441         return OPERAND_MATCH;
5442       break;
5443
5444     case IA64_OPND_IP:
5445       if (e->X_op == O_register && e->X_add_number == REG_IP)
5446         return OPERAND_MATCH;
5447       break;
5448
5449     case IA64_OPND_PR:
5450       if (e->X_op == O_register && e->X_add_number == REG_PR)
5451         return OPERAND_MATCH;
5452       break;
5453
5454     case IA64_OPND_PR_ROT:
5455       if (e->X_op == O_register && e->X_add_number == REG_PR_ROT)
5456         return OPERAND_MATCH;
5457       break;
5458
5459     case IA64_OPND_PSR:
5460       if (e->X_op == O_register && e->X_add_number == REG_PSR)
5461         return OPERAND_MATCH;
5462       break;
5463
5464     case IA64_OPND_PSR_L:
5465       if (e->X_op == O_register && e->X_add_number == REG_PSR_L)
5466         return OPERAND_MATCH;
5467       break;
5468
5469     case IA64_OPND_PSR_UM:
5470       if (e->X_op == O_register && e->X_add_number == REG_PSR_UM)
5471         return OPERAND_MATCH;
5472       break;
5473
5474     case IA64_OPND_C1:
5475       if (e->X_op == O_constant)
5476         {
5477           if (e->X_add_number == 1)
5478             return OPERAND_MATCH;
5479           else
5480             return OPERAND_OUT_OF_RANGE;
5481         }
5482       break;
5483
5484     case IA64_OPND_C8:
5485       if (e->X_op == O_constant)
5486         {
5487           if (e->X_add_number == 8)
5488             return OPERAND_MATCH;
5489           else
5490             return OPERAND_OUT_OF_RANGE;
5491         }
5492       break;
5493
5494     case IA64_OPND_C16:
5495       if (e->X_op == O_constant)
5496         {
5497           if (e->X_add_number == 16)
5498             return OPERAND_MATCH;
5499           else
5500             return OPERAND_OUT_OF_RANGE;
5501         }
5502       break;
5503
5504       /* register operands:  */
5505
5506     case IA64_OPND_AR3:
5507       if (e->X_op == O_register && e->X_add_number >= REG_AR
5508           && e->X_add_number < REG_AR + 128)
5509         return OPERAND_MATCH;
5510       break;
5511
5512     case IA64_OPND_B1:
5513     case IA64_OPND_B2:
5514       if (e->X_op == O_register && e->X_add_number >= REG_BR
5515           && e->X_add_number < REG_BR + 8)
5516         return OPERAND_MATCH;
5517       break;
5518
5519     case IA64_OPND_CR3:
5520       if (e->X_op == O_register && e->X_add_number >= REG_CR
5521           && e->X_add_number < REG_CR + 128)
5522         return OPERAND_MATCH;
5523       break;
5524
5525     case IA64_OPND_F1:
5526     case IA64_OPND_F2:
5527     case IA64_OPND_F3:
5528     case IA64_OPND_F4:
5529       if (e->X_op == O_register && e->X_add_number >= REG_FR
5530           && e->X_add_number < REG_FR + 128)
5531         return OPERAND_MATCH;
5532       break;
5533
5534     case IA64_OPND_P1:
5535     case IA64_OPND_P2:
5536       if (e->X_op == O_register && e->X_add_number >= REG_P
5537           && e->X_add_number < REG_P + 64)
5538         return OPERAND_MATCH;
5539       break;
5540
5541     case IA64_OPND_R1:
5542     case IA64_OPND_R2:
5543     case IA64_OPND_R3:
5544       if (e->X_op == O_register && e->X_add_number >= REG_GR
5545           && e->X_add_number < REG_GR + 128)
5546         return OPERAND_MATCH;
5547       break;
5548
5549     case IA64_OPND_R3_2:
5550       if (e->X_op == O_register && e->X_add_number >= REG_GR)
5551         {
5552           if (e->X_add_number < REG_GR + 4)
5553             return OPERAND_MATCH;
5554           else if (e->X_add_number < REG_GR + 128)
5555             return OPERAND_OUT_OF_RANGE;
5556         }
5557       break;
5558
5559       /* indirect operands:  */
5560     case IA64_OPND_CPUID_R3:
5561     case IA64_OPND_DBR_R3:
5562     case IA64_OPND_DTR_R3:
5563     case IA64_OPND_ITR_R3:
5564     case IA64_OPND_IBR_R3:
5565     case IA64_OPND_MSR_R3:
5566     case IA64_OPND_PKR_R3:
5567     case IA64_OPND_PMC_R3:
5568     case IA64_OPND_PMD_R3:
5569     case IA64_OPND_RR_R3:
5570       if (e->X_op == O_index && e->X_op_symbol
5571           && (S_GET_VALUE (e->X_op_symbol) - IND_CPUID
5572               == opnd - IA64_OPND_CPUID_R3))
5573         return OPERAND_MATCH;
5574       break;
5575
5576     case IA64_OPND_MR3:
5577       if (e->X_op == O_index && !e->X_op_symbol)
5578         return OPERAND_MATCH;
5579       break;
5580
5581       /* immediate operands:  */
5582     case IA64_OPND_CNT2a:
5583     case IA64_OPND_LEN4:
5584     case IA64_OPND_LEN6:
5585       bits = operand_width (idesc->operands[index]);
5586       if (e->X_op == O_constant)
5587         {
5588           if ((bfd_vma) (e->X_add_number - 1) < ((bfd_vma) 1 << bits))
5589             return OPERAND_MATCH;
5590           else
5591             return OPERAND_OUT_OF_RANGE;
5592         }
5593       break;
5594
5595     case IA64_OPND_CNT2b:
5596       if (e->X_op == O_constant)
5597         {
5598           if ((bfd_vma) (e->X_add_number - 1) < 3)
5599             return OPERAND_MATCH;
5600           else
5601             return OPERAND_OUT_OF_RANGE;
5602         }
5603       break;
5604
5605     case IA64_OPND_CNT2c:
5606       val = e->X_add_number;
5607       if (e->X_op == O_constant)
5608         {
5609           if ((val == 0 || val == 7 || val == 15 || val == 16))
5610             return OPERAND_MATCH;
5611           else
5612             return OPERAND_OUT_OF_RANGE;
5613         }
5614       break;
5615
5616     case IA64_OPND_SOR:
5617       /* SOR must be an integer multiple of 8 */
5618       if (e->X_op == O_constant && e->X_add_number & 0x7)
5619         return OPERAND_OUT_OF_RANGE;
5620     case IA64_OPND_SOF:
5621     case IA64_OPND_SOL:
5622       if (e->X_op == O_constant)
5623         {
5624           if ((bfd_vma) e->X_add_number <= 96)
5625             return OPERAND_MATCH;
5626           else
5627             return OPERAND_OUT_OF_RANGE;
5628         }
5629       break;
5630
5631     case IA64_OPND_IMMU62:
5632       if (e->X_op == O_constant)
5633         {
5634           if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << 62))
5635             return OPERAND_MATCH;
5636           else
5637             return OPERAND_OUT_OF_RANGE;
5638         }
5639       else
5640         {
5641           /* FIXME -- need 62-bit relocation type */
5642           as_bad (_("62-bit relocation not yet implemented"));
5643         }
5644       break;
5645
5646     case IA64_OPND_IMMU64:
5647       if (e->X_op == O_symbol || e->X_op == O_pseudo_fixup
5648           || e->X_op == O_subtract)
5649         {
5650           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5651           fix->code = BFD_RELOC_IA64_IMM64;
5652           if (e->X_op != O_subtract)
5653             {
5654               fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5655               if (e->X_op == O_pseudo_fixup)
5656                 e->X_op = O_symbol;
5657             }
5658
5659           fix->opnd = idesc->operands[index];
5660           fix->expr = *e;
5661           fix->is_pcrel = 0;
5662           ++CURR_SLOT.num_fixups;
5663           return OPERAND_MATCH;
5664         }
5665       else if (e->X_op == O_constant)
5666         return OPERAND_MATCH;
5667       break;
5668
5669     case IA64_OPND_CCNT5:
5670     case IA64_OPND_CNT5:
5671     case IA64_OPND_CNT6:
5672     case IA64_OPND_CPOS6a:
5673     case IA64_OPND_CPOS6b:
5674     case IA64_OPND_CPOS6c:
5675     case IA64_OPND_IMMU2:
5676     case IA64_OPND_IMMU7a:
5677     case IA64_OPND_IMMU7b:
5678     case IA64_OPND_IMMU21:
5679     case IA64_OPND_IMMU24:
5680     case IA64_OPND_MBTYPE4:
5681     case IA64_OPND_MHTYPE8:
5682     case IA64_OPND_POS6:
5683       bits = operand_width (idesc->operands[index]);
5684       if (e->X_op == O_constant)
5685         {
5686           if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5687             return OPERAND_MATCH;
5688           else
5689             return OPERAND_OUT_OF_RANGE;
5690         }
5691       break;
5692
5693     case IA64_OPND_IMMU9:
5694       bits = operand_width (idesc->operands[index]);
5695       if (e->X_op == O_constant)
5696         {
5697           if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5698             {
5699               int lobits = e->X_add_number & 0x3;
5700               if (((bfd_vma) e->X_add_number & 0x3C) != 0 && lobits == 0)
5701                 e->X_add_number |= (bfd_vma) 0x3;
5702               return OPERAND_MATCH;
5703             }
5704           else
5705             return OPERAND_OUT_OF_RANGE;
5706         }
5707       break;
5708
5709     case IA64_OPND_IMM44:
5710       /* least 16 bits must be zero */
5711       if ((e->X_add_number & 0xffff) != 0)
5712         /* XXX technically, this is wrong: we should not be issuing warning
5713            messages until we're sure this instruction pattern is going to
5714            be used! */
5715         as_warn (_("lower 16 bits of mask ignored"));
5716
5717       if (e->X_op == O_constant)
5718         {
5719           if (((e->X_add_number >= 0
5720                 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 44))
5721                || (e->X_add_number < 0
5722                    && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 44))))
5723             {
5724               /* sign-extend */
5725               if (e->X_add_number >= 0
5726                   && (e->X_add_number & ((bfd_vma) 1 << 43)) != 0)
5727                 {
5728                   e->X_add_number |= ~(((bfd_vma) 1 << 44) - 1);
5729                 }
5730               return OPERAND_MATCH;
5731             }
5732           else
5733             return OPERAND_OUT_OF_RANGE;
5734         }
5735       break;
5736
5737     case IA64_OPND_IMM17:
5738       /* bit 0 is a don't care (pr0 is hardwired to 1) */
5739       if (e->X_op == O_constant)
5740         {
5741           if (((e->X_add_number >= 0
5742                 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 17))
5743                || (e->X_add_number < 0
5744                    && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 17))))
5745             {
5746               /* sign-extend */
5747               if (e->X_add_number >= 0
5748                   && (e->X_add_number & ((bfd_vma) 1 << 16)) != 0)
5749                 {
5750                   e->X_add_number |= ~(((bfd_vma) 1 << 17) - 1);
5751                 }
5752               return OPERAND_MATCH;
5753             }
5754           else
5755             return OPERAND_OUT_OF_RANGE;
5756         }
5757       break;
5758
5759     case IA64_OPND_IMM14:
5760     case IA64_OPND_IMM22:
5761       relocatable = 1;
5762     case IA64_OPND_IMM1:
5763     case IA64_OPND_IMM8:
5764     case IA64_OPND_IMM8U4:
5765     case IA64_OPND_IMM8M1:
5766     case IA64_OPND_IMM8M1U4:
5767     case IA64_OPND_IMM8M1U8:
5768     case IA64_OPND_IMM9a:
5769     case IA64_OPND_IMM9b:
5770       bits = operand_width (idesc->operands[index]);
5771       if (relocatable && (e->X_op == O_symbol
5772                           || e->X_op == O_subtract
5773                           || e->X_op == O_pseudo_fixup))
5774         {
5775           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5776
5777           if (idesc->operands[index] == IA64_OPND_IMM14)
5778             fix->code = BFD_RELOC_IA64_IMM14;
5779           else
5780             fix->code = BFD_RELOC_IA64_IMM22;
5781
5782           if (e->X_op != O_subtract)
5783             {
5784               fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5785               if (e->X_op == O_pseudo_fixup)
5786                 e->X_op = O_symbol;
5787             }
5788
5789           fix->opnd = idesc->operands[index];
5790           fix->expr = *e;
5791           fix->is_pcrel = 0;
5792           ++CURR_SLOT.num_fixups;
5793           return OPERAND_MATCH;
5794         }
5795       else if (e->X_op != O_constant
5796                && ! (e->X_op == O_big && opnd == IA64_OPND_IMM8M1U8))
5797         return OPERAND_MISMATCH;
5798
5799       if (opnd == IA64_OPND_IMM8M1U4)
5800         {
5801           /* Zero is not valid for unsigned compares that take an adjusted
5802              constant immediate range.  */
5803           if (e->X_add_number == 0)
5804             return OPERAND_OUT_OF_RANGE;
5805
5806           /* Sign-extend 32-bit unsigned numbers, so that the following range
5807              checks will work.  */
5808           val = e->X_add_number;
5809           if (((val & (~(bfd_vma) 0 << 32)) == 0)
5810               && ((val & ((bfd_vma) 1 << 31)) != 0))
5811             val = ((val << 32) >> 32);
5812
5813           /* Check for 0x100000000.  This is valid because
5814              0x100000000-1 is the same as ((uint32_t) -1).  */
5815           if (val == ((bfd_signed_vma) 1 << 32))
5816             return OPERAND_MATCH;
5817
5818           val = val - 1;
5819         }
5820       else if (opnd == IA64_OPND_IMM8M1U8)
5821         {
5822           /* Zero is not valid for unsigned compares that take an adjusted
5823              constant immediate range.  */
5824           if (e->X_add_number == 0)
5825             return OPERAND_OUT_OF_RANGE;
5826
5827           /* Check for 0x10000000000000000.  */
5828           if (e->X_op == O_big)
5829             {
5830               if (generic_bignum[0] == 0
5831                   && generic_bignum[1] == 0
5832                   && generic_bignum[2] == 0
5833                   && generic_bignum[3] == 0
5834                   && generic_bignum[4] == 1)
5835                 return OPERAND_MATCH;
5836               else
5837                 return OPERAND_OUT_OF_RANGE;
5838             }
5839           else
5840             val = e->X_add_number - 1;
5841         }
5842       else if (opnd == IA64_OPND_IMM8M1)
5843         val = e->X_add_number - 1;
5844       else if (opnd == IA64_OPND_IMM8U4)
5845         {
5846           /* Sign-extend 32-bit unsigned numbers, so that the following range
5847              checks will work.  */
5848           val = e->X_add_number;
5849           if (((val & (~(bfd_vma) 0 << 32)) == 0)
5850               && ((val & ((bfd_vma) 1 << 31)) != 0))
5851             val = ((val << 32) >> 32);
5852         }
5853       else
5854         val = e->X_add_number;
5855
5856       if ((val >= 0 && (bfd_vma) val < ((bfd_vma) 1 << (bits - 1)))
5857           || (val < 0 && (bfd_vma) -val <= ((bfd_vma) 1 << (bits - 1))))
5858         return OPERAND_MATCH;
5859       else
5860         return OPERAND_OUT_OF_RANGE;
5861
5862     case IA64_OPND_INC3:
5863       /* +/- 1, 4, 8, 16 */
5864       val = e->X_add_number;
5865       if (val < 0)
5866         val = -val;
5867       if (e->X_op == O_constant)
5868         {
5869           if ((val == 1 || val == 4 || val == 8 || val == 16))
5870             return OPERAND_MATCH;
5871           else
5872             return OPERAND_OUT_OF_RANGE;
5873         }
5874       break;
5875
5876     case IA64_OPND_TGT25:
5877     case IA64_OPND_TGT25b:
5878     case IA64_OPND_TGT25c:
5879     case IA64_OPND_TGT64:
5880       if (e->X_op == O_symbol)
5881         {
5882           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5883           if (opnd == IA64_OPND_TGT25)
5884             fix->code = BFD_RELOC_IA64_PCREL21F;
5885           else if (opnd == IA64_OPND_TGT25b)
5886             fix->code = BFD_RELOC_IA64_PCREL21M;
5887           else if (opnd == IA64_OPND_TGT25c)
5888             fix->code = BFD_RELOC_IA64_PCREL21B;
5889           else if (opnd == IA64_OPND_TGT64)
5890             fix->code = BFD_RELOC_IA64_PCREL60B;
5891           else
5892             abort ();
5893
5894           fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5895           fix->opnd = idesc->operands[index];
5896           fix->expr = *e;
5897           fix->is_pcrel = 1;
5898           ++CURR_SLOT.num_fixups;
5899           return OPERAND_MATCH;
5900         }
5901     case IA64_OPND_TAG13:
5902     case IA64_OPND_TAG13b:
5903       switch (e->X_op)
5904         {
5905         case O_constant:
5906           return OPERAND_MATCH;
5907
5908         case O_symbol:
5909           fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5910           /* There are no external relocs for TAG13/TAG13b fields, so we
5911              create a dummy reloc.  This will not live past md_apply_fix3.  */
5912           fix->code = BFD_RELOC_UNUSED;
5913           fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5914           fix->opnd = idesc->operands[index];
5915           fix->expr = *e;
5916           fix->is_pcrel = 1;
5917           ++CURR_SLOT.num_fixups;
5918           return OPERAND_MATCH;
5919
5920         default:
5921           break;
5922         }
5923       break;
5924
5925     case IA64_OPND_LDXMOV:
5926       fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5927       fix->code = BFD_RELOC_IA64_LDXMOV;
5928       fix->opnd = idesc->operands[index];
5929       fix->expr = *e;
5930       fix->is_pcrel = 0;
5931       ++CURR_SLOT.num_fixups;
5932       return OPERAND_MATCH;
5933
5934     default:
5935       break;
5936     }
5937   return OPERAND_MISMATCH;
5938 }
5939
5940 static int
5941 parse_operand (e)
5942      expressionS *e;
5943 {
5944   int sep = '\0';
5945
5946   memset (e, 0, sizeof (*e));
5947   e->X_op = O_absent;
5948   SKIP_WHITESPACE ();
5949   if (*input_line_pointer != '}')
5950     expression (e);
5951   sep = *input_line_pointer++;
5952
5953   if (sep == '}')
5954     {
5955       if (!md.manual_bundling)
5956         as_warn ("Found '}' when manual bundling is off");
5957       else
5958         CURR_SLOT.manual_bundling_off = 1;
5959       md.manual_bundling = 0;
5960       sep = '\0';
5961     }
5962   return sep;
5963 }
5964
5965 /* Returns the next entry in the opcode table that matches the one in
5966    IDESC, and frees the entry in IDESC.  If no matching entry is
5967    found, NULL is returned instead.  */
5968
5969 static struct ia64_opcode *
5970 get_next_opcode (struct ia64_opcode *idesc)
5971 {
5972   struct ia64_opcode *next = ia64_find_next_opcode (idesc);
5973   ia64_free_opcode (idesc);
5974   return next;
5975 }
5976
5977 /* Parse the operands for the opcode and find the opcode variant that
5978    matches the specified operands, or NULL if no match is possible.  */
5979
5980 static struct ia64_opcode *
5981 parse_operands (idesc)
5982      struct ia64_opcode *idesc;
5983 {
5984   int i = 0, highest_unmatched_operand, num_operands = 0, num_outputs = 0;
5985   int error_pos, out_of_range_pos, curr_out_of_range_pos, sep = 0;
5986   enum ia64_opnd expected_operand = IA64_OPND_NIL;
5987   enum operand_match_result result;
5988   char mnemonic[129];
5989   char *first_arg = 0, *end, *saved_input_pointer;
5990   unsigned int sof;
5991
5992   assert (strlen (idesc->name) <= 128);
5993
5994   strcpy (mnemonic, idesc->name);
5995   if (idesc->operands[2] == IA64_OPND_SOF
5996       || idesc->operands[1] == IA64_OPND_SOF)
5997     {
5998       /* To make the common idiom "alloc loc?=ar.pfs,0,1,0,0" work, we
5999          can't parse the first operand until we have parsed the
6000          remaining operands of the "alloc" instruction.  */
6001       SKIP_WHITESPACE ();
6002       first_arg = input_line_pointer;
6003       end = strchr (input_line_pointer, '=');
6004       if (!end)
6005         {
6006           as_bad ("Expected separator `='");
6007           return 0;
6008         }
6009       input_line_pointer = end + 1;
6010       ++i;
6011       ++num_outputs;
6012     }
6013
6014   for (; ; ++i)
6015     {
6016       if (i < NELEMS (CURR_SLOT.opnd)) 
6017         {
6018           sep = parse_operand (CURR_SLOT.opnd + i);
6019           if (CURR_SLOT.opnd[i].X_op == O_absent)
6020             break;
6021         }
6022       else
6023         {
6024           expressionS dummy;
6025
6026           sep = parse_operand (&dummy);
6027           if (dummy.X_op == O_absent)
6028             break;
6029         }
6030
6031       ++num_operands;
6032
6033       if (sep != '=' && sep != ',')
6034         break;
6035
6036       if (sep == '=')
6037         {
6038           if (num_outputs > 0)
6039             as_bad ("Duplicate equal sign (=) in instruction");
6040           else
6041             num_outputs = i + 1;
6042         }
6043     }
6044   if (sep != '\0')
6045     {
6046       as_bad ("Illegal operand separator `%c'", sep);
6047       return 0;
6048     }
6049
6050   if (idesc->operands[2] == IA64_OPND_SOF
6051       || idesc->operands[1] == IA64_OPND_SOF)
6052     {
6053       /* map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r */
6054       know (strcmp (idesc->name, "alloc") == 0);
6055       i = (CURR_SLOT.opnd[1].X_op == O_register
6056           && CURR_SLOT.opnd[1].X_add_number == REG_AR + AR_PFS) ? 2 : 1;
6057       if (num_operands == i + 3 /* first_arg not included in this count! */
6058           && CURR_SLOT.opnd[i].X_op == O_constant
6059           && CURR_SLOT.opnd[i + 1].X_op == O_constant
6060           && CURR_SLOT.opnd[i + 2].X_op == O_constant
6061           && CURR_SLOT.opnd[i + 3].X_op == O_constant)
6062         {
6063           sof = set_regstack (CURR_SLOT.opnd[i].X_add_number,
6064                               CURR_SLOT.opnd[i + 1].X_add_number,
6065                               CURR_SLOT.opnd[i + 2].X_add_number,
6066                               CURR_SLOT.opnd[i + 3].X_add_number);
6067
6068           /* now we can parse the first arg:  */
6069           saved_input_pointer = input_line_pointer;
6070           input_line_pointer = first_arg;
6071           sep = parse_operand (CURR_SLOT.opnd + 0);
6072           if (sep != '=')
6073             --num_outputs;      /* force error */
6074           input_line_pointer = saved_input_pointer;
6075
6076           CURR_SLOT.opnd[i].X_add_number = sof;
6077           CURR_SLOT.opnd[i + 1].X_add_number
6078             = sof - CURR_SLOT.opnd[i + 2].X_add_number;
6079           CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3];
6080         }
6081     }
6082
6083   highest_unmatched_operand = -4;
6084   curr_out_of_range_pos = -1;
6085   error_pos = 0;
6086   for (; idesc; idesc = get_next_opcode (idesc))
6087     {
6088       if (num_outputs != idesc->num_outputs)
6089         continue;               /* mismatch in # of outputs */
6090       if (highest_unmatched_operand < 0)
6091         highest_unmatched_operand |= 1;
6092       if (num_operands > NELEMS (idesc->operands)
6093           || (num_operands < NELEMS (idesc->operands)
6094            && idesc->operands[num_operands])
6095           || (num_operands > 0 && !idesc->operands[num_operands - 1]))
6096         continue;               /* mismatch in number of arguments */
6097       if (highest_unmatched_operand < 0)
6098         highest_unmatched_operand |= 2;
6099
6100       CURR_SLOT.num_fixups = 0;
6101
6102       /* Try to match all operands.  If we see an out-of-range operand,
6103          then continue trying to match the rest of the operands, since if
6104          the rest match, then this idesc will give the best error message.  */
6105
6106       out_of_range_pos = -1;
6107       for (i = 0; i < num_operands && idesc->operands[i]; ++i)
6108         {
6109           result = operand_match (idesc, i, CURR_SLOT.opnd + i);
6110           if (result != OPERAND_MATCH)
6111             {
6112               if (result != OPERAND_OUT_OF_RANGE)
6113                 break;
6114               if (out_of_range_pos < 0)
6115                 /* remember position of the first out-of-range operand: */
6116                 out_of_range_pos = i;
6117             }
6118         }
6119
6120       /* If we did not match all operands, or if at least one operand was
6121          out-of-range, then this idesc does not match.  Keep track of which
6122          idesc matched the most operands before failing.  If we have two
6123          idescs that failed at the same position, and one had an out-of-range
6124          operand, then prefer the out-of-range operand.  Thus if we have
6125          "add r0=0x1000000,r1" we get an error saying the constant is out
6126          of range instead of an error saying that the constant should have been
6127          a register.  */
6128
6129       if (i != num_operands || out_of_range_pos >= 0)
6130         {
6131           if (i > highest_unmatched_operand
6132               || (i == highest_unmatched_operand
6133                   && out_of_range_pos > curr_out_of_range_pos))
6134             {
6135               highest_unmatched_operand = i;
6136               if (out_of_range_pos >= 0)
6137                 {
6138                   expected_operand = idesc->operands[out_of_range_pos];
6139                   error_pos = out_of_range_pos;
6140                 }
6141               else
6142                 {
6143                   expected_operand = idesc->operands[i];
6144                   error_pos = i;
6145                 }
6146               curr_out_of_range_pos = out_of_range_pos;
6147             }
6148           continue;
6149         }
6150
6151       break;
6152     }
6153   if (!idesc)
6154     {
6155       if (expected_operand)
6156         as_bad ("Operand %u of `%s' should be %s",
6157                 error_pos + 1, mnemonic,
6158                 elf64_ia64_operands[expected_operand].desc);
6159       else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 1))
6160         as_bad ("Wrong number of output operands");
6161       else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 2))
6162         as_bad ("Wrong number of input operands");
6163       else
6164         as_bad ("Operand mismatch");
6165       return 0;
6166     }
6167   return idesc;
6168 }
6169
6170 static void
6171 build_insn (slot, insnp)
6172      struct slot *slot;
6173      bfd_vma *insnp;
6174 {
6175   const struct ia64_operand *odesc, *o2desc;
6176   struct ia64_opcode *idesc = slot->idesc;
6177   bfd_signed_vma insn, val;
6178   const char *err;
6179   int i;
6180
6181   insn = idesc->opcode | slot->qp_regno;
6182
6183   for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; ++i)
6184     {
6185       if (slot->opnd[i].X_op == O_register
6186           || slot->opnd[i].X_op == O_constant
6187           || slot->opnd[i].X_op == O_index)
6188         val = slot->opnd[i].X_add_number;
6189       else if (slot->opnd[i].X_op == O_big)
6190         {
6191           /* This must be the value 0x10000000000000000.  */
6192           assert (idesc->operands[i] == IA64_OPND_IMM8M1U8);
6193           val = 0;
6194         }
6195       else
6196         val = 0;
6197
6198       switch (idesc->operands[i])
6199         {
6200         case IA64_OPND_IMMU64:
6201           *insnp++ = (val >> 22) & 0x1ffffffffffLL;
6202           insn |= (((val & 0x7f) << 13) | (((val >> 7) & 0x1ff) << 27)
6203                    | (((val >> 16) & 0x1f) << 22) | (((val >> 21) & 0x1) << 21)
6204                    | (((val >> 63) & 0x1) << 36));
6205           continue;
6206
6207         case IA64_OPND_IMMU62:
6208           val &= 0x3fffffffffffffffULL;
6209           if (val != slot->opnd[i].X_add_number)
6210             as_warn (_("Value truncated to 62 bits"));
6211           *insnp++ = (val >> 21) & 0x1ffffffffffLL;
6212           insn |= (((val & 0xfffff) << 6) | (((val >> 20) & 0x1) << 36));
6213           continue;
6214
6215         case IA64_OPND_TGT64:
6216           val >>= 4;
6217           *insnp++ = ((val >> 20) & 0x7fffffffffLL) << 2;
6218           insn |= ((((val >> 59) & 0x1) << 36)
6219                    | (((val >> 0) & 0xfffff) << 13));
6220           continue;
6221
6222         case IA64_OPND_AR3:
6223           val -= REG_AR;
6224           break;
6225
6226         case IA64_OPND_B1:
6227         case IA64_OPND_B2:
6228           val -= REG_BR;
6229           break;
6230
6231         case IA64_OPND_CR3:
6232           val -= REG_CR;
6233           break;
6234
6235         case IA64_OPND_F1:
6236         case IA64_OPND_F2:
6237         case IA64_OPND_F3:
6238         case IA64_OPND_F4:
6239           val -= REG_FR;
6240           break;
6241
6242         case IA64_OPND_P1:
6243         case IA64_OPND_P2:
6244           val -= REG_P;
6245           break;
6246
6247         case IA64_OPND_R1:
6248         case IA64_OPND_R2:
6249         case IA64_OPND_R3:
6250         case IA64_OPND_R3_2:
6251         case IA64_OPND_CPUID_R3:
6252         case IA64_OPND_DBR_R3:
6253         case IA64_OPND_DTR_R3:
6254         case IA64_OPND_ITR_R3:
6255         case IA64_OPND_IBR_R3:
6256         case IA64_OPND_MR3:
6257         case IA64_OPND_MSR_R3:
6258         case IA64_OPND_PKR_R3:
6259         case IA64_OPND_PMC_R3:
6260         case IA64_OPND_PMD_R3:
6261         case IA64_OPND_RR_R3:
6262           val -= REG_GR;
6263           break;
6264
6265         default:
6266           break;
6267         }
6268
6269       odesc = elf64_ia64_operands + idesc->operands[i];
6270       err = (*odesc->insert) (odesc, val, &insn);
6271       if (err)
6272         as_bad_where (slot->src_file, slot->src_line,
6273                       "Bad operand value: %s", err);
6274       if (idesc->flags & IA64_OPCODE_PSEUDO)
6275         {
6276           if ((idesc->flags & IA64_OPCODE_F2_EQ_F3)
6277               && odesc == elf64_ia64_operands + IA64_OPND_F3)
6278             {
6279               o2desc = elf64_ia64_operands + IA64_OPND_F2;
6280               (*o2desc->insert) (o2desc, val, &insn);
6281             }
6282           if ((idesc->flags & IA64_OPCODE_LEN_EQ_64MCNT)
6283               && (odesc == elf64_ia64_operands + IA64_OPND_CPOS6a
6284                   || odesc == elf64_ia64_operands + IA64_OPND_POS6))
6285             {
6286               o2desc = elf64_ia64_operands + IA64_OPND_LEN6;
6287               (*o2desc->insert) (o2desc, 64 - val, &insn);
6288             }
6289         }
6290     }
6291   *insnp = insn;
6292 }
6293
6294 static void
6295 emit_one_bundle ()
6296 {
6297   int manual_bundling_off = 0, manual_bundling = 0;
6298   enum ia64_unit required_unit, insn_unit = 0;
6299   enum ia64_insn_type type[3], insn_type;
6300   unsigned int template, orig_template;
6301   bfd_vma insn[3] = { -1, -1, -1 };
6302   struct ia64_opcode *idesc;
6303   int end_of_insn_group = 0, user_template = -1;
6304   int n, i, j, first, curr;
6305   unw_rec_list *ptr, *last_ptr, *end_ptr;
6306   bfd_vma t0 = 0, t1 = 0;
6307   struct label_fix *lfix;
6308   struct insn_fix *ifix;
6309   char mnemonic[16];
6310   fixS *fix;
6311   char *f;
6312   int addr_mod;
6313
6314   first = (md.curr_slot + NUM_SLOTS - md.num_slots_in_use) % NUM_SLOTS;
6315   know (first >= 0 & first < NUM_SLOTS);
6316   n = MIN (3, md.num_slots_in_use);
6317
6318   /* Determine template: user user_template if specified, best match
6319      otherwise:  */
6320
6321   if (md.slot[first].user_template >= 0)
6322     user_template = template = md.slot[first].user_template;
6323   else
6324     {
6325       /* Auto select appropriate template.  */
6326       memset (type, 0, sizeof (type));
6327       curr = first;
6328       for (i = 0; i < n; ++i)
6329         {
6330           if (md.slot[curr].label_fixups && i != 0)
6331             break;
6332           type[i] = md.slot[curr].idesc->type;
6333           curr = (curr + 1) % NUM_SLOTS;
6334         }
6335       template = best_template[type[0]][type[1]][type[2]];
6336     }
6337
6338   /* initialize instructions with appropriate nops:  */
6339   for (i = 0; i < 3; ++i)
6340     insn[i] = nop[ia64_templ_desc[template].exec_unit[i]];
6341
6342   f = frag_more (16);
6343
6344   /* Check to see if this bundle is at an offset that is a multiple of 16-bytes
6345      from the start of the frag.  */
6346   addr_mod = frag_now_fix () & 15;
6347   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
6348     as_bad (_("instruction address is not a multiple of 16"));
6349   frag_now->insn_addr = addr_mod;
6350   frag_now->has_code = 1;
6351
6352   /* now fill in slots with as many insns as possible:  */
6353   curr = first;
6354   idesc = md.slot[curr].idesc;
6355   end_of_insn_group = 0;
6356   for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
6357     {
6358       /* If we have unwind records, we may need to update some now.  */
6359       ptr = md.slot[curr].unwind_record;
6360       if (ptr)
6361         {
6362           /* Find the last prologue/body record in the list for the current
6363              insn, and set the slot number for all records up to that point.
6364              This needs to be done now, because prologue/body records refer to
6365              the current point, not the point after the instruction has been
6366              issued.  This matters because there may have been nops emitted
6367              meanwhile.  Any non-prologue non-body record followed by a
6368              prologue/body record must also refer to the current point.  */
6369           last_ptr = NULL;
6370           end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6371           for (; ptr != end_ptr; ptr = ptr->next)
6372             if (ptr->r.type == prologue || ptr->r.type == prologue_gr
6373                 || ptr->r.type == body)
6374               last_ptr = ptr;
6375           if (last_ptr)
6376             {
6377               /* Make last_ptr point one after the last prologue/body
6378                  record.  */
6379               last_ptr = last_ptr->next;
6380               for (ptr = md.slot[curr].unwind_record; ptr != last_ptr;
6381                    ptr = ptr->next)
6382                 {
6383                   ptr->slot_number = (unsigned long) f + i;
6384                   ptr->slot_frag = frag_now;
6385                 }
6386               /* Remove the initialized records, so that we won't accidentally
6387                  update them again if we insert a nop and continue.  */
6388               md.slot[curr].unwind_record = last_ptr;
6389             }
6390         }
6391
6392       manual_bundling_off = md.slot[curr].manual_bundling_off;
6393       if (md.slot[curr].manual_bundling_on)
6394         {
6395           if (curr == first)
6396             manual_bundling = 1;
6397           else
6398           break; /* Need to start a new bundle.  */
6399         }
6400
6401       if (idesc->flags & IA64_OPCODE_SLOT2)
6402         {
6403           if (manual_bundling && !manual_bundling_off)
6404             {
6405               as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6406                             "`%s' must be last in bundle", idesc->name);
6407               if (i < 2)
6408                 manual_bundling = -1; /* Suppress meaningless post-loop errors.  */
6409             }
6410           i = 2;
6411         }
6412       if (idesc->flags & IA64_OPCODE_LAST)
6413         {
6414           int required_slot;
6415           unsigned int required_template;
6416
6417           /* If we need a stop bit after an M slot, our only choice is
6418              template 5 (M;;MI).  If we need a stop bit after a B
6419              slot, our only choice is to place it at the end of the
6420              bundle, because the only available templates are MIB,
6421              MBB, BBB, MMB, and MFB.  We don't handle anything other
6422              than M and B slots because these are the only kind of
6423              instructions that can have the IA64_OPCODE_LAST bit set.  */
6424           required_template = template;
6425           switch (idesc->type)
6426             {
6427             case IA64_TYPE_M:
6428               required_slot = 0;
6429               required_template = 5;
6430               break;
6431
6432             case IA64_TYPE_B:
6433               required_slot = 2;
6434               break;
6435
6436             default:
6437               as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6438                             "Internal error: don't know how to force %s to end"
6439                             "of instruction group", idesc->name);
6440               required_slot = i;
6441               break;
6442             }
6443           if (manual_bundling
6444               && (i > required_slot
6445                   || (required_slot == 2 && !manual_bundling_off)
6446                   || (user_template >= 0
6447                       /* Changing from MMI to M;MI is OK.  */
6448                       && (template ^ required_template) > 1)))
6449             {
6450               as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6451                             "`%s' must be last in instruction group",
6452                             idesc->name);
6453               if (i < 2 && required_slot == 2 && !manual_bundling_off)
6454                 manual_bundling = -1; /* Suppress meaningless post-loop errors.  */
6455             }
6456           if (required_slot < i)
6457             /* Can't fit this instruction.  */
6458             break;
6459
6460           i = required_slot;
6461           if (required_template != template)
6462             {
6463               /* If we switch the template, we need to reset the NOPs
6464                  after slot i.  The slot-types of the instructions ahead
6465                  of i never change, so we don't need to worry about
6466                  changing NOPs in front of this slot.  */
6467               for (j = i; j < 3; ++j)
6468                 insn[j] = nop[ia64_templ_desc[required_template].exec_unit[j]];
6469             }
6470           template = required_template;
6471         }
6472       if (curr != first && md.slot[curr].label_fixups)
6473         {
6474           if (manual_bundling)
6475             {
6476               as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6477                           "Label must be first in a bundle");
6478               manual_bundling = -1; /* Suppress meaningless post-loop errors.  */
6479             }
6480           /* This insn must go into the first slot of a bundle.  */
6481           break;
6482         }
6483
6484       if (end_of_insn_group && md.num_slots_in_use >= 1)
6485         {
6486           /* We need an instruction group boundary in the middle of a
6487              bundle.  See if we can switch to an other template with
6488              an appropriate boundary.  */
6489
6490           orig_template = template;
6491           if (i == 1 && (user_template == 4
6492                          || (user_template < 0
6493                              && (ia64_templ_desc[template].exec_unit[0]
6494                                  == IA64_UNIT_M))))
6495             {
6496               template = 5;
6497               end_of_insn_group = 0;
6498             }
6499           else if (i == 2 && (user_template == 0
6500                               || (user_template < 0
6501                                   && (ia64_templ_desc[template].exec_unit[1]
6502                                       == IA64_UNIT_I)))
6503                    /* This test makes sure we don't switch the template if
6504                       the next instruction is one that needs to be first in
6505                       an instruction group.  Since all those instructions are
6506                       in the M group, there is no way such an instruction can
6507                       fit in this bundle even if we switch the template.  The
6508                       reason we have to check for this is that otherwise we
6509                       may end up generating "MI;;I M.." which has the deadly
6510                       effect that the second M instruction is no longer the
6511                       first in the group! --davidm 99/12/16  */
6512                    && (idesc->flags & IA64_OPCODE_FIRST) == 0)
6513             {
6514               template = 1;
6515               end_of_insn_group = 0;
6516             }
6517           else if (i == 1
6518                    && user_template == 0
6519                    && !(idesc->flags & IA64_OPCODE_FIRST))
6520             /* Use the next slot.  */
6521             continue;
6522           else if (curr != first)
6523             /* can't fit this insn */
6524             break;
6525
6526           if (template != orig_template)
6527             /* if we switch the template, we need to reset the NOPs
6528                after slot i.  The slot-types of the instructions ahead
6529                of i never change, so we don't need to worry about
6530                changing NOPs in front of this slot.  */
6531             for (j = i; j < 3; ++j)
6532               insn[j] = nop[ia64_templ_desc[template].exec_unit[j]];
6533         }
6534       required_unit = ia64_templ_desc[template].exec_unit[i];
6535
6536       /* resolve dynamic opcodes such as "break", "hint", and "nop":  */
6537       if (idesc->type == IA64_TYPE_DYN)
6538         {
6539           enum ia64_opnd opnd1, opnd2;
6540
6541           if ((strcmp (idesc->name, "nop") == 0)
6542               || (strcmp (idesc->name, "hint") == 0)
6543               || (strcmp (idesc->name, "break") == 0))
6544             insn_unit = required_unit;
6545           else if (strcmp (idesc->name, "chk.s") == 0
6546               || strcmp (idesc->name, "mov") == 0)
6547             {
6548               insn_unit = IA64_UNIT_M;
6549               if (required_unit == IA64_UNIT_I
6550                   || (required_unit == IA64_UNIT_F && template == 6))
6551                 insn_unit = IA64_UNIT_I;
6552             }
6553           else
6554             as_fatal ("emit_one_bundle: unexpected dynamic op");
6555
6556           sprintf (mnemonic, "%s.%c", idesc->name, "?imbfxx"[insn_unit]);
6557           opnd1 = idesc->operands[0];
6558           opnd2 = idesc->operands[1];
6559           ia64_free_opcode (idesc);
6560           idesc = ia64_find_opcode (mnemonic);
6561           /* moves to/from ARs have collisions */
6562           if (opnd1 == IA64_OPND_AR3 || opnd2 == IA64_OPND_AR3)
6563             {
6564               while (idesc != NULL
6565                      && (idesc->operands[0] != opnd1
6566                          || idesc->operands[1] != opnd2))
6567                 idesc = get_next_opcode (idesc);
6568             }
6569           md.slot[curr].idesc = idesc;
6570         }
6571       else
6572         {
6573           insn_type = idesc->type;
6574           insn_unit = IA64_UNIT_NIL;
6575           switch (insn_type)
6576             {
6577             case IA64_TYPE_A:
6578               if (required_unit == IA64_UNIT_I || required_unit == IA64_UNIT_M)
6579                 insn_unit = required_unit;
6580               break;
6581             case IA64_TYPE_X: insn_unit = IA64_UNIT_L; break;
6582             case IA64_TYPE_I: insn_unit = IA64_UNIT_I; break;
6583             case IA64_TYPE_M: insn_unit = IA64_UNIT_M; break;
6584             case IA64_TYPE_B: insn_unit = IA64_UNIT_B; break;
6585             case IA64_TYPE_F: insn_unit = IA64_UNIT_F; break;
6586             default:                                   break;
6587             }
6588         }
6589
6590       if (insn_unit != required_unit)
6591         {
6592           if (required_unit == IA64_UNIT_L
6593               && insn_unit == IA64_UNIT_I
6594               && !(idesc->flags & IA64_OPCODE_X_IN_MLX))
6595             {
6596               /* we got ourselves an MLX template but the current
6597                  instruction isn't an X-unit, or an I-unit instruction
6598                  that can go into the X slot of an MLX template.  Duh.  */
6599               if (md.num_slots_in_use >= NUM_SLOTS)
6600                 {
6601                   as_bad_where (md.slot[curr].src_file,
6602                                 md.slot[curr].src_line,
6603                                 "`%s' can't go in X slot of "
6604                                 "MLX template", idesc->name);
6605                   /* drop this insn so we don't livelock:  */
6606                   --md.num_slots_in_use;
6607                 }
6608               break;
6609             }
6610           continue;             /* try next slot */
6611         }
6612
6613       if (debug_type == DEBUG_DWARF2 || md.slot[curr].loc_directive_seen)
6614         {
6615           bfd_vma addr = frag_now->fr_address + frag_now_fix () - 16 + i;
6616
6617           md.slot[curr].loc_directive_seen = 0;
6618           dwarf2_gen_line_info (addr, &md.slot[curr].debug_line);
6619         }
6620
6621       build_insn (md.slot + curr, insn + i);
6622
6623       ptr = md.slot[curr].unwind_record;
6624       if (ptr)
6625         {
6626           /* Set slot numbers for all remaining unwind records belonging to the
6627              current insn.  There can not be any prologue/body unwind records
6628              here.  */
6629           end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6630           for (; ptr != end_ptr; ptr = ptr->next)
6631             {
6632               ptr->slot_number = (unsigned long) f + i;
6633               ptr->slot_frag = frag_now;
6634             }
6635           md.slot[curr].unwind_record = NULL;
6636         }
6637
6638       if (required_unit == IA64_UNIT_L)
6639         {
6640           know (i == 1);
6641           /* skip one slot for long/X-unit instructions */
6642           ++i;
6643         }
6644       --md.num_slots_in_use;
6645
6646       /* now is a good time to fix up the labels for this insn:  */
6647       for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next)
6648         {
6649           S_SET_VALUE (lfix->sym, frag_now_fix () - 16);
6650           symbol_set_frag (lfix->sym, frag_now);
6651         }
6652       /* and fix up the tags also.  */
6653       for (lfix = md.slot[curr].tag_fixups; lfix; lfix = lfix->next)
6654         {
6655           S_SET_VALUE (lfix->sym, frag_now_fix () - 16 + i);
6656           symbol_set_frag (lfix->sym, frag_now);
6657         }
6658
6659       for (j = 0; j < md.slot[curr].num_fixups; ++j)
6660         {
6661           ifix = md.slot[curr].fixup + j;
6662           fix = fix_new_exp (frag_now, frag_now_fix () - 16 + i, 8,
6663                              &ifix->expr, ifix->is_pcrel, ifix->code);
6664           fix->tc_fix_data.opnd = ifix->opnd;
6665           fix->fx_plt = (fix->fx_r_type == BFD_RELOC_IA64_PLTOFF22);
6666           fix->fx_file = md.slot[curr].src_file;
6667           fix->fx_line = md.slot[curr].src_line;
6668         }
6669
6670       end_of_insn_group = md.slot[curr].end_of_insn_group;
6671
6672       /* clear slot:  */
6673       ia64_free_opcode (md.slot[curr].idesc);
6674       memset (md.slot + curr, 0, sizeof (md.slot[curr]));
6675       md.slot[curr].user_template = -1;
6676
6677       if (manual_bundling_off)
6678         {
6679           manual_bundling = 0;
6680           break;
6681         }
6682       curr = (curr + 1) % NUM_SLOTS;
6683       idesc = md.slot[curr].idesc;
6684     }
6685   if (manual_bundling > 0)
6686     {
6687       if (md.num_slots_in_use > 0)
6688         {
6689           as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6690                         "`%s' does not fit into %s template",
6691                         idesc->name, ia64_templ_desc[template].name);
6692           --md.num_slots_in_use;
6693         }
6694       else
6695         as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6696                       "Missing '}' at end of file");
6697     }
6698   know (md.num_slots_in_use < NUM_SLOTS);
6699
6700   t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
6701   t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
6702
6703   number_to_chars_littleendian (f + 0, t0, 8);
6704   number_to_chars_littleendian (f + 8, t1, 8);
6705
6706   if (unwind.list)
6707     {
6708       unwind.list->next_slot_number = (unsigned long) f + 16;
6709       unwind.list->next_slot_frag = frag_now;
6710     }
6711 }
6712
6713 int
6714 md_parse_option (c, arg)
6715      int c;
6716      char *arg;
6717 {
6718
6719   switch (c)
6720     {
6721     /* Switches from the Intel assembler.  */
6722     case 'm':
6723       if (strcmp (arg, "ilp64") == 0
6724           || strcmp (arg, "lp64") == 0
6725           || strcmp (arg, "p64") == 0)
6726         {
6727           md.flags |= EF_IA_64_ABI64;
6728         }
6729       else if (strcmp (arg, "ilp32") == 0)
6730         {
6731           md.flags &= ~EF_IA_64_ABI64;
6732         }
6733       else if (strcmp (arg, "le") == 0)
6734         {
6735           md.flags &= ~EF_IA_64_BE;
6736           default_big_endian = 0;
6737         }
6738       else if (strcmp (arg, "be") == 0)
6739         {
6740           md.flags |= EF_IA_64_BE;
6741           default_big_endian = 1;
6742         }
6743       else if (strncmp (arg, "unwind-check=", 13) == 0)
6744         {
6745           arg += 13;
6746           if (strcmp (arg, "warning") == 0)
6747             md.unwind_check = unwind_check_warning;
6748           else if (strcmp (arg, "error") == 0)
6749             md.unwind_check = unwind_check_error;
6750           else
6751             return 0;
6752         }
6753       else
6754         return 0;
6755       break;
6756
6757     case 'N':
6758       if (strcmp (arg, "so") == 0)
6759         {
6760           /* Suppress signon message.  */
6761         }
6762       else if (strcmp (arg, "pi") == 0)
6763         {
6764           /* Reject privileged instructions.  FIXME */
6765         }
6766       else if (strcmp (arg, "us") == 0)
6767         {
6768           /* Allow union of signed and unsigned range.  FIXME */
6769         }
6770       else if (strcmp (arg, "close_fcalls") == 0)
6771         {
6772           /* Do not resolve global function calls.  */
6773         }
6774       else
6775         return 0;
6776       break;
6777
6778     case 'C':
6779       /* temp[="prefix"]  Insert temporary labels into the object file
6780                           symbol table prefixed by "prefix".
6781                           Default prefix is ":temp:".
6782        */
6783       break;
6784
6785     case 'a':
6786       /* indirect=<tgt> Assume unannotated indirect branches behavior
6787                         according to <tgt> --
6788                         exit:   branch out from the current context (default)
6789                         labels: all labels in context may be branch targets
6790        */
6791       if (strncmp (arg, "indirect=", 9) != 0)
6792         return 0;
6793       break;
6794
6795     case 'x':
6796       /* -X conflicts with an ignored option, use -x instead */
6797       md.detect_dv = 1;
6798       if (!arg || strcmp (arg, "explicit") == 0)
6799         {
6800           /* set default mode to explicit */
6801           md.default_explicit_mode = 1;
6802           break;
6803         }
6804       else if (strcmp (arg, "auto") == 0)
6805         {
6806           md.default_explicit_mode = 0;
6807         }
6808       else if (strcmp (arg, "debug") == 0)
6809         {
6810           md.debug_dv = 1;
6811         }
6812       else if (strcmp (arg, "debugx") == 0)
6813         {
6814           md.default_explicit_mode = 1;
6815           md.debug_dv = 1;
6816         }
6817       else
6818         {
6819           as_bad (_("Unrecognized option '-x%s'"), arg);
6820         }
6821       break;
6822
6823     case 'S':
6824       /* nops           Print nops statistics.  */
6825       break;
6826
6827     /* GNU specific switches for gcc.  */
6828     case OPTION_MCONSTANT_GP:
6829       md.flags |= EF_IA_64_CONS_GP;
6830       break;
6831
6832     case OPTION_MAUTO_PIC:
6833       md.flags |= EF_IA_64_NOFUNCDESC_CONS_GP;
6834       break;
6835
6836     default:
6837       return 0;
6838     }
6839
6840   return 1;
6841 }
6842
6843 void
6844 md_show_usage (stream)
6845      FILE *stream;
6846 {
6847   fputs (_("\
6848 IA-64 options:\n\
6849   --mconstant-gp          mark output file as using the constant-GP model\n\
6850                           (sets ELF header flag EF_IA_64_CONS_GP)\n\
6851   --mauto-pic             mark output file as using the constant-GP model\n\
6852                           without function descriptors (sets ELF header flag\n\
6853                           EF_IA_64_NOFUNCDESC_CONS_GP)\n\
6854   -milp32|-milp64|-mlp64|-mp64  select data model (default -mlp64)\n\
6855   -mle | -mbe             select little- or big-endian byte order (default -mle)\n\
6856   -munwind-check=[warning|error]\n\
6857                           unwind directive check (default -munwind-check=warning)\n\
6858   -x | -xexplicit         turn on dependency violation checking (default)\n\
6859   -xauto                  automagically remove dependency violations\n\
6860   -xdebug                 debug dependency violation checker\n"),
6861         stream);
6862 }
6863
6864 void
6865 ia64_after_parse_args ()
6866 {
6867   if (debug_type == DEBUG_STABS)
6868     as_fatal (_("--gstabs is not supported for ia64"));
6869 }
6870
6871 /* Return true if TYPE fits in TEMPL at SLOT.  */
6872
6873 static int
6874 match (int templ, int type, int slot)
6875 {
6876   enum ia64_unit unit;
6877   int result;
6878
6879   unit = ia64_templ_desc[templ].exec_unit[slot];
6880   switch (type)
6881     {
6882     case IA64_TYPE_DYN: result = 1; break; /* for nop and break */
6883     case IA64_TYPE_A:
6884       result = (unit == IA64_UNIT_I || unit == IA64_UNIT_M);
6885       break;
6886     case IA64_TYPE_X:   result = (unit == IA64_UNIT_L); break;
6887     case IA64_TYPE_I:   result = (unit == IA64_UNIT_I); break;
6888     case IA64_TYPE_M:   result = (unit == IA64_UNIT_M); break;
6889     case IA64_TYPE_B:   result = (unit == IA64_UNIT_B); break;
6890     case IA64_TYPE_F:   result = (unit == IA64_UNIT_F); break;
6891     default:            result = 0; break;
6892     }
6893   return result;
6894 }
6895
6896 /* Add a bit of extra goodness if a nop of type F or B would fit
6897    in TEMPL at SLOT.  */
6898
6899 static inline int
6900 extra_goodness (int templ, int slot)
6901 {
6902   if (slot == 1 && match (templ, IA64_TYPE_F, slot))
6903     return 2;
6904   if (slot == 2 && match (templ, IA64_TYPE_B, slot))
6905     return 1;
6906   return 0;
6907 }
6908
6909 /* This function is called once, at assembler startup time.  It sets
6910    up all the tables, etc. that the MD part of the assembler will need
6911    that can be determined before arguments are parsed.  */
6912 void
6913 md_begin ()
6914 {
6915   int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum, ok;
6916   const char *err;
6917   char name[8];
6918
6919   md.auto_align = 1;
6920   md.explicit_mode = md.default_explicit_mode;
6921
6922   bfd_set_section_alignment (stdoutput, text_section, 4);
6923
6924   /* Make sure function pointers get initialized.  */
6925   target_big_endian = -1;
6926   dot_byteorder (default_big_endian);
6927
6928   alias_hash = hash_new ();
6929   alias_name_hash = hash_new ();
6930   secalias_hash = hash_new ();
6931   secalias_name_hash = hash_new ();
6932
6933   pseudo_func[FUNC_DTP_MODULE].u.sym =
6934     symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
6935                 &zero_address_frag);
6936
6937   pseudo_func[FUNC_DTP_RELATIVE].u.sym =
6938     symbol_new (".<dtprel>", undefined_section, FUNC_DTP_RELATIVE,
6939                 &zero_address_frag);
6940
6941   pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
6942     symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
6943                 &zero_address_frag);
6944
6945   pseudo_func[FUNC_GP_RELATIVE].u.sym =
6946     symbol_new (".<gprel>", undefined_section, FUNC_GP_RELATIVE,
6947                 &zero_address_frag);
6948
6949   pseudo_func[FUNC_LT_RELATIVE].u.sym =
6950     symbol_new (".<ltoff>", undefined_section, FUNC_LT_RELATIVE,
6951                 &zero_address_frag);
6952
6953   pseudo_func[FUNC_LT_RELATIVE_X].u.sym =
6954     symbol_new (".<ltoffx>", undefined_section, FUNC_LT_RELATIVE_X,
6955                 &zero_address_frag);
6956
6957   pseudo_func[FUNC_PC_RELATIVE].u.sym =
6958     symbol_new (".<pcrel>", undefined_section, FUNC_PC_RELATIVE,
6959                 &zero_address_frag);
6960
6961   pseudo_func[FUNC_PLT_RELATIVE].u.sym =
6962     symbol_new (".<pltoff>", undefined_section, FUNC_PLT_RELATIVE,
6963                 &zero_address_frag);
6964
6965   pseudo_func[FUNC_SEC_RELATIVE].u.sym =
6966     symbol_new (".<secrel>", undefined_section, FUNC_SEC_RELATIVE,
6967                 &zero_address_frag);
6968
6969   pseudo_func[FUNC_SEG_RELATIVE].u.sym =
6970     symbol_new (".<segrel>", undefined_section, FUNC_SEG_RELATIVE,
6971                 &zero_address_frag);
6972
6973   pseudo_func[FUNC_TP_RELATIVE].u.sym =
6974     symbol_new (".<tprel>", undefined_section, FUNC_TP_RELATIVE,
6975                 &zero_address_frag);
6976
6977   pseudo_func[FUNC_LTV_RELATIVE].u.sym =
6978     symbol_new (".<ltv>", undefined_section, FUNC_LTV_RELATIVE,
6979                 &zero_address_frag);
6980
6981   pseudo_func[FUNC_LT_FPTR_RELATIVE].u.sym =
6982     symbol_new (".<ltoff.fptr>", undefined_section, FUNC_LT_FPTR_RELATIVE,
6983                 &zero_address_frag);
6984
6985   pseudo_func[FUNC_LT_DTP_MODULE].u.sym =
6986     symbol_new (".<ltoff.dtpmod>", undefined_section, FUNC_LT_DTP_MODULE,
6987                 &zero_address_frag);
6988
6989   pseudo_func[FUNC_LT_DTP_RELATIVE].u.sym =
6990     symbol_new (".<ltoff.dptrel>", undefined_section, FUNC_LT_DTP_RELATIVE,
6991                 &zero_address_frag);
6992
6993   pseudo_func[FUNC_LT_TP_RELATIVE].u.sym =
6994     symbol_new (".<ltoff.tprel>", undefined_section, FUNC_LT_TP_RELATIVE,
6995                 &zero_address_frag);
6996
6997   pseudo_func[FUNC_IPLT_RELOC].u.sym =
6998     symbol_new (".<iplt>", undefined_section, FUNC_IPLT_RELOC,
6999                 &zero_address_frag);
7000
7001   /* Compute the table of best templates.  We compute goodness as a
7002      base 4 value, in which each match counts for 3, each F counts
7003      for 2, each B counts for 1.  This should maximize the number of
7004      F and B nops in the chosen bundles, which is good because these
7005      pipelines are least likely to be overcommitted.  */
7006   for (i = 0; i < IA64_NUM_TYPES; ++i)
7007     for (j = 0; j < IA64_NUM_TYPES; ++j)
7008       for (k = 0; k < IA64_NUM_TYPES; ++k)
7009         {
7010           best = 0;
7011           for (t = 0; t < NELEMS (ia64_templ_desc); ++t)
7012             {
7013               goodness = 0;
7014               if (match (t, i, 0))
7015                 {
7016                   if (match (t, j, 1))
7017                     {
7018                       if (match (t, k, 2))
7019                         goodness = 3 + 3 + 3;
7020                       else
7021                         goodness = 3 + 3 + extra_goodness (t, 2);
7022                     }
7023                   else if (match (t, j, 2))
7024                     goodness = 3 + 3 + extra_goodness (t, 1);
7025                   else
7026                     {
7027                       goodness = 3;
7028                       goodness += extra_goodness (t, 1);
7029                       goodness += extra_goodness (t, 2);
7030                     }
7031                 }
7032               else if (match (t, i, 1))
7033                 {
7034                   if (match (t, j, 2))
7035                     goodness = 3 + 3;
7036                   else
7037                     goodness = 3 + extra_goodness (t, 2);
7038                 }
7039               else if (match (t, i, 2))
7040                 goodness = 3 + extra_goodness (t, 1);
7041
7042               if (goodness > best)
7043                 {
7044                   best = goodness;
7045                   best_template[i][j][k] = t;
7046                 }
7047             }
7048         }
7049
7050   for (i = 0; i < NUM_SLOTS; ++i)
7051     md.slot[i].user_template = -1;
7052
7053   md.pseudo_hash = hash_new ();
7054   for (i = 0; i < NELEMS (pseudo_opcode); ++i)
7055     {
7056       err = hash_insert (md.pseudo_hash, pseudo_opcode[i].name,
7057                          (void *) (pseudo_opcode + i));
7058       if (err)
7059         as_fatal ("ia64.md_begin: can't hash `%s': %s",
7060                   pseudo_opcode[i].name, err);
7061     }
7062
7063   md.reg_hash = hash_new ();
7064   md.dynreg_hash = hash_new ();
7065   md.const_hash = hash_new ();
7066   md.entry_hash = hash_new ();
7067
7068   /* general registers:  */
7069
7070   total = 128;
7071   for (i = 0; i < total; ++i)
7072     {
7073       sprintf (name, "r%d", i - REG_GR);
7074       md.regsym[i] = declare_register (name, i);
7075     }
7076
7077   /* floating point registers:  */
7078   total += 128;
7079   for (; i < total; ++i)
7080     {
7081       sprintf (name, "f%d", i - REG_FR);
7082       md.regsym[i] = declare_register (name, i);
7083     }
7084
7085   /* application registers:  */
7086   total += 128;
7087   ar_base = i;
7088   for (; i < total; ++i)
7089     {
7090       sprintf (name, "ar%d", i - REG_AR);
7091       md.regsym[i] = declare_register (name, i);
7092     }
7093
7094   /* control registers:  */
7095   total += 128;
7096   cr_base = i;
7097   for (; i < total; ++i)
7098     {
7099       sprintf (name, "cr%d", i - REG_CR);
7100       md.regsym[i] = declare_register (name, i);
7101     }
7102
7103   /* predicate registers:  */
7104   total += 64;
7105   for (; i < total; ++i)
7106     {
7107       sprintf (name, "p%d", i - REG_P);
7108       md.regsym[i] = declare_register (name, i);
7109     }
7110
7111   /* branch registers:  */
7112   total += 8;
7113   for (; i < total; ++i)
7114     {
7115       sprintf (name, "b%d", i - REG_BR);
7116       md.regsym[i] = declare_register (name, i);
7117     }
7118
7119   md.regsym[REG_IP] = declare_register ("ip", REG_IP);
7120   md.regsym[REG_CFM] = declare_register ("cfm", REG_CFM);
7121   md.regsym[REG_PR] = declare_register ("pr", REG_PR);
7122   md.regsym[REG_PR_ROT] = declare_register ("pr.rot", REG_PR_ROT);
7123   md.regsym[REG_PSR] = declare_register ("psr", REG_PSR);
7124   md.regsym[REG_PSR_L] = declare_register ("psr.l", REG_PSR_L);
7125   md.regsym[REG_PSR_UM] = declare_register ("psr.um", REG_PSR_UM);
7126
7127   for (i = 0; i < NELEMS (indirect_reg); ++i)
7128     {
7129       regnum = indirect_reg[i].regnum;
7130       md.regsym[regnum] = declare_register (indirect_reg[i].name, regnum);
7131     }
7132
7133   /* define synonyms for application registers:  */
7134   for (i = REG_AR; i < REG_AR + NELEMS (ar); ++i)
7135     md.regsym[i] = declare_register (ar[i - REG_AR].name,
7136                                      REG_AR + ar[i - REG_AR].regnum);
7137
7138   /* define synonyms for control registers:  */
7139   for (i = REG_CR; i < REG_CR + NELEMS (cr); ++i)
7140     md.regsym[i] = declare_register (cr[i - REG_CR].name,
7141                                      REG_CR + cr[i - REG_CR].regnum);
7142
7143   declare_register ("gp", REG_GR +  1);
7144   declare_register ("sp", REG_GR + 12);
7145   declare_register ("rp", REG_BR +  0);
7146
7147   /* pseudo-registers used to specify unwind info:  */
7148   declare_register ("psp", REG_PSP);
7149
7150   declare_register_set ("ret", 4, REG_GR + 8);
7151   declare_register_set ("farg", 8, REG_FR + 8);
7152   declare_register_set ("fret", 8, REG_FR + 8);
7153
7154   for (i = 0; i < NELEMS (const_bits); ++i)
7155     {
7156       err = hash_insert (md.const_hash, const_bits[i].name,
7157                          (PTR) (const_bits + i));
7158       if (err)
7159         as_fatal ("Inserting \"%s\" into constant hash table failed: %s",
7160                   name, err);
7161     }
7162
7163   /* Set the architecture and machine depending on defaults and command line
7164      options.  */
7165   if (md.flags & EF_IA_64_ABI64)
7166     ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf64);
7167   else
7168     ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf32);
7169
7170   if (! ok)
7171      as_warn (_("Could not set architecture and machine"));
7172
7173   /* Set the pointer size and pointer shift size depending on md.flags */
7174
7175   if (md.flags & EF_IA_64_ABI64)
7176     {
7177       md.pointer_size = 8;         /* pointers are 8 bytes */
7178       md.pointer_size_shift = 3;   /* alignment is 8 bytes = 2^2 */
7179     }
7180   else
7181     {
7182       md.pointer_size = 4;         /* pointers are 4 bytes */
7183       md.pointer_size_shift = 2;   /* alignment is 4 bytes = 2^2 */
7184     }
7185
7186   md.mem_offset.hint = 0;
7187   md.path = 0;
7188   md.maxpaths = 0;
7189   md.entry_labels = NULL;
7190 }
7191
7192 /* Set the default options in md.  Cannot do this in md_begin because
7193    that is called after md_parse_option which is where we set the
7194    options in md based on command line options.  */
7195
7196 void
7197 ia64_init (argc, argv)
7198      int argc ATTRIBUTE_UNUSED;
7199      char **argv ATTRIBUTE_UNUSED;
7200 {
7201   md.flags = MD_FLAGS_DEFAULT;
7202   /* FIXME: We should change it to unwind_check_error someday.  */
7203   md.unwind_check = unwind_check_warning;
7204 }
7205
7206 /* Return a string for the target object file format.  */
7207
7208 const char *
7209 ia64_target_format ()
7210 {
7211   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
7212     {
7213       if (md.flags & EF_IA_64_BE)
7214         {
7215           if (md.flags & EF_IA_64_ABI64)
7216 #if defined(TE_AIX50)
7217             return "elf64-ia64-aix-big";
7218 #elif defined(TE_HPUX)
7219             return "elf64-ia64-hpux-big";
7220 #else
7221             return "elf64-ia64-big";
7222 #endif
7223           else
7224 #if defined(TE_AIX50)
7225             return "elf32-ia64-aix-big";
7226 #elif defined(TE_HPUX)
7227             return "elf32-ia64-hpux-big";
7228 #else
7229             return "elf32-ia64-big";
7230 #endif
7231         }
7232       else
7233         {
7234           if (md.flags & EF_IA_64_ABI64)
7235 #ifdef TE_AIX50
7236             return "elf64-ia64-aix-little";
7237 #else
7238             return "elf64-ia64-little";
7239 #endif
7240           else
7241 #ifdef TE_AIX50
7242             return "elf32-ia64-aix-little";
7243 #else
7244             return "elf32-ia64-little";
7245 #endif
7246         }
7247     }
7248   else
7249     return "unknown-format";
7250 }
7251
7252 void
7253 ia64_end_of_source ()
7254 {
7255   /* terminate insn group upon reaching end of file:  */
7256   insn_group_break (1, 0, 0);
7257
7258   /* emits slots we haven't written yet:  */
7259   ia64_flush_insns ();
7260
7261   bfd_set_private_flags (stdoutput, md.flags);
7262
7263   md.mem_offset.hint = 0;
7264 }
7265
7266 void
7267 ia64_start_line ()
7268 {
7269   if (md.qp.X_op == O_register)
7270     as_bad ("qualifying predicate not followed by instruction");
7271   md.qp.X_op = O_absent;
7272
7273   if (ignore_input ())
7274     return;
7275
7276   if (input_line_pointer[0] == ';' && input_line_pointer[-1] == ';')
7277     {
7278       if (md.detect_dv && !md.explicit_mode)
7279         as_warn (_("Explicit stops are ignored in auto mode"));
7280       else
7281         insn_group_break (1, 0, 0);
7282     }
7283 }
7284
7285 /* This is a hook for ia64_frob_label, so that it can distinguish tags from
7286    labels.  */
7287 static int defining_tag = 0;
7288
7289 int
7290 ia64_unrecognized_line (ch)
7291      int ch;
7292 {
7293   switch (ch)
7294     {
7295     case '(':
7296       expression (&md.qp);
7297       if (*input_line_pointer++ != ')')
7298         {
7299           as_bad ("Expected ')'");
7300           return 0;
7301         }
7302       if (md.qp.X_op != O_register)
7303         {
7304           as_bad ("Qualifying predicate expected");
7305           return 0;
7306         }
7307       if (md.qp.X_add_number < REG_P || md.qp.X_add_number >= REG_P + 64)
7308         {
7309           as_bad ("Predicate register expected");
7310           return 0;
7311         }
7312       return 1;
7313
7314     case '{':
7315       if (md.manual_bundling)
7316         as_warn ("Found '{' when manual bundling is already turned on");
7317       else
7318         CURR_SLOT.manual_bundling_on = 1;
7319       md.manual_bundling = 1;
7320
7321       /* Bundling is only acceptable in explicit mode
7322          or when in default automatic mode.  */
7323       if (md.detect_dv && !md.explicit_mode)
7324         {
7325           if (!md.mode_explicitly_set
7326               && !md.default_explicit_mode)
7327             dot_dv_mode ('E');
7328           else
7329             as_warn (_("Found '{' after explicit switch to automatic mode"));
7330         }
7331       return 1;
7332
7333     case '}':
7334       if (!md.manual_bundling)
7335         as_warn ("Found '}' when manual bundling is off");
7336       else
7337         PREV_SLOT.manual_bundling_off = 1;
7338       md.manual_bundling = 0;
7339
7340       /* switch back to automatic mode, if applicable */
7341       if (md.detect_dv
7342           && md.explicit_mode
7343           && !md.mode_explicitly_set
7344           && !md.default_explicit_mode)
7345         dot_dv_mode ('A');
7346
7347       /* Allow '{' to follow on the same line.  We also allow ";;", but that
7348          happens automatically because ';' is an end of line marker.  */
7349       SKIP_WHITESPACE ();
7350       if (input_line_pointer[0] == '{')
7351         {
7352           input_line_pointer++;
7353           return ia64_unrecognized_line ('{');
7354         }
7355
7356       demand_empty_rest_of_line ();
7357       return 1;
7358
7359     case '[':
7360       {
7361         char *s;
7362         char c;
7363         symbolS *tag;
7364         int temp;
7365
7366         if (md.qp.X_op == O_register)
7367           {
7368             as_bad ("Tag must come before qualifying predicate.");
7369             return 0;
7370           }
7371
7372         /* This implements just enough of read_a_source_file in read.c to
7373            recognize labels.  */
7374         if (is_name_beginner (*input_line_pointer))
7375           {
7376             s = input_line_pointer;
7377             c = get_symbol_end ();
7378           }
7379         else if (LOCAL_LABELS_FB
7380                  && ISDIGIT (*input_line_pointer))
7381           {
7382             temp = 0;
7383             while (ISDIGIT (*input_line_pointer))
7384               temp = (temp * 10) + *input_line_pointer++ - '0';
7385             fb_label_instance_inc (temp);
7386             s = fb_label_name (temp, 0);
7387             c = *input_line_pointer;
7388           }
7389         else
7390           {
7391             s = NULL;
7392             c = '\0';
7393           }
7394         if (c != ':')
7395           {
7396             /* Put ':' back for error messages' sake.  */
7397             *input_line_pointer++ = ':';
7398             as_bad ("Expected ':'");
7399             return 0;
7400           }
7401
7402         defining_tag = 1;
7403         tag = colon (s);
7404         defining_tag = 0;
7405         /* Put ':' back for error messages' sake.  */
7406         *input_line_pointer++ = ':';
7407         if (*input_line_pointer++ != ']')
7408           {
7409             as_bad ("Expected ']'");
7410             return 0;
7411           }
7412         if (! tag)
7413           {
7414             as_bad ("Tag name expected");
7415             return 0;
7416           }
7417         return 1;
7418       }
7419
7420     default:
7421       break;
7422     }
7423
7424   /* Not a valid line.  */
7425   return 0;
7426 }
7427
7428 void
7429 ia64_frob_label (sym)
7430      struct symbol *sym;
7431 {
7432   struct label_fix *fix;
7433
7434   /* Tags need special handling since they are not bundle breaks like
7435      labels.  */
7436   if (defining_tag)
7437     {
7438       fix = obstack_alloc (&notes, sizeof (*fix));
7439       fix->sym = sym;
7440       fix->next = CURR_SLOT.tag_fixups;
7441       CURR_SLOT.tag_fixups = fix;
7442
7443       return;
7444     }
7445
7446   if (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7447     {
7448       md.last_text_seg = now_seg;
7449       fix = obstack_alloc (&notes, sizeof (*fix));
7450       fix->sym = sym;
7451       fix->next = CURR_SLOT.label_fixups;
7452       CURR_SLOT.label_fixups = fix;
7453
7454       /* Keep track of how many code entry points we've seen.  */
7455       if (md.path == md.maxpaths)
7456         {
7457           md.maxpaths += 20;
7458           md.entry_labels = (const char **)
7459             xrealloc ((void *) md.entry_labels,
7460                       md.maxpaths * sizeof (char *));
7461         }
7462       md.entry_labels[md.path++] = S_GET_NAME (sym);
7463     }
7464 }
7465
7466 #ifdef TE_HPUX
7467 /* The HP-UX linker will give unresolved symbol errors for symbols
7468    that are declared but unused.  This routine removes declared,
7469    unused symbols from an object.  */
7470 int
7471 ia64_frob_symbol (sym)
7472      struct symbol *sym;
7473 {
7474   if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym) &&
7475        ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT)
7476       || (S_GET_SEGMENT (sym) == &bfd_abs_section
7477           && ! S_IS_EXTERNAL (sym)))
7478     return 1;
7479   return 0;
7480 }
7481 #endif
7482
7483 void
7484 ia64_flush_pending_output ()
7485 {
7486   if (!md.keep_pending_output
7487       && bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7488     {
7489       /* ??? This causes many unnecessary stop bits to be emitted.
7490          Unfortunately, it isn't clear if it is safe to remove this.  */
7491       insn_group_break (1, 0, 0);
7492       ia64_flush_insns ();
7493     }
7494 }
7495
7496 /* Do ia64-specific expression optimization.  All that's done here is
7497    to transform index expressions that are either due to the indexing
7498    of rotating registers or due to the indexing of indirect register
7499    sets.  */
7500 int
7501 ia64_optimize_expr (l, op, r)
7502      expressionS *l;
7503      operatorT op;
7504      expressionS *r;
7505 {
7506   unsigned num_regs;
7507
7508   if (op == O_index)
7509     {
7510       if (l->X_op == O_register && r->X_op == O_constant)
7511         {
7512           num_regs = (l->X_add_number >> 16);
7513           if ((unsigned) r->X_add_number >= num_regs)
7514             {
7515               if (!num_regs)
7516                 as_bad ("No current frame");
7517               else
7518                 as_bad ("Index out of range 0..%u", num_regs - 1);
7519               r->X_add_number = 0;
7520             }
7521           l->X_add_number = (l->X_add_number & 0xffff) + r->X_add_number;
7522           return 1;
7523         }
7524       else if (l->X_op == O_register && r->X_op == O_register)
7525         {
7526           if (l->X_add_number < IND_CPUID || l->X_add_number > IND_RR
7527               || l->X_add_number == IND_MEM)
7528             {
7529               as_bad ("Indirect register set name expected");
7530               l->X_add_number = IND_CPUID;
7531             }
7532           l->X_op = O_index;
7533           l->X_op_symbol = md.regsym[l->X_add_number];
7534           l->X_add_number = r->X_add_number;
7535           return 1;
7536         }
7537     }
7538   return 0;
7539 }
7540
7541 int
7542 ia64_parse_name (name, e, nextcharP)
7543      char *name;
7544      expressionS *e;
7545      char *nextcharP;
7546 {
7547   struct const_desc *cdesc;
7548   struct dynreg *dr = 0;
7549   unsigned int regnum;
7550   unsigned int idx;
7551   struct symbol *sym;
7552   char *end;
7553
7554   if (*name == '@')
7555     {
7556       enum pseudo_type pseudo_type = PSEUDO_FUNC_NONE;
7557
7558       /* Find what relocation pseudo-function we're dealing with.  */
7559       for (idx = 0; idx < NELEMS (pseudo_func); ++idx)
7560         if (pseudo_func[idx].name
7561             && pseudo_func[idx].name[0] == name[1]
7562             && strcmp (pseudo_func[idx].name + 1, name + 2) == 0)
7563           {
7564             pseudo_type = pseudo_func[idx].type;
7565             break;
7566           }
7567       switch (pseudo_type)
7568         {
7569         case PSEUDO_FUNC_RELOC:
7570           end = input_line_pointer;
7571           if (*nextcharP != '(')
7572             {
7573               as_bad ("Expected '('");
7574               goto done;
7575             }
7576           /* Skip '('.  */
7577           ++input_line_pointer;
7578           expression (e);
7579           if (*input_line_pointer != ')')
7580             {
7581               as_bad ("Missing ')'");
7582               goto done;
7583             }
7584           /* Skip ')'.  */
7585           ++input_line_pointer;
7586           if (e->X_op != O_symbol)
7587             {
7588               if (e->X_op != O_pseudo_fixup)
7589                 {
7590                   as_bad ("Not a symbolic expression");
7591                   goto done;
7592                 }
7593               if (idx != FUNC_LT_RELATIVE)
7594                 {
7595                   as_bad ("Illegal combination of relocation functions");
7596                   goto done;
7597                 }
7598               switch (S_GET_VALUE (e->X_op_symbol))
7599                 {
7600                 case FUNC_FPTR_RELATIVE:
7601                   idx = FUNC_LT_FPTR_RELATIVE; break;
7602                 case FUNC_DTP_MODULE:
7603                   idx = FUNC_LT_DTP_MODULE; break;
7604                 case FUNC_DTP_RELATIVE:
7605                   idx = FUNC_LT_DTP_RELATIVE; break;
7606                 case FUNC_TP_RELATIVE:
7607                   idx = FUNC_LT_TP_RELATIVE; break;
7608                 default:
7609                   as_bad ("Illegal combination of relocation functions");
7610                   goto done;
7611                 }
7612             }
7613           /* Make sure gas doesn't get rid of local symbols that are used
7614              in relocs.  */
7615           e->X_op = O_pseudo_fixup;
7616           e->X_op_symbol = pseudo_func[idx].u.sym;
7617           break;
7618
7619         case PSEUDO_FUNC_CONST:
7620           e->X_op = O_constant;
7621           e->X_add_number = pseudo_func[idx].u.ival;
7622           break;
7623
7624         case PSEUDO_FUNC_REG:
7625           e->X_op = O_register;
7626           e->X_add_number = pseudo_func[idx].u.ival;
7627           break;
7628
7629         default:
7630           return 0;
7631         }
7632     done:
7633       *nextcharP = *input_line_pointer;
7634       return 1;
7635     }
7636
7637   /* first see if NAME is a known register name:  */
7638   sym = hash_find (md.reg_hash, name);
7639   if (sym)
7640     {
7641       e->X_op = O_register;
7642       e->X_add_number = S_GET_VALUE (sym);
7643       return 1;
7644     }
7645
7646   cdesc = hash_find (md.const_hash, name);
7647   if (cdesc)
7648     {
7649       e->X_op = O_constant;
7650       e->X_add_number = cdesc->value;
7651       return 1;
7652     }
7653
7654   /* check for inN, locN, or outN:  */
7655   switch (name[0])
7656     {
7657     case 'i':
7658       if (name[1] == 'n' && ISDIGIT (name[2]))
7659         {
7660           dr = &md.in;
7661           name += 2;
7662         }
7663       break;
7664
7665     case 'l':
7666       if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
7667         {
7668           dr = &md.loc;
7669           name += 3;
7670         }
7671       break;
7672
7673     case 'o':
7674       if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
7675         {
7676           dr = &md.out;
7677           name += 3;
7678         }
7679       break;
7680
7681     default:
7682       break;
7683     }
7684
7685   if (dr)
7686     {
7687       /* The name is inN, locN, or outN; parse the register number.  */
7688       regnum = strtoul (name, &end, 10);
7689       if (end > name && *end == '\0')
7690         {
7691           if ((unsigned) regnum >= dr->num_regs)
7692             {
7693               if (!dr->num_regs)
7694                 as_bad ("No current frame");
7695               else
7696                 as_bad ("Register number out of range 0..%u",
7697                         dr->num_regs - 1);
7698               regnum = 0;
7699             }
7700           e->X_op = O_register;
7701           e->X_add_number = dr->base + regnum;
7702           return 1;
7703         }
7704     }
7705
7706   if ((dr = hash_find (md.dynreg_hash, name)))
7707     {
7708       /* We've got ourselves the name of a rotating register set.
7709          Store the base register number in the low 16 bits of
7710          X_add_number and the size of the register set in the top 16
7711          bits.  */
7712       e->X_op = O_register;
7713       e->X_add_number = dr->base | (dr->num_regs << 16);
7714       return 1;
7715     }
7716   return 0;
7717 }
7718
7719 /* Remove the '#' suffix that indicates a symbol as opposed to a register.  */
7720
7721 char *
7722 ia64_canonicalize_symbol_name (name)
7723      char *name;
7724 {
7725   size_t len = strlen (name);
7726   if (len > 1 && name[len - 1] == '#')
7727     name[len - 1] = '\0';
7728   return name;
7729 }
7730
7731 /* Return true if idesc is a conditional branch instruction.  This excludes
7732    the modulo scheduled branches, and br.ia.  Mod-sched branches are excluded
7733    because they always read/write resources regardless of the value of the
7734    qualifying predicate.  br.ia must always use p0, and hence is always
7735    taken.  Thus this function returns true for branches which can fall
7736    through, and which use no resources if they do fall through.  */
7737
7738 static int
7739 is_conditional_branch (idesc)
7740      struct ia64_opcode *idesc;
7741 {
7742   /* br is a conditional branch.  Everything that starts with br. except
7743      br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
7744      Everything that starts with brl is a conditional branch.  */
7745   return (idesc->name[0] == 'b' && idesc->name[1] == 'r'
7746           && (idesc->name[2] == '\0'
7747               || (idesc->name[2] == '.' && idesc->name[3] != 'i'
7748                   && idesc->name[3] != 'c' && idesc->name[3] != 'w')
7749               || idesc->name[2] == 'l'
7750               /* br.cond, br.call, br.clr  */
7751               || (idesc->name[2] == '.' && idesc->name[3] == 'c'
7752                   && (idesc->name[4] == 'a' || idesc->name[4] == 'o'
7753                       || (idesc->name[4] == 'l' && idesc->name[5] == 'r')))));
7754 }
7755
7756 /* Return whether the given opcode is a taken branch.  If there's any doubt,
7757    returns zero.  */
7758
7759 static int
7760 is_taken_branch (idesc)
7761      struct ia64_opcode *idesc;
7762 {
7763   return ((is_conditional_branch (idesc) && CURR_SLOT.qp_regno == 0)
7764           || strncmp (idesc->name, "br.ia", 5) == 0);
7765 }
7766
7767 /* Return whether the given opcode is an interruption or rfi.  If there's any
7768    doubt, returns zero.  */
7769
7770 static int
7771 is_interruption_or_rfi (idesc)
7772      struct ia64_opcode *idesc;
7773 {
7774   if (strcmp (idesc->name, "rfi") == 0)
7775     return 1;
7776   return 0;
7777 }
7778
7779 /* Returns the index of the given dependency in the opcode's list of chks, or
7780    -1 if there is no dependency.  */
7781
7782 static int
7783 depends_on (depind, idesc)
7784      int depind;
7785      struct ia64_opcode *idesc;
7786 {
7787   int i;
7788   const struct ia64_opcode_dependency *dep = idesc->dependencies;
7789   for (i = 0; i < dep->nchks; i++)
7790     {
7791       if (depind == DEP (dep->chks[i]))
7792         return i;
7793     }
7794   return -1;
7795 }
7796
7797 /* Determine a set of specific resources used for a particular resource
7798    class.  Returns the number of specific resources identified  For those
7799    cases which are not determinable statically, the resource returned is
7800    marked nonspecific.
7801
7802    Meanings of value in 'NOTE':
7803    1) only read/write when the register number is explicitly encoded in the
7804    insn.
7805    2) only read CFM when accessing a rotating GR, FR, or PR.  mov pr only
7806    accesses CFM when qualifying predicate is in the rotating region.
7807    3) general register value is used to specify an indirect register; not
7808    determinable statically.
7809    4) only read the given resource when bits 7:0 of the indirect index
7810    register value does not match the register number of the resource; not
7811    determinable statically.
7812    5) all rules are implementation specific.
7813    6) only when both the index specified by the reader and the index specified
7814    by the writer have the same value in bits 63:61; not determinable
7815    statically.
7816    7) only access the specified resource when the corresponding mask bit is
7817    set
7818    8) PSR.dfh is only read when these insns reference FR32-127.  PSR.dfl is
7819    only read when these insns reference FR2-31
7820    9) PSR.mfl is only written when these insns write FR2-31.  PSR.mfh is only
7821    written when these insns write FR32-127
7822    10) The PSR.bn bit is only accessed when one of GR16-31 is specified in the
7823    instruction
7824    11) The target predicates are written independently of PR[qp], but source
7825    registers are only read if PR[qp] is true.  Since the state of PR[qp]
7826    cannot statically be determined, all source registers are marked used.
7827    12) This insn only reads the specified predicate register when that
7828    register is the PR[qp].
7829    13) This reference to ld-c only applies to teh GR whose value is loaded
7830    with data returned from memory, not the post-incremented address register.
7831    14) The RSE resource includes the implementation-specific RSE internal
7832    state resources.  At least one (and possibly more) of these resources are
7833    read by each instruction listed in IC:rse-readers.  At least one (and
7834    possibly more) of these resources are written by each insn listed in
7835    IC:rse-writers.
7836    15+16) Represents reserved instructions, which the assembler does not
7837    generate.
7838
7839    Memory resources (i.e. locations in memory) are *not* marked or tracked by
7840    this code; there are no dependency violations based on memory access.
7841 */
7842
7843 #define MAX_SPECS 256
7844 #define DV_CHK 1
7845 #define DV_REG 0
7846
7847 static int
7848 specify_resource (dep, idesc, type, specs, note, path)
7849      const struct ia64_dependency *dep;
7850      struct ia64_opcode *idesc;
7851      int type;                         /* is this a DV chk or a DV reg? */
7852      struct rsrc specs[MAX_SPECS];     /* returned specific resources */
7853      int note;                         /* resource note for this insn's usage */
7854      int path;                         /* which execution path to examine */
7855 {
7856   int count = 0;
7857   int i;
7858   int rsrc_write = 0;
7859   struct rsrc tmpl;
7860
7861   if (dep->mode == IA64_DV_WAW
7862       || (dep->mode == IA64_DV_RAW && type == DV_REG)
7863       || (dep->mode == IA64_DV_WAR && type == DV_CHK))
7864     rsrc_write = 1;
7865
7866   /* template for any resources we identify */
7867   tmpl.dependency = dep;
7868   tmpl.note = note;
7869   tmpl.insn_srlz = tmpl.data_srlz = 0;
7870   tmpl.qp_regno = CURR_SLOT.qp_regno;
7871   tmpl.link_to_qp_branch = 1;
7872   tmpl.mem_offset.hint = 0;
7873   tmpl.specific = 1;
7874   tmpl.index = 0;
7875   tmpl.cmp_type = CMP_NONE;
7876
7877 #define UNHANDLED \
7878 as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
7879 dep->name, idesc->name, (rsrc_write?"write":"read"), note)
7880 #define KNOWN(REG) (gr_values[REG].known && gr_values[REG].path >= path)
7881
7882   /* we don't need to track these */
7883   if (dep->semantics == IA64_DVS_NONE)
7884     return 0;
7885
7886   switch (dep->specifier)
7887     {
7888     case IA64_RS_AR_K:
7889       if (note == 1)
7890         {
7891           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7892             {
7893               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7894               if (regno >= 0 && regno <= 7)
7895                 {
7896                   specs[count] = tmpl;
7897                   specs[count++].index = regno;
7898                 }
7899             }
7900         }
7901       else if (note == 0)
7902         {
7903           for (i = 0; i < 8; i++)
7904             {
7905               specs[count] = tmpl;
7906               specs[count++].index = i;
7907             }
7908         }
7909       else
7910         {
7911           UNHANDLED;
7912         }
7913       break;
7914
7915     case IA64_RS_AR_UNAT:
7916       /* This is a mov =AR or mov AR= instruction.  */
7917       if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7918         {
7919           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7920           if (regno == AR_UNAT)
7921             {
7922               specs[count++] = tmpl;
7923             }
7924         }
7925       else
7926         {
7927           /* This is a spill/fill, or other instruction that modifies the
7928              unat register.  */
7929
7930           /* Unless we can determine the specific bits used, mark the whole
7931              thing; bits 8:3 of the memory address indicate the bit used in
7932              UNAT.  The .mem.offset hint may be used to eliminate a small
7933              subset of conflicts.  */
7934           specs[count] = tmpl;
7935           if (md.mem_offset.hint)
7936             {
7937               if (md.debug_dv)
7938                 fprintf (stderr, "  Using hint for spill/fill\n");
7939               /* The index isn't actually used, just set it to something
7940                  approximating the bit index.  */
7941               specs[count].index = (md.mem_offset.offset >> 3) & 0x3F;
7942               specs[count].mem_offset.hint = 1;
7943               specs[count].mem_offset.offset = md.mem_offset.offset;
7944               specs[count++].mem_offset.base = md.mem_offset.base;
7945             }
7946           else
7947             {
7948               specs[count++].specific = 0;
7949             }
7950         }
7951       break;
7952
7953     case IA64_RS_AR:
7954       if (note == 1)
7955         {
7956           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7957             {
7958               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7959               if ((regno >= 8 && regno <= 15)
7960                   || (regno >= 20 && regno <= 23)
7961                   || (regno >= 31 && regno <= 39)
7962                   || (regno >= 41 && regno <= 47)
7963                   || (regno >= 67 && regno <= 111))
7964                 {
7965                   specs[count] = tmpl;
7966                   specs[count++].index = regno;
7967                 }
7968             }
7969         }
7970       else
7971         {
7972           UNHANDLED;
7973         }
7974       break;
7975
7976     case IA64_RS_ARb:
7977       if (note == 1)
7978         {
7979           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7980             {
7981               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7982               if ((regno >= 48 && regno <= 63)
7983                   || (regno >= 112 && regno <= 127))
7984                 {
7985                   specs[count] = tmpl;
7986                   specs[count++].index = regno;
7987                 }
7988             }
7989         }
7990       else if (note == 0)
7991         {
7992           for (i = 48; i < 64; i++)
7993             {
7994               specs[count] = tmpl;
7995               specs[count++].index = i;
7996             }
7997           for (i = 112; i < 128; i++)
7998             {
7999               specs[count] = tmpl;
8000               specs[count++].index = i;
8001             }
8002         }
8003       else
8004         {
8005           UNHANDLED;
8006         }
8007       break;
8008
8009     case IA64_RS_BR:
8010       if (note != 1)
8011         {
8012           UNHANDLED;
8013         }
8014       else
8015         {
8016           if (rsrc_write)
8017             {
8018               for (i = 0; i < idesc->num_outputs; i++)
8019                 if (idesc->operands[i] == IA64_OPND_B1
8020                     || idesc->operands[i] == IA64_OPND_B2)
8021                   {
8022                     specs[count] = tmpl;
8023                     specs[count++].index =
8024                       CURR_SLOT.opnd[i].X_add_number - REG_BR;
8025                   }
8026             }
8027           else
8028             {
8029               for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8030                 if (idesc->operands[i] == IA64_OPND_B1
8031                     || idesc->operands[i] == IA64_OPND_B2)
8032                   {
8033                     specs[count] = tmpl;
8034                     specs[count++].index =
8035                       CURR_SLOT.opnd[i].X_add_number - REG_BR;
8036                   }
8037             }
8038         }
8039       break;
8040
8041     case IA64_RS_CPUID: /* four or more registers */
8042       if (note == 3)
8043         {
8044           if (idesc->operands[!rsrc_write] == IA64_OPND_CPUID_R3)
8045             {
8046               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8047               if (regno >= 0 && regno < NELEMS (gr_values)
8048                   && KNOWN (regno))
8049                 {
8050                   specs[count] = tmpl;
8051                   specs[count++].index = gr_values[regno].value & 0xFF;
8052                 }
8053               else
8054                 {
8055                   specs[count] = tmpl;
8056                   specs[count++].specific = 0;
8057                 }
8058             }
8059         }
8060       else
8061         {
8062           UNHANDLED;
8063         }
8064       break;
8065
8066     case IA64_RS_DBR: /* four or more registers */
8067       if (note == 3)
8068         {
8069           if (idesc->operands[!rsrc_write] == IA64_OPND_DBR_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 if (note == 0 && !rsrc_write)
8086         {
8087           specs[count] = tmpl;
8088           specs[count++].specific = 0;
8089         }
8090       else
8091         {
8092           UNHANDLED;
8093         }
8094       break;
8095
8096     case IA64_RS_IBR: /* four or more registers */
8097       if (note == 3)
8098         {
8099           if (idesc->operands[!rsrc_write] == IA64_OPND_IBR_R3)
8100             {
8101               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8102               if (regno >= 0 && regno < NELEMS (gr_values)
8103                   && KNOWN (regno))
8104                 {
8105                   specs[count] = tmpl;
8106                   specs[count++].index = gr_values[regno].value & 0xFF;
8107                 }
8108               else
8109                 {
8110                   specs[count] = tmpl;
8111                   specs[count++].specific = 0;
8112                 }
8113             }
8114         }
8115       else
8116         {
8117           UNHANDLED;
8118         }
8119       break;
8120
8121     case IA64_RS_MSR:
8122       if (note == 5)
8123         {
8124           /* These are implementation specific.  Force all references to
8125              conflict with all other references.  */
8126           specs[count] = tmpl;
8127           specs[count++].specific = 0;
8128         }
8129       else
8130         {
8131           UNHANDLED;
8132         }
8133       break;
8134
8135     case IA64_RS_PKR: /* 16 or more registers */
8136       if (note == 3 || note == 4)
8137         {
8138           if (idesc->operands[!rsrc_write] == IA64_OPND_PKR_R3)
8139             {
8140               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8141               if (regno >= 0 && regno < NELEMS (gr_values)
8142                   && KNOWN (regno))
8143                 {
8144                   if (note == 3)
8145                     {
8146                       specs[count] = tmpl;
8147                       specs[count++].index = gr_values[regno].value & 0xFF;
8148                     }
8149                   else
8150                     for (i = 0; i < NELEMS (gr_values); i++)
8151                       {
8152                         /* Uses all registers *except* the one in R3.  */
8153                         if ((unsigned)i != (gr_values[regno].value & 0xFF))
8154                           {
8155                             specs[count] = tmpl;
8156                             specs[count++].index = i;
8157                           }
8158                       }
8159                 }
8160               else
8161                 {
8162                   specs[count] = tmpl;
8163                   specs[count++].specific = 0;
8164                 }
8165             }
8166         }
8167       else if (note == 0)
8168         {
8169           /* probe et al.  */
8170           specs[count] = tmpl;
8171           specs[count++].specific = 0;
8172         }
8173       break;
8174
8175     case IA64_RS_PMC: /* four or more registers */
8176       if (note == 3)
8177         {
8178           if (idesc->operands[!rsrc_write] == IA64_OPND_PMC_R3
8179               || (!rsrc_write && idesc->operands[1] == IA64_OPND_PMD_R3))
8180
8181             {
8182               int index = ((idesc->operands[1] == IA64_OPND_R3 && !rsrc_write)
8183                            ? 1 : !rsrc_write);
8184               int regno = CURR_SLOT.opnd[index].X_add_number - REG_GR;
8185               if (regno >= 0 && regno < NELEMS (gr_values)
8186                   && KNOWN (regno))
8187                 {
8188                   specs[count] = tmpl;
8189                   specs[count++].index = gr_values[regno].value & 0xFF;
8190                 }
8191               else
8192                 {
8193                   specs[count] = tmpl;
8194                   specs[count++].specific = 0;
8195                 }
8196             }
8197         }
8198       else
8199         {
8200           UNHANDLED;
8201         }
8202       break;
8203
8204     case IA64_RS_PMD: /* four or more registers */
8205       if (note == 3)
8206         {
8207           if (idesc->operands[!rsrc_write] == IA64_OPND_PMD_R3)
8208             {
8209               int regno = CURR_SLOT.opnd[!rsrc_write].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_RR: /* eight registers */
8230       if (note == 6)
8231         {
8232           if (idesc->operands[!rsrc_write] == IA64_OPND_RR_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 >> 61) & 0x7;
8240                 }
8241               else
8242                 {
8243                   specs[count] = tmpl;
8244                   specs[count++].specific = 0;
8245                 }
8246             }
8247         }
8248       else if (note == 0 && !rsrc_write)
8249         {
8250           specs[count] = tmpl;
8251           specs[count++].specific = 0;
8252         }
8253       else
8254         {
8255           UNHANDLED;
8256         }
8257       break;
8258
8259     case IA64_RS_CR_IRR:
8260       if (note == 0)
8261         {
8262           /* handle mov-from-CR-IVR; it's a read that writes CR[IRR] */
8263           int regno = CURR_SLOT.opnd[1].X_add_number - REG_CR;
8264           if (rsrc_write
8265               && idesc->operands[1] == IA64_OPND_CR3
8266               && regno == CR_IVR)
8267             {
8268               for (i = 0; i < 4; i++)
8269                 {
8270                   specs[count] = tmpl;
8271                   specs[count++].index = CR_IRR0 + i;
8272                 }
8273             }
8274         }
8275       else if (note == 1)
8276         {
8277           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8278           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8279               && regno >= CR_IRR0
8280               && regno <= CR_IRR3)
8281             {
8282               specs[count] = tmpl;
8283               specs[count++].index = regno;
8284             }
8285         }
8286       else
8287         {
8288           UNHANDLED;
8289         }
8290       break;
8291
8292     case IA64_RS_CR_LRR:
8293       if (note != 1)
8294         {
8295           UNHANDLED;
8296         }
8297       else
8298         {
8299           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8300           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8301               && (regno == CR_LRR0 || regno == CR_LRR1))
8302             {
8303               specs[count] = tmpl;
8304               specs[count++].index = regno;
8305             }
8306         }
8307       break;
8308
8309     case IA64_RS_CR:
8310       if (note == 1)
8311         {
8312           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8313             {
8314               specs[count] = tmpl;
8315               specs[count++].index =
8316                 CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8317             }
8318         }
8319       else
8320         {
8321           UNHANDLED;
8322         }
8323       break;
8324
8325     case IA64_RS_FR:
8326     case IA64_RS_FRb:
8327       if (note != 1)
8328         {
8329           UNHANDLED;
8330         }
8331       else if (rsrc_write)
8332         {
8333           if (dep->specifier == IA64_RS_FRb
8334               && idesc->operands[0] == IA64_OPND_F1)
8335             {
8336               specs[count] = tmpl;
8337               specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_FR;
8338             }
8339         }
8340       else
8341         {
8342           for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8343             {
8344               if (idesc->operands[i] == IA64_OPND_F2
8345                   || idesc->operands[i] == IA64_OPND_F3
8346                   || idesc->operands[i] == IA64_OPND_F4)
8347                 {
8348                   specs[count] = tmpl;
8349                   specs[count++].index =
8350                     CURR_SLOT.opnd[i].X_add_number - REG_FR;
8351                 }
8352             }
8353         }
8354       break;
8355
8356     case IA64_RS_GR:
8357       if (note == 13)
8358         {
8359           /* This reference applies only to the GR whose value is loaded with
8360              data returned from memory.  */
8361           specs[count] = tmpl;
8362           specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_GR;
8363         }
8364       else if (note == 1)
8365         {
8366           if (rsrc_write)
8367             {
8368               for (i = 0; i < idesc->num_outputs; i++)
8369                 if (idesc->operands[i] == IA64_OPND_R1
8370                     || idesc->operands[i] == IA64_OPND_R2
8371                     || idesc->operands[i] == IA64_OPND_R3)
8372                   {
8373                     specs[count] = tmpl;
8374                     specs[count++].index =
8375                       CURR_SLOT.opnd[i].X_add_number - REG_GR;
8376                   }
8377               if (idesc->flags & IA64_OPCODE_POSTINC)
8378                 for (i = 0; i < NELEMS (idesc->operands); i++)
8379                   if (idesc->operands[i] == IA64_OPND_MR3)
8380                     {
8381                       specs[count] = tmpl;
8382                       specs[count++].index =
8383                         CURR_SLOT.opnd[i].X_add_number - REG_GR;
8384                     }
8385             }
8386           else
8387             {
8388               /* Look for anything that reads a GR.  */
8389               for (i = 0; i < NELEMS (idesc->operands); i++)
8390                 {
8391                   if (idesc->operands[i] == IA64_OPND_MR3
8392                       || idesc->operands[i] == IA64_OPND_CPUID_R3
8393                       || idesc->operands[i] == IA64_OPND_DBR_R3
8394                       || idesc->operands[i] == IA64_OPND_IBR_R3
8395                       || idesc->operands[i] == IA64_OPND_MSR_R3
8396                       || idesc->operands[i] == IA64_OPND_PKR_R3
8397                       || idesc->operands[i] == IA64_OPND_PMC_R3
8398                       || idesc->operands[i] == IA64_OPND_PMD_R3
8399                       || idesc->operands[i] == IA64_OPND_RR_R3
8400                       || ((i >= idesc->num_outputs)
8401                           && (idesc->operands[i] == IA64_OPND_R1
8402                               || idesc->operands[i] == IA64_OPND_R2
8403                               || idesc->operands[i] == IA64_OPND_R3
8404                               /* addl source register.  */
8405                               || idesc->operands[i] == IA64_OPND_R3_2)))
8406                     {
8407                       specs[count] = tmpl;
8408                       specs[count++].index =
8409                         CURR_SLOT.opnd[i].X_add_number - REG_GR;
8410                     }
8411                 }
8412             }
8413         }
8414       else
8415         {
8416           UNHANDLED;
8417         }
8418       break;
8419
8420       /* This is the same as IA64_RS_PRr, except that the register range is
8421          from 1 - 15, and there are no rotating register reads/writes here.  */
8422     case IA64_RS_PR:
8423       if (note == 0)
8424         {
8425           for (i = 1; i < 16; i++)
8426             {
8427               specs[count] = tmpl;
8428               specs[count++].index = i;
8429             }
8430         }
8431       else if (note == 7)
8432         {
8433           valueT mask = 0;
8434           /* Mark only those registers indicated by the mask.  */
8435           if (rsrc_write)
8436             {
8437               mask = CURR_SLOT.opnd[2].X_add_number;
8438               for (i = 1; i < 16; i++)
8439                 if (mask & ((valueT) 1 << i))
8440                   {
8441                     specs[count] = tmpl;
8442                     specs[count++].index = i;
8443                   }
8444             }
8445           else
8446             {
8447               UNHANDLED;
8448             }
8449         }
8450       else if (note == 11) /* note 11 implies note 1 as well */
8451         {
8452           if (rsrc_write)
8453             {
8454               for (i = 0; i < idesc->num_outputs; i++)
8455                 {
8456                   if (idesc->operands[i] == IA64_OPND_P1
8457                       || idesc->operands[i] == IA64_OPND_P2)
8458                     {
8459                       int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8460                       if (regno >= 1 && regno < 16)
8461                         {
8462                           specs[count] = tmpl;
8463                           specs[count++].index = regno;
8464                         }
8465                     }
8466                 }
8467             }
8468           else
8469             {
8470               UNHANDLED;
8471             }
8472         }
8473       else if (note == 12)
8474         {
8475           if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8476             {
8477               specs[count] = tmpl;
8478               specs[count++].index = CURR_SLOT.qp_regno;
8479             }
8480         }
8481       else if (note == 1)
8482         {
8483           if (rsrc_write)
8484             {
8485               int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8486               int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8487               int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8488               int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8489
8490               if ((idesc->operands[0] == IA64_OPND_P1
8491                    || idesc->operands[0] == IA64_OPND_P2)
8492                   && p1 >= 1 && p1 < 16)
8493                 {
8494                   specs[count] = tmpl;
8495                   specs[count].cmp_type =
8496                     (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8497                   specs[count++].index = p1;
8498                 }
8499               if ((idesc->operands[1] == IA64_OPND_P1
8500                    || idesc->operands[1] == IA64_OPND_P2)
8501                   && p2 >= 1 && p2 < 16)
8502                 {
8503                   specs[count] = tmpl;
8504                   specs[count].cmp_type =
8505                     (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8506                   specs[count++].index = p2;
8507                 }
8508             }
8509           else
8510             {
8511               if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8512                 {
8513                   specs[count] = tmpl;
8514                   specs[count++].index = CURR_SLOT.qp_regno;
8515                 }
8516               if (idesc->operands[1] == IA64_OPND_PR)
8517                 {
8518                   for (i = 1; i < 16; i++)
8519                     {
8520                       specs[count] = tmpl;
8521                       specs[count++].index = i;
8522                     }
8523                 }
8524             }
8525         }
8526       else
8527         {
8528           UNHANDLED;
8529         }
8530       break;
8531
8532       /* This is the general case for PRs.  IA64_RS_PR and IA64_RS_PR63 are
8533          simplified cases of this.  */
8534     case IA64_RS_PRr:
8535       if (note == 0)
8536         {
8537           for (i = 16; i < 63; i++)
8538             {
8539               specs[count] = tmpl;
8540               specs[count++].index = i;
8541             }
8542         }
8543       else if (note == 7)
8544         {
8545           valueT mask = 0;
8546           /* Mark only those registers indicated by the mask.  */
8547           if (rsrc_write
8548               && idesc->operands[0] == IA64_OPND_PR)
8549             {
8550               mask = CURR_SLOT.opnd[2].X_add_number;
8551               if (mask & ((valueT) 1 << 16))
8552                 for (i = 16; i < 63; i++)
8553                   {
8554                     specs[count] = tmpl;
8555                     specs[count++].index = i;
8556                   }
8557             }
8558           else if (rsrc_write
8559                    && idesc->operands[0] == IA64_OPND_PR_ROT)
8560             {
8561               for (i = 16; i < 63; i++)
8562                 {
8563                   specs[count] = tmpl;
8564                   specs[count++].index = i;
8565                 }
8566             }
8567           else
8568             {
8569               UNHANDLED;
8570             }
8571         }
8572       else if (note == 11) /* note 11 implies note 1 as well */
8573         {
8574           if (rsrc_write)
8575             {
8576               for (i = 0; i < idesc->num_outputs; i++)
8577                 {
8578                   if (idesc->operands[i] == IA64_OPND_P1
8579                       || idesc->operands[i] == IA64_OPND_P2)
8580                     {
8581                       int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8582                       if (regno >= 16 && regno < 63)
8583                         {
8584                           specs[count] = tmpl;
8585                           specs[count++].index = regno;
8586                         }
8587                     }
8588                 }
8589             }
8590           else
8591             {
8592               UNHANDLED;
8593             }
8594         }
8595       else if (note == 12)
8596         {
8597           if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8598             {
8599               specs[count] = tmpl;
8600               specs[count++].index = CURR_SLOT.qp_regno;
8601             }
8602         }
8603       else if (note == 1)
8604         {
8605           if (rsrc_write)
8606             {
8607               int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8608               int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8609               int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8610               int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8611
8612               if ((idesc->operands[0] == IA64_OPND_P1
8613                    || idesc->operands[0] == IA64_OPND_P2)
8614                   && p1 >= 16 && p1 < 63)
8615                 {
8616                   specs[count] = tmpl;
8617                   specs[count].cmp_type =
8618                     (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8619                   specs[count++].index = p1;
8620                 }
8621               if ((idesc->operands[1] == IA64_OPND_P1
8622                    || idesc->operands[1] == IA64_OPND_P2)
8623                   && p2 >= 16 && p2 < 63)
8624                 {
8625                   specs[count] = tmpl;
8626                   specs[count].cmp_type =
8627                     (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8628                   specs[count++].index = p2;
8629                 }
8630             }
8631           else
8632             {
8633               if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8634                 {
8635                   specs[count] = tmpl;
8636                   specs[count++].index = CURR_SLOT.qp_regno;
8637                 }
8638               if (idesc->operands[1] == IA64_OPND_PR)
8639                 {
8640                   for (i = 16; i < 63; i++)
8641                     {
8642                       specs[count] = tmpl;
8643                       specs[count++].index = i;
8644                     }
8645                 }
8646             }
8647         }
8648       else
8649         {
8650           UNHANDLED;
8651         }
8652       break;
8653
8654     case IA64_RS_PSR:
8655       /* Verify that the instruction is using the PSR bit indicated in
8656          dep->regindex.  */
8657       if (note == 0)
8658         {
8659           if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_UM)
8660             {
8661               if (dep->regindex < 6)
8662                 {
8663                   specs[count++] = tmpl;
8664                 }
8665             }
8666           else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR)
8667             {
8668               if (dep->regindex < 32
8669                   || dep->regindex == 35
8670                   || dep->regindex == 36
8671                   || (!rsrc_write && dep->regindex == PSR_CPL))
8672                 {
8673                   specs[count++] = tmpl;
8674                 }
8675             }
8676           else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_L)
8677             {
8678               if (dep->regindex < 32
8679                   || dep->regindex == 35
8680                   || dep->regindex == 36
8681                   || (rsrc_write && dep->regindex == PSR_CPL))
8682                 {
8683                   specs[count++] = tmpl;
8684                 }
8685             }
8686           else
8687             {
8688               /* Several PSR bits have very specific dependencies.  */
8689               switch (dep->regindex)
8690                 {
8691                 default:
8692                   specs[count++] = tmpl;
8693                   break;
8694                 case PSR_IC:
8695                   if (rsrc_write)
8696                     {
8697                       specs[count++] = tmpl;
8698                     }
8699                   else
8700                     {
8701                       /* Only certain CR accesses use PSR.ic */
8702                       if (idesc->operands[0] == IA64_OPND_CR3
8703                           || idesc->operands[1] == IA64_OPND_CR3)
8704                         {
8705                           int index =
8706                             ((idesc->operands[0] == IA64_OPND_CR3)
8707                              ? 0 : 1);
8708                           int regno =
8709                             CURR_SLOT.opnd[index].X_add_number - REG_CR;
8710
8711                           switch (regno)
8712                             {
8713                             default:
8714                               break;
8715                             case CR_ITIR:
8716                             case CR_IFS:
8717                             case CR_IIM:
8718                             case CR_IIP:
8719                             case CR_IPSR:
8720                             case CR_ISR:
8721                             case CR_IFA:
8722                             case CR_IHA:
8723                             case CR_IIPA:
8724                               specs[count++] = tmpl;
8725                               break;
8726                             }
8727                         }
8728                     }
8729                   break;
8730                 case PSR_CPL:
8731                   if (rsrc_write)
8732                     {
8733                       specs[count++] = tmpl;
8734                     }
8735                   else
8736                     {
8737                       /* Only some AR accesses use cpl */
8738                       if (idesc->operands[0] == IA64_OPND_AR3
8739                           || idesc->operands[1] == IA64_OPND_AR3)
8740                         {
8741                           int index =
8742                             ((idesc->operands[0] == IA64_OPND_AR3)
8743                              ? 0 : 1);
8744                           int regno =
8745                             CURR_SLOT.opnd[index].X_add_number - REG_AR;
8746
8747                           if (regno == AR_ITC
8748                               || (index == 0
8749                                   && (regno == AR_ITC
8750                                       || regno == AR_RSC
8751                                       || (regno >= AR_K0
8752                                           && regno <= AR_K7))))
8753                             {
8754                               specs[count++] = tmpl;
8755                             }
8756                         }
8757                       else
8758                         {
8759                           specs[count++] = tmpl;
8760                         }
8761                       break;
8762                     }
8763                 }
8764             }
8765         }
8766       else if (note == 7)
8767         {
8768           valueT mask = 0;
8769           if (idesc->operands[0] == IA64_OPND_IMMU24)
8770             {
8771               mask = CURR_SLOT.opnd[0].X_add_number;
8772             }
8773           else
8774             {
8775               UNHANDLED;
8776             }
8777           if (mask & ((valueT) 1 << dep->regindex))
8778             {
8779               specs[count++] = tmpl;
8780             }
8781         }
8782       else if (note == 8)
8783         {
8784           int min = dep->regindex == PSR_DFL ? 2 : 32;
8785           int max = dep->regindex == PSR_DFL ? 31 : 127;
8786           /* dfh is read on FR32-127; dfl is read on FR2-31 */
8787           for (i = 0; i < NELEMS (idesc->operands); i++)
8788             {
8789               if (idesc->operands[i] == IA64_OPND_F1
8790                   || idesc->operands[i] == IA64_OPND_F2
8791                   || idesc->operands[i] == IA64_OPND_F3
8792                   || idesc->operands[i] == IA64_OPND_F4)
8793                 {
8794                   int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8795                   if (reg >= min && reg <= max)
8796                     {
8797                       specs[count++] = tmpl;
8798                     }
8799                 }
8800             }
8801         }
8802       else if (note == 9)
8803         {
8804           int min = dep->regindex == PSR_MFL ? 2 : 32;
8805           int max = dep->regindex == PSR_MFL ? 31 : 127;
8806           /* mfh is read on writes to FR32-127; mfl is read on writes to
8807              FR2-31 */
8808           for (i = 0; i < idesc->num_outputs; i++)
8809             {
8810               if (idesc->operands[i] == IA64_OPND_F1)
8811                 {
8812                   int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8813                   if (reg >= min && reg <= max)
8814                     {
8815                       specs[count++] = tmpl;
8816                     }
8817                 }
8818             }
8819         }
8820       else if (note == 10)
8821         {
8822           for (i = 0; i < NELEMS (idesc->operands); i++)
8823             {
8824               if (idesc->operands[i] == IA64_OPND_R1
8825                   || idesc->operands[i] == IA64_OPND_R2
8826                   || idesc->operands[i] == IA64_OPND_R3)
8827                 {
8828                   int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8829                   if (regno >= 16 && regno <= 31)
8830                     {
8831                       specs[count++] = tmpl;
8832                     }
8833                 }
8834             }
8835         }
8836       else
8837         {
8838           UNHANDLED;
8839         }
8840       break;
8841
8842     case IA64_RS_AR_FPSR:
8843       if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8844         {
8845           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8846           if (regno == AR_FPSR)
8847             {
8848               specs[count++] = tmpl;
8849             }
8850         }
8851       else
8852         {
8853           specs[count++] = tmpl;
8854         }
8855       break;
8856
8857     case IA64_RS_ARX:
8858       /* Handle all AR[REG] resources */
8859       if (note == 0 || note == 1)
8860         {
8861           int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8862           if (idesc->operands[!rsrc_write] == IA64_OPND_AR3
8863               && regno == dep->regindex)
8864             {
8865               specs[count++] = tmpl;
8866             }
8867           /* other AR[REG] resources may be affected by AR accesses */
8868           else if (idesc->operands[0] == IA64_OPND_AR3)
8869             {
8870               /* AR[] writes */
8871               regno = CURR_SLOT.opnd[0].X_add_number - REG_AR;
8872               switch (dep->regindex)
8873                 {
8874                 default:
8875                   break;
8876                 case AR_BSP:
8877                 case AR_RNAT:
8878                   if (regno == AR_BSPSTORE)
8879                     {
8880                       specs[count++] = tmpl;
8881                     }
8882                 case AR_RSC:
8883                   if (!rsrc_write &&
8884                       (regno == AR_BSPSTORE
8885                        || regno == AR_RNAT))
8886                     {
8887                       specs[count++] = tmpl;
8888                     }
8889                   break;
8890                 }
8891             }
8892           else if (idesc->operands[1] == IA64_OPND_AR3)
8893             {
8894               /* AR[] reads */
8895               regno = CURR_SLOT.opnd[1].X_add_number - REG_AR;
8896               switch (dep->regindex)
8897                 {
8898                 default:
8899                   break;
8900                 case AR_RSC:
8901                   if (regno == AR_BSPSTORE || regno == AR_RNAT)
8902                     {
8903                       specs[count++] = tmpl;
8904                     }
8905                   break;
8906                 }
8907             }
8908           else
8909             {
8910               specs[count++] = tmpl;
8911             }
8912         }
8913       else
8914         {
8915           UNHANDLED;
8916         }
8917       break;
8918
8919     case IA64_RS_CRX:
8920       /* Handle all CR[REG] resources */
8921       if (note == 0 || note == 1)
8922         {
8923           if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8924             {
8925               int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8926               if (regno == dep->regindex)
8927                 {
8928                   specs[count++] = tmpl;
8929                 }
8930               else if (!rsrc_write)
8931                 {
8932                   /* Reads from CR[IVR] affect other resources.  */
8933                   if (regno == CR_IVR)
8934                     {
8935                       if ((dep->regindex >= CR_IRR0
8936                            && dep->regindex <= CR_IRR3)
8937                           || dep->regindex == CR_TPR)
8938                         {
8939                           specs[count++] = tmpl;
8940                         }
8941                     }
8942                 }
8943             }
8944           else
8945             {
8946               specs[count++] = tmpl;
8947             }
8948         }
8949       else
8950         {
8951           UNHANDLED;
8952         }
8953       break;
8954
8955     case IA64_RS_INSERVICE:
8956       /* look for write of EOI (67) or read of IVR (65) */
8957       if ((idesc->operands[0] == IA64_OPND_CR3
8958            && CURR_SLOT.opnd[0].X_add_number - REG_CR == CR_EOI)
8959           || (idesc->operands[1] == IA64_OPND_CR3
8960               && CURR_SLOT.opnd[1].X_add_number - REG_CR == CR_IVR))
8961         {
8962           specs[count++] = tmpl;
8963         }
8964       break;
8965
8966     case IA64_RS_GR0:
8967       if (note == 1)
8968         {
8969           specs[count++] = tmpl;
8970         }
8971       else
8972         {
8973           UNHANDLED;
8974         }
8975       break;
8976
8977     case IA64_RS_CFM:
8978       if (note != 2)
8979         {
8980           specs[count++] = tmpl;
8981         }
8982       else
8983         {
8984           /* Check if any of the registers accessed are in the rotating region.
8985              mov to/from pr accesses CFM only when qp_regno is in the rotating
8986              region */
8987           for (i = 0; i < NELEMS (idesc->operands); i++)
8988             {
8989               if (idesc->operands[i] == IA64_OPND_R1
8990                   || idesc->operands[i] == IA64_OPND_R2
8991                   || idesc->operands[i] == IA64_OPND_R3)
8992                 {
8993                   int num = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8994                   /* Assumes that md.rot.num_regs is always valid */
8995                   if (md.rot.num_regs > 0
8996                       && num > 31
8997                       && num < 31 + md.rot.num_regs)
8998                     {
8999                       specs[count] = tmpl;
9000                       specs[count++].specific = 0;
9001                     }
9002                 }
9003               else if (idesc->operands[i] == IA64_OPND_F1
9004                        || idesc->operands[i] == IA64_OPND_F2
9005                        || idesc->operands[i] == IA64_OPND_F3
9006                        || idesc->operands[i] == IA64_OPND_F4)
9007                 {
9008                   int num = CURR_SLOT.opnd[i].X_add_number - REG_FR;
9009                   if (num > 31)
9010                     {
9011                       specs[count] = tmpl;
9012                       specs[count++].specific = 0;
9013                     }
9014                 }
9015               else if (idesc->operands[i] == IA64_OPND_P1
9016                        || idesc->operands[i] == IA64_OPND_P2)
9017                 {
9018                   int num = CURR_SLOT.opnd[i].X_add_number - REG_P;
9019                   if (num > 15)
9020                     {
9021                       specs[count] = tmpl;
9022                       specs[count++].specific = 0;
9023                     }
9024                 }
9025             }
9026           if (CURR_SLOT.qp_regno > 15)
9027             {
9028               specs[count] = tmpl;
9029               specs[count++].specific = 0;
9030             }
9031         }
9032       break;
9033
9034       /* This is the same as IA64_RS_PRr, except simplified to account for
9035          the fact that there is only one register.  */
9036     case IA64_RS_PR63:
9037       if (note == 0)
9038         {
9039           specs[count++] = tmpl;
9040         }
9041       else if (note == 7)
9042         {
9043           valueT mask = 0;
9044           if (idesc->operands[2] == IA64_OPND_IMM17)
9045             mask = CURR_SLOT.opnd[2].X_add_number;
9046           if (mask & ((valueT) 1 << 63))
9047             specs[count++] = tmpl;
9048         }
9049       else if (note == 11)
9050         {
9051           if ((idesc->operands[0] == IA64_OPND_P1
9052                && CURR_SLOT.opnd[0].X_add_number - REG_P == 63)
9053               || (idesc->operands[1] == IA64_OPND_P2
9054                   && CURR_SLOT.opnd[1].X_add_number - REG_P == 63))
9055             {
9056               specs[count++] = tmpl;
9057             }
9058         }
9059       else if (note == 12)
9060         {
9061           if (CURR_SLOT.qp_regno == 63)
9062             {
9063               specs[count++] = tmpl;
9064             }
9065         }
9066       else if (note == 1)
9067         {
9068           if (rsrc_write)
9069             {
9070               int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9071               int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9072               int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
9073               int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
9074
9075               if (p1 == 63
9076                   && (idesc->operands[0] == IA64_OPND_P1
9077                       || idesc->operands[0] == IA64_OPND_P2))
9078                 {
9079                   specs[count] = tmpl;
9080                   specs[count++].cmp_type =
9081                     (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
9082                 }
9083               if (p2 == 63
9084                   && (idesc->operands[1] == IA64_OPND_P1
9085                       || idesc->operands[1] == IA64_OPND_P2))
9086                 {
9087                   specs[count] = tmpl;
9088                   specs[count++].cmp_type =
9089                     (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
9090                 }
9091             }
9092           else
9093             {
9094               if (CURR_SLOT.qp_regno == 63)
9095                 {
9096                   specs[count++] = tmpl;
9097                 }
9098             }
9099         }
9100       else
9101         {
9102           UNHANDLED;
9103         }
9104       break;
9105
9106     case IA64_RS_RSE:
9107       /* FIXME we can identify some individual RSE written resources, but RSE
9108          read resources have not yet been completely identified, so for now
9109          treat RSE as a single resource */
9110       if (strncmp (idesc->name, "mov", 3) == 0)
9111         {
9112           if (rsrc_write)
9113             {
9114               if (idesc->operands[0] == IA64_OPND_AR3
9115                   && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE)
9116                 {
9117                   specs[count] = tmpl;
9118                   specs[count++].index = 0; /* IA64_RSE_BSPLOAD/RNATBITINDEX */
9119                 }
9120             }
9121           else
9122             {
9123               if (idesc->operands[0] == IA64_OPND_AR3)
9124                 {
9125                   if (CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE
9126                       || CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_RNAT)
9127                     {
9128                       specs[count++] = tmpl;
9129                     }
9130                 }
9131               else if (idesc->operands[1] == IA64_OPND_AR3)
9132                 {
9133                   if (CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSP
9134                       || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSPSTORE
9135                       || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_RNAT)
9136                     {
9137                       specs[count++] = tmpl;
9138                     }
9139                 }
9140             }
9141         }
9142       else
9143         {
9144           specs[count++] = tmpl;
9145         }
9146       break;
9147
9148     case IA64_RS_ANY:
9149       /* FIXME -- do any of these need to be non-specific? */
9150       specs[count++] = tmpl;
9151       break;
9152
9153     default:
9154       as_bad (_("Unrecognized dependency specifier %d\n"), dep->specifier);
9155       break;
9156     }
9157
9158   return count;
9159 }
9160
9161 /* Clear branch flags on marked resources.  This breaks the link between the
9162    QP of the marking instruction and a subsequent branch on the same QP.  */
9163
9164 static void
9165 clear_qp_branch_flag (mask)
9166      valueT mask;
9167 {
9168   int i;
9169   for (i = 0; i < regdepslen; i++)
9170     {
9171       valueT bit = ((valueT) 1 << regdeps[i].qp_regno);
9172       if ((bit & mask) != 0)
9173         {
9174           regdeps[i].link_to_qp_branch = 0;
9175         }
9176     }
9177 }
9178
9179 /* MASK contains 2 and only 2 PRs which are mutually exclusive.  Remove
9180    any mutexes which contain one of the PRs and create new ones when
9181    needed.  */
9182
9183 static int
9184 update_qp_mutex (valueT mask)
9185 {
9186   int i;
9187   int add = 0;
9188
9189   i = 0;
9190   while (i < qp_mutexeslen)
9191     {
9192       if ((qp_mutexes[i].prmask & mask) != 0)
9193         {
9194           /* If it destroys and creates the same mutex, do nothing.  */
9195           if (qp_mutexes[i].prmask == mask
9196               && qp_mutexes[i].path == md.path)
9197             {
9198               i++;
9199               add = -1;
9200             }
9201           else
9202             {
9203               int keep = 0;
9204
9205               if (md.debug_dv)
9206                 {
9207                   fprintf (stderr, "  Clearing mutex relation");
9208                   print_prmask (qp_mutexes[i].prmask);
9209                   fprintf (stderr, "\n");
9210                 }
9211               
9212               /* Deal with the old mutex with more than 3+ PRs only if
9213                  the new mutex on the same execution path with it.
9214
9215                  FIXME: The 3+ mutex support is incomplete.
9216                  dot_pred_rel () may be a better place to fix it.  */
9217               if (qp_mutexes[i].path == md.path)
9218                 {
9219                   /* If it is a proper subset of the mutex, create a
9220                      new mutex.  */
9221                   if (add == 0
9222                       && (qp_mutexes[i].prmask & mask) == mask)
9223                     add = 1;
9224                   
9225                   qp_mutexes[i].prmask &= ~mask;
9226                   if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
9227                     {
9228                       /* Modify the mutex if there are more than one
9229                          PR left.  */
9230                       keep = 1;
9231                       i++;
9232                     }
9233                 }
9234               
9235               if (keep == 0)
9236                 /* Remove the mutex.  */
9237                 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9238             }
9239         }
9240       else
9241         ++i;
9242     }
9243
9244   if (add == 1)
9245     add_qp_mutex (mask);
9246
9247   return add;
9248 }
9249
9250 /* Remove any mutexes which contain any of the PRs indicated in the mask.
9251
9252    Any changes to a PR clears the mutex relations which include that PR.  */
9253
9254 static void
9255 clear_qp_mutex (mask)
9256      valueT mask;
9257 {
9258   int i;
9259
9260   i = 0;
9261   while (i < qp_mutexeslen)
9262     {
9263       if ((qp_mutexes[i].prmask & mask) != 0)
9264         {
9265           if (md.debug_dv)
9266             {
9267               fprintf (stderr, "  Clearing mutex relation");
9268               print_prmask (qp_mutexes[i].prmask);
9269               fprintf (stderr, "\n");
9270             }
9271           qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9272         }
9273       else
9274         ++i;
9275     }
9276 }
9277
9278 /* Clear implies relations which contain PRs in the given masks.
9279    P1_MASK indicates the source of the implies relation, while P2_MASK
9280    indicates the implied PR.  */
9281
9282 static void
9283 clear_qp_implies (p1_mask, p2_mask)
9284      valueT p1_mask;
9285      valueT p2_mask;
9286 {
9287   int i;
9288
9289   i = 0;
9290   while (i < qp_implieslen)
9291     {
9292       if ((((valueT) 1 << qp_implies[i].p1) & p1_mask) != 0
9293           || (((valueT) 1 << qp_implies[i].p2) & p2_mask) != 0)
9294         {
9295           if (md.debug_dv)
9296             fprintf (stderr, "Clearing implied relation PR%d->PR%d\n",
9297                      qp_implies[i].p1, qp_implies[i].p2);
9298           qp_implies[i] = qp_implies[--qp_implieslen];
9299         }
9300       else
9301         ++i;
9302     }
9303 }
9304
9305 /* Add the PRs specified to the list of implied relations.  */
9306
9307 static void
9308 add_qp_imply (p1, p2)
9309      int p1, p2;
9310 {
9311   valueT mask;
9312   valueT bit;
9313   int i;
9314
9315   /* p0 is not meaningful here.  */
9316   if (p1 == 0 || p2 == 0)
9317     abort ();
9318
9319   if (p1 == p2)
9320     return;
9321
9322   /* If it exists already, ignore it.  */
9323   for (i = 0; i < qp_implieslen; i++)
9324     {
9325       if (qp_implies[i].p1 == p1
9326           && qp_implies[i].p2 == p2
9327           && qp_implies[i].path == md.path
9328           && !qp_implies[i].p2_branched)
9329         return;
9330     }
9331
9332   if (qp_implieslen == qp_impliestotlen)
9333     {
9334       qp_impliestotlen += 20;
9335       qp_implies = (struct qp_imply *)
9336         xrealloc ((void *) qp_implies,
9337                   qp_impliestotlen * sizeof (struct qp_imply));
9338     }
9339   if (md.debug_dv)
9340     fprintf (stderr, "  Registering PR%d implies PR%d\n", p1, p2);
9341   qp_implies[qp_implieslen].p1 = p1;
9342   qp_implies[qp_implieslen].p2 = p2;
9343   qp_implies[qp_implieslen].path = md.path;
9344   qp_implies[qp_implieslen++].p2_branched = 0;
9345
9346   /* Add in the implied transitive relations; for everything that p2 implies,
9347      make p1 imply that, too; for everything that implies p1, make it imply p2
9348      as well.  */
9349   for (i = 0; i < qp_implieslen; i++)
9350     {
9351       if (qp_implies[i].p1 == p2)
9352         add_qp_imply (p1, qp_implies[i].p2);
9353       if (qp_implies[i].p2 == p1)
9354         add_qp_imply (qp_implies[i].p1, p2);
9355     }
9356   /* Add in mutex relations implied by this implies relation; for each mutex
9357      relation containing p2, duplicate it and replace p2 with p1.  */
9358   bit = (valueT) 1 << p1;
9359   mask = (valueT) 1 << p2;
9360   for (i = 0; i < qp_mutexeslen; i++)
9361     {
9362       if (qp_mutexes[i].prmask & mask)
9363         add_qp_mutex ((qp_mutexes[i].prmask & ~mask) | bit);
9364     }
9365 }
9366
9367 /* Add the PRs specified in the mask to the mutex list; this means that only
9368    one of the PRs can be true at any time.  PR0 should never be included in
9369    the mask.  */
9370
9371 static void
9372 add_qp_mutex (mask)
9373      valueT mask;
9374 {
9375   if (mask & 0x1)
9376     abort ();
9377
9378   if (qp_mutexeslen == qp_mutexestotlen)
9379     {
9380       qp_mutexestotlen += 20;
9381       qp_mutexes = (struct qpmutex *)
9382         xrealloc ((void *) qp_mutexes,
9383                   qp_mutexestotlen * sizeof (struct qpmutex));
9384     }
9385   if (md.debug_dv)
9386     {
9387       fprintf (stderr, "  Registering mutex on");
9388       print_prmask (mask);
9389       fprintf (stderr, "\n");
9390     }
9391   qp_mutexes[qp_mutexeslen].path = md.path;
9392   qp_mutexes[qp_mutexeslen++].prmask = mask;
9393 }
9394
9395 static int
9396 has_suffix_p (name, suffix)
9397      const char *name;
9398      const char *suffix;
9399 {
9400   size_t namelen = strlen (name);
9401   size_t sufflen = strlen (suffix);
9402
9403   if (namelen <= sufflen)
9404     return 0;
9405   return strcmp (name + namelen - sufflen, suffix) == 0;
9406 }
9407
9408 static void
9409 clear_register_values ()
9410 {
9411   int i;
9412   if (md.debug_dv)
9413     fprintf (stderr, "  Clearing register values\n");
9414   for (i = 1; i < NELEMS (gr_values); i++)
9415     gr_values[i].known = 0;
9416 }
9417
9418 /* Keep track of register values/changes which affect DV tracking.
9419
9420    optimization note: should add a flag to classes of insns where otherwise we
9421    have to examine a group of strings to identify them.  */
9422
9423 static void
9424 note_register_values (idesc)
9425      struct ia64_opcode *idesc;
9426 {
9427   valueT qp_changemask = 0;
9428   int i;
9429
9430   /* Invalidate values for registers being written to.  */
9431   for (i = 0; i < idesc->num_outputs; i++)
9432     {
9433       if (idesc->operands[i] == IA64_OPND_R1
9434           || idesc->operands[i] == IA64_OPND_R2
9435           || idesc->operands[i] == IA64_OPND_R3)
9436         {
9437           int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9438           if (regno > 0 && regno < NELEMS (gr_values))
9439             gr_values[regno].known = 0;
9440         }
9441       else if (idesc->operands[i] == IA64_OPND_R3_2)
9442         {
9443           int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9444           if (regno > 0 && regno < 4)
9445             gr_values[regno].known = 0;
9446         }
9447       else if (idesc->operands[i] == IA64_OPND_P1
9448                || idesc->operands[i] == IA64_OPND_P2)
9449         {
9450           int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
9451           qp_changemask |= (valueT) 1 << regno;
9452         }
9453       else if (idesc->operands[i] == IA64_OPND_PR)
9454         {
9455           if (idesc->operands[2] & (valueT) 0x10000)
9456             qp_changemask = ~(valueT) 0x1FFFF | idesc->operands[2];
9457           else
9458             qp_changemask = idesc->operands[2];
9459           break;
9460         }
9461       else if (idesc->operands[i] == IA64_OPND_PR_ROT)
9462         {
9463           if (idesc->operands[1] & ((valueT) 1 << 43))
9464             qp_changemask = -((valueT) 1 << 44) | idesc->operands[1];
9465           else
9466             qp_changemask = idesc->operands[1];
9467           qp_changemask &= ~(valueT) 0xFFFF;
9468           break;
9469         }
9470     }
9471
9472   /* Always clear qp branch flags on any PR change.  */
9473   /* FIXME there may be exceptions for certain compares.  */
9474   clear_qp_branch_flag (qp_changemask);
9475
9476   /* Invalidate rotating registers on insns which affect RRBs in CFM.  */
9477   if (idesc->flags & IA64_OPCODE_MOD_RRBS)
9478     {
9479       qp_changemask |= ~(valueT) 0xFFFF;
9480       if (strcmp (idesc->name, "clrrrb.pr") != 0)
9481         {
9482           for (i = 32; i < 32 + md.rot.num_regs; i++)
9483             gr_values[i].known = 0;
9484         }
9485       clear_qp_mutex (qp_changemask);
9486       clear_qp_implies (qp_changemask, qp_changemask);
9487     }
9488   /* After a call, all register values are undefined, except those marked
9489      as "safe".  */
9490   else if (strncmp (idesc->name, "br.call", 6) == 0
9491            || strncmp (idesc->name, "brl.call", 7) == 0)
9492     {
9493       /* FIXME keep GR values which are marked as "safe_across_calls"  */
9494       clear_register_values ();
9495       clear_qp_mutex (~qp_safe_across_calls);
9496       clear_qp_implies (~qp_safe_across_calls, ~qp_safe_across_calls);
9497       clear_qp_branch_flag (~qp_safe_across_calls);
9498     }
9499   else if (is_interruption_or_rfi (idesc)
9500            || is_taken_branch (idesc))
9501     {
9502       clear_register_values ();
9503       clear_qp_mutex (~(valueT) 0);
9504       clear_qp_implies (~(valueT) 0, ~(valueT) 0);
9505     }
9506   /* Look for mutex and implies relations.  */
9507   else if ((idesc->operands[0] == IA64_OPND_P1
9508             || idesc->operands[0] == IA64_OPND_P2)
9509            && (idesc->operands[1] == IA64_OPND_P1
9510                || idesc->operands[1] == IA64_OPND_P2))
9511     {
9512       int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9513       int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9514       valueT p1mask = (p1 != 0) ? (valueT) 1 << p1 : 0;
9515       valueT p2mask = (p2 != 0) ? (valueT) 1 << p2 : 0;
9516
9517       /* If both PRs are PR0, we can't really do anything.  */
9518       if (p1 == 0 && p2 == 0)
9519         {
9520           if (md.debug_dv)
9521             fprintf (stderr, "  Ignoring PRs due to inclusion of p0\n");
9522         }
9523       /* In general, clear mutexes and implies which include P1 or P2,
9524          with the following exceptions.  */
9525       else if (has_suffix_p (idesc->name, ".or.andcm")
9526                || has_suffix_p (idesc->name, ".and.orcm"))
9527         {
9528           clear_qp_implies (p2mask, p1mask);
9529         }
9530       else if (has_suffix_p (idesc->name, ".andcm")
9531                || has_suffix_p (idesc->name, ".and"))
9532         {
9533           clear_qp_implies (0, p1mask | p2mask);
9534         }
9535       else if (has_suffix_p (idesc->name, ".orcm")
9536                || has_suffix_p (idesc->name, ".or"))
9537         {
9538           clear_qp_mutex (p1mask | p2mask);
9539           clear_qp_implies (p1mask | p2mask, 0);
9540         }
9541       else
9542         {
9543           int added = 0;
9544
9545           clear_qp_implies (p1mask | p2mask, p1mask | p2mask);
9546
9547           /* If one of the PRs is PR0, we call clear_qp_mutex.  */
9548           if (p1 == 0 || p2 == 0)
9549             clear_qp_mutex (p1mask | p2mask);
9550           else
9551             added = update_qp_mutex (p1mask | p2mask);
9552
9553           if (CURR_SLOT.qp_regno == 0
9554               || has_suffix_p (idesc->name, ".unc"))
9555             {
9556               if (added == 0 && p1 && p2)
9557                 add_qp_mutex (p1mask | p2mask);
9558               if (CURR_SLOT.qp_regno != 0)
9559                 {
9560                   if (p1)
9561                     add_qp_imply (p1, CURR_SLOT.qp_regno);
9562                   if (p2)
9563                     add_qp_imply (p2, CURR_SLOT.qp_regno);
9564                 }
9565             }
9566         }
9567     }
9568   /* Look for mov imm insns into GRs.  */
9569   else if (idesc->operands[0] == IA64_OPND_R1
9570            && (idesc->operands[1] == IA64_OPND_IMM22
9571                || idesc->operands[1] == IA64_OPND_IMMU64)
9572            && (strcmp (idesc->name, "mov") == 0
9573                || strcmp (idesc->name, "movl") == 0))
9574     {
9575       int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
9576       if (regno > 0 && regno < NELEMS (gr_values))
9577         {
9578           gr_values[regno].known = 1;
9579           gr_values[regno].value = CURR_SLOT.opnd[1].X_add_number;
9580           gr_values[regno].path = md.path;
9581           if (md.debug_dv)
9582             {
9583               fprintf (stderr, "  Know gr%d = ", regno);
9584               fprintf_vma (stderr, gr_values[regno].value);
9585               fputs ("\n", stderr);
9586             }
9587         }
9588     }
9589   else
9590     {
9591       clear_qp_mutex (qp_changemask);
9592       clear_qp_implies (qp_changemask, qp_changemask);
9593     }
9594 }
9595
9596 /* Return whether the given predicate registers are currently mutex.  */
9597
9598 static int
9599 qp_mutex (p1, p2, path)
9600      int p1;
9601      int p2;
9602      int path;
9603 {
9604   int i;
9605   valueT mask;
9606
9607   if (p1 != p2)
9608     {
9609       mask = ((valueT) 1 << p1) | (valueT) 1 << p2;
9610       for (i = 0; i < qp_mutexeslen; i++)
9611         {
9612           if (qp_mutexes[i].path >= path
9613               && (qp_mutexes[i].prmask & mask) == mask)
9614             return 1;
9615         }
9616     }
9617   return 0;
9618 }
9619
9620 /* Return whether the given resource is in the given insn's list of chks
9621    Return 1 if the conflict is absolutely determined, 2 if it's a potential
9622    conflict.  */
9623
9624 static int
9625 resources_match (rs, idesc, note, qp_regno, path)
9626      struct rsrc *rs;
9627      struct ia64_opcode *idesc;
9628      int note;
9629      int qp_regno;
9630      int path;
9631 {
9632   struct rsrc specs[MAX_SPECS];
9633   int count;
9634
9635   /* If the marked resource's qp_regno and the given qp_regno are mutex,
9636      we don't need to check.  One exception is note 11, which indicates that
9637      target predicates are written regardless of PR[qp].  */
9638   if (qp_mutex (rs->qp_regno, qp_regno, path)
9639       && note != 11)
9640     return 0;
9641
9642   count = specify_resource (rs->dependency, idesc, DV_CHK, specs, note, path);
9643   while (count-- > 0)
9644     {
9645       /* UNAT checking is a bit more specific than other resources */
9646       if (rs->dependency->specifier == IA64_RS_AR_UNAT
9647           && specs[count].mem_offset.hint
9648           && rs->mem_offset.hint)
9649         {
9650           if (rs->mem_offset.base == specs[count].mem_offset.base)
9651             {
9652               if (((rs->mem_offset.offset >> 3) & 0x3F) ==
9653                   ((specs[count].mem_offset.offset >> 3) & 0x3F))
9654                 return 1;
9655               else
9656                 continue;
9657             }
9658         }
9659
9660       /* Skip apparent PR write conflicts where both writes are an AND or both
9661          writes are an OR.  */
9662       if (rs->dependency->specifier == IA64_RS_PR
9663           || rs->dependency->specifier == IA64_RS_PRr
9664           || rs->dependency->specifier == IA64_RS_PR63)
9665         {
9666           if (specs[count].cmp_type != CMP_NONE
9667               && specs[count].cmp_type == rs->cmp_type)
9668             {
9669               if (md.debug_dv)
9670                 fprintf (stderr, "  %s on parallel compare allowed (PR%d)\n",
9671                          dv_mode[rs->dependency->mode],
9672                          rs->dependency->specifier != IA64_RS_PR63 ?
9673                          specs[count].index : 63);
9674               continue;
9675             }
9676           if (md.debug_dv)
9677             fprintf (stderr,
9678                      "  %s on parallel compare conflict %s vs %s on PR%d\n",
9679                      dv_mode[rs->dependency->mode],
9680                      dv_cmp_type[rs->cmp_type],
9681                      dv_cmp_type[specs[count].cmp_type],
9682                      rs->dependency->specifier != IA64_RS_PR63 ?
9683                      specs[count].index : 63);
9684
9685         }
9686
9687       /* If either resource is not specific, conservatively assume a conflict
9688        */
9689       if (!specs[count].specific || !rs->specific)
9690         return 2;
9691       else if (specs[count].index == rs->index)
9692         return 1;
9693     }
9694
9695   return 0;
9696 }
9697
9698 /* Indicate an instruction group break; if INSERT_STOP is non-zero, then
9699    insert a stop to create the break.  Update all resource dependencies
9700    appropriately.  If QP_REGNO is non-zero, only apply the break to resources
9701    which use the same QP_REGNO and have the link_to_qp_branch flag set.
9702    If SAVE_CURRENT is non-zero, don't affect resources marked by the current
9703    instruction.  */
9704
9705 static void
9706 insn_group_break (insert_stop, qp_regno, save_current)
9707      int insert_stop;
9708      int qp_regno;
9709      int save_current;
9710 {
9711   int i;
9712
9713   if (insert_stop && md.num_slots_in_use > 0)
9714     PREV_SLOT.end_of_insn_group = 1;
9715
9716   if (md.debug_dv)
9717     {
9718       fprintf (stderr, "  Insn group break%s",
9719                (insert_stop ? " (w/stop)" : ""));
9720       if (qp_regno != 0)
9721         fprintf (stderr, " effective for QP=%d", qp_regno);
9722       fprintf (stderr, "\n");
9723     }
9724
9725   i = 0;
9726   while (i < regdepslen)
9727     {
9728       const struct ia64_dependency *dep = regdeps[i].dependency;
9729
9730       if (qp_regno != 0
9731           && regdeps[i].qp_regno != qp_regno)
9732         {
9733           ++i;
9734           continue;
9735         }
9736
9737       if (save_current
9738           && CURR_SLOT.src_file == regdeps[i].file
9739           && CURR_SLOT.src_line == regdeps[i].line)
9740         {
9741           ++i;
9742           continue;
9743         }
9744
9745       /* clear dependencies which are automatically cleared by a stop, or
9746          those that have reached the appropriate state of insn serialization */
9747       if (dep->semantics == IA64_DVS_IMPLIED
9748           || dep->semantics == IA64_DVS_IMPLIEDF
9749           || regdeps[i].insn_srlz == STATE_SRLZ)
9750         {
9751           print_dependency ("Removing", i);
9752           regdeps[i] = regdeps[--regdepslen];
9753         }
9754       else
9755         {
9756           if (dep->semantics == IA64_DVS_DATA
9757               || dep->semantics == IA64_DVS_INSTR
9758               || dep->semantics == IA64_DVS_SPECIFIC)
9759             {
9760               if (regdeps[i].insn_srlz == STATE_NONE)
9761                 regdeps[i].insn_srlz = STATE_STOP;
9762               if (regdeps[i].data_srlz == STATE_NONE)
9763                 regdeps[i].data_srlz = STATE_STOP;
9764             }
9765           ++i;
9766         }
9767     }
9768 }
9769
9770 /* Add the given resource usage spec to the list of active dependencies.  */
9771
9772 static void
9773 mark_resource (idesc, dep, spec, depind, path)
9774      struct ia64_opcode *idesc ATTRIBUTE_UNUSED;
9775      const struct ia64_dependency *dep ATTRIBUTE_UNUSED;
9776      struct rsrc *spec;
9777      int depind;
9778      int path;
9779 {
9780   if (regdepslen == regdepstotlen)
9781     {
9782       regdepstotlen += 20;
9783       regdeps = (struct rsrc *)
9784         xrealloc ((void *) regdeps,
9785                   regdepstotlen * sizeof (struct rsrc));
9786     }
9787
9788   regdeps[regdepslen] = *spec;
9789   regdeps[regdepslen].depind = depind;
9790   regdeps[regdepslen].path = path;
9791   regdeps[regdepslen].file = CURR_SLOT.src_file;
9792   regdeps[regdepslen].line = CURR_SLOT.src_line;
9793
9794   print_dependency ("Adding", regdepslen);
9795
9796   ++regdepslen;
9797 }
9798
9799 static void
9800 print_dependency (action, depind)
9801      const char *action;
9802      int depind;
9803 {
9804   if (md.debug_dv)
9805     {
9806       fprintf (stderr, "  %s %s '%s'",
9807                action, dv_mode[(regdeps[depind].dependency)->mode],
9808                (regdeps[depind].dependency)->name);
9809       if (regdeps[depind].specific && regdeps[depind].index != 0)
9810         fprintf (stderr, " (%d)", regdeps[depind].index);
9811       if (regdeps[depind].mem_offset.hint)
9812         {
9813           fputs (" ", stderr);
9814           fprintf_vma (stderr, regdeps[depind].mem_offset.base);
9815           fputs ("+", stderr);
9816           fprintf_vma (stderr, regdeps[depind].mem_offset.offset);
9817         }
9818       fprintf (stderr, "\n");
9819     }
9820 }
9821
9822 static void
9823 instruction_serialization ()
9824 {
9825   int i;
9826   if (md.debug_dv)
9827     fprintf (stderr, "  Instruction serialization\n");
9828   for (i = 0; i < regdepslen; i++)
9829     if (regdeps[i].insn_srlz == STATE_STOP)
9830       regdeps[i].insn_srlz = STATE_SRLZ;
9831 }
9832
9833 static void
9834 data_serialization ()
9835 {
9836   int i = 0;
9837   if (md.debug_dv)
9838     fprintf (stderr, "  Data serialization\n");
9839   while (i < regdepslen)
9840     {
9841       if (regdeps[i].data_srlz == STATE_STOP
9842           /* Note: as of 991210, all "other" dependencies are cleared by a
9843              data serialization.  This might change with new tables */
9844           || (regdeps[i].dependency)->semantics == IA64_DVS_OTHER)
9845         {
9846           print_dependency ("Removing", i);
9847           regdeps[i] = regdeps[--regdepslen];
9848         }
9849       else
9850         ++i;
9851     }
9852 }
9853
9854 /* Insert stops and serializations as needed to avoid DVs.  */
9855
9856 static void
9857 remove_marked_resource (rs)
9858      struct rsrc *rs;
9859 {
9860   switch (rs->dependency->semantics)
9861     {
9862     case IA64_DVS_SPECIFIC:
9863       if (md.debug_dv)
9864         fprintf (stderr, "Implementation-specific, assume worst case...\n");
9865       /* ...fall through...  */
9866     case IA64_DVS_INSTR:
9867       if (md.debug_dv)
9868         fprintf (stderr, "Inserting instr serialization\n");
9869       if (rs->insn_srlz < STATE_STOP)
9870         insn_group_break (1, 0, 0);
9871       if (rs->insn_srlz < STATE_SRLZ)
9872         {
9873           struct slot oldslot = CURR_SLOT;
9874           /* Manually jam a srlz.i insn into the stream */
9875           memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
9876           CURR_SLOT.idesc = ia64_find_opcode ("srlz.i");
9877           instruction_serialization ();
9878           md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9879           if (++md.num_slots_in_use >= NUM_SLOTS)
9880             emit_one_bundle ();
9881           CURR_SLOT = oldslot;
9882         }
9883       insn_group_break (1, 0, 0);
9884       break;
9885     case IA64_DVS_OTHER: /* as of rev2 (991220) of the DV tables, all
9886                             "other" types of DV are eliminated
9887                             by a data serialization */
9888     case IA64_DVS_DATA:
9889       if (md.debug_dv)
9890         fprintf (stderr, "Inserting data serialization\n");
9891       if (rs->data_srlz < STATE_STOP)
9892         insn_group_break (1, 0, 0);
9893       {
9894         struct slot oldslot = CURR_SLOT;
9895         /* Manually jam a srlz.d insn into the stream */
9896         memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
9897         CURR_SLOT.idesc = ia64_find_opcode ("srlz.d");
9898         data_serialization ();
9899         md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9900         if (++md.num_slots_in_use >= NUM_SLOTS)
9901           emit_one_bundle ();
9902         CURR_SLOT = oldslot;
9903       }
9904       break;
9905     case IA64_DVS_IMPLIED:
9906     case IA64_DVS_IMPLIEDF:
9907       if (md.debug_dv)
9908         fprintf (stderr, "Inserting stop\n");
9909       insn_group_break (1, 0, 0);
9910       break;
9911     default:
9912       break;
9913     }
9914 }
9915
9916 /* Check the resources used by the given opcode against the current dependency
9917    list.
9918
9919    The check is run once for each execution path encountered.  In this case,
9920    a unique execution path is the sequence of instructions following a code
9921    entry point, e.g. the following has three execution paths, one starting
9922    at L0, one at L1, and one at L2.
9923
9924    L0:     nop
9925    L1:     add
9926    L2:     add
9927    br.ret
9928 */
9929
9930 static void
9931 check_dependencies (idesc)
9932      struct ia64_opcode *idesc;
9933 {
9934   const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
9935   int path;
9936   int i;
9937
9938   /* Note that the number of marked resources may change within the
9939      loop if in auto mode.  */
9940   i = 0;
9941   while (i < regdepslen)
9942     {
9943       struct rsrc *rs = &regdeps[i];
9944       const struct ia64_dependency *dep = rs->dependency;
9945       int chkind;
9946       int note;
9947       int start_over = 0;
9948
9949       if (dep->semantics == IA64_DVS_NONE
9950           || (chkind = depends_on (rs->depind, idesc)) == -1)
9951         {
9952           ++i;
9953           continue;
9954         }
9955
9956       note = NOTE (opdeps->chks[chkind]);
9957
9958       /* Check this resource against each execution path seen thus far.  */
9959       for (path = 0; path <= md.path; path++)
9960         {
9961           int matchtype;
9962
9963           /* If the dependency wasn't on the path being checked, ignore it.  */
9964           if (rs->path < path)
9965             continue;
9966
9967           /* If the QP for this insn implies a QP which has branched, don't
9968              bother checking.  Ed. NOTE: I don't think this check is terribly
9969              useful; what's the point of generating code which will only be
9970              reached if its QP is zero?
9971              This code was specifically inserted to handle the following code,
9972              based on notes from Intel's DV checking code, where p1 implies p2.
9973
9974                   mov r4 = 2
9975              (p2) br.cond L
9976              (p1) mov r4 = 7
9977           */
9978           if (CURR_SLOT.qp_regno != 0)
9979             {
9980               int skip = 0;
9981               int implies;
9982               for (implies = 0; implies < qp_implieslen; implies++)
9983                 {
9984                   if (qp_implies[implies].path >= path
9985                       && qp_implies[implies].p1 == CURR_SLOT.qp_regno
9986                       && qp_implies[implies].p2_branched)
9987                     {
9988                       skip = 1;
9989                       break;
9990                     }
9991                 }
9992               if (skip)
9993                 continue;
9994             }
9995
9996           if ((matchtype = resources_match (rs, idesc, note,
9997                                             CURR_SLOT.qp_regno, path)) != 0)
9998             {
9999               char msg[1024];
10000               char pathmsg[256] = "";
10001               char indexmsg[256] = "";
10002               int certain = (matchtype == 1 && CURR_SLOT.qp_regno == 0);
10003
10004               if (path != 0)
10005                 sprintf (pathmsg, " when entry is at label '%s'",
10006                          md.entry_labels[path - 1]);
10007               if (rs->specific && rs->index != 0)
10008                 sprintf (indexmsg, ", specific resource number is %d",
10009                          rs->index);
10010               sprintf (msg, "Use of '%s' %s %s dependency '%s' (%s)%s%s",
10011                        idesc->name,
10012                        (certain ? "violates" : "may violate"),
10013                        dv_mode[dep->mode], dep->name,
10014                        dv_sem[dep->semantics],
10015                        pathmsg, indexmsg);
10016
10017               if (md.explicit_mode)
10018                 {
10019                   as_warn ("%s", msg);
10020                   if (path < md.path)
10021                     as_warn (_("Only the first path encountering the conflict "
10022                                "is reported"));
10023                   as_warn_where (rs->file, rs->line,
10024                                  _("This is the location of the "
10025                                    "conflicting usage"));
10026                   /* Don't bother checking other paths, to avoid duplicating
10027                      the same warning */
10028                   break;
10029                 }
10030               else
10031                 {
10032                   if (md.debug_dv)
10033                     fprintf (stderr, "%s @ %s:%d\n", msg, rs->file, rs->line);
10034
10035                   remove_marked_resource (rs);
10036
10037                   /* since the set of dependencies has changed, start over */
10038                   /* FIXME -- since we're removing dvs as we go, we
10039                      probably don't really need to start over...  */
10040                   start_over = 1;
10041                   break;
10042                 }
10043             }
10044         }
10045       if (start_over)
10046         i = 0;
10047       else
10048         ++i;
10049     }
10050 }
10051
10052 /* Register new dependencies based on the given opcode.  */
10053
10054 static void
10055 mark_resources (idesc)
10056      struct ia64_opcode *idesc;
10057 {
10058   int i;
10059   const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
10060   int add_only_qp_reads = 0;
10061
10062   /* A conditional branch only uses its resources if it is taken; if it is
10063      taken, we stop following that path.  The other branch types effectively
10064      *always* write their resources.  If it's not taken, register only QP
10065      reads.  */
10066   if (is_conditional_branch (idesc) || is_interruption_or_rfi (idesc))
10067     {
10068       add_only_qp_reads = 1;
10069     }
10070
10071   if (md.debug_dv)
10072     fprintf (stderr, "Registering '%s' resource usage\n", idesc->name);
10073
10074   for (i = 0; i < opdeps->nregs; i++)
10075     {
10076       const struct ia64_dependency *dep;
10077       struct rsrc specs[MAX_SPECS];
10078       int note;
10079       int path;
10080       int count;
10081
10082       dep = ia64_find_dependency (opdeps->regs[i]);
10083       note = NOTE (opdeps->regs[i]);
10084
10085       if (add_only_qp_reads
10086           && !(dep->mode == IA64_DV_WAR
10087                && (dep->specifier == IA64_RS_PR
10088                    || dep->specifier == IA64_RS_PRr
10089                    || dep->specifier == IA64_RS_PR63)))
10090         continue;
10091
10092       count = specify_resource (dep, idesc, DV_REG, specs, note, md.path);
10093
10094       while (count-- > 0)
10095         {
10096           mark_resource (idesc, dep, &specs[count],
10097                          DEP (opdeps->regs[i]), md.path);
10098         }
10099
10100       /* The execution path may affect register values, which may in turn
10101          affect which indirect-access resources are accessed.  */
10102       switch (dep->specifier)
10103         {
10104         default:
10105           break;
10106         case IA64_RS_CPUID:
10107         case IA64_RS_DBR:
10108         case IA64_RS_IBR:
10109         case IA64_RS_MSR:
10110         case IA64_RS_PKR:
10111         case IA64_RS_PMC:
10112         case IA64_RS_PMD:
10113         case IA64_RS_RR:
10114           for (path = 0; path < md.path; path++)
10115             {
10116               count = specify_resource (dep, idesc, DV_REG, specs, note, path);
10117               while (count-- > 0)
10118                 mark_resource (idesc, dep, &specs[count],
10119                                DEP (opdeps->regs[i]), path);
10120             }
10121           break;
10122         }
10123     }
10124 }
10125
10126 /* Remove dependencies when they no longer apply.  */
10127
10128 static void
10129 update_dependencies (idesc)
10130      struct ia64_opcode *idesc;
10131 {
10132   int i;
10133
10134   if (strcmp (idesc->name, "srlz.i") == 0)
10135     {
10136       instruction_serialization ();
10137     }
10138   else if (strcmp (idesc->name, "srlz.d") == 0)
10139     {
10140       data_serialization ();
10141     }
10142   else if (is_interruption_or_rfi (idesc)
10143            || is_taken_branch (idesc))
10144     {
10145       /* Although technically the taken branch doesn't clear dependencies
10146          which require a srlz.[id], we don't follow the branch; the next
10147          instruction is assumed to start with a clean slate.  */
10148       regdepslen = 0;
10149       md.path = 0;
10150     }
10151   else if (is_conditional_branch (idesc)
10152            && CURR_SLOT.qp_regno != 0)
10153     {
10154       int is_call = strstr (idesc->name, ".call") != NULL;
10155
10156       for (i = 0; i < qp_implieslen; i++)
10157         {
10158           /* If the conditional branch's predicate is implied by the predicate
10159              in an existing dependency, remove that dependency.  */
10160           if (qp_implies[i].p2 == CURR_SLOT.qp_regno)
10161             {
10162               int depind = 0;
10163               /* Note that this implied predicate takes a branch so that if
10164                  a later insn generates a DV but its predicate implies this
10165                  one, we can avoid the false DV warning.  */
10166               qp_implies[i].p2_branched = 1;
10167               while (depind < regdepslen)
10168                 {
10169                   if (regdeps[depind].qp_regno == qp_implies[i].p1)
10170                     {
10171                       print_dependency ("Removing", depind);
10172                       regdeps[depind] = regdeps[--regdepslen];
10173                     }
10174                   else
10175                     ++depind;
10176                 }
10177             }
10178         }
10179       /* Any marked resources which have this same predicate should be
10180          cleared, provided that the QP hasn't been modified between the
10181          marking instruction and the branch.  */
10182       if (is_call)
10183         {
10184           insn_group_break (0, CURR_SLOT.qp_regno, 1);
10185         }
10186       else
10187         {
10188           i = 0;
10189           while (i < regdepslen)
10190             {
10191               if (regdeps[i].qp_regno == CURR_SLOT.qp_regno
10192                   && regdeps[i].link_to_qp_branch
10193                   && (regdeps[i].file != CURR_SLOT.src_file
10194                       || regdeps[i].line != CURR_SLOT.src_line))
10195                 {
10196                   /* Treat like a taken branch */
10197                   print_dependency ("Removing", i);
10198                   regdeps[i] = regdeps[--regdepslen];
10199                 }
10200               else
10201                 ++i;
10202             }
10203         }
10204     }
10205 }
10206
10207 /* Examine the current instruction for dependency violations.  */
10208
10209 static int
10210 check_dv (idesc)
10211      struct ia64_opcode *idesc;
10212 {
10213   if (md.debug_dv)
10214     {
10215       fprintf (stderr, "Checking %s for violations (line %d, %d/%d)\n",
10216                idesc->name, CURR_SLOT.src_line,
10217                idesc->dependencies->nchks,
10218                idesc->dependencies->nregs);
10219     }
10220
10221   /* Look through the list of currently marked resources; if the current
10222      instruction has the dependency in its chks list which uses that resource,
10223      check against the specific resources used.  */
10224   check_dependencies (idesc);
10225
10226   /* Look up the instruction's regdeps (RAW writes, WAW writes, and WAR reads),
10227      then add them to the list of marked resources.  */
10228   mark_resources (idesc);
10229
10230   /* There are several types of dependency semantics, and each has its own
10231      requirements for being cleared
10232
10233      Instruction serialization (insns separated by interruption, rfi, or
10234      writer + srlz.i + reader, all in separate groups) clears DVS_INSTR.
10235
10236      Data serialization (instruction serialization, or writer + srlz.d +
10237      reader, where writer and srlz.d are in separate groups) clears
10238      DVS_DATA. (This also clears DVS_OTHER, but that is not guaranteed to
10239      always be the case).
10240
10241      Instruction group break (groups separated by stop, taken branch,
10242      interruption or rfi) clears DVS_IMPLIED and DVS_IMPLIEDF.
10243    */
10244   update_dependencies (idesc);
10245
10246   /* Sometimes, knowing a register value allows us to avoid giving a false DV
10247      warning.  Keep track of as many as possible that are useful.  */
10248   note_register_values (idesc);
10249
10250   /* We don't need or want this anymore.  */
10251   md.mem_offset.hint = 0;
10252
10253   return 0;
10254 }
10255
10256 /* Translate one line of assembly.  Pseudo ops and labels do not show
10257    here.  */
10258 void
10259 md_assemble (str)
10260      char *str;
10261 {
10262   char *saved_input_line_pointer, *mnemonic;
10263   const struct pseudo_opcode *pdesc;
10264   struct ia64_opcode *idesc;
10265   unsigned char qp_regno;
10266   unsigned int flags;
10267   int ch;
10268
10269   saved_input_line_pointer = input_line_pointer;
10270   input_line_pointer = str;
10271
10272   /* extract the opcode (mnemonic):  */
10273
10274   mnemonic = input_line_pointer;
10275   ch = get_symbol_end ();
10276   pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
10277   if (pdesc)
10278     {
10279       *input_line_pointer = ch;
10280       (*pdesc->handler) (pdesc->arg);
10281       goto done;
10282     }
10283
10284   /* Find the instruction descriptor matching the arguments.  */
10285
10286   idesc = ia64_find_opcode (mnemonic);
10287   *input_line_pointer = ch;
10288   if (!idesc)
10289     {
10290       as_bad ("Unknown opcode `%s'", mnemonic);
10291       goto done;
10292     }
10293
10294   idesc = parse_operands (idesc);
10295   if (!idesc)
10296     goto done;
10297
10298   /* Handle the dynamic ops we can handle now:  */
10299   if (idesc->type == IA64_TYPE_DYN)
10300     {
10301       if (strcmp (idesc->name, "add") == 0)
10302         {
10303           if (CURR_SLOT.opnd[2].X_op == O_register
10304               && CURR_SLOT.opnd[2].X_add_number < 4)
10305             mnemonic = "addl";
10306           else
10307             mnemonic = "adds";
10308           ia64_free_opcode (idesc);
10309           idesc = ia64_find_opcode (mnemonic);
10310         }
10311       else if (strcmp (idesc->name, "mov") == 0)
10312         {
10313           enum ia64_opnd opnd1, opnd2;
10314           int rop;
10315
10316           opnd1 = idesc->operands[0];
10317           opnd2 = idesc->operands[1];
10318           if (opnd1 == IA64_OPND_AR3)
10319             rop = 0;
10320           else if (opnd2 == IA64_OPND_AR3)
10321             rop = 1;
10322           else
10323             abort ();
10324           if (CURR_SLOT.opnd[rop].X_op == O_register)
10325             {
10326               if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10327                 mnemonic = "mov.i";
10328               else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10329                 mnemonic = "mov.m";
10330               else
10331                 rop = -1;
10332             }
10333           else
10334             abort ();
10335           if (rop >= 0)
10336             {
10337               ia64_free_opcode (idesc);
10338               idesc = ia64_find_opcode (mnemonic);
10339               while (idesc != NULL
10340                      && (idesc->operands[0] != opnd1
10341                          || idesc->operands[1] != opnd2))
10342                 idesc = get_next_opcode (idesc);
10343             }
10344         }
10345     }
10346   else if (strcmp (idesc->name, "mov.i") == 0
10347            || strcmp (idesc->name, "mov.m") == 0)
10348     {
10349       enum ia64_opnd opnd1, opnd2;
10350       int rop;
10351       
10352       opnd1 = idesc->operands[0];
10353       opnd2 = idesc->operands[1];
10354       if (opnd1 == IA64_OPND_AR3)
10355         rop = 0;
10356       else if (opnd2 == IA64_OPND_AR3)
10357         rop = 1;
10358       else
10359         abort ();
10360       if (CURR_SLOT.opnd[rop].X_op == O_register)
10361         {
10362           char unit = 'a';
10363           if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10364             unit = 'i';
10365           else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10366             unit = 'm';
10367           if (unit != 'a' && unit != idesc->name [4])
10368             as_bad ("AR %d cannot be accessed by %c-unit",
10369                     (int) (CURR_SLOT.opnd[rop].X_add_number - REG_AR),
10370                     TOUPPER (unit));
10371         }
10372     }
10373
10374   qp_regno = 0;
10375   if (md.qp.X_op == O_register)
10376     {
10377       qp_regno = md.qp.X_add_number - REG_P;
10378       md.qp.X_op = O_absent;
10379     }
10380
10381   flags = idesc->flags;
10382
10383   if ((flags & IA64_OPCODE_FIRST) != 0)
10384     {
10385       /* The alignment frag has to end with a stop bit only if the
10386          next instruction after the alignment directive has to be
10387          the first instruction in an instruction group.  */
10388       if (align_frag)
10389         {
10390           while (align_frag->fr_type != rs_align_code)
10391             {
10392               align_frag = align_frag->fr_next;
10393               if (!align_frag)
10394                 break;
10395             }
10396           /* align_frag can be NULL if there are directives in
10397              between.  */
10398           if (align_frag && align_frag->fr_next == frag_now)
10399             align_frag->tc_frag_data = 1;
10400         }
10401
10402       insn_group_break (1, 0, 0);
10403     }
10404   align_frag = NULL;
10405
10406   if ((flags & IA64_OPCODE_NO_PRED) != 0 && qp_regno != 0)
10407     {
10408       as_bad ("`%s' cannot be predicated", idesc->name);
10409       goto done;
10410     }
10411
10412   /* Build the instruction.  */
10413   CURR_SLOT.qp_regno = qp_regno;
10414   CURR_SLOT.idesc = idesc;
10415   as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
10416   dwarf2_where (&CURR_SLOT.debug_line);
10417
10418   /* Add unwind entry, if there is one.  */
10419   if (unwind.current_entry)
10420     {
10421       CURR_SLOT.unwind_record = unwind.current_entry;
10422       unwind.current_entry = NULL;
10423     }
10424   if (unwind.proc_start && S_IS_DEFINED (unwind.proc_start))
10425     unwind.insn = 1;
10426
10427   /* Check for dependency violations.  */
10428   if (md.detect_dv)
10429     check_dv (idesc);
10430
10431   md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
10432   if (++md.num_slots_in_use >= NUM_SLOTS)
10433     emit_one_bundle ();
10434
10435   if ((flags & IA64_OPCODE_LAST) != 0)
10436     insn_group_break (1, 0, 0);
10437
10438   md.last_text_seg = now_seg;
10439
10440  done:
10441   input_line_pointer = saved_input_line_pointer;
10442 }
10443
10444 /* Called when symbol NAME cannot be found in the symbol table.
10445    Should be used for dynamic valued symbols only.  */
10446
10447 symbolS *
10448 md_undefined_symbol (name)
10449      char *name ATTRIBUTE_UNUSED;
10450 {
10451   return 0;
10452 }
10453
10454 /* Called for any expression that can not be recognized.  When the
10455    function is called, `input_line_pointer' will point to the start of
10456    the expression.  */
10457
10458 void
10459 md_operand (e)
10460      expressionS *e;
10461 {
10462   switch (*input_line_pointer)
10463     {
10464     case '[':
10465       ++input_line_pointer;
10466       expression (e);
10467       if (*input_line_pointer != ']')
10468         {
10469           as_bad ("Closing bracket missing");
10470           goto err;
10471         }
10472       else
10473         {
10474           if (e->X_op != O_register)
10475             as_bad ("Register expected as index");
10476
10477           ++input_line_pointer;
10478           e->X_op = O_index;
10479         }
10480       break;
10481
10482     default:
10483       break;
10484     }
10485   return;
10486
10487  err:
10488   ignore_rest_of_line ();
10489 }
10490
10491 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
10492    a section symbol plus some offset.  For relocs involving @fptr(),
10493    directives we don't want such adjustments since we need to have the
10494    original symbol's name in the reloc.  */
10495 int
10496 ia64_fix_adjustable (fix)
10497      fixS *fix;
10498 {
10499   /* Prevent all adjustments to global symbols */
10500   if (S_IS_EXTERN (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
10501     return 0;
10502
10503   switch (fix->fx_r_type)
10504     {
10505     case BFD_RELOC_IA64_FPTR64I:
10506     case BFD_RELOC_IA64_FPTR32MSB:
10507     case BFD_RELOC_IA64_FPTR32LSB:
10508     case BFD_RELOC_IA64_FPTR64MSB:
10509     case BFD_RELOC_IA64_FPTR64LSB:
10510     case BFD_RELOC_IA64_LTOFF_FPTR22:
10511     case BFD_RELOC_IA64_LTOFF_FPTR64I:
10512       return 0;
10513     default:
10514       break;
10515     }
10516
10517   return 1;
10518 }
10519
10520 int
10521 ia64_force_relocation (fix)
10522      fixS *fix;
10523 {
10524   switch (fix->fx_r_type)
10525     {
10526     case BFD_RELOC_IA64_FPTR64I:
10527     case BFD_RELOC_IA64_FPTR32MSB:
10528     case BFD_RELOC_IA64_FPTR32LSB:
10529     case BFD_RELOC_IA64_FPTR64MSB:
10530     case BFD_RELOC_IA64_FPTR64LSB:
10531
10532     case BFD_RELOC_IA64_LTOFF22:
10533     case BFD_RELOC_IA64_LTOFF64I:
10534     case BFD_RELOC_IA64_LTOFF_FPTR22:
10535     case BFD_RELOC_IA64_LTOFF_FPTR64I:
10536     case BFD_RELOC_IA64_PLTOFF22:
10537     case BFD_RELOC_IA64_PLTOFF64I:
10538     case BFD_RELOC_IA64_PLTOFF64MSB:
10539     case BFD_RELOC_IA64_PLTOFF64LSB:
10540
10541     case BFD_RELOC_IA64_LTOFF22X:
10542     case BFD_RELOC_IA64_LDXMOV:
10543       return 1;
10544
10545     default:
10546       break;
10547     }
10548
10549   return generic_force_reloc (fix);
10550 }
10551
10552 /* Decide from what point a pc-relative relocation is relative to,
10553    relative to the pc-relative fixup.  Er, relatively speaking.  */
10554 long
10555 ia64_pcrel_from_section (fix, sec)
10556      fixS *fix;
10557      segT sec;
10558 {
10559   unsigned long off = fix->fx_frag->fr_address + fix->fx_where;
10560
10561   if (bfd_get_section_flags (stdoutput, sec) & SEC_CODE)
10562     off &= ~0xfUL;
10563
10564   return off;
10565 }
10566
10567
10568 /* Used to emit section-relative relocs for the dwarf2 debug data.  */
10569 void
10570 ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
10571 {
10572   expressionS expr;
10573
10574   expr.X_op = O_pseudo_fixup;
10575   expr.X_op_symbol = pseudo_func[FUNC_SEC_RELATIVE].u.sym;
10576   expr.X_add_number = 0;
10577   expr.X_add_symbol = symbol;
10578   emit_expr (&expr, size);
10579 }
10580
10581 /* This is called whenever some data item (not an instruction) needs a
10582    fixup.  We pick the right reloc code depending on the byteorder
10583    currently in effect.  */
10584 void
10585 ia64_cons_fix_new (f, where, nbytes, exp)
10586      fragS *f;
10587      int where;
10588      int nbytes;
10589      expressionS *exp;
10590 {
10591   bfd_reloc_code_real_type code;
10592   fixS *fix;
10593
10594   switch (nbytes)
10595     {
10596       /* There are no reloc for 8 and 16 bit quantities, but we allow
10597          them here since they will work fine as long as the expression
10598          is fully defined at the end of the pass over the source file.  */
10599     case 1: code = BFD_RELOC_8; break;
10600     case 2: code = BFD_RELOC_16; break;
10601     case 4:
10602       if (target_big_endian)
10603         code = BFD_RELOC_IA64_DIR32MSB;
10604       else
10605         code = BFD_RELOC_IA64_DIR32LSB;
10606       break;
10607
10608     case 8:
10609       /* In 32-bit mode, data8 could mean function descriptors too.  */
10610       if (exp->X_op == O_pseudo_fixup
10611           && exp->X_op_symbol
10612           && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC
10613           && !(md.flags & EF_IA_64_ABI64))
10614         {
10615           if (target_big_endian)
10616             code = BFD_RELOC_IA64_IPLTMSB;
10617           else
10618             code = BFD_RELOC_IA64_IPLTLSB;
10619           exp->X_op = O_symbol;
10620           break;
10621         }
10622       else
10623         {
10624           if (target_big_endian)
10625             code = BFD_RELOC_IA64_DIR64MSB;
10626           else
10627             code = BFD_RELOC_IA64_DIR64LSB;
10628           break;
10629         }
10630
10631     case 16:
10632       if (exp->X_op == O_pseudo_fixup
10633           && exp->X_op_symbol
10634           && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC)
10635         {
10636           if (target_big_endian)
10637             code = BFD_RELOC_IA64_IPLTMSB;
10638           else
10639             code = BFD_RELOC_IA64_IPLTLSB;
10640           exp->X_op = O_symbol;
10641           break;
10642         }
10643       /* FALLTHRU */
10644
10645     default:
10646       as_bad ("Unsupported fixup size %d", nbytes);
10647       ignore_rest_of_line ();
10648       return;
10649     }
10650
10651   if (exp->X_op == O_pseudo_fixup)
10652     {
10653       exp->X_op = O_symbol;
10654       code = ia64_gen_real_reloc_type (exp->X_op_symbol, code);
10655       /* ??? If code unchanged, unsupported.  */
10656     }
10657
10658   fix = fix_new_exp (f, where, nbytes, exp, 0, code);
10659   /* We need to store the byte order in effect in case we're going
10660      to fix an 8 or 16 bit relocation (for which there no real
10661      relocs available).  See md_apply_fix3().  */
10662   fix->tc_fix_data.bigendian = target_big_endian;
10663 }
10664
10665 /* Return the actual relocation we wish to associate with the pseudo
10666    reloc described by SYM and R_TYPE.  SYM should be one of the
10667    symbols in the pseudo_func array, or NULL.  */
10668
10669 static bfd_reloc_code_real_type
10670 ia64_gen_real_reloc_type (sym, r_type)
10671      struct symbol *sym;
10672      bfd_reloc_code_real_type r_type;
10673 {
10674   bfd_reloc_code_real_type new = 0;
10675
10676   if (sym == NULL)
10677     {
10678       return r_type;
10679     }
10680
10681   switch (S_GET_VALUE (sym))
10682     {
10683     case FUNC_FPTR_RELATIVE:
10684       switch (r_type)
10685         {
10686         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_FPTR64I; break;
10687         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_FPTR32MSB; break;
10688         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_FPTR32LSB; break;
10689         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_FPTR64MSB; break;
10690         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_FPTR64LSB; break;
10691         default:                        break;
10692         }
10693       break;
10694
10695     case FUNC_GP_RELATIVE:
10696       switch (r_type)
10697         {
10698         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_GPREL22; break;
10699         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_GPREL64I; break;
10700         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_GPREL32MSB; break;
10701         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_GPREL32LSB; break;
10702         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_GPREL64MSB; break;
10703         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_GPREL64LSB; break;
10704         default:                        break;
10705         }
10706       break;
10707
10708     case FUNC_LT_RELATIVE:
10709       switch (r_type)
10710         {
10711         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_LTOFF22; break;
10712         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_LTOFF64I; break;
10713         default:                        break;
10714         }
10715       break;
10716
10717     case FUNC_LT_RELATIVE_X:
10718       switch (r_type)
10719         {
10720         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_LTOFF22X; break;
10721         default:                        break;
10722         }
10723       break;
10724
10725     case FUNC_PC_RELATIVE:
10726       switch (r_type)
10727         {
10728         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_PCREL22; break;
10729         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_PCREL64I; break;
10730         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_PCREL32MSB; break;
10731         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_PCREL32LSB; break;
10732         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_PCREL64MSB; break;
10733         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_PCREL64LSB; break;
10734         default:                        break;
10735         }
10736       break;
10737
10738     case FUNC_PLT_RELATIVE:
10739       switch (r_type)
10740         {
10741         case BFD_RELOC_IA64_IMM22:      new = BFD_RELOC_IA64_PLTOFF22; break;
10742         case BFD_RELOC_IA64_IMM64:      new = BFD_RELOC_IA64_PLTOFF64I; break;
10743         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_PLTOFF64MSB;break;
10744         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_PLTOFF64LSB;break;
10745         default:                        break;
10746         }
10747       break;
10748
10749     case FUNC_SEC_RELATIVE:
10750       switch (r_type)
10751         {
10752         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_SECREL32MSB;break;
10753         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_SECREL32LSB;break;
10754         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_SECREL64MSB;break;
10755         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_SECREL64LSB;break;
10756         default:                        break;
10757         }
10758       break;
10759
10760     case FUNC_SEG_RELATIVE:
10761       switch (r_type)
10762         {
10763         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_SEGREL32MSB;break;
10764         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_SEGREL32LSB;break;
10765         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_SEGREL64MSB;break;
10766         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_SEGREL64LSB;break;
10767         default:                        break;
10768         }
10769       break;
10770
10771     case FUNC_LTV_RELATIVE:
10772       switch (r_type)
10773         {
10774         case BFD_RELOC_IA64_DIR32MSB:   new = BFD_RELOC_IA64_LTV32MSB; break;
10775         case BFD_RELOC_IA64_DIR32LSB:   new = BFD_RELOC_IA64_LTV32LSB; break;
10776         case BFD_RELOC_IA64_DIR64MSB:   new = BFD_RELOC_IA64_LTV64MSB; break;
10777         case BFD_RELOC_IA64_DIR64LSB:   new = BFD_RELOC_IA64_LTV64LSB; break;
10778         default:                        break;
10779         }
10780       break;
10781
10782     case FUNC_LT_FPTR_RELATIVE:
10783       switch (r_type)
10784         {
10785         case BFD_RELOC_IA64_IMM22:
10786           new = BFD_RELOC_IA64_LTOFF_FPTR22; break;
10787         case BFD_RELOC_IA64_IMM64:
10788           new = BFD_RELOC_IA64_LTOFF_FPTR64I; break;
10789         default:
10790           break;
10791         }
10792       break;
10793
10794     case FUNC_TP_RELATIVE:
10795       switch (r_type)
10796         {
10797         case BFD_RELOC_IA64_IMM14:
10798           new = BFD_RELOC_IA64_TPREL14; break;
10799         case BFD_RELOC_IA64_IMM22:
10800           new = BFD_RELOC_IA64_TPREL22; break;
10801         case BFD_RELOC_IA64_IMM64:
10802           new = BFD_RELOC_IA64_TPREL64I; break;
10803         default:
10804           break;
10805         }
10806       break;
10807
10808     case FUNC_LT_TP_RELATIVE:
10809       switch (r_type)
10810         {
10811         case BFD_RELOC_IA64_IMM22:
10812           new = BFD_RELOC_IA64_LTOFF_TPREL22; break;
10813         default:
10814           break;
10815         }
10816       break;
10817
10818     case FUNC_LT_DTP_MODULE:
10819       switch (r_type)
10820         {
10821         case BFD_RELOC_IA64_IMM22:
10822           new = BFD_RELOC_IA64_LTOFF_DTPMOD22; break;
10823         default:
10824           break;
10825         }
10826       break;
10827
10828     case FUNC_DTP_RELATIVE:
10829       switch (r_type)
10830         {
10831         case BFD_RELOC_IA64_DIR64MSB:
10832           new = BFD_RELOC_IA64_DTPREL64MSB; break;
10833         case BFD_RELOC_IA64_DIR64LSB:
10834           new = BFD_RELOC_IA64_DTPREL64LSB; break;
10835         case BFD_RELOC_IA64_IMM14:
10836           new = BFD_RELOC_IA64_DTPREL14; break;
10837         case BFD_RELOC_IA64_IMM22:
10838           new = BFD_RELOC_IA64_DTPREL22; break;
10839         case BFD_RELOC_IA64_IMM64:
10840           new = BFD_RELOC_IA64_DTPREL64I; break;
10841         default:
10842           break;
10843         }
10844       break;
10845
10846     case FUNC_LT_DTP_RELATIVE:
10847       switch (r_type)
10848         {
10849         case BFD_RELOC_IA64_IMM22:
10850           new = BFD_RELOC_IA64_LTOFF_DTPREL22; break;
10851         default:
10852           break;
10853         }
10854       break;
10855
10856     case FUNC_IPLT_RELOC:
10857       break;
10858
10859     default:
10860       abort ();
10861     }
10862
10863   /* Hmmmm.  Should this ever occur?  */
10864   if (new)
10865     return new;
10866   else
10867     return r_type;
10868 }
10869
10870 /* Here is where generate the appropriate reloc for pseudo relocation
10871    functions.  */
10872 void
10873 ia64_validate_fix (fix)
10874      fixS *fix;
10875 {
10876   switch (fix->fx_r_type)
10877     {
10878     case BFD_RELOC_IA64_FPTR64I:
10879     case BFD_RELOC_IA64_FPTR32MSB:
10880     case BFD_RELOC_IA64_FPTR64LSB:
10881     case BFD_RELOC_IA64_LTOFF_FPTR22:
10882     case BFD_RELOC_IA64_LTOFF_FPTR64I:
10883       if (fix->fx_offset != 0)
10884         as_bad_where (fix->fx_file, fix->fx_line,
10885                       "No addend allowed in @fptr() relocation");
10886       break;
10887     default:
10888       break;
10889     }
10890 }
10891
10892 static void
10893 fix_insn (fix, odesc, value)
10894      fixS *fix;
10895      const struct ia64_operand *odesc;
10896      valueT value;
10897 {
10898   bfd_vma insn[3], t0, t1, control_bits;
10899   const char *err;
10900   char *fixpos;
10901   long slot;
10902
10903   slot = fix->fx_where & 0x3;
10904   fixpos = fix->fx_frag->fr_literal + (fix->fx_where - slot);
10905
10906   /* Bundles are always in little-endian byte order */
10907   t0 = bfd_getl64 (fixpos);
10908   t1 = bfd_getl64 (fixpos + 8);
10909   control_bits = t0 & 0x1f;
10910   insn[0] = (t0 >>  5) & 0x1ffffffffffLL;
10911   insn[1] = ((t0 >> 46) & 0x3ffff) | ((t1 & 0x7fffff) << 18);
10912   insn[2] = (t1 >> 23) & 0x1ffffffffffLL;
10913
10914   err = NULL;
10915   if (odesc - elf64_ia64_operands == IA64_OPND_IMMU64)
10916     {
10917       insn[1] = (value >> 22) & 0x1ffffffffffLL;
10918       insn[2] |= (((value & 0x7f) << 13)
10919                   | (((value >> 7) & 0x1ff) << 27)
10920                   | (((value >> 16) & 0x1f) << 22)
10921                   | (((value >> 21) & 0x1) << 21)
10922                   | (((value >> 63) & 0x1) << 36));
10923     }
10924   else if (odesc - elf64_ia64_operands == IA64_OPND_IMMU62)
10925     {
10926       if (value & ~0x3fffffffffffffffULL)
10927         err = "integer operand out of range";
10928       insn[1] = (value >> 21) & 0x1ffffffffffLL;
10929       insn[2] |= (((value & 0xfffff) << 6) | (((value >> 20) & 0x1) << 36));
10930     }
10931   else if (odesc - elf64_ia64_operands == IA64_OPND_TGT64)
10932     {
10933       value >>= 4;
10934       insn[1] = ((value >> 20) & 0x7fffffffffLL) << 2;
10935       insn[2] |= ((((value >> 59) & 0x1) << 36)
10936                   | (((value >> 0) & 0xfffff) << 13));
10937     }
10938   else
10939     err = (*odesc->insert) (odesc, value, insn + slot);
10940
10941   if (err)
10942     as_bad_where (fix->fx_file, fix->fx_line, err);
10943
10944   t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
10945   t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
10946   number_to_chars_littleendian (fixpos + 0, t0, 8);
10947   number_to_chars_littleendian (fixpos + 8, t1, 8);
10948 }
10949
10950 /* Attempt to simplify or even eliminate a fixup.  The return value is
10951    ignored; perhaps it was once meaningful, but now it is historical.
10952    To indicate that a fixup has been eliminated, set FIXP->FX_DONE.
10953
10954    If fixp->fx_addsy is non-NULL, we'll have to generate a reloc entry
10955    (if possible).  */
10956
10957 void
10958 md_apply_fix3 (fix, valP, seg)
10959      fixS *fix;
10960      valueT *valP;
10961      segT seg ATTRIBUTE_UNUSED;
10962 {
10963   char *fixpos;
10964   valueT value = *valP;
10965
10966   fixpos = fix->fx_frag->fr_literal + fix->fx_where;
10967
10968   if (fix->fx_pcrel)
10969     {
10970       switch (fix->fx_r_type)
10971         {
10972         case BFD_RELOC_IA64_DIR32MSB:
10973           fix->fx_r_type = BFD_RELOC_IA64_PCREL32MSB;
10974           break;
10975
10976         case BFD_RELOC_IA64_DIR32LSB:
10977           fix->fx_r_type = BFD_RELOC_IA64_PCREL32LSB;
10978           break;
10979
10980         case BFD_RELOC_IA64_DIR64MSB:
10981           fix->fx_r_type = BFD_RELOC_IA64_PCREL64MSB;
10982           break;
10983
10984         case BFD_RELOC_IA64_DIR64LSB:
10985           fix->fx_r_type = BFD_RELOC_IA64_PCREL64LSB;
10986           break;
10987
10988         default:
10989           break;
10990         }
10991     }
10992   if (fix->fx_addsy)
10993     {
10994       switch (fix->fx_r_type)
10995         {
10996         case BFD_RELOC_UNUSED:
10997           /* This must be a TAG13 or TAG13b operand.  There are no external
10998              relocs defined for them, so we must give an error.  */
10999           as_bad_where (fix->fx_file, fix->fx_line,
11000                         "%s must have a constant value",
11001                         elf64_ia64_operands[fix->tc_fix_data.opnd].desc);
11002           fix->fx_done = 1;
11003           return;
11004
11005         case BFD_RELOC_IA64_TPREL14:
11006         case BFD_RELOC_IA64_TPREL22:
11007         case BFD_RELOC_IA64_TPREL64I:
11008         case BFD_RELOC_IA64_LTOFF_TPREL22:
11009         case BFD_RELOC_IA64_LTOFF_DTPMOD22:
11010         case BFD_RELOC_IA64_DTPREL14:
11011         case BFD_RELOC_IA64_DTPREL22:
11012         case BFD_RELOC_IA64_DTPREL64I:
11013         case BFD_RELOC_IA64_LTOFF_DTPREL22:
11014           S_SET_THREAD_LOCAL (fix->fx_addsy);
11015           break;
11016
11017         default:
11018           break;
11019         }
11020     }
11021   else if (fix->tc_fix_data.opnd == IA64_OPND_NIL)
11022     {
11023       if (fix->tc_fix_data.bigendian)
11024         number_to_chars_bigendian (fixpos, value, fix->fx_size);
11025       else
11026         number_to_chars_littleendian (fixpos, value, fix->fx_size);
11027       fix->fx_done = 1;
11028     }
11029   else
11030     {
11031       fix_insn (fix, elf64_ia64_operands + fix->tc_fix_data.opnd, value);
11032       fix->fx_done = 1;
11033     }
11034 }
11035
11036 /* Generate the BFD reloc to be stuck in the object file from the
11037    fixup used internally in the assembler.  */
11038
11039 arelent *
11040 tc_gen_reloc (sec, fixp)
11041      asection *sec ATTRIBUTE_UNUSED;
11042      fixS *fixp;
11043 {
11044   arelent *reloc;
11045
11046   reloc = xmalloc (sizeof (*reloc));
11047   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
11048   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
11049   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
11050   reloc->addend = fixp->fx_offset;
11051   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
11052
11053   if (!reloc->howto)
11054     {
11055       as_bad_where (fixp->fx_file, fixp->fx_line,
11056                     "Cannot represent %s relocation in object file",
11057                     bfd_get_reloc_code_name (fixp->fx_r_type));
11058     }
11059   return reloc;
11060 }
11061
11062 /* Turn a string in input_line_pointer into a floating point constant
11063    of type TYPE, and store the appropriate bytes in *LIT.  The number
11064    of LITTLENUMS emitted is stored in *SIZE.  An error message is
11065    returned, or NULL on OK.  */
11066
11067 #define MAX_LITTLENUMS 5
11068
11069 char *
11070 md_atof (type, lit, size)
11071      int type;
11072      char *lit;
11073      int *size;
11074 {
11075   LITTLENUM_TYPE words[MAX_LITTLENUMS];
11076   char *t;
11077   int prec;
11078
11079   switch (type)
11080     {
11081       /* IEEE floats */
11082     case 'f':
11083     case 'F':
11084     case 's':
11085     case 'S':
11086       prec = 2;
11087       break;
11088
11089     case 'd':
11090     case 'D':
11091     case 'r':
11092     case 'R':
11093       prec = 4;
11094       break;
11095
11096     case 'x':
11097     case 'X':
11098     case 'p':
11099     case 'P':
11100       prec = 5;
11101       break;
11102
11103     default:
11104       *size = 0;
11105       return "Bad call to MD_ATOF()";
11106     }
11107   t = atof_ieee (input_line_pointer, type, words);
11108   if (t)
11109     input_line_pointer = t;
11110
11111   (*ia64_float_to_chars) (lit, words, prec);
11112
11113   if (type == 'X')
11114     {
11115       /* It is 10 byte floating point with 6 byte padding.  */
11116       memset (&lit [10], 0, 6);
11117       *size = 8 * sizeof (LITTLENUM_TYPE);
11118     }
11119   else
11120     *size = prec * sizeof (LITTLENUM_TYPE);
11121
11122   return 0;
11123 }
11124
11125 /* Handle ia64 specific semantics of the align directive.  */
11126
11127 void
11128 ia64_md_do_align (n, fill, len, max)
11129      int n ATTRIBUTE_UNUSED;
11130      const char *fill ATTRIBUTE_UNUSED;
11131      int len ATTRIBUTE_UNUSED;
11132      int max ATTRIBUTE_UNUSED;
11133 {
11134   if (subseg_text_p (now_seg))
11135     ia64_flush_insns ();
11136 }
11137
11138 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
11139    of an rs_align_code fragment.  */
11140
11141 void
11142 ia64_handle_align (fragp)
11143      fragS *fragp;
11144 {
11145   /* Use mfi bundle of nops with no stop bits.  */
11146   static const unsigned char le_nop[]
11147     = { 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
11148         0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
11149   static const unsigned char le_nop_stop[]
11150     = { 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
11151         0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
11152
11153   int bytes;
11154   char *p;
11155   const unsigned char *nop;
11156
11157   if (fragp->fr_type != rs_align_code)
11158     return;
11159
11160   /* Check if this frag has to end with a stop bit.  */
11161   nop = fragp->tc_frag_data ? le_nop_stop : le_nop;
11162
11163   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
11164   p = fragp->fr_literal + fragp->fr_fix;
11165
11166   /* If no paddings are needed, we check if we need a stop bit.  */ 
11167   if (!bytes && fragp->tc_frag_data)
11168     {
11169       if (fragp->fr_fix < 16)
11170 #if 1
11171         /* FIXME: It won't work with
11172            .align 16
11173            alloc r32=ar.pfs,1,2,4,0
11174          */
11175         ;
11176 #else
11177         as_bad_where (fragp->fr_file, fragp->fr_line,
11178                       _("Can't add stop bit to mark end of instruction group"));
11179 #endif
11180       else
11181         /* Bundles are always in little-endian byte order. Make sure
11182            the previous bundle has the stop bit.  */
11183         *(p - 16) |= 1;
11184     }
11185
11186   /* Make sure we are on a 16-byte boundary, in case someone has been
11187      putting data into a text section.  */
11188   if (bytes & 15)
11189     {
11190       int fix = bytes & 15;
11191       memset (p, 0, fix);
11192       p += fix;
11193       bytes -= fix;
11194       fragp->fr_fix += fix;
11195     }
11196
11197   /* Instruction bundles are always little-endian.  */
11198   memcpy (p, nop, 16);
11199   fragp->fr_var = 16;
11200 }
11201
11202 static void
11203 ia64_float_to_chars_bigendian (char *lit, LITTLENUM_TYPE *words,
11204                                int prec)
11205 {
11206   while (prec--)
11207     {
11208       number_to_chars_bigendian (lit, (long) (*words++),
11209                                  sizeof (LITTLENUM_TYPE));
11210       lit += sizeof (LITTLENUM_TYPE);
11211     }
11212 }
11213
11214 static void
11215 ia64_float_to_chars_littleendian (char *lit, LITTLENUM_TYPE *words,
11216                                   int prec)
11217 {
11218   while (prec--)
11219     {
11220       number_to_chars_littleendian (lit, (long) (words[prec]),
11221                                     sizeof (LITTLENUM_TYPE));
11222       lit += sizeof (LITTLENUM_TYPE);
11223     }
11224 }
11225
11226 void
11227 ia64_elf_section_change_hook  (void)
11228 {
11229   if (elf_section_type (now_seg) == SHT_IA_64_UNWIND
11230       && elf_linked_to_section (now_seg) == NULL)
11231     elf_linked_to_section (now_seg) = text_section;
11232   dot_byteorder (-1);
11233 }
11234
11235 /* Check if a label should be made global.  */
11236 void
11237 ia64_check_label (symbolS *label)
11238 {
11239   if (*input_line_pointer == ':')
11240     {
11241       S_SET_EXTERNAL (label);
11242       input_line_pointer++;
11243     }
11244 }
11245
11246 /* Used to remember where .alias and .secalias directives are seen. We
11247    will rename symbol and section names when we are about to output
11248    the relocatable file.  */
11249 struct alias
11250 {
11251   char *file;           /* The file where the directive is seen.  */
11252   unsigned int line;    /* The line number the directive is at.  */
11253   const char *name;     /* The orignale name of the symbol.  */
11254 };
11255
11256 /* Called for .alias and .secalias directives. If SECTION is 1, it is
11257    .secalias. Otherwise, it is .alias.  */
11258 static void
11259 dot_alias (int section)
11260 {
11261   char *name, *alias;
11262   char delim;
11263   char *end_name;
11264   int len;
11265   const char *error_string;
11266   struct alias *h;
11267   const char *a;
11268   struct hash_control *ahash, *nhash;
11269   const char *kind;
11270
11271   name = input_line_pointer;
11272   delim = get_symbol_end ();
11273   end_name = input_line_pointer;
11274   *end_name = delim;
11275
11276   if (name == end_name)
11277     {
11278       as_bad (_("expected symbol name"));
11279       discard_rest_of_line ();
11280       return;
11281     }
11282
11283   SKIP_WHITESPACE ();
11284
11285   if (*input_line_pointer != ',')
11286     {
11287       *end_name = 0;
11288       as_bad (_("expected comma after \"%s\""), name);
11289       *end_name = delim;
11290       ignore_rest_of_line ();
11291       return;
11292     }
11293
11294   input_line_pointer++;
11295   *end_name = 0;
11296
11297   /* We call demand_copy_C_string to check if alias string is valid.
11298      There should be a closing `"' and no `\0' in the string.  */
11299   alias = demand_copy_C_string (&len);
11300   if (alias == NULL)
11301     {
11302       ignore_rest_of_line ();
11303       return;
11304     }
11305
11306   /* Make a copy of name string.  */
11307   len = strlen (name) + 1;
11308   obstack_grow (&notes, name, len);
11309   name = obstack_finish (&notes);
11310
11311   if (section)
11312     {
11313       kind = "section";
11314       ahash = secalias_hash;
11315       nhash = secalias_name_hash;
11316     }
11317   else
11318     {
11319       kind = "symbol";
11320       ahash = alias_hash;
11321       nhash = alias_name_hash;
11322     }
11323
11324   /* Check if alias has been used before.  */
11325   h = (struct alias *) hash_find (ahash, alias);
11326   if (h)
11327     {
11328       if (strcmp (h->name, name))
11329         as_bad (_("`%s' is already the alias of %s `%s'"),
11330                 alias, kind, h->name);
11331       goto out;
11332     }
11333
11334   /* Check if name already has an alias.  */
11335   a = (const char *) hash_find (nhash, name);
11336   if (a)
11337     {
11338       if (strcmp (a, alias))
11339         as_bad (_("%s `%s' already has an alias `%s'"), kind, name, a);
11340       goto out;
11341     }
11342
11343   h = (struct alias *) xmalloc (sizeof (struct alias));
11344   as_where (&h->file, &h->line);
11345   h->name = name;
11346   
11347   error_string = hash_jam (ahash, alias, (PTR) h);
11348   if (error_string)
11349     {
11350       as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
11351                 alias, kind, error_string);
11352       goto out;
11353     }
11354
11355   error_string = hash_jam (nhash, name, (PTR) alias);
11356   if (error_string)
11357     {
11358       as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
11359                 alias, kind, error_string);
11360 out:
11361       obstack_free (&notes, name);
11362       obstack_free (&notes, alias);
11363     }
11364
11365   demand_empty_rest_of_line ();
11366 }
11367
11368 /* It renames the original symbol name to its alias.  */
11369 static void
11370 do_alias (const char *alias, PTR value)
11371 {
11372   struct alias *h = (struct alias *) value;
11373   symbolS *sym = symbol_find (h->name);
11374
11375   if (sym == NULL)
11376     as_warn_where (h->file, h->line,
11377                    _("symbol `%s' aliased to `%s' is not used"),
11378                    h->name, alias);
11379     else
11380       S_SET_NAME (sym, (char *) alias);
11381 }
11382
11383 /* Called from write_object_file.  */
11384 void
11385 ia64_adjust_symtab (void)
11386 {
11387   hash_traverse (alias_hash, do_alias);
11388 }
11389
11390 /* It renames the original section name to its alias.  */
11391 static void
11392 do_secalias (const char *alias, PTR value)
11393 {
11394   struct alias *h = (struct alias *) value;
11395   segT sec = bfd_get_section_by_name (stdoutput, h->name);
11396
11397   if (sec == NULL)
11398     as_warn_where (h->file, h->line,
11399                    _("section `%s' aliased to `%s' is not used"),
11400                    h->name, alias);
11401   else
11402     sec->name = alias;
11403 }
11404
11405 /* Called from write_object_file.  */
11406 void
11407 ia64_frob_file (void)
11408 {
11409   hash_traverse (secalias_hash, do_secalias);
11410 }