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