2009-07-02 Tristan Gingold <gingold@adacore.com>
[binutils.git] / gas / config / tc-ia64.c
blob84434a5b96bab5626a52cabb57d85362482d0a6d
1 /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009 Free Software Foundation, Inc.
4 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
6 This file is part of GAS, the GNU Assembler.
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 3, or (at your option)
11 any later version.
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.
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, 51 Franklin Street - Fifth Floor,
21 Boston, MA 02110-1301, USA. */
24 TODO:
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)
45 #include "as.h"
46 #include "safe-ctype.h"
47 #include "dwarf2dbg.h"
48 #include "subsegs.h"
50 #include "opcode/ia64.h"
52 #include "elf/ia64.h"
53 #include "bfdver.h"
54 #include <time.h>
56 #ifdef HAVE_LIMITS_H
57 #include <limits.h>
58 #endif
60 #define NELEMS(a) ((int) (sizeof (a)/sizeof ((a)[0])))
62 /* Some systems define MIN in, e.g., param.h. */
63 #undef MIN
64 #define MIN(a,b) ((a) < (b) ? (a) : (b))
66 #define NUM_SLOTS 4
67 #define PREV_SLOT md.slot[(md.curr_slot + NUM_SLOTS - 1) % NUM_SLOTS]
68 #define CURR_SLOT md.slot[md.curr_slot]
70 #define O_pseudo_fixup (O_max + 1)
72 enum special_section
74 /* IA-64 ABI section pseudo-ops. */
75 SPECIAL_SECTION_BSS = 0,
76 SPECIAL_SECTION_SBSS,
77 SPECIAL_SECTION_SDATA,
78 SPECIAL_SECTION_RODATA,
79 SPECIAL_SECTION_COMMENT,
80 SPECIAL_SECTION_UNWIND,
81 SPECIAL_SECTION_UNWIND_INFO,
82 /* HPUX specific section pseudo-ops. */
83 SPECIAL_SECTION_INIT_ARRAY,
84 SPECIAL_SECTION_FINI_ARRAY,
87 enum reloc_func
89 FUNC_DTP_MODULE,
90 FUNC_DTP_RELATIVE,
91 FUNC_FPTR_RELATIVE,
92 FUNC_GP_RELATIVE,
93 FUNC_LT_RELATIVE,
94 FUNC_LT_RELATIVE_X,
95 FUNC_PC_RELATIVE,
96 FUNC_PLT_RELATIVE,
97 FUNC_SEC_RELATIVE,
98 FUNC_SEG_RELATIVE,
99 FUNC_TP_RELATIVE,
100 FUNC_LTV_RELATIVE,
101 FUNC_LT_FPTR_RELATIVE,
102 FUNC_LT_DTP_MODULE,
103 FUNC_LT_DTP_RELATIVE,
104 FUNC_LT_TP_RELATIVE,
105 FUNC_IPLT_RELOC,
108 enum reg_symbol
110 REG_GR = 0,
111 REG_FR = (REG_GR + 128),
112 REG_AR = (REG_FR + 128),
113 REG_CR = (REG_AR + 128),
114 REG_P = (REG_CR + 128),
115 REG_BR = (REG_P + 64),
116 REG_IP = (REG_BR + 8),
117 REG_CFM,
118 REG_PR,
119 REG_PR_ROT,
120 REG_PSR,
121 REG_PSR_L,
122 REG_PSR_UM,
123 /* The following are pseudo-registers for use by gas only. */
124 IND_CPUID,
125 IND_DBR,
126 IND_DTR,
127 IND_ITR,
128 IND_IBR,
129 IND_MSR,
130 IND_PKR,
131 IND_PMC,
132 IND_PMD,
133 IND_RR,
134 /* The following pseudo-registers are used for unwind directives only: */
135 REG_PSP,
136 REG_PRIUNAT,
137 REG_NUM
140 enum dynreg_type
142 DYNREG_GR = 0, /* dynamic general purpose register */
143 DYNREG_FR, /* dynamic floating point register */
144 DYNREG_PR, /* dynamic predicate register */
145 DYNREG_NUM_TYPES
148 enum operand_match_result
150 OPERAND_MATCH,
151 OPERAND_OUT_OF_RANGE,
152 OPERAND_MISMATCH
155 /* On the ia64, we can't know the address of a text label until the
156 instructions are packed into a bundle. To handle this, we keep
157 track of the list of labels that appear in front of each
158 instruction. */
159 struct label_fix
161 struct label_fix *next;
162 struct symbol *sym;
163 bfd_boolean dw2_mark_labels;
166 /* This is the endianness of the current section. */
167 extern int target_big_endian;
169 /* This is the default endianness. */
170 static int default_big_endian = TARGET_BYTES_BIG_ENDIAN;
172 void (*ia64_number_to_chars) (char *, valueT, int);
174 static void ia64_float_to_chars_bigendian (char *, LITTLENUM_TYPE *, int);
175 static void ia64_float_to_chars_littleendian (char *, LITTLENUM_TYPE *, int);
177 static void (*ia64_float_to_chars) (char *, LITTLENUM_TYPE *, int);
179 static struct hash_control *alias_hash;
180 static struct hash_control *alias_name_hash;
181 static struct hash_control *secalias_hash;
182 static struct hash_control *secalias_name_hash;
184 /* List of chars besides those in app.c:symbol_chars that can start an
185 operand. Used to prevent the scrubber eating vital white-space. */
186 const char ia64_symbol_chars[] = "@?";
188 /* Characters which always start a comment. */
189 const char comment_chars[] = "";
191 /* Characters which start a comment at the beginning of a line. */
192 const char line_comment_chars[] = "#";
194 /* Characters which may be used to separate multiple commands on a
195 single line. */
196 const char line_separator_chars[] = ";{}";
198 /* Characters which are used to indicate an exponent in a floating
199 point number. */
200 const char EXP_CHARS[] = "eE";
202 /* Characters which mean that a number is a floating point constant,
203 as in 0d1.0. */
204 const char FLT_CHARS[] = "rRsSfFdDxXpP";
206 /* ia64-specific option processing: */
208 const char *md_shortopts = "m:N:x::";
210 struct option md_longopts[] =
212 #define OPTION_MCONSTANT_GP (OPTION_MD_BASE + 1)
213 {"mconstant-gp", no_argument, NULL, OPTION_MCONSTANT_GP},
214 #define OPTION_MAUTO_PIC (OPTION_MD_BASE + 2)
215 {"mauto-pic", no_argument, NULL, OPTION_MAUTO_PIC}
218 size_t md_longopts_size = sizeof (md_longopts);
220 static struct
222 struct hash_control *pseudo_hash; /* pseudo opcode hash table */
223 struct hash_control *reg_hash; /* register name hash table */
224 struct hash_control *dynreg_hash; /* dynamic register hash table */
225 struct hash_control *const_hash; /* constant hash table */
226 struct hash_control *entry_hash; /* code entry hint hash table */
228 /* If X_op is != O_absent, the registername for the instruction's
229 qualifying predicate. If NULL, p0 is assumed for instructions
230 that are predictable. */
231 expressionS qp;
233 /* Optimize for which CPU. */
234 enum
236 itanium1,
237 itanium2
238 } tune;
240 /* What to do when hint.b is used. */
241 enum
243 hint_b_error,
244 hint_b_warning,
245 hint_b_ok
246 } hint_b;
248 unsigned int
249 manual_bundling : 1,
250 debug_dv: 1,
251 detect_dv: 1,
252 explicit_mode : 1, /* which mode we're in */
253 default_explicit_mode : 1, /* which mode is the default */
254 mode_explicitly_set : 1, /* was the current mode explicitly set? */
255 auto_align : 1,
256 keep_pending_output : 1;
258 /* What to do when something is wrong with unwind directives. */
259 enum
261 unwind_check_warning,
262 unwind_check_error
263 } unwind_check;
265 /* Each bundle consists of up to three instructions. We keep
266 track of four most recent instructions so we can correctly set
267 the end_of_insn_group for the last instruction in a bundle. */
268 int curr_slot;
269 int num_slots_in_use;
270 struct slot
272 unsigned int
273 end_of_insn_group : 1,
274 manual_bundling_on : 1,
275 manual_bundling_off : 1,
276 loc_directive_seen : 1;
277 signed char user_template; /* user-selected template, if any */
278 unsigned char qp_regno; /* qualifying predicate */
279 /* This duplicates a good fraction of "struct fix" but we
280 can't use a "struct fix" instead since we can't call
281 fix_new_exp() until we know the address of the instruction. */
282 int num_fixups;
283 struct insn_fix
285 bfd_reloc_code_real_type code;
286 enum ia64_opnd opnd; /* type of operand in need of fix */
287 unsigned int is_pcrel : 1; /* is operand pc-relative? */
288 expressionS expr; /* the value to be inserted */
290 fixup[2]; /* at most two fixups per insn */
291 struct ia64_opcode *idesc;
292 struct label_fix *label_fixups;
293 struct label_fix *tag_fixups;
294 struct unw_rec_list *unwind_record; /* Unwind directive. */
295 expressionS opnd[6];
296 char *src_file;
297 unsigned int src_line;
298 struct dwarf2_line_info debug_line;
300 slot[NUM_SLOTS];
302 segT last_text_seg;
304 struct dynreg
306 struct dynreg *next; /* next dynamic register */
307 const char *name;
308 unsigned short base; /* the base register number */
309 unsigned short num_regs; /* # of registers in this set */
311 *dynreg[DYNREG_NUM_TYPES], in, loc, out, rot;
313 flagword flags; /* ELF-header flags */
315 struct mem_offset {
316 unsigned hint:1; /* is this hint currently valid? */
317 bfd_vma offset; /* mem.offset offset */
318 bfd_vma base; /* mem.offset base */
319 } mem_offset;
321 int path; /* number of alt. entry points seen */
322 const char **entry_labels; /* labels of all alternate paths in
323 the current DV-checking block. */
324 int maxpaths; /* size currently allocated for
325 entry_labels */
327 int pointer_size; /* size in bytes of a pointer */
328 int pointer_size_shift; /* shift size of a pointer for alignment */
330 symbolS *indregsym[IND_RR - IND_CPUID + 1];
334 /* These are not const, because they are modified to MMI for non-itanium1
335 targets below. */
336 /* MFI bundle of nops. */
337 static unsigned char le_nop[16] =
339 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
340 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
342 /* MFI bundle of nops with stop-bit. */
343 static unsigned char le_nop_stop[16] =
345 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
346 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
349 /* application registers: */
351 #define AR_K0 0
352 #define AR_K7 7
353 #define AR_RSC 16
354 #define AR_BSP 17
355 #define AR_BSPSTORE 18
356 #define AR_RNAT 19
357 #define AR_FCR 21
358 #define AR_EFLAG 24
359 #define AR_CSD 25
360 #define AR_SSD 26
361 #define AR_CFLG 27
362 #define AR_FSR 28
363 #define AR_FIR 29
364 #define AR_FDR 30
365 #define AR_CCV 32
366 #define AR_UNAT 36
367 #define AR_FPSR 40
368 #define AR_ITC 44
369 #define AR_RUC 45
370 #define AR_PFS 64
371 #define AR_LC 65
372 #define AR_EC 66
374 static const struct
376 const char *name;
377 unsigned int regnum;
379 ar[] =
381 {"ar.k0", AR_K0}, {"ar.k1", AR_K0 + 1},
382 {"ar.k2", AR_K0 + 2}, {"ar.k3", AR_K0 + 3},
383 {"ar.k4", AR_K0 + 4}, {"ar.k5", AR_K0 + 5},
384 {"ar.k6", AR_K0 + 6}, {"ar.k7", AR_K7},
385 {"ar.rsc", AR_RSC}, {"ar.bsp", AR_BSP},
386 {"ar.bspstore", AR_BSPSTORE}, {"ar.rnat", AR_RNAT},
387 {"ar.fcr", AR_FCR}, {"ar.eflag", AR_EFLAG},
388 {"ar.csd", AR_CSD}, {"ar.ssd", AR_SSD},
389 {"ar.cflg", AR_CFLG}, {"ar.fsr", AR_FSR},
390 {"ar.fir", AR_FIR}, {"ar.fdr", AR_FDR},
391 {"ar.ccv", AR_CCV}, {"ar.unat", AR_UNAT},
392 {"ar.fpsr", AR_FPSR}, {"ar.itc", AR_ITC},
393 {"ar.ruc", AR_RUC}, {"ar.pfs", AR_PFS},
394 {"ar.lc", AR_LC}, {"ar.ec", AR_EC},
397 /* control registers: */
399 #define CR_DCR 0
400 #define CR_ITM 1
401 #define CR_IVA 2
402 #define CR_PTA 8
403 #define CR_GPTA 9
404 #define CR_IPSR 16
405 #define CR_ISR 17
406 #define CR_IIP 19
407 #define CR_IFA 20
408 #define CR_ITIR 21
409 #define CR_IIPA 22
410 #define CR_IFS 23
411 #define CR_IIM 24
412 #define CR_IHA 25
413 #define CR_IIB0 26
414 #define CR_IIB1 27
415 #define CR_LID 64
416 #define CR_IVR 65
417 #define CR_TPR 66
418 #define CR_EOI 67
419 #define CR_IRR0 68
420 #define CR_IRR3 71
421 #define CR_ITV 72
422 #define CR_PMV 73
423 #define CR_CMCV 74
424 #define CR_LRR0 80
425 #define CR_LRR1 81
427 static const struct
429 const char *name;
430 unsigned int regnum;
432 cr[] =
434 {"cr.dcr", CR_DCR},
435 {"cr.itm", CR_ITM},
436 {"cr.iva", CR_IVA},
437 {"cr.pta", CR_PTA},
438 {"cr.gpta", CR_GPTA},
439 {"cr.ipsr", CR_IPSR},
440 {"cr.isr", CR_ISR},
441 {"cr.iip", CR_IIP},
442 {"cr.ifa", CR_IFA},
443 {"cr.itir", CR_ITIR},
444 {"cr.iipa", CR_IIPA},
445 {"cr.ifs", CR_IFS},
446 {"cr.iim", CR_IIM},
447 {"cr.iha", CR_IHA},
448 {"cr.iib0", CR_IIB0},
449 {"cr.iib1", CR_IIB1},
450 {"cr.lid", CR_LID},
451 {"cr.ivr", CR_IVR},
452 {"cr.tpr", CR_TPR},
453 {"cr.eoi", CR_EOI},
454 {"cr.irr0", CR_IRR0},
455 {"cr.irr1", CR_IRR0 + 1},
456 {"cr.irr2", CR_IRR0 + 2},
457 {"cr.irr3", CR_IRR3},
458 {"cr.itv", CR_ITV},
459 {"cr.pmv", CR_PMV},
460 {"cr.cmcv", CR_CMCV},
461 {"cr.lrr0", CR_LRR0},
462 {"cr.lrr1", CR_LRR1}
465 #define PSR_MFL 4
466 #define PSR_IC 13
467 #define PSR_DFL 18
468 #define PSR_CPL 32
470 static const struct const_desc
472 const char *name;
473 valueT value;
475 const_bits[] =
477 /* PSR constant masks: */
479 /* 0: reserved */
480 {"psr.be", ((valueT) 1) << 1},
481 {"psr.up", ((valueT) 1) << 2},
482 {"psr.ac", ((valueT) 1) << 3},
483 {"psr.mfl", ((valueT) 1) << 4},
484 {"psr.mfh", ((valueT) 1) << 5},
485 /* 6-12: reserved */
486 {"psr.ic", ((valueT) 1) << 13},
487 {"psr.i", ((valueT) 1) << 14},
488 {"psr.pk", ((valueT) 1) << 15},
489 /* 16: reserved */
490 {"psr.dt", ((valueT) 1) << 17},
491 {"psr.dfl", ((valueT) 1) << 18},
492 {"psr.dfh", ((valueT) 1) << 19},
493 {"psr.sp", ((valueT) 1) << 20},
494 {"psr.pp", ((valueT) 1) << 21},
495 {"psr.di", ((valueT) 1) << 22},
496 {"psr.si", ((valueT) 1) << 23},
497 {"psr.db", ((valueT) 1) << 24},
498 {"psr.lp", ((valueT) 1) << 25},
499 {"psr.tb", ((valueT) 1) << 26},
500 {"psr.rt", ((valueT) 1) << 27},
501 /* 28-31: reserved */
502 /* 32-33: cpl (current privilege level) */
503 {"psr.is", ((valueT) 1) << 34},
504 {"psr.mc", ((valueT) 1) << 35},
505 {"psr.it", ((valueT) 1) << 36},
506 {"psr.id", ((valueT) 1) << 37},
507 {"psr.da", ((valueT) 1) << 38},
508 {"psr.dd", ((valueT) 1) << 39},
509 {"psr.ss", ((valueT) 1) << 40},
510 /* 41-42: ri (restart instruction) */
511 {"psr.ed", ((valueT) 1) << 43},
512 {"psr.bn", ((valueT) 1) << 44},
515 /* indirect register-sets/memory: */
517 static const struct
519 const char *name;
520 unsigned int regnum;
522 indirect_reg[] =
524 { "CPUID", IND_CPUID },
525 { "cpuid", IND_CPUID },
526 { "dbr", IND_DBR },
527 { "dtr", IND_DTR },
528 { "itr", IND_ITR },
529 { "ibr", IND_IBR },
530 { "msr", IND_MSR },
531 { "pkr", IND_PKR },
532 { "pmc", IND_PMC },
533 { "pmd", IND_PMD },
534 { "rr", IND_RR },
537 /* Pseudo functions used to indicate relocation types (these functions
538 start with an at sign (@). */
539 static struct
541 const char *name;
542 enum pseudo_type
544 PSEUDO_FUNC_NONE,
545 PSEUDO_FUNC_RELOC,
546 PSEUDO_FUNC_CONST,
547 PSEUDO_FUNC_REG,
548 PSEUDO_FUNC_FLOAT
550 type;
551 union
553 unsigned long ival;
554 symbolS *sym;
558 pseudo_func[] =
560 /* reloc pseudo functions (these must come first!): */
561 { "dtpmod", PSEUDO_FUNC_RELOC, { 0 } },
562 { "dtprel", PSEUDO_FUNC_RELOC, { 0 } },
563 { "fptr", PSEUDO_FUNC_RELOC, { 0 } },
564 { "gprel", PSEUDO_FUNC_RELOC, { 0 } },
565 { "ltoff", PSEUDO_FUNC_RELOC, { 0 } },
566 { "ltoffx", PSEUDO_FUNC_RELOC, { 0 } },
567 { "pcrel", PSEUDO_FUNC_RELOC, { 0 } },
568 { "pltoff", PSEUDO_FUNC_RELOC, { 0 } },
569 { "secrel", PSEUDO_FUNC_RELOC, { 0 } },
570 { "segrel", PSEUDO_FUNC_RELOC, { 0 } },
571 { "tprel", PSEUDO_FUNC_RELOC, { 0 } },
572 { "ltv", PSEUDO_FUNC_RELOC, { 0 } },
573 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_FPTR_RELATIVE */
574 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_MODULE */
575 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_RELATIVE */
576 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_TP_RELATIVE */
577 { "iplt", PSEUDO_FUNC_RELOC, { 0 } },
579 /* mbtype4 constants: */
580 { "alt", PSEUDO_FUNC_CONST, { 0xa } },
581 { "brcst", PSEUDO_FUNC_CONST, { 0x0 } },
582 { "mix", PSEUDO_FUNC_CONST, { 0x8 } },
583 { "rev", PSEUDO_FUNC_CONST, { 0xb } },
584 { "shuf", PSEUDO_FUNC_CONST, { 0x9 } },
586 /* fclass constants: */
587 { "nat", PSEUDO_FUNC_CONST, { 0x100 } },
588 { "qnan", PSEUDO_FUNC_CONST, { 0x080 } },
589 { "snan", PSEUDO_FUNC_CONST, { 0x040 } },
590 { "pos", PSEUDO_FUNC_CONST, { 0x001 } },
591 { "neg", PSEUDO_FUNC_CONST, { 0x002 } },
592 { "zero", PSEUDO_FUNC_CONST, { 0x004 } },
593 { "unorm", PSEUDO_FUNC_CONST, { 0x008 } },
594 { "norm", PSEUDO_FUNC_CONST, { 0x010 } },
595 { "inf", PSEUDO_FUNC_CONST, { 0x020 } },
597 { "natval", PSEUDO_FUNC_CONST, { 0x100 } }, /* old usage */
599 /* hint constants: */
600 { "pause", PSEUDO_FUNC_CONST, { 0x0 } },
602 /* unwind-related constants: */
603 { "svr4", PSEUDO_FUNC_CONST, { ELFOSABI_NONE } },
604 { "hpux", PSEUDO_FUNC_CONST, { ELFOSABI_HPUX } },
605 { "nt", PSEUDO_FUNC_CONST, { 2 } }, /* conflicts w/ELFOSABI_NETBSD */
606 { "linux", PSEUDO_FUNC_CONST, { ELFOSABI_LINUX } },
607 { "freebsd", PSEUDO_FUNC_CONST, { ELFOSABI_FREEBSD } },
608 { "openvms", PSEUDO_FUNC_CONST, { ELFOSABI_OPENVMS } },
609 { "nsk", PSEUDO_FUNC_CONST, { ELFOSABI_NSK } },
611 /* unwind-related registers: */
612 { "priunat",PSEUDO_FUNC_REG, { REG_PRIUNAT } }
615 /* 41-bit nop opcodes (one per unit): */
616 static const bfd_vma nop[IA64_NUM_UNITS] =
618 0x0000000000LL, /* NIL => break 0 */
619 0x0008000000LL, /* I-unit nop */
620 0x0008000000LL, /* M-unit nop */
621 0x4000000000LL, /* B-unit nop */
622 0x0008000000LL, /* F-unit nop */
623 0x0000000000LL, /* L-"unit" nop immediate */
624 0x0008000000LL, /* X-unit nop */
627 /* Can't be `const' as it's passed to input routines (which have the
628 habit of setting temporary sentinels. */
629 static char special_section_name[][20] =
631 {".bss"}, {".sbss"}, {".sdata"}, {".rodata"}, {".comment"},
632 {".IA_64.unwind"}, {".IA_64.unwind_info"},
633 {".init_array"}, {".fini_array"}
636 /* The best template for a particular sequence of up to three
637 instructions: */
638 #define N IA64_NUM_TYPES
639 static unsigned char best_template[N][N][N];
640 #undef N
642 /* Resource dependencies currently in effect */
643 static struct rsrc {
644 int depind; /* dependency index */
645 const struct ia64_dependency *dependency; /* actual dependency */
646 unsigned specific:1, /* is this a specific bit/regno? */
647 link_to_qp_branch:1; /* will a branch on the same QP clear it?*/
648 int index; /* specific regno/bit within dependency */
649 int note; /* optional qualifying note (0 if none) */
650 #define STATE_NONE 0
651 #define STATE_STOP 1
652 #define STATE_SRLZ 2
653 int insn_srlz; /* current insn serialization state */
654 int data_srlz; /* current data serialization state */
655 int qp_regno; /* qualifying predicate for this usage */
656 char *file; /* what file marked this dependency */
657 unsigned int line; /* what line marked this dependency */
658 struct mem_offset mem_offset; /* optional memory offset hint */
659 enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
660 int path; /* corresponding code entry index */
661 } *regdeps = NULL;
662 static int regdepslen = 0;
663 static int regdepstotlen = 0;
664 static const char *dv_mode[] = { "RAW", "WAW", "WAR" };
665 static const char *dv_sem[] = { "none", "implied", "impliedf",
666 "data", "instr", "specific", "stop", "other" };
667 static const char *dv_cmp_type[] = { "none", "OR", "AND" };
669 /* Current state of PR mutexation */
670 static struct qpmutex {
671 valueT prmask;
672 int path;
673 } *qp_mutexes = NULL; /* QP mutex bitmasks */
674 static int qp_mutexeslen = 0;
675 static int qp_mutexestotlen = 0;
676 static valueT qp_safe_across_calls = 0;
678 /* Current state of PR implications */
679 static struct qp_imply {
680 unsigned p1:6;
681 unsigned p2:6;
682 unsigned p2_branched:1;
683 int path;
684 } *qp_implies = NULL;
685 static int qp_implieslen = 0;
686 static int qp_impliestotlen = 0;
688 /* Keep track of static GR values so that indirect register usage can
689 sometimes be tracked. */
690 static struct gr {
691 unsigned known:1;
692 int path;
693 valueT value;
694 } gr_values[128] = {
697 #ifdef INT_MAX
698 INT_MAX,
699 #else
700 (((1 << (8 * sizeof(gr_values->path) - 2)) - 1) << 1) + 1,
701 #endif
706 /* Remember the alignment frag. */
707 static fragS *align_frag;
709 /* These are the routines required to output the various types of
710 unwind records. */
712 /* A slot_number is a frag address plus the slot index (0-2). We use the
713 frag address here so that if there is a section switch in the middle of
714 a function, then instructions emitted to a different section are not
715 counted. Since there may be more than one frag for a function, this
716 means we also need to keep track of which frag this address belongs to
717 so we can compute inter-frag distances. This also nicely solves the
718 problem with nops emitted for align directives, which can't easily be
719 counted, but can easily be derived from frag sizes. */
721 typedef struct unw_rec_list {
722 unwind_record r;
723 unsigned long slot_number;
724 fragS *slot_frag;
725 struct unw_rec_list *next;
726 } unw_rec_list;
728 #define SLOT_NUM_NOT_SET (unsigned)-1
730 /* Linked list of saved prologue counts. A very poor
731 implementation of a map from label numbers to prologue counts. */
732 typedef struct label_prologue_count
734 struct label_prologue_count *next;
735 unsigned long label_number;
736 unsigned int prologue_count;
737 } label_prologue_count;
739 typedef struct proc_pending
741 symbolS *sym;
742 struct proc_pending *next;
743 } proc_pending;
745 static struct
747 /* Maintain a list of unwind entries for the current function. */
748 unw_rec_list *list;
749 unw_rec_list *tail;
751 /* Any unwind entries that should be attached to the current slot
752 that an insn is being constructed for. */
753 unw_rec_list *current_entry;
755 /* These are used to create the unwind table entry for this function. */
756 proc_pending proc_pending;
757 symbolS *info; /* pointer to unwind info */
758 symbolS *personality_routine;
759 segT saved_text_seg;
760 subsegT saved_text_subseg;
761 unsigned int force_unwind_entry : 1; /* force generation of unwind entry? */
763 /* TRUE if processing unwind directives in a prologue region. */
764 unsigned int prologue : 1;
765 unsigned int prologue_mask : 4;
766 unsigned int prologue_gr : 7;
767 unsigned int body : 1;
768 unsigned int insn : 1;
769 unsigned int prologue_count; /* number of .prologues seen so far */
770 /* Prologue counts at previous .label_state directives. */
771 struct label_prologue_count * saved_prologue_counts;
773 /* List of split up .save-s. */
774 unw_p_record *pending_saves;
775 } unwind;
777 /* The input value is a negated offset from psp, and specifies an address
778 psp - offset. The encoded value is psp + 16 - (4 * offset). Thus we
779 must add 16 and divide by 4 to get the encoded value. */
781 #define ENCODED_PSP_OFFSET(OFFSET) (((OFFSET) + 16) / 4)
783 typedef void (*vbyte_func) (int, char *, char *);
785 /* Forward declarations: */
786 static void dot_alias (int);
787 static int parse_operand (expressionS *, int);
788 static void emit_one_bundle (void);
789 static bfd_reloc_code_real_type ia64_gen_real_reloc_type (struct symbol *,
790 bfd_reloc_code_real_type);
791 static void insn_group_break (int, int, int);
792 static void add_qp_mutex (valueT);
793 static void add_qp_imply (int, int);
794 static void clear_qp_mutex (valueT);
795 static void clear_qp_implies (valueT, valueT);
796 static void print_dependency (const char *, int);
797 static void instruction_serialization (void);
798 static void data_serialization (void);
799 static void output_R3_format (vbyte_func, unw_record_type, unsigned long);
800 static void output_B3_format (vbyte_func, unsigned long, unsigned long);
801 static void output_B4_format (vbyte_func, unw_record_type, unsigned long);
802 static void free_saved_prologue_counts (void);
804 /* Determine if application register REGNUM resides only in the integer
805 unit (as opposed to the memory unit). */
806 static int
807 ar_is_only_in_integer_unit (int reg)
809 reg -= REG_AR;
810 return reg >= 64 && reg <= 111;
813 /* Determine if application register REGNUM resides only in the memory
814 unit (as opposed to the integer unit). */
815 static int
816 ar_is_only_in_memory_unit (int reg)
818 reg -= REG_AR;
819 return reg >= 0 && reg <= 47;
822 /* Switch to section NAME and create section if necessary. It's
823 rather ugly that we have to manipulate input_line_pointer but I
824 don't see any other way to accomplish the same thing without
825 changing obj-elf.c (which may be the Right Thing, in the end). */
826 static void
827 set_section (char *name)
829 char *saved_input_line_pointer;
831 saved_input_line_pointer = input_line_pointer;
832 input_line_pointer = name;
833 obj_elf_section (0);
834 input_line_pointer = saved_input_line_pointer;
837 /* Map 's' to SHF_IA_64_SHORT. */
839 bfd_vma
840 ia64_elf_section_letter (int letter, char **ptr_msg)
842 if (letter == 's')
843 return SHF_IA_64_SHORT;
844 else if (letter == 'o')
845 return SHF_LINK_ORDER;
846 #ifdef TE_VMS
847 else if (letter == 'O')
848 return SHF_IA_64_VMS_OVERLAID;
849 else if (letter == 'g')
850 return SHF_IA_64_VMS_GLOBAL;
851 #endif
853 *ptr_msg = _("Bad .section directive: want a,o,s,w,x,M,S,G,T in string");
854 return -1;
857 /* Map SHF_IA_64_SHORT to SEC_SMALL_DATA. */
859 flagword
860 ia64_elf_section_flags (flagword flags,
861 bfd_vma attr,
862 int type ATTRIBUTE_UNUSED)
864 if (attr & SHF_IA_64_SHORT)
865 flags |= SEC_SMALL_DATA;
866 return flags;
870 ia64_elf_section_type (const char *str, size_t len)
872 #define STREQ(s) ((len == sizeof (s) - 1) && (strncmp (str, s, sizeof (s) - 1) == 0))
874 if (STREQ (ELF_STRING_ia64_unwind_info))
875 return SHT_PROGBITS;
877 if (STREQ (ELF_STRING_ia64_unwind_info_once))
878 return SHT_PROGBITS;
880 if (STREQ (ELF_STRING_ia64_unwind))
881 return SHT_IA_64_UNWIND;
883 if (STREQ (ELF_STRING_ia64_unwind_once))
884 return SHT_IA_64_UNWIND;
886 if (STREQ ("unwind"))
887 return SHT_IA_64_UNWIND;
889 return -1;
890 #undef STREQ
893 static unsigned int
894 set_regstack (unsigned int ins,
895 unsigned int locs,
896 unsigned int outs,
897 unsigned int rots)
899 /* Size of frame. */
900 unsigned int sof;
902 sof = ins + locs + outs;
903 if (sof > 96)
905 as_bad (_("Size of frame exceeds maximum of 96 registers"));
906 return 0;
908 if (rots > sof)
910 as_warn (_("Size of rotating registers exceeds frame size"));
911 return 0;
913 md.in.base = REG_GR + 32;
914 md.loc.base = md.in.base + ins;
915 md.out.base = md.loc.base + locs;
917 md.in.num_regs = ins;
918 md.loc.num_regs = locs;
919 md.out.num_regs = outs;
920 md.rot.num_regs = rots;
921 return sof;
924 void
925 ia64_flush_insns (void)
927 struct label_fix *lfix;
928 segT saved_seg;
929 subsegT saved_subseg;
930 unw_rec_list *ptr;
931 bfd_boolean mark;
933 if (!md.last_text_seg)
934 return;
936 saved_seg = now_seg;
937 saved_subseg = now_subseg;
939 subseg_set (md.last_text_seg, 0);
941 while (md.num_slots_in_use > 0)
942 emit_one_bundle (); /* force out queued instructions */
944 /* In case there are labels following the last instruction, resolve
945 those now. */
946 mark = FALSE;
947 for (lfix = CURR_SLOT.label_fixups; lfix; lfix = lfix->next)
949 symbol_set_value_now (lfix->sym);
950 mark |= lfix->dw2_mark_labels;
952 if (mark)
954 dwarf2_where (&CURR_SLOT.debug_line);
955 CURR_SLOT.debug_line.flags |= DWARF2_FLAG_BASIC_BLOCK;
956 dwarf2_gen_line_info (frag_now_fix (), &CURR_SLOT.debug_line);
957 dwarf2_consume_line_info ();
959 CURR_SLOT.label_fixups = 0;
961 for (lfix = CURR_SLOT.tag_fixups; lfix; lfix = lfix->next)
962 symbol_set_value_now (lfix->sym);
963 CURR_SLOT.tag_fixups = 0;
965 /* In case there are unwind directives following the last instruction,
966 resolve those now. We only handle prologue, body, and endp directives
967 here. Give an error for others. */
968 for (ptr = unwind.current_entry; ptr; ptr = ptr->next)
970 switch (ptr->r.type)
972 case prologue:
973 case prologue_gr:
974 case body:
975 case endp:
976 ptr->slot_number = (unsigned long) frag_more (0);
977 ptr->slot_frag = frag_now;
978 break;
980 /* Allow any record which doesn't have a "t" field (i.e.,
981 doesn't relate to a particular instruction). */
982 case unwabi:
983 case br_gr:
984 case copy_state:
985 case fr_mem:
986 case frgr_mem:
987 case gr_gr:
988 case gr_mem:
989 case label_state:
990 case rp_br:
991 case spill_base:
992 case spill_mask:
993 /* nothing */
994 break;
996 default:
997 as_bad (_("Unwind directive not followed by an instruction."));
998 break;
1001 unwind.current_entry = NULL;
1003 subseg_set (saved_seg, saved_subseg);
1005 if (md.qp.X_op == O_register)
1006 as_bad (_("qualifying predicate not followed by instruction"));
1009 static void
1010 ia64_do_align (int nbytes)
1012 char *saved_input_line_pointer = input_line_pointer;
1014 input_line_pointer = "";
1015 s_align_bytes (nbytes);
1016 input_line_pointer = saved_input_line_pointer;
1019 void
1020 ia64_cons_align (int nbytes)
1022 if (md.auto_align)
1024 char *saved_input_line_pointer = input_line_pointer;
1025 input_line_pointer = "";
1026 s_align_bytes (nbytes);
1027 input_line_pointer = saved_input_line_pointer;
1031 /* Output COUNT bytes to a memory location. */
1032 static char *vbyte_mem_ptr = NULL;
1034 static void
1035 output_vbyte_mem (int count, char *ptr, char *comment ATTRIBUTE_UNUSED)
1037 int x;
1038 if (vbyte_mem_ptr == NULL)
1039 abort ();
1041 if (count == 0)
1042 return;
1043 for (x = 0; x < count; x++)
1044 *(vbyte_mem_ptr++) = ptr[x];
1047 /* Count the number of bytes required for records. */
1048 static int vbyte_count = 0;
1049 static void
1050 count_output (int count,
1051 char *ptr ATTRIBUTE_UNUSED,
1052 char *comment ATTRIBUTE_UNUSED)
1054 vbyte_count += count;
1057 static void
1058 output_R1_format (vbyte_func f, unw_record_type rtype, int rlen)
1060 int r = 0;
1061 char byte;
1062 if (rlen > 0x1f)
1064 output_R3_format (f, rtype, rlen);
1065 return;
1068 if (rtype == body)
1069 r = 1;
1070 else if (rtype != prologue)
1071 as_bad (_("record type is not valid"));
1073 byte = UNW_R1 | (r << 5) | (rlen & 0x1f);
1074 (*f) (1, &byte, NULL);
1077 static void
1078 output_R2_format (vbyte_func f, int mask, int grsave, unsigned long rlen)
1080 char bytes[20];
1081 int count = 2;
1082 mask = (mask & 0x0f);
1083 grsave = (grsave & 0x7f);
1085 bytes[0] = (UNW_R2 | (mask >> 1));
1086 bytes[1] = (((mask & 0x01) << 7) | grsave);
1087 count += output_leb128 (bytes + 2, rlen, 0);
1088 (*f) (count, bytes, NULL);
1091 static void
1092 output_R3_format (vbyte_func f, unw_record_type rtype, unsigned long rlen)
1094 int r = 0, count;
1095 char bytes[20];
1096 if (rlen <= 0x1f)
1098 output_R1_format (f, rtype, rlen);
1099 return;
1102 if (rtype == body)
1103 r = 1;
1104 else if (rtype != prologue)
1105 as_bad (_("record type is not valid"));
1106 bytes[0] = (UNW_R3 | r);
1107 count = output_leb128 (bytes + 1, rlen, 0);
1108 (*f) (count + 1, bytes, NULL);
1111 static void
1112 output_P1_format (vbyte_func f, int brmask)
1114 char byte;
1115 byte = UNW_P1 | (brmask & 0x1f);
1116 (*f) (1, &byte, NULL);
1119 static void
1120 output_P2_format (vbyte_func f, int brmask, int gr)
1122 char bytes[2];
1123 brmask = (brmask & 0x1f);
1124 bytes[0] = UNW_P2 | (brmask >> 1);
1125 bytes[1] = (((brmask & 1) << 7) | gr);
1126 (*f) (2, bytes, NULL);
1129 static void
1130 output_P3_format (vbyte_func f, unw_record_type rtype, int reg)
1132 char bytes[2];
1133 int r = 0;
1134 reg = (reg & 0x7f);
1135 switch (rtype)
1137 case psp_gr:
1138 r = 0;
1139 break;
1140 case rp_gr:
1141 r = 1;
1142 break;
1143 case pfs_gr:
1144 r = 2;
1145 break;
1146 case preds_gr:
1147 r = 3;
1148 break;
1149 case unat_gr:
1150 r = 4;
1151 break;
1152 case lc_gr:
1153 r = 5;
1154 break;
1155 case rp_br:
1156 r = 6;
1157 break;
1158 case rnat_gr:
1159 r = 7;
1160 break;
1161 case bsp_gr:
1162 r = 8;
1163 break;
1164 case bspstore_gr:
1165 r = 9;
1166 break;
1167 case fpsr_gr:
1168 r = 10;
1169 break;
1170 case priunat_gr:
1171 r = 11;
1172 break;
1173 default:
1174 as_bad (_("Invalid record type for P3 format."));
1176 bytes[0] = (UNW_P3 | (r >> 1));
1177 bytes[1] = (((r & 1) << 7) | reg);
1178 (*f) (2, bytes, NULL);
1181 static void
1182 output_P4_format (vbyte_func f, unsigned char *imask, unsigned long imask_size)
1184 imask[0] = UNW_P4;
1185 (*f) (imask_size, (char *) imask, NULL);
1188 static void
1189 output_P5_format (vbyte_func f, int grmask, unsigned long frmask)
1191 char bytes[4];
1192 grmask = (grmask & 0x0f);
1194 bytes[0] = UNW_P5;
1195 bytes[1] = ((grmask << 4) | ((frmask & 0x000f0000) >> 16));
1196 bytes[2] = ((frmask & 0x0000ff00) >> 8);
1197 bytes[3] = (frmask & 0x000000ff);
1198 (*f) (4, bytes, NULL);
1201 static void
1202 output_P6_format (vbyte_func f, unw_record_type rtype, int rmask)
1204 char byte;
1205 int r = 0;
1207 if (rtype == gr_mem)
1208 r = 1;
1209 else if (rtype != fr_mem)
1210 as_bad (_("Invalid record type for format P6"));
1211 byte = (UNW_P6 | (r << 4) | (rmask & 0x0f));
1212 (*f) (1, &byte, NULL);
1215 static void
1216 output_P7_format (vbyte_func f,
1217 unw_record_type rtype,
1218 unsigned long w1,
1219 unsigned long w2)
1221 char bytes[20];
1222 int count = 1;
1223 int r = 0;
1224 count += output_leb128 (bytes + 1, w1, 0);
1225 switch (rtype)
1227 case mem_stack_f:
1228 r = 0;
1229 count += output_leb128 (bytes + count, w2 >> 4, 0);
1230 break;
1231 case mem_stack_v:
1232 r = 1;
1233 break;
1234 case spill_base:
1235 r = 2;
1236 break;
1237 case psp_sprel:
1238 r = 3;
1239 break;
1240 case rp_when:
1241 r = 4;
1242 break;
1243 case rp_psprel:
1244 r = 5;
1245 break;
1246 case pfs_when:
1247 r = 6;
1248 break;
1249 case pfs_psprel:
1250 r = 7;
1251 break;
1252 case preds_when:
1253 r = 8;
1254 break;
1255 case preds_psprel:
1256 r = 9;
1257 break;
1258 case lc_when:
1259 r = 10;
1260 break;
1261 case lc_psprel:
1262 r = 11;
1263 break;
1264 case unat_when:
1265 r = 12;
1266 break;
1267 case unat_psprel:
1268 r = 13;
1269 break;
1270 case fpsr_when:
1271 r = 14;
1272 break;
1273 case fpsr_psprel:
1274 r = 15;
1275 break;
1276 default:
1277 break;
1279 bytes[0] = (UNW_P7 | r);
1280 (*f) (count, bytes, NULL);
1283 static void
1284 output_P8_format (vbyte_func f, unw_record_type rtype, unsigned long t)
1286 char bytes[20];
1287 int r = 0;
1288 int count = 2;
1289 bytes[0] = UNW_P8;
1290 switch (rtype)
1292 case rp_sprel:
1293 r = 1;
1294 break;
1295 case pfs_sprel:
1296 r = 2;
1297 break;
1298 case preds_sprel:
1299 r = 3;
1300 break;
1301 case lc_sprel:
1302 r = 4;
1303 break;
1304 case unat_sprel:
1305 r = 5;
1306 break;
1307 case fpsr_sprel:
1308 r = 6;
1309 break;
1310 case bsp_when:
1311 r = 7;
1312 break;
1313 case bsp_psprel:
1314 r = 8;
1315 break;
1316 case bsp_sprel:
1317 r = 9;
1318 break;
1319 case bspstore_when:
1320 r = 10;
1321 break;
1322 case bspstore_psprel:
1323 r = 11;
1324 break;
1325 case bspstore_sprel:
1326 r = 12;
1327 break;
1328 case rnat_when:
1329 r = 13;
1330 break;
1331 case rnat_psprel:
1332 r = 14;
1333 break;
1334 case rnat_sprel:
1335 r = 15;
1336 break;
1337 case priunat_when_gr:
1338 r = 16;
1339 break;
1340 case priunat_psprel:
1341 r = 17;
1342 break;
1343 case priunat_sprel:
1344 r = 18;
1345 break;
1346 case priunat_when_mem:
1347 r = 19;
1348 break;
1349 default:
1350 break;
1352 bytes[1] = r;
1353 count += output_leb128 (bytes + 2, t, 0);
1354 (*f) (count, bytes, NULL);
1357 static void
1358 output_P9_format (vbyte_func f, int grmask, int gr)
1360 char bytes[3];
1361 bytes[0] = UNW_P9;
1362 bytes[1] = (grmask & 0x0f);
1363 bytes[2] = (gr & 0x7f);
1364 (*f) (3, bytes, NULL);
1367 static void
1368 output_P10_format (vbyte_func f, int abi, int context)
1370 char bytes[3];
1371 bytes[0] = UNW_P10;
1372 bytes[1] = (abi & 0xff);
1373 bytes[2] = (context & 0xff);
1374 (*f) (3, bytes, NULL);
1377 static void
1378 output_B1_format (vbyte_func f, unw_record_type rtype, unsigned long label)
1380 char byte;
1381 int r = 0;
1382 if (label > 0x1f)
1384 output_B4_format (f, rtype, label);
1385 return;
1387 if (rtype == copy_state)
1388 r = 1;
1389 else if (rtype != label_state)
1390 as_bad (_("Invalid record type for format B1"));
1392 byte = (UNW_B1 | (r << 5) | (label & 0x1f));
1393 (*f) (1, &byte, NULL);
1396 static void
1397 output_B2_format (vbyte_func f, unsigned long ecount, unsigned long t)
1399 char bytes[20];
1400 int count = 1;
1401 if (ecount > 0x1f)
1403 output_B3_format (f, ecount, t);
1404 return;
1406 bytes[0] = (UNW_B2 | (ecount & 0x1f));
1407 count += output_leb128 (bytes + 1, t, 0);
1408 (*f) (count, bytes, NULL);
1411 static void
1412 output_B3_format (vbyte_func f, unsigned long ecount, unsigned long t)
1414 char bytes[20];
1415 int count = 1;
1416 if (ecount <= 0x1f)
1418 output_B2_format (f, ecount, t);
1419 return;
1421 bytes[0] = UNW_B3;
1422 count += output_leb128 (bytes + 1, t, 0);
1423 count += output_leb128 (bytes + count, ecount, 0);
1424 (*f) (count, bytes, NULL);
1427 static void
1428 output_B4_format (vbyte_func f, unw_record_type rtype, unsigned long label)
1430 char bytes[20];
1431 int r = 0;
1432 int count = 1;
1433 if (label <= 0x1f)
1435 output_B1_format (f, rtype, label);
1436 return;
1439 if (rtype == copy_state)
1440 r = 1;
1441 else if (rtype != label_state)
1442 as_bad (_("Invalid record type for format B1"));
1444 bytes[0] = (UNW_B4 | (r << 3));
1445 count += output_leb128 (bytes + 1, label, 0);
1446 (*f) (count, bytes, NULL);
1449 static char
1450 format_ab_reg (int ab, int reg)
1452 int ret;
1453 ab = (ab & 3);
1454 reg = (reg & 0x1f);
1455 ret = (ab << 5) | reg;
1456 return ret;
1459 static void
1460 output_X1_format (vbyte_func f,
1461 unw_record_type rtype,
1462 int ab,
1463 int reg,
1464 unsigned long t,
1465 unsigned long w1)
1467 char bytes[20];
1468 int r = 0;
1469 int count = 2;
1470 bytes[0] = UNW_X1;
1472 if (rtype == spill_sprel)
1473 r = 1;
1474 else if (rtype != spill_psprel)
1475 as_bad (_("Invalid record type for format X1"));
1476 bytes[1] = ((r << 7) | format_ab_reg (ab, reg));
1477 count += output_leb128 (bytes + 2, t, 0);
1478 count += output_leb128 (bytes + count, w1, 0);
1479 (*f) (count, bytes, NULL);
1482 static void
1483 output_X2_format (vbyte_func f,
1484 int ab,
1485 int reg,
1486 int x,
1487 int y,
1488 int treg,
1489 unsigned long t)
1491 char bytes[20];
1492 int count = 3;
1493 bytes[0] = UNW_X2;
1494 bytes[1] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1495 bytes[2] = (((y & 1) << 7) | (treg & 0x7f));
1496 count += output_leb128 (bytes + 3, t, 0);
1497 (*f) (count, bytes, NULL);
1500 static void
1501 output_X3_format (vbyte_func f,
1502 unw_record_type rtype,
1503 int qp,
1504 int ab,
1505 int reg,
1506 unsigned long t,
1507 unsigned long w1)
1509 char bytes[20];
1510 int r = 0;
1511 int count = 3;
1512 bytes[0] = UNW_X3;
1514 if (rtype == spill_sprel_p)
1515 r = 1;
1516 else if (rtype != spill_psprel_p)
1517 as_bad (_("Invalid record type for format X3"));
1518 bytes[1] = ((r << 7) | (qp & 0x3f));
1519 bytes[2] = format_ab_reg (ab, reg);
1520 count += output_leb128 (bytes + 3, t, 0);
1521 count += output_leb128 (bytes + count, w1, 0);
1522 (*f) (count, bytes, NULL);
1525 static void
1526 output_X4_format (vbyte_func f,
1527 int qp,
1528 int ab,
1529 int reg,
1530 int x,
1531 int y,
1532 int treg,
1533 unsigned long t)
1535 char bytes[20];
1536 int count = 4;
1537 bytes[0] = UNW_X4;
1538 bytes[1] = (qp & 0x3f);
1539 bytes[2] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1540 bytes[3] = (((y & 1) << 7) | (treg & 0x7f));
1541 count += output_leb128 (bytes + 4, t, 0);
1542 (*f) (count, bytes, NULL);
1545 /* This function checks whether there are any outstanding .save-s and
1546 discards them if so. */
1548 static void
1549 check_pending_save (void)
1551 if (unwind.pending_saves)
1553 unw_rec_list *cur, *prev;
1555 as_warn (_("Previous .save incomplete"));
1556 for (cur = unwind.list, prev = NULL; cur; )
1557 if (&cur->r.record.p == unwind.pending_saves)
1559 if (prev)
1560 prev->next = cur->next;
1561 else
1562 unwind.list = cur->next;
1563 if (cur == unwind.tail)
1564 unwind.tail = prev;
1565 if (cur == unwind.current_entry)
1566 unwind.current_entry = cur->next;
1567 /* Don't free the first discarded record, it's being used as
1568 terminator for (currently) br_gr and gr_gr processing, and
1569 also prevents leaving a dangling pointer to it in its
1570 predecessor. */
1571 cur->r.record.p.grmask = 0;
1572 cur->r.record.p.brmask = 0;
1573 cur->r.record.p.frmask = 0;
1574 prev = cur->r.record.p.next;
1575 cur->r.record.p.next = NULL;
1576 cur = prev;
1577 break;
1579 else
1581 prev = cur;
1582 cur = cur->next;
1584 while (cur)
1586 prev = cur;
1587 cur = cur->r.record.p.next;
1588 free (prev);
1590 unwind.pending_saves = NULL;
1594 /* This function allocates a record list structure, and initializes fields. */
1596 static unw_rec_list *
1597 alloc_record (unw_record_type t)
1599 unw_rec_list *ptr;
1600 ptr = xmalloc (sizeof (*ptr));
1601 memset (ptr, 0, sizeof (*ptr));
1602 ptr->slot_number = SLOT_NUM_NOT_SET;
1603 ptr->r.type = t;
1604 return ptr;
1607 /* Dummy unwind record used for calculating the length of the last prologue or
1608 body region. */
1610 static unw_rec_list *
1611 output_endp (void)
1613 unw_rec_list *ptr = alloc_record (endp);
1614 return ptr;
1617 static unw_rec_list *
1618 output_prologue (void)
1620 unw_rec_list *ptr = alloc_record (prologue);
1621 memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1622 return ptr;
1625 static unw_rec_list *
1626 output_prologue_gr (unsigned int saved_mask, unsigned int reg)
1628 unw_rec_list *ptr = alloc_record (prologue_gr);
1629 memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1630 ptr->r.record.r.grmask = saved_mask;
1631 ptr->r.record.r.grsave = reg;
1632 return ptr;
1635 static unw_rec_list *
1636 output_body (void)
1638 unw_rec_list *ptr = alloc_record (body);
1639 return ptr;
1642 static unw_rec_list *
1643 output_mem_stack_f (unsigned int size)
1645 unw_rec_list *ptr = alloc_record (mem_stack_f);
1646 ptr->r.record.p.size = size;
1647 return ptr;
1650 static unw_rec_list *
1651 output_mem_stack_v (void)
1653 unw_rec_list *ptr = alloc_record (mem_stack_v);
1654 return ptr;
1657 static unw_rec_list *
1658 output_psp_gr (unsigned int gr)
1660 unw_rec_list *ptr = alloc_record (psp_gr);
1661 ptr->r.record.p.r.gr = gr;
1662 return ptr;
1665 static unw_rec_list *
1666 output_psp_sprel (unsigned int offset)
1668 unw_rec_list *ptr = alloc_record (psp_sprel);
1669 ptr->r.record.p.off.sp = offset / 4;
1670 return ptr;
1673 static unw_rec_list *
1674 output_rp_when (void)
1676 unw_rec_list *ptr = alloc_record (rp_when);
1677 return ptr;
1680 static unw_rec_list *
1681 output_rp_gr (unsigned int gr)
1683 unw_rec_list *ptr = alloc_record (rp_gr);
1684 ptr->r.record.p.r.gr = gr;
1685 return ptr;
1688 static unw_rec_list *
1689 output_rp_br (unsigned int br)
1691 unw_rec_list *ptr = alloc_record (rp_br);
1692 ptr->r.record.p.r.br = br;
1693 return ptr;
1696 static unw_rec_list *
1697 output_rp_psprel (unsigned int offset)
1699 unw_rec_list *ptr = alloc_record (rp_psprel);
1700 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
1701 return ptr;
1704 static unw_rec_list *
1705 output_rp_sprel (unsigned int offset)
1707 unw_rec_list *ptr = alloc_record (rp_sprel);
1708 ptr->r.record.p.off.sp = offset / 4;
1709 return ptr;
1712 static unw_rec_list *
1713 output_pfs_when (void)
1715 unw_rec_list *ptr = alloc_record (pfs_when);
1716 return ptr;
1719 static unw_rec_list *
1720 output_pfs_gr (unsigned int gr)
1722 unw_rec_list *ptr = alloc_record (pfs_gr);
1723 ptr->r.record.p.r.gr = gr;
1724 return ptr;
1727 static unw_rec_list *
1728 output_pfs_psprel (unsigned int offset)
1730 unw_rec_list *ptr = alloc_record (pfs_psprel);
1731 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
1732 return ptr;
1735 static unw_rec_list *
1736 output_pfs_sprel (unsigned int offset)
1738 unw_rec_list *ptr = alloc_record (pfs_sprel);
1739 ptr->r.record.p.off.sp = offset / 4;
1740 return ptr;
1743 static unw_rec_list *
1744 output_preds_when (void)
1746 unw_rec_list *ptr = alloc_record (preds_when);
1747 return ptr;
1750 static unw_rec_list *
1751 output_preds_gr (unsigned int gr)
1753 unw_rec_list *ptr = alloc_record (preds_gr);
1754 ptr->r.record.p.r.gr = gr;
1755 return ptr;
1758 static unw_rec_list *
1759 output_preds_psprel (unsigned int offset)
1761 unw_rec_list *ptr = alloc_record (preds_psprel);
1762 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
1763 return ptr;
1766 static unw_rec_list *
1767 output_preds_sprel (unsigned int offset)
1769 unw_rec_list *ptr = alloc_record (preds_sprel);
1770 ptr->r.record.p.off.sp = offset / 4;
1771 return ptr;
1774 static unw_rec_list *
1775 output_fr_mem (unsigned int mask)
1777 unw_rec_list *ptr = alloc_record (fr_mem);
1778 unw_rec_list *cur = ptr;
1780 ptr->r.record.p.frmask = mask;
1781 unwind.pending_saves = &ptr->r.record.p;
1782 for (;;)
1784 unw_rec_list *prev = cur;
1786 /* Clear least significant set bit. */
1787 mask &= ~(mask & (~mask + 1));
1788 if (!mask)
1789 return ptr;
1790 cur = alloc_record (fr_mem);
1791 cur->r.record.p.frmask = mask;
1792 /* Retain only least significant bit. */
1793 prev->r.record.p.frmask ^= mask;
1794 prev->r.record.p.next = cur;
1798 static unw_rec_list *
1799 output_frgr_mem (unsigned int gr_mask, unsigned int fr_mask)
1801 unw_rec_list *ptr = alloc_record (frgr_mem);
1802 unw_rec_list *cur = ptr;
1804 unwind.pending_saves = &cur->r.record.p;
1805 cur->r.record.p.frmask = fr_mask;
1806 while (fr_mask)
1808 unw_rec_list *prev = cur;
1810 /* Clear least significant set bit. */
1811 fr_mask &= ~(fr_mask & (~fr_mask + 1));
1812 if (!gr_mask && !fr_mask)
1813 return ptr;
1814 cur = alloc_record (frgr_mem);
1815 cur->r.record.p.frmask = fr_mask;
1816 /* Retain only least significant bit. */
1817 prev->r.record.p.frmask ^= fr_mask;
1818 prev->r.record.p.next = cur;
1820 cur->r.record.p.grmask = gr_mask;
1821 for (;;)
1823 unw_rec_list *prev = cur;
1825 /* Clear least significant set bit. */
1826 gr_mask &= ~(gr_mask & (~gr_mask + 1));
1827 if (!gr_mask)
1828 return ptr;
1829 cur = alloc_record (frgr_mem);
1830 cur->r.record.p.grmask = gr_mask;
1831 /* Retain only least significant bit. */
1832 prev->r.record.p.grmask ^= gr_mask;
1833 prev->r.record.p.next = cur;
1837 static unw_rec_list *
1838 output_gr_gr (unsigned int mask, unsigned int reg)
1840 unw_rec_list *ptr = alloc_record (gr_gr);
1841 unw_rec_list *cur = ptr;
1843 ptr->r.record.p.grmask = mask;
1844 ptr->r.record.p.r.gr = reg;
1845 unwind.pending_saves = &ptr->r.record.p;
1846 for (;;)
1848 unw_rec_list *prev = cur;
1850 /* Clear least significant set bit. */
1851 mask &= ~(mask & (~mask + 1));
1852 if (!mask)
1853 return ptr;
1854 cur = alloc_record (gr_gr);
1855 cur->r.record.p.grmask = mask;
1856 /* Indicate this record shouldn't be output. */
1857 cur->r.record.p.r.gr = REG_NUM;
1858 /* Retain only least significant bit. */
1859 prev->r.record.p.grmask ^= mask;
1860 prev->r.record.p.next = cur;
1864 static unw_rec_list *
1865 output_gr_mem (unsigned int mask)
1867 unw_rec_list *ptr = alloc_record (gr_mem);
1868 unw_rec_list *cur = ptr;
1870 ptr->r.record.p.grmask = mask;
1871 unwind.pending_saves = &ptr->r.record.p;
1872 for (;;)
1874 unw_rec_list *prev = cur;
1876 /* Clear least significant set bit. */
1877 mask &= ~(mask & (~mask + 1));
1878 if (!mask)
1879 return ptr;
1880 cur = alloc_record (gr_mem);
1881 cur->r.record.p.grmask = mask;
1882 /* Retain only least significant bit. */
1883 prev->r.record.p.grmask ^= mask;
1884 prev->r.record.p.next = cur;
1888 static unw_rec_list *
1889 output_br_mem (unsigned int mask)
1891 unw_rec_list *ptr = alloc_record (br_mem);
1892 unw_rec_list *cur = ptr;
1894 ptr->r.record.p.brmask = mask;
1895 unwind.pending_saves = &ptr->r.record.p;
1896 for (;;)
1898 unw_rec_list *prev = cur;
1900 /* Clear least significant set bit. */
1901 mask &= ~(mask & (~mask + 1));
1902 if (!mask)
1903 return ptr;
1904 cur = alloc_record (br_mem);
1905 cur->r.record.p.brmask = mask;
1906 /* Retain only least significant bit. */
1907 prev->r.record.p.brmask ^= mask;
1908 prev->r.record.p.next = cur;
1912 static unw_rec_list *
1913 output_br_gr (unsigned int mask, unsigned int reg)
1915 unw_rec_list *ptr = alloc_record (br_gr);
1916 unw_rec_list *cur = ptr;
1918 ptr->r.record.p.brmask = mask;
1919 ptr->r.record.p.r.gr = reg;
1920 unwind.pending_saves = &ptr->r.record.p;
1921 for (;;)
1923 unw_rec_list *prev = cur;
1925 /* Clear least significant set bit. */
1926 mask &= ~(mask & (~mask + 1));
1927 if (!mask)
1928 return ptr;
1929 cur = alloc_record (br_gr);
1930 cur->r.record.p.brmask = mask;
1931 /* Indicate this record shouldn't be output. */
1932 cur->r.record.p.r.gr = REG_NUM;
1933 /* Retain only least significant bit. */
1934 prev->r.record.p.brmask ^= mask;
1935 prev->r.record.p.next = cur;
1939 static unw_rec_list *
1940 output_spill_base (unsigned int offset)
1942 unw_rec_list *ptr = alloc_record (spill_base);
1943 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
1944 return ptr;
1947 static unw_rec_list *
1948 output_unat_when (void)
1950 unw_rec_list *ptr = alloc_record (unat_when);
1951 return ptr;
1954 static unw_rec_list *
1955 output_unat_gr (unsigned int gr)
1957 unw_rec_list *ptr = alloc_record (unat_gr);
1958 ptr->r.record.p.r.gr = gr;
1959 return ptr;
1962 static unw_rec_list *
1963 output_unat_psprel (unsigned int offset)
1965 unw_rec_list *ptr = alloc_record (unat_psprel);
1966 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
1967 return ptr;
1970 static unw_rec_list *
1971 output_unat_sprel (unsigned int offset)
1973 unw_rec_list *ptr = alloc_record (unat_sprel);
1974 ptr->r.record.p.off.sp = offset / 4;
1975 return ptr;
1978 static unw_rec_list *
1979 output_lc_when (void)
1981 unw_rec_list *ptr = alloc_record (lc_when);
1982 return ptr;
1985 static unw_rec_list *
1986 output_lc_gr (unsigned int gr)
1988 unw_rec_list *ptr = alloc_record (lc_gr);
1989 ptr->r.record.p.r.gr = gr;
1990 return ptr;
1993 static unw_rec_list *
1994 output_lc_psprel (unsigned int offset)
1996 unw_rec_list *ptr = alloc_record (lc_psprel);
1997 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
1998 return ptr;
2001 static unw_rec_list *
2002 output_lc_sprel (unsigned int offset)
2004 unw_rec_list *ptr = alloc_record (lc_sprel);
2005 ptr->r.record.p.off.sp = offset / 4;
2006 return ptr;
2009 static unw_rec_list *
2010 output_fpsr_when (void)
2012 unw_rec_list *ptr = alloc_record (fpsr_when);
2013 return ptr;
2016 static unw_rec_list *
2017 output_fpsr_gr (unsigned int gr)
2019 unw_rec_list *ptr = alloc_record (fpsr_gr);
2020 ptr->r.record.p.r.gr = gr;
2021 return ptr;
2024 static unw_rec_list *
2025 output_fpsr_psprel (unsigned int offset)
2027 unw_rec_list *ptr = alloc_record (fpsr_psprel);
2028 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
2029 return ptr;
2032 static unw_rec_list *
2033 output_fpsr_sprel (unsigned int offset)
2035 unw_rec_list *ptr = alloc_record (fpsr_sprel);
2036 ptr->r.record.p.off.sp = offset / 4;
2037 return ptr;
2040 static unw_rec_list *
2041 output_priunat_when_gr (void)
2043 unw_rec_list *ptr = alloc_record (priunat_when_gr);
2044 return ptr;
2047 static unw_rec_list *
2048 output_priunat_when_mem (void)
2050 unw_rec_list *ptr = alloc_record (priunat_when_mem);
2051 return ptr;
2054 static unw_rec_list *
2055 output_priunat_gr (unsigned int gr)
2057 unw_rec_list *ptr = alloc_record (priunat_gr);
2058 ptr->r.record.p.r.gr = gr;
2059 return ptr;
2062 static unw_rec_list *
2063 output_priunat_psprel (unsigned int offset)
2065 unw_rec_list *ptr = alloc_record (priunat_psprel);
2066 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
2067 return ptr;
2070 static unw_rec_list *
2071 output_priunat_sprel (unsigned int offset)
2073 unw_rec_list *ptr = alloc_record (priunat_sprel);
2074 ptr->r.record.p.off.sp = offset / 4;
2075 return ptr;
2078 static unw_rec_list *
2079 output_bsp_when (void)
2081 unw_rec_list *ptr = alloc_record (bsp_when);
2082 return ptr;
2085 static unw_rec_list *
2086 output_bsp_gr (unsigned int gr)
2088 unw_rec_list *ptr = alloc_record (bsp_gr);
2089 ptr->r.record.p.r.gr = gr;
2090 return ptr;
2093 static unw_rec_list *
2094 output_bsp_psprel (unsigned int offset)
2096 unw_rec_list *ptr = alloc_record (bsp_psprel);
2097 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
2098 return ptr;
2101 static unw_rec_list *
2102 output_bsp_sprel (unsigned int offset)
2104 unw_rec_list *ptr = alloc_record (bsp_sprel);
2105 ptr->r.record.p.off.sp = offset / 4;
2106 return ptr;
2109 static unw_rec_list *
2110 output_bspstore_when (void)
2112 unw_rec_list *ptr = alloc_record (bspstore_when);
2113 return ptr;
2116 static unw_rec_list *
2117 output_bspstore_gr (unsigned int gr)
2119 unw_rec_list *ptr = alloc_record (bspstore_gr);
2120 ptr->r.record.p.r.gr = gr;
2121 return ptr;
2124 static unw_rec_list *
2125 output_bspstore_psprel (unsigned int offset)
2127 unw_rec_list *ptr = alloc_record (bspstore_psprel);
2128 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
2129 return ptr;
2132 static unw_rec_list *
2133 output_bspstore_sprel (unsigned int offset)
2135 unw_rec_list *ptr = alloc_record (bspstore_sprel);
2136 ptr->r.record.p.off.sp = offset / 4;
2137 return ptr;
2140 static unw_rec_list *
2141 output_rnat_when (void)
2143 unw_rec_list *ptr = alloc_record (rnat_when);
2144 return ptr;
2147 static unw_rec_list *
2148 output_rnat_gr (unsigned int gr)
2150 unw_rec_list *ptr = alloc_record (rnat_gr);
2151 ptr->r.record.p.r.gr = gr;
2152 return ptr;
2155 static unw_rec_list *
2156 output_rnat_psprel (unsigned int offset)
2158 unw_rec_list *ptr = alloc_record (rnat_psprel);
2159 ptr->r.record.p.off.psp = ENCODED_PSP_OFFSET (offset);
2160 return ptr;
2163 static unw_rec_list *
2164 output_rnat_sprel (unsigned int offset)
2166 unw_rec_list *ptr = alloc_record (rnat_sprel);
2167 ptr->r.record.p.off.sp = offset / 4;
2168 return ptr;
2171 static unw_rec_list *
2172 output_unwabi (unsigned long abi, unsigned long context)
2174 unw_rec_list *ptr = alloc_record (unwabi);
2175 ptr->r.record.p.abi = abi;
2176 ptr->r.record.p.context = context;
2177 return ptr;
2180 static unw_rec_list *
2181 output_epilogue (unsigned long ecount)
2183 unw_rec_list *ptr = alloc_record (epilogue);
2184 ptr->r.record.b.ecount = ecount;
2185 return ptr;
2188 static unw_rec_list *
2189 output_label_state (unsigned long label)
2191 unw_rec_list *ptr = alloc_record (label_state);
2192 ptr->r.record.b.label = label;
2193 return ptr;
2196 static unw_rec_list *
2197 output_copy_state (unsigned long label)
2199 unw_rec_list *ptr = alloc_record (copy_state);
2200 ptr->r.record.b.label = label;
2201 return ptr;
2204 static unw_rec_list *
2205 output_spill_psprel (unsigned int ab,
2206 unsigned int reg,
2207 unsigned int offset,
2208 unsigned int predicate)
2210 unw_rec_list *ptr = alloc_record (predicate ? spill_psprel_p : spill_psprel);
2211 ptr->r.record.x.ab = ab;
2212 ptr->r.record.x.reg = reg;
2213 ptr->r.record.x.where.pspoff = ENCODED_PSP_OFFSET (offset);
2214 ptr->r.record.x.qp = predicate;
2215 return ptr;
2218 static unw_rec_list *
2219 output_spill_sprel (unsigned int ab,
2220 unsigned int reg,
2221 unsigned int offset,
2222 unsigned int predicate)
2224 unw_rec_list *ptr = alloc_record (predicate ? spill_sprel_p : spill_sprel);
2225 ptr->r.record.x.ab = ab;
2226 ptr->r.record.x.reg = reg;
2227 ptr->r.record.x.where.spoff = offset / 4;
2228 ptr->r.record.x.qp = predicate;
2229 return ptr;
2232 static unw_rec_list *
2233 output_spill_reg (unsigned int ab,
2234 unsigned int reg,
2235 unsigned int targ_reg,
2236 unsigned int xy,
2237 unsigned int predicate)
2239 unw_rec_list *ptr = alloc_record (predicate ? spill_reg_p : spill_reg);
2240 ptr->r.record.x.ab = ab;
2241 ptr->r.record.x.reg = reg;
2242 ptr->r.record.x.where.reg = targ_reg;
2243 ptr->r.record.x.xy = xy;
2244 ptr->r.record.x.qp = predicate;
2245 return ptr;
2248 /* Given a unw_rec_list process the correct format with the
2249 specified function. */
2251 static void
2252 process_one_record (unw_rec_list *ptr, vbyte_func f)
2254 unsigned int fr_mask, gr_mask;
2256 switch (ptr->r.type)
2258 /* This is a dummy record that takes up no space in the output. */
2259 case endp:
2260 break;
2262 case gr_mem:
2263 case fr_mem:
2264 case br_mem:
2265 case frgr_mem:
2266 /* These are taken care of by prologue/prologue_gr. */
2267 break;
2269 case prologue_gr:
2270 case prologue:
2271 if (ptr->r.type == prologue_gr)
2272 output_R2_format (f, ptr->r.record.r.grmask,
2273 ptr->r.record.r.grsave, ptr->r.record.r.rlen);
2274 else
2275 output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2277 /* Output descriptor(s) for union of register spills (if any). */
2278 gr_mask = ptr->r.record.r.mask.gr_mem;
2279 fr_mask = ptr->r.record.r.mask.fr_mem;
2280 if (fr_mask)
2282 if ((fr_mask & ~0xfUL) == 0)
2283 output_P6_format (f, fr_mem, fr_mask);
2284 else
2286 output_P5_format (f, gr_mask, fr_mask);
2287 gr_mask = 0;
2290 if (gr_mask)
2291 output_P6_format (f, gr_mem, gr_mask);
2292 if (ptr->r.record.r.mask.br_mem)
2293 output_P1_format (f, ptr->r.record.r.mask.br_mem);
2295 /* output imask descriptor if necessary: */
2296 if (ptr->r.record.r.mask.i)
2297 output_P4_format (f, ptr->r.record.r.mask.i,
2298 ptr->r.record.r.imask_size);
2299 break;
2301 case body:
2302 output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2303 break;
2304 case mem_stack_f:
2305 case mem_stack_v:
2306 output_P7_format (f, ptr->r.type, ptr->r.record.p.t,
2307 ptr->r.record.p.size);
2308 break;
2309 case psp_gr:
2310 case rp_gr:
2311 case pfs_gr:
2312 case preds_gr:
2313 case unat_gr:
2314 case lc_gr:
2315 case fpsr_gr:
2316 case priunat_gr:
2317 case bsp_gr:
2318 case bspstore_gr:
2319 case rnat_gr:
2320 output_P3_format (f, ptr->r.type, ptr->r.record.p.r.gr);
2321 break;
2322 case rp_br:
2323 output_P3_format (f, rp_br, ptr->r.record.p.r.br);
2324 break;
2325 case psp_sprel:
2326 output_P7_format (f, psp_sprel, ptr->r.record.p.off.sp, 0);
2327 break;
2328 case rp_when:
2329 case pfs_when:
2330 case preds_when:
2331 case unat_when:
2332 case lc_when:
2333 case fpsr_when:
2334 output_P7_format (f, ptr->r.type, ptr->r.record.p.t, 0);
2335 break;
2336 case rp_psprel:
2337 case pfs_psprel:
2338 case preds_psprel:
2339 case unat_psprel:
2340 case lc_psprel:
2341 case fpsr_psprel:
2342 case spill_base:
2343 output_P7_format (f, ptr->r.type, ptr->r.record.p.off.psp, 0);
2344 break;
2345 case rp_sprel:
2346 case pfs_sprel:
2347 case preds_sprel:
2348 case unat_sprel:
2349 case lc_sprel:
2350 case fpsr_sprel:
2351 case priunat_sprel:
2352 case bsp_sprel:
2353 case bspstore_sprel:
2354 case rnat_sprel:
2355 output_P8_format (f, ptr->r.type, ptr->r.record.p.off.sp);
2356 break;
2357 case gr_gr:
2358 if (ptr->r.record.p.r.gr < REG_NUM)
2360 const unw_rec_list *cur = ptr;
2362 gr_mask = cur->r.record.p.grmask;
2363 while ((cur = cur->r.record.p.next) != NULL)
2364 gr_mask |= cur->r.record.p.grmask;
2365 output_P9_format (f, gr_mask, ptr->r.record.p.r.gr);
2367 break;
2368 case br_gr:
2369 if (ptr->r.record.p.r.gr < REG_NUM)
2371 const unw_rec_list *cur = ptr;
2373 gr_mask = cur->r.record.p.brmask;
2374 while ((cur = cur->r.record.p.next) != NULL)
2375 gr_mask |= cur->r.record.p.brmask;
2376 output_P2_format (f, gr_mask, ptr->r.record.p.r.gr);
2378 break;
2379 case spill_mask:
2380 as_bad (_("spill_mask record unimplemented."));
2381 break;
2382 case priunat_when_gr:
2383 case priunat_when_mem:
2384 case bsp_when:
2385 case bspstore_when:
2386 case rnat_when:
2387 output_P8_format (f, ptr->r.type, ptr->r.record.p.t);
2388 break;
2389 case priunat_psprel:
2390 case bsp_psprel:
2391 case bspstore_psprel:
2392 case rnat_psprel:
2393 output_P8_format (f, ptr->r.type, ptr->r.record.p.off.psp);
2394 break;
2395 case unwabi:
2396 output_P10_format (f, ptr->r.record.p.abi, ptr->r.record.p.context);
2397 break;
2398 case epilogue:
2399 output_B3_format (f, ptr->r.record.b.ecount, ptr->r.record.b.t);
2400 break;
2401 case label_state:
2402 case copy_state:
2403 output_B4_format (f, ptr->r.type, ptr->r.record.b.label);
2404 break;
2405 case spill_psprel:
2406 output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2407 ptr->r.record.x.reg, ptr->r.record.x.t,
2408 ptr->r.record.x.where.pspoff);
2409 break;
2410 case spill_sprel:
2411 output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2412 ptr->r.record.x.reg, ptr->r.record.x.t,
2413 ptr->r.record.x.where.spoff);
2414 break;
2415 case spill_reg:
2416 output_X2_format (f, ptr->r.record.x.ab, ptr->r.record.x.reg,
2417 ptr->r.record.x.xy >> 1, ptr->r.record.x.xy,
2418 ptr->r.record.x.where.reg, ptr->r.record.x.t);
2419 break;
2420 case spill_psprel_p:
2421 output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2422 ptr->r.record.x.ab, ptr->r.record.x.reg,
2423 ptr->r.record.x.t, ptr->r.record.x.where.pspoff);
2424 break;
2425 case spill_sprel_p:
2426 output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2427 ptr->r.record.x.ab, ptr->r.record.x.reg,
2428 ptr->r.record.x.t, ptr->r.record.x.where.spoff);
2429 break;
2430 case spill_reg_p:
2431 output_X4_format (f, ptr->r.record.x.qp, ptr->r.record.x.ab,
2432 ptr->r.record.x.reg, ptr->r.record.x.xy >> 1,
2433 ptr->r.record.x.xy, ptr->r.record.x.where.reg,
2434 ptr->r.record.x.t);
2435 break;
2436 default:
2437 as_bad (_("record_type_not_valid"));
2438 break;
2442 /* Given a unw_rec_list list, process all the records with
2443 the specified function. */
2444 static void
2445 process_unw_records (unw_rec_list *list, vbyte_func f)
2447 unw_rec_list *ptr;
2448 for (ptr = list; ptr; ptr = ptr->next)
2449 process_one_record (ptr, f);
2452 /* Determine the size of a record list in bytes. */
2453 static int
2454 calc_record_size (unw_rec_list *list)
2456 vbyte_count = 0;
2457 process_unw_records (list, count_output);
2458 return vbyte_count;
2461 /* Return the number of bits set in the input value.
2462 Perhaps this has a better place... */
2463 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
2464 # define popcount __builtin_popcount
2465 #else
2466 static int
2467 popcount (unsigned x)
2469 static const unsigned char popcnt[16] =
2471 0, 1, 1, 2,
2472 1, 2, 2, 3,
2473 1, 2, 2, 3,
2474 2, 3, 3, 4
2477 if (x < NELEMS (popcnt))
2478 return popcnt[x];
2479 return popcnt[x % NELEMS (popcnt)] + popcount (x / NELEMS (popcnt));
2481 #endif
2483 /* Update IMASK bitmask to reflect the fact that one or more registers
2484 of type TYPE are saved starting at instruction with index T. If N
2485 bits are set in REGMASK, it is assumed that instructions T through
2486 T+N-1 save these registers.
2488 TYPE values:
2489 0: no save
2490 1: instruction saves next fp reg
2491 2: instruction saves next general reg
2492 3: instruction saves next branch reg */
2493 static void
2494 set_imask (unw_rec_list *region,
2495 unsigned long regmask,
2496 unsigned long t,
2497 unsigned int type)
2499 unsigned char *imask;
2500 unsigned long imask_size;
2501 unsigned int i;
2502 int pos;
2504 imask = region->r.record.r.mask.i;
2505 imask_size = region->r.record.r.imask_size;
2506 if (!imask)
2508 imask_size = (region->r.record.r.rlen * 2 + 7) / 8 + 1;
2509 imask = xmalloc (imask_size);
2510 memset (imask, 0, imask_size);
2512 region->r.record.r.imask_size = imask_size;
2513 region->r.record.r.mask.i = imask;
2516 i = (t / 4) + 1;
2517 pos = 2 * (3 - t % 4);
2518 while (regmask)
2520 if (i >= imask_size)
2522 as_bad (_("Ignoring attempt to spill beyond end of region"));
2523 return;
2526 imask[i] |= (type & 0x3) << pos;
2528 regmask &= (regmask - 1);
2529 pos -= 2;
2530 if (pos < 0)
2532 pos = 0;
2533 ++i;
2538 /* Return the number of instruction slots from FIRST_ADDR to SLOT_ADDR.
2539 SLOT_FRAG is the frag containing SLOT_ADDR, and FIRST_FRAG is the frag
2540 containing FIRST_ADDR. If BEFORE_RELAX, then we use worst-case estimates
2541 for frag sizes. */
2543 static unsigned long
2544 slot_index (unsigned long slot_addr,
2545 fragS *slot_frag,
2546 unsigned long first_addr,
2547 fragS *first_frag,
2548 int before_relax)
2550 unsigned long index = 0;
2552 /* First time we are called, the initial address and frag are invalid. */
2553 if (first_addr == 0)
2554 return 0;
2556 /* If the two addresses are in different frags, then we need to add in
2557 the remaining size of this frag, and then the entire size of intermediate
2558 frags. */
2559 while (slot_frag != first_frag)
2561 unsigned long start_addr = (unsigned long) &first_frag->fr_literal;
2563 if (! before_relax)
2565 /* We can get the final addresses only during and after
2566 relaxation. */
2567 if (first_frag->fr_next && first_frag->fr_next->fr_address)
2568 index += 3 * ((first_frag->fr_next->fr_address
2569 - first_frag->fr_address
2570 - first_frag->fr_fix) >> 4);
2572 else
2573 /* We don't know what the final addresses will be. We try our
2574 best to estimate. */
2575 switch (first_frag->fr_type)
2577 default:
2578 break;
2580 case rs_space:
2581 as_fatal (_("Only constant space allocation is supported"));
2582 break;
2584 case rs_align:
2585 case rs_align_code:
2586 case rs_align_test:
2587 /* Take alignment into account. Assume the worst case
2588 before relaxation. */
2589 index += 3 * ((1 << first_frag->fr_offset) >> 4);
2590 break;
2592 case rs_org:
2593 if (first_frag->fr_symbol)
2595 as_fatal (_("Only constant offsets are supported"));
2596 break;
2598 case rs_fill:
2599 index += 3 * (first_frag->fr_offset >> 4);
2600 break;
2603 /* Add in the full size of the frag converted to instruction slots. */
2604 index += 3 * (first_frag->fr_fix >> 4);
2605 /* Subtract away the initial part before first_addr. */
2606 index -= (3 * ((first_addr >> 4) - (start_addr >> 4))
2607 + ((first_addr & 0x3) - (start_addr & 0x3)));
2609 /* Move to the beginning of the next frag. */
2610 first_frag = first_frag->fr_next;
2611 first_addr = (unsigned long) &first_frag->fr_literal;
2613 /* This can happen if there is section switching in the middle of a
2614 function, causing the frag chain for the function to be broken.
2615 It is too difficult to recover safely from this problem, so we just
2616 exit with an error. */
2617 if (first_frag == NULL)
2618 as_fatal (_("Section switching in code is not supported."));
2621 /* Add in the used part of the last frag. */
2622 index += (3 * ((slot_addr >> 4) - (first_addr >> 4))
2623 + ((slot_addr & 0x3) - (first_addr & 0x3)));
2624 return index;
2627 /* Optimize unwind record directives. */
2629 static unw_rec_list *
2630 optimize_unw_records (unw_rec_list *list)
2632 if (!list)
2633 return NULL;
2635 /* If the only unwind record is ".prologue" or ".prologue" followed
2636 by ".body", then we can optimize the unwind directives away. */
2637 if (list->r.type == prologue
2638 && (list->next->r.type == endp
2639 || (list->next->r.type == body && list->next->next->r.type == endp)))
2640 return NULL;
2642 return list;
2645 /* Given a complete record list, process any records which have
2646 unresolved fields, (ie length counts for a prologue). After
2647 this has been run, all necessary information should be available
2648 within each record to generate an image. */
2650 static void
2651 fixup_unw_records (unw_rec_list *list, int before_relax)
2653 unw_rec_list *ptr, *region = 0;
2654 unsigned long first_addr = 0, rlen = 0, t;
2655 fragS *first_frag = 0;
2657 for (ptr = list; ptr; ptr = ptr->next)
2659 if (ptr->slot_number == SLOT_NUM_NOT_SET)
2660 as_bad (_(" Insn slot not set in unwind record."));
2661 t = slot_index (ptr->slot_number, ptr->slot_frag,
2662 first_addr, first_frag, before_relax);
2663 switch (ptr->r.type)
2665 case prologue:
2666 case prologue_gr:
2667 case body:
2669 unw_rec_list *last;
2670 int size;
2671 unsigned long last_addr = 0;
2672 fragS *last_frag = NULL;
2674 first_addr = ptr->slot_number;
2675 first_frag = ptr->slot_frag;
2676 /* Find either the next body/prologue start, or the end of
2677 the function, and determine the size of the region. */
2678 for (last = ptr->next; last != NULL; last = last->next)
2679 if (last->r.type == prologue || last->r.type == prologue_gr
2680 || last->r.type == body || last->r.type == endp)
2682 last_addr = last->slot_number;
2683 last_frag = last->slot_frag;
2684 break;
2686 size = slot_index (last_addr, last_frag, first_addr, first_frag,
2687 before_relax);
2688 rlen = ptr->r.record.r.rlen = size;
2689 if (ptr->r.type == body)
2690 /* End of region. */
2691 region = 0;
2692 else
2693 region = ptr;
2694 break;
2696 case epilogue:
2697 if (t < rlen)
2698 ptr->r.record.b.t = rlen - 1 - t;
2699 else
2700 /* This happens when a memory-stack-less procedure uses a
2701 ".restore sp" directive at the end of a region to pop
2702 the frame state. */
2703 ptr->r.record.b.t = 0;
2704 break;
2706 case mem_stack_f:
2707 case mem_stack_v:
2708 case rp_when:
2709 case pfs_when:
2710 case preds_when:
2711 case unat_when:
2712 case lc_when:
2713 case fpsr_when:
2714 case priunat_when_gr:
2715 case priunat_when_mem:
2716 case bsp_when:
2717 case bspstore_when:
2718 case rnat_when:
2719 ptr->r.record.p.t = t;
2720 break;
2722 case spill_reg:
2723 case spill_sprel:
2724 case spill_psprel:
2725 case spill_reg_p:
2726 case spill_sprel_p:
2727 case spill_psprel_p:
2728 ptr->r.record.x.t = t;
2729 break;
2731 case frgr_mem:
2732 if (!region)
2734 as_bad (_("frgr_mem record before region record!"));
2735 return;
2737 region->r.record.r.mask.fr_mem |= ptr->r.record.p.frmask;
2738 region->r.record.r.mask.gr_mem |= ptr->r.record.p.grmask;
2739 set_imask (region, ptr->r.record.p.frmask, t, 1);
2740 set_imask (region, ptr->r.record.p.grmask, t, 2);
2741 break;
2742 case fr_mem:
2743 if (!region)
2745 as_bad (_("fr_mem record before region record!"));
2746 return;
2748 region->r.record.r.mask.fr_mem |= ptr->r.record.p.frmask;
2749 set_imask (region, ptr->r.record.p.frmask, t, 1);
2750 break;
2751 case gr_mem:
2752 if (!region)
2754 as_bad (_("gr_mem record before region record!"));
2755 return;
2757 region->r.record.r.mask.gr_mem |= ptr->r.record.p.grmask;
2758 set_imask (region, ptr->r.record.p.grmask, t, 2);
2759 break;
2760 case br_mem:
2761 if (!region)
2763 as_bad (_("br_mem record before region record!"));
2764 return;
2766 region->r.record.r.mask.br_mem |= ptr->r.record.p.brmask;
2767 set_imask (region, ptr->r.record.p.brmask, t, 3);
2768 break;
2770 case gr_gr:
2771 if (!region)
2773 as_bad (_("gr_gr record before region record!"));
2774 return;
2776 set_imask (region, ptr->r.record.p.grmask, t, 2);
2777 break;
2778 case br_gr:
2779 if (!region)
2781 as_bad (_("br_gr record before region record!"));
2782 return;
2784 set_imask (region, ptr->r.record.p.brmask, t, 3);
2785 break;
2787 default:
2788 break;
2793 /* Estimate the size of a frag before relaxing. We only have one type of frag
2794 to handle here, which is the unwind info frag. */
2797 ia64_estimate_size_before_relax (fragS *frag,
2798 asection *segtype ATTRIBUTE_UNUSED)
2800 unw_rec_list *list;
2801 int len, size, pad;
2803 /* ??? This code is identical to the first part of ia64_convert_frag. */
2804 list = (unw_rec_list *) frag->fr_opcode;
2805 fixup_unw_records (list, 0);
2807 len = calc_record_size (list);
2808 /* pad to pointer-size boundary. */
2809 pad = len % md.pointer_size;
2810 if (pad != 0)
2811 len += md.pointer_size - pad;
2812 /* Add 8 for the header. */
2813 size = len + 8;
2814 /* Add a pointer for the personality offset. */
2815 if (frag->fr_offset)
2816 size += md.pointer_size;
2818 /* fr_var carries the max_chars that we created the fragment with.
2819 We must, of course, have allocated enough memory earlier. */
2820 gas_assert (frag->fr_var >= size);
2822 return frag->fr_fix + size;
2825 /* This function converts a rs_machine_dependent variant frag into a
2826 normal fill frag with the unwind image from the the record list. */
2827 void
2828 ia64_convert_frag (fragS *frag)
2830 unw_rec_list *list;
2831 int len, size, pad;
2832 valueT flag_value;
2834 /* ??? This code is identical to ia64_estimate_size_before_relax. */
2835 list = (unw_rec_list *) frag->fr_opcode;
2836 fixup_unw_records (list, 0);
2838 len = calc_record_size (list);
2839 /* pad to pointer-size boundary. */
2840 pad = len % md.pointer_size;
2841 if (pad != 0)
2842 len += md.pointer_size - pad;
2843 /* Add 8 for the header. */
2844 size = len + 8;
2845 /* Add a pointer for the personality offset. */
2846 if (frag->fr_offset)
2847 size += md.pointer_size;
2849 /* fr_var carries the max_chars that we created the fragment with.
2850 We must, of course, have allocated enough memory earlier. */
2851 gas_assert (frag->fr_var >= size);
2853 /* Initialize the header area. fr_offset is initialized with
2854 unwind.personality_routine. */
2855 if (frag->fr_offset)
2857 if (md.flags & EF_IA_64_ABI64)
2858 flag_value = (bfd_vma) 3 << 32;
2859 else
2860 /* 32-bit unwind info block. */
2861 flag_value = (bfd_vma) 0x1003 << 32;
2863 else
2864 flag_value = 0;
2866 md_number_to_chars (frag->fr_literal,
2867 (((bfd_vma) 1 << 48) /* Version. */
2868 | flag_value /* U & E handler flags. */
2869 | (len / md.pointer_size)), /* Length. */
2872 /* Skip the header. */
2873 vbyte_mem_ptr = frag->fr_literal + 8;
2874 process_unw_records (list, output_vbyte_mem);
2876 /* Fill the padding bytes with zeros. */
2877 if (pad != 0)
2878 md_number_to_chars (frag->fr_literal + len + 8 - md.pointer_size + pad, 0,
2879 md.pointer_size - pad);
2880 /* Fill the unwind personality with zeros. */
2881 if (frag->fr_offset)
2882 md_number_to_chars (frag->fr_literal + size - md.pointer_size, 0,
2883 md.pointer_size);
2885 frag->fr_fix += size;
2886 frag->fr_type = rs_fill;
2887 frag->fr_var = 0;
2888 frag->fr_offset = 0;
2891 static int
2892 parse_predicate_and_operand (expressionS *e, unsigned *qp, const char *po)
2894 int sep = parse_operand (e, ',');
2896 *qp = e->X_add_number - REG_P;
2897 if (e->X_op != O_register || *qp > 63)
2899 as_bad (_("First operand to .%s must be a predicate"), po);
2900 *qp = 0;
2902 else if (*qp == 0)
2903 as_warn (_("Pointless use of p0 as first operand to .%s"), po);
2904 if (sep == ',')
2905 sep = parse_operand (e, ',');
2906 else
2907 e->X_op = O_absent;
2908 return sep;
2911 static void
2912 convert_expr_to_ab_reg (const expressionS *e,
2913 unsigned int *ab,
2914 unsigned int *regp,
2915 const char *po,
2916 int n)
2918 unsigned int reg = e->X_add_number;
2920 *ab = *regp = 0; /* Anything valid is good here. */
2922 if (e->X_op != O_register)
2923 reg = REG_GR; /* Anything invalid is good here. */
2925 if (reg >= (REG_GR + 4) && reg <= (REG_GR + 7))
2927 *ab = 0;
2928 *regp = reg - REG_GR;
2930 else if ((reg >= (REG_FR + 2) && reg <= (REG_FR + 5))
2931 || (reg >= (REG_FR + 16) && reg <= (REG_FR + 31)))
2933 *ab = 1;
2934 *regp = reg - REG_FR;
2936 else if (reg >= (REG_BR + 1) && reg <= (REG_BR + 5))
2938 *ab = 2;
2939 *regp = reg - REG_BR;
2941 else
2943 *ab = 3;
2944 switch (reg)
2946 case REG_PR: *regp = 0; break;
2947 case REG_PSP: *regp = 1; break;
2948 case REG_PRIUNAT: *regp = 2; break;
2949 case REG_BR + 0: *regp = 3; break;
2950 case REG_AR + AR_BSP: *regp = 4; break;
2951 case REG_AR + AR_BSPSTORE: *regp = 5; break;
2952 case REG_AR + AR_RNAT: *regp = 6; break;
2953 case REG_AR + AR_UNAT: *regp = 7; break;
2954 case REG_AR + AR_FPSR: *regp = 8; break;
2955 case REG_AR + AR_PFS: *regp = 9; break;
2956 case REG_AR + AR_LC: *regp = 10; break;
2958 default:
2959 as_bad (_("Operand %d to .%s must be a preserved register"), n, po);
2960 break;
2965 static void
2966 convert_expr_to_xy_reg (const expressionS *e,
2967 unsigned int *xy,
2968 unsigned int *regp,
2969 const char *po,
2970 int n)
2972 unsigned int reg = e->X_add_number;
2974 *xy = *regp = 0; /* Anything valid is good here. */
2976 if (e->X_op != O_register)
2977 reg = REG_GR; /* Anything invalid is good here. */
2979 if (reg >= (REG_GR + 1) && reg <= (REG_GR + 127))
2981 *xy = 0;
2982 *regp = reg - REG_GR;
2984 else if (reg >= (REG_FR + 2) && reg <= (REG_FR + 127))
2986 *xy = 1;
2987 *regp = reg - REG_FR;
2989 else if (reg >= REG_BR && reg <= (REG_BR + 7))
2991 *xy = 2;
2992 *regp = reg - REG_BR;
2994 else
2995 as_bad (_("Operand %d to .%s must be a writable register"), n, po);
2998 static void
2999 dot_align (int arg)
3001 /* The current frag is an alignment frag. */
3002 align_frag = frag_now;
3003 s_align_bytes (arg);
3006 static void
3007 dot_radix (int dummy ATTRIBUTE_UNUSED)
3009 char *radix;
3010 int ch;
3012 SKIP_WHITESPACE ();
3014 if (is_it_end_of_statement ())
3015 return;
3016 radix = input_line_pointer;
3017 ch = get_symbol_end ();
3018 ia64_canonicalize_symbol_name (radix);
3019 if (strcasecmp (radix, "C"))
3020 as_bad (_("Radix `%s' unsupported or invalid"), radix);
3021 *input_line_pointer = ch;
3022 demand_empty_rest_of_line ();
3025 /* Helper function for .loc directives. If the assembler is not generating
3026 line number info, then we need to remember which instructions have a .loc
3027 directive, and only call dwarf2_gen_line_info for those instructions. */
3029 static void
3030 dot_loc (int x)
3032 CURR_SLOT.loc_directive_seen = 1;
3033 dwarf2_directive_loc (x);
3036 /* .sbss, .bss etc. are macros that expand into ".section SECNAME". */
3037 static void
3038 dot_special_section (int which)
3040 set_section ((char *) special_section_name[which]);
3043 /* Return -1 for warning and 0 for error. */
3045 static int
3046 unwind_diagnostic (const char * region, const char *directive)
3048 if (md.unwind_check == unwind_check_warning)
3050 as_warn (_(".%s outside of %s"), directive, region);
3051 return -1;
3053 else
3055 as_bad (_(".%s outside of %s"), directive, region);
3056 ignore_rest_of_line ();
3057 return 0;
3061 /* Return 1 if a directive is in a procedure, -1 if a directive isn't in
3062 a procedure but the unwind directive check is set to warning, 0 if
3063 a directive isn't in a procedure and the unwind directive check is set
3064 to error. */
3066 static int
3067 in_procedure (const char *directive)
3069 if (unwind.proc_pending.sym
3070 && (!unwind.saved_text_seg || strcmp (directive, "endp") == 0))
3071 return 1;
3072 return unwind_diagnostic ("procedure", directive);
3075 /* Return 1 if a directive is in a prologue, -1 if a directive isn't in
3076 a prologue but the unwind directive check is set to warning, 0 if
3077 a directive isn't in a prologue and the unwind directive check is set
3078 to error. */
3080 static int
3081 in_prologue (const char *directive)
3083 int in = in_procedure (directive);
3085 if (in > 0 && !unwind.prologue)
3086 in = unwind_diagnostic ("prologue", directive);
3087 check_pending_save ();
3088 return in;
3091 /* Return 1 if a directive is in a body, -1 if a directive isn't in
3092 a body but the unwind directive check is set to warning, 0 if
3093 a directive isn't in a body and the unwind directive check is set
3094 to error. */
3096 static int
3097 in_body (const char *directive)
3099 int in = in_procedure (directive);
3101 if (in > 0 && !unwind.body)
3102 in = unwind_diagnostic ("body region", directive);
3103 return in;
3106 static void
3107 add_unwind_entry (unw_rec_list *ptr, int sep)
3109 if (ptr)
3111 if (unwind.tail)
3112 unwind.tail->next = ptr;
3113 else
3114 unwind.list = ptr;
3115 unwind.tail = ptr;
3117 /* The current entry can in fact be a chain of unwind entries. */
3118 if (unwind.current_entry == NULL)
3119 unwind.current_entry = ptr;
3122 /* The current entry can in fact be a chain of unwind entries. */
3123 if (unwind.current_entry == NULL)
3124 unwind.current_entry = ptr;
3126 if (sep == ',')
3128 /* Parse a tag permitted for the current directive. */
3129 int ch;
3131 SKIP_WHITESPACE ();
3132 ch = get_symbol_end ();
3133 /* FIXME: For now, just issue a warning that this isn't implemented. */
3135 static int warned;
3137 if (!warned)
3139 warned = 1;
3140 as_warn (_("Tags on unwind pseudo-ops aren't supported, yet"));
3143 *input_line_pointer = ch;
3145 if (sep != NOT_A_CHAR)
3146 demand_empty_rest_of_line ();
3149 static void
3150 dot_fframe (int dummy ATTRIBUTE_UNUSED)
3152 expressionS e;
3153 int sep;
3155 if (!in_prologue ("fframe"))
3156 return;
3158 sep = parse_operand (&e, ',');
3160 if (e.X_op != O_constant)
3162 as_bad (_("First operand to .fframe must be a constant"));
3163 e.X_add_number = 0;
3165 add_unwind_entry (output_mem_stack_f (e.X_add_number), sep);
3168 static void
3169 dot_vframe (int dummy ATTRIBUTE_UNUSED)
3171 expressionS e;
3172 unsigned reg;
3173 int sep;
3175 if (!in_prologue ("vframe"))
3176 return;
3178 sep = parse_operand (&e, ',');
3179 reg = e.X_add_number - REG_GR;
3180 if (e.X_op != O_register || reg > 127)
3182 as_bad (_("First operand to .vframe must be a general register"));
3183 reg = 0;
3185 add_unwind_entry (output_mem_stack_v (), sep);
3186 if (! (unwind.prologue_mask & 2))
3187 add_unwind_entry (output_psp_gr (reg), NOT_A_CHAR);
3188 else if (reg != unwind.prologue_gr
3189 + (unsigned) popcount (unwind.prologue_mask & (-2 << 1)))
3190 as_warn (_("Operand of .vframe contradicts .prologue"));
3193 static void
3194 dot_vframesp (int psp)
3196 expressionS e;
3197 int sep;
3199 if (psp)
3200 as_warn (_(".vframepsp is meaningless, assuming .vframesp was meant"));
3202 if (!in_prologue ("vframesp"))
3203 return;
3205 sep = parse_operand (&e, ',');
3206 if (e.X_op != O_constant)
3208 as_bad (_("Operand to .vframesp must be a constant (sp-relative offset)"));
3209 e.X_add_number = 0;
3211 add_unwind_entry (output_mem_stack_v (), sep);
3212 add_unwind_entry (output_psp_sprel (e.X_add_number), NOT_A_CHAR);
3215 static void
3216 dot_save (int dummy ATTRIBUTE_UNUSED)
3218 expressionS e1, e2;
3219 unsigned reg1, reg2;
3220 int sep;
3222 if (!in_prologue ("save"))
3223 return;
3225 sep = parse_operand (&e1, ',');
3226 if (sep == ',')
3227 sep = parse_operand (&e2, ',');
3228 else
3229 e2.X_op = O_absent;
3231 reg1 = e1.X_add_number;
3232 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3233 if (e1.X_op != O_register)
3235 as_bad (_("First operand to .save not a register"));
3236 reg1 = REG_PR; /* Anything valid is good here. */
3238 reg2 = e2.X_add_number - REG_GR;
3239 if (e2.X_op != O_register || reg2 > 127)
3241 as_bad (_("Second operand to .save not a valid register"));
3242 reg2 = 0;
3244 switch (reg1)
3246 case REG_AR + AR_BSP:
3247 add_unwind_entry (output_bsp_when (), sep);
3248 add_unwind_entry (output_bsp_gr (reg2), NOT_A_CHAR);
3249 break;
3250 case REG_AR + AR_BSPSTORE:
3251 add_unwind_entry (output_bspstore_when (), sep);
3252 add_unwind_entry (output_bspstore_gr (reg2), NOT_A_CHAR);
3253 break;
3254 case REG_AR + AR_RNAT:
3255 add_unwind_entry (output_rnat_when (), sep);
3256 add_unwind_entry (output_rnat_gr (reg2), NOT_A_CHAR);
3257 break;
3258 case REG_AR + AR_UNAT:
3259 add_unwind_entry (output_unat_when (), sep);
3260 add_unwind_entry (output_unat_gr (reg2), NOT_A_CHAR);
3261 break;
3262 case REG_AR + AR_FPSR:
3263 add_unwind_entry (output_fpsr_when (), sep);
3264 add_unwind_entry (output_fpsr_gr (reg2), NOT_A_CHAR);
3265 break;
3266 case REG_AR + AR_PFS:
3267 add_unwind_entry (output_pfs_when (), sep);
3268 if (! (unwind.prologue_mask & 4))
3269 add_unwind_entry (output_pfs_gr (reg2), NOT_A_CHAR);
3270 else if (reg2 != unwind.prologue_gr
3271 + (unsigned) popcount (unwind.prologue_mask & (-4 << 1)))
3272 as_warn (_("Second operand of .save contradicts .prologue"));
3273 break;
3274 case REG_AR + AR_LC:
3275 add_unwind_entry (output_lc_when (), sep);
3276 add_unwind_entry (output_lc_gr (reg2), NOT_A_CHAR);
3277 break;
3278 case REG_BR:
3279 add_unwind_entry (output_rp_when (), sep);
3280 if (! (unwind.prologue_mask & 8))
3281 add_unwind_entry (output_rp_gr (reg2), NOT_A_CHAR);
3282 else if (reg2 != unwind.prologue_gr)
3283 as_warn (_("Second operand of .save contradicts .prologue"));
3284 break;
3285 case REG_PR:
3286 add_unwind_entry (output_preds_when (), sep);
3287 if (! (unwind.prologue_mask & 1))
3288 add_unwind_entry (output_preds_gr (reg2), NOT_A_CHAR);
3289 else if (reg2 != unwind.prologue_gr
3290 + (unsigned) popcount (unwind.prologue_mask & (-1 << 1)))
3291 as_warn (_("Second operand of .save contradicts .prologue"));
3292 break;
3293 case REG_PRIUNAT:
3294 add_unwind_entry (output_priunat_when_gr (), sep);
3295 add_unwind_entry (output_priunat_gr (reg2), NOT_A_CHAR);
3296 break;
3297 default:
3298 as_bad (_("First operand to .save not a valid register"));
3299 add_unwind_entry (NULL, sep);
3300 break;
3304 static void
3305 dot_restore (int dummy ATTRIBUTE_UNUSED)
3307 expressionS e1;
3308 unsigned long ecount; /* # of _additional_ regions to pop */
3309 int sep;
3311 if (!in_body ("restore"))
3312 return;
3314 sep = parse_operand (&e1, ',');
3315 if (e1.X_op != O_register || e1.X_add_number != REG_GR + 12)
3316 as_bad (_("First operand to .restore must be stack pointer (sp)"));
3318 if (sep == ',')
3320 expressionS e2;
3322 sep = parse_operand (&e2, ',');
3323 if (e2.X_op != O_constant || e2.X_add_number < 0)
3325 as_bad (_("Second operand to .restore must be a constant >= 0"));
3326 e2.X_add_number = 0;
3328 ecount = e2.X_add_number;
3330 else
3331 ecount = unwind.prologue_count - 1;
3333 if (ecount >= unwind.prologue_count)
3335 as_bad (_("Epilogue count of %lu exceeds number of nested prologues (%u)"),
3336 ecount + 1, unwind.prologue_count);
3337 ecount = 0;
3340 add_unwind_entry (output_epilogue (ecount), sep);
3342 if (ecount < unwind.prologue_count)
3343 unwind.prologue_count -= ecount + 1;
3344 else
3345 unwind.prologue_count = 0;
3348 static void
3349 dot_restorereg (int pred)
3351 unsigned int qp, ab, reg;
3352 expressionS e;
3353 int sep;
3354 const char * const po = pred ? "restorereg.p" : "restorereg";
3356 if (!in_procedure (po))
3357 return;
3359 if (pred)
3360 sep = parse_predicate_and_operand (&e, &qp, po);
3361 else
3363 sep = parse_operand (&e, ',');
3364 qp = 0;
3366 convert_expr_to_ab_reg (&e, &ab, &reg, po, 1 + pred);
3368 add_unwind_entry (output_spill_reg (ab, reg, 0, 0, qp), sep);
3371 static char *special_linkonce_name[] =
3373 ".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
3376 static void
3377 start_unwind_section (const segT text_seg, int sec_index)
3380 Use a slightly ugly scheme to derive the unwind section names from
3381 the text section name:
3383 text sect. unwind table sect.
3384 name: name: comments:
3385 ---------- ----------------- --------------------------------
3386 .text .IA_64.unwind
3387 .text.foo .IA_64.unwind.text.foo
3388 .foo .IA_64.unwind.foo
3389 .gnu.linkonce.t.foo
3390 .gnu.linkonce.ia64unw.foo
3391 _info .IA_64.unwind_info gas issues error message (ditto)
3392 _infoFOO .IA_64.unwind_infoFOO gas issues error message (ditto)
3394 This mapping is done so that:
3396 (a) An object file with unwind info only in .text will use
3397 unwind section names .IA_64.unwind and .IA_64.unwind_info.
3398 This follows the letter of the ABI and also ensures backwards
3399 compatibility with older toolchains.
3401 (b) An object file with unwind info in multiple text sections
3402 will use separate unwind sections for each text section.
3403 This allows us to properly set the "sh_info" and "sh_link"
3404 fields in SHT_IA_64_UNWIND as required by the ABI and also
3405 lets GNU ld support programs with multiple segments
3406 containing unwind info (as might be the case for certain
3407 embedded applications).
3409 (c) An error is issued if there would be a name clash.
3412 const char *text_name, *sec_text_name;
3413 char *sec_name;
3414 const char *prefix = special_section_name [sec_index];
3415 const char *suffix;
3416 size_t prefix_len, suffix_len, sec_name_len;
3418 sec_text_name = segment_name (text_seg);
3419 text_name = sec_text_name;
3420 if (strncmp (text_name, "_info", 5) == 0)
3422 as_bad (_("Illegal section name `%s' (causes unwind section name clash)"),
3423 text_name);
3424 ignore_rest_of_line ();
3425 return;
3427 if (strcmp (text_name, ".text") == 0)
3428 text_name = "";
3430 /* Build the unwind section name by appending the (possibly stripped)
3431 text section name to the unwind prefix. */
3432 suffix = text_name;
3433 if (strncmp (text_name, ".gnu.linkonce.t.",
3434 sizeof (".gnu.linkonce.t.") - 1) == 0)
3436 prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND];
3437 suffix += sizeof (".gnu.linkonce.t.") - 1;
3440 prefix_len = strlen (prefix);
3441 suffix_len = strlen (suffix);
3442 sec_name_len = prefix_len + suffix_len;
3443 sec_name = alloca (sec_name_len + 1);
3444 memcpy (sec_name, prefix, prefix_len);
3445 memcpy (sec_name + prefix_len, suffix, suffix_len);
3446 sec_name [sec_name_len] = '\0';
3448 /* Handle COMDAT group. */
3449 if ((text_seg->flags & SEC_LINK_ONCE) != 0
3450 && (elf_section_flags (text_seg) & SHF_GROUP) != 0)
3452 char *section;
3453 size_t len, group_name_len;
3454 const char *group_name = elf_group_name (text_seg);
3456 if (group_name == NULL)
3458 as_bad (_("Group section `%s' has no group signature"),
3459 sec_text_name);
3460 ignore_rest_of_line ();
3461 return;
3463 /* We have to construct a fake section directive. */
3464 group_name_len = strlen (group_name);
3465 len = (sec_name_len
3466 + 16 /* ,"aG",@progbits, */
3467 + group_name_len /* ,group_name */
3468 + 7); /* ,comdat */
3470 section = alloca (len + 1);
3471 memcpy (section, sec_name, sec_name_len);
3472 memcpy (section + sec_name_len, ",\"aG\",@progbits,", 16);
3473 memcpy (section + sec_name_len + 16, group_name, group_name_len);
3474 memcpy (section + len - 7, ",comdat", 7);
3475 section [len] = '\0';
3476 set_section (section);
3478 else
3480 set_section (sec_name);
3481 bfd_set_section_flags (stdoutput, now_seg,
3482 SEC_LOAD | SEC_ALLOC | SEC_READONLY);
3485 elf_linked_to_section (now_seg) = text_seg;
3488 static void
3489 generate_unwind_image (const segT text_seg)
3491 int size, pad;
3492 unw_rec_list *list;
3494 /* Mark the end of the unwind info, so that we can compute the size of the
3495 last unwind region. */
3496 add_unwind_entry (output_endp (), NOT_A_CHAR);
3498 /* Force out pending instructions, to make sure all unwind records have
3499 a valid slot_number field. */
3500 ia64_flush_insns ();
3502 /* Generate the unwind record. */
3503 list = optimize_unw_records (unwind.list);
3504 fixup_unw_records (list, 1);
3505 size = calc_record_size (list);
3507 if (size > 0 || unwind.force_unwind_entry)
3509 unwind.force_unwind_entry = 0;
3510 /* pad to pointer-size boundary. */
3511 pad = size % md.pointer_size;
3512 if (pad != 0)
3513 size += md.pointer_size - pad;
3514 /* Add 8 for the header. */
3515 size += 8;
3516 /* Add a pointer for the personality offset. */
3517 if (unwind.personality_routine)
3518 size += md.pointer_size;
3521 /* If there are unwind records, switch sections, and output the info. */
3522 if (size != 0)
3524 expressionS exp;
3525 bfd_reloc_code_real_type reloc;
3527 start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO);
3529 /* Make sure the section has 4 byte alignment for ILP32 and
3530 8 byte alignment for LP64. */
3531 frag_align (md.pointer_size_shift, 0, 0);
3532 record_alignment (now_seg, md.pointer_size_shift);
3534 /* Set expression which points to start of unwind descriptor area. */
3535 unwind.info = expr_build_dot ();
3537 frag_var (rs_machine_dependent, size, size, 0, 0,
3538 (offsetT) (long) unwind.personality_routine,
3539 (char *) list);
3541 /* Add the personality address to the image. */
3542 if (unwind.personality_routine != 0)
3544 exp.X_op = O_symbol;
3545 exp.X_add_symbol = unwind.personality_routine;
3546 exp.X_add_number = 0;
3548 if (md.flags & EF_IA_64_BE)
3550 if (md.flags & EF_IA_64_ABI64)
3551 reloc = BFD_RELOC_IA64_LTOFF_FPTR64MSB;
3552 else
3553 reloc = BFD_RELOC_IA64_LTOFF_FPTR32MSB;
3555 else
3557 if (md.flags & EF_IA_64_ABI64)
3558 reloc = BFD_RELOC_IA64_LTOFF_FPTR64LSB;
3559 else
3560 reloc = BFD_RELOC_IA64_LTOFF_FPTR32LSB;
3563 fix_new_exp (frag_now, frag_now_fix () - md.pointer_size,
3564 md.pointer_size, &exp, 0, reloc);
3565 unwind.personality_routine = 0;
3569 free_saved_prologue_counts ();
3570 unwind.list = unwind.tail = unwind.current_entry = NULL;
3573 static void
3574 dot_handlerdata (int dummy ATTRIBUTE_UNUSED)
3576 if (!in_procedure ("handlerdata"))
3577 return;
3578 unwind.force_unwind_entry = 1;
3580 /* Remember which segment we're in so we can switch back after .endp */
3581 unwind.saved_text_seg = now_seg;
3582 unwind.saved_text_subseg = now_subseg;
3584 /* Generate unwind info into unwind-info section and then leave that
3585 section as the currently active one so dataXX directives go into
3586 the language specific data area of the unwind info block. */
3587 generate_unwind_image (now_seg);
3588 demand_empty_rest_of_line ();
3591 static void
3592 dot_unwentry (int dummy ATTRIBUTE_UNUSED)
3594 if (!in_procedure ("unwentry"))
3595 return;
3596 unwind.force_unwind_entry = 1;
3597 demand_empty_rest_of_line ();
3600 static void
3601 dot_altrp (int dummy ATTRIBUTE_UNUSED)
3603 expressionS e;
3604 unsigned reg;
3606 if (!in_prologue ("altrp"))
3607 return;
3609 parse_operand (&e, 0);
3610 reg = e.X_add_number - REG_BR;
3611 if (e.X_op != O_register || reg > 7)
3613 as_bad (_("First operand to .altrp not a valid branch register"));
3614 reg = 0;
3616 add_unwind_entry (output_rp_br (reg), 0);
3619 static void
3620 dot_savemem (int psprel)
3622 expressionS e1, e2;
3623 int sep;
3624 int reg1, val;
3625 const char * const po = psprel ? "savepsp" : "savesp";
3627 if (!in_prologue (po))
3628 return;
3630 sep = parse_operand (&e1, ',');
3631 if (sep == ',')
3632 sep = parse_operand (&e2, ',');
3633 else
3634 e2.X_op = O_absent;
3636 reg1 = e1.X_add_number;
3637 val = e2.X_add_number;
3639 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3640 if (e1.X_op != O_register)
3642 as_bad (_("First operand to .%s not a register"), po);
3643 reg1 = REG_PR; /* Anything valid is good here. */
3645 if (e2.X_op != O_constant)
3647 as_bad (_("Second operand to .%s not a constant"), po);
3648 val = 0;
3651 switch (reg1)
3653 case REG_AR + AR_BSP:
3654 add_unwind_entry (output_bsp_when (), sep);
3655 add_unwind_entry ((psprel
3656 ? output_bsp_psprel
3657 : output_bsp_sprel) (val), NOT_A_CHAR);
3658 break;
3659 case REG_AR + AR_BSPSTORE:
3660 add_unwind_entry (output_bspstore_when (), sep);
3661 add_unwind_entry ((psprel
3662 ? output_bspstore_psprel
3663 : output_bspstore_sprel) (val), NOT_A_CHAR);
3664 break;
3665 case REG_AR + AR_RNAT:
3666 add_unwind_entry (output_rnat_when (), sep);
3667 add_unwind_entry ((psprel
3668 ? output_rnat_psprel
3669 : output_rnat_sprel) (val), NOT_A_CHAR);
3670 break;
3671 case REG_AR + AR_UNAT:
3672 add_unwind_entry (output_unat_when (), sep);
3673 add_unwind_entry ((psprel
3674 ? output_unat_psprel
3675 : output_unat_sprel) (val), NOT_A_CHAR);
3676 break;
3677 case REG_AR + AR_FPSR:
3678 add_unwind_entry (output_fpsr_when (), sep);
3679 add_unwind_entry ((psprel
3680 ? output_fpsr_psprel
3681 : output_fpsr_sprel) (val), NOT_A_CHAR);
3682 break;
3683 case REG_AR + AR_PFS:
3684 add_unwind_entry (output_pfs_when (), sep);
3685 add_unwind_entry ((psprel
3686 ? output_pfs_psprel
3687 : output_pfs_sprel) (val), NOT_A_CHAR);
3688 break;
3689 case REG_AR + AR_LC:
3690 add_unwind_entry (output_lc_when (), sep);
3691 add_unwind_entry ((psprel
3692 ? output_lc_psprel
3693 : output_lc_sprel) (val), NOT_A_CHAR);
3694 break;
3695 case REG_BR:
3696 add_unwind_entry (output_rp_when (), sep);
3697 add_unwind_entry ((psprel
3698 ? output_rp_psprel
3699 : output_rp_sprel) (val), NOT_A_CHAR);
3700 break;
3701 case REG_PR:
3702 add_unwind_entry (output_preds_when (), sep);
3703 add_unwind_entry ((psprel
3704 ? output_preds_psprel
3705 : output_preds_sprel) (val), NOT_A_CHAR);
3706 break;
3707 case REG_PRIUNAT:
3708 add_unwind_entry (output_priunat_when_mem (), sep);
3709 add_unwind_entry ((psprel
3710 ? output_priunat_psprel
3711 : output_priunat_sprel) (val), NOT_A_CHAR);
3712 break;
3713 default:
3714 as_bad (_("First operand to .%s not a valid register"), po);
3715 add_unwind_entry (NULL, sep);
3716 break;
3720 static void
3721 dot_saveg (int dummy ATTRIBUTE_UNUSED)
3723 expressionS e;
3724 unsigned grmask;
3725 int sep;
3727 if (!in_prologue ("save.g"))
3728 return;
3730 sep = parse_operand (&e, ',');
3732 grmask = e.X_add_number;
3733 if (e.X_op != O_constant
3734 || e.X_add_number <= 0
3735 || e.X_add_number > 0xf)
3737 as_bad (_("First operand to .save.g must be a positive 4-bit constant"));
3738 grmask = 0;
3741 if (sep == ',')
3743 unsigned reg;
3744 int n = popcount (grmask);
3746 parse_operand (&e, 0);
3747 reg = e.X_add_number - REG_GR;
3748 if (e.X_op != O_register || reg > 127)
3750 as_bad (_("Second operand to .save.g must be a general register"));
3751 reg = 0;
3753 else if (reg > 128U - n)
3755 as_bad (_("Second operand to .save.g must be the first of %d general registers"), n);
3756 reg = 0;
3758 add_unwind_entry (output_gr_gr (grmask, reg), 0);
3760 else
3761 add_unwind_entry (output_gr_mem (grmask), 0);
3764 static void
3765 dot_savef (int dummy ATTRIBUTE_UNUSED)
3767 expressionS e;
3769 if (!in_prologue ("save.f"))
3770 return;
3772 parse_operand (&e, 0);
3774 if (e.X_op != O_constant
3775 || e.X_add_number <= 0
3776 || e.X_add_number > 0xfffff)
3778 as_bad (_("Operand to .save.f must be a positive 20-bit constant"));
3779 e.X_add_number = 0;
3781 add_unwind_entry (output_fr_mem (e.X_add_number), 0);
3784 static void
3785 dot_saveb (int dummy ATTRIBUTE_UNUSED)
3787 expressionS e;
3788 unsigned brmask;
3789 int sep;
3791 if (!in_prologue ("save.b"))
3792 return;
3794 sep = parse_operand (&e, ',');
3796 brmask = e.X_add_number;
3797 if (e.X_op != O_constant
3798 || e.X_add_number <= 0
3799 || e.X_add_number > 0x1f)
3801 as_bad (_("First operand to .save.b must be a positive 5-bit constant"));
3802 brmask = 0;
3805 if (sep == ',')
3807 unsigned reg;
3808 int n = popcount (brmask);
3810 parse_operand (&e, 0);
3811 reg = e.X_add_number - REG_GR;
3812 if (e.X_op != O_register || reg > 127)
3814 as_bad (_("Second operand to .save.b must be a general register"));
3815 reg = 0;
3817 else if (reg > 128U - n)
3819 as_bad (_("Second operand to .save.b must be the first of %d general registers"), n);
3820 reg = 0;
3822 add_unwind_entry (output_br_gr (brmask, reg), 0);
3824 else
3825 add_unwind_entry (output_br_mem (brmask), 0);
3828 static void
3829 dot_savegf (int dummy ATTRIBUTE_UNUSED)
3831 expressionS e1, e2;
3833 if (!in_prologue ("save.gf"))
3834 return;
3836 if (parse_operand (&e1, ',') == ',')
3837 parse_operand (&e2, 0);
3838 else
3839 e2.X_op = O_absent;
3841 if (e1.X_op != O_constant
3842 || e1.X_add_number < 0
3843 || e1.X_add_number > 0xf)
3845 as_bad (_("First operand to .save.gf must be a non-negative 4-bit constant"));
3846 e1.X_op = O_absent;
3847 e1.X_add_number = 0;
3849 if (e2.X_op != O_constant
3850 || e2.X_add_number < 0
3851 || e2.X_add_number > 0xfffff)
3853 as_bad (_("Second operand to .save.gf must be a non-negative 20-bit constant"));
3854 e2.X_op = O_absent;
3855 e2.X_add_number = 0;
3857 if (e1.X_op == O_constant
3858 && e2.X_op == O_constant
3859 && e1.X_add_number == 0
3860 && e2.X_add_number == 0)
3861 as_bad (_("Operands to .save.gf may not be both zero"));
3863 add_unwind_entry (output_frgr_mem (e1.X_add_number, e2.X_add_number), 0);
3866 static void
3867 dot_spill (int dummy ATTRIBUTE_UNUSED)
3869 expressionS e;
3871 if (!in_prologue ("spill"))
3872 return;
3874 parse_operand (&e, 0);
3876 if (e.X_op != O_constant)
3878 as_bad (_("Operand to .spill must be a constant"));
3879 e.X_add_number = 0;
3881 add_unwind_entry (output_spill_base (e.X_add_number), 0);
3884 static void
3885 dot_spillreg (int pred)
3887 int sep;
3888 unsigned int qp, ab, xy, reg, treg;
3889 expressionS e;
3890 const char * const po = pred ? "spillreg.p" : "spillreg";
3892 if (!in_procedure (po))
3893 return;
3895 if (pred)
3896 sep = parse_predicate_and_operand (&e, &qp, po);
3897 else
3899 sep = parse_operand (&e, ',');
3900 qp = 0;
3902 convert_expr_to_ab_reg (&e, &ab, &reg, po, 1 + pred);
3904 if (sep == ',')
3905 sep = parse_operand (&e, ',');
3906 else
3907 e.X_op = O_absent;
3908 convert_expr_to_xy_reg (&e, &xy, &treg, po, 2 + pred);
3910 add_unwind_entry (output_spill_reg (ab, reg, treg, xy, qp), sep);
3913 static void
3914 dot_spillmem (int psprel)
3916 expressionS e;
3917 int pred = (psprel < 0), sep;
3918 unsigned int qp, ab, reg;
3919 const char * po;
3921 if (pred)
3923 psprel = ~psprel;
3924 po = psprel ? "spillpsp.p" : "spillsp.p";
3926 else
3927 po = psprel ? "spillpsp" : "spillsp";
3929 if (!in_procedure (po))
3930 return;
3932 if (pred)
3933 sep = parse_predicate_and_operand (&e, &qp, po);
3934 else
3936 sep = parse_operand (&e, ',');
3937 qp = 0;
3939 convert_expr_to_ab_reg (&e, &ab, &reg, po, 1 + pred);
3941 if (sep == ',')
3942 sep = parse_operand (&e, ',');
3943 else
3944 e.X_op = O_absent;
3945 if (e.X_op != O_constant)
3947 as_bad (_("Operand %d to .%s must be a constant"), 2 + pred, po);
3948 e.X_add_number = 0;
3951 if (psprel)
3952 add_unwind_entry (output_spill_psprel (ab, reg, e.X_add_number, qp), sep);
3953 else
3954 add_unwind_entry (output_spill_sprel (ab, reg, e.X_add_number, qp), sep);
3957 static unsigned int
3958 get_saved_prologue_count (unsigned long lbl)
3960 label_prologue_count *lpc = unwind.saved_prologue_counts;
3962 while (lpc != NULL && lpc->label_number != lbl)
3963 lpc = lpc->next;
3965 if (lpc != NULL)
3966 return lpc->prologue_count;
3968 as_bad (_("Missing .label_state %ld"), lbl);
3969 return 1;
3972 static void
3973 save_prologue_count (unsigned long lbl, unsigned int count)
3975 label_prologue_count *lpc = unwind.saved_prologue_counts;
3977 while (lpc != NULL && lpc->label_number != lbl)
3978 lpc = lpc->next;
3980 if (lpc != NULL)
3981 lpc->prologue_count = count;
3982 else
3984 label_prologue_count *new_lpc = xmalloc (sizeof (* new_lpc));
3986 new_lpc->next = unwind.saved_prologue_counts;
3987 new_lpc->label_number = lbl;
3988 new_lpc->prologue_count = count;
3989 unwind.saved_prologue_counts = new_lpc;
3993 static void
3994 free_saved_prologue_counts ()
3996 label_prologue_count *lpc = unwind.saved_prologue_counts;
3997 label_prologue_count *next;
3999 while (lpc != NULL)
4001 next = lpc->next;
4002 free (lpc);
4003 lpc = next;
4006 unwind.saved_prologue_counts = NULL;
4009 static void
4010 dot_label_state (int dummy ATTRIBUTE_UNUSED)
4012 expressionS e;
4014 if (!in_body ("label_state"))
4015 return;
4017 parse_operand (&e, 0);
4018 if (e.X_op == O_constant)
4019 save_prologue_count (e.X_add_number, unwind.prologue_count);
4020 else
4022 as_bad (_("Operand to .label_state must be a constant"));
4023 e.X_add_number = 0;
4025 add_unwind_entry (output_label_state (e.X_add_number), 0);
4028 static void
4029 dot_copy_state (int dummy ATTRIBUTE_UNUSED)
4031 expressionS e;
4033 if (!in_body ("copy_state"))
4034 return;
4036 parse_operand (&e, 0);
4037 if (e.X_op == O_constant)
4038 unwind.prologue_count = get_saved_prologue_count (e.X_add_number);
4039 else
4041 as_bad (_("Operand to .copy_state must be a constant"));
4042 e.X_add_number = 0;
4044 add_unwind_entry (output_copy_state (e.X_add_number), 0);
4047 static void
4048 dot_unwabi (int dummy ATTRIBUTE_UNUSED)
4050 expressionS e1, e2;
4051 unsigned char sep;
4053 if (!in_prologue ("unwabi"))
4054 return;
4056 sep = parse_operand (&e1, ',');
4057 if (sep == ',')
4058 parse_operand (&e2, 0);
4059 else
4060 e2.X_op = O_absent;
4062 if (e1.X_op != O_constant)
4064 as_bad (_("First operand to .unwabi must be a constant"));
4065 e1.X_add_number = 0;
4068 if (e2.X_op != O_constant)
4070 as_bad (_("Second operand to .unwabi must be a constant"));
4071 e2.X_add_number = 0;
4074 add_unwind_entry (output_unwabi (e1.X_add_number, e2.X_add_number), 0);
4077 static void
4078 dot_personality (int dummy ATTRIBUTE_UNUSED)
4080 char *name, *p, c;
4081 if (!in_procedure ("personality"))
4082 return;
4083 SKIP_WHITESPACE ();
4084 name = input_line_pointer;
4085 c = get_symbol_end ();
4086 p = input_line_pointer;
4087 unwind.personality_routine = symbol_find_or_make (name);
4088 unwind.force_unwind_entry = 1;
4089 *p = c;
4090 SKIP_WHITESPACE ();
4091 demand_empty_rest_of_line ();
4094 static void
4095 dot_proc (int dummy ATTRIBUTE_UNUSED)
4097 char *name, *p, c;
4098 symbolS *sym;
4099 proc_pending *pending, *last_pending;
4101 if (unwind.proc_pending.sym)
4103 (md.unwind_check == unwind_check_warning
4104 ? as_warn
4105 : as_bad) (_("Missing .endp after previous .proc"));
4106 while (unwind.proc_pending.next)
4108 pending = unwind.proc_pending.next;
4109 unwind.proc_pending.next = pending->next;
4110 free (pending);
4113 last_pending = NULL;
4115 /* Parse names of main and alternate entry points and mark them as
4116 function symbols: */
4117 while (1)
4119 SKIP_WHITESPACE ();
4120 name = input_line_pointer;
4121 c = get_symbol_end ();
4122 p = input_line_pointer;
4123 if (!*name)
4124 as_bad (_("Empty argument of .proc"));
4125 else
4127 sym = symbol_find_or_make (name);
4128 if (S_IS_DEFINED (sym))
4129 as_bad (_("`%s' was already defined"), name);
4130 else if (!last_pending)
4132 unwind.proc_pending.sym = sym;
4133 last_pending = &unwind.proc_pending;
4135 else
4137 pending = xmalloc (sizeof (*pending));
4138 pending->sym = sym;
4139 last_pending = last_pending->next = pending;
4141 symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
4143 *p = c;
4144 SKIP_WHITESPACE ();
4145 if (*input_line_pointer != ',')
4146 break;
4147 ++input_line_pointer;
4149 if (!last_pending)
4151 unwind.proc_pending.sym = expr_build_dot ();
4152 last_pending = &unwind.proc_pending;
4154 last_pending->next = NULL;
4155 demand_empty_rest_of_line ();
4156 ia64_do_align (16);
4158 unwind.prologue = 0;
4159 unwind.prologue_count = 0;
4160 unwind.body = 0;
4161 unwind.insn = 0;
4162 unwind.list = unwind.tail = unwind.current_entry = NULL;
4163 unwind.personality_routine = 0;
4166 static void
4167 dot_body (int dummy ATTRIBUTE_UNUSED)
4169 if (!in_procedure ("body"))
4170 return;
4171 if (!unwind.prologue && !unwind.body && unwind.insn)
4172 as_warn (_("Initial .body should precede any instructions"));
4173 check_pending_save ();
4175 unwind.prologue = 0;
4176 unwind.prologue_mask = 0;
4177 unwind.body = 1;
4179 add_unwind_entry (output_body (), 0);
4182 static void
4183 dot_prologue (int dummy ATTRIBUTE_UNUSED)
4185 unsigned mask = 0, grsave = 0;
4187 if (!in_procedure ("prologue"))
4188 return;
4189 if (unwind.prologue)
4191 as_bad (_(".prologue within prologue"));
4192 ignore_rest_of_line ();
4193 return;
4195 if (!unwind.body && unwind.insn)
4196 as_warn (_("Initial .prologue should precede any instructions"));
4198 if (!is_it_end_of_statement ())
4200 expressionS e;
4201 int n, sep = parse_operand (&e, ',');
4203 if (e.X_op != O_constant
4204 || e.X_add_number < 0
4205 || e.X_add_number > 0xf)
4206 as_bad (_("First operand to .prologue must be a positive 4-bit constant"));
4207 else if (e.X_add_number == 0)
4208 as_warn (_("Pointless use of zero first operand to .prologue"));
4209 else
4210 mask = e.X_add_number;
4211 n = popcount (mask);
4213 if (sep == ',')
4214 parse_operand (&e, 0);
4215 else
4216 e.X_op = O_absent;
4217 if (e.X_op == O_constant
4218 && e.X_add_number >= 0
4219 && e.X_add_number < 128)
4221 if (md.unwind_check == unwind_check_error)
4222 as_warn (_("Using a constant as second operand to .prologue is deprecated"));
4223 grsave = e.X_add_number;
4225 else if (e.X_op != O_register
4226 || (grsave = e.X_add_number - REG_GR) > 127)
4228 as_bad (_("Second operand to .prologue must be a general register"));
4229 grsave = 0;
4231 else if (grsave > 128U - n)
4233 as_bad (_("Second operand to .prologue must be the first of %d general registers"), n);
4234 grsave = 0;
4239 if (mask)
4240 add_unwind_entry (output_prologue_gr (mask, grsave), 0);
4241 else
4242 add_unwind_entry (output_prologue (), 0);
4244 unwind.prologue = 1;
4245 unwind.prologue_mask = mask;
4246 unwind.prologue_gr = grsave;
4247 unwind.body = 0;
4248 ++unwind.prologue_count;
4251 static void
4252 dot_endp (int dummy ATTRIBUTE_UNUSED)
4254 expressionS e;
4255 int bytes_per_address;
4256 long where;
4257 segT saved_seg;
4258 subsegT saved_subseg;
4259 proc_pending *pending;
4260 int unwind_check = md.unwind_check;
4262 md.unwind_check = unwind_check_error;
4263 if (!in_procedure ("endp"))
4264 return;
4265 md.unwind_check = unwind_check;
4267 if (unwind.saved_text_seg)
4269 saved_seg = unwind.saved_text_seg;
4270 saved_subseg = unwind.saved_text_subseg;
4271 unwind.saved_text_seg = NULL;
4273 else
4275 saved_seg = now_seg;
4276 saved_subseg = now_subseg;
4279 insn_group_break (1, 0, 0);
4281 /* If there wasn't a .handlerdata, we haven't generated an image yet. */
4282 if (!unwind.info)
4283 generate_unwind_image (saved_seg);
4285 if (unwind.info || unwind.force_unwind_entry)
4287 symbolS *proc_end;
4289 subseg_set (md.last_text_seg, 0);
4290 proc_end = expr_build_dot ();
4292 start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND);
4294 /* Make sure that section has 4 byte alignment for ILP32 and
4295 8 byte alignment for LP64. */
4296 record_alignment (now_seg, md.pointer_size_shift);
4298 /* Need space for 3 pointers for procedure start, procedure end,
4299 and unwind info. */
4300 memset (frag_more (3 * md.pointer_size), 0, 3 * md.pointer_size);
4301 where = frag_now_fix () - (3 * md.pointer_size);
4302 bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
4304 /* Issue the values of a) Proc Begin, b) Proc End, c) Unwind Record. */
4305 e.X_op = O_pseudo_fixup;
4306 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4307 e.X_add_number = 0;
4308 if (!S_IS_LOCAL (unwind.proc_pending.sym)
4309 && S_IS_DEFINED (unwind.proc_pending.sym))
4310 e.X_add_symbol = symbol_temp_new (S_GET_SEGMENT (unwind.proc_pending.sym),
4311 S_GET_VALUE (unwind.proc_pending.sym),
4312 symbol_get_frag (unwind.proc_pending.sym));
4313 else
4314 e.X_add_symbol = unwind.proc_pending.sym;
4315 ia64_cons_fix_new (frag_now, where, bytes_per_address, &e);
4317 e.X_op = O_pseudo_fixup;
4318 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4319 e.X_add_number = 0;
4320 e.X_add_symbol = proc_end;
4321 ia64_cons_fix_new (frag_now, where + bytes_per_address,
4322 bytes_per_address, &e);
4324 if (unwind.info)
4326 e.X_op = O_pseudo_fixup;
4327 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4328 e.X_add_number = 0;
4329 e.X_add_symbol = unwind.info;
4330 ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2),
4331 bytes_per_address, &e);
4334 subseg_set (saved_seg, saved_subseg);
4336 /* Set symbol sizes. */
4337 pending = &unwind.proc_pending;
4338 if (S_GET_NAME (pending->sym))
4342 symbolS *sym = pending->sym;
4344 if (!S_IS_DEFINED (sym))
4345 as_bad (_("`%s' was not defined within procedure"), S_GET_NAME (sym));
4346 else if (S_GET_SIZE (sym) == 0
4347 && symbol_get_obj (sym)->size == NULL)
4349 fragS *frag = symbol_get_frag (sym);
4351 if (frag)
4353 if (frag == frag_now && SEG_NORMAL (now_seg))
4354 S_SET_SIZE (sym, frag_now_fix () - S_GET_VALUE (sym));
4355 else
4357 symbol_get_obj (sym)->size =
4358 (expressionS *) xmalloc (sizeof (expressionS));
4359 symbol_get_obj (sym)->size->X_op = O_subtract;
4360 symbol_get_obj (sym)->size->X_add_symbol
4361 = symbol_new (FAKE_LABEL_NAME, now_seg,
4362 frag_now_fix (), frag_now);
4363 symbol_get_obj (sym)->size->X_op_symbol = sym;
4364 symbol_get_obj (sym)->size->X_add_number = 0;
4368 } while ((pending = pending->next) != NULL);
4371 /* Parse names of main and alternate entry points. */
4372 while (1)
4374 char *name, *p, c;
4376 SKIP_WHITESPACE ();
4377 name = input_line_pointer;
4378 c = get_symbol_end ();
4379 p = input_line_pointer;
4380 if (!*name)
4381 (md.unwind_check == unwind_check_warning
4382 ? as_warn
4383 : as_bad) (_("Empty argument of .endp"));
4384 else
4386 symbolS *sym = symbol_find (name);
4388 for (pending = &unwind.proc_pending; pending; pending = pending->next)
4390 if (sym == pending->sym)
4392 pending->sym = NULL;
4393 break;
4396 if (!sym || !pending)
4397 as_warn (_("`%s' was not specified with previous .proc"), name);
4399 *p = c;
4400 SKIP_WHITESPACE ();
4401 if (*input_line_pointer != ',')
4402 break;
4403 ++input_line_pointer;
4405 demand_empty_rest_of_line ();
4407 /* Deliberately only checking for the main entry point here; the
4408 language spec even says all arguments to .endp are ignored. */
4409 if (unwind.proc_pending.sym
4410 && S_GET_NAME (unwind.proc_pending.sym)
4411 && strcmp (S_GET_NAME (unwind.proc_pending.sym), FAKE_LABEL_NAME))
4412 as_warn (_("`%s' should be an operand to this .endp"),
4413 S_GET_NAME (unwind.proc_pending.sym));
4414 while (unwind.proc_pending.next)
4416 pending = unwind.proc_pending.next;
4417 unwind.proc_pending.next = pending->next;
4418 free (pending);
4420 unwind.proc_pending.sym = unwind.info = NULL;
4423 static void
4424 dot_template (int template)
4426 CURR_SLOT.user_template = template;
4429 static void
4430 dot_regstk (int dummy ATTRIBUTE_UNUSED)
4432 int ins, locs, outs, rots;
4434 if (is_it_end_of_statement ())
4435 ins = locs = outs = rots = 0;
4436 else
4438 ins = get_absolute_expression ();
4439 if (*input_line_pointer++ != ',')
4440 goto err;
4441 locs = get_absolute_expression ();
4442 if (*input_line_pointer++ != ',')
4443 goto err;
4444 outs = get_absolute_expression ();
4445 if (*input_line_pointer++ != ',')
4446 goto err;
4447 rots = get_absolute_expression ();
4449 set_regstack (ins, locs, outs, rots);
4450 return;
4452 err:
4453 as_bad (_("Comma expected"));
4454 ignore_rest_of_line ();
4457 static void
4458 dot_rot (int type)
4460 offsetT num_regs;
4461 valueT num_alloced = 0;
4462 struct dynreg **drpp, *dr;
4463 int ch, base_reg = 0;
4464 char *name, *start;
4465 size_t len;
4467 switch (type)
4469 case DYNREG_GR: base_reg = REG_GR + 32; break;
4470 case DYNREG_FR: base_reg = REG_FR + 32; break;
4471 case DYNREG_PR: base_reg = REG_P + 16; break;
4472 default: break;
4475 /* First, remove existing names from hash table. */
4476 for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
4478 hash_delete (md.dynreg_hash, dr->name, FALSE);
4479 /* FIXME: Free dr->name. */
4480 dr->num_regs = 0;
4483 drpp = &md.dynreg[type];
4484 while (1)
4486 start = input_line_pointer;
4487 ch = get_symbol_end ();
4488 len = strlen (ia64_canonicalize_symbol_name (start));
4489 *input_line_pointer = ch;
4491 SKIP_WHITESPACE ();
4492 if (*input_line_pointer != '[')
4494 as_bad (_("Expected '['"));
4495 goto err;
4497 ++input_line_pointer; /* skip '[' */
4499 num_regs = get_absolute_expression ();
4501 if (*input_line_pointer++ != ']')
4503 as_bad (_("Expected ']'"));
4504 goto err;
4506 if (num_regs <= 0)
4508 as_bad (_("Number of elements must be positive"));
4509 goto err;
4511 SKIP_WHITESPACE ();
4513 num_alloced += num_regs;
4514 switch (type)
4516 case DYNREG_GR:
4517 if (num_alloced > md.rot.num_regs)
4519 as_bad (_("Used more than the declared %d rotating registers"),
4520 md.rot.num_regs);
4521 goto err;
4523 break;
4524 case DYNREG_FR:
4525 if (num_alloced > 96)
4527 as_bad (_("Used more than the available 96 rotating registers"));
4528 goto err;
4530 break;
4531 case DYNREG_PR:
4532 if (num_alloced > 48)
4534 as_bad (_("Used more than the available 48 rotating registers"));
4535 goto err;
4537 break;
4539 default:
4540 break;
4543 if (!*drpp)
4545 *drpp = obstack_alloc (&notes, sizeof (*dr));
4546 memset (*drpp, 0, sizeof (*dr));
4549 name = obstack_alloc (&notes, len + 1);
4550 memcpy (name, start, len);
4551 name[len] = '\0';
4553 dr = *drpp;
4554 dr->name = name;
4555 dr->num_regs = num_regs;
4556 dr->base = base_reg;
4557 drpp = &dr->next;
4558 base_reg += num_regs;
4560 if (hash_insert (md.dynreg_hash, name, dr))
4562 as_bad (_("Attempt to redefine register set `%s'"), name);
4563 obstack_free (&notes, name);
4564 goto err;
4567 if (*input_line_pointer != ',')
4568 break;
4569 ++input_line_pointer; /* skip comma */
4570 SKIP_WHITESPACE ();
4572 demand_empty_rest_of_line ();
4573 return;
4575 err:
4576 ignore_rest_of_line ();
4579 static void
4580 dot_byteorder (int byteorder)
4582 segment_info_type *seginfo = seg_info (now_seg);
4584 if (byteorder == -1)
4586 if (seginfo->tc_segment_info_data.endian == 0)
4587 seginfo->tc_segment_info_data.endian = default_big_endian ? 1 : 2;
4588 byteorder = seginfo->tc_segment_info_data.endian == 1;
4590 else
4591 seginfo->tc_segment_info_data.endian = byteorder ? 1 : 2;
4593 if (target_big_endian != byteorder)
4595 target_big_endian = byteorder;
4596 if (target_big_endian)
4598 ia64_number_to_chars = number_to_chars_bigendian;
4599 ia64_float_to_chars = ia64_float_to_chars_bigendian;
4601 else
4603 ia64_number_to_chars = number_to_chars_littleendian;
4604 ia64_float_to_chars = ia64_float_to_chars_littleendian;
4609 static void
4610 dot_psr (int dummy ATTRIBUTE_UNUSED)
4612 char *option;
4613 int ch;
4615 while (1)
4617 option = input_line_pointer;
4618 ch = get_symbol_end ();
4619 if (strcmp (option, "lsb") == 0)
4620 md.flags &= ~EF_IA_64_BE;
4621 else if (strcmp (option, "msb") == 0)
4622 md.flags |= EF_IA_64_BE;
4623 else if (strcmp (option, "abi32") == 0)
4624 md.flags &= ~EF_IA_64_ABI64;
4625 else if (strcmp (option, "abi64") == 0)
4626 md.flags |= EF_IA_64_ABI64;
4627 else
4628 as_bad (_("Unknown psr option `%s'"), option);
4629 *input_line_pointer = ch;
4631 SKIP_WHITESPACE ();
4632 if (*input_line_pointer != ',')
4633 break;
4635 ++input_line_pointer;
4636 SKIP_WHITESPACE ();
4638 demand_empty_rest_of_line ();
4641 static void
4642 dot_ln (int dummy ATTRIBUTE_UNUSED)
4644 new_logical_line (0, get_absolute_expression ());
4645 demand_empty_rest_of_line ();
4648 static void
4649 cross_section (int ref, void (*cons) (int), int ua)
4651 char *start, *end;
4652 int saved_auto_align;
4653 unsigned int section_count;
4655 SKIP_WHITESPACE ();
4656 start = input_line_pointer;
4657 if (*start == '"')
4659 int len;
4660 char *name;
4662 name = demand_copy_C_string (&len);
4663 obstack_free(&notes, name);
4664 if (!name)
4666 ignore_rest_of_line ();
4667 return;
4670 else
4672 char c = get_symbol_end ();
4674 if (input_line_pointer == start)
4676 as_bad (_("Missing section name"));
4677 ignore_rest_of_line ();
4678 return;
4680 *input_line_pointer = c;
4682 end = input_line_pointer;
4683 SKIP_WHITESPACE ();
4684 if (*input_line_pointer != ',')
4686 as_bad (_("Comma expected after section name"));
4687 ignore_rest_of_line ();
4688 return;
4690 *end = '\0';
4691 end = input_line_pointer + 1; /* skip comma */
4692 input_line_pointer = start;
4693 md.keep_pending_output = 1;
4694 section_count = bfd_count_sections(stdoutput);
4695 obj_elf_section (0);
4696 if (section_count != bfd_count_sections(stdoutput))
4697 as_warn (_("Creating sections with .xdataN/.xrealN/.xstringZ is deprecated."));
4698 input_line_pointer = end;
4699 saved_auto_align = md.auto_align;
4700 if (ua)
4701 md.auto_align = 0;
4702 (*cons) (ref);
4703 if (ua)
4704 md.auto_align = saved_auto_align;
4705 obj_elf_previous (0);
4706 md.keep_pending_output = 0;
4709 static void
4710 dot_xdata (int size)
4712 cross_section (size, cons, 0);
4715 /* Why doesn't float_cons() call md_cons_align() the way cons() does? */
4717 static void
4718 stmt_float_cons (int kind)
4720 size_t alignment;
4722 switch (kind)
4724 case 'd':
4725 alignment = 8;
4726 break;
4728 case 'x':
4729 case 'X':
4730 alignment = 16;
4731 break;
4733 case 'f':
4734 default:
4735 alignment = 4;
4736 break;
4738 ia64_do_align (alignment);
4739 float_cons (kind);
4742 static void
4743 stmt_cons_ua (int size)
4745 int saved_auto_align = md.auto_align;
4747 md.auto_align = 0;
4748 cons (size);
4749 md.auto_align = saved_auto_align;
4752 static void
4753 dot_xfloat_cons (int kind)
4755 cross_section (kind, stmt_float_cons, 0);
4758 static void
4759 dot_xstringer (int zero)
4761 cross_section (zero, stringer, 0);
4764 static void
4765 dot_xdata_ua (int size)
4767 cross_section (size, cons, 1);
4770 static void
4771 dot_xfloat_cons_ua (int kind)
4773 cross_section (kind, float_cons, 1);
4776 /* .reg.val <regname>,value */
4778 static void
4779 dot_reg_val (int dummy ATTRIBUTE_UNUSED)
4781 expressionS reg;
4783 expression_and_evaluate (&reg);
4784 if (reg.X_op != O_register)
4786 as_bad (_("Register name expected"));
4787 ignore_rest_of_line ();
4789 else if (*input_line_pointer++ != ',')
4791 as_bad (_("Comma expected"));
4792 ignore_rest_of_line ();
4794 else
4796 valueT value = get_absolute_expression ();
4797 int regno = reg.X_add_number;
4798 if (regno <= REG_GR || regno > REG_GR + 127)
4799 as_warn (_("Register value annotation ignored"));
4800 else
4802 gr_values[regno - REG_GR].known = 1;
4803 gr_values[regno - REG_GR].value = value;
4804 gr_values[regno - REG_GR].path = md.path;
4807 demand_empty_rest_of_line ();
4811 .serialize.data
4812 .serialize.instruction
4814 static void
4815 dot_serialize (int type)
4817 insn_group_break (0, 0, 0);
4818 if (type)
4819 instruction_serialization ();
4820 else
4821 data_serialization ();
4822 insn_group_break (0, 0, 0);
4823 demand_empty_rest_of_line ();
4826 /* select dv checking mode
4827 .auto
4828 .explicit
4829 .default
4831 A stop is inserted when changing modes
4834 static void
4835 dot_dv_mode (int type)
4837 if (md.manual_bundling)
4838 as_warn (_("Directive invalid within a bundle"));
4840 if (type == 'E' || type == 'A')
4841 md.mode_explicitly_set = 0;
4842 else
4843 md.mode_explicitly_set = 1;
4845 md.detect_dv = 1;
4846 switch (type)
4848 case 'A':
4849 case 'a':
4850 if (md.explicit_mode)
4851 insn_group_break (1, 0, 0);
4852 md.explicit_mode = 0;
4853 break;
4854 case 'E':
4855 case 'e':
4856 if (!md.explicit_mode)
4857 insn_group_break (1, 0, 0);
4858 md.explicit_mode = 1;
4859 break;
4860 default:
4861 case 'd':
4862 if (md.explicit_mode != md.default_explicit_mode)
4863 insn_group_break (1, 0, 0);
4864 md.explicit_mode = md.default_explicit_mode;
4865 md.mode_explicitly_set = 0;
4866 break;
4870 static void
4871 print_prmask (valueT mask)
4873 int regno;
4874 char *comma = "";
4875 for (regno = 0; regno < 64; regno++)
4877 if (mask & ((valueT) 1 << regno))
4879 fprintf (stderr, "%s p%d", comma, regno);
4880 comma = ",";
4886 .pred.rel.clear [p1 [,p2 [,...]]] (also .pred.rel "clear" or @clear)
4887 .pred.rel.imply p1, p2 (also .pred.rel "imply" or @imply)
4888 .pred.rel.mutex p1, p2 [,...] (also .pred.rel "mutex" or @mutex)
4889 .pred.safe_across_calls p1 [, p2 [,...]]
4892 static void
4893 dot_pred_rel (int type)
4895 valueT mask = 0;
4896 int count = 0;
4897 int p1 = -1, p2 = -1;
4899 if (type == 0)
4901 if (*input_line_pointer == '"')
4903 int len;
4904 char *form = demand_copy_C_string (&len);
4906 if (strcmp (form, "mutex") == 0)
4907 type = 'm';
4908 else if (strcmp (form, "clear") == 0)
4909 type = 'c';
4910 else if (strcmp (form, "imply") == 0)
4911 type = 'i';
4912 obstack_free (&notes, form);
4914 else if (*input_line_pointer == '@')
4916 char *form = ++input_line_pointer;
4917 char c = get_symbol_end();
4919 if (strcmp (form, "mutex") == 0)
4920 type = 'm';
4921 else if (strcmp (form, "clear") == 0)
4922 type = 'c';
4923 else if (strcmp (form, "imply") == 0)
4924 type = 'i';
4925 *input_line_pointer = c;
4927 else
4929 as_bad (_("Missing predicate relation type"));
4930 ignore_rest_of_line ();
4931 return;
4933 if (type == 0)
4935 as_bad (_("Unrecognized predicate relation type"));
4936 ignore_rest_of_line ();
4937 return;
4939 if (*input_line_pointer == ',')
4940 ++input_line_pointer;
4941 SKIP_WHITESPACE ();
4944 while (1)
4946 valueT bits = 1;
4947 int sep, regno;
4948 expressionS pr, *pr1, *pr2;
4950 sep = parse_operand (&pr, ',');
4951 if (pr.X_op == O_register
4952 && pr.X_add_number >= REG_P
4953 && pr.X_add_number <= REG_P + 63)
4955 regno = pr.X_add_number - REG_P;
4956 bits <<= regno;
4957 count++;
4958 if (p1 == -1)
4959 p1 = regno;
4960 else if (p2 == -1)
4961 p2 = regno;
4963 else if (type != 'i'
4964 && pr.X_op == O_subtract
4965 && (pr1 = symbol_get_value_expression (pr.X_add_symbol))
4966 && pr1->X_op == O_register
4967 && pr1->X_add_number >= REG_P
4968 && pr1->X_add_number <= REG_P + 63
4969 && (pr2 = symbol_get_value_expression (pr.X_op_symbol))
4970 && pr2->X_op == O_register
4971 && pr2->X_add_number >= REG_P
4972 && pr2->X_add_number <= REG_P + 63)
4974 /* It's a range. */
4975 int stop;
4977 regno = pr1->X_add_number - REG_P;
4978 stop = pr2->X_add_number - REG_P;
4979 if (regno >= stop)
4981 as_bad (_("Bad register range"));
4982 ignore_rest_of_line ();
4983 return;
4985 bits = ((bits << stop) << 1) - (bits << regno);
4986 count += stop - regno + 1;
4988 else
4990 as_bad (_("Predicate register expected"));
4991 ignore_rest_of_line ();
4992 return;
4994 if (mask & bits)
4995 as_warn (_("Duplicate predicate register ignored"));
4996 mask |= bits;
4997 if (sep != ',')
4998 break;
5001 switch (type)
5003 case 'c':
5004 if (count == 0)
5005 mask = ~(valueT) 0;
5006 clear_qp_mutex (mask);
5007 clear_qp_implies (mask, (valueT) 0);
5008 break;
5009 case 'i':
5010 if (count != 2 || p1 == -1 || p2 == -1)
5011 as_bad (_("Predicate source and target required"));
5012 else if (p1 == 0 || p2 == 0)
5013 as_bad (_("Use of p0 is not valid in this context"));
5014 else
5015 add_qp_imply (p1, p2);
5016 break;
5017 case 'm':
5018 if (count < 2)
5020 as_bad (_("At least two PR arguments expected"));
5021 break;
5023 else if (mask & 1)
5025 as_bad (_("Use of p0 is not valid in this context"));
5026 break;
5028 add_qp_mutex (mask);
5029 break;
5030 case 's':
5031 /* note that we don't override any existing relations */
5032 if (count == 0)
5034 as_bad (_("At least one PR argument expected"));
5035 break;
5037 if (md.debug_dv)
5039 fprintf (stderr, "Safe across calls: ");
5040 print_prmask (mask);
5041 fprintf (stderr, "\n");
5043 qp_safe_across_calls = mask;
5044 break;
5046 demand_empty_rest_of_line ();
5049 /* .entry label [, label [, ...]]
5050 Hint to DV code that the given labels are to be considered entry points.
5051 Otherwise, only global labels are considered entry points. */
5053 static void
5054 dot_entry (int dummy ATTRIBUTE_UNUSED)
5056 const char *err;
5057 char *name;
5058 int c;
5059 symbolS *symbolP;
5063 name = input_line_pointer;
5064 c = get_symbol_end ();
5065 symbolP = symbol_find_or_make (name);
5067 err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (void *) symbolP);
5068 if (err)
5069 as_fatal (_("Inserting \"%s\" into entry hint table failed: %s"),
5070 name, err);
5072 *input_line_pointer = c;
5073 SKIP_WHITESPACE ();
5074 c = *input_line_pointer;
5075 if (c == ',')
5077 input_line_pointer++;
5078 SKIP_WHITESPACE ();
5079 if (*input_line_pointer == '\n')
5080 c = '\n';
5083 while (c == ',');
5085 demand_empty_rest_of_line ();
5088 /* .mem.offset offset, base
5089 "base" is used to distinguish between offsets from a different base. */
5091 static void
5092 dot_mem_offset (int dummy ATTRIBUTE_UNUSED)
5094 md.mem_offset.hint = 1;
5095 md.mem_offset.offset = get_absolute_expression ();
5096 if (*input_line_pointer != ',')
5098 as_bad (_("Comma expected"));
5099 ignore_rest_of_line ();
5100 return;
5102 ++input_line_pointer;
5103 md.mem_offset.base = get_absolute_expression ();
5104 demand_empty_rest_of_line ();
5107 /* ia64-specific pseudo-ops: */
5108 const pseudo_typeS md_pseudo_table[] =
5110 { "radix", dot_radix, 0 },
5111 { "lcomm", s_lcomm_bytes, 1 },
5112 { "loc", dot_loc, 0 },
5113 { "bss", dot_special_section, SPECIAL_SECTION_BSS },
5114 { "sbss", dot_special_section, SPECIAL_SECTION_SBSS },
5115 { "sdata", dot_special_section, SPECIAL_SECTION_SDATA },
5116 { "rodata", dot_special_section, SPECIAL_SECTION_RODATA },
5117 { "comment", dot_special_section, SPECIAL_SECTION_COMMENT },
5118 { "ia_64.unwind", dot_special_section, SPECIAL_SECTION_UNWIND },
5119 { "ia_64.unwind_info", dot_special_section, SPECIAL_SECTION_UNWIND_INFO },
5120 { "init_array", dot_special_section, SPECIAL_SECTION_INIT_ARRAY },
5121 { "fini_array", dot_special_section, SPECIAL_SECTION_FINI_ARRAY },
5122 { "proc", dot_proc, 0 },
5123 { "body", dot_body, 0 },
5124 { "prologue", dot_prologue, 0 },
5125 { "endp", dot_endp, 0 },
5127 { "fframe", dot_fframe, 0 },
5128 { "vframe", dot_vframe, 0 },
5129 { "vframesp", dot_vframesp, 0 },
5130 { "vframepsp", dot_vframesp, 1 },
5131 { "save", dot_save, 0 },
5132 { "restore", dot_restore, 0 },
5133 { "restorereg", dot_restorereg, 0 },
5134 { "restorereg.p", dot_restorereg, 1 },
5135 { "handlerdata", dot_handlerdata, 0 },
5136 { "unwentry", dot_unwentry, 0 },
5137 { "altrp", dot_altrp, 0 },
5138 { "savesp", dot_savemem, 0 },
5139 { "savepsp", dot_savemem, 1 },
5140 { "save.g", dot_saveg, 0 },
5141 { "save.f", dot_savef, 0 },
5142 { "save.b", dot_saveb, 0 },
5143 { "save.gf", dot_savegf, 0 },
5144 { "spill", dot_spill, 0 },
5145 { "spillreg", dot_spillreg, 0 },
5146 { "spillsp", dot_spillmem, 0 },
5147 { "spillpsp", dot_spillmem, 1 },
5148 { "spillreg.p", dot_spillreg, 1 },
5149 { "spillsp.p", dot_spillmem, ~0 },
5150 { "spillpsp.p", dot_spillmem, ~1 },
5151 { "label_state", dot_label_state, 0 },
5152 { "copy_state", dot_copy_state, 0 },
5153 { "unwabi", dot_unwabi, 0 },
5154 { "personality", dot_personality, 0 },
5155 { "mii", dot_template, 0x0 },
5156 { "mli", dot_template, 0x2 }, /* old format, for compatibility */
5157 { "mlx", dot_template, 0x2 },
5158 { "mmi", dot_template, 0x4 },
5159 { "mfi", dot_template, 0x6 },
5160 { "mmf", dot_template, 0x7 },
5161 { "mib", dot_template, 0x8 },
5162 { "mbb", dot_template, 0x9 },
5163 { "bbb", dot_template, 0xb },
5164 { "mmb", dot_template, 0xc },
5165 { "mfb", dot_template, 0xe },
5166 { "align", dot_align, 0 },
5167 { "regstk", dot_regstk, 0 },
5168 { "rotr", dot_rot, DYNREG_GR },
5169 { "rotf", dot_rot, DYNREG_FR },
5170 { "rotp", dot_rot, DYNREG_PR },
5171 { "lsb", dot_byteorder, 0 },
5172 { "msb", dot_byteorder, 1 },
5173 { "psr", dot_psr, 0 },
5174 { "alias", dot_alias, 0 },
5175 { "secalias", dot_alias, 1 },
5176 { "ln", dot_ln, 0 }, /* source line info (for debugging) */
5178 { "xdata1", dot_xdata, 1 },
5179 { "xdata2", dot_xdata, 2 },
5180 { "xdata4", dot_xdata, 4 },
5181 { "xdata8", dot_xdata, 8 },
5182 { "xdata16", dot_xdata, 16 },
5183 { "xreal4", dot_xfloat_cons, 'f' },
5184 { "xreal8", dot_xfloat_cons, 'd' },
5185 { "xreal10", dot_xfloat_cons, 'x' },
5186 { "xreal16", dot_xfloat_cons, 'X' },
5187 { "xstring", dot_xstringer, 8 + 0 },
5188 { "xstringz", dot_xstringer, 8 + 1 },
5190 /* unaligned versions: */
5191 { "xdata2.ua", dot_xdata_ua, 2 },
5192 { "xdata4.ua", dot_xdata_ua, 4 },
5193 { "xdata8.ua", dot_xdata_ua, 8 },
5194 { "xdata16.ua", dot_xdata_ua, 16 },
5195 { "xreal4.ua", dot_xfloat_cons_ua, 'f' },
5196 { "xreal8.ua", dot_xfloat_cons_ua, 'd' },
5197 { "xreal10.ua", dot_xfloat_cons_ua, 'x' },
5198 { "xreal16.ua", dot_xfloat_cons_ua, 'X' },
5200 /* annotations/DV checking support */
5201 { "entry", dot_entry, 0 },
5202 { "mem.offset", dot_mem_offset, 0 },
5203 { "pred.rel", dot_pred_rel, 0 },
5204 { "pred.rel.clear", dot_pred_rel, 'c' },
5205 { "pred.rel.imply", dot_pred_rel, 'i' },
5206 { "pred.rel.mutex", dot_pred_rel, 'm' },
5207 { "pred.safe_across_calls", dot_pred_rel, 's' },
5208 { "reg.val", dot_reg_val, 0 },
5209 { "serialize.data", dot_serialize, 0 },
5210 { "serialize.instruction", dot_serialize, 1 },
5211 { "auto", dot_dv_mode, 'a' },
5212 { "explicit", dot_dv_mode, 'e' },
5213 { "default", dot_dv_mode, 'd' },
5215 /* ??? These are needed to make gas/testsuite/gas/elf/ehopt.s work.
5216 IA-64 aligns data allocation pseudo-ops by default, so we have to
5217 tell it that these ones are supposed to be unaligned. Long term,
5218 should rewrite so that only IA-64 specific data allocation pseudo-ops
5219 are aligned by default. */
5220 {"2byte", stmt_cons_ua, 2},
5221 {"4byte", stmt_cons_ua, 4},
5222 {"8byte", stmt_cons_ua, 8},
5224 { NULL, 0, 0 }
5227 static const struct pseudo_opcode
5229 const char *name;
5230 void (*handler) (int);
5231 int arg;
5233 pseudo_opcode[] =
5235 /* these are more like pseudo-ops, but don't start with a dot */
5236 { "data1", cons, 1 },
5237 { "data2", cons, 2 },
5238 { "data4", cons, 4 },
5239 { "data8", cons, 8 },
5240 { "data16", cons, 16 },
5241 { "real4", stmt_float_cons, 'f' },
5242 { "real8", stmt_float_cons, 'd' },
5243 { "real10", stmt_float_cons, 'x' },
5244 { "real16", stmt_float_cons, 'X' },
5245 { "string", stringer, 8 + 0 },
5246 { "stringz", stringer, 8 + 1 },
5248 /* unaligned versions: */
5249 { "data2.ua", stmt_cons_ua, 2 },
5250 { "data4.ua", stmt_cons_ua, 4 },
5251 { "data8.ua", stmt_cons_ua, 8 },
5252 { "data16.ua", stmt_cons_ua, 16 },
5253 { "real4.ua", float_cons, 'f' },
5254 { "real8.ua", float_cons, 'd' },
5255 { "real10.ua", float_cons, 'x' },
5256 { "real16.ua", float_cons, 'X' },
5259 /* Declare a register by creating a symbol for it and entering it in
5260 the symbol table. */
5262 static symbolS *
5263 declare_register (const char *name, unsigned int regnum)
5265 const char *err;
5266 symbolS *sym;
5268 sym = symbol_create (name, reg_section, regnum, &zero_address_frag);
5270 err = hash_insert (md.reg_hash, S_GET_NAME (sym), (void *) sym);
5271 if (err)
5272 as_fatal ("Inserting \"%s\" into register table failed: %s",
5273 name, err);
5275 return sym;
5278 static void
5279 declare_register_set (const char *prefix,
5280 unsigned int num_regs,
5281 unsigned int base_regnum)
5283 char name[8];
5284 unsigned int i;
5286 for (i = 0; i < num_regs; ++i)
5288 snprintf (name, sizeof (name), "%s%u", prefix, i);
5289 declare_register (name, base_regnum + i);
5293 static unsigned int
5294 operand_width (enum ia64_opnd opnd)
5296 const struct ia64_operand *odesc = &elf64_ia64_operands[opnd];
5297 unsigned int bits = 0;
5298 int i;
5300 bits = 0;
5301 for (i = 0; i < NELEMS (odesc->field) && odesc->field[i].bits; ++i)
5302 bits += odesc->field[i].bits;
5304 return bits;
5307 static enum operand_match_result
5308 operand_match (const struct ia64_opcode *idesc, int index, expressionS *e)
5310 enum ia64_opnd opnd = idesc->operands[index];
5311 int bits, relocatable = 0;
5312 struct insn_fix *fix;
5313 bfd_signed_vma val;
5315 switch (opnd)
5317 /* constants: */
5319 case IA64_OPND_AR_CCV:
5320 if (e->X_op == O_register && e->X_add_number == REG_AR + 32)
5321 return OPERAND_MATCH;
5322 break;
5324 case IA64_OPND_AR_CSD:
5325 if (e->X_op == O_register && e->X_add_number == REG_AR + 25)
5326 return OPERAND_MATCH;
5327 break;
5329 case IA64_OPND_AR_PFS:
5330 if (e->X_op == O_register && e->X_add_number == REG_AR + 64)
5331 return OPERAND_MATCH;
5332 break;
5334 case IA64_OPND_GR0:
5335 if (e->X_op == O_register && e->X_add_number == REG_GR + 0)
5336 return OPERAND_MATCH;
5337 break;
5339 case IA64_OPND_IP:
5340 if (e->X_op == O_register && e->X_add_number == REG_IP)
5341 return OPERAND_MATCH;
5342 break;
5344 case IA64_OPND_PR:
5345 if (e->X_op == O_register && e->X_add_number == REG_PR)
5346 return OPERAND_MATCH;
5347 break;
5349 case IA64_OPND_PR_ROT:
5350 if (e->X_op == O_register && e->X_add_number == REG_PR_ROT)
5351 return OPERAND_MATCH;
5352 break;
5354 case IA64_OPND_PSR:
5355 if (e->X_op == O_register && e->X_add_number == REG_PSR)
5356 return OPERAND_MATCH;
5357 break;
5359 case IA64_OPND_PSR_L:
5360 if (e->X_op == O_register && e->X_add_number == REG_PSR_L)
5361 return OPERAND_MATCH;
5362 break;
5364 case IA64_OPND_PSR_UM:
5365 if (e->X_op == O_register && e->X_add_number == REG_PSR_UM)
5366 return OPERAND_MATCH;
5367 break;
5369 case IA64_OPND_C1:
5370 if (e->X_op == O_constant)
5372 if (e->X_add_number == 1)
5373 return OPERAND_MATCH;
5374 else
5375 return OPERAND_OUT_OF_RANGE;
5377 break;
5379 case IA64_OPND_C8:
5380 if (e->X_op == O_constant)
5382 if (e->X_add_number == 8)
5383 return OPERAND_MATCH;
5384 else
5385 return OPERAND_OUT_OF_RANGE;
5387 break;
5389 case IA64_OPND_C16:
5390 if (e->X_op == O_constant)
5392 if (e->X_add_number == 16)
5393 return OPERAND_MATCH;
5394 else
5395 return OPERAND_OUT_OF_RANGE;
5397 break;
5399 /* register operands: */
5401 case IA64_OPND_AR3:
5402 if (e->X_op == O_register && e->X_add_number >= REG_AR
5403 && e->X_add_number < REG_AR + 128)
5404 return OPERAND_MATCH;
5405 break;
5407 case IA64_OPND_B1:
5408 case IA64_OPND_B2:
5409 if (e->X_op == O_register && e->X_add_number >= REG_BR
5410 && e->X_add_number < REG_BR + 8)
5411 return OPERAND_MATCH;
5412 break;
5414 case IA64_OPND_CR3:
5415 if (e->X_op == O_register && e->X_add_number >= REG_CR
5416 && e->X_add_number < REG_CR + 128)
5417 return OPERAND_MATCH;
5418 break;
5420 case IA64_OPND_F1:
5421 case IA64_OPND_F2:
5422 case IA64_OPND_F3:
5423 case IA64_OPND_F4:
5424 if (e->X_op == O_register && e->X_add_number >= REG_FR
5425 && e->X_add_number < REG_FR + 128)
5426 return OPERAND_MATCH;
5427 break;
5429 case IA64_OPND_P1:
5430 case IA64_OPND_P2:
5431 if (e->X_op == O_register && e->X_add_number >= REG_P
5432 && e->X_add_number < REG_P + 64)
5433 return OPERAND_MATCH;
5434 break;
5436 case IA64_OPND_R1:
5437 case IA64_OPND_R2:
5438 case IA64_OPND_R3:
5439 if (e->X_op == O_register && e->X_add_number >= REG_GR
5440 && e->X_add_number < REG_GR + 128)
5441 return OPERAND_MATCH;
5442 break;
5444 case IA64_OPND_R3_2:
5445 if (e->X_op == O_register && e->X_add_number >= REG_GR)
5447 if (e->X_add_number < REG_GR + 4)
5448 return OPERAND_MATCH;
5449 else if (e->X_add_number < REG_GR + 128)
5450 return OPERAND_OUT_OF_RANGE;
5452 break;
5454 /* indirect operands: */
5455 case IA64_OPND_CPUID_R3:
5456 case IA64_OPND_DBR_R3:
5457 case IA64_OPND_DTR_R3:
5458 case IA64_OPND_ITR_R3:
5459 case IA64_OPND_IBR_R3:
5460 case IA64_OPND_MSR_R3:
5461 case IA64_OPND_PKR_R3:
5462 case IA64_OPND_PMC_R3:
5463 case IA64_OPND_PMD_R3:
5464 case IA64_OPND_RR_R3:
5465 if (e->X_op == O_index && e->X_op_symbol
5466 && (S_GET_VALUE (e->X_op_symbol) - IND_CPUID
5467 == opnd - IA64_OPND_CPUID_R3))
5468 return OPERAND_MATCH;
5469 break;
5471 case IA64_OPND_MR3:
5472 if (e->X_op == O_index && !e->X_op_symbol)
5473 return OPERAND_MATCH;
5474 break;
5476 /* immediate operands: */
5477 case IA64_OPND_CNT2a:
5478 case IA64_OPND_LEN4:
5479 case IA64_OPND_LEN6:
5480 bits = operand_width (idesc->operands[index]);
5481 if (e->X_op == O_constant)
5483 if ((bfd_vma) (e->X_add_number - 1) < ((bfd_vma) 1 << bits))
5484 return OPERAND_MATCH;
5485 else
5486 return OPERAND_OUT_OF_RANGE;
5488 break;
5490 case IA64_OPND_CNT2b:
5491 if (e->X_op == O_constant)
5493 if ((bfd_vma) (e->X_add_number - 1) < 3)
5494 return OPERAND_MATCH;
5495 else
5496 return OPERAND_OUT_OF_RANGE;
5498 break;
5500 case IA64_OPND_CNT2c:
5501 val = e->X_add_number;
5502 if (e->X_op == O_constant)
5504 if ((val == 0 || val == 7 || val == 15 || val == 16))
5505 return OPERAND_MATCH;
5506 else
5507 return OPERAND_OUT_OF_RANGE;
5509 break;
5511 case IA64_OPND_SOR:
5512 /* SOR must be an integer multiple of 8 */
5513 if (e->X_op == O_constant && e->X_add_number & 0x7)
5514 return OPERAND_OUT_OF_RANGE;
5515 case IA64_OPND_SOF:
5516 case IA64_OPND_SOL:
5517 if (e->X_op == O_constant)
5519 if ((bfd_vma) e->X_add_number <= 96)
5520 return OPERAND_MATCH;
5521 else
5522 return OPERAND_OUT_OF_RANGE;
5524 break;
5526 case IA64_OPND_IMMU62:
5527 if (e->X_op == O_constant)
5529 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << 62))
5530 return OPERAND_MATCH;
5531 else
5532 return OPERAND_OUT_OF_RANGE;
5534 else
5536 /* FIXME -- need 62-bit relocation type */
5537 as_bad (_("62-bit relocation not yet implemented"));
5539 break;
5541 case IA64_OPND_IMMU64:
5542 if (e->X_op == O_symbol || e->X_op == O_pseudo_fixup
5543 || e->X_op == O_subtract)
5545 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5546 fix->code = BFD_RELOC_IA64_IMM64;
5547 if (e->X_op != O_subtract)
5549 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5550 if (e->X_op == O_pseudo_fixup)
5551 e->X_op = O_symbol;
5554 fix->opnd = idesc->operands[index];
5555 fix->expr = *e;
5556 fix->is_pcrel = 0;
5557 ++CURR_SLOT.num_fixups;
5558 return OPERAND_MATCH;
5560 else if (e->X_op == O_constant)
5561 return OPERAND_MATCH;
5562 break;
5564 case IA64_OPND_IMMU5b:
5565 if (e->X_op == O_constant)
5567 val = e->X_add_number;
5568 if (val >= 32 && val <= 63)
5569 return OPERAND_MATCH;
5570 else
5571 return OPERAND_OUT_OF_RANGE;
5573 break;
5575 case IA64_OPND_CCNT5:
5576 case IA64_OPND_CNT5:
5577 case IA64_OPND_CNT6:
5578 case IA64_OPND_CPOS6a:
5579 case IA64_OPND_CPOS6b:
5580 case IA64_OPND_CPOS6c:
5581 case IA64_OPND_IMMU2:
5582 case IA64_OPND_IMMU7a:
5583 case IA64_OPND_IMMU7b:
5584 case IA64_OPND_IMMU21:
5585 case IA64_OPND_IMMU24:
5586 case IA64_OPND_MBTYPE4:
5587 case IA64_OPND_MHTYPE8:
5588 case IA64_OPND_POS6:
5589 bits = operand_width (idesc->operands[index]);
5590 if (e->X_op == O_constant)
5592 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5593 return OPERAND_MATCH;
5594 else
5595 return OPERAND_OUT_OF_RANGE;
5597 break;
5599 case IA64_OPND_IMMU9:
5600 bits = operand_width (idesc->operands[index]);
5601 if (e->X_op == O_constant)
5603 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5605 int lobits = e->X_add_number & 0x3;
5606 if (((bfd_vma) e->X_add_number & 0x3C) != 0 && lobits == 0)
5607 e->X_add_number |= (bfd_vma) 0x3;
5608 return OPERAND_MATCH;
5610 else
5611 return OPERAND_OUT_OF_RANGE;
5613 break;
5615 case IA64_OPND_IMM44:
5616 /* least 16 bits must be zero */
5617 if ((e->X_add_number & 0xffff) != 0)
5618 /* XXX technically, this is wrong: we should not be issuing warning
5619 messages until we're sure this instruction pattern is going to
5620 be used! */
5621 as_warn (_("lower 16 bits of mask ignored"));
5623 if (e->X_op == O_constant)
5625 if (((e->X_add_number >= 0
5626 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 44))
5627 || (e->X_add_number < 0
5628 && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 44))))
5630 /* sign-extend */
5631 if (e->X_add_number >= 0
5632 && (e->X_add_number & ((bfd_vma) 1 << 43)) != 0)
5634 e->X_add_number |= ~(((bfd_vma) 1 << 44) - 1);
5636 return OPERAND_MATCH;
5638 else
5639 return OPERAND_OUT_OF_RANGE;
5641 break;
5643 case IA64_OPND_IMM17:
5644 /* bit 0 is a don't care (pr0 is hardwired to 1) */
5645 if (e->X_op == O_constant)
5647 if (((e->X_add_number >= 0
5648 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 17))
5649 || (e->X_add_number < 0
5650 && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 17))))
5652 /* sign-extend */
5653 if (e->X_add_number >= 0
5654 && (e->X_add_number & ((bfd_vma) 1 << 16)) != 0)
5656 e->X_add_number |= ~(((bfd_vma) 1 << 17) - 1);
5658 return OPERAND_MATCH;
5660 else
5661 return OPERAND_OUT_OF_RANGE;
5663 break;
5665 case IA64_OPND_IMM14:
5666 case IA64_OPND_IMM22:
5667 relocatable = 1;
5668 case IA64_OPND_IMM1:
5669 case IA64_OPND_IMM8:
5670 case IA64_OPND_IMM8U4:
5671 case IA64_OPND_IMM8M1:
5672 case IA64_OPND_IMM8M1U4:
5673 case IA64_OPND_IMM8M1U8:
5674 case IA64_OPND_IMM9a:
5675 case IA64_OPND_IMM9b:
5676 bits = operand_width (idesc->operands[index]);
5677 if (relocatable && (e->X_op == O_symbol
5678 || e->X_op == O_subtract
5679 || e->X_op == O_pseudo_fixup))
5681 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5683 if (idesc->operands[index] == IA64_OPND_IMM14)
5684 fix->code = BFD_RELOC_IA64_IMM14;
5685 else
5686 fix->code = BFD_RELOC_IA64_IMM22;
5688 if (e->X_op != O_subtract)
5690 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5691 if (e->X_op == O_pseudo_fixup)
5692 e->X_op = O_symbol;
5695 fix->opnd = idesc->operands[index];
5696 fix->expr = *e;
5697 fix->is_pcrel = 0;
5698 ++CURR_SLOT.num_fixups;
5699 return OPERAND_MATCH;
5701 else if (e->X_op != O_constant
5702 && ! (e->X_op == O_big && opnd == IA64_OPND_IMM8M1U8))
5703 return OPERAND_MISMATCH;
5705 if (opnd == IA64_OPND_IMM8M1U4)
5707 /* Zero is not valid for unsigned compares that take an adjusted
5708 constant immediate range. */
5709 if (e->X_add_number == 0)
5710 return OPERAND_OUT_OF_RANGE;
5712 /* Sign-extend 32-bit unsigned numbers, so that the following range
5713 checks will work. */
5714 val = e->X_add_number;
5715 if (((val & (~(bfd_vma) 0 << 32)) == 0)
5716 && ((val & ((bfd_vma) 1 << 31)) != 0))
5717 val = ((val << 32) >> 32);
5719 /* Check for 0x100000000. This is valid because
5720 0x100000000-1 is the same as ((uint32_t) -1). */
5721 if (val == ((bfd_signed_vma) 1 << 32))
5722 return OPERAND_MATCH;
5724 val = val - 1;
5726 else if (opnd == IA64_OPND_IMM8M1U8)
5728 /* Zero is not valid for unsigned compares that take an adjusted
5729 constant immediate range. */
5730 if (e->X_add_number == 0)
5731 return OPERAND_OUT_OF_RANGE;
5733 /* Check for 0x10000000000000000. */
5734 if (e->X_op == O_big)
5736 if (generic_bignum[0] == 0
5737 && generic_bignum[1] == 0
5738 && generic_bignum[2] == 0
5739 && generic_bignum[3] == 0
5740 && generic_bignum[4] == 1)
5741 return OPERAND_MATCH;
5742 else
5743 return OPERAND_OUT_OF_RANGE;
5745 else
5746 val = e->X_add_number - 1;
5748 else if (opnd == IA64_OPND_IMM8M1)
5749 val = e->X_add_number - 1;
5750 else if (opnd == IA64_OPND_IMM8U4)
5752 /* Sign-extend 32-bit unsigned numbers, so that the following range
5753 checks will work. */
5754 val = e->X_add_number;
5755 if (((val & (~(bfd_vma) 0 << 32)) == 0)
5756 && ((val & ((bfd_vma) 1 << 31)) != 0))
5757 val = ((val << 32) >> 32);
5759 else
5760 val = e->X_add_number;
5762 if ((val >= 0 && (bfd_vma) val < ((bfd_vma) 1 << (bits - 1)))
5763 || (val < 0 && (bfd_vma) -val <= ((bfd_vma) 1 << (bits - 1))))
5764 return OPERAND_MATCH;
5765 else
5766 return OPERAND_OUT_OF_RANGE;
5768 case IA64_OPND_INC3:
5769 /* +/- 1, 4, 8, 16 */
5770 val = e->X_add_number;
5771 if (val < 0)
5772 val = -val;
5773 if (e->X_op == O_constant)
5775 if ((val == 1 || val == 4 || val == 8 || val == 16))
5776 return OPERAND_MATCH;
5777 else
5778 return OPERAND_OUT_OF_RANGE;
5780 break;
5782 case IA64_OPND_TGT25:
5783 case IA64_OPND_TGT25b:
5784 case IA64_OPND_TGT25c:
5785 case IA64_OPND_TGT64:
5786 if (e->X_op == O_symbol)
5788 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5789 if (opnd == IA64_OPND_TGT25)
5790 fix->code = BFD_RELOC_IA64_PCREL21F;
5791 else if (opnd == IA64_OPND_TGT25b)
5792 fix->code = BFD_RELOC_IA64_PCREL21M;
5793 else if (opnd == IA64_OPND_TGT25c)
5794 fix->code = BFD_RELOC_IA64_PCREL21B;
5795 else if (opnd == IA64_OPND_TGT64)
5796 fix->code = BFD_RELOC_IA64_PCREL60B;
5797 else
5798 abort ();
5800 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5801 fix->opnd = idesc->operands[index];
5802 fix->expr = *e;
5803 fix->is_pcrel = 1;
5804 ++CURR_SLOT.num_fixups;
5805 return OPERAND_MATCH;
5807 case IA64_OPND_TAG13:
5808 case IA64_OPND_TAG13b:
5809 switch (e->X_op)
5811 case O_constant:
5812 return OPERAND_MATCH;
5814 case O_symbol:
5815 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5816 /* There are no external relocs for TAG13/TAG13b fields, so we
5817 create a dummy reloc. This will not live past md_apply_fix. */
5818 fix->code = BFD_RELOC_UNUSED;
5819 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5820 fix->opnd = idesc->operands[index];
5821 fix->expr = *e;
5822 fix->is_pcrel = 1;
5823 ++CURR_SLOT.num_fixups;
5824 return OPERAND_MATCH;
5826 default:
5827 break;
5829 break;
5831 case IA64_OPND_LDXMOV:
5832 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5833 fix->code = BFD_RELOC_IA64_LDXMOV;
5834 fix->opnd = idesc->operands[index];
5835 fix->expr = *e;
5836 fix->is_pcrel = 0;
5837 ++CURR_SLOT.num_fixups;
5838 return OPERAND_MATCH;
5840 default:
5841 break;
5843 return OPERAND_MISMATCH;
5846 static int
5847 parse_operand (expressionS *e, int more)
5849 int sep = '\0';
5851 memset (e, 0, sizeof (*e));
5852 e->X_op = O_absent;
5853 SKIP_WHITESPACE ();
5854 expression_and_evaluate (e);
5855 sep = *input_line_pointer;
5856 if (more && (sep == ',' || sep == more))
5857 ++input_line_pointer;
5858 return sep;
5861 /* Returns the next entry in the opcode table that matches the one in
5862 IDESC, and frees the entry in IDESC. If no matching entry is
5863 found, NULL is returned instead. */
5865 static struct ia64_opcode *
5866 get_next_opcode (struct ia64_opcode *idesc)
5868 struct ia64_opcode *next = ia64_find_next_opcode (idesc);
5869 ia64_free_opcode (idesc);
5870 return next;
5873 /* Parse the operands for the opcode and find the opcode variant that
5874 matches the specified operands, or NULL if no match is possible. */
5876 static struct ia64_opcode *
5877 parse_operands (struct ia64_opcode *idesc)
5879 int i = 0, highest_unmatched_operand, num_operands = 0, num_outputs = 0;
5880 int error_pos, out_of_range_pos, curr_out_of_range_pos, sep = 0;
5881 int reg1, reg2;
5882 char reg_class;
5883 enum ia64_opnd expected_operand = IA64_OPND_NIL;
5884 enum operand_match_result result;
5885 char mnemonic[129];
5886 char *first_arg = 0, *end, *saved_input_pointer;
5887 unsigned int sof;
5889 gas_assert (strlen (idesc->name) <= 128);
5891 strcpy (mnemonic, idesc->name);
5892 if (idesc->operands[2] == IA64_OPND_SOF
5893 || idesc->operands[1] == IA64_OPND_SOF)
5895 /* To make the common idiom "alloc loc?=ar.pfs,0,1,0,0" work, we
5896 can't parse the first operand until we have parsed the
5897 remaining operands of the "alloc" instruction. */
5898 SKIP_WHITESPACE ();
5899 first_arg = input_line_pointer;
5900 end = strchr (input_line_pointer, '=');
5901 if (!end)
5903 as_bad (_("Expected separator `='"));
5904 return 0;
5906 input_line_pointer = end + 1;
5907 ++i;
5908 ++num_outputs;
5911 for (; ; ++i)
5913 if (i < NELEMS (CURR_SLOT.opnd))
5915 sep = parse_operand (CURR_SLOT.opnd + i, '=');
5916 if (CURR_SLOT.opnd[i].X_op == O_absent)
5917 break;
5919 else
5921 expressionS dummy;
5923 sep = parse_operand (&dummy, '=');
5924 if (dummy.X_op == O_absent)
5925 break;
5928 ++num_operands;
5930 if (sep != '=' && sep != ',')
5931 break;
5933 if (sep == '=')
5935 if (num_outputs > 0)
5936 as_bad (_("Duplicate equal sign (=) in instruction"));
5937 else
5938 num_outputs = i + 1;
5941 if (sep != '\0')
5943 as_bad (_("Illegal operand separator `%c'"), sep);
5944 return 0;
5947 if (idesc->operands[2] == IA64_OPND_SOF
5948 || idesc->operands[1] == IA64_OPND_SOF)
5950 /* Map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r.
5951 Note, however, that due to that mapping operand numbers in error
5952 messages for any of the constant operands will not be correct. */
5953 know (strcmp (idesc->name, "alloc") == 0);
5954 /* The first operand hasn't been parsed/initialized, yet (but
5955 num_operands intentionally doesn't account for that). */
5956 i = num_operands > 4 ? 2 : 1;
5957 #define FORCE_CONST(n) (CURR_SLOT.opnd[n].X_op == O_constant \
5958 ? CURR_SLOT.opnd[n].X_add_number \
5959 : 0)
5960 sof = set_regstack (FORCE_CONST(i),
5961 FORCE_CONST(i + 1),
5962 FORCE_CONST(i + 2),
5963 FORCE_CONST(i + 3));
5964 #undef FORCE_CONST
5966 /* now we can parse the first arg: */
5967 saved_input_pointer = input_line_pointer;
5968 input_line_pointer = first_arg;
5969 sep = parse_operand (CURR_SLOT.opnd + 0, '=');
5970 if (sep != '=')
5971 --num_outputs; /* force error */
5972 input_line_pointer = saved_input_pointer;
5974 CURR_SLOT.opnd[i].X_add_number = sof;
5975 if (CURR_SLOT.opnd[i + 1].X_op == O_constant
5976 && CURR_SLOT.opnd[i + 2].X_op == O_constant)
5977 CURR_SLOT.opnd[i + 1].X_add_number
5978 = sof - CURR_SLOT.opnd[i + 2].X_add_number;
5979 else
5980 CURR_SLOT.opnd[i + 1].X_op = O_illegal;
5981 CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3];
5984 highest_unmatched_operand = -4;
5985 curr_out_of_range_pos = -1;
5986 error_pos = 0;
5987 for (; idesc; idesc = get_next_opcode (idesc))
5989 if (num_outputs != idesc->num_outputs)
5990 continue; /* mismatch in # of outputs */
5991 if (highest_unmatched_operand < 0)
5992 highest_unmatched_operand |= 1;
5993 if (num_operands > NELEMS (idesc->operands)
5994 || (num_operands < NELEMS (idesc->operands)
5995 && idesc->operands[num_operands])
5996 || (num_operands > 0 && !idesc->operands[num_operands - 1]))
5997 continue; /* mismatch in number of arguments */
5998 if (highest_unmatched_operand < 0)
5999 highest_unmatched_operand |= 2;
6001 CURR_SLOT.num_fixups = 0;
6003 /* Try to match all operands. If we see an out-of-range operand,
6004 then continue trying to match the rest of the operands, since if
6005 the rest match, then this idesc will give the best error message. */
6007 out_of_range_pos = -1;
6008 for (i = 0; i < num_operands && idesc->operands[i]; ++i)
6010 result = operand_match (idesc, i, CURR_SLOT.opnd + i);
6011 if (result != OPERAND_MATCH)
6013 if (result != OPERAND_OUT_OF_RANGE)
6014 break;
6015 if (out_of_range_pos < 0)
6016 /* remember position of the first out-of-range operand: */
6017 out_of_range_pos = i;
6021 /* If we did not match all operands, or if at least one operand was
6022 out-of-range, then this idesc does not match. Keep track of which
6023 idesc matched the most operands before failing. If we have two
6024 idescs that failed at the same position, and one had an out-of-range
6025 operand, then prefer the out-of-range operand. Thus if we have
6026 "add r0=0x1000000,r1" we get an error saying the constant is out
6027 of range instead of an error saying that the constant should have been
6028 a register. */
6030 if (i != num_operands || out_of_range_pos >= 0)
6032 if (i > highest_unmatched_operand
6033 || (i == highest_unmatched_operand
6034 && out_of_range_pos > curr_out_of_range_pos))
6036 highest_unmatched_operand = i;
6037 if (out_of_range_pos >= 0)
6039 expected_operand = idesc->operands[out_of_range_pos];
6040 error_pos = out_of_range_pos;
6042 else
6044 expected_operand = idesc->operands[i];
6045 error_pos = i;
6047 curr_out_of_range_pos = out_of_range_pos;
6049 continue;
6052 break;
6054 if (!idesc)
6056 if (expected_operand)
6057 as_bad (_("Operand %u of `%s' should be %s"),
6058 error_pos + 1, mnemonic,
6059 elf64_ia64_operands[expected_operand].desc);
6060 else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 1))
6061 as_bad (_("Wrong number of output operands"));
6062 else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 2))
6063 as_bad (_("Wrong number of input operands"));
6064 else
6065 as_bad (_("Operand mismatch"));
6066 return 0;
6069 /* Check that the instruction doesn't use
6070 - r0, f0, or f1 as output operands
6071 - the same predicate twice as output operands
6072 - r0 as address of a base update load or store
6073 - the same GR as output and address of a base update load
6074 - two even- or two odd-numbered FRs as output operands of a floating
6075 point parallel load.
6076 At most two (conflicting) output (or output-like) operands can exist,
6077 (floating point parallel loads have three outputs, but the base register,
6078 if updated, cannot conflict with the actual outputs). */
6079 reg2 = reg1 = -1;
6080 for (i = 0; i < num_operands; ++i)
6082 int regno = 0;
6084 reg_class = 0;
6085 switch (idesc->operands[i])
6087 case IA64_OPND_R1:
6088 case IA64_OPND_R2:
6089 case IA64_OPND_R3:
6090 if (i < num_outputs)
6092 if (CURR_SLOT.opnd[i].X_add_number == REG_GR)
6093 reg_class = 'r';
6094 else if (reg1 < 0)
6095 reg1 = CURR_SLOT.opnd[i].X_add_number;
6096 else if (reg2 < 0)
6097 reg2 = CURR_SLOT.opnd[i].X_add_number;
6099 break;
6100 case IA64_OPND_P1:
6101 case IA64_OPND_P2:
6102 if (i < num_outputs)
6104 if (reg1 < 0)
6105 reg1 = CURR_SLOT.opnd[i].X_add_number;
6106 else if (reg2 < 0)
6107 reg2 = CURR_SLOT.opnd[i].X_add_number;
6109 break;
6110 case IA64_OPND_F1:
6111 case IA64_OPND_F2:
6112 case IA64_OPND_F3:
6113 case IA64_OPND_F4:
6114 if (i < num_outputs)
6116 if (CURR_SLOT.opnd[i].X_add_number >= REG_FR
6117 && CURR_SLOT.opnd[i].X_add_number <= REG_FR + 1)
6119 reg_class = 'f';
6120 regno = CURR_SLOT.opnd[i].X_add_number - REG_FR;
6122 else if (reg1 < 0)
6123 reg1 = CURR_SLOT.opnd[i].X_add_number;
6124 else if (reg2 < 0)
6125 reg2 = CURR_SLOT.opnd[i].X_add_number;
6127 break;
6128 case IA64_OPND_MR3:
6129 if (idesc->flags & IA64_OPCODE_POSTINC)
6131 if (CURR_SLOT.opnd[i].X_add_number == REG_GR)
6132 reg_class = 'm';
6133 else if (reg1 < 0)
6134 reg1 = CURR_SLOT.opnd[i].X_add_number;
6135 else if (reg2 < 0)
6136 reg2 = CURR_SLOT.opnd[i].X_add_number;
6138 break;
6139 default:
6140 break;
6142 switch (reg_class)
6144 case 0:
6145 break;
6146 default:
6147 as_warn (_("Invalid use of `%c%d' as output operand"), reg_class, regno);
6148 break;
6149 case 'm':
6150 as_warn (_("Invalid use of `r%d' as base update address operand"), regno);
6151 break;
6154 if (reg1 == reg2)
6156 if (reg1 >= REG_GR && reg1 <= REG_GR + 127)
6158 reg1 -= REG_GR;
6159 reg_class = 'r';
6161 else if (reg1 >= REG_P && reg1 <= REG_P + 63)
6163 reg1 -= REG_P;
6164 reg_class = 'p';
6166 else if (reg1 >= REG_FR && reg1 <= REG_FR + 127)
6168 reg1 -= REG_FR;
6169 reg_class = 'f';
6171 else
6172 reg_class = 0;
6173 if (reg_class)
6174 as_warn (_("Invalid duplicate use of `%c%d'"), reg_class, reg1);
6176 else if (((reg1 >= REG_FR && reg1 <= REG_FR + 31
6177 && reg2 >= REG_FR && reg2 <= REG_FR + 31)
6178 || (reg1 >= REG_FR + 32 && reg1 <= REG_FR + 127
6179 && reg2 >= REG_FR + 32 && reg2 <= REG_FR + 127))
6180 && ! ((reg1 ^ reg2) & 1))
6181 as_warn (_("Invalid simultaneous use of `f%d' and `f%d'"),
6182 reg1 - REG_FR, reg2 - REG_FR);
6183 else if ((reg1 >= REG_FR && reg1 <= REG_FR + 31
6184 && reg2 >= REG_FR + 32 && reg2 <= REG_FR + 127)
6185 || (reg1 >= REG_FR + 32 && reg1 <= REG_FR + 127
6186 && reg2 >= REG_FR && reg2 <= REG_FR + 31))
6187 as_warn (_("Dangerous simultaneous use of `f%d' and `f%d'"),
6188 reg1 - REG_FR, reg2 - REG_FR);
6189 return idesc;
6192 static void
6193 build_insn (struct slot *slot, bfd_vma *insnp)
6195 const struct ia64_operand *odesc, *o2desc;
6196 struct ia64_opcode *idesc = slot->idesc;
6197 bfd_vma insn;
6198 bfd_signed_vma val;
6199 const char *err;
6200 int i;
6202 insn = idesc->opcode | slot->qp_regno;
6204 for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; ++i)
6206 if (slot->opnd[i].X_op == O_register
6207 || slot->opnd[i].X_op == O_constant
6208 || slot->opnd[i].X_op == O_index)
6209 val = slot->opnd[i].X_add_number;
6210 else if (slot->opnd[i].X_op == O_big)
6212 /* This must be the value 0x10000000000000000. */
6213 gas_assert (idesc->operands[i] == IA64_OPND_IMM8M1U8);
6214 val = 0;
6216 else
6217 val = 0;
6219 switch (idesc->operands[i])
6221 case IA64_OPND_IMMU64:
6222 *insnp++ = (val >> 22) & 0x1ffffffffffLL;
6223 insn |= (((val & 0x7f) << 13) | (((val >> 7) & 0x1ff) << 27)
6224 | (((val >> 16) & 0x1f) << 22) | (((val >> 21) & 0x1) << 21)
6225 | (((val >> 63) & 0x1) << 36));
6226 continue;
6228 case IA64_OPND_IMMU62:
6229 val &= 0x3fffffffffffffffULL;
6230 if (val != slot->opnd[i].X_add_number)
6231 as_warn (_("Value truncated to 62 bits"));
6232 *insnp++ = (val >> 21) & 0x1ffffffffffLL;
6233 insn |= (((val & 0xfffff) << 6) | (((val >> 20) & 0x1) << 36));
6234 continue;
6236 case IA64_OPND_TGT64:
6237 val >>= 4;
6238 *insnp++ = ((val >> 20) & 0x7fffffffffLL) << 2;
6239 insn |= ((((val >> 59) & 0x1) << 36)
6240 | (((val >> 0) & 0xfffff) << 13));
6241 continue;
6243 case IA64_OPND_AR3:
6244 val -= REG_AR;
6245 break;
6247 case IA64_OPND_B1:
6248 case IA64_OPND_B2:
6249 val -= REG_BR;
6250 break;
6252 case IA64_OPND_CR3:
6253 val -= REG_CR;
6254 break;
6256 case IA64_OPND_F1:
6257 case IA64_OPND_F2:
6258 case IA64_OPND_F3:
6259 case IA64_OPND_F4:
6260 val -= REG_FR;
6261 break;
6263 case IA64_OPND_P1:
6264 case IA64_OPND_P2:
6265 val -= REG_P;
6266 break;
6268 case IA64_OPND_R1:
6269 case IA64_OPND_R2:
6270 case IA64_OPND_R3:
6271 case IA64_OPND_R3_2:
6272 case IA64_OPND_CPUID_R3:
6273 case IA64_OPND_DBR_R3:
6274 case IA64_OPND_DTR_R3:
6275 case IA64_OPND_ITR_R3:
6276 case IA64_OPND_IBR_R3:
6277 case IA64_OPND_MR3:
6278 case IA64_OPND_MSR_R3:
6279 case IA64_OPND_PKR_R3:
6280 case IA64_OPND_PMC_R3:
6281 case IA64_OPND_PMD_R3:
6282 case IA64_OPND_RR_R3:
6283 val -= REG_GR;
6284 break;
6286 default:
6287 break;
6290 odesc = elf64_ia64_operands + idesc->operands[i];
6291 err = (*odesc->insert) (odesc, val, &insn);
6292 if (err)
6293 as_bad_where (slot->src_file, slot->src_line,
6294 _("Bad operand value: %s"), err);
6295 if (idesc->flags & IA64_OPCODE_PSEUDO)
6297 if ((idesc->flags & IA64_OPCODE_F2_EQ_F3)
6298 && odesc == elf64_ia64_operands + IA64_OPND_F3)
6300 o2desc = elf64_ia64_operands + IA64_OPND_F2;
6301 (*o2desc->insert) (o2desc, val, &insn);
6303 if ((idesc->flags & IA64_OPCODE_LEN_EQ_64MCNT)
6304 && (odesc == elf64_ia64_operands + IA64_OPND_CPOS6a
6305 || odesc == elf64_ia64_operands + IA64_OPND_POS6))
6307 o2desc = elf64_ia64_operands + IA64_OPND_LEN6;
6308 (*o2desc->insert) (o2desc, 64 - val, &insn);
6312 *insnp = insn;
6315 static void
6316 emit_one_bundle (void)
6318 int manual_bundling_off = 0, manual_bundling = 0;
6319 enum ia64_unit required_unit, insn_unit = 0;
6320 enum ia64_insn_type type[3], insn_type;
6321 unsigned int template, orig_template;
6322 bfd_vma insn[3] = { -1, -1, -1 };
6323 struct ia64_opcode *idesc;
6324 int end_of_insn_group = 0, user_template = -1;
6325 int n, i, j, first, curr, last_slot;
6326 bfd_vma t0 = 0, t1 = 0;
6327 struct label_fix *lfix;
6328 bfd_boolean mark_label;
6329 struct insn_fix *ifix;
6330 char mnemonic[16];
6331 fixS *fix;
6332 char *f;
6333 int addr_mod;
6335 first = (md.curr_slot + NUM_SLOTS - md.num_slots_in_use) % NUM_SLOTS;
6336 know (first >= 0 && first < NUM_SLOTS);
6337 n = MIN (3, md.num_slots_in_use);
6339 /* Determine template: user user_template if specified, best match
6340 otherwise: */
6342 if (md.slot[first].user_template >= 0)
6343 user_template = template = md.slot[first].user_template;
6344 else
6346 /* Auto select appropriate template. */
6347 memset (type, 0, sizeof (type));
6348 curr = first;
6349 for (i = 0; i < n; ++i)
6351 if (md.slot[curr].label_fixups && i != 0)
6352 break;
6353 type[i] = md.slot[curr].idesc->type;
6354 curr = (curr + 1) % NUM_SLOTS;
6356 template = best_template[type[0]][type[1]][type[2]];
6359 /* initialize instructions with appropriate nops: */
6360 for (i = 0; i < 3; ++i)
6361 insn[i] = nop[ia64_templ_desc[template].exec_unit[i]];
6363 f = frag_more (16);
6365 /* Check to see if this bundle is at an offset that is a multiple of 16-bytes
6366 from the start of the frag. */
6367 addr_mod = frag_now_fix () & 15;
6368 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
6369 as_bad (_("instruction address is not a multiple of 16"));
6370 frag_now->insn_addr = addr_mod;
6371 frag_now->has_code = 1;
6373 /* now fill in slots with as many insns as possible: */
6374 curr = first;
6375 idesc = md.slot[curr].idesc;
6376 end_of_insn_group = 0;
6377 last_slot = -1;
6378 for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
6380 /* If we have unwind records, we may need to update some now. */
6381 unw_rec_list *ptr = md.slot[curr].unwind_record;
6382 unw_rec_list *end_ptr = NULL;
6384 if (ptr)
6386 /* Find the last prologue/body record in the list for the current
6387 insn, and set the slot number for all records up to that point.
6388 This needs to be done now, because prologue/body records refer to
6389 the current point, not the point after the instruction has been
6390 issued. This matters because there may have been nops emitted
6391 meanwhile. Any non-prologue non-body record followed by a
6392 prologue/body record must also refer to the current point. */
6393 unw_rec_list *last_ptr;
6395 for (j = 1; end_ptr == NULL && j < md.num_slots_in_use; ++j)
6396 end_ptr = md.slot[(curr + j) % NUM_SLOTS].unwind_record;
6397 for (last_ptr = NULL; ptr != end_ptr; ptr = ptr->next)
6398 if (ptr->r.type == prologue || ptr->r.type == prologue_gr
6399 || ptr->r.type == body)
6400 last_ptr = ptr;
6401 if (last_ptr)
6403 /* Make last_ptr point one after the last prologue/body
6404 record. */
6405 last_ptr = last_ptr->next;
6406 for (ptr = md.slot[curr].unwind_record; ptr != last_ptr;
6407 ptr = ptr->next)
6409 ptr->slot_number = (unsigned long) f + i;
6410 ptr->slot_frag = frag_now;
6412 /* Remove the initialized records, so that we won't accidentally
6413 update them again if we insert a nop and continue. */
6414 md.slot[curr].unwind_record = last_ptr;
6418 manual_bundling_off = md.slot[curr].manual_bundling_off;
6419 if (md.slot[curr].manual_bundling_on)
6421 if (curr == first)
6422 manual_bundling = 1;
6423 else
6424 break; /* Need to start a new bundle. */
6427 /* If this instruction specifies a template, then it must be the first
6428 instruction of a bundle. */
6429 if (curr != first && md.slot[curr].user_template >= 0)
6430 break;
6432 if (idesc->flags & IA64_OPCODE_SLOT2)
6434 if (manual_bundling && !manual_bundling_off)
6436 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6437 _("`%s' must be last in bundle"), idesc->name);
6438 if (i < 2)
6439 manual_bundling = -1; /* Suppress meaningless post-loop errors. */
6441 i = 2;
6443 if (idesc->flags & IA64_OPCODE_LAST)
6445 int required_slot;
6446 unsigned int required_template;
6448 /* If we need a stop bit after an M slot, our only choice is
6449 template 5 (M;;MI). If we need a stop bit after a B
6450 slot, our only choice is to place it at the end of the
6451 bundle, because the only available templates are MIB,
6452 MBB, BBB, MMB, and MFB. We don't handle anything other
6453 than M and B slots because these are the only kind of
6454 instructions that can have the IA64_OPCODE_LAST bit set. */
6455 required_template = template;
6456 switch (idesc->type)
6458 case IA64_TYPE_M:
6459 required_slot = 0;
6460 required_template = 5;
6461 break;
6463 case IA64_TYPE_B:
6464 required_slot = 2;
6465 break;
6467 default:
6468 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6469 _("Internal error: don't know how to force %s to end of instruction group"),
6470 idesc->name);
6471 required_slot = i;
6472 break;
6474 if (manual_bundling
6475 && (i > required_slot
6476 || (required_slot == 2 && !manual_bundling_off)
6477 || (user_template >= 0
6478 /* Changing from MMI to M;MI is OK. */
6479 && (template ^ required_template) > 1)))
6481 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6482 _("`%s' must be last in instruction group"),
6483 idesc->name);
6484 if (i < 2 && required_slot == 2 && !manual_bundling_off)
6485 manual_bundling = -1; /* Suppress meaningless post-loop errors. */
6487 if (required_slot < i)
6488 /* Can't fit this instruction. */
6489 break;
6491 i = required_slot;
6492 if (required_template != template)
6494 /* If we switch the template, we need to reset the NOPs
6495 after slot i. The slot-types of the instructions ahead
6496 of i never change, so we don't need to worry about
6497 changing NOPs in front of this slot. */
6498 for (j = i; j < 3; ++j)
6499 insn[j] = nop[ia64_templ_desc[required_template].exec_unit[j]];
6501 /* We just picked a template that includes the stop bit in the
6502 middle, so we don't need another one emitted later. */
6503 md.slot[curr].end_of_insn_group = 0;
6505 template = required_template;
6507 if (curr != first && md.slot[curr].label_fixups)
6509 if (manual_bundling)
6511 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6512 _("Label must be first in a bundle"));
6513 manual_bundling = -1; /* Suppress meaningless post-loop errors. */
6515 /* This insn must go into the first slot of a bundle. */
6516 break;
6519 if (end_of_insn_group && md.num_slots_in_use >= 1)
6521 /* We need an instruction group boundary in the middle of a
6522 bundle. See if we can switch to an other template with
6523 an appropriate boundary. */
6525 orig_template = template;
6526 if (i == 1 && (user_template == 4
6527 || (user_template < 0
6528 && (ia64_templ_desc[template].exec_unit[0]
6529 == IA64_UNIT_M))))
6531 template = 5;
6532 end_of_insn_group = 0;
6534 else if (i == 2 && (user_template == 0
6535 || (user_template < 0
6536 && (ia64_templ_desc[template].exec_unit[1]
6537 == IA64_UNIT_I)))
6538 /* This test makes sure we don't switch the template if
6539 the next instruction is one that needs to be first in
6540 an instruction group. Since all those instructions are
6541 in the M group, there is no way such an instruction can
6542 fit in this bundle even if we switch the template. The
6543 reason we have to check for this is that otherwise we
6544 may end up generating "MI;;I M.." which has the deadly
6545 effect that the second M instruction is no longer the
6546 first in the group! --davidm 99/12/16 */
6547 && (idesc->flags & IA64_OPCODE_FIRST) == 0)
6549 template = 1;
6550 end_of_insn_group = 0;
6552 else if (i == 1
6553 && user_template == 0
6554 && !(idesc->flags & IA64_OPCODE_FIRST))
6555 /* Use the next slot. */
6556 continue;
6557 else if (curr != first)
6558 /* can't fit this insn */
6559 break;
6561 if (template != orig_template)
6562 /* if we switch the template, we need to reset the NOPs
6563 after slot i. The slot-types of the instructions ahead
6564 of i never change, so we don't need to worry about
6565 changing NOPs in front of this slot. */
6566 for (j = i; j < 3; ++j)
6567 insn[j] = nop[ia64_templ_desc[template].exec_unit[j]];
6569 required_unit = ia64_templ_desc[template].exec_unit[i];
6571 /* resolve dynamic opcodes such as "break", "hint", and "nop": */
6572 if (idesc->type == IA64_TYPE_DYN)
6574 enum ia64_opnd opnd1, opnd2;
6576 if ((strcmp (idesc->name, "nop") == 0)
6577 || (strcmp (idesc->name, "break") == 0))
6578 insn_unit = required_unit;
6579 else if (strcmp (idesc->name, "hint") == 0)
6581 insn_unit = required_unit;
6582 if (required_unit == IA64_UNIT_B)
6584 switch (md.hint_b)
6586 case hint_b_ok:
6587 break;
6588 case hint_b_warning:
6589 as_warn (_("hint in B unit may be treated as nop"));
6590 break;
6591 case hint_b_error:
6592 /* When manual bundling is off and there is no
6593 user template, we choose a different unit so
6594 that hint won't go into the current slot. We
6595 will fill the current bundle with nops and
6596 try to put hint into the next bundle. */
6597 if (!manual_bundling && user_template < 0)
6598 insn_unit = IA64_UNIT_I;
6599 else
6600 as_bad (_("hint in B unit can't be used"));
6601 break;
6605 else if (strcmp (idesc->name, "chk.s") == 0
6606 || strcmp (idesc->name, "mov") == 0)
6608 insn_unit = IA64_UNIT_M;
6609 if (required_unit == IA64_UNIT_I
6610 || (required_unit == IA64_UNIT_F && template == 6))
6611 insn_unit = IA64_UNIT_I;
6613 else
6614 as_fatal (_("emit_one_bundle: unexpected dynamic op"));
6616 snprintf (mnemonic, sizeof (mnemonic), "%s.%c",
6617 idesc->name, "?imbfxx"[insn_unit]);
6618 opnd1 = idesc->operands[0];
6619 opnd2 = idesc->operands[1];
6620 ia64_free_opcode (idesc);
6621 idesc = ia64_find_opcode (mnemonic);
6622 /* moves to/from ARs have collisions */
6623 if (opnd1 == IA64_OPND_AR3 || opnd2 == IA64_OPND_AR3)
6625 while (idesc != NULL
6626 && (idesc->operands[0] != opnd1
6627 || idesc->operands[1] != opnd2))
6628 idesc = get_next_opcode (idesc);
6630 md.slot[curr].idesc = idesc;
6632 else
6634 insn_type = idesc->type;
6635 insn_unit = IA64_UNIT_NIL;
6636 switch (insn_type)
6638 case IA64_TYPE_A:
6639 if (required_unit == IA64_UNIT_I || required_unit == IA64_UNIT_M)
6640 insn_unit = required_unit;
6641 break;
6642 case IA64_TYPE_X: insn_unit = IA64_UNIT_L; break;
6643 case IA64_TYPE_I: insn_unit = IA64_UNIT_I; break;
6644 case IA64_TYPE_M: insn_unit = IA64_UNIT_M; break;
6645 case IA64_TYPE_B: insn_unit = IA64_UNIT_B; break;
6646 case IA64_TYPE_F: insn_unit = IA64_UNIT_F; break;
6647 default: break;
6651 if (insn_unit != required_unit)
6652 continue; /* Try next slot. */
6654 /* Now is a good time to fix up the labels for this insn. */
6655 mark_label = FALSE;
6656 for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next)
6658 S_SET_VALUE (lfix->sym, frag_now_fix () - 16);
6659 symbol_set_frag (lfix->sym, frag_now);
6660 mark_label |= lfix->dw2_mark_labels;
6662 for (lfix = md.slot[curr].tag_fixups; lfix; lfix = lfix->next)
6664 S_SET_VALUE (lfix->sym, frag_now_fix () - 16 + i);
6665 symbol_set_frag (lfix->sym, frag_now);
6668 if (debug_type == DEBUG_DWARF2
6669 || md.slot[curr].loc_directive_seen
6670 || mark_label)
6672 bfd_vma addr = frag_now->fr_address + frag_now_fix () - 16 + i;
6674 md.slot[curr].loc_directive_seen = 0;
6675 if (mark_label)
6676 md.slot[curr].debug_line.flags |= DWARF2_FLAG_BASIC_BLOCK;
6678 dwarf2_gen_line_info (addr, &md.slot[curr].debug_line);
6681 build_insn (md.slot + curr, insn + i);
6683 ptr = md.slot[curr].unwind_record;
6684 if (ptr)
6686 /* Set slot numbers for all remaining unwind records belonging to the
6687 current insn. There can not be any prologue/body unwind records
6688 here. */
6689 for (; ptr != end_ptr; ptr = ptr->next)
6691 ptr->slot_number = (unsigned long) f + i;
6692 ptr->slot_frag = frag_now;
6694 md.slot[curr].unwind_record = NULL;
6697 if (required_unit == IA64_UNIT_L)
6699 know (i == 1);
6700 /* skip one slot for long/X-unit instructions */
6701 ++i;
6703 --md.num_slots_in_use;
6704 last_slot = i;
6706 for (j = 0; j < md.slot[curr].num_fixups; ++j)
6708 ifix = md.slot[curr].fixup + j;
6709 fix = fix_new_exp (frag_now, frag_now_fix () - 16 + i, 8,
6710 &ifix->expr, ifix->is_pcrel, ifix->code);
6711 fix->tc_fix_data.opnd = ifix->opnd;
6712 fix->fx_file = md.slot[curr].src_file;
6713 fix->fx_line = md.slot[curr].src_line;
6716 end_of_insn_group = md.slot[curr].end_of_insn_group;
6718 /* clear slot: */
6719 ia64_free_opcode (md.slot[curr].idesc);
6720 memset (md.slot + curr, 0, sizeof (md.slot[curr]));
6721 md.slot[curr].user_template = -1;
6723 if (manual_bundling_off)
6725 manual_bundling = 0;
6726 break;
6728 curr = (curr + 1) % NUM_SLOTS;
6729 idesc = md.slot[curr].idesc;
6732 /* A user template was specified, but the first following instruction did
6733 not fit. This can happen with or without manual bundling. */
6734 if (md.num_slots_in_use > 0 && last_slot < 0)
6736 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6737 _("`%s' does not fit into %s template"),
6738 idesc->name, ia64_templ_desc[template].name);
6739 /* Drop first insn so we don't livelock. */
6740 --md.num_slots_in_use;
6741 know (curr == first);
6742 ia64_free_opcode (md.slot[curr].idesc);
6743 memset (md.slot + curr, 0, sizeof (md.slot[curr]));
6744 md.slot[curr].user_template = -1;
6746 else if (manual_bundling > 0)
6748 if (md.num_slots_in_use > 0)
6750 if (last_slot >= 2)
6751 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6752 _("`%s' does not fit into bundle"), idesc->name);
6753 else
6755 const char *where;
6757 if (template == 2)
6758 where = "X slot";
6759 else if (last_slot == 0)
6760 where = "slots 2 or 3";
6761 else
6762 where = "slot 3";
6763 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6764 _("`%s' can't go in %s of %s template"),
6765 idesc->name, where, ia64_templ_desc[template].name);
6768 else
6769 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6770 _("Missing '}' at end of file"));
6773 know (md.num_slots_in_use < NUM_SLOTS);
6775 t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
6776 t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
6778 number_to_chars_littleendian (f + 0, t0, 8);
6779 number_to_chars_littleendian (f + 8, t1, 8);
6783 md_parse_option (int c, char *arg)
6786 switch (c)
6788 /* Switches from the Intel assembler. */
6789 case 'm':
6790 if (strcmp (arg, "ilp64") == 0
6791 || strcmp (arg, "lp64") == 0
6792 || strcmp (arg, "p64") == 0)
6794 md.flags |= EF_IA_64_ABI64;
6796 else if (strcmp (arg, "ilp32") == 0)
6798 md.flags &= ~EF_IA_64_ABI64;
6800 else if (strcmp (arg, "le") == 0)
6802 md.flags &= ~EF_IA_64_BE;
6803 default_big_endian = 0;
6805 else if (strcmp (arg, "be") == 0)
6807 md.flags |= EF_IA_64_BE;
6808 default_big_endian = 1;
6810 else if (strncmp (arg, "unwind-check=", 13) == 0)
6812 arg += 13;
6813 if (strcmp (arg, "warning") == 0)
6814 md.unwind_check = unwind_check_warning;
6815 else if (strcmp (arg, "error") == 0)
6816 md.unwind_check = unwind_check_error;
6817 else
6818 return 0;
6820 else if (strncmp (arg, "hint.b=", 7) == 0)
6822 arg += 7;
6823 if (strcmp (arg, "ok") == 0)
6824 md.hint_b = hint_b_ok;
6825 else if (strcmp (arg, "warning") == 0)
6826 md.hint_b = hint_b_warning;
6827 else if (strcmp (arg, "error") == 0)
6828 md.hint_b = hint_b_error;
6829 else
6830 return 0;
6832 else if (strncmp (arg, "tune=", 5) == 0)
6834 arg += 5;
6835 if (strcmp (arg, "itanium1") == 0)
6836 md.tune = itanium1;
6837 else if (strcmp (arg, "itanium2") == 0)
6838 md.tune = itanium2;
6839 else
6840 return 0;
6842 else
6843 return 0;
6844 break;
6846 case 'N':
6847 if (strcmp (arg, "so") == 0)
6849 /* Suppress signon message. */
6851 else if (strcmp (arg, "pi") == 0)
6853 /* Reject privileged instructions. FIXME */
6855 else if (strcmp (arg, "us") == 0)
6857 /* Allow union of signed and unsigned range. FIXME */
6859 else if (strcmp (arg, "close_fcalls") == 0)
6861 /* Do not resolve global function calls. */
6863 else
6864 return 0;
6865 break;
6867 case 'C':
6868 /* temp[="prefix"] Insert temporary labels into the object file
6869 symbol table prefixed by "prefix".
6870 Default prefix is ":temp:".
6872 break;
6874 case 'a':
6875 /* indirect=<tgt> Assume unannotated indirect branches behavior
6876 according to <tgt> --
6877 exit: branch out from the current context (default)
6878 labels: all labels in context may be branch targets
6880 if (strncmp (arg, "indirect=", 9) != 0)
6881 return 0;
6882 break;
6884 case 'x':
6885 /* -X conflicts with an ignored option, use -x instead */
6886 md.detect_dv = 1;
6887 if (!arg || strcmp (arg, "explicit") == 0)
6889 /* set default mode to explicit */
6890 md.default_explicit_mode = 1;
6891 break;
6893 else if (strcmp (arg, "auto") == 0)
6895 md.default_explicit_mode = 0;
6897 else if (strcmp (arg, "none") == 0)
6899 md.detect_dv = 0;
6901 else if (strcmp (arg, "debug") == 0)
6903 md.debug_dv = 1;
6905 else if (strcmp (arg, "debugx") == 0)
6907 md.default_explicit_mode = 1;
6908 md.debug_dv = 1;
6910 else if (strcmp (arg, "debugn") == 0)
6912 md.debug_dv = 1;
6913 md.detect_dv = 0;
6915 else
6917 as_bad (_("Unrecognized option '-x%s'"), arg);
6919 break;
6921 case 'S':
6922 /* nops Print nops statistics. */
6923 break;
6925 /* GNU specific switches for gcc. */
6926 case OPTION_MCONSTANT_GP:
6927 md.flags |= EF_IA_64_CONS_GP;
6928 break;
6930 case OPTION_MAUTO_PIC:
6931 md.flags |= EF_IA_64_NOFUNCDESC_CONS_GP;
6932 break;
6934 default:
6935 return 0;
6938 return 1;
6941 void
6942 md_show_usage (FILE *stream)
6944 fputs (_("\
6945 IA-64 options:\n\
6946 --mconstant-gp mark output file as using the constant-GP model\n\
6947 (sets ELF header flag EF_IA_64_CONS_GP)\n\
6948 --mauto-pic mark output file as using the constant-GP model\n\
6949 without function descriptors (sets ELF header flag\n\
6950 EF_IA_64_NOFUNCDESC_CONS_GP)\n\
6951 -milp32|-milp64|-mlp64|-mp64 select data model (default -mlp64)\n\
6952 -mle | -mbe select little- or big-endian byte order (default -mle)\n\
6953 -mtune=[itanium1|itanium2]\n\
6954 tune for a specific CPU (default -mtune=itanium2)\n\
6955 -munwind-check=[warning|error]\n\
6956 unwind directive check (default -munwind-check=warning)\n\
6957 -mhint.b=[ok|warning|error]\n\
6958 hint.b check (default -mhint.b=error)\n\
6959 -x | -xexplicit turn on dependency violation checking\n\
6960 -xauto automagically remove dependency violations (default)\n\
6961 -xnone turn off dependency violation checking\n\
6962 -xdebug debug dependency violation checker\n\
6963 -xdebugn debug dependency violation checker but turn off\n\
6964 dependency violation checking\n\
6965 -xdebugx debug dependency violation checker and turn on\n\
6966 dependency violation checking\n"),
6967 stream);
6970 void
6971 ia64_after_parse_args (void)
6973 if (debug_type == DEBUG_STABS)
6974 as_fatal (_("--gstabs is not supported for ia64"));
6977 /* Return true if TYPE fits in TEMPL at SLOT. */
6979 static int
6980 match (int templ, int type, int slot)
6982 enum ia64_unit unit;
6983 int result;
6985 unit = ia64_templ_desc[templ].exec_unit[slot];
6986 switch (type)
6988 case IA64_TYPE_DYN: result = 1; break; /* for nop and break */
6989 case IA64_TYPE_A:
6990 result = (unit == IA64_UNIT_I || unit == IA64_UNIT_M);
6991 break;
6992 case IA64_TYPE_X: result = (unit == IA64_UNIT_L); break;
6993 case IA64_TYPE_I: result = (unit == IA64_UNIT_I); break;
6994 case IA64_TYPE_M: result = (unit == IA64_UNIT_M); break;
6995 case IA64_TYPE_B: result = (unit == IA64_UNIT_B); break;
6996 case IA64_TYPE_F: result = (unit == IA64_UNIT_F); break;
6997 default: result = 0; break;
6999 return result;
7002 /* For Itanium 1, add a bit of extra goodness if a nop of type F or B would fit
7003 in TEMPL at SLOT. For Itanium 2, add a bit of extra goodness if a nop of
7004 type M or I would fit in TEMPL at SLOT. */
7006 static inline int
7007 extra_goodness (int templ, int slot)
7009 switch (md.tune)
7011 case itanium1:
7012 if (slot == 1 && match (templ, IA64_TYPE_F, slot))
7013 return 2;
7014 else if (slot == 2 && match (templ, IA64_TYPE_B, slot))
7015 return 1;
7016 else
7017 return 0;
7018 break;
7019 case itanium2:
7020 if (match (templ, IA64_TYPE_M, slot)
7021 || match (templ, IA64_TYPE_I, slot))
7022 /* Favor M- and I-unit NOPs. We definitely want to avoid
7023 F-unit and B-unit may cause split-issue or less-than-optimal
7024 branch-prediction. */
7025 return 2;
7026 else
7027 return 0;
7028 break;
7029 default:
7030 abort ();
7031 return 0;
7035 /* This function is called once, at assembler startup time. It sets
7036 up all the tables, etc. that the MD part of the assembler will need
7037 that can be determined before arguments are parsed. */
7038 void
7039 md_begin (void)
7041 int i, j, k, t, goodness, best, ok;
7042 const char *err;
7043 char name[8];
7045 md.auto_align = 1;
7046 md.explicit_mode = md.default_explicit_mode;
7048 bfd_set_section_alignment (stdoutput, text_section, 4);
7050 /* Make sure function pointers get initialized. */
7051 target_big_endian = -1;
7052 dot_byteorder (default_big_endian);
7054 alias_hash = hash_new ();
7055 alias_name_hash = hash_new ();
7056 secalias_hash = hash_new ();
7057 secalias_name_hash = hash_new ();
7059 pseudo_func[FUNC_DTP_MODULE].u.sym =
7060 symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
7061 &zero_address_frag);
7063 pseudo_func[FUNC_DTP_RELATIVE].u.sym =
7064 symbol_new (".<dtprel>", undefined_section, FUNC_DTP_RELATIVE,
7065 &zero_address_frag);
7067 pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
7068 symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
7069 &zero_address_frag);
7071 pseudo_func[FUNC_GP_RELATIVE].u.sym =
7072 symbol_new (".<gprel>", undefined_section, FUNC_GP_RELATIVE,
7073 &zero_address_frag);
7075 pseudo_func[FUNC_LT_RELATIVE].u.sym =
7076 symbol_new (".<ltoff>", undefined_section, FUNC_LT_RELATIVE,
7077 &zero_address_frag);
7079 pseudo_func[FUNC_LT_RELATIVE_X].u.sym =
7080 symbol_new (".<ltoffx>", undefined_section, FUNC_LT_RELATIVE_X,
7081 &zero_address_frag);
7083 pseudo_func[FUNC_PC_RELATIVE].u.sym =
7084 symbol_new (".<pcrel>", undefined_section, FUNC_PC_RELATIVE,
7085 &zero_address_frag);
7087 pseudo_func[FUNC_PLT_RELATIVE].u.sym =
7088 symbol_new (".<pltoff>", undefined_section, FUNC_PLT_RELATIVE,
7089 &zero_address_frag);
7091 pseudo_func[FUNC_SEC_RELATIVE].u.sym =
7092 symbol_new (".<secrel>", undefined_section, FUNC_SEC_RELATIVE,
7093 &zero_address_frag);
7095 pseudo_func[FUNC_SEG_RELATIVE].u.sym =
7096 symbol_new (".<segrel>", undefined_section, FUNC_SEG_RELATIVE,
7097 &zero_address_frag);
7099 pseudo_func[FUNC_TP_RELATIVE].u.sym =
7100 symbol_new (".<tprel>", undefined_section, FUNC_TP_RELATIVE,
7101 &zero_address_frag);
7103 pseudo_func[FUNC_LTV_RELATIVE].u.sym =
7104 symbol_new (".<ltv>", undefined_section, FUNC_LTV_RELATIVE,
7105 &zero_address_frag);
7107 pseudo_func[FUNC_LT_FPTR_RELATIVE].u.sym =
7108 symbol_new (".<ltoff.fptr>", undefined_section, FUNC_LT_FPTR_RELATIVE,
7109 &zero_address_frag);
7111 pseudo_func[FUNC_LT_DTP_MODULE].u.sym =
7112 symbol_new (".<ltoff.dtpmod>", undefined_section, FUNC_LT_DTP_MODULE,
7113 &zero_address_frag);
7115 pseudo_func[FUNC_LT_DTP_RELATIVE].u.sym =
7116 symbol_new (".<ltoff.dptrel>", undefined_section, FUNC_LT_DTP_RELATIVE,
7117 &zero_address_frag);
7119 pseudo_func[FUNC_LT_TP_RELATIVE].u.sym =
7120 symbol_new (".<ltoff.tprel>", undefined_section, FUNC_LT_TP_RELATIVE,
7121 &zero_address_frag);
7123 pseudo_func[FUNC_IPLT_RELOC].u.sym =
7124 symbol_new (".<iplt>", undefined_section, FUNC_IPLT_RELOC,
7125 &zero_address_frag);
7127 if (md.tune != itanium1)
7129 /* Convert MFI NOPs bundles into MMI NOPs bundles. */
7130 le_nop[0] = 0x8;
7131 le_nop_stop[0] = 0x9;
7134 /* Compute the table of best templates. We compute goodness as a
7135 base 4 value, in which each match counts for 3. Match-failures
7136 result in NOPs and we use extra_goodness() to pick the execution
7137 units that are best suited for issuing the NOP. */
7138 for (i = 0; i < IA64_NUM_TYPES; ++i)
7139 for (j = 0; j < IA64_NUM_TYPES; ++j)
7140 for (k = 0; k < IA64_NUM_TYPES; ++k)
7142 best = 0;
7143 for (t = 0; t < NELEMS (ia64_templ_desc); ++t)
7145 goodness = 0;
7146 if (match (t, i, 0))
7148 if (match (t, j, 1))
7150 if ((t == 2 && j == IA64_TYPE_X) || match (t, k, 2))
7151 goodness = 3 + 3 + 3;
7152 else
7153 goodness = 3 + 3 + extra_goodness (t, 2);
7155 else if (match (t, j, 2))
7156 goodness = 3 + 3 + extra_goodness (t, 1);
7157 else
7159 goodness = 3;
7160 goodness += extra_goodness (t, 1);
7161 goodness += extra_goodness (t, 2);
7164 else if (match (t, i, 1))
7166 if ((t == 2 && i == IA64_TYPE_X) || match (t, j, 2))
7167 goodness = 3 + 3;
7168 else
7169 goodness = 3 + extra_goodness (t, 2);
7171 else if (match (t, i, 2))
7172 goodness = 3 + extra_goodness (t, 1);
7174 if (goodness > best)
7176 best = goodness;
7177 best_template[i][j][k] = t;
7182 #ifdef DEBUG_TEMPLATES
7183 /* For debugging changes to the best_template calculations. We don't care
7184 about combinations with invalid instructions, so start the loops at 1. */
7185 for (i = 0; i < IA64_NUM_TYPES; ++i)
7186 for (j = 0; j < IA64_NUM_TYPES; ++j)
7187 for (k = 0; k < IA64_NUM_TYPES; ++k)
7189 char type_letter[IA64_NUM_TYPES] = { 'n', 'a', 'i', 'm', 'b', 'f',
7190 'x', 'd' };
7191 fprintf (stderr, "%c%c%c %s\n", type_letter[i], type_letter[j],
7192 type_letter[k],
7193 ia64_templ_desc[best_template[i][j][k]].name);
7195 #endif
7197 for (i = 0; i < NUM_SLOTS; ++i)
7198 md.slot[i].user_template = -1;
7200 md.pseudo_hash = hash_new ();
7201 for (i = 0; i < NELEMS (pseudo_opcode); ++i)
7203 err = hash_insert (md.pseudo_hash, pseudo_opcode[i].name,
7204 (void *) (pseudo_opcode + i));
7205 if (err)
7206 as_fatal (_("ia64.md_begin: can't hash `%s': %s"),
7207 pseudo_opcode[i].name, err);
7210 md.reg_hash = hash_new ();
7211 md.dynreg_hash = hash_new ();
7212 md.const_hash = hash_new ();
7213 md.entry_hash = hash_new ();
7215 /* general registers: */
7216 declare_register_set ("r", 128, REG_GR);
7217 declare_register ("gp", REG_GR + 1);
7218 declare_register ("sp", REG_GR + 12);
7219 declare_register ("tp", REG_GR + 13);
7220 declare_register_set ("ret", 4, REG_GR + 8);
7222 /* floating point registers: */
7223 declare_register_set ("f", 128, REG_FR);
7224 declare_register_set ("farg", 8, REG_FR + 8);
7225 declare_register_set ("fret", 8, REG_FR + 8);
7227 /* branch registers: */
7228 declare_register_set ("b", 8, REG_BR);
7229 declare_register ("rp", REG_BR + 0);
7231 /* predicate registers: */
7232 declare_register_set ("p", 64, REG_P);
7233 declare_register ("pr", REG_PR);
7234 declare_register ("pr.rot", REG_PR_ROT);
7236 /* application registers: */
7237 declare_register_set ("ar", 128, REG_AR);
7238 for (i = 0; i < NELEMS (ar); ++i)
7239 declare_register (ar[i].name, REG_AR + ar[i].regnum);
7241 /* control registers: */
7242 declare_register_set ("cr", 128, REG_CR);
7243 for (i = 0; i < NELEMS (cr); ++i)
7244 declare_register (cr[i].name, REG_CR + cr[i].regnum);
7246 declare_register ("ip", REG_IP);
7247 declare_register ("cfm", REG_CFM);
7248 declare_register ("psr", REG_PSR);
7249 declare_register ("psr.l", REG_PSR_L);
7250 declare_register ("psr.um", REG_PSR_UM);
7252 for (i = 0; i < NELEMS (indirect_reg); ++i)
7254 unsigned int regnum = indirect_reg[i].regnum;
7256 md.indregsym[regnum - IND_CPUID] = declare_register (indirect_reg[i].name, regnum);
7259 /* pseudo-registers used to specify unwind info: */
7260 declare_register ("psp", REG_PSP);
7262 for (i = 0; i < NELEMS (const_bits); ++i)
7264 err = hash_insert (md.const_hash, const_bits[i].name,
7265 (void *) (const_bits + i));
7266 if (err)
7267 as_fatal (_("Inserting \"%s\" into constant hash table failed: %s"),
7268 name, err);
7271 /* Set the architecture and machine depending on defaults and command line
7272 options. */
7273 if (md.flags & EF_IA_64_ABI64)
7274 ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf64);
7275 else
7276 ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf32);
7278 if (! ok)
7279 as_warn (_("Could not set architecture and machine"));
7281 /* Set the pointer size and pointer shift size depending on md.flags */
7283 if (md.flags & EF_IA_64_ABI64)
7285 md.pointer_size = 8; /* pointers are 8 bytes */
7286 md.pointer_size_shift = 3; /* alignment is 8 bytes = 2^2 */
7288 else
7290 md.pointer_size = 4; /* pointers are 4 bytes */
7291 md.pointer_size_shift = 2; /* alignment is 4 bytes = 2^2 */
7294 md.mem_offset.hint = 0;
7295 md.path = 0;
7296 md.maxpaths = 0;
7297 md.entry_labels = NULL;
7300 /* Set the default options in md. Cannot do this in md_begin because
7301 that is called after md_parse_option which is where we set the
7302 options in md based on command line options. */
7304 void
7305 ia64_init (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
7307 md.flags = MD_FLAGS_DEFAULT;
7308 #ifndef TE_VMS
7309 /* Don't turn on dependency checking for VMS, doesn't work. */
7310 md.detect_dv = 1;
7311 #endif
7312 /* FIXME: We should change it to unwind_check_error someday. */
7313 md.unwind_check = unwind_check_warning;
7314 md.hint_b = hint_b_error;
7315 md.tune = itanium2;
7318 /* Return a string for the target object file format. */
7320 const char *
7321 ia64_target_format (void)
7323 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
7325 if (md.flags & EF_IA_64_BE)
7327 if (md.flags & EF_IA_64_ABI64)
7328 #if defined(TE_AIX50)
7329 return "elf64-ia64-aix-big";
7330 #elif defined(TE_HPUX)
7331 return "elf64-ia64-hpux-big";
7332 #else
7333 return "elf64-ia64-big";
7334 #endif
7335 else
7336 #if defined(TE_AIX50)
7337 return "elf32-ia64-aix-big";
7338 #elif defined(TE_HPUX)
7339 return "elf32-ia64-hpux-big";
7340 #else
7341 return "elf32-ia64-big";
7342 #endif
7344 else
7346 if (md.flags & EF_IA_64_ABI64)
7347 #if defined (TE_AIX50)
7348 return "elf64-ia64-aix-little";
7349 #elif defined (TE_VMS)
7351 md.flags |= EF_IA_64_ARCHVER_1;
7352 return "elf64-ia64-vms";
7354 #else
7355 return "elf64-ia64-little";
7356 #endif
7357 else
7358 #ifdef TE_AIX50
7359 return "elf32-ia64-aix-little";
7360 #else
7361 return "elf32-ia64-little";
7362 #endif
7365 else
7366 return "unknown-format";
7369 void
7370 ia64_end_of_source (void)
7372 /* terminate insn group upon reaching end of file: */
7373 insn_group_break (1, 0, 0);
7375 /* emits slots we haven't written yet: */
7376 ia64_flush_insns ();
7378 bfd_set_private_flags (stdoutput, md.flags);
7380 md.mem_offset.hint = 0;
7383 void
7384 ia64_start_line (void)
7386 static int first;
7388 if (!first) {
7389 /* Make sure we don't reference input_line_pointer[-1] when that's
7390 not valid. */
7391 first = 1;
7392 return;
7395 if (md.qp.X_op == O_register)
7396 as_bad (_("qualifying predicate not followed by instruction"));
7397 md.qp.X_op = O_absent;
7399 if (ignore_input ())
7400 return;
7402 if (input_line_pointer[0] == ';' && input_line_pointer[-1] == ';')
7404 if (md.detect_dv && !md.explicit_mode)
7406 static int warned;
7408 if (!warned)
7410 warned = 1;
7411 as_warn (_("Explicit stops are ignored in auto mode"));
7414 else
7415 insn_group_break (1, 0, 0);
7417 else if (input_line_pointer[-1] == '{')
7419 if (md.manual_bundling)
7420 as_warn (_("Found '{' when manual bundling is already turned on"));
7421 else
7422 CURR_SLOT.manual_bundling_on = 1;
7423 md.manual_bundling = 1;
7425 /* Bundling is only acceptable in explicit mode
7426 or when in default automatic mode. */
7427 if (md.detect_dv && !md.explicit_mode)
7429 if (!md.mode_explicitly_set
7430 && !md.default_explicit_mode)
7431 dot_dv_mode ('E');
7432 else
7433 as_warn (_("Found '{' after explicit switch to automatic mode"));
7436 else if (input_line_pointer[-1] == '}')
7438 if (!md.manual_bundling)
7439 as_warn (_("Found '}' when manual bundling is off"));
7440 else
7441 PREV_SLOT.manual_bundling_off = 1;
7442 md.manual_bundling = 0;
7444 /* switch back to automatic mode, if applicable */
7445 if (md.detect_dv
7446 && md.explicit_mode
7447 && !md.mode_explicitly_set
7448 && !md.default_explicit_mode)
7449 dot_dv_mode ('A');
7453 /* This is a hook for ia64_frob_label, so that it can distinguish tags from
7454 labels. */
7455 static int defining_tag = 0;
7458 ia64_unrecognized_line (int ch)
7460 switch (ch)
7462 case '(':
7463 expression_and_evaluate (&md.qp);
7464 if (*input_line_pointer++ != ')')
7466 as_bad (_("Expected ')'"));
7467 return 0;
7469 if (md.qp.X_op != O_register)
7471 as_bad (_("Qualifying predicate expected"));
7472 return 0;
7474 if (md.qp.X_add_number < REG_P || md.qp.X_add_number >= REG_P + 64)
7476 as_bad (_("Predicate register expected"));
7477 return 0;
7479 return 1;
7481 case '[':
7483 char *s;
7484 char c;
7485 symbolS *tag;
7486 int temp;
7488 if (md.qp.X_op == O_register)
7490 as_bad (_("Tag must come before qualifying predicate."));
7491 return 0;
7494 /* This implements just enough of read_a_source_file in read.c to
7495 recognize labels. */
7496 if (is_name_beginner (*input_line_pointer))
7498 s = input_line_pointer;
7499 c = get_symbol_end ();
7501 else if (LOCAL_LABELS_FB
7502 && ISDIGIT (*input_line_pointer))
7504 temp = 0;
7505 while (ISDIGIT (*input_line_pointer))
7506 temp = (temp * 10) + *input_line_pointer++ - '0';
7507 fb_label_instance_inc (temp);
7508 s = fb_label_name (temp, 0);
7509 c = *input_line_pointer;
7511 else
7513 s = NULL;
7514 c = '\0';
7516 if (c != ':')
7518 /* Put ':' back for error messages' sake. */
7519 *input_line_pointer++ = ':';
7520 as_bad (_("Expected ':'"));
7521 return 0;
7524 defining_tag = 1;
7525 tag = colon (s);
7526 defining_tag = 0;
7527 /* Put ':' back for error messages' sake. */
7528 *input_line_pointer++ = ':';
7529 if (*input_line_pointer++ != ']')
7531 as_bad (_("Expected ']'"));
7532 return 0;
7534 if (! tag)
7536 as_bad (_("Tag name expected"));
7537 return 0;
7539 return 1;
7542 default:
7543 break;
7546 /* Not a valid line. */
7547 return 0;
7550 void
7551 ia64_frob_label (struct symbol *sym)
7553 struct label_fix *fix;
7555 /* Tags need special handling since they are not bundle breaks like
7556 labels. */
7557 if (defining_tag)
7559 fix = obstack_alloc (&notes, sizeof (*fix));
7560 fix->sym = sym;
7561 fix->next = CURR_SLOT.tag_fixups;
7562 fix->dw2_mark_labels = FALSE;
7563 CURR_SLOT.tag_fixups = fix;
7565 return;
7568 if (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7570 md.last_text_seg = now_seg;
7571 fix = obstack_alloc (&notes, sizeof (*fix));
7572 fix->sym = sym;
7573 fix->next = CURR_SLOT.label_fixups;
7574 fix->dw2_mark_labels = dwarf2_loc_mark_labels;
7575 CURR_SLOT.label_fixups = fix;
7577 /* Keep track of how many code entry points we've seen. */
7578 if (md.path == md.maxpaths)
7580 md.maxpaths += 20;
7581 md.entry_labels = (const char **)
7582 xrealloc ((void *) md.entry_labels,
7583 md.maxpaths * sizeof (char *));
7585 md.entry_labels[md.path++] = S_GET_NAME (sym);
7589 #ifdef TE_HPUX
7590 /* The HP-UX linker will give unresolved symbol errors for symbols
7591 that are declared but unused. This routine removes declared,
7592 unused symbols from an object. */
7594 ia64_frob_symbol (struct symbol *sym)
7596 if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym) &&
7597 ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT)
7598 || (S_GET_SEGMENT (sym) == &bfd_abs_section
7599 && ! S_IS_EXTERNAL (sym)))
7600 return 1;
7601 return 0;
7603 #endif
7605 void
7606 ia64_flush_pending_output (void)
7608 if (!md.keep_pending_output
7609 && bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7611 /* ??? This causes many unnecessary stop bits to be emitted.
7612 Unfortunately, it isn't clear if it is safe to remove this. */
7613 insn_group_break (1, 0, 0);
7614 ia64_flush_insns ();
7618 /* Do ia64-specific expression optimization. All that's done here is
7619 to transform index expressions that are either due to the indexing
7620 of rotating registers or due to the indexing of indirect register
7621 sets. */
7623 ia64_optimize_expr (expressionS *l, operatorT op, expressionS *r)
7625 if (op != O_index)
7626 return 0;
7627 resolve_expression (l);
7628 if (l->X_op == O_register)
7630 unsigned num_regs = l->X_add_number >> 16;
7632 resolve_expression (r);
7633 if (num_regs)
7635 /* Left side is a .rotX-allocated register. */
7636 if (r->X_op != O_constant)
7638 as_bad (_("Rotating register index must be a non-negative constant"));
7639 r->X_add_number = 0;
7641 else if ((valueT) r->X_add_number >= num_regs)
7643 as_bad (_("Index out of range 0..%u"), num_regs - 1);
7644 r->X_add_number = 0;
7646 l->X_add_number = (l->X_add_number & 0xffff) + r->X_add_number;
7647 return 1;
7649 else if (l->X_add_number >= IND_CPUID && l->X_add_number <= IND_RR)
7651 if (r->X_op != O_register
7652 || r->X_add_number < REG_GR
7653 || r->X_add_number > REG_GR + 127)
7655 as_bad (_("Indirect register index must be a general register"));
7656 r->X_add_number = REG_GR;
7658 l->X_op = O_index;
7659 l->X_op_symbol = md.indregsym[l->X_add_number - IND_CPUID];
7660 l->X_add_number = r->X_add_number;
7661 return 1;
7664 as_bad (_("Index can only be applied to rotating or indirect registers"));
7665 /* Fall back to some register use of which has as little as possible
7666 side effects, to minimize subsequent error messages. */
7667 l->X_op = O_register;
7668 l->X_add_number = REG_GR + 3;
7669 return 1;
7673 ia64_parse_name (char *name, expressionS *e, char *nextcharP)
7675 struct const_desc *cdesc;
7676 struct dynreg *dr = 0;
7677 unsigned int idx;
7678 struct symbol *sym;
7679 char *end;
7681 if (*name == '@')
7683 enum pseudo_type pseudo_type = PSEUDO_FUNC_NONE;
7685 /* Find what relocation pseudo-function we're dealing with. */
7686 for (idx = 0; idx < NELEMS (pseudo_func); ++idx)
7687 if (pseudo_func[idx].name
7688 && pseudo_func[idx].name[0] == name[1]
7689 && strcmp (pseudo_func[idx].name + 1, name + 2) == 0)
7691 pseudo_type = pseudo_func[idx].type;
7692 break;
7694 switch (pseudo_type)
7696 case PSEUDO_FUNC_RELOC:
7697 end = input_line_pointer;
7698 if (*nextcharP != '(')
7700 as_bad (_("Expected '('"));
7701 break;
7703 /* Skip '('. */
7704 ++input_line_pointer;
7705 expression (e);
7706 if (*input_line_pointer != ')')
7708 as_bad (_("Missing ')'"));
7709 goto done;
7711 /* Skip ')'. */
7712 ++input_line_pointer;
7713 if (e->X_op != O_symbol)
7715 if (e->X_op != O_pseudo_fixup)
7717 as_bad (_("Not a symbolic expression"));
7718 goto done;
7720 if (idx != FUNC_LT_RELATIVE)
7722 as_bad (_("Illegal combination of relocation functions"));
7723 goto done;
7725 switch (S_GET_VALUE (e->X_op_symbol))
7727 case FUNC_FPTR_RELATIVE:
7728 idx = FUNC_LT_FPTR_RELATIVE; break;
7729 case FUNC_DTP_MODULE:
7730 idx = FUNC_LT_DTP_MODULE; break;
7731 case FUNC_DTP_RELATIVE:
7732 idx = FUNC_LT_DTP_RELATIVE; break;
7733 case FUNC_TP_RELATIVE:
7734 idx = FUNC_LT_TP_RELATIVE; break;
7735 default:
7736 as_bad (_("Illegal combination of relocation functions"));
7737 goto done;
7740 /* Make sure gas doesn't get rid of local symbols that are used
7741 in relocs. */
7742 e->X_op = O_pseudo_fixup;
7743 e->X_op_symbol = pseudo_func[idx].u.sym;
7744 done:
7745 *nextcharP = *input_line_pointer;
7746 break;
7748 case PSEUDO_FUNC_CONST:
7749 e->X_op = O_constant;
7750 e->X_add_number = pseudo_func[idx].u.ival;
7751 break;
7753 case PSEUDO_FUNC_REG:
7754 e->X_op = O_register;
7755 e->X_add_number = pseudo_func[idx].u.ival;
7756 break;
7758 default:
7759 return 0;
7761 return 1;
7764 /* first see if NAME is a known register name: */
7765 sym = hash_find (md.reg_hash, name);
7766 if (sym)
7768 e->X_op = O_register;
7769 e->X_add_number = S_GET_VALUE (sym);
7770 return 1;
7773 cdesc = hash_find (md.const_hash, name);
7774 if (cdesc)
7776 e->X_op = O_constant;
7777 e->X_add_number = cdesc->value;
7778 return 1;
7781 /* check for inN, locN, or outN: */
7782 idx = 0;
7783 switch (name[0])
7785 case 'i':
7786 if (name[1] == 'n' && ISDIGIT (name[2]))
7788 dr = &md.in;
7789 idx = 2;
7791 break;
7793 case 'l':
7794 if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
7796 dr = &md.loc;
7797 idx = 3;
7799 break;
7801 case 'o':
7802 if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
7804 dr = &md.out;
7805 idx = 3;
7807 break;
7809 default:
7810 break;
7813 /* Ignore register numbers with leading zeroes, except zero itself. */
7814 if (dr && (name[idx] != '0' || name[idx + 1] == '\0'))
7816 unsigned long regnum;
7818 /* The name is inN, locN, or outN; parse the register number. */
7819 regnum = strtoul (name + idx, &end, 10);
7820 if (end > name + idx && *end == '\0' && regnum < 96)
7822 if (regnum >= dr->num_regs)
7824 if (!dr->num_regs)
7825 as_bad (_("No current frame"));
7826 else
7827 as_bad (_("Register number out of range 0..%u"),
7828 dr->num_regs - 1);
7829 regnum = 0;
7831 e->X_op = O_register;
7832 e->X_add_number = dr->base + regnum;
7833 return 1;
7837 end = alloca (strlen (name) + 1);
7838 strcpy (end, name);
7839 name = ia64_canonicalize_symbol_name (end);
7840 if ((dr = hash_find (md.dynreg_hash, name)))
7842 /* We've got ourselves the name of a rotating register set.
7843 Store the base register number in the low 16 bits of
7844 X_add_number and the size of the register set in the top 16
7845 bits. */
7846 e->X_op = O_register;
7847 e->X_add_number = dr->base | (dr->num_regs << 16);
7848 return 1;
7850 return 0;
7853 /* Remove the '#' suffix that indicates a symbol as opposed to a register. */
7855 char *
7856 ia64_canonicalize_symbol_name (char *name)
7858 size_t len = strlen (name), full = len;
7860 while (len > 0 && name[len - 1] == '#')
7861 --len;
7862 if (len <= 0)
7864 if (full > 0)
7865 as_bad (_("Standalone `#' is illegal"));
7867 else if (len < full - 1)
7868 as_warn (_("Redundant `#' suffix operators"));
7869 name[len] = '\0';
7870 return name;
7873 /* Return true if idesc is a conditional branch instruction. This excludes
7874 the modulo scheduled branches, and br.ia. Mod-sched branches are excluded
7875 because they always read/write resources regardless of the value of the
7876 qualifying predicate. br.ia must always use p0, and hence is always
7877 taken. Thus this function returns true for branches which can fall
7878 through, and which use no resources if they do fall through. */
7880 static int
7881 is_conditional_branch (struct ia64_opcode *idesc)
7883 /* br is a conditional branch. Everything that starts with br. except
7884 br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
7885 Everything that starts with brl is a conditional branch. */
7886 return (idesc->name[0] == 'b' && idesc->name[1] == 'r'
7887 && (idesc->name[2] == '\0'
7888 || (idesc->name[2] == '.' && idesc->name[3] != 'i'
7889 && idesc->name[3] != 'c' && idesc->name[3] != 'w')
7890 || idesc->name[2] == 'l'
7891 /* br.cond, br.call, br.clr */
7892 || (idesc->name[2] == '.' && idesc->name[3] == 'c'
7893 && (idesc->name[4] == 'a' || idesc->name[4] == 'o'
7894 || (idesc->name[4] == 'l' && idesc->name[5] == 'r')))));
7897 /* Return whether the given opcode is a taken branch. If there's any doubt,
7898 returns zero. */
7900 static int
7901 is_taken_branch (struct ia64_opcode *idesc)
7903 return ((is_conditional_branch (idesc) && CURR_SLOT.qp_regno == 0)
7904 || strncmp (idesc->name, "br.ia", 5) == 0);
7907 /* Return whether the given opcode is an interruption or rfi. If there's any
7908 doubt, returns zero. */
7910 static int
7911 is_interruption_or_rfi (struct ia64_opcode *idesc)
7913 if (strcmp (idesc->name, "rfi") == 0)
7914 return 1;
7915 return 0;
7918 /* Returns the index of the given dependency in the opcode's list of chks, or
7919 -1 if there is no dependency. */
7921 static int
7922 depends_on (int depind, struct ia64_opcode *idesc)
7924 int i;
7925 const struct ia64_opcode_dependency *dep = idesc->dependencies;
7926 for (i = 0; i < dep->nchks; i++)
7928 if (depind == DEP (dep->chks[i]))
7929 return i;
7931 return -1;
7934 /* Determine a set of specific resources used for a particular resource
7935 class. Returns the number of specific resources identified For those
7936 cases which are not determinable statically, the resource returned is
7937 marked nonspecific.
7939 Meanings of value in 'NOTE':
7940 1) only read/write when the register number is explicitly encoded in the
7941 insn.
7942 2) only read CFM when accessing a rotating GR, FR, or PR. mov pr only
7943 accesses CFM when qualifying predicate is in the rotating region.
7944 3) general register value is used to specify an indirect register; not
7945 determinable statically.
7946 4) only read the given resource when bits 7:0 of the indirect index
7947 register value does not match the register number of the resource; not
7948 determinable statically.
7949 5) all rules are implementation specific.
7950 6) only when both the index specified by the reader and the index specified
7951 by the writer have the same value in bits 63:61; not determinable
7952 statically.
7953 7) only access the specified resource when the corresponding mask bit is
7955 8) PSR.dfh is only read when these insns reference FR32-127. PSR.dfl is
7956 only read when these insns reference FR2-31
7957 9) PSR.mfl is only written when these insns write FR2-31. PSR.mfh is only
7958 written when these insns write FR32-127
7959 10) The PSR.bn bit is only accessed when one of GR16-31 is specified in the
7960 instruction
7961 11) The target predicates are written independently of PR[qp], but source
7962 registers are only read if PR[qp] is true. Since the state of PR[qp]
7963 cannot statically be determined, all source registers are marked used.
7964 12) This insn only reads the specified predicate register when that
7965 register is the PR[qp].
7966 13) This reference to ld-c only applies to the GR whose value is loaded
7967 with data returned from memory, not the post-incremented address register.
7968 14) The RSE resource includes the implementation-specific RSE internal
7969 state resources. At least one (and possibly more) of these resources are
7970 read by each instruction listed in IC:rse-readers. At least one (and
7971 possibly more) of these resources are written by each insn listed in
7972 IC:rse-writers.
7973 15+16) Represents reserved instructions, which the assembler does not
7974 generate.
7975 17) CR[TPR] has a RAW dependency only between mov-to-CR-TPR and
7976 mov-to-PSR-l or ssm instructions that set PSR.i, PSR.pp or PSR.up.
7978 Memory resources (i.e. locations in memory) are *not* marked or tracked by
7979 this code; there are no dependency violations based on memory access.
7982 #define MAX_SPECS 256
7983 #define DV_CHK 1
7984 #define DV_REG 0
7986 static int
7987 specify_resource (const struct ia64_dependency *dep,
7988 struct ia64_opcode *idesc,
7989 /* is this a DV chk or a DV reg? */
7990 int type,
7991 /* returned specific resources */
7992 struct rsrc specs[MAX_SPECS],
7993 /* resource note for this insn's usage */
7994 int note,
7995 /* which execution path to examine */
7996 int path)
7998 int count = 0;
7999 int i;
8000 int rsrc_write = 0;
8001 struct rsrc tmpl;
8003 if (dep->mode == IA64_DV_WAW
8004 || (dep->mode == IA64_DV_RAW && type == DV_REG)
8005 || (dep->mode == IA64_DV_WAR && type == DV_CHK))
8006 rsrc_write = 1;
8008 /* template for any resources we identify */
8009 tmpl.dependency = dep;
8010 tmpl.note = note;
8011 tmpl.insn_srlz = tmpl.data_srlz = 0;
8012 tmpl.qp_regno = CURR_SLOT.qp_regno;
8013 tmpl.link_to_qp_branch = 1;
8014 tmpl.mem_offset.hint = 0;
8015 tmpl.mem_offset.offset = 0;
8016 tmpl.mem_offset.base = 0;
8017 tmpl.specific = 1;
8018 tmpl.index = -1;
8019 tmpl.cmp_type = CMP_NONE;
8020 tmpl.depind = 0;
8021 tmpl.file = NULL;
8022 tmpl.line = 0;
8023 tmpl.path = 0;
8025 #define UNHANDLED \
8026 as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
8027 dep->name, idesc->name, (rsrc_write?"write":"read"), note)
8028 #define KNOWN(REG) (gr_values[REG].known && gr_values[REG].path >= path)
8030 /* we don't need to track these */
8031 if (dep->semantics == IA64_DVS_NONE)
8032 return 0;
8034 switch (dep->specifier)
8036 case IA64_RS_AR_K:
8037 if (note == 1)
8039 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8041 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8042 if (regno >= 0 && regno <= 7)
8044 specs[count] = tmpl;
8045 specs[count++].index = regno;
8049 else if (note == 0)
8051 for (i = 0; i < 8; i++)
8053 specs[count] = tmpl;
8054 specs[count++].index = i;
8057 else
8059 UNHANDLED;
8061 break;
8063 case IA64_RS_AR_UNAT:
8064 /* This is a mov =AR or mov AR= instruction. */
8065 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8067 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8068 if (regno == AR_UNAT)
8070 specs[count++] = tmpl;
8073 else
8075 /* This is a spill/fill, or other instruction that modifies the
8076 unat register. */
8078 /* Unless we can determine the specific bits used, mark the whole
8079 thing; bits 8:3 of the memory address indicate the bit used in
8080 UNAT. The .mem.offset hint may be used to eliminate a small
8081 subset of conflicts. */
8082 specs[count] = tmpl;
8083 if (md.mem_offset.hint)
8085 if (md.debug_dv)
8086 fprintf (stderr, " Using hint for spill/fill\n");
8087 /* The index isn't actually used, just set it to something
8088 approximating the bit index. */
8089 specs[count].index = (md.mem_offset.offset >> 3) & 0x3F;
8090 specs[count].mem_offset.hint = 1;
8091 specs[count].mem_offset.offset = md.mem_offset.offset;
8092 specs[count++].mem_offset.base = md.mem_offset.base;
8094 else
8096 specs[count++].specific = 0;
8099 break;
8101 case IA64_RS_AR:
8102 if (note == 1)
8104 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8106 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8107 if ((regno >= 8 && regno <= 15)
8108 || (regno >= 20 && regno <= 23)
8109 || (regno >= 31 && regno <= 39)
8110 || (regno >= 41 && regno <= 47)
8111 || (regno >= 67 && regno <= 111))
8113 specs[count] = tmpl;
8114 specs[count++].index = regno;
8118 else
8120 UNHANDLED;
8122 break;
8124 case IA64_RS_ARb:
8125 if (note == 1)
8127 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8129 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8130 if ((regno >= 48 && regno <= 63)
8131 || (regno >= 112 && regno <= 127))
8133 specs[count] = tmpl;
8134 specs[count++].index = regno;
8138 else if (note == 0)
8140 for (i = 48; i < 64; i++)
8142 specs[count] = tmpl;
8143 specs[count++].index = i;
8145 for (i = 112; i < 128; i++)
8147 specs[count] = tmpl;
8148 specs[count++].index = i;
8151 else
8153 UNHANDLED;
8155 break;
8157 case IA64_RS_BR:
8158 if (note != 1)
8160 UNHANDLED;
8162 else
8164 if (rsrc_write)
8166 for (i = 0; i < idesc->num_outputs; i++)
8167 if (idesc->operands[i] == IA64_OPND_B1
8168 || idesc->operands[i] == IA64_OPND_B2)
8170 specs[count] = tmpl;
8171 specs[count++].index =
8172 CURR_SLOT.opnd[i].X_add_number - REG_BR;
8175 else
8177 for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8178 if (idesc->operands[i] == IA64_OPND_B1
8179 || idesc->operands[i] == IA64_OPND_B2)
8181 specs[count] = tmpl;
8182 specs[count++].index =
8183 CURR_SLOT.opnd[i].X_add_number - REG_BR;
8187 break;
8189 case IA64_RS_CPUID: /* four or more registers */
8190 if (note == 3)
8192 if (idesc->operands[!rsrc_write] == IA64_OPND_CPUID_R3)
8194 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8195 if (regno >= 0 && regno < NELEMS (gr_values)
8196 && KNOWN (regno))
8198 specs[count] = tmpl;
8199 specs[count++].index = gr_values[regno].value & 0xFF;
8201 else
8203 specs[count] = tmpl;
8204 specs[count++].specific = 0;
8208 else
8210 UNHANDLED;
8212 break;
8214 case IA64_RS_DBR: /* four or more registers */
8215 if (note == 3)
8217 if (idesc->operands[!rsrc_write] == IA64_OPND_DBR_R3)
8219 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8220 if (regno >= 0 && regno < NELEMS (gr_values)
8221 && KNOWN (regno))
8223 specs[count] = tmpl;
8224 specs[count++].index = gr_values[regno].value & 0xFF;
8226 else
8228 specs[count] = tmpl;
8229 specs[count++].specific = 0;
8233 else if (note == 0 && !rsrc_write)
8235 specs[count] = tmpl;
8236 specs[count++].specific = 0;
8238 else
8240 UNHANDLED;
8242 break;
8244 case IA64_RS_IBR: /* four or more registers */
8245 if (note == 3)
8247 if (idesc->operands[!rsrc_write] == IA64_OPND_IBR_R3)
8249 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8250 if (regno >= 0 && regno < NELEMS (gr_values)
8251 && KNOWN (regno))
8253 specs[count] = tmpl;
8254 specs[count++].index = gr_values[regno].value & 0xFF;
8256 else
8258 specs[count] = tmpl;
8259 specs[count++].specific = 0;
8263 else
8265 UNHANDLED;
8267 break;
8269 case IA64_RS_MSR:
8270 if (note == 5)
8272 /* These are implementation specific. Force all references to
8273 conflict with all other references. */
8274 specs[count] = tmpl;
8275 specs[count++].specific = 0;
8277 else
8279 UNHANDLED;
8281 break;
8283 case IA64_RS_PKR: /* 16 or more registers */
8284 if (note == 3 || note == 4)
8286 if (idesc->operands[!rsrc_write] == IA64_OPND_PKR_R3)
8288 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8289 if (regno >= 0 && regno < NELEMS (gr_values)
8290 && KNOWN (regno))
8292 if (note == 3)
8294 specs[count] = tmpl;
8295 specs[count++].index = gr_values[regno].value & 0xFF;
8297 else
8298 for (i = 0; i < NELEMS (gr_values); i++)
8300 /* Uses all registers *except* the one in R3. */
8301 if ((unsigned)i != (gr_values[regno].value & 0xFF))
8303 specs[count] = tmpl;
8304 specs[count++].index = i;
8308 else
8310 specs[count] = tmpl;
8311 specs[count++].specific = 0;
8315 else if (note == 0)
8317 /* probe et al. */
8318 specs[count] = tmpl;
8319 specs[count++].specific = 0;
8321 break;
8323 case IA64_RS_PMC: /* four or more registers */
8324 if (note == 3)
8326 if (idesc->operands[!rsrc_write] == IA64_OPND_PMC_R3
8327 || (!rsrc_write && idesc->operands[1] == IA64_OPND_PMD_R3))
8330 int index = ((idesc->operands[1] == IA64_OPND_R3 && !rsrc_write)
8331 ? 1 : !rsrc_write);
8332 int regno = CURR_SLOT.opnd[index].X_add_number - REG_GR;
8333 if (regno >= 0 && regno < NELEMS (gr_values)
8334 && KNOWN (regno))
8336 specs[count] = tmpl;
8337 specs[count++].index = gr_values[regno].value & 0xFF;
8339 else
8341 specs[count] = tmpl;
8342 specs[count++].specific = 0;
8346 else
8348 UNHANDLED;
8350 break;
8352 case IA64_RS_PMD: /* four or more registers */
8353 if (note == 3)
8355 if (idesc->operands[!rsrc_write] == IA64_OPND_PMD_R3)
8357 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8358 if (regno >= 0 && regno < NELEMS (gr_values)
8359 && KNOWN (regno))
8361 specs[count] = tmpl;
8362 specs[count++].index = gr_values[regno].value & 0xFF;
8364 else
8366 specs[count] = tmpl;
8367 specs[count++].specific = 0;
8371 else
8373 UNHANDLED;
8375 break;
8377 case IA64_RS_RR: /* eight registers */
8378 if (note == 6)
8380 if (idesc->operands[!rsrc_write] == IA64_OPND_RR_R3)
8382 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8383 if (regno >= 0 && regno < NELEMS (gr_values)
8384 && KNOWN (regno))
8386 specs[count] = tmpl;
8387 specs[count++].index = (gr_values[regno].value >> 61) & 0x7;
8389 else
8391 specs[count] = tmpl;
8392 specs[count++].specific = 0;
8396 else if (note == 0 && !rsrc_write)
8398 specs[count] = tmpl;
8399 specs[count++].specific = 0;
8401 else
8403 UNHANDLED;
8405 break;
8407 case IA64_RS_CR_IRR:
8408 if (note == 0)
8410 /* handle mov-from-CR-IVR; it's a read that writes CR[IRR] */
8411 int regno = CURR_SLOT.opnd[1].X_add_number - REG_CR;
8412 if (rsrc_write
8413 && idesc->operands[1] == IA64_OPND_CR3
8414 && regno == CR_IVR)
8416 for (i = 0; i < 4; i++)
8418 specs[count] = tmpl;
8419 specs[count++].index = CR_IRR0 + i;
8423 else if (note == 1)
8425 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8426 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8427 && regno >= CR_IRR0
8428 && regno <= CR_IRR3)
8430 specs[count] = tmpl;
8431 specs[count++].index = regno;
8434 else
8436 UNHANDLED;
8438 break;
8440 case IA64_RS_CR_IIB:
8441 if (note != 0)
8443 UNHANDLED;
8445 else
8447 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8448 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8449 && (regno == CR_IIB0 || regno == CR_IIB1))
8451 specs[count] = tmpl;
8452 specs[count++].index = regno;
8455 break;
8457 case IA64_RS_CR_LRR:
8458 if (note != 1)
8460 UNHANDLED;
8462 else
8464 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8465 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8466 && (regno == CR_LRR0 || regno == CR_LRR1))
8468 specs[count] = tmpl;
8469 specs[count++].index = regno;
8472 break;
8474 case IA64_RS_CR:
8475 if (note == 1)
8477 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8479 specs[count] = tmpl;
8480 specs[count++].index =
8481 CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8484 else
8486 UNHANDLED;
8488 break;
8490 case IA64_RS_FR:
8491 case IA64_RS_FRb:
8492 if (note != 1)
8494 UNHANDLED;
8496 else if (rsrc_write)
8498 if (dep->specifier == IA64_RS_FRb
8499 && idesc->operands[0] == IA64_OPND_F1)
8501 specs[count] = tmpl;
8502 specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_FR;
8505 else
8507 for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8509 if (idesc->operands[i] == IA64_OPND_F2
8510 || idesc->operands[i] == IA64_OPND_F3
8511 || idesc->operands[i] == IA64_OPND_F4)
8513 specs[count] = tmpl;
8514 specs[count++].index =
8515 CURR_SLOT.opnd[i].X_add_number - REG_FR;
8519 break;
8521 case IA64_RS_GR:
8522 if (note == 13)
8524 /* This reference applies only to the GR whose value is loaded with
8525 data returned from memory. */
8526 specs[count] = tmpl;
8527 specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_GR;
8529 else if (note == 1)
8531 if (rsrc_write)
8533 for (i = 0; i < idesc->num_outputs; i++)
8534 if (idesc->operands[i] == IA64_OPND_R1
8535 || idesc->operands[i] == IA64_OPND_R2
8536 || idesc->operands[i] == IA64_OPND_R3)
8538 specs[count] = tmpl;
8539 specs[count++].index =
8540 CURR_SLOT.opnd[i].X_add_number - REG_GR;
8542 if (idesc->flags & IA64_OPCODE_POSTINC)
8543 for (i = 0; i < NELEMS (idesc->operands); i++)
8544 if (idesc->operands[i] == IA64_OPND_MR3)
8546 specs[count] = tmpl;
8547 specs[count++].index =
8548 CURR_SLOT.opnd[i].X_add_number - REG_GR;
8551 else
8553 /* Look for anything that reads a GR. */
8554 for (i = 0; i < NELEMS (idesc->operands); i++)
8556 if (idesc->operands[i] == IA64_OPND_MR3
8557 || idesc->operands[i] == IA64_OPND_CPUID_R3
8558 || idesc->operands[i] == IA64_OPND_DBR_R3
8559 || idesc->operands[i] == IA64_OPND_IBR_R3
8560 || idesc->operands[i] == IA64_OPND_MSR_R3
8561 || idesc->operands[i] == IA64_OPND_PKR_R3
8562 || idesc->operands[i] == IA64_OPND_PMC_R3
8563 || idesc->operands[i] == IA64_OPND_PMD_R3
8564 || idesc->operands[i] == IA64_OPND_RR_R3
8565 || ((i >= idesc->num_outputs)
8566 && (idesc->operands[i] == IA64_OPND_R1
8567 || idesc->operands[i] == IA64_OPND_R2
8568 || idesc->operands[i] == IA64_OPND_R3
8569 /* addl source register. */
8570 || idesc->operands[i] == IA64_OPND_R3_2)))
8572 specs[count] = tmpl;
8573 specs[count++].index =
8574 CURR_SLOT.opnd[i].X_add_number - REG_GR;
8579 else
8581 UNHANDLED;
8583 break;
8585 /* This is the same as IA64_RS_PRr, except that the register range is
8586 from 1 - 15, and there are no rotating register reads/writes here. */
8587 case IA64_RS_PR:
8588 if (note == 0)
8590 for (i = 1; i < 16; i++)
8592 specs[count] = tmpl;
8593 specs[count++].index = i;
8596 else if (note == 7)
8598 valueT mask = 0;
8599 /* Mark only those registers indicated by the mask. */
8600 if (rsrc_write)
8602 mask = CURR_SLOT.opnd[2].X_add_number;
8603 for (i = 1; i < 16; i++)
8604 if (mask & ((valueT) 1 << i))
8606 specs[count] = tmpl;
8607 specs[count++].index = i;
8610 else
8612 UNHANDLED;
8615 else if (note == 11) /* note 11 implies note 1 as well */
8617 if (rsrc_write)
8619 for (i = 0; i < idesc->num_outputs; i++)
8621 if (idesc->operands[i] == IA64_OPND_P1
8622 || idesc->operands[i] == IA64_OPND_P2)
8624 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8625 if (regno >= 1 && regno < 16)
8627 specs[count] = tmpl;
8628 specs[count++].index = regno;
8633 else
8635 UNHANDLED;
8638 else if (note == 12)
8640 if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8642 specs[count] = tmpl;
8643 specs[count++].index = CURR_SLOT.qp_regno;
8646 else if (note == 1)
8648 if (rsrc_write)
8650 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8651 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8652 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8653 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8655 if ((idesc->operands[0] == IA64_OPND_P1
8656 || idesc->operands[0] == IA64_OPND_P2)
8657 && p1 >= 1 && p1 < 16)
8659 specs[count] = tmpl;
8660 specs[count].cmp_type =
8661 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8662 specs[count++].index = p1;
8664 if ((idesc->operands[1] == IA64_OPND_P1
8665 || idesc->operands[1] == IA64_OPND_P2)
8666 && p2 >= 1 && p2 < 16)
8668 specs[count] = tmpl;
8669 specs[count].cmp_type =
8670 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8671 specs[count++].index = p2;
8674 else
8676 if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8678 specs[count] = tmpl;
8679 specs[count++].index = CURR_SLOT.qp_regno;
8681 if (idesc->operands[1] == IA64_OPND_PR)
8683 for (i = 1; i < 16; i++)
8685 specs[count] = tmpl;
8686 specs[count++].index = i;
8691 else
8693 UNHANDLED;
8695 break;
8697 /* This is the general case for PRs. IA64_RS_PR and IA64_RS_PR63 are
8698 simplified cases of this. */
8699 case IA64_RS_PRr:
8700 if (note == 0)
8702 for (i = 16; i < 63; i++)
8704 specs[count] = tmpl;
8705 specs[count++].index = i;
8708 else if (note == 7)
8710 valueT mask = 0;
8711 /* Mark only those registers indicated by the mask. */
8712 if (rsrc_write
8713 && idesc->operands[0] == IA64_OPND_PR)
8715 mask = CURR_SLOT.opnd[2].X_add_number;
8716 if (mask & ((valueT) 1 << 16))
8717 for (i = 16; i < 63; i++)
8719 specs[count] = tmpl;
8720 specs[count++].index = i;
8723 else if (rsrc_write
8724 && idesc->operands[0] == IA64_OPND_PR_ROT)
8726 for (i = 16; i < 63; i++)
8728 specs[count] = tmpl;
8729 specs[count++].index = i;
8732 else
8734 UNHANDLED;
8737 else if (note == 11) /* note 11 implies note 1 as well */
8739 if (rsrc_write)
8741 for (i = 0; i < idesc->num_outputs; i++)
8743 if (idesc->operands[i] == IA64_OPND_P1
8744 || idesc->operands[i] == IA64_OPND_P2)
8746 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8747 if (regno >= 16 && regno < 63)
8749 specs[count] = tmpl;
8750 specs[count++].index = regno;
8755 else
8757 UNHANDLED;
8760 else if (note == 12)
8762 if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8764 specs[count] = tmpl;
8765 specs[count++].index = CURR_SLOT.qp_regno;
8768 else if (note == 1)
8770 if (rsrc_write)
8772 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8773 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8774 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8775 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8777 if ((idesc->operands[0] == IA64_OPND_P1
8778 || idesc->operands[0] == IA64_OPND_P2)
8779 && p1 >= 16 && p1 < 63)
8781 specs[count] = tmpl;
8782 specs[count].cmp_type =
8783 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8784 specs[count++].index = p1;
8786 if ((idesc->operands[1] == IA64_OPND_P1
8787 || idesc->operands[1] == IA64_OPND_P2)
8788 && p2 >= 16 && p2 < 63)
8790 specs[count] = tmpl;
8791 specs[count].cmp_type =
8792 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8793 specs[count++].index = p2;
8796 else
8798 if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8800 specs[count] = tmpl;
8801 specs[count++].index = CURR_SLOT.qp_regno;
8803 if (idesc->operands[1] == IA64_OPND_PR)
8805 for (i = 16; i < 63; i++)
8807 specs[count] = tmpl;
8808 specs[count++].index = i;
8813 else
8815 UNHANDLED;
8817 break;
8819 case IA64_RS_PSR:
8820 /* Verify that the instruction is using the PSR bit indicated in
8821 dep->regindex. */
8822 if (note == 0)
8824 if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_UM)
8826 if (dep->regindex < 6)
8828 specs[count++] = tmpl;
8831 else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR)
8833 if (dep->regindex < 32
8834 || dep->regindex == 35
8835 || dep->regindex == 36
8836 || (!rsrc_write && dep->regindex == PSR_CPL))
8838 specs[count++] = tmpl;
8841 else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_L)
8843 if (dep->regindex < 32
8844 || dep->regindex == 35
8845 || dep->regindex == 36
8846 || (rsrc_write && dep->regindex == PSR_CPL))
8848 specs[count++] = tmpl;
8851 else
8853 /* Several PSR bits have very specific dependencies. */
8854 switch (dep->regindex)
8856 default:
8857 specs[count++] = tmpl;
8858 break;
8859 case PSR_IC:
8860 if (rsrc_write)
8862 specs[count++] = tmpl;
8864 else
8866 /* Only certain CR accesses use PSR.ic */
8867 if (idesc->operands[0] == IA64_OPND_CR3
8868 || idesc->operands[1] == IA64_OPND_CR3)
8870 int index =
8871 ((idesc->operands[0] == IA64_OPND_CR3)
8872 ? 0 : 1);
8873 int regno =
8874 CURR_SLOT.opnd[index].X_add_number - REG_CR;
8876 switch (regno)
8878 default:
8879 break;
8880 case CR_ITIR:
8881 case CR_IFS:
8882 case CR_IIM:
8883 case CR_IIP:
8884 case CR_IPSR:
8885 case CR_ISR:
8886 case CR_IFA:
8887 case CR_IHA:
8888 case CR_IIB0:
8889 case CR_IIB1:
8890 case CR_IIPA:
8891 specs[count++] = tmpl;
8892 break;
8896 break;
8897 case PSR_CPL:
8898 if (rsrc_write)
8900 specs[count++] = tmpl;
8902 else
8904 /* Only some AR accesses use cpl */
8905 if (idesc->operands[0] == IA64_OPND_AR3
8906 || idesc->operands[1] == IA64_OPND_AR3)
8908 int index =
8909 ((idesc->operands[0] == IA64_OPND_AR3)
8910 ? 0 : 1);
8911 int regno =
8912 CURR_SLOT.opnd[index].X_add_number - REG_AR;
8914 if (regno == AR_ITC
8915 || regno == AR_RUC
8916 || (index == 0
8917 && (regno == AR_RSC
8918 || (regno >= AR_K0
8919 && regno <= AR_K7))))
8921 specs[count++] = tmpl;
8924 else
8926 specs[count++] = tmpl;
8928 break;
8933 else if (note == 7)
8935 valueT mask = 0;
8936 if (idesc->operands[0] == IA64_OPND_IMMU24)
8938 mask = CURR_SLOT.opnd[0].X_add_number;
8940 else
8942 UNHANDLED;
8944 if (mask & ((valueT) 1 << dep->regindex))
8946 specs[count++] = tmpl;
8949 else if (note == 8)
8951 int min = dep->regindex == PSR_DFL ? 2 : 32;
8952 int max = dep->regindex == PSR_DFL ? 31 : 127;
8953 /* dfh is read on FR32-127; dfl is read on FR2-31 */
8954 for (i = 0; i < NELEMS (idesc->operands); i++)
8956 if (idesc->operands[i] == IA64_OPND_F1
8957 || idesc->operands[i] == IA64_OPND_F2
8958 || idesc->operands[i] == IA64_OPND_F3
8959 || idesc->operands[i] == IA64_OPND_F4)
8961 int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8962 if (reg >= min && reg <= max)
8964 specs[count++] = tmpl;
8969 else if (note == 9)
8971 int min = dep->regindex == PSR_MFL ? 2 : 32;
8972 int max = dep->regindex == PSR_MFL ? 31 : 127;
8973 /* mfh is read on writes to FR32-127; mfl is read on writes to
8974 FR2-31 */
8975 for (i = 0; i < idesc->num_outputs; i++)
8977 if (idesc->operands[i] == IA64_OPND_F1)
8979 int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8980 if (reg >= min && reg <= max)
8982 specs[count++] = tmpl;
8987 else if (note == 10)
8989 for (i = 0; i < NELEMS (idesc->operands); i++)
8991 if (idesc->operands[i] == IA64_OPND_R1
8992 || idesc->operands[i] == IA64_OPND_R2
8993 || idesc->operands[i] == IA64_OPND_R3)
8995 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8996 if (regno >= 16 && regno <= 31)
8998 specs[count++] = tmpl;
9003 else
9005 UNHANDLED;
9007 break;
9009 case IA64_RS_AR_FPSR:
9010 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
9012 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
9013 if (regno == AR_FPSR)
9015 specs[count++] = tmpl;
9018 else
9020 specs[count++] = tmpl;
9022 break;
9024 case IA64_RS_ARX:
9025 /* Handle all AR[REG] resources */
9026 if (note == 0 || note == 1)
9028 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
9029 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3
9030 && regno == dep->regindex)
9032 specs[count++] = tmpl;
9034 /* other AR[REG] resources may be affected by AR accesses */
9035 else if (idesc->operands[0] == IA64_OPND_AR3)
9037 /* AR[] writes */
9038 regno = CURR_SLOT.opnd[0].X_add_number - REG_AR;
9039 switch (dep->regindex)
9041 default:
9042 break;
9043 case AR_BSP:
9044 case AR_RNAT:
9045 if (regno == AR_BSPSTORE)
9047 specs[count++] = tmpl;
9049 case AR_RSC:
9050 if (!rsrc_write &&
9051 (regno == AR_BSPSTORE
9052 || regno == AR_RNAT))
9054 specs[count++] = tmpl;
9056 break;
9059 else if (idesc->operands[1] == IA64_OPND_AR3)
9061 /* AR[] reads */
9062 regno = CURR_SLOT.opnd[1].X_add_number - REG_AR;
9063 switch (dep->regindex)
9065 default:
9066 break;
9067 case AR_RSC:
9068 if (regno == AR_BSPSTORE || regno == AR_RNAT)
9070 specs[count++] = tmpl;
9072 break;
9075 else
9077 specs[count++] = tmpl;
9080 else
9082 UNHANDLED;
9084 break;
9086 case IA64_RS_CRX:
9087 /* Handle all CR[REG] resources.
9088 ??? FIXME: The rule 17 isn't really handled correctly. */
9089 if (note == 0 || note == 1 || note == 17)
9091 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
9093 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
9094 if (regno == dep->regindex)
9096 specs[count++] = tmpl;
9098 else if (!rsrc_write)
9100 /* Reads from CR[IVR] affect other resources. */
9101 if (regno == CR_IVR)
9103 if ((dep->regindex >= CR_IRR0
9104 && dep->regindex <= CR_IRR3)
9105 || dep->regindex == CR_TPR)
9107 specs[count++] = tmpl;
9112 else
9114 specs[count++] = tmpl;
9117 else
9119 UNHANDLED;
9121 break;
9123 case IA64_RS_INSERVICE:
9124 /* look for write of EOI (67) or read of IVR (65) */
9125 if ((idesc->operands[0] == IA64_OPND_CR3
9126 && CURR_SLOT.opnd[0].X_add_number - REG_CR == CR_EOI)
9127 || (idesc->operands[1] == IA64_OPND_CR3
9128 && CURR_SLOT.opnd[1].X_add_number - REG_CR == CR_IVR))
9130 specs[count++] = tmpl;
9132 break;
9134 case IA64_RS_GR0:
9135 if (note == 1)
9137 specs[count++] = tmpl;
9139 else
9141 UNHANDLED;
9143 break;
9145 case IA64_RS_CFM:
9146 if (note != 2)
9148 specs[count++] = tmpl;
9150 else
9152 /* Check if any of the registers accessed are in the rotating region.
9153 mov to/from pr accesses CFM only when qp_regno is in the rotating
9154 region */
9155 for (i = 0; i < NELEMS (idesc->operands); i++)
9157 if (idesc->operands[i] == IA64_OPND_R1
9158 || idesc->operands[i] == IA64_OPND_R2
9159 || idesc->operands[i] == IA64_OPND_R3)
9161 int num = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9162 /* Assumes that md.rot.num_regs is always valid */
9163 if (md.rot.num_regs > 0
9164 && num > 31
9165 && num < 31 + md.rot.num_regs)
9167 specs[count] = tmpl;
9168 specs[count++].specific = 0;
9171 else if (idesc->operands[i] == IA64_OPND_F1
9172 || idesc->operands[i] == IA64_OPND_F2
9173 || idesc->operands[i] == IA64_OPND_F3
9174 || idesc->operands[i] == IA64_OPND_F4)
9176 int num = CURR_SLOT.opnd[i].X_add_number - REG_FR;
9177 if (num > 31)
9179 specs[count] = tmpl;
9180 specs[count++].specific = 0;
9183 else if (idesc->operands[i] == IA64_OPND_P1
9184 || idesc->operands[i] == IA64_OPND_P2)
9186 int num = CURR_SLOT.opnd[i].X_add_number - REG_P;
9187 if (num > 15)
9189 specs[count] = tmpl;
9190 specs[count++].specific = 0;
9194 if (CURR_SLOT.qp_regno > 15)
9196 specs[count] = tmpl;
9197 specs[count++].specific = 0;
9200 break;
9202 /* This is the same as IA64_RS_PRr, except simplified to account for
9203 the fact that there is only one register. */
9204 case IA64_RS_PR63:
9205 if (note == 0)
9207 specs[count++] = tmpl;
9209 else if (note == 7)
9211 valueT mask = 0;
9212 if (idesc->operands[2] == IA64_OPND_IMM17)
9213 mask = CURR_SLOT.opnd[2].X_add_number;
9214 if (mask & ((valueT) 1 << 63))
9215 specs[count++] = tmpl;
9217 else if (note == 11)
9219 if ((idesc->operands[0] == IA64_OPND_P1
9220 && CURR_SLOT.opnd[0].X_add_number - REG_P == 63)
9221 || (idesc->operands[1] == IA64_OPND_P2
9222 && CURR_SLOT.opnd[1].X_add_number - REG_P == 63))
9224 specs[count++] = tmpl;
9227 else if (note == 12)
9229 if (CURR_SLOT.qp_regno == 63)
9231 specs[count++] = tmpl;
9234 else if (note == 1)
9236 if (rsrc_write)
9238 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9239 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9240 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
9241 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
9243 if (p1 == 63
9244 && (idesc->operands[0] == IA64_OPND_P1
9245 || idesc->operands[0] == IA64_OPND_P2))
9247 specs[count] = tmpl;
9248 specs[count++].cmp_type =
9249 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
9251 if (p2 == 63
9252 && (idesc->operands[1] == IA64_OPND_P1
9253 || idesc->operands[1] == IA64_OPND_P2))
9255 specs[count] = tmpl;
9256 specs[count++].cmp_type =
9257 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
9260 else
9262 if (CURR_SLOT.qp_regno == 63)
9264 specs[count++] = tmpl;
9268 else
9270 UNHANDLED;
9272 break;
9274 case IA64_RS_RSE:
9275 /* FIXME we can identify some individual RSE written resources, but RSE
9276 read resources have not yet been completely identified, so for now
9277 treat RSE as a single resource */
9278 if (strncmp (idesc->name, "mov", 3) == 0)
9280 if (rsrc_write)
9282 if (idesc->operands[0] == IA64_OPND_AR3
9283 && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE)
9285 specs[count++] = tmpl;
9288 else
9290 if (idesc->operands[0] == IA64_OPND_AR3)
9292 if (CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE
9293 || CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_RNAT)
9295 specs[count++] = tmpl;
9298 else if (idesc->operands[1] == IA64_OPND_AR3)
9300 if (CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSP
9301 || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSPSTORE
9302 || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_RNAT)
9304 specs[count++] = tmpl;
9309 else
9311 specs[count++] = tmpl;
9313 break;
9315 case IA64_RS_ANY:
9316 /* FIXME -- do any of these need to be non-specific? */
9317 specs[count++] = tmpl;
9318 break;
9320 default:
9321 as_bad (_("Unrecognized dependency specifier %d\n"), dep->specifier);
9322 break;
9325 return count;
9328 /* Clear branch flags on marked resources. This breaks the link between the
9329 QP of the marking instruction and a subsequent branch on the same QP. */
9331 static void
9332 clear_qp_branch_flag (valueT mask)
9334 int i;
9335 for (i = 0; i < regdepslen; i++)
9337 valueT bit = ((valueT) 1 << regdeps[i].qp_regno);
9338 if ((bit & mask) != 0)
9340 regdeps[i].link_to_qp_branch = 0;
9345 /* MASK contains 2 and only 2 PRs which are mutually exclusive. Remove
9346 any mutexes which contain one of the PRs and create new ones when
9347 needed. */
9349 static int
9350 update_qp_mutex (valueT mask)
9352 int i;
9353 int add = 0;
9355 i = 0;
9356 while (i < qp_mutexeslen)
9358 if ((qp_mutexes[i].prmask & mask) != 0)
9360 /* If it destroys and creates the same mutex, do nothing. */
9361 if (qp_mutexes[i].prmask == mask
9362 && qp_mutexes[i].path == md.path)
9364 i++;
9365 add = -1;
9367 else
9369 int keep = 0;
9371 if (md.debug_dv)
9373 fprintf (stderr, " Clearing mutex relation");
9374 print_prmask (qp_mutexes[i].prmask);
9375 fprintf (stderr, "\n");
9378 /* Deal with the old mutex with more than 3+ PRs only if
9379 the new mutex on the same execution path with it.
9381 FIXME: The 3+ mutex support is incomplete.
9382 dot_pred_rel () may be a better place to fix it. */
9383 if (qp_mutexes[i].path == md.path)
9385 /* If it is a proper subset of the mutex, create a
9386 new mutex. */
9387 if (add == 0
9388 && (qp_mutexes[i].prmask & mask) == mask)
9389 add = 1;
9391 qp_mutexes[i].prmask &= ~mask;
9392 if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
9394 /* Modify the mutex if there are more than one
9395 PR left. */
9396 keep = 1;
9397 i++;
9401 if (keep == 0)
9402 /* Remove the mutex. */
9403 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9406 else
9407 ++i;
9410 if (add == 1)
9411 add_qp_mutex (mask);
9413 return add;
9416 /* Remove any mutexes which contain any of the PRs indicated in the mask.
9418 Any changes to a PR clears the mutex relations which include that PR. */
9420 static void
9421 clear_qp_mutex (valueT mask)
9423 int i;
9425 i = 0;
9426 while (i < qp_mutexeslen)
9428 if ((qp_mutexes[i].prmask & mask) != 0)
9430 if (md.debug_dv)
9432 fprintf (stderr, " Clearing mutex relation");
9433 print_prmask (qp_mutexes[i].prmask);
9434 fprintf (stderr, "\n");
9436 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9438 else
9439 ++i;
9443 /* Clear implies relations which contain PRs in the given masks.
9444 P1_MASK indicates the source of the implies relation, while P2_MASK
9445 indicates the implied PR. */
9447 static void
9448 clear_qp_implies (valueT p1_mask, valueT p2_mask)
9450 int i;
9452 i = 0;
9453 while (i < qp_implieslen)
9455 if ((((valueT) 1 << qp_implies[i].p1) & p1_mask) != 0
9456 || (((valueT) 1 << qp_implies[i].p2) & p2_mask) != 0)
9458 if (md.debug_dv)
9459 fprintf (stderr, "Clearing implied relation PR%d->PR%d\n",
9460 qp_implies[i].p1, qp_implies[i].p2);
9461 qp_implies[i] = qp_implies[--qp_implieslen];
9463 else
9464 ++i;
9468 /* Add the PRs specified to the list of implied relations. */
9470 static void
9471 add_qp_imply (int p1, int p2)
9473 valueT mask;
9474 valueT bit;
9475 int i;
9477 /* p0 is not meaningful here. */
9478 if (p1 == 0 || p2 == 0)
9479 abort ();
9481 if (p1 == p2)
9482 return;
9484 /* If it exists already, ignore it. */
9485 for (i = 0; i < qp_implieslen; i++)
9487 if (qp_implies[i].p1 == p1
9488 && qp_implies[i].p2 == p2
9489 && qp_implies[i].path == md.path
9490 && !qp_implies[i].p2_branched)
9491 return;
9494 if (qp_implieslen == qp_impliestotlen)
9496 qp_impliestotlen += 20;
9497 qp_implies = (struct qp_imply *)
9498 xrealloc ((void *) qp_implies,
9499 qp_impliestotlen * sizeof (struct qp_imply));
9501 if (md.debug_dv)
9502 fprintf (stderr, " Registering PR%d implies PR%d\n", p1, p2);
9503 qp_implies[qp_implieslen].p1 = p1;
9504 qp_implies[qp_implieslen].p2 = p2;
9505 qp_implies[qp_implieslen].path = md.path;
9506 qp_implies[qp_implieslen++].p2_branched = 0;
9508 /* Add in the implied transitive relations; for everything that p2 implies,
9509 make p1 imply that, too; for everything that implies p1, make it imply p2
9510 as well. */
9511 for (i = 0; i < qp_implieslen; i++)
9513 if (qp_implies[i].p1 == p2)
9514 add_qp_imply (p1, qp_implies[i].p2);
9515 if (qp_implies[i].p2 == p1)
9516 add_qp_imply (qp_implies[i].p1, p2);
9518 /* Add in mutex relations implied by this implies relation; for each mutex
9519 relation containing p2, duplicate it and replace p2 with p1. */
9520 bit = (valueT) 1 << p1;
9521 mask = (valueT) 1 << p2;
9522 for (i = 0; i < qp_mutexeslen; i++)
9524 if (qp_mutexes[i].prmask & mask)
9525 add_qp_mutex ((qp_mutexes[i].prmask & ~mask) | bit);
9529 /* Add the PRs specified in the mask to the mutex list; this means that only
9530 one of the PRs can be true at any time. PR0 should never be included in
9531 the mask. */
9533 static void
9534 add_qp_mutex (valueT mask)
9536 if (mask & 0x1)
9537 abort ();
9539 if (qp_mutexeslen == qp_mutexestotlen)
9541 qp_mutexestotlen += 20;
9542 qp_mutexes = (struct qpmutex *)
9543 xrealloc ((void *) qp_mutexes,
9544 qp_mutexestotlen * sizeof (struct qpmutex));
9546 if (md.debug_dv)
9548 fprintf (stderr, " Registering mutex on");
9549 print_prmask (mask);
9550 fprintf (stderr, "\n");
9552 qp_mutexes[qp_mutexeslen].path = md.path;
9553 qp_mutexes[qp_mutexeslen++].prmask = mask;
9556 static int
9557 has_suffix_p (const char *name, const char *suffix)
9559 size_t namelen = strlen (name);
9560 size_t sufflen = strlen (suffix);
9562 if (namelen <= sufflen)
9563 return 0;
9564 return strcmp (name + namelen - sufflen, suffix) == 0;
9567 static void
9568 clear_register_values (void)
9570 int i;
9571 if (md.debug_dv)
9572 fprintf (stderr, " Clearing register values\n");
9573 for (i = 1; i < NELEMS (gr_values); i++)
9574 gr_values[i].known = 0;
9577 /* Keep track of register values/changes which affect DV tracking.
9579 optimization note: should add a flag to classes of insns where otherwise we
9580 have to examine a group of strings to identify them. */
9582 static void
9583 note_register_values (struct ia64_opcode *idesc)
9585 valueT qp_changemask = 0;
9586 int i;
9588 /* Invalidate values for registers being written to. */
9589 for (i = 0; i < idesc->num_outputs; i++)
9591 if (idesc->operands[i] == IA64_OPND_R1
9592 || idesc->operands[i] == IA64_OPND_R2
9593 || idesc->operands[i] == IA64_OPND_R3)
9595 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9596 if (regno > 0 && regno < NELEMS (gr_values))
9597 gr_values[regno].known = 0;
9599 else if (idesc->operands[i] == IA64_OPND_R3_2)
9601 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9602 if (regno > 0 && regno < 4)
9603 gr_values[regno].known = 0;
9605 else if (idesc->operands[i] == IA64_OPND_P1
9606 || idesc->operands[i] == IA64_OPND_P2)
9608 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
9609 qp_changemask |= (valueT) 1 << regno;
9611 else if (idesc->operands[i] == IA64_OPND_PR)
9613 if (idesc->operands[2] & (valueT) 0x10000)
9614 qp_changemask = ~(valueT) 0x1FFFF | idesc->operands[2];
9615 else
9616 qp_changemask = idesc->operands[2];
9617 break;
9619 else if (idesc->operands[i] == IA64_OPND_PR_ROT)
9621 if (idesc->operands[1] & ((valueT) 1 << 43))
9622 qp_changemask = -((valueT) 1 << 44) | idesc->operands[1];
9623 else
9624 qp_changemask = idesc->operands[1];
9625 qp_changemask &= ~(valueT) 0xFFFF;
9626 break;
9630 /* Always clear qp branch flags on any PR change. */
9631 /* FIXME there may be exceptions for certain compares. */
9632 clear_qp_branch_flag (qp_changemask);
9634 /* Invalidate rotating registers on insns which affect RRBs in CFM. */
9635 if (idesc->flags & IA64_OPCODE_MOD_RRBS)
9637 qp_changemask |= ~(valueT) 0xFFFF;
9638 if (strcmp (idesc->name, "clrrrb.pr") != 0)
9640 for (i = 32; i < 32 + md.rot.num_regs; i++)
9641 gr_values[i].known = 0;
9643 clear_qp_mutex (qp_changemask);
9644 clear_qp_implies (qp_changemask, qp_changemask);
9646 /* After a call, all register values are undefined, except those marked
9647 as "safe". */
9648 else if (strncmp (idesc->name, "br.call", 6) == 0
9649 || strncmp (idesc->name, "brl.call", 7) == 0)
9651 /* FIXME keep GR values which are marked as "safe_across_calls" */
9652 clear_register_values ();
9653 clear_qp_mutex (~qp_safe_across_calls);
9654 clear_qp_implies (~qp_safe_across_calls, ~qp_safe_across_calls);
9655 clear_qp_branch_flag (~qp_safe_across_calls);
9657 else if (is_interruption_or_rfi (idesc)
9658 || is_taken_branch (idesc))
9660 clear_register_values ();
9661 clear_qp_mutex (~(valueT) 0);
9662 clear_qp_implies (~(valueT) 0, ~(valueT) 0);
9664 /* Look for mutex and implies relations. */
9665 else if ((idesc->operands[0] == IA64_OPND_P1
9666 || idesc->operands[0] == IA64_OPND_P2)
9667 && (idesc->operands[1] == IA64_OPND_P1
9668 || idesc->operands[1] == IA64_OPND_P2))
9670 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9671 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9672 valueT p1mask = (p1 != 0) ? (valueT) 1 << p1 : 0;
9673 valueT p2mask = (p2 != 0) ? (valueT) 1 << p2 : 0;
9675 /* If both PRs are PR0, we can't really do anything. */
9676 if (p1 == 0 && p2 == 0)
9678 if (md.debug_dv)
9679 fprintf (stderr, " Ignoring PRs due to inclusion of p0\n");
9681 /* In general, clear mutexes and implies which include P1 or P2,
9682 with the following exceptions. */
9683 else if (has_suffix_p (idesc->name, ".or.andcm")
9684 || has_suffix_p (idesc->name, ".and.orcm"))
9686 clear_qp_implies (p2mask, p1mask);
9688 else if (has_suffix_p (idesc->name, ".andcm")
9689 || has_suffix_p (idesc->name, ".and"))
9691 clear_qp_implies (0, p1mask | p2mask);
9693 else if (has_suffix_p (idesc->name, ".orcm")
9694 || has_suffix_p (idesc->name, ".or"))
9696 clear_qp_mutex (p1mask | p2mask);
9697 clear_qp_implies (p1mask | p2mask, 0);
9699 else
9701 int added = 0;
9703 clear_qp_implies (p1mask | p2mask, p1mask | p2mask);
9705 /* If one of the PRs is PR0, we call clear_qp_mutex. */
9706 if (p1 == 0 || p2 == 0)
9707 clear_qp_mutex (p1mask | p2mask);
9708 else
9709 added = update_qp_mutex (p1mask | p2mask);
9711 if (CURR_SLOT.qp_regno == 0
9712 || has_suffix_p (idesc->name, ".unc"))
9714 if (added == 0 && p1 && p2)
9715 add_qp_mutex (p1mask | p2mask);
9716 if (CURR_SLOT.qp_regno != 0)
9718 if (p1)
9719 add_qp_imply (p1, CURR_SLOT.qp_regno);
9720 if (p2)
9721 add_qp_imply (p2, CURR_SLOT.qp_regno);
9726 /* Look for mov imm insns into GRs. */
9727 else if (idesc->operands[0] == IA64_OPND_R1
9728 && (idesc->operands[1] == IA64_OPND_IMM22
9729 || idesc->operands[1] == IA64_OPND_IMMU64)
9730 && CURR_SLOT.opnd[1].X_op == O_constant
9731 && (strcmp (idesc->name, "mov") == 0
9732 || strcmp (idesc->name, "movl") == 0))
9734 int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
9735 if (regno > 0 && regno < NELEMS (gr_values))
9737 gr_values[regno].known = 1;
9738 gr_values[regno].value = CURR_SLOT.opnd[1].X_add_number;
9739 gr_values[regno].path = md.path;
9740 if (md.debug_dv)
9742 fprintf (stderr, " Know gr%d = ", regno);
9743 fprintf_vma (stderr, gr_values[regno].value);
9744 fputs ("\n", stderr);
9748 /* Look for dep.z imm insns. */
9749 else if (idesc->operands[0] == IA64_OPND_R1
9750 && idesc->operands[1] == IA64_OPND_IMM8
9751 && strcmp (idesc->name, "dep.z") == 0)
9753 int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
9754 if (regno > 0 && regno < NELEMS (gr_values))
9756 valueT value = CURR_SLOT.opnd[1].X_add_number;
9758 if (CURR_SLOT.opnd[3].X_add_number < 64)
9759 value &= ((valueT)1 << CURR_SLOT.opnd[3].X_add_number) - 1;
9760 value <<= CURR_SLOT.opnd[2].X_add_number;
9761 gr_values[regno].known = 1;
9762 gr_values[regno].value = value;
9763 gr_values[regno].path = md.path;
9764 if (md.debug_dv)
9766 fprintf (stderr, " Know gr%d = ", regno);
9767 fprintf_vma (stderr, gr_values[regno].value);
9768 fputs ("\n", stderr);
9772 else
9774 clear_qp_mutex (qp_changemask);
9775 clear_qp_implies (qp_changemask, qp_changemask);
9779 /* Return whether the given predicate registers are currently mutex. */
9781 static int
9782 qp_mutex (int p1, int p2, int path)
9784 int i;
9785 valueT mask;
9787 if (p1 != p2)
9789 mask = ((valueT) 1 << p1) | (valueT) 1 << p2;
9790 for (i = 0; i < qp_mutexeslen; i++)
9792 if (qp_mutexes[i].path >= path
9793 && (qp_mutexes[i].prmask & mask) == mask)
9794 return 1;
9797 return 0;
9800 /* Return whether the given resource is in the given insn's list of chks
9801 Return 1 if the conflict is absolutely determined, 2 if it's a potential
9802 conflict. */
9804 static int
9805 resources_match (struct rsrc *rs,
9806 struct ia64_opcode *idesc,
9807 int note,
9808 int qp_regno,
9809 int path)
9811 struct rsrc specs[MAX_SPECS];
9812 int count;
9814 /* If the marked resource's qp_regno and the given qp_regno are mutex,
9815 we don't need to check. One exception is note 11, which indicates that
9816 target predicates are written regardless of PR[qp]. */
9817 if (qp_mutex (rs->qp_regno, qp_regno, path)
9818 && note != 11)
9819 return 0;
9821 count = specify_resource (rs->dependency, idesc, DV_CHK, specs, note, path);
9822 while (count-- > 0)
9824 /* UNAT checking is a bit more specific than other resources */
9825 if (rs->dependency->specifier == IA64_RS_AR_UNAT
9826 && specs[count].mem_offset.hint
9827 && rs->mem_offset.hint)
9829 if (rs->mem_offset.base == specs[count].mem_offset.base)
9831 if (((rs->mem_offset.offset >> 3) & 0x3F) ==
9832 ((specs[count].mem_offset.offset >> 3) & 0x3F))
9833 return 1;
9834 else
9835 continue;
9839 /* Skip apparent PR write conflicts where both writes are an AND or both
9840 writes are an OR. */
9841 if (rs->dependency->specifier == IA64_RS_PR
9842 || rs->dependency->specifier == IA64_RS_PRr
9843 || rs->dependency->specifier == IA64_RS_PR63)
9845 if (specs[count].cmp_type != CMP_NONE
9846 && specs[count].cmp_type == rs->cmp_type)
9848 if (md.debug_dv)
9849 fprintf (stderr, " %s on parallel compare allowed (PR%d)\n",
9850 dv_mode[rs->dependency->mode],
9851 rs->dependency->specifier != IA64_RS_PR63 ?
9852 specs[count].index : 63);
9853 continue;
9855 if (md.debug_dv)
9856 fprintf (stderr,
9857 " %s on parallel compare conflict %s vs %s on PR%d\n",
9858 dv_mode[rs->dependency->mode],
9859 dv_cmp_type[rs->cmp_type],
9860 dv_cmp_type[specs[count].cmp_type],
9861 rs->dependency->specifier != IA64_RS_PR63 ?
9862 specs[count].index : 63);
9866 /* If either resource is not specific, conservatively assume a conflict
9868 if (!specs[count].specific || !rs->specific)
9869 return 2;
9870 else if (specs[count].index == rs->index)
9871 return 1;
9874 return 0;
9877 /* Indicate an instruction group break; if INSERT_STOP is non-zero, then
9878 insert a stop to create the break. Update all resource dependencies
9879 appropriately. If QP_REGNO is non-zero, only apply the break to resources
9880 which use the same QP_REGNO and have the link_to_qp_branch flag set.
9881 If SAVE_CURRENT is non-zero, don't affect resources marked by the current
9882 instruction. */
9884 static void
9885 insn_group_break (int insert_stop, int qp_regno, int save_current)
9887 int i;
9889 if (insert_stop && md.num_slots_in_use > 0)
9890 PREV_SLOT.end_of_insn_group = 1;
9892 if (md.debug_dv)
9894 fprintf (stderr, " Insn group break%s",
9895 (insert_stop ? " (w/stop)" : ""));
9896 if (qp_regno != 0)
9897 fprintf (stderr, " effective for QP=%d", qp_regno);
9898 fprintf (stderr, "\n");
9901 i = 0;
9902 while (i < regdepslen)
9904 const struct ia64_dependency *dep = regdeps[i].dependency;
9906 if (qp_regno != 0
9907 && regdeps[i].qp_regno != qp_regno)
9909 ++i;
9910 continue;
9913 if (save_current
9914 && CURR_SLOT.src_file == regdeps[i].file
9915 && CURR_SLOT.src_line == regdeps[i].line)
9917 ++i;
9918 continue;
9921 /* clear dependencies which are automatically cleared by a stop, or
9922 those that have reached the appropriate state of insn serialization */
9923 if (dep->semantics == IA64_DVS_IMPLIED
9924 || dep->semantics == IA64_DVS_IMPLIEDF
9925 || regdeps[i].insn_srlz == STATE_SRLZ)
9927 print_dependency ("Removing", i);
9928 regdeps[i] = regdeps[--regdepslen];
9930 else
9932 if (dep->semantics == IA64_DVS_DATA
9933 || dep->semantics == IA64_DVS_INSTR
9934 || dep->semantics == IA64_DVS_SPECIFIC)
9936 if (regdeps[i].insn_srlz == STATE_NONE)
9937 regdeps[i].insn_srlz = STATE_STOP;
9938 if (regdeps[i].data_srlz == STATE_NONE)
9939 regdeps[i].data_srlz = STATE_STOP;
9941 ++i;
9946 /* Add the given resource usage spec to the list of active dependencies. */
9948 static void
9949 mark_resource (struct ia64_opcode *idesc ATTRIBUTE_UNUSED,
9950 const struct ia64_dependency *dep ATTRIBUTE_UNUSED,
9951 struct rsrc *spec,
9952 int depind,
9953 int path)
9955 if (regdepslen == regdepstotlen)
9957 regdepstotlen += 20;
9958 regdeps = (struct rsrc *)
9959 xrealloc ((void *) regdeps,
9960 regdepstotlen * sizeof (struct rsrc));
9963 regdeps[regdepslen] = *spec;
9964 regdeps[regdepslen].depind = depind;
9965 regdeps[regdepslen].path = path;
9966 regdeps[regdepslen].file = CURR_SLOT.src_file;
9967 regdeps[regdepslen].line = CURR_SLOT.src_line;
9969 print_dependency ("Adding", regdepslen);
9971 ++regdepslen;
9974 static void
9975 print_dependency (const char *action, int depind)
9977 if (md.debug_dv)
9979 fprintf (stderr, " %s %s '%s'",
9980 action, dv_mode[(regdeps[depind].dependency)->mode],
9981 (regdeps[depind].dependency)->name);
9982 if (regdeps[depind].specific && regdeps[depind].index >= 0)
9983 fprintf (stderr, " (%d)", regdeps[depind].index);
9984 if (regdeps[depind].mem_offset.hint)
9986 fputs (" ", stderr);
9987 fprintf_vma (stderr, regdeps[depind].mem_offset.base);
9988 fputs ("+", stderr);
9989 fprintf_vma (stderr, regdeps[depind].mem_offset.offset);
9991 fprintf (stderr, "\n");
9995 static void
9996 instruction_serialization (void)
9998 int i;
9999 if (md.debug_dv)
10000 fprintf (stderr, " Instruction serialization\n");
10001 for (i = 0; i < regdepslen; i++)
10002 if (regdeps[i].insn_srlz == STATE_STOP)
10003 regdeps[i].insn_srlz = STATE_SRLZ;
10006 static void
10007 data_serialization (void)
10009 int i = 0;
10010 if (md.debug_dv)
10011 fprintf (stderr, " Data serialization\n");
10012 while (i < regdepslen)
10014 if (regdeps[i].data_srlz == STATE_STOP
10015 /* Note: as of 991210, all "other" dependencies are cleared by a
10016 data serialization. This might change with new tables */
10017 || (regdeps[i].dependency)->semantics == IA64_DVS_OTHER)
10019 print_dependency ("Removing", i);
10020 regdeps[i] = regdeps[--regdepslen];
10022 else
10023 ++i;
10027 /* Insert stops and serializations as needed to avoid DVs. */
10029 static void
10030 remove_marked_resource (struct rsrc *rs)
10032 switch (rs->dependency->semantics)
10034 case IA64_DVS_SPECIFIC:
10035 if (md.debug_dv)
10036 fprintf (stderr, "Implementation-specific, assume worst case...\n");
10037 /* ...fall through... */
10038 case IA64_DVS_INSTR:
10039 if (md.debug_dv)
10040 fprintf (stderr, "Inserting instr serialization\n");
10041 if (rs->insn_srlz < STATE_STOP)
10042 insn_group_break (1, 0, 0);
10043 if (rs->insn_srlz < STATE_SRLZ)
10045 struct slot oldslot = CURR_SLOT;
10046 /* Manually jam a srlz.i insn into the stream */
10047 memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
10048 CURR_SLOT.user_template = -1;
10049 CURR_SLOT.idesc = ia64_find_opcode ("srlz.i");
10050 instruction_serialization ();
10051 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
10052 if (++md.num_slots_in_use >= NUM_SLOTS)
10053 emit_one_bundle ();
10054 CURR_SLOT = oldslot;
10056 insn_group_break (1, 0, 0);
10057 break;
10058 case IA64_DVS_OTHER: /* as of rev2 (991220) of the DV tables, all
10059 "other" types of DV are eliminated
10060 by a data serialization */
10061 case IA64_DVS_DATA:
10062 if (md.debug_dv)
10063 fprintf (stderr, "Inserting data serialization\n");
10064 if (rs->data_srlz < STATE_STOP)
10065 insn_group_break (1, 0, 0);
10067 struct slot oldslot = CURR_SLOT;
10068 /* Manually jam a srlz.d insn into the stream */
10069 memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
10070 CURR_SLOT.user_template = -1;
10071 CURR_SLOT.idesc = ia64_find_opcode ("srlz.d");
10072 data_serialization ();
10073 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
10074 if (++md.num_slots_in_use >= NUM_SLOTS)
10075 emit_one_bundle ();
10076 CURR_SLOT = oldslot;
10078 break;
10079 case IA64_DVS_IMPLIED:
10080 case IA64_DVS_IMPLIEDF:
10081 if (md.debug_dv)
10082 fprintf (stderr, "Inserting stop\n");
10083 insn_group_break (1, 0, 0);
10084 break;
10085 default:
10086 break;
10090 /* Check the resources used by the given opcode against the current dependency
10091 list.
10093 The check is run once for each execution path encountered. In this case,
10094 a unique execution path is the sequence of instructions following a code
10095 entry point, e.g. the following has three execution paths, one starting
10096 at L0, one at L1, and one at L2.
10098 L0: nop
10099 L1: add
10100 L2: add
10101 br.ret
10104 static void
10105 check_dependencies (struct ia64_opcode *idesc)
10107 const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
10108 int path;
10109 int i;
10111 /* Note that the number of marked resources may change within the
10112 loop if in auto mode. */
10113 i = 0;
10114 while (i < regdepslen)
10116 struct rsrc *rs = &regdeps[i];
10117 const struct ia64_dependency *dep = rs->dependency;
10118 int chkind;
10119 int note;
10120 int start_over = 0;
10122 if (dep->semantics == IA64_DVS_NONE
10123 || (chkind = depends_on (rs->depind, idesc)) == -1)
10125 ++i;
10126 continue;
10129 note = NOTE (opdeps->chks[chkind]);
10131 /* Check this resource against each execution path seen thus far. */
10132 for (path = 0; path <= md.path; path++)
10134 int matchtype;
10136 /* If the dependency wasn't on the path being checked, ignore it. */
10137 if (rs->path < path)
10138 continue;
10140 /* If the QP for this insn implies a QP which has branched, don't
10141 bother checking. Ed. NOTE: I don't think this check is terribly
10142 useful; what's the point of generating code which will only be
10143 reached if its QP is zero?
10144 This code was specifically inserted to handle the following code,
10145 based on notes from Intel's DV checking code, where p1 implies p2.
10147 mov r4 = 2
10148 (p2) br.cond L
10149 (p1) mov r4 = 7
10151 if (CURR_SLOT.qp_regno != 0)
10153 int skip = 0;
10154 int implies;
10155 for (implies = 0; implies < qp_implieslen; implies++)
10157 if (qp_implies[implies].path >= path
10158 && qp_implies[implies].p1 == CURR_SLOT.qp_regno
10159 && qp_implies[implies].p2_branched)
10161 skip = 1;
10162 break;
10165 if (skip)
10166 continue;
10169 if ((matchtype = resources_match (rs, idesc, note,
10170 CURR_SLOT.qp_regno, path)) != 0)
10172 char msg[1024];
10173 char pathmsg[256] = "";
10174 char indexmsg[256] = "";
10175 int certain = (matchtype == 1 && CURR_SLOT.qp_regno == 0);
10177 if (path != 0)
10178 snprintf (pathmsg, sizeof (pathmsg),
10179 " when entry is at label '%s'",
10180 md.entry_labels[path - 1]);
10181 if (matchtype == 1 && rs->index >= 0)
10182 snprintf (indexmsg, sizeof (indexmsg),
10183 ", specific resource number is %d",
10184 rs->index);
10185 snprintf (msg, sizeof (msg),
10186 "Use of '%s' %s %s dependency '%s' (%s)%s%s",
10187 idesc->name,
10188 (certain ? "violates" : "may violate"),
10189 dv_mode[dep->mode], dep->name,
10190 dv_sem[dep->semantics],
10191 pathmsg, indexmsg);
10193 if (md.explicit_mode)
10195 as_warn ("%s", msg);
10196 if (path < md.path)
10197 as_warn (_("Only the first path encountering the conflict is reported"));
10198 as_warn_where (rs->file, rs->line,
10199 _("This is the location of the conflicting usage"));
10200 /* Don't bother checking other paths, to avoid duplicating
10201 the same warning */
10202 break;
10204 else
10206 if (md.debug_dv)
10207 fprintf (stderr, "%s @ %s:%d\n", msg, rs->file, rs->line);
10209 remove_marked_resource (rs);
10211 /* since the set of dependencies has changed, start over */
10212 /* FIXME -- since we're removing dvs as we go, we
10213 probably don't really need to start over... */
10214 start_over = 1;
10215 break;
10219 if (start_over)
10220 i = 0;
10221 else
10222 ++i;
10226 /* Register new dependencies based on the given opcode. */
10228 static void
10229 mark_resources (struct ia64_opcode *idesc)
10231 int i;
10232 const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
10233 int add_only_qp_reads = 0;
10235 /* A conditional branch only uses its resources if it is taken; if it is
10236 taken, we stop following that path. The other branch types effectively
10237 *always* write their resources. If it's not taken, register only QP
10238 reads. */
10239 if (is_conditional_branch (idesc) || is_interruption_or_rfi (idesc))
10241 add_only_qp_reads = 1;
10244 if (md.debug_dv)
10245 fprintf (stderr, "Registering '%s' resource usage\n", idesc->name);
10247 for (i = 0; i < opdeps->nregs; i++)
10249 const struct ia64_dependency *dep;
10250 struct rsrc specs[MAX_SPECS];
10251 int note;
10252 int path;
10253 int count;
10255 dep = ia64_find_dependency (opdeps->regs[i]);
10256 note = NOTE (opdeps->regs[i]);
10258 if (add_only_qp_reads
10259 && !(dep->mode == IA64_DV_WAR
10260 && (dep->specifier == IA64_RS_PR
10261 || dep->specifier == IA64_RS_PRr
10262 || dep->specifier == IA64_RS_PR63)))
10263 continue;
10265 count = specify_resource (dep, idesc, DV_REG, specs, note, md.path);
10267 while (count-- > 0)
10269 mark_resource (idesc, dep, &specs[count],
10270 DEP (opdeps->regs[i]), md.path);
10273 /* The execution path may affect register values, which may in turn
10274 affect which indirect-access resources are accessed. */
10275 switch (dep->specifier)
10277 default:
10278 break;
10279 case IA64_RS_CPUID:
10280 case IA64_RS_DBR:
10281 case IA64_RS_IBR:
10282 case IA64_RS_MSR:
10283 case IA64_RS_PKR:
10284 case IA64_RS_PMC:
10285 case IA64_RS_PMD:
10286 case IA64_RS_RR:
10287 for (path = 0; path < md.path; path++)
10289 count = specify_resource (dep, idesc, DV_REG, specs, note, path);
10290 while (count-- > 0)
10291 mark_resource (idesc, dep, &specs[count],
10292 DEP (opdeps->regs[i]), path);
10294 break;
10299 /* Remove dependencies when they no longer apply. */
10301 static void
10302 update_dependencies (struct ia64_opcode *idesc)
10304 int i;
10306 if (strcmp (idesc->name, "srlz.i") == 0)
10308 instruction_serialization ();
10310 else if (strcmp (idesc->name, "srlz.d") == 0)
10312 data_serialization ();
10314 else if (is_interruption_or_rfi (idesc)
10315 || is_taken_branch (idesc))
10317 /* Although technically the taken branch doesn't clear dependencies
10318 which require a srlz.[id], we don't follow the branch; the next
10319 instruction is assumed to start with a clean slate. */
10320 regdepslen = 0;
10321 md.path = 0;
10323 else if (is_conditional_branch (idesc)
10324 && CURR_SLOT.qp_regno != 0)
10326 int is_call = strstr (idesc->name, ".call") != NULL;
10328 for (i = 0; i < qp_implieslen; i++)
10330 /* If the conditional branch's predicate is implied by the predicate
10331 in an existing dependency, remove that dependency. */
10332 if (qp_implies[i].p2 == CURR_SLOT.qp_regno)
10334 int depind = 0;
10335 /* Note that this implied predicate takes a branch so that if
10336 a later insn generates a DV but its predicate implies this
10337 one, we can avoid the false DV warning. */
10338 qp_implies[i].p2_branched = 1;
10339 while (depind < regdepslen)
10341 if (regdeps[depind].qp_regno == qp_implies[i].p1)
10343 print_dependency ("Removing", depind);
10344 regdeps[depind] = regdeps[--regdepslen];
10346 else
10347 ++depind;
10351 /* Any marked resources which have this same predicate should be
10352 cleared, provided that the QP hasn't been modified between the
10353 marking instruction and the branch. */
10354 if (is_call)
10356 insn_group_break (0, CURR_SLOT.qp_regno, 1);
10358 else
10360 i = 0;
10361 while (i < regdepslen)
10363 if (regdeps[i].qp_regno == CURR_SLOT.qp_regno
10364 && regdeps[i].link_to_qp_branch
10365 && (regdeps[i].file != CURR_SLOT.src_file
10366 || regdeps[i].line != CURR_SLOT.src_line))
10368 /* Treat like a taken branch */
10369 print_dependency ("Removing", i);
10370 regdeps[i] = regdeps[--regdepslen];
10372 else
10373 ++i;
10379 /* Examine the current instruction for dependency violations. */
10381 static int
10382 check_dv (struct ia64_opcode *idesc)
10384 if (md.debug_dv)
10386 fprintf (stderr, "Checking %s for violations (line %d, %d/%d)\n",
10387 idesc->name, CURR_SLOT.src_line,
10388 idesc->dependencies->nchks,
10389 idesc->dependencies->nregs);
10392 /* Look through the list of currently marked resources; if the current
10393 instruction has the dependency in its chks list which uses that resource,
10394 check against the specific resources used. */
10395 check_dependencies (idesc);
10397 /* Look up the instruction's regdeps (RAW writes, WAW writes, and WAR reads),
10398 then add them to the list of marked resources. */
10399 mark_resources (idesc);
10401 /* There are several types of dependency semantics, and each has its own
10402 requirements for being cleared
10404 Instruction serialization (insns separated by interruption, rfi, or
10405 writer + srlz.i + reader, all in separate groups) clears DVS_INSTR.
10407 Data serialization (instruction serialization, or writer + srlz.d +
10408 reader, where writer and srlz.d are in separate groups) clears
10409 DVS_DATA. (This also clears DVS_OTHER, but that is not guaranteed to
10410 always be the case).
10412 Instruction group break (groups separated by stop, taken branch,
10413 interruption or rfi) clears DVS_IMPLIED and DVS_IMPLIEDF.
10415 update_dependencies (idesc);
10417 /* Sometimes, knowing a register value allows us to avoid giving a false DV
10418 warning. Keep track of as many as possible that are useful. */
10419 note_register_values (idesc);
10421 /* We don't need or want this anymore. */
10422 md.mem_offset.hint = 0;
10424 return 0;
10427 /* Translate one line of assembly. Pseudo ops and labels do not show
10428 here. */
10429 void
10430 md_assemble (char *str)
10432 char *saved_input_line_pointer, *mnemonic;
10433 const struct pseudo_opcode *pdesc;
10434 struct ia64_opcode *idesc;
10435 unsigned char qp_regno;
10436 unsigned int flags;
10437 int ch;
10439 saved_input_line_pointer = input_line_pointer;
10440 input_line_pointer = str;
10442 /* extract the opcode (mnemonic): */
10444 mnemonic = input_line_pointer;
10445 ch = get_symbol_end ();
10446 pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
10447 if (pdesc)
10449 *input_line_pointer = ch;
10450 (*pdesc->handler) (pdesc->arg);
10451 goto done;
10454 /* Find the instruction descriptor matching the arguments. */
10456 idesc = ia64_find_opcode (mnemonic);
10457 *input_line_pointer = ch;
10458 if (!idesc)
10460 as_bad (_("Unknown opcode `%s'"), mnemonic);
10461 goto done;
10464 idesc = parse_operands (idesc);
10465 if (!idesc)
10466 goto done;
10468 /* Handle the dynamic ops we can handle now: */
10469 if (idesc->type == IA64_TYPE_DYN)
10471 if (strcmp (idesc->name, "add") == 0)
10473 if (CURR_SLOT.opnd[2].X_op == O_register
10474 && CURR_SLOT.opnd[2].X_add_number < 4)
10475 mnemonic = "addl";
10476 else
10477 mnemonic = "adds";
10478 ia64_free_opcode (idesc);
10479 idesc = ia64_find_opcode (mnemonic);
10481 else if (strcmp (idesc->name, "mov") == 0)
10483 enum ia64_opnd opnd1, opnd2;
10484 int rop;
10486 opnd1 = idesc->operands[0];
10487 opnd2 = idesc->operands[1];
10488 if (opnd1 == IA64_OPND_AR3)
10489 rop = 0;
10490 else if (opnd2 == IA64_OPND_AR3)
10491 rop = 1;
10492 else
10493 abort ();
10494 if (CURR_SLOT.opnd[rop].X_op == O_register)
10496 if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10497 mnemonic = "mov.i";
10498 else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10499 mnemonic = "mov.m";
10500 else
10501 rop = -1;
10503 else
10504 abort ();
10505 if (rop >= 0)
10507 ia64_free_opcode (idesc);
10508 idesc = ia64_find_opcode (mnemonic);
10509 while (idesc != NULL
10510 && (idesc->operands[0] != opnd1
10511 || idesc->operands[1] != opnd2))
10512 idesc = get_next_opcode (idesc);
10516 else if (strcmp (idesc->name, "mov.i") == 0
10517 || strcmp (idesc->name, "mov.m") == 0)
10519 enum ia64_opnd opnd1, opnd2;
10520 int rop;
10522 opnd1 = idesc->operands[0];
10523 opnd2 = idesc->operands[1];
10524 if (opnd1 == IA64_OPND_AR3)
10525 rop = 0;
10526 else if (opnd2 == IA64_OPND_AR3)
10527 rop = 1;
10528 else
10529 abort ();
10530 if (CURR_SLOT.opnd[rop].X_op == O_register)
10532 char unit = 'a';
10533 if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10534 unit = 'i';
10535 else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10536 unit = 'm';
10537 if (unit != 'a' && unit != idesc->name [4])
10538 as_bad (_("AR %d can only be accessed by %c-unit"),
10539 (int) (CURR_SLOT.opnd[rop].X_add_number - REG_AR),
10540 TOUPPER (unit));
10543 else if (strcmp (idesc->name, "hint.b") == 0)
10545 switch (md.hint_b)
10547 case hint_b_ok:
10548 break;
10549 case hint_b_warning:
10550 as_warn (_("hint.b may be treated as nop"));
10551 break;
10552 case hint_b_error:
10553 as_bad (_("hint.b shouldn't be used"));
10554 break;
10558 qp_regno = 0;
10559 if (md.qp.X_op == O_register)
10561 qp_regno = md.qp.X_add_number - REG_P;
10562 md.qp.X_op = O_absent;
10565 flags = idesc->flags;
10567 if ((flags & IA64_OPCODE_FIRST) != 0)
10569 /* The alignment frag has to end with a stop bit only if the
10570 next instruction after the alignment directive has to be
10571 the first instruction in an instruction group. */
10572 if (align_frag)
10574 while (align_frag->fr_type != rs_align_code)
10576 align_frag = align_frag->fr_next;
10577 if (!align_frag)
10578 break;
10580 /* align_frag can be NULL if there are directives in
10581 between. */
10582 if (align_frag && align_frag->fr_next == frag_now)
10583 align_frag->tc_frag_data = 1;
10586 insn_group_break (1, 0, 0);
10588 align_frag = NULL;
10590 if ((flags & IA64_OPCODE_NO_PRED) != 0 && qp_regno != 0)
10592 as_bad (_("`%s' cannot be predicated"), idesc->name);
10593 goto done;
10596 /* Build the instruction. */
10597 CURR_SLOT.qp_regno = qp_regno;
10598 CURR_SLOT.idesc = idesc;
10599 as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
10600 dwarf2_where (&CURR_SLOT.debug_line);
10601 dwarf2_consume_line_info ();
10603 /* Add unwind entries, if there are any. */
10604 if (unwind.current_entry)
10606 CURR_SLOT.unwind_record = unwind.current_entry;
10607 unwind.current_entry = NULL;
10609 if (unwind.pending_saves)
10611 if (unwind.pending_saves->next)
10613 /* Attach the next pending save to the next slot so that its
10614 slot number will get set correctly. */
10615 add_unwind_entry (unwind.pending_saves->next, NOT_A_CHAR);
10616 unwind.pending_saves = &unwind.pending_saves->next->r.record.p;
10618 else
10619 unwind.pending_saves = NULL;
10621 if (unwind.proc_pending.sym && S_IS_DEFINED (unwind.proc_pending.sym))
10622 unwind.insn = 1;
10624 /* Check for dependency violations. */
10625 if (md.detect_dv)
10626 check_dv (idesc);
10628 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
10629 if (++md.num_slots_in_use >= NUM_SLOTS)
10630 emit_one_bundle ();
10632 if ((flags & IA64_OPCODE_LAST) != 0)
10633 insn_group_break (1, 0, 0);
10635 md.last_text_seg = now_seg;
10637 done:
10638 input_line_pointer = saved_input_line_pointer;
10641 /* Called when symbol NAME cannot be found in the symbol table.
10642 Should be used for dynamic valued symbols only. */
10644 symbolS *
10645 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
10647 return 0;
10650 /* Called for any expression that can not be recognized. When the
10651 function is called, `input_line_pointer' will point to the start of
10652 the expression. */
10654 void
10655 md_operand (expressionS *e)
10657 switch (*input_line_pointer)
10659 case '[':
10660 ++input_line_pointer;
10661 expression_and_evaluate (e);
10662 if (*input_line_pointer != ']')
10664 as_bad (_("Closing bracket missing"));
10665 goto err;
10667 else
10669 if (e->X_op != O_register
10670 || e->X_add_number < REG_GR
10671 || e->X_add_number > REG_GR + 127)
10673 as_bad (_("Index must be a general register"));
10674 e->X_add_number = REG_GR;
10677 ++input_line_pointer;
10678 e->X_op = O_index;
10680 break;
10682 default:
10683 break;
10685 return;
10687 err:
10688 ignore_rest_of_line ();
10691 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
10692 a section symbol plus some offset. For relocs involving @fptr(),
10693 directives we don't want such adjustments since we need to have the
10694 original symbol's name in the reloc. */
10696 ia64_fix_adjustable (fixS *fix)
10698 /* Prevent all adjustments to global symbols */
10699 if (S_IS_EXTERNAL (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
10700 return 0;
10702 switch (fix->fx_r_type)
10704 case BFD_RELOC_IA64_FPTR64I:
10705 case BFD_RELOC_IA64_FPTR32MSB:
10706 case BFD_RELOC_IA64_FPTR32LSB:
10707 case BFD_RELOC_IA64_FPTR64MSB:
10708 case BFD_RELOC_IA64_FPTR64LSB:
10709 case BFD_RELOC_IA64_LTOFF_FPTR22:
10710 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10711 return 0;
10712 default:
10713 break;
10716 return 1;
10720 ia64_force_relocation (fixS *fix)
10722 switch (fix->fx_r_type)
10724 case BFD_RELOC_IA64_FPTR64I:
10725 case BFD_RELOC_IA64_FPTR32MSB:
10726 case BFD_RELOC_IA64_FPTR32LSB:
10727 case BFD_RELOC_IA64_FPTR64MSB:
10728 case BFD_RELOC_IA64_FPTR64LSB:
10730 case BFD_RELOC_IA64_LTOFF22:
10731 case BFD_RELOC_IA64_LTOFF64I:
10732 case BFD_RELOC_IA64_LTOFF_FPTR22:
10733 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10734 case BFD_RELOC_IA64_PLTOFF22:
10735 case BFD_RELOC_IA64_PLTOFF64I:
10736 case BFD_RELOC_IA64_PLTOFF64MSB:
10737 case BFD_RELOC_IA64_PLTOFF64LSB:
10739 case BFD_RELOC_IA64_LTOFF22X:
10740 case BFD_RELOC_IA64_LDXMOV:
10741 return 1;
10743 default:
10744 break;
10747 return generic_force_reloc (fix);
10750 /* Decide from what point a pc-relative relocation is relative to,
10751 relative to the pc-relative fixup. Er, relatively speaking. */
10752 long
10753 ia64_pcrel_from_section (fixS *fix, segT sec)
10755 unsigned long off = fix->fx_frag->fr_address + fix->fx_where;
10757 if (bfd_get_section_flags (stdoutput, sec) & SEC_CODE)
10758 off &= ~0xfUL;
10760 return off;
10764 /* Used to emit section-relative relocs for the dwarf2 debug data. */
10765 void
10766 ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
10768 expressionS expr;
10770 expr.X_op = O_pseudo_fixup;
10771 expr.X_op_symbol = pseudo_func[FUNC_SEC_RELATIVE].u.sym;
10772 expr.X_add_number = 0;
10773 expr.X_add_symbol = symbol;
10774 emit_expr (&expr, size);
10777 /* This is called whenever some data item (not an instruction) needs a
10778 fixup. We pick the right reloc code depending on the byteorder
10779 currently in effect. */
10780 void
10781 ia64_cons_fix_new (fragS *f, int where, int nbytes, expressionS *exp)
10783 bfd_reloc_code_real_type code;
10784 fixS *fix;
10786 switch (nbytes)
10788 /* There are no reloc for 8 and 16 bit quantities, but we allow
10789 them here since they will work fine as long as the expression
10790 is fully defined at the end of the pass over the source file. */
10791 case 1: code = BFD_RELOC_8; break;
10792 case 2: code = BFD_RELOC_16; break;
10793 case 4:
10794 if (target_big_endian)
10795 code = BFD_RELOC_IA64_DIR32MSB;
10796 else
10797 code = BFD_RELOC_IA64_DIR32LSB;
10798 break;
10800 case 8:
10801 /* In 32-bit mode, data8 could mean function descriptors too. */
10802 if (exp->X_op == O_pseudo_fixup
10803 && exp->X_op_symbol
10804 && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC
10805 && !(md.flags & EF_IA_64_ABI64))
10807 if (target_big_endian)
10808 code = BFD_RELOC_IA64_IPLTMSB;
10809 else
10810 code = BFD_RELOC_IA64_IPLTLSB;
10811 exp->X_op = O_symbol;
10812 break;
10814 else
10816 if (target_big_endian)
10817 code = BFD_RELOC_IA64_DIR64MSB;
10818 else
10819 code = BFD_RELOC_IA64_DIR64LSB;
10820 break;
10823 case 16:
10824 if (exp->X_op == O_pseudo_fixup
10825 && exp->X_op_symbol
10826 && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC)
10828 if (target_big_endian)
10829 code = BFD_RELOC_IA64_IPLTMSB;
10830 else
10831 code = BFD_RELOC_IA64_IPLTLSB;
10832 exp->X_op = O_symbol;
10833 break;
10835 /* FALLTHRU */
10837 default:
10838 as_bad (_("Unsupported fixup size %d"), nbytes);
10839 ignore_rest_of_line ();
10840 return;
10843 if (exp->X_op == O_pseudo_fixup)
10845 exp->X_op = O_symbol;
10846 code = ia64_gen_real_reloc_type (exp->X_op_symbol, code);
10847 /* ??? If code unchanged, unsupported. */
10850 fix = fix_new_exp (f, where, nbytes, exp, 0, code);
10851 /* We need to store the byte order in effect in case we're going
10852 to fix an 8 or 16 bit relocation (for which there no real
10853 relocs available). See md_apply_fix(). */
10854 fix->tc_fix_data.bigendian = target_big_endian;
10857 /* Return the actual relocation we wish to associate with the pseudo
10858 reloc described by SYM and R_TYPE. SYM should be one of the
10859 symbols in the pseudo_func array, or NULL. */
10861 static bfd_reloc_code_real_type
10862 ia64_gen_real_reloc_type (struct symbol *sym, bfd_reloc_code_real_type r_type)
10864 bfd_reloc_code_real_type new = 0;
10865 const char *type = NULL, *suffix = "";
10867 if (sym == NULL)
10869 return r_type;
10872 switch (S_GET_VALUE (sym))
10874 case FUNC_FPTR_RELATIVE:
10875 switch (r_type)
10877 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_FPTR64I; break;
10878 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_FPTR32MSB; break;
10879 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_FPTR32LSB; break;
10880 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_FPTR64MSB; break;
10881 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_FPTR64LSB; break;
10882 default: type = "FPTR"; break;
10884 break;
10886 case FUNC_GP_RELATIVE:
10887 switch (r_type)
10889 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_GPREL22; break;
10890 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_GPREL64I; break;
10891 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_GPREL32MSB; break;
10892 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_GPREL32LSB; break;
10893 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_GPREL64MSB; break;
10894 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_GPREL64LSB; break;
10895 default: type = "GPREL"; break;
10897 break;
10899 case FUNC_LT_RELATIVE:
10900 switch (r_type)
10902 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_LTOFF22; break;
10903 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_LTOFF64I; break;
10904 default: type = "LTOFF"; break;
10906 break;
10908 case FUNC_LT_RELATIVE_X:
10909 switch (r_type)
10911 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_LTOFF22X; break;
10912 default: type = "LTOFF"; suffix = "X"; break;
10914 break;
10916 case FUNC_PC_RELATIVE:
10917 switch (r_type)
10919 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_PCREL22; break;
10920 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_PCREL64I; break;
10921 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_PCREL32MSB; break;
10922 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_PCREL32LSB; break;
10923 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_PCREL64MSB; break;
10924 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_PCREL64LSB; break;
10925 default: type = "PCREL"; break;
10927 break;
10929 case FUNC_PLT_RELATIVE:
10930 switch (r_type)
10932 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_PLTOFF22; break;
10933 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_PLTOFF64I; break;
10934 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_PLTOFF64MSB;break;
10935 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_PLTOFF64LSB;break;
10936 default: type = "PLTOFF"; break;
10938 break;
10940 case FUNC_SEC_RELATIVE:
10941 switch (r_type)
10943 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_SECREL32MSB;break;
10944 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_SECREL32LSB;break;
10945 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_SECREL64MSB;break;
10946 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_SECREL64LSB;break;
10947 default: type = "SECREL"; break;
10949 break;
10951 case FUNC_SEG_RELATIVE:
10952 switch (r_type)
10954 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_SEGREL32MSB;break;
10955 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_SEGREL32LSB;break;
10956 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_SEGREL64MSB;break;
10957 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_SEGREL64LSB;break;
10958 default: type = "SEGREL"; break;
10960 break;
10962 case FUNC_LTV_RELATIVE:
10963 switch (r_type)
10965 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_LTV32MSB; break;
10966 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_LTV32LSB; break;
10967 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_LTV64MSB; break;
10968 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_LTV64LSB; break;
10969 default: type = "LTV"; break;
10971 break;
10973 case FUNC_LT_FPTR_RELATIVE:
10974 switch (r_type)
10976 case BFD_RELOC_IA64_IMM22:
10977 new = BFD_RELOC_IA64_LTOFF_FPTR22; break;
10978 case BFD_RELOC_IA64_IMM64:
10979 new = BFD_RELOC_IA64_LTOFF_FPTR64I; break;
10980 case BFD_RELOC_IA64_DIR32MSB:
10981 new = BFD_RELOC_IA64_LTOFF_FPTR32MSB; break;
10982 case BFD_RELOC_IA64_DIR32LSB:
10983 new = BFD_RELOC_IA64_LTOFF_FPTR32LSB; break;
10984 case BFD_RELOC_IA64_DIR64MSB:
10985 new = BFD_RELOC_IA64_LTOFF_FPTR64MSB; break;
10986 case BFD_RELOC_IA64_DIR64LSB:
10987 new = BFD_RELOC_IA64_LTOFF_FPTR64LSB; break;
10988 default:
10989 type = "LTOFF_FPTR"; break;
10991 break;
10993 case FUNC_TP_RELATIVE:
10994 switch (r_type)
10996 case BFD_RELOC_IA64_IMM14: new = BFD_RELOC_IA64_TPREL14; break;
10997 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_TPREL22; break;
10998 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_TPREL64I; break;
10999 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_TPREL64MSB; break;
11000 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_TPREL64LSB; break;
11001 default: type = "TPREL"; break;
11003 break;
11005 case FUNC_LT_TP_RELATIVE:
11006 switch (r_type)
11008 case BFD_RELOC_IA64_IMM22:
11009 new = BFD_RELOC_IA64_LTOFF_TPREL22; break;
11010 default:
11011 type = "LTOFF_TPREL"; break;
11013 break;
11015 case FUNC_DTP_MODULE:
11016 switch (r_type)
11018 case BFD_RELOC_IA64_DIR64MSB:
11019 new = BFD_RELOC_IA64_DTPMOD64MSB; break;
11020 case BFD_RELOC_IA64_DIR64LSB:
11021 new = BFD_RELOC_IA64_DTPMOD64LSB; break;
11022 default:
11023 type = "DTPMOD"; break;
11025 break;
11027 case FUNC_LT_DTP_MODULE:
11028 switch (r_type)
11030 case BFD_RELOC_IA64_IMM22:
11031 new = BFD_RELOC_IA64_LTOFF_DTPMOD22; break;
11032 default:
11033 type = "LTOFF_DTPMOD"; break;
11035 break;
11037 case FUNC_DTP_RELATIVE:
11038 switch (r_type)
11040 case BFD_RELOC_IA64_DIR32MSB:
11041 new = BFD_RELOC_IA64_DTPREL32MSB; break;
11042 case BFD_RELOC_IA64_DIR32LSB:
11043 new = BFD_RELOC_IA64_DTPREL32LSB; break;
11044 case BFD_RELOC_IA64_DIR64MSB:
11045 new = BFD_RELOC_IA64_DTPREL64MSB; break;
11046 case BFD_RELOC_IA64_DIR64LSB:
11047 new = BFD_RELOC_IA64_DTPREL64LSB; break;
11048 case BFD_RELOC_IA64_IMM14:
11049 new = BFD_RELOC_IA64_DTPREL14; break;
11050 case BFD_RELOC_IA64_IMM22:
11051 new = BFD_RELOC_IA64_DTPREL22; break;
11052 case BFD_RELOC_IA64_IMM64:
11053 new = BFD_RELOC_IA64_DTPREL64I; break;
11054 default:
11055 type = "DTPREL"; break;
11057 break;
11059 case FUNC_LT_DTP_RELATIVE:
11060 switch (r_type)
11062 case BFD_RELOC_IA64_IMM22:
11063 new = BFD_RELOC_IA64_LTOFF_DTPREL22; break;
11064 default:
11065 type = "LTOFF_DTPREL"; break;
11067 break;
11069 case FUNC_IPLT_RELOC:
11070 switch (r_type)
11072 case BFD_RELOC_IA64_IPLTMSB: return r_type;
11073 case BFD_RELOC_IA64_IPLTLSB: return r_type;
11074 default: type = "IPLT"; break;
11076 break;
11078 default:
11079 abort ();
11082 if (new)
11083 return new;
11084 else
11086 int width;
11088 if (!type)
11089 abort ();
11090 switch (r_type)
11092 case BFD_RELOC_IA64_DIR32MSB: width = 32; suffix = "MSB"; break;
11093 case BFD_RELOC_IA64_DIR32LSB: width = 32; suffix = "LSB"; break;
11094 case BFD_RELOC_IA64_DIR64MSB: width = 64; suffix = "MSB"; break;
11095 case BFD_RELOC_IA64_DIR64LSB: width = 64; suffix = "LSB"; break;
11096 case BFD_RELOC_UNUSED: width = 13; break;
11097 case BFD_RELOC_IA64_IMM14: width = 14; break;
11098 case BFD_RELOC_IA64_IMM22: width = 22; break;
11099 case BFD_RELOC_IA64_IMM64: width = 64; suffix = "I"; break;
11100 default: abort ();
11103 /* This should be an error, but since previously there wasn't any
11104 diagnostic here, don't make it fail because of this for now. */
11105 as_warn (_("Cannot express %s%d%s relocation"), type, width, suffix);
11106 return r_type;
11110 /* Here is where generate the appropriate reloc for pseudo relocation
11111 functions. */
11112 void
11113 ia64_validate_fix (fixS *fix)
11115 switch (fix->fx_r_type)
11117 case BFD_RELOC_IA64_FPTR64I:
11118 case BFD_RELOC_IA64_FPTR32MSB:
11119 case BFD_RELOC_IA64_FPTR64LSB:
11120 case BFD_RELOC_IA64_LTOFF_FPTR22:
11121 case BFD_RELOC_IA64_LTOFF_FPTR64I:
11122 if (fix->fx_offset != 0)
11123 as_bad_where (fix->fx_file, fix->fx_line,
11124 _("No addend allowed in @fptr() relocation"));
11125 break;
11126 default:
11127 break;
11131 static void
11132 fix_insn (fixS *fix, const struct ia64_operand *odesc, valueT value)
11134 bfd_vma insn[3], t0, t1, control_bits;
11135 const char *err;
11136 char *fixpos;
11137 long slot;
11139 slot = fix->fx_where & 0x3;
11140 fixpos = fix->fx_frag->fr_literal + (fix->fx_where - slot);
11142 /* Bundles are always in little-endian byte order */
11143 t0 = bfd_getl64 (fixpos);
11144 t1 = bfd_getl64 (fixpos + 8);
11145 control_bits = t0 & 0x1f;
11146 insn[0] = (t0 >> 5) & 0x1ffffffffffLL;
11147 insn[1] = ((t0 >> 46) & 0x3ffff) | ((t1 & 0x7fffff) << 18);
11148 insn[2] = (t1 >> 23) & 0x1ffffffffffLL;
11150 err = NULL;
11151 if (odesc - elf64_ia64_operands == IA64_OPND_IMMU64)
11153 insn[1] = (value >> 22) & 0x1ffffffffffLL;
11154 insn[2] |= (((value & 0x7f) << 13)
11155 | (((value >> 7) & 0x1ff) << 27)
11156 | (((value >> 16) & 0x1f) << 22)
11157 | (((value >> 21) & 0x1) << 21)
11158 | (((value >> 63) & 0x1) << 36));
11160 else if (odesc - elf64_ia64_operands == IA64_OPND_IMMU62)
11162 if (value & ~0x3fffffffffffffffULL)
11163 err = "integer operand out of range";
11164 insn[1] = (value >> 21) & 0x1ffffffffffLL;
11165 insn[2] |= (((value & 0xfffff) << 6) | (((value >> 20) & 0x1) << 36));
11167 else if (odesc - elf64_ia64_operands == IA64_OPND_TGT64)
11169 value >>= 4;
11170 insn[1] = ((value >> 20) & 0x7fffffffffLL) << 2;
11171 insn[2] |= ((((value >> 59) & 0x1) << 36)
11172 | (((value >> 0) & 0xfffff) << 13));
11174 else
11175 err = (*odesc->insert) (odesc, value, insn + slot);
11177 if (err)
11178 as_bad_where (fix->fx_file, fix->fx_line, "%s", err);
11180 t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
11181 t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
11182 number_to_chars_littleendian (fixpos + 0, t0, 8);
11183 number_to_chars_littleendian (fixpos + 8, t1, 8);
11186 /* Attempt to simplify or even eliminate a fixup. The return value is
11187 ignored; perhaps it was once meaningful, but now it is historical.
11188 To indicate that a fixup has been eliminated, set FIXP->FX_DONE.
11190 If fixp->fx_addsy is non-NULL, we'll have to generate a reloc entry
11191 (if possible). */
11193 void
11194 md_apply_fix (fixS *fix, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11196 char *fixpos;
11197 valueT value = *valP;
11199 fixpos = fix->fx_frag->fr_literal + fix->fx_where;
11201 if (fix->fx_pcrel)
11203 switch (fix->fx_r_type)
11205 case BFD_RELOC_IA64_PCREL21B: break;
11206 case BFD_RELOC_IA64_PCREL21BI: break;
11207 case BFD_RELOC_IA64_PCREL21F: break;
11208 case BFD_RELOC_IA64_PCREL21M: break;
11209 case BFD_RELOC_IA64_PCREL60B: break;
11210 case BFD_RELOC_IA64_PCREL22: break;
11211 case BFD_RELOC_IA64_PCREL64I: break;
11212 case BFD_RELOC_IA64_PCREL32MSB: break;
11213 case BFD_RELOC_IA64_PCREL32LSB: break;
11214 case BFD_RELOC_IA64_PCREL64MSB: break;
11215 case BFD_RELOC_IA64_PCREL64LSB: break;
11216 default:
11217 fix->fx_r_type = ia64_gen_real_reloc_type (pseudo_func[FUNC_PC_RELATIVE].u.sym,
11218 fix->fx_r_type);
11219 break;
11222 if (fix->fx_addsy)
11224 switch (fix->fx_r_type)
11226 case BFD_RELOC_UNUSED:
11227 /* This must be a TAG13 or TAG13b operand. There are no external
11228 relocs defined for them, so we must give an error. */
11229 as_bad_where (fix->fx_file, fix->fx_line,
11230 _("%s must have a constant value"),
11231 elf64_ia64_operands[fix->tc_fix_data.opnd].desc);
11232 fix->fx_done = 1;
11233 return;
11235 case BFD_RELOC_IA64_TPREL14:
11236 case BFD_RELOC_IA64_TPREL22:
11237 case BFD_RELOC_IA64_TPREL64I:
11238 case BFD_RELOC_IA64_LTOFF_TPREL22:
11239 case BFD_RELOC_IA64_LTOFF_DTPMOD22:
11240 case BFD_RELOC_IA64_DTPREL14:
11241 case BFD_RELOC_IA64_DTPREL22:
11242 case BFD_RELOC_IA64_DTPREL64I:
11243 case BFD_RELOC_IA64_LTOFF_DTPREL22:
11244 S_SET_THREAD_LOCAL (fix->fx_addsy);
11245 break;
11247 default:
11248 break;
11251 else if (fix->tc_fix_data.opnd == IA64_OPND_NIL)
11253 if (fix->tc_fix_data.bigendian)
11254 number_to_chars_bigendian (fixpos, value, fix->fx_size);
11255 else
11256 number_to_chars_littleendian (fixpos, value, fix->fx_size);
11257 fix->fx_done = 1;
11259 else
11261 fix_insn (fix, elf64_ia64_operands + fix->tc_fix_data.opnd, value);
11262 fix->fx_done = 1;
11266 /* Generate the BFD reloc to be stuck in the object file from the
11267 fixup used internally in the assembler. */
11269 arelent *
11270 tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp)
11272 arelent *reloc;
11274 reloc = xmalloc (sizeof (*reloc));
11275 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
11276 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
11277 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
11278 reloc->addend = fixp->fx_offset;
11279 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
11281 if (!reloc->howto)
11283 as_bad_where (fixp->fx_file, fixp->fx_line,
11284 _("Cannot represent %s relocation in object file"),
11285 bfd_get_reloc_code_name (fixp->fx_r_type));
11286 free (reloc);
11287 return NULL;
11289 return reloc;
11292 /* Turn a string in input_line_pointer into a floating point constant
11293 of type TYPE, and store the appropriate bytes in *LIT. The number
11294 of LITTLENUMS emitted is stored in *SIZE. An error message is
11295 returned, or NULL on OK. */
11297 #define MAX_LITTLENUMS 5
11299 char *
11300 md_atof (int type, char *lit, int *size)
11302 LITTLENUM_TYPE words[MAX_LITTLENUMS];
11303 char *t;
11304 int prec;
11306 switch (type)
11308 /* IEEE floats */
11309 case 'f':
11310 case 'F':
11311 case 's':
11312 case 'S':
11313 prec = 2;
11314 break;
11316 case 'd':
11317 case 'D':
11318 case 'r':
11319 case 'R':
11320 prec = 4;
11321 break;
11323 case 'x':
11324 case 'X':
11325 case 'p':
11326 case 'P':
11327 prec = 5;
11328 break;
11330 default:
11331 *size = 0;
11332 return _("Unrecognized or unsupported floating point constant");
11334 t = atof_ieee (input_line_pointer, type, words);
11335 if (t)
11336 input_line_pointer = t;
11338 (*ia64_float_to_chars) (lit, words, prec);
11340 if (type == 'X')
11342 /* It is 10 byte floating point with 6 byte padding. */
11343 memset (&lit [10], 0, 6);
11344 *size = 8 * sizeof (LITTLENUM_TYPE);
11346 else
11347 *size = prec * sizeof (LITTLENUM_TYPE);
11349 return NULL;
11352 /* Handle ia64 specific semantics of the align directive. */
11354 void
11355 ia64_md_do_align (int n ATTRIBUTE_UNUSED,
11356 const char *fill ATTRIBUTE_UNUSED,
11357 int len ATTRIBUTE_UNUSED,
11358 int max ATTRIBUTE_UNUSED)
11360 if (subseg_text_p (now_seg))
11361 ia64_flush_insns ();
11364 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
11365 of an rs_align_code fragment. */
11367 void
11368 ia64_handle_align (fragS *fragp)
11370 int bytes;
11371 char *p;
11372 const unsigned char *nop;
11374 if (fragp->fr_type != rs_align_code)
11375 return;
11377 /* Check if this frag has to end with a stop bit. */
11378 nop = fragp->tc_frag_data ? le_nop_stop : le_nop;
11380 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
11381 p = fragp->fr_literal + fragp->fr_fix;
11383 /* If no paddings are needed, we check if we need a stop bit. */
11384 if (!bytes && fragp->tc_frag_data)
11386 if (fragp->fr_fix < 16)
11387 #if 1
11388 /* FIXME: It won't work with
11389 .align 16
11390 alloc r32=ar.pfs,1,2,4,0
11393 #else
11394 as_bad_where (fragp->fr_file, fragp->fr_line,
11395 _("Can't add stop bit to mark end of instruction group"));
11396 #endif
11397 else
11398 /* Bundles are always in little-endian byte order. Make sure
11399 the previous bundle has the stop bit. */
11400 *(p - 16) |= 1;
11403 /* Make sure we are on a 16-byte boundary, in case someone has been
11404 putting data into a text section. */
11405 if (bytes & 15)
11407 int fix = bytes & 15;
11408 memset (p, 0, fix);
11409 p += fix;
11410 bytes -= fix;
11411 fragp->fr_fix += fix;
11414 /* Instruction bundles are always little-endian. */
11415 memcpy (p, nop, 16);
11416 fragp->fr_var = 16;
11419 static void
11420 ia64_float_to_chars_bigendian (char *lit, LITTLENUM_TYPE *words,
11421 int prec)
11423 while (prec--)
11425 number_to_chars_bigendian (lit, (long) (*words++),
11426 sizeof (LITTLENUM_TYPE));
11427 lit += sizeof (LITTLENUM_TYPE);
11431 static void
11432 ia64_float_to_chars_littleendian (char *lit, LITTLENUM_TYPE *words,
11433 int prec)
11435 while (prec--)
11437 number_to_chars_littleendian (lit, (long) (words[prec]),
11438 sizeof (LITTLENUM_TYPE));
11439 lit += sizeof (LITTLENUM_TYPE);
11443 void
11444 ia64_elf_section_change_hook (void)
11446 if (elf_section_type (now_seg) == SHT_IA_64_UNWIND
11447 && elf_linked_to_section (now_seg) == NULL)
11448 elf_linked_to_section (now_seg) = text_section;
11449 dot_byteorder (-1);
11452 /* Check if a label should be made global. */
11453 void
11454 ia64_check_label (symbolS *label)
11456 if (*input_line_pointer == ':')
11458 S_SET_EXTERNAL (label);
11459 input_line_pointer++;
11463 /* Used to remember where .alias and .secalias directives are seen. We
11464 will rename symbol and section names when we are about to output
11465 the relocatable file. */
11466 struct alias
11468 char *file; /* The file where the directive is seen. */
11469 unsigned int line; /* The line number the directive is at. */
11470 const char *name; /* The original name of the symbol. */
11473 /* Called for .alias and .secalias directives. If SECTION is 1, it is
11474 .secalias. Otherwise, it is .alias. */
11475 static void
11476 dot_alias (int section)
11478 char *name, *alias;
11479 char delim;
11480 char *end_name;
11481 int len;
11482 const char *error_string;
11483 struct alias *h;
11484 const char *a;
11485 struct hash_control *ahash, *nhash;
11486 const char *kind;
11488 name = input_line_pointer;
11489 delim = get_symbol_end ();
11490 end_name = input_line_pointer;
11491 *end_name = delim;
11493 if (name == end_name)
11495 as_bad (_("expected symbol name"));
11496 ignore_rest_of_line ();
11497 return;
11500 SKIP_WHITESPACE ();
11502 if (*input_line_pointer != ',')
11504 *end_name = 0;
11505 as_bad (_("expected comma after \"%s\""), name);
11506 *end_name = delim;
11507 ignore_rest_of_line ();
11508 return;
11511 input_line_pointer++;
11512 *end_name = 0;
11513 ia64_canonicalize_symbol_name (name);
11515 /* We call demand_copy_C_string to check if alias string is valid.
11516 There should be a closing `"' and no `\0' in the string. */
11517 alias = demand_copy_C_string (&len);
11518 if (alias == NULL)
11520 ignore_rest_of_line ();
11521 return;
11524 /* Make a copy of name string. */
11525 len = strlen (name) + 1;
11526 obstack_grow (&notes, name, len);
11527 name = obstack_finish (&notes);
11529 if (section)
11531 kind = "section";
11532 ahash = secalias_hash;
11533 nhash = secalias_name_hash;
11535 else
11537 kind = "symbol";
11538 ahash = alias_hash;
11539 nhash = alias_name_hash;
11542 /* Check if alias has been used before. */
11543 h = (struct alias *) hash_find (ahash, alias);
11544 if (h)
11546 if (strcmp (h->name, name))
11547 as_bad (_("`%s' is already the alias of %s `%s'"),
11548 alias, kind, h->name);
11549 goto out;
11552 /* Check if name already has an alias. */
11553 a = (const char *) hash_find (nhash, name);
11554 if (a)
11556 if (strcmp (a, alias))
11557 as_bad (_("%s `%s' already has an alias `%s'"), kind, name, a);
11558 goto out;
11561 h = (struct alias *) xmalloc (sizeof (struct alias));
11562 as_where (&h->file, &h->line);
11563 h->name = name;
11565 error_string = hash_jam (ahash, alias, (void *) h);
11566 if (error_string)
11568 as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
11569 alias, kind, error_string);
11570 goto out;
11573 error_string = hash_jam (nhash, name, (void *) alias);
11574 if (error_string)
11576 as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
11577 alias, kind, error_string);
11578 out:
11579 obstack_free (&notes, name);
11580 obstack_free (&notes, alias);
11583 demand_empty_rest_of_line ();
11586 /* It renames the original symbol name to its alias. */
11587 static void
11588 do_alias (const char *alias, void *value)
11590 struct alias *h = (struct alias *) value;
11591 symbolS *sym = symbol_find (h->name);
11593 if (sym == NULL)
11595 #ifdef TE_VMS
11596 /* Uses .alias extensively to alias CRTL functions to same with
11597 decc$ prefix. Sometimes function gets optimized away and a
11598 warning results, which should be suppressed. */
11599 if (strncmp (alias, "decc$", 5) != 0)
11600 #endif
11601 as_warn_where (h->file, h->line,
11602 _("symbol `%s' aliased to `%s' is not used"),
11603 h->name, alias);
11605 else
11606 S_SET_NAME (sym, (char *) alias);
11609 /* Called from write_object_file. */
11610 void
11611 ia64_adjust_symtab (void)
11613 hash_traverse (alias_hash, do_alias);
11616 /* It renames the original section name to its alias. */
11617 static void
11618 do_secalias (const char *alias, void *value)
11620 struct alias *h = (struct alias *) value;
11621 segT sec = bfd_get_section_by_name (stdoutput, h->name);
11623 if (sec == NULL)
11624 as_warn_where (h->file, h->line,
11625 _("section `%s' aliased to `%s' is not used"),
11626 h->name, alias);
11627 else
11628 sec->name = alias;
11631 /* Called from write_object_file. */
11632 void
11633 ia64_frob_file (void)
11635 hash_traverse (secalias_hash, do_secalias);
11638 #ifdef TE_VMS
11639 #define NT_VMS_MHD 1
11640 #define NT_VMS_LNM 2
11642 /* Integrity VMS 8.x identifies it's ELF modules with a standard ELF
11643 .note section. */
11645 /* Manufacture a VMS-like time string. */
11646 static void
11647 get_vms_time (char *Now)
11649 char *pnt;
11650 time_t timeb;
11652 time (&timeb);
11653 pnt = ctime (&timeb);
11654 pnt[3] = 0;
11655 pnt[7] = 0;
11656 pnt[10] = 0;
11657 pnt[16] = 0;
11658 pnt[24] = 0;
11659 sprintf (Now, "%2s-%3s-%s %s", pnt + 8, pnt + 4, pnt + 20, pnt + 11);
11662 void
11663 ia64_vms_note (void)
11665 char *p;
11666 asection *seg = now_seg;
11667 subsegT subseg = now_subseg;
11668 Elf_Internal_Note i_note;
11669 asection *secp = NULL;
11670 char *basec, *bname;
11671 char buf [256];
11672 symbolS *sym;
11674 /* Create the .note section. */
11676 secp = subseg_new (".note", 0);
11677 bfd_set_section_flags (stdoutput,
11678 secp,
11679 SEC_HAS_CONTENTS | SEC_READONLY);
11681 /* Module header note. */
11682 basec = xstrdup (out_file_name);
11683 bname = basename (basec);
11684 if ((p = strrchr (bname, '.')))
11685 *p = '\0';
11687 i_note.namesz = 8;
11688 i_note.descsz = 40 + strlen (bname);
11689 i_note.type = NT_VMS_MHD;
11691 p = frag_more (sizeof (i_note.namesz));
11692 number_to_chars_littleendian (p, i_note.namesz, 8);
11694 p = frag_more (sizeof (i_note.descsz));
11695 number_to_chars_littleendian (p, i_note.descsz, 8);
11697 p = frag_more (sizeof (i_note.type));
11698 number_to_chars_littleendian (p, i_note.type, 8);
11700 p = frag_more (8);
11701 strcpy (p, "IPF/VMS");
11703 get_vms_time (buf);
11704 p = frag_more (17);
11705 strcpy (p, buf);
11707 p = frag_more (17);
11708 strcpy (p, "24-FEB-2005 15:00");
11710 p = frag_more (strlen (bname) + 1);
11711 strcpy (p, bname);
11713 p = frag_more (5);
11714 strcpy (p, "V1.0");
11716 frag_align (3, 0, 0);
11718 /* Language processor name note. */
11719 sprintf (buf, "GNU assembler version %s (%s) using BFD version %s",
11720 VERSION, TARGET_ALIAS, BFD_VERSION_STRING);
11722 i_note.namesz = 8;
11723 i_note.descsz = 1 + strlen (buf);
11724 i_note.type = NT_VMS_LNM;
11726 p = frag_more (sizeof (i_note.namesz));
11727 number_to_chars_littleendian (p, i_note.namesz, 8);
11729 p = frag_more (sizeof (i_note.descsz));
11730 number_to_chars_littleendian (p, i_note.descsz, 8);
11732 p = frag_more (sizeof (i_note.type));
11733 number_to_chars_littleendian (p, i_note.type, 8);
11735 p = frag_more (8);
11736 strcpy (p, "IPF/VMS");
11738 p = frag_more (strlen (buf) + 1);
11739 strcpy (p, buf);
11741 frag_align (3, 0, 0);
11743 secp = subseg_new (".vms_display_name_info", 0);
11744 bfd_set_section_flags (stdoutput,
11745 secp,
11746 SEC_HAS_CONTENTS | SEC_READONLY);
11748 /* This symbol should be passed on the command line and be variable
11749 according to language. */
11750 sym = symbol_new ("__gnat_vms_display_name@gnat_demangler_rtl",
11751 absolute_section, 0, &zero_address_frag);
11752 symbol_table_insert (sym);
11753 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING | BSF_DYNAMIC;
11755 p = frag_more (4);
11756 /* Format 3 of VMS demangler Spec. */
11757 number_to_chars_littleendian (p, 3, 4);
11759 p = frag_more (4);
11760 /* Place holder for symbol table index of above symbol. */
11761 number_to_chars_littleendian (p, -1, 4);
11763 frag_align (3, 0, 0);
11765 /* We probably can't restore the current segment, for there likely
11766 isn't one yet... */
11767 if (seg && subseg)
11768 subseg_set (seg, subseg);
11771 #endif /* TE_VMS */