1 /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
34 - labels are wrong if automatic alignment is introduced
35 (e.g., checkout the second real10 definition in test-data.s)
37 <reg>.safe_across_calls and any other DV-related directives I don't
38 have documentation for.
39 verify mod-sched-brs reads/writes are checked/marked (and other
45 #include "safe-ctype.h"
46 #include "dwarf2dbg.h"
49 #include "opcode/ia64.h"
53 #define NELEMS(a) ((int) (sizeof (a)/sizeof ((a)[0])))
54 #define MIN(a,b) ((a) < (b) ? (a) : (b))
57 #define PREV_SLOT md.slot[(md.curr_slot + NUM_SLOTS - 1) % NUM_SLOTS]
58 #define CURR_SLOT md.slot[md.curr_slot]
60 #define O_pseudo_fixup (O_max + 1)
64 /* IA-64 ABI section pseudo-ops. */
65 SPECIAL_SECTION_BSS = 0,
67 SPECIAL_SECTION_SDATA,
68 SPECIAL_SECTION_RODATA,
69 SPECIAL_SECTION_COMMENT,
70 SPECIAL_SECTION_UNWIND,
71 SPECIAL_SECTION_UNWIND_INFO,
72 /* HPUX specific section pseudo-ops. */
73 SPECIAL_SECTION_INIT_ARRAY,
74 SPECIAL_SECTION_FINI_ARRAY,
91 FUNC_LT_FPTR_RELATIVE,
101 REG_FR = (REG_GR + 128),
102 REG_AR = (REG_FR + 128),
103 REG_CR = (REG_AR + 128),
104 REG_P = (REG_CR + 128),
105 REG_BR = (REG_P + 64),
106 REG_IP = (REG_BR + 8),
113 /* The following are pseudo-registers for use by gas only. */
125 /* The following pseudo-registers are used for unwind directives only: */
133 DYNREG_GR = 0, /* dynamic general purpose register */
134 DYNREG_FR, /* dynamic floating point register */
135 DYNREG_PR, /* dynamic predicate register */
139 enum operand_match_result
142 OPERAND_OUT_OF_RANGE,
146 /* On the ia64, we can't know the address of a text label until the
147 instructions are packed into a bundle. To handle this, we keep
148 track of the list of labels that appear in front of each
152 struct label_fix *next;
156 extern int target_big_endian;
158 void (*ia64_number_to_chars) PARAMS ((char *, valueT, int));
160 static void ia64_float_to_chars_bigendian
161 PARAMS ((char *, LITTLENUM_TYPE *, int));
162 static void ia64_float_to_chars_littleendian
163 PARAMS ((char *, LITTLENUM_TYPE *, int));
164 static void (*ia64_float_to_chars)
165 PARAMS ((char *, LITTLENUM_TYPE *, int));
167 static struct hash_control *alias_hash;
168 static struct hash_control *alias_name_hash;
169 static struct hash_control *secalias_hash;
170 static struct hash_control *secalias_name_hash;
172 /* Characters which always start a comment. */
173 const char comment_chars[] = "";
175 /* Characters which start a comment at the beginning of a line. */
176 const char line_comment_chars[] = "#";
178 /* Characters which may be used to separate multiple commands on a
180 const char line_separator_chars[] = ";";
182 /* Characters which are used to indicate an exponent in a floating
184 const char EXP_CHARS[] = "eE";
186 /* Characters which mean that a number is a floating point constant,
188 const char FLT_CHARS[] = "rRsSfFdDxXpP";
190 /* ia64-specific option processing: */
192 const char *md_shortopts = "m:N:x::";
194 struct option md_longopts[] =
196 #define OPTION_MCONSTANT_GP (OPTION_MD_BASE + 1)
197 {"mconstant-gp", no_argument, NULL, OPTION_MCONSTANT_GP},
198 #define OPTION_MAUTO_PIC (OPTION_MD_BASE + 2)
199 {"mauto-pic", no_argument, NULL, OPTION_MAUTO_PIC}
202 size_t md_longopts_size = sizeof (md_longopts);
206 struct hash_control *pseudo_hash; /* pseudo opcode hash table */
207 struct hash_control *reg_hash; /* register name hash table */
208 struct hash_control *dynreg_hash; /* dynamic register hash table */
209 struct hash_control *const_hash; /* constant hash table */
210 struct hash_control *entry_hash; /* code entry hint hash table */
212 symbolS *regsym[REG_NUM];
214 /* If X_op is != O_absent, the registername for the instruction's
215 qualifying predicate. If NULL, p0 is assumed for instructions
216 that are predicatable. */
223 explicit_mode : 1, /* which mode we're in */
224 default_explicit_mode : 1, /* which mode is the default */
225 mode_explicitly_set : 1, /* was the current mode explicitly set? */
227 keep_pending_output : 1;
229 /* Each bundle consists of up to three instructions. We keep
230 track of four most recent instructions so we can correctly set
231 the end_of_insn_group for the last instruction in a bundle. */
233 int num_slots_in_use;
237 end_of_insn_group : 1,
238 manual_bundling_on : 1,
239 manual_bundling_off : 1;
240 signed char user_template; /* user-selected template, if any */
241 unsigned char qp_regno; /* qualifying predicate */
242 /* This duplicates a good fraction of "struct fix" but we
243 can't use a "struct fix" instead since we can't call
244 fix_new_exp() until we know the address of the instruction. */
248 bfd_reloc_code_real_type code;
249 enum ia64_opnd opnd; /* type of operand in need of fix */
250 unsigned int is_pcrel : 1; /* is operand pc-relative? */
251 expressionS expr; /* the value to be inserted */
253 fixup[2]; /* at most two fixups per insn */
254 struct ia64_opcode *idesc;
255 struct label_fix *label_fixups;
256 struct label_fix *tag_fixups;
257 struct unw_rec_list *unwind_record; /* Unwind directive. */
260 unsigned int src_line;
261 struct dwarf2_line_info debug_line;
269 struct dynreg *next; /* next dynamic register */
271 unsigned short base; /* the base register number */
272 unsigned short num_regs; /* # of registers in this set */
274 *dynreg[DYNREG_NUM_TYPES], in, loc, out, rot;
276 flagword flags; /* ELF-header flags */
279 unsigned hint:1; /* is this hint currently valid? */
280 bfd_vma offset; /* mem.offset offset */
281 bfd_vma base; /* mem.offset base */
284 int path; /* number of alt. entry points seen */
285 const char **entry_labels; /* labels of all alternate paths in
286 the current DV-checking block. */
287 int maxpaths; /* size currently allocated for
289 /* Support for hardware errata workarounds. */
291 /* Record data about the last three insn groups. */
294 /* B-step workaround.
295 For each predicate register, this is set if the corresponding insn
296 group conditionally sets this register with one of the affected
299 /* B-step workaround.
300 For each general register, this is set if the corresponding insn
301 a) is conditional one one of the predicate registers for which
302 P_REG_SET is 1 in the corresponding entry of the previous group,
303 b) sets this general register with one of the affected
305 int g_reg_set_conditionally[128];
309 int pointer_size; /* size in bytes of a pointer */
310 int pointer_size_shift; /* shift size of a pointer for alignment */
314 /* application registers: */
320 #define AR_BSPSTORE 18
335 {"ar.k0", 0}, {"ar.k1", 1}, {"ar.k2", 2}, {"ar.k3", 3},
336 {"ar.k4", 4}, {"ar.k5", 5}, {"ar.k6", 6}, {"ar.k7", 7},
337 {"ar.rsc", 16}, {"ar.bsp", 17},
338 {"ar.bspstore", 18}, {"ar.rnat", 19},
339 {"ar.fcr", 21}, {"ar.eflag", 24},
340 {"ar.csd", 25}, {"ar.ssd", 26},
341 {"ar.cflg", 27}, {"ar.fsr", 28},
342 {"ar.fir", 29}, {"ar.fdr", 30},
343 {"ar.ccv", 32}, {"ar.unat", 36},
344 {"ar.fpsr", 40}, {"ar.itc", 44},
345 {"ar.pfs", 64}, {"ar.lc", 65},
366 /* control registers: */
408 static const struct const_desc
415 /* PSR constant masks: */
418 {"psr.be", ((valueT) 1) << 1},
419 {"psr.up", ((valueT) 1) << 2},
420 {"psr.ac", ((valueT) 1) << 3},
421 {"psr.mfl", ((valueT) 1) << 4},
422 {"psr.mfh", ((valueT) 1) << 5},
424 {"psr.ic", ((valueT) 1) << 13},
425 {"psr.i", ((valueT) 1) << 14},
426 {"psr.pk", ((valueT) 1) << 15},
428 {"psr.dt", ((valueT) 1) << 17},
429 {"psr.dfl", ((valueT) 1) << 18},
430 {"psr.dfh", ((valueT) 1) << 19},
431 {"psr.sp", ((valueT) 1) << 20},
432 {"psr.pp", ((valueT) 1) << 21},
433 {"psr.di", ((valueT) 1) << 22},
434 {"psr.si", ((valueT) 1) << 23},
435 {"psr.db", ((valueT) 1) << 24},
436 {"psr.lp", ((valueT) 1) << 25},
437 {"psr.tb", ((valueT) 1) << 26},
438 {"psr.rt", ((valueT) 1) << 27},
439 /* 28-31: reserved */
440 /* 32-33: cpl (current privilege level) */
441 {"psr.is", ((valueT) 1) << 34},
442 {"psr.mc", ((valueT) 1) << 35},
443 {"psr.it", ((valueT) 1) << 36},
444 {"psr.id", ((valueT) 1) << 37},
445 {"psr.da", ((valueT) 1) << 38},
446 {"psr.dd", ((valueT) 1) << 39},
447 {"psr.ss", ((valueT) 1) << 40},
448 /* 41-42: ri (restart instruction) */
449 {"psr.ed", ((valueT) 1) << 43},
450 {"psr.bn", ((valueT) 1) << 44},
453 /* indirect register-sets/memory: */
462 { "CPUID", IND_CPUID },
463 { "cpuid", IND_CPUID },
475 /* Pseudo functions used to indicate relocation types (these functions
476 start with an at sign (@). */
498 /* reloc pseudo functions (these must come first!): */
499 { "dtpmod", PSEUDO_FUNC_RELOC, { 0 } },
500 { "dtprel", PSEUDO_FUNC_RELOC, { 0 } },
501 { "fptr", PSEUDO_FUNC_RELOC, { 0 } },
502 { "gprel", PSEUDO_FUNC_RELOC, { 0 } },
503 { "ltoff", PSEUDO_FUNC_RELOC, { 0 } },
504 { "ltoffx", PSEUDO_FUNC_RELOC, { 0 } },
505 { "pcrel", PSEUDO_FUNC_RELOC, { 0 } },
506 { "pltoff", PSEUDO_FUNC_RELOC, { 0 } },
507 { "secrel", PSEUDO_FUNC_RELOC, { 0 } },
508 { "segrel", PSEUDO_FUNC_RELOC, { 0 } },
509 { "tprel", PSEUDO_FUNC_RELOC, { 0 } },
510 { "ltv", PSEUDO_FUNC_RELOC, { 0 } },
511 { "", 0, { 0 } }, /* placeholder for FUNC_LT_FPTR_RELATIVE */
512 { "", 0, { 0 } }, /* placeholder for FUNC_LT_DTP_MODULE */
513 { "", 0, { 0 } }, /* placeholder for FUNC_LT_DTP_RELATIVE */
514 { "", 0, { 0 } }, /* placeholder for FUNC_LT_TP_RELATIVE */
515 { "iplt", PSEUDO_FUNC_RELOC, { 0 } },
517 /* mbtype4 constants: */
518 { "alt", PSEUDO_FUNC_CONST, { 0xa } },
519 { "brcst", PSEUDO_FUNC_CONST, { 0x0 } },
520 { "mix", PSEUDO_FUNC_CONST, { 0x8 } },
521 { "rev", PSEUDO_FUNC_CONST, { 0xb } },
522 { "shuf", PSEUDO_FUNC_CONST, { 0x9 } },
524 /* fclass constants: */
525 { "nat", PSEUDO_FUNC_CONST, { 0x100 } },
526 { "qnan", PSEUDO_FUNC_CONST, { 0x080 } },
527 { "snan", PSEUDO_FUNC_CONST, { 0x040 } },
528 { "pos", PSEUDO_FUNC_CONST, { 0x001 } },
529 { "neg", PSEUDO_FUNC_CONST, { 0x002 } },
530 { "zero", PSEUDO_FUNC_CONST, { 0x004 } },
531 { "unorm", PSEUDO_FUNC_CONST, { 0x008 } },
532 { "norm", PSEUDO_FUNC_CONST, { 0x010 } },
533 { "inf", PSEUDO_FUNC_CONST, { 0x020 } },
535 { "natval", PSEUDO_FUNC_CONST, { 0x100 } }, /* old usage */
537 /* hint constants: */
538 { "pause", PSEUDO_FUNC_CONST, { 0x0 } },
540 /* unwind-related constants: */
541 { "svr4", PSEUDO_FUNC_CONST, { ELFOSABI_NONE } },
542 { "hpux", PSEUDO_FUNC_CONST, { ELFOSABI_HPUX } },
543 { "nt", PSEUDO_FUNC_CONST, { 2 } }, /* conflicts w/ELFOSABI_NETBSD */
544 { "linux", PSEUDO_FUNC_CONST, { ELFOSABI_LINUX } },
545 { "freebsd", PSEUDO_FUNC_CONST, { ELFOSABI_FREEBSD } },
546 { "openvms", PSEUDO_FUNC_CONST, { ELFOSABI_OPENVMS } },
547 { "nsk", PSEUDO_FUNC_CONST, { ELFOSABI_NSK } },
549 /* unwind-related registers: */
550 { "priunat",PSEUDO_FUNC_REG, { REG_PRIUNAT } }
553 /* 41-bit nop opcodes (one per unit): */
554 static const bfd_vma nop[IA64_NUM_UNITS] =
556 0x0000000000LL, /* NIL => break 0 */
557 0x0008000000LL, /* I-unit nop */
558 0x0008000000LL, /* M-unit nop */
559 0x4000000000LL, /* B-unit nop */
560 0x0008000000LL, /* F-unit nop */
561 0x0008000000LL, /* L-"unit" nop */
562 0x0008000000LL, /* X-unit nop */
565 /* Can't be `const' as it's passed to input routines (which have the
566 habit of setting temporary sentinels. */
567 static char special_section_name[][20] =
569 {".bss"}, {".sbss"}, {".sdata"}, {".rodata"}, {".comment"},
570 {".IA_64.unwind"}, {".IA_64.unwind_info"},
571 {".init_array"}, {".fini_array"}
574 static char *special_linkonce_name[] =
576 ".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
579 /* The best template for a particular sequence of up to three
581 #define N IA64_NUM_TYPES
582 static unsigned char best_template[N][N][N];
585 /* Resource dependencies currently in effect */
587 int depind; /* dependency index */
588 const struct ia64_dependency *dependency; /* actual dependency */
589 unsigned specific:1, /* is this a specific bit/regno? */
590 link_to_qp_branch:1; /* will a branch on the same QP clear it?*/
591 int index; /* specific regno/bit within dependency */
592 int note; /* optional qualifying note (0 if none) */
596 int insn_srlz; /* current insn serialization state */
597 int data_srlz; /* current data serialization state */
598 int qp_regno; /* qualifying predicate for this usage */
599 char *file; /* what file marked this dependency */
600 unsigned int line; /* what line marked this dependency */
601 struct mem_offset mem_offset; /* optional memory offset hint */
602 enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
603 int path; /* corresponding code entry index */
605 static int regdepslen = 0;
606 static int regdepstotlen = 0;
607 static const char *dv_mode[] = { "RAW", "WAW", "WAR" };
608 static const char *dv_sem[] = { "none", "implied", "impliedf",
609 "data", "instr", "specific", "stop", "other" };
610 static const char *dv_cmp_type[] = { "none", "OR", "AND" };
612 /* Current state of PR mutexation */
613 static struct qpmutex {
616 } *qp_mutexes = NULL; /* QP mutex bitmasks */
617 static int qp_mutexeslen = 0;
618 static int qp_mutexestotlen = 0;
619 static valueT qp_safe_across_calls = 0;
621 /* Current state of PR implications */
622 static struct qp_imply {
625 unsigned p2_branched:1;
627 } *qp_implies = NULL;
628 static int qp_implieslen = 0;
629 static int qp_impliestotlen = 0;
631 /* Keep track of static GR values so that indirect register usage can
632 sometimes be tracked. */
637 } gr_values[128] = {{ 1, 0, 0 }};
639 /* These are the routines required to output the various types of
642 /* A slot_number is a frag address plus the slot index (0-2). We use the
643 frag address here so that if there is a section switch in the middle of
644 a function, then instructions emitted to a different section are not
645 counted. Since there may be more than one frag for a function, this
646 means we also need to keep track of which frag this address belongs to
647 so we can compute inter-frag distances. This also nicely solves the
648 problem with nops emitted for align directives, which can't easily be
649 counted, but can easily be derived from frag sizes. */
651 typedef struct unw_rec_list {
653 unsigned long slot_number;
655 unsigned long next_slot_number;
656 fragS *next_slot_frag;
657 struct unw_rec_list *next;
660 #define SLOT_NUM_NOT_SET (unsigned)-1
662 /* Linked list of saved prologue counts. A very poor
663 implementation of a map from label numbers to prologue counts. */
664 typedef struct label_prologue_count
666 struct label_prologue_count *next;
667 unsigned long label_number;
668 unsigned int prologue_count;
669 } label_prologue_count;
673 /* Maintain a list of unwind entries for the current function. */
677 /* Any unwind entires that should be attached to the current slot
678 that an insn is being constructed for. */
679 unw_rec_list *current_entry;
681 /* These are used to create the unwind table entry for this function. */
684 symbolS *info; /* pointer to unwind info */
685 symbolS *personality_routine;
687 subsegT saved_text_subseg;
688 unsigned int force_unwind_entry : 1; /* force generation of unwind entry? */
690 /* TRUE if processing unwind directives in a prologue region. */
693 unsigned int prologue_count; /* number of .prologues seen so far */
694 /* Prologue counts at previous .label_state directives. */
695 struct label_prologue_count * saved_prologue_counts;
698 typedef void (*vbyte_func) PARAMS ((int, char *, char *));
700 /* Forward declarations: */
701 static int ar_is_in_integer_unit PARAMS ((int regnum));
702 static void set_section PARAMS ((char *name));
703 static unsigned int set_regstack PARAMS ((unsigned int, unsigned int,
704 unsigned int, unsigned int));
705 static void dot_radix PARAMS ((int));
706 static void dot_special_section PARAMS ((int));
707 static void dot_proc PARAMS ((int));
708 static void dot_fframe PARAMS ((int));
709 static void dot_vframe PARAMS ((int));
710 static void dot_vframesp PARAMS ((int));
711 static void dot_vframepsp PARAMS ((int));
712 static void dot_save PARAMS ((int));
713 static void dot_restore PARAMS ((int));
714 static void dot_restorereg PARAMS ((int));
715 static void dot_restorereg_p PARAMS ((int));
716 static void dot_handlerdata PARAMS ((int));
717 static void dot_unwentry PARAMS ((int));
718 static void dot_altrp PARAMS ((int));
719 static void dot_savemem PARAMS ((int));
720 static void dot_saveg PARAMS ((int));
721 static void dot_savef PARAMS ((int));
722 static void dot_saveb PARAMS ((int));
723 static void dot_savegf PARAMS ((int));
724 static void dot_spill PARAMS ((int));
725 static void dot_spillreg PARAMS ((int));
726 static void dot_spillmem PARAMS ((int));
727 static void dot_spillreg_p PARAMS ((int));
728 static void dot_spillmem_p PARAMS ((int));
729 static void dot_label_state PARAMS ((int));
730 static void dot_copy_state PARAMS ((int));
731 static void dot_unwabi PARAMS ((int));
732 static void dot_personality PARAMS ((int));
733 static void dot_body PARAMS ((int));
734 static void dot_prologue PARAMS ((int));
735 static void dot_endp PARAMS ((int));
736 static void dot_template PARAMS ((int));
737 static void dot_regstk PARAMS ((int));
738 static void dot_rot PARAMS ((int));
739 static void dot_byteorder PARAMS ((int));
740 static void dot_psr PARAMS ((int));
741 static void dot_alias PARAMS ((int));
742 static void dot_ln PARAMS ((int));
743 static char *parse_section_name PARAMS ((void));
744 static void dot_xdata PARAMS ((int));
745 static void stmt_float_cons PARAMS ((int));
746 static void stmt_cons_ua PARAMS ((int));
747 static void dot_xfloat_cons PARAMS ((int));
748 static void dot_xstringer PARAMS ((int));
749 static void dot_xdata_ua PARAMS ((int));
750 static void dot_xfloat_cons_ua PARAMS ((int));
751 static void print_prmask PARAMS ((valueT mask));
752 static void dot_pred_rel PARAMS ((int));
753 static void dot_reg_val PARAMS ((int));
754 static void dot_dv_mode PARAMS ((int));
755 static void dot_entry PARAMS ((int));
756 static void dot_mem_offset PARAMS ((int));
757 static void add_unwind_entry PARAMS((unw_rec_list *ptr));
758 static symbolS *declare_register PARAMS ((const char *name, int regnum));
759 static void declare_register_set PARAMS ((const char *, int, int));
760 static unsigned int operand_width PARAMS ((enum ia64_opnd));
761 static enum operand_match_result operand_match PARAMS ((const struct ia64_opcode *idesc,
764 static int parse_operand PARAMS ((expressionS *e));
765 static struct ia64_opcode * parse_operands PARAMS ((struct ia64_opcode *));
766 static int errata_nop_necessary_p PARAMS ((struct slot *, enum ia64_unit));
767 static void build_insn PARAMS ((struct slot *, bfd_vma *));
768 static void emit_one_bundle PARAMS ((void));
769 static void fix_insn PARAMS ((fixS *, const struct ia64_operand *, valueT));
770 static bfd_reloc_code_real_type ia64_gen_real_reloc_type PARAMS ((struct symbol *sym,
771 bfd_reloc_code_real_type r_type));
772 static void insn_group_break PARAMS ((int, int, int));
773 static void mark_resource PARAMS ((struct ia64_opcode *, const struct ia64_dependency *,
774 struct rsrc *, int depind, int path));
775 static void add_qp_mutex PARAMS((valueT mask));
776 static void add_qp_imply PARAMS((int p1, int p2));
777 static void clear_qp_branch_flag PARAMS((valueT mask));
778 static void clear_qp_mutex PARAMS((valueT mask));
779 static void clear_qp_implies PARAMS((valueT p1_mask, valueT p2_mask));
780 static int has_suffix_p PARAMS((const char *, const char *));
781 static void clear_register_values PARAMS ((void));
782 static void print_dependency PARAMS ((const char *action, int depind));
783 static void instruction_serialization PARAMS ((void));
784 static void data_serialization PARAMS ((void));
785 static void remove_marked_resource PARAMS ((struct rsrc *));
786 static int is_conditional_branch PARAMS ((struct ia64_opcode *));
787 static int is_taken_branch PARAMS ((struct ia64_opcode *));
788 static int is_interruption_or_rfi PARAMS ((struct ia64_opcode *));
789 static int depends_on PARAMS ((int, struct ia64_opcode *));
790 static int specify_resource PARAMS ((const struct ia64_dependency *,
791 struct ia64_opcode *, int, struct rsrc [], int, int));
792 static int check_dv PARAMS((struct ia64_opcode *idesc));
793 static void check_dependencies PARAMS((struct ia64_opcode *));
794 static void mark_resources PARAMS((struct ia64_opcode *));
795 static void update_dependencies PARAMS((struct ia64_opcode *));
796 static void note_register_values PARAMS((struct ia64_opcode *));
797 static int qp_mutex PARAMS ((int, int, int));
798 static int resources_match PARAMS ((struct rsrc *, struct ia64_opcode *, int, int, int));
799 static void output_vbyte_mem PARAMS ((int, char *, char *));
800 static void count_output PARAMS ((int, char *, char *));
801 static void output_R1_format PARAMS ((vbyte_func, unw_record_type, int));
802 static void output_R2_format PARAMS ((vbyte_func, int, int, unsigned long));
803 static void output_R3_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
804 static void output_P1_format PARAMS ((vbyte_func, int));
805 static void output_P2_format PARAMS ((vbyte_func, int, int));
806 static void output_P3_format PARAMS ((vbyte_func, unw_record_type, int));
807 static void output_P4_format PARAMS ((vbyte_func, unsigned char *, unsigned long));
808 static void output_P5_format PARAMS ((vbyte_func, int, unsigned long));
809 static void output_P6_format PARAMS ((vbyte_func, unw_record_type, int));
810 static void output_P7_format PARAMS ((vbyte_func, unw_record_type, unsigned long, unsigned long));
811 static void output_P8_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
812 static void output_P9_format PARAMS ((vbyte_func, int, int));
813 static void output_P10_format PARAMS ((vbyte_func, int, int));
814 static void output_B1_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
815 static void output_B2_format PARAMS ((vbyte_func, unsigned long, unsigned long));
816 static void output_B3_format PARAMS ((vbyte_func, unsigned long, unsigned long));
817 static void output_B4_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
818 static char format_ab_reg PARAMS ((int, int));
819 static void output_X1_format PARAMS ((vbyte_func, unw_record_type, int, int, unsigned long,
821 static void output_X2_format PARAMS ((vbyte_func, int, int, int, int, int, unsigned long));
822 static void output_X3_format PARAMS ((vbyte_func, unw_record_type, int, int, int, unsigned long,
824 static void output_X4_format PARAMS ((vbyte_func, int, int, int, int, int, int, unsigned long));
825 static unw_rec_list *output_endp PARAMS ((void));
826 static unw_rec_list *output_prologue PARAMS ((void));
827 static unw_rec_list *output_prologue_gr PARAMS ((unsigned int, unsigned int));
828 static unw_rec_list *output_body PARAMS ((void));
829 static unw_rec_list *output_mem_stack_f PARAMS ((unsigned int));
830 static unw_rec_list *output_mem_stack_v PARAMS ((void));
831 static unw_rec_list *output_psp_gr PARAMS ((unsigned int));
832 static unw_rec_list *output_psp_sprel PARAMS ((unsigned int));
833 static unw_rec_list *output_rp_when PARAMS ((void));
834 static unw_rec_list *output_rp_gr PARAMS ((unsigned int));
835 static unw_rec_list *output_rp_br PARAMS ((unsigned int));
836 static unw_rec_list *output_rp_psprel PARAMS ((unsigned int));
837 static unw_rec_list *output_rp_sprel PARAMS ((unsigned int));
838 static unw_rec_list *output_pfs_when PARAMS ((void));
839 static unw_rec_list *output_pfs_gr PARAMS ((unsigned int));
840 static unw_rec_list *output_pfs_psprel PARAMS ((unsigned int));
841 static unw_rec_list *output_pfs_sprel PARAMS ((unsigned int));
842 static unw_rec_list *output_preds_when PARAMS ((void));
843 static unw_rec_list *output_preds_gr PARAMS ((unsigned int));
844 static unw_rec_list *output_preds_psprel PARAMS ((unsigned int));
845 static unw_rec_list *output_preds_sprel PARAMS ((unsigned int));
846 static unw_rec_list *output_fr_mem PARAMS ((unsigned int));
847 static unw_rec_list *output_frgr_mem PARAMS ((unsigned int, unsigned int));
848 static unw_rec_list *output_gr_gr PARAMS ((unsigned int, unsigned int));
849 static unw_rec_list *output_gr_mem PARAMS ((unsigned int));
850 static unw_rec_list *output_br_mem PARAMS ((unsigned int));
851 static unw_rec_list *output_br_gr PARAMS ((unsigned int, unsigned int));
852 static unw_rec_list *output_spill_base PARAMS ((unsigned int));
853 static unw_rec_list *output_unat_when PARAMS ((void));
854 static unw_rec_list *output_unat_gr PARAMS ((unsigned int));
855 static unw_rec_list *output_unat_psprel PARAMS ((unsigned int));
856 static unw_rec_list *output_unat_sprel PARAMS ((unsigned int));
857 static unw_rec_list *output_lc_when PARAMS ((void));
858 static unw_rec_list *output_lc_gr PARAMS ((unsigned int));
859 static unw_rec_list *output_lc_psprel PARAMS ((unsigned int));
860 static unw_rec_list *output_lc_sprel PARAMS ((unsigned int));
861 static unw_rec_list *output_fpsr_when PARAMS ((void));
862 static unw_rec_list *output_fpsr_gr PARAMS ((unsigned int));
863 static unw_rec_list *output_fpsr_psprel PARAMS ((unsigned int));
864 static unw_rec_list *output_fpsr_sprel PARAMS ((unsigned int));
865 static unw_rec_list *output_priunat_when_gr PARAMS ((void));
866 static unw_rec_list *output_priunat_when_mem PARAMS ((void));
867 static unw_rec_list *output_priunat_gr PARAMS ((unsigned int));
868 static unw_rec_list *output_priunat_psprel PARAMS ((unsigned int));
869 static unw_rec_list *output_priunat_sprel PARAMS ((unsigned int));
870 static unw_rec_list *output_bsp_when PARAMS ((void));
871 static unw_rec_list *output_bsp_gr PARAMS ((unsigned int));
872 static unw_rec_list *output_bsp_psprel PARAMS ((unsigned int));
873 static unw_rec_list *output_bsp_sprel PARAMS ((unsigned int));
874 static unw_rec_list *output_bspstore_when PARAMS ((void));
875 static unw_rec_list *output_bspstore_gr PARAMS ((unsigned int));
876 static unw_rec_list *output_bspstore_psprel PARAMS ((unsigned int));
877 static unw_rec_list *output_bspstore_sprel PARAMS ((unsigned int));
878 static unw_rec_list *output_rnat_when PARAMS ((void));
879 static unw_rec_list *output_rnat_gr PARAMS ((unsigned int));
880 static unw_rec_list *output_rnat_psprel PARAMS ((unsigned int));
881 static unw_rec_list *output_rnat_sprel PARAMS ((unsigned int));
882 static unw_rec_list *output_unwabi PARAMS ((unsigned long, unsigned long));
883 static unw_rec_list *output_epilogue PARAMS ((unsigned long));
884 static unw_rec_list *output_label_state PARAMS ((unsigned long));
885 static unw_rec_list *output_copy_state PARAMS ((unsigned long));
886 static unw_rec_list *output_spill_psprel PARAMS ((unsigned int, unsigned int, unsigned int));
887 static unw_rec_list *output_spill_sprel PARAMS ((unsigned int, unsigned int, unsigned int));
888 static unw_rec_list *output_spill_psprel_p PARAMS ((unsigned int, unsigned int, unsigned int,
890 static unw_rec_list *output_spill_sprel_p PARAMS ((unsigned int, unsigned int, unsigned int,
892 static unw_rec_list *output_spill_reg PARAMS ((unsigned int, unsigned int, unsigned int,
894 static unw_rec_list *output_spill_reg_p PARAMS ((unsigned int, unsigned int, unsigned int,
895 unsigned int, unsigned int));
896 static void process_one_record PARAMS ((unw_rec_list *, vbyte_func));
897 static void process_unw_records PARAMS ((unw_rec_list *, vbyte_func));
898 static int calc_record_size PARAMS ((unw_rec_list *));
899 static void set_imask PARAMS ((unw_rec_list *, unsigned long, unsigned long, unsigned int));
900 static unsigned long slot_index PARAMS ((unsigned long, fragS *,
901 unsigned long, fragS *));
902 static unw_rec_list *optimize_unw_records PARAMS ((unw_rec_list *));
903 static void fixup_unw_records PARAMS ((unw_rec_list *));
904 static int convert_expr_to_ab_reg PARAMS ((expressionS *, unsigned int *, unsigned int *));
905 static int convert_expr_to_xy_reg PARAMS ((expressionS *, unsigned int *, unsigned int *));
906 static void generate_unwind_image PARAMS ((const char *));
907 static unsigned int get_saved_prologue_count PARAMS ((unsigned long));
908 static void save_prologue_count PARAMS ((unsigned long, unsigned int));
909 static void free_saved_prologue_counts PARAMS ((void));
911 /* Build the unwind section name by appending the (possibly stripped)
912 text section NAME to the unwind PREFIX. The resulting string
913 pointer is assigned to RESULT. The string is allocated on the
914 stack, so this must be a macro... */
915 #define make_unw_section_name(special, text_name, result) \
917 const char *_prefix = special_section_name[special]; \
918 const char *_suffix = text_name; \
919 size_t _prefix_len, _suffix_len; \
921 if (strncmp (text_name, ".gnu.linkonce.t.", \
922 sizeof (".gnu.linkonce.t.") - 1) == 0) \
924 _prefix = special_linkonce_name[special - SPECIAL_SECTION_UNWIND]; \
925 _suffix += sizeof (".gnu.linkonce.t.") - 1; \
927 _prefix_len = strlen (_prefix), _suffix_len = strlen (_suffix); \
928 _result = alloca (_prefix_len + _suffix_len + 1); \
929 memcpy (_result, _prefix, _prefix_len); \
930 memcpy (_result + _prefix_len, _suffix, _suffix_len); \
931 _result[_prefix_len + _suffix_len] = '\0'; \
936 /* Determine if application register REGNUM resides in the integer
937 unit (as opposed to the memory unit). */
939 ar_is_in_integer_unit (reg)
944 return (reg == 64 /* pfs */
945 || reg == 65 /* lc */
946 || reg == 66 /* ec */
947 /* ??? ias accepts and puts these in the integer unit. */
948 || (reg >= 112 && reg <= 127));
951 /* Switch to section NAME and create section if necessary. It's
952 rather ugly that we have to manipulate input_line_pointer but I
953 don't see any other way to accomplish the same thing without
954 changing obj-elf.c (which may be the Right Thing, in the end). */
959 char *saved_input_line_pointer;
961 saved_input_line_pointer = input_line_pointer;
962 input_line_pointer = name;
964 input_line_pointer = saved_input_line_pointer;
967 /* Map 's' to SHF_IA_64_SHORT. */
970 ia64_elf_section_letter (letter, ptr_msg)
975 return SHF_IA_64_SHORT;
976 else if (letter == 'o')
977 return SHF_LINK_ORDER;
979 *ptr_msg = _("Bad .section directive: want a,o,s,w,x,M,S,G,T in string");
983 /* Map SHF_IA_64_SHORT to SEC_SMALL_DATA. */
986 ia64_elf_section_flags (flags, attr, type)
988 int attr, type ATTRIBUTE_UNUSED;
990 if (attr & SHF_IA_64_SHORT)
991 flags |= SEC_SMALL_DATA;
996 ia64_elf_section_type (str, len)
1000 #define STREQ(s) ((len == sizeof (s) - 1) && (strncmp (str, s, sizeof (s) - 1) == 0))
1002 if (STREQ (ELF_STRING_ia64_unwind_info))
1003 return SHT_PROGBITS;
1005 if (STREQ (ELF_STRING_ia64_unwind_info_once))
1006 return SHT_PROGBITS;
1008 if (STREQ (ELF_STRING_ia64_unwind))
1009 return SHT_IA_64_UNWIND;
1011 if (STREQ (ELF_STRING_ia64_unwind_once))
1012 return SHT_IA_64_UNWIND;
1014 if (STREQ ("unwind"))
1015 return SHT_IA_64_UNWIND;
1017 if (STREQ ("init_array"))
1018 return SHT_INIT_ARRAY;
1020 if (STREQ ("fini_array"))
1021 return SHT_FINI_ARRAY;
1028 set_regstack (ins, locs, outs, rots)
1029 unsigned int ins, locs, outs, rots;
1031 /* Size of frame. */
1034 sof = ins + locs + outs;
1037 as_bad ("Size of frame exceeds maximum of 96 registers");
1042 as_warn ("Size of rotating registers exceeds frame size");
1045 md.in.base = REG_GR + 32;
1046 md.loc.base = md.in.base + ins;
1047 md.out.base = md.loc.base + locs;
1049 md.in.num_regs = ins;
1050 md.loc.num_regs = locs;
1051 md.out.num_regs = outs;
1052 md.rot.num_regs = rots;
1059 struct label_fix *lfix;
1061 subsegT saved_subseg;
1064 if (!md.last_text_seg)
1067 saved_seg = now_seg;
1068 saved_subseg = now_subseg;
1070 subseg_set (md.last_text_seg, 0);
1072 while (md.num_slots_in_use > 0)
1073 emit_one_bundle (); /* force out queued instructions */
1075 /* In case there are labels following the last instruction, resolve
1077 for (lfix = CURR_SLOT.label_fixups; lfix; lfix = lfix->next)
1079 S_SET_VALUE (lfix->sym, frag_now_fix ());
1080 symbol_set_frag (lfix->sym, frag_now);
1082 CURR_SLOT.label_fixups = 0;
1083 for (lfix = CURR_SLOT.tag_fixups; lfix; lfix = lfix->next)
1085 S_SET_VALUE (lfix->sym, frag_now_fix ());
1086 symbol_set_frag (lfix->sym, frag_now);
1088 CURR_SLOT.tag_fixups = 0;
1090 /* In case there are unwind directives following the last instruction,
1091 resolve those now. We only handle prologue, body, and endp directives
1092 here. Give an error for others. */
1093 for (ptr = unwind.current_entry; ptr; ptr = ptr->next)
1095 if (ptr->r.type == prologue || ptr->r.type == prologue_gr
1096 || ptr->r.type == body || ptr->r.type == endp)
1098 ptr->slot_number = (unsigned long) frag_more (0);
1099 ptr->slot_frag = frag_now;
1102 as_bad (_("Unwind directive not followed by an instruction."));
1104 unwind.current_entry = NULL;
1106 subseg_set (saved_seg, saved_subseg);
1108 if (md.qp.X_op == O_register)
1109 as_bad ("qualifying predicate not followed by instruction");
1113 ia64_do_align (nbytes)
1116 char *saved_input_line_pointer = input_line_pointer;
1118 input_line_pointer = "";
1119 s_align_bytes (nbytes);
1120 input_line_pointer = saved_input_line_pointer;
1124 ia64_cons_align (nbytes)
1129 char *saved_input_line_pointer = input_line_pointer;
1130 input_line_pointer = "";
1131 s_align_bytes (nbytes);
1132 input_line_pointer = saved_input_line_pointer;
1136 /* Output COUNT bytes to a memory location. */
1137 static unsigned char *vbyte_mem_ptr = NULL;
1140 output_vbyte_mem (count, ptr, comment)
1143 char *comment ATTRIBUTE_UNUSED;
1146 if (vbyte_mem_ptr == NULL)
1151 for (x = 0; x < count; x++)
1152 *(vbyte_mem_ptr++) = ptr[x];
1155 /* Count the number of bytes required for records. */
1156 static int vbyte_count = 0;
1158 count_output (count, ptr, comment)
1160 char *ptr ATTRIBUTE_UNUSED;
1161 char *comment ATTRIBUTE_UNUSED;
1163 vbyte_count += count;
1167 output_R1_format (f, rtype, rlen)
1169 unw_record_type rtype;
1176 output_R3_format (f, rtype, rlen);
1182 else if (rtype != prologue)
1183 as_bad ("record type is not valid");
1185 byte = UNW_R1 | (r << 5) | (rlen & 0x1f);
1186 (*f) (1, &byte, NULL);
1190 output_R2_format (f, mask, grsave, rlen)
1197 mask = (mask & 0x0f);
1198 grsave = (grsave & 0x7f);
1200 bytes[0] = (UNW_R2 | (mask >> 1));
1201 bytes[1] = (((mask & 0x01) << 7) | grsave);
1202 count += output_leb128 (bytes + 2, rlen, 0);
1203 (*f) (count, bytes, NULL);
1207 output_R3_format (f, rtype, rlen)
1209 unw_record_type rtype;
1216 output_R1_format (f, rtype, rlen);
1222 else if (rtype != prologue)
1223 as_bad ("record type is not valid");
1224 bytes[0] = (UNW_R3 | r);
1225 count = output_leb128 (bytes + 1, rlen, 0);
1226 (*f) (count + 1, bytes, NULL);
1230 output_P1_format (f, brmask)
1235 byte = UNW_P1 | (brmask & 0x1f);
1236 (*f) (1, &byte, NULL);
1240 output_P2_format (f, brmask, gr)
1246 brmask = (brmask & 0x1f);
1247 bytes[0] = UNW_P2 | (brmask >> 1);
1248 bytes[1] = (((brmask & 1) << 7) | gr);
1249 (*f) (2, bytes, NULL);
1253 output_P3_format (f, rtype, reg)
1255 unw_record_type rtype;
1300 as_bad ("Invalid record type for P3 format.");
1302 bytes[0] = (UNW_P3 | (r >> 1));
1303 bytes[1] = (((r & 1) << 7) | reg);
1304 (*f) (2, bytes, NULL);
1308 output_P4_format (f, imask, imask_size)
1310 unsigned char *imask;
1311 unsigned long imask_size;
1314 (*f) (imask_size, imask, NULL);
1318 output_P5_format (f, grmask, frmask)
1321 unsigned long frmask;
1324 grmask = (grmask & 0x0f);
1327 bytes[1] = ((grmask << 4) | ((frmask & 0x000f0000) >> 16));
1328 bytes[2] = ((frmask & 0x0000ff00) >> 8);
1329 bytes[3] = (frmask & 0x000000ff);
1330 (*f) (4, bytes, NULL);
1334 output_P6_format (f, rtype, rmask)
1336 unw_record_type rtype;
1342 if (rtype == gr_mem)
1344 else if (rtype != fr_mem)
1345 as_bad ("Invalid record type for format P6");
1346 byte = (UNW_P6 | (r << 4) | (rmask & 0x0f));
1347 (*f) (1, &byte, NULL);
1351 output_P7_format (f, rtype, w1, w2)
1353 unw_record_type rtype;
1360 count += output_leb128 (bytes + 1, w1, 0);
1365 count += output_leb128 (bytes + count, w2 >> 4, 0);
1415 bytes[0] = (UNW_P7 | r);
1416 (*f) (count, bytes, NULL);
1420 output_P8_format (f, rtype, t)
1422 unw_record_type rtype;
1461 case bspstore_psprel:
1464 case bspstore_sprel:
1476 case priunat_when_gr:
1479 case priunat_psprel:
1485 case priunat_when_mem:
1492 count += output_leb128 (bytes + 2, t, 0);
1493 (*f) (count, bytes, NULL);
1497 output_P9_format (f, grmask, gr)
1504 bytes[1] = (grmask & 0x0f);
1505 bytes[2] = (gr & 0x7f);
1506 (*f) (3, bytes, NULL);
1510 output_P10_format (f, abi, context)
1517 bytes[1] = (abi & 0xff);
1518 bytes[2] = (context & 0xff);
1519 (*f) (3, bytes, NULL);
1523 output_B1_format (f, rtype, label)
1525 unw_record_type rtype;
1526 unsigned long label;
1532 output_B4_format (f, rtype, label);
1535 if (rtype == copy_state)
1537 else if (rtype != label_state)
1538 as_bad ("Invalid record type for format B1");
1540 byte = (UNW_B1 | (r << 5) | (label & 0x1f));
1541 (*f) (1, &byte, NULL);
1545 output_B2_format (f, ecount, t)
1547 unsigned long ecount;
1554 output_B3_format (f, ecount, t);
1557 bytes[0] = (UNW_B2 | (ecount & 0x1f));
1558 count += output_leb128 (bytes + 1, t, 0);
1559 (*f) (count, bytes, NULL);
1563 output_B3_format (f, ecount, t)
1565 unsigned long ecount;
1572 output_B2_format (f, ecount, t);
1576 count += output_leb128 (bytes + 1, t, 0);
1577 count += output_leb128 (bytes + count, ecount, 0);
1578 (*f) (count, bytes, NULL);
1582 output_B4_format (f, rtype, label)
1584 unw_record_type rtype;
1585 unsigned long label;
1592 output_B1_format (f, rtype, label);
1596 if (rtype == copy_state)
1598 else if (rtype != label_state)
1599 as_bad ("Invalid record type for format B1");
1601 bytes[0] = (UNW_B4 | (r << 3));
1602 count += output_leb128 (bytes + 1, label, 0);
1603 (*f) (count, bytes, NULL);
1607 format_ab_reg (ab, reg)
1614 ret = (ab << 5) | reg;
1619 output_X1_format (f, rtype, ab, reg, t, w1)
1621 unw_record_type rtype;
1631 if (rtype == spill_sprel)
1633 else if (rtype != spill_psprel)
1634 as_bad ("Invalid record type for format X1");
1635 bytes[1] = ((r << 7) | format_ab_reg (ab, reg));
1636 count += output_leb128 (bytes + 2, t, 0);
1637 count += output_leb128 (bytes + count, w1, 0);
1638 (*f) (count, bytes, NULL);
1642 output_X2_format (f, ab, reg, x, y, treg, t)
1651 bytes[1] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1652 bytes[2] = (((y & 1) << 7) | (treg & 0x7f));
1653 count += output_leb128 (bytes + 3, t, 0);
1654 (*f) (count, bytes, NULL);
1658 output_X3_format (f, rtype, qp, ab, reg, t, w1)
1660 unw_record_type rtype;
1671 if (rtype == spill_sprel_p)
1673 else if (rtype != spill_psprel_p)
1674 as_bad ("Invalid record type for format X3");
1675 bytes[1] = ((r << 7) | (qp & 0x3f));
1676 bytes[2] = format_ab_reg (ab, reg);
1677 count += output_leb128 (bytes + 3, t, 0);
1678 count += output_leb128 (bytes + count, w1, 0);
1679 (*f) (count, bytes, NULL);
1683 output_X4_format (f, qp, ab, reg, x, y, treg, t)
1693 bytes[1] = (qp & 0x3f);
1694 bytes[2] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1695 bytes[3] = (((y & 1) << 7) | (treg & 0x7f));
1696 count += output_leb128 (bytes + 4, t, 0);
1697 (*f) (count, bytes, NULL);
1700 /* This function allocates a record list structure, and initializes fields. */
1702 static unw_rec_list *
1703 alloc_record (unw_record_type t)
1706 ptr = xmalloc (sizeof (*ptr));
1708 ptr->slot_number = SLOT_NUM_NOT_SET;
1710 ptr->next_slot_number = 0;
1711 ptr->next_slot_frag = 0;
1715 /* Dummy unwind record used for calculating the length of the last prologue or
1718 static unw_rec_list *
1721 unw_rec_list *ptr = alloc_record (endp);
1725 static unw_rec_list *
1728 unw_rec_list *ptr = alloc_record (prologue);
1729 memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1733 static unw_rec_list *
1734 output_prologue_gr (saved_mask, reg)
1735 unsigned int saved_mask;
1738 unw_rec_list *ptr = alloc_record (prologue_gr);
1739 memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1740 ptr->r.record.r.grmask = saved_mask;
1741 ptr->r.record.r.grsave = reg;
1745 static unw_rec_list *
1748 unw_rec_list *ptr = alloc_record (body);
1752 static unw_rec_list *
1753 output_mem_stack_f (size)
1756 unw_rec_list *ptr = alloc_record (mem_stack_f);
1757 ptr->r.record.p.size = size;
1761 static unw_rec_list *
1762 output_mem_stack_v ()
1764 unw_rec_list *ptr = alloc_record (mem_stack_v);
1768 static unw_rec_list *
1772 unw_rec_list *ptr = alloc_record (psp_gr);
1773 ptr->r.record.p.gr = gr;
1777 static unw_rec_list *
1778 output_psp_sprel (offset)
1779 unsigned int offset;
1781 unw_rec_list *ptr = alloc_record (psp_sprel);
1782 ptr->r.record.p.spoff = offset / 4;
1786 static unw_rec_list *
1789 unw_rec_list *ptr = alloc_record (rp_when);
1793 static unw_rec_list *
1797 unw_rec_list *ptr = alloc_record (rp_gr);
1798 ptr->r.record.p.gr = gr;
1802 static unw_rec_list *
1806 unw_rec_list *ptr = alloc_record (rp_br);
1807 ptr->r.record.p.br = br;
1811 static unw_rec_list *
1812 output_rp_psprel (offset)
1813 unsigned int offset;
1815 unw_rec_list *ptr = alloc_record (rp_psprel);
1816 ptr->r.record.p.pspoff = offset / 4;
1820 static unw_rec_list *
1821 output_rp_sprel (offset)
1822 unsigned int offset;
1824 unw_rec_list *ptr = alloc_record (rp_sprel);
1825 ptr->r.record.p.spoff = offset / 4;
1829 static unw_rec_list *
1832 unw_rec_list *ptr = alloc_record (pfs_when);
1836 static unw_rec_list *
1840 unw_rec_list *ptr = alloc_record (pfs_gr);
1841 ptr->r.record.p.gr = gr;
1845 static unw_rec_list *
1846 output_pfs_psprel (offset)
1847 unsigned int offset;
1849 unw_rec_list *ptr = alloc_record (pfs_psprel);
1850 ptr->r.record.p.pspoff = offset / 4;
1854 static unw_rec_list *
1855 output_pfs_sprel (offset)
1856 unsigned int offset;
1858 unw_rec_list *ptr = alloc_record (pfs_sprel);
1859 ptr->r.record.p.spoff = offset / 4;
1863 static unw_rec_list *
1864 output_preds_when ()
1866 unw_rec_list *ptr = alloc_record (preds_when);
1870 static unw_rec_list *
1871 output_preds_gr (gr)
1874 unw_rec_list *ptr = alloc_record (preds_gr);
1875 ptr->r.record.p.gr = gr;
1879 static unw_rec_list *
1880 output_preds_psprel (offset)
1881 unsigned int offset;
1883 unw_rec_list *ptr = alloc_record (preds_psprel);
1884 ptr->r.record.p.pspoff = offset / 4;
1888 static unw_rec_list *
1889 output_preds_sprel (offset)
1890 unsigned int offset;
1892 unw_rec_list *ptr = alloc_record (preds_sprel);
1893 ptr->r.record.p.spoff = offset / 4;
1897 static unw_rec_list *
1898 output_fr_mem (mask)
1901 unw_rec_list *ptr = alloc_record (fr_mem);
1902 ptr->r.record.p.rmask = mask;
1906 static unw_rec_list *
1907 output_frgr_mem (gr_mask, fr_mask)
1908 unsigned int gr_mask;
1909 unsigned int fr_mask;
1911 unw_rec_list *ptr = alloc_record (frgr_mem);
1912 ptr->r.record.p.grmask = gr_mask;
1913 ptr->r.record.p.frmask = fr_mask;
1917 static unw_rec_list *
1918 output_gr_gr (mask, reg)
1922 unw_rec_list *ptr = alloc_record (gr_gr);
1923 ptr->r.record.p.grmask = mask;
1924 ptr->r.record.p.gr = reg;
1928 static unw_rec_list *
1929 output_gr_mem (mask)
1932 unw_rec_list *ptr = alloc_record (gr_mem);
1933 ptr->r.record.p.rmask = mask;
1937 static unw_rec_list *
1938 output_br_mem (unsigned int mask)
1940 unw_rec_list *ptr = alloc_record (br_mem);
1941 ptr->r.record.p.brmask = mask;
1945 static unw_rec_list *
1946 output_br_gr (save_mask, reg)
1947 unsigned int save_mask;
1950 unw_rec_list *ptr = alloc_record (br_gr);
1951 ptr->r.record.p.brmask = save_mask;
1952 ptr->r.record.p.gr = reg;
1956 static unw_rec_list *
1957 output_spill_base (offset)
1958 unsigned int offset;
1960 unw_rec_list *ptr = alloc_record (spill_base);
1961 ptr->r.record.p.pspoff = offset / 4;
1965 static unw_rec_list *
1968 unw_rec_list *ptr = alloc_record (unat_when);
1972 static unw_rec_list *
1976 unw_rec_list *ptr = alloc_record (unat_gr);
1977 ptr->r.record.p.gr = gr;
1981 static unw_rec_list *
1982 output_unat_psprel (offset)
1983 unsigned int offset;
1985 unw_rec_list *ptr = alloc_record (unat_psprel);
1986 ptr->r.record.p.pspoff = offset / 4;
1990 static unw_rec_list *
1991 output_unat_sprel (offset)
1992 unsigned int offset;
1994 unw_rec_list *ptr = alloc_record (unat_sprel);
1995 ptr->r.record.p.spoff = offset / 4;
1999 static unw_rec_list *
2002 unw_rec_list *ptr = alloc_record (lc_when);
2006 static unw_rec_list *
2010 unw_rec_list *ptr = alloc_record (lc_gr);
2011 ptr->r.record.p.gr = gr;
2015 static unw_rec_list *
2016 output_lc_psprel (offset)
2017 unsigned int offset;
2019 unw_rec_list *ptr = alloc_record (lc_psprel);
2020 ptr->r.record.p.pspoff = offset / 4;
2024 static unw_rec_list *
2025 output_lc_sprel (offset)
2026 unsigned int offset;
2028 unw_rec_list *ptr = alloc_record (lc_sprel);
2029 ptr->r.record.p.spoff = offset / 4;
2033 static unw_rec_list *
2036 unw_rec_list *ptr = alloc_record (fpsr_when);
2040 static unw_rec_list *
2044 unw_rec_list *ptr = alloc_record (fpsr_gr);
2045 ptr->r.record.p.gr = gr;
2049 static unw_rec_list *
2050 output_fpsr_psprel (offset)
2051 unsigned int offset;
2053 unw_rec_list *ptr = alloc_record (fpsr_psprel);
2054 ptr->r.record.p.pspoff = offset / 4;
2058 static unw_rec_list *
2059 output_fpsr_sprel (offset)
2060 unsigned int offset;
2062 unw_rec_list *ptr = alloc_record (fpsr_sprel);
2063 ptr->r.record.p.spoff = offset / 4;
2067 static unw_rec_list *
2068 output_priunat_when_gr ()
2070 unw_rec_list *ptr = alloc_record (priunat_when_gr);
2074 static unw_rec_list *
2075 output_priunat_when_mem ()
2077 unw_rec_list *ptr = alloc_record (priunat_when_mem);
2081 static unw_rec_list *
2082 output_priunat_gr (gr)
2085 unw_rec_list *ptr = alloc_record (priunat_gr);
2086 ptr->r.record.p.gr = gr;
2090 static unw_rec_list *
2091 output_priunat_psprel (offset)
2092 unsigned int offset;
2094 unw_rec_list *ptr = alloc_record (priunat_psprel);
2095 ptr->r.record.p.pspoff = offset / 4;
2099 static unw_rec_list *
2100 output_priunat_sprel (offset)
2101 unsigned int offset;
2103 unw_rec_list *ptr = alloc_record (priunat_sprel);
2104 ptr->r.record.p.spoff = offset / 4;
2108 static unw_rec_list *
2111 unw_rec_list *ptr = alloc_record (bsp_when);
2115 static unw_rec_list *
2119 unw_rec_list *ptr = alloc_record (bsp_gr);
2120 ptr->r.record.p.gr = gr;
2124 static unw_rec_list *
2125 output_bsp_psprel (offset)
2126 unsigned int offset;
2128 unw_rec_list *ptr = alloc_record (bsp_psprel);
2129 ptr->r.record.p.pspoff = offset / 4;
2133 static unw_rec_list *
2134 output_bsp_sprel (offset)
2135 unsigned int offset;
2137 unw_rec_list *ptr = alloc_record (bsp_sprel);
2138 ptr->r.record.p.spoff = offset / 4;
2142 static unw_rec_list *
2143 output_bspstore_when ()
2145 unw_rec_list *ptr = alloc_record (bspstore_when);
2149 static unw_rec_list *
2150 output_bspstore_gr (gr)
2153 unw_rec_list *ptr = alloc_record (bspstore_gr);
2154 ptr->r.record.p.gr = gr;
2158 static unw_rec_list *
2159 output_bspstore_psprel (offset)
2160 unsigned int offset;
2162 unw_rec_list *ptr = alloc_record (bspstore_psprel);
2163 ptr->r.record.p.pspoff = offset / 4;
2167 static unw_rec_list *
2168 output_bspstore_sprel (offset)
2169 unsigned int offset;
2171 unw_rec_list *ptr = alloc_record (bspstore_sprel);
2172 ptr->r.record.p.spoff = offset / 4;
2176 static unw_rec_list *
2179 unw_rec_list *ptr = alloc_record (rnat_when);
2183 static unw_rec_list *
2187 unw_rec_list *ptr = alloc_record (rnat_gr);
2188 ptr->r.record.p.gr = gr;
2192 static unw_rec_list *
2193 output_rnat_psprel (offset)
2194 unsigned int offset;
2196 unw_rec_list *ptr = alloc_record (rnat_psprel);
2197 ptr->r.record.p.pspoff = offset / 4;
2201 static unw_rec_list *
2202 output_rnat_sprel (offset)
2203 unsigned int offset;
2205 unw_rec_list *ptr = alloc_record (rnat_sprel);
2206 ptr->r.record.p.spoff = offset / 4;
2210 static unw_rec_list *
2211 output_unwabi (abi, context)
2213 unsigned long context;
2215 unw_rec_list *ptr = alloc_record (unwabi);
2216 ptr->r.record.p.abi = abi;
2217 ptr->r.record.p.context = context;
2221 static unw_rec_list *
2222 output_epilogue (unsigned long ecount)
2224 unw_rec_list *ptr = alloc_record (epilogue);
2225 ptr->r.record.b.ecount = ecount;
2229 static unw_rec_list *
2230 output_label_state (unsigned long label)
2232 unw_rec_list *ptr = alloc_record (label_state);
2233 ptr->r.record.b.label = label;
2237 static unw_rec_list *
2238 output_copy_state (unsigned long label)
2240 unw_rec_list *ptr = alloc_record (copy_state);
2241 ptr->r.record.b.label = label;
2245 static unw_rec_list *
2246 output_spill_psprel (ab, reg, offset)
2249 unsigned int offset;
2251 unw_rec_list *ptr = alloc_record (spill_psprel);
2252 ptr->r.record.x.ab = ab;
2253 ptr->r.record.x.reg = reg;
2254 ptr->r.record.x.pspoff = offset / 4;
2258 static unw_rec_list *
2259 output_spill_sprel (ab, reg, offset)
2262 unsigned int offset;
2264 unw_rec_list *ptr = alloc_record (spill_sprel);
2265 ptr->r.record.x.ab = ab;
2266 ptr->r.record.x.reg = reg;
2267 ptr->r.record.x.spoff = offset / 4;
2271 static unw_rec_list *
2272 output_spill_psprel_p (ab, reg, offset, predicate)
2275 unsigned int offset;
2276 unsigned int predicate;
2278 unw_rec_list *ptr = alloc_record (spill_psprel_p);
2279 ptr->r.record.x.ab = ab;
2280 ptr->r.record.x.reg = reg;
2281 ptr->r.record.x.pspoff = offset / 4;
2282 ptr->r.record.x.qp = predicate;
2286 static unw_rec_list *
2287 output_spill_sprel_p (ab, reg, offset, predicate)
2290 unsigned int offset;
2291 unsigned int predicate;
2293 unw_rec_list *ptr = alloc_record (spill_sprel_p);
2294 ptr->r.record.x.ab = ab;
2295 ptr->r.record.x.reg = reg;
2296 ptr->r.record.x.spoff = offset / 4;
2297 ptr->r.record.x.qp = predicate;
2301 static unw_rec_list *
2302 output_spill_reg (ab, reg, targ_reg, xy)
2305 unsigned int targ_reg;
2308 unw_rec_list *ptr = alloc_record (spill_reg);
2309 ptr->r.record.x.ab = ab;
2310 ptr->r.record.x.reg = reg;
2311 ptr->r.record.x.treg = targ_reg;
2312 ptr->r.record.x.xy = xy;
2316 static unw_rec_list *
2317 output_spill_reg_p (ab, reg, targ_reg, xy, predicate)
2320 unsigned int targ_reg;
2322 unsigned int predicate;
2324 unw_rec_list *ptr = alloc_record (spill_reg_p);
2325 ptr->r.record.x.ab = ab;
2326 ptr->r.record.x.reg = reg;
2327 ptr->r.record.x.treg = targ_reg;
2328 ptr->r.record.x.xy = xy;
2329 ptr->r.record.x.qp = predicate;
2333 /* Given a unw_rec_list process the correct format with the
2334 specified function. */
2337 process_one_record (ptr, f)
2341 unsigned long fr_mask, gr_mask;
2343 switch (ptr->r.type)
2345 /* This is a dummy record that takes up no space in the output. */
2353 /* These are taken care of by prologue/prologue_gr. */
2358 if (ptr->r.type == prologue_gr)
2359 output_R2_format (f, ptr->r.record.r.grmask,
2360 ptr->r.record.r.grsave, ptr->r.record.r.rlen);
2362 output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2364 /* Output descriptor(s) for union of register spills (if any). */
2365 gr_mask = ptr->r.record.r.mask.gr_mem;
2366 fr_mask = ptr->r.record.r.mask.fr_mem;
2369 if ((fr_mask & ~0xfUL) == 0)
2370 output_P6_format (f, fr_mem, fr_mask);
2373 output_P5_format (f, gr_mask, fr_mask);
2378 output_P6_format (f, gr_mem, gr_mask);
2379 if (ptr->r.record.r.mask.br_mem)
2380 output_P1_format (f, ptr->r.record.r.mask.br_mem);
2382 /* output imask descriptor if necessary: */
2383 if (ptr->r.record.r.mask.i)
2384 output_P4_format (f, ptr->r.record.r.mask.i,
2385 ptr->r.record.r.imask_size);
2389 output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2393 output_P7_format (f, ptr->r.type, ptr->r.record.p.t,
2394 ptr->r.record.p.size);
2407 output_P3_format (f, ptr->r.type, ptr->r.record.p.gr);
2410 output_P3_format (f, rp_br, ptr->r.record.p.br);
2413 output_P7_format (f, psp_sprel, ptr->r.record.p.spoff, 0);
2421 output_P7_format (f, ptr->r.type, ptr->r.record.p.t, 0);
2430 output_P7_format (f, ptr->r.type, ptr->r.record.p.pspoff, 0);
2440 case bspstore_sprel:
2442 output_P8_format (f, ptr->r.type, ptr->r.record.p.spoff);
2445 output_P9_format (f, ptr->r.record.p.grmask, ptr->r.record.p.gr);
2448 output_P2_format (f, ptr->r.record.p.brmask, ptr->r.record.p.gr);
2451 as_bad ("spill_mask record unimplemented.");
2453 case priunat_when_gr:
2454 case priunat_when_mem:
2458 output_P8_format (f, ptr->r.type, ptr->r.record.p.t);
2460 case priunat_psprel:
2462 case bspstore_psprel:
2464 output_P8_format (f, ptr->r.type, ptr->r.record.p.pspoff);
2467 output_P10_format (f, ptr->r.record.p.abi, ptr->r.record.p.context);
2470 output_B3_format (f, ptr->r.record.b.ecount, ptr->r.record.b.t);
2474 output_B4_format (f, ptr->r.type, ptr->r.record.b.label);
2477 output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2478 ptr->r.record.x.reg, ptr->r.record.x.t,
2479 ptr->r.record.x.pspoff);
2482 output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2483 ptr->r.record.x.reg, ptr->r.record.x.t,
2484 ptr->r.record.x.spoff);
2487 output_X2_format (f, ptr->r.record.x.ab, ptr->r.record.x.reg,
2488 ptr->r.record.x.xy >> 1, ptr->r.record.x.xy,
2489 ptr->r.record.x.treg, ptr->r.record.x.t);
2491 case spill_psprel_p:
2492 output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2493 ptr->r.record.x.ab, ptr->r.record.x.reg,
2494 ptr->r.record.x.t, ptr->r.record.x.pspoff);
2497 output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2498 ptr->r.record.x.ab, ptr->r.record.x.reg,
2499 ptr->r.record.x.t, ptr->r.record.x.spoff);
2502 output_X4_format (f, ptr->r.record.x.qp, ptr->r.record.x.ab,
2503 ptr->r.record.x.reg, ptr->r.record.x.xy >> 1,
2504 ptr->r.record.x.xy, ptr->r.record.x.treg,
2508 as_bad ("record_type_not_valid");
2513 /* Given a unw_rec_list list, process all the records with
2514 the specified function. */
2516 process_unw_records (list, f)
2521 for (ptr = list; ptr; ptr = ptr->next)
2522 process_one_record (ptr, f);
2525 /* Determine the size of a record list in bytes. */
2527 calc_record_size (list)
2531 process_unw_records (list, count_output);
2535 /* Update IMASK bitmask to reflect the fact that one or more registers
2536 of type TYPE are saved starting at instruction with index T. If N
2537 bits are set in REGMASK, it is assumed that instructions T through
2538 T+N-1 save these registers.
2542 1: instruction saves next fp reg
2543 2: instruction saves next general reg
2544 3: instruction saves next branch reg */
2546 set_imask (region, regmask, t, type)
2547 unw_rec_list *region;
2548 unsigned long regmask;
2552 unsigned char *imask;
2553 unsigned long imask_size;
2557 imask = region->r.record.r.mask.i;
2558 imask_size = region->r.record.r.imask_size;
2561 imask_size = (region->r.record.r.rlen * 2 + 7) / 8 + 1;
2562 imask = xmalloc (imask_size);
2563 memset (imask, 0, imask_size);
2565 region->r.record.r.imask_size = imask_size;
2566 region->r.record.r.mask.i = imask;
2570 pos = 2 * (3 - t % 4);
2573 if (i >= imask_size)
2575 as_bad ("Ignoring attempt to spill beyond end of region");
2579 imask[i] |= (type & 0x3) << pos;
2581 regmask &= (regmask - 1);
2591 /* Return the number of instruction slots from FIRST_ADDR to SLOT_ADDR.
2592 SLOT_FRAG is the frag containing SLOT_ADDR, and FIRST_FRAG is the frag
2593 containing FIRST_ADDR. */
2596 slot_index (slot_addr, slot_frag, first_addr, first_frag)
2597 unsigned long slot_addr;
2599 unsigned long first_addr;
2602 unsigned long index = 0;
2604 /* First time we are called, the initial address and frag are invalid. */
2605 if (first_addr == 0)
2608 /* If the two addresses are in different frags, then we need to add in
2609 the remaining size of this frag, and then the entire size of intermediate
2611 while (slot_frag != first_frag)
2613 unsigned long start_addr = (unsigned long) &first_frag->fr_literal;
2617 /* We can get the final addresses only after relaxation is
2619 if (first_frag->fr_next && first_frag->fr_next->fr_address)
2620 index += 3 * ((first_frag->fr_next->fr_address
2621 - first_frag->fr_address
2622 - first_frag->fr_fix) >> 4);
2625 /* We don't know what the final addresses will be. We try our
2626 best to estimate. */
2627 switch (first_frag->fr_type)
2633 as_fatal ("only constant space allocation is supported");
2639 /* Take alignment into account. Assume the worst case
2640 before relaxation. */
2641 index += 3 * ((1 << first_frag->fr_offset) >> 4);
2645 if (first_frag->fr_symbol)
2647 as_fatal ("only constant offsets are supported");
2651 index += 3 * (first_frag->fr_offset >> 4);
2655 /* Add in the full size of the frag converted to instruction slots. */
2656 index += 3 * (first_frag->fr_fix >> 4);
2657 /* Subtract away the initial part before first_addr. */
2658 index -= (3 * ((first_addr >> 4) - (start_addr >> 4))
2659 + ((first_addr & 0x3) - (start_addr & 0x3)));
2661 /* Move to the beginning of the next frag. */
2662 first_frag = first_frag->fr_next;
2663 first_addr = (unsigned long) &first_frag->fr_literal;
2666 /* Add in the used part of the last frag. */
2667 index += (3 * ((slot_addr >> 4) - (first_addr >> 4))
2668 + ((slot_addr & 0x3) - (first_addr & 0x3)));
2672 /* Optimize unwind record directives. */
2674 static unw_rec_list *
2675 optimize_unw_records (list)
2681 /* If the only unwind record is ".prologue" or ".prologue" followed
2682 by ".body", then we can optimize the unwind directives away. */
2683 if (list->r.type == prologue
2684 && (list->next->r.type == endp
2685 || (list->next->r.type == body && list->next->next->r.type == endp)))
2691 /* Given a complete record list, process any records which have
2692 unresolved fields, (ie length counts for a prologue). After
2693 this has been run, all necessary information should be available
2694 within each record to generate an image. */
2697 fixup_unw_records (list)
2700 unw_rec_list *ptr, *region = 0;
2701 unsigned long first_addr = 0, rlen = 0, t;
2702 fragS *first_frag = 0;
2704 for (ptr = list; ptr; ptr = ptr->next)
2706 if (ptr->slot_number == SLOT_NUM_NOT_SET)
2707 as_bad (" Insn slot not set in unwind record.");
2708 t = slot_index (ptr->slot_number, ptr->slot_frag,
2709 first_addr, first_frag);
2710 switch (ptr->r.type)
2718 unsigned long last_addr = 0;
2719 fragS *last_frag = NULL;
2721 first_addr = ptr->slot_number;
2722 first_frag = ptr->slot_frag;
2723 /* Find either the next body/prologue start, or the end of
2724 the function, and determine the size of the region. */
2725 for (last = ptr->next; last != NULL; last = last->next)
2726 if (last->r.type == prologue || last->r.type == prologue_gr
2727 || last->r.type == body || last->r.type == endp)
2729 last_addr = last->slot_number;
2730 last_frag = last->slot_frag;
2733 size = slot_index (last_addr, last_frag, first_addr, first_frag);
2734 rlen = ptr->r.record.r.rlen = size;
2735 if (ptr->r.type == body)
2736 /* End of region. */
2743 ptr->r.record.b.t = rlen - 1 - t;
2754 case priunat_when_gr:
2755 case priunat_when_mem:
2759 ptr->r.record.p.t = t;
2767 case spill_psprel_p:
2768 ptr->r.record.x.t = t;
2774 as_bad ("frgr_mem record before region record!\n");
2777 region->r.record.r.mask.fr_mem |= ptr->r.record.p.frmask;
2778 region->r.record.r.mask.gr_mem |= ptr->r.record.p.grmask;
2779 set_imask (region, ptr->r.record.p.frmask, t, 1);
2780 set_imask (region, ptr->r.record.p.grmask, t, 2);
2785 as_bad ("fr_mem record before region record!\n");
2788 region->r.record.r.mask.fr_mem |= ptr->r.record.p.rmask;
2789 set_imask (region, ptr->r.record.p.rmask, t, 1);
2794 as_bad ("gr_mem record before region record!\n");
2797 region->r.record.r.mask.gr_mem |= ptr->r.record.p.rmask;
2798 set_imask (region, ptr->r.record.p.rmask, t, 2);
2803 as_bad ("br_mem record before region record!\n");
2806 region->r.record.r.mask.br_mem |= ptr->r.record.p.brmask;
2807 set_imask (region, ptr->r.record.p.brmask, t, 3);
2813 as_bad ("gr_gr record before region record!\n");
2816 set_imask (region, ptr->r.record.p.grmask, t, 2);
2821 as_bad ("br_gr record before region record!\n");
2824 set_imask (region, ptr->r.record.p.brmask, t, 3);
2833 /* This function converts a rs_machine_dependent variant frag into a
2834 normal fill frag with the unwind image from the the record list. */
2836 ia64_convert_frag (fragS *frag)
2842 list = (unw_rec_list *) frag->fr_opcode;
2843 fixup_unw_records (list);
2845 len = calc_record_size (list);
2846 /* pad to pointer-size boundary. */
2847 pad = len % md.pointer_size;
2849 len += md.pointer_size - pad;
2850 /* Add 8 for the header + a pointer for the personality offset. */
2851 size = len + 8 + md.pointer_size;
2853 /* fr_var carries the max_chars that we created the fragment with.
2854 We must, of course, have allocated enough memory earlier. */
2855 assert (frag->fr_var >= size);
2857 /* Initialize the header area. fr_offset is initialized with
2858 unwind.personality_routine. */
2859 if (frag->fr_offset)
2861 if (md.flags & EF_IA_64_ABI64)
2862 flag_value = (bfd_vma) 3 << 32;
2864 /* 32-bit unwind info block. */
2865 flag_value = (bfd_vma) 0x1003 << 32;
2870 md_number_to_chars (frag->fr_literal,
2871 (((bfd_vma) 1 << 48) /* Version. */
2872 | flag_value /* U & E handler flags. */
2873 | (len / md.pointer_size)), /* Length. */
2876 /* Skip the header. */
2877 vbyte_mem_ptr = frag->fr_literal + 8;
2878 process_unw_records (list, output_vbyte_mem);
2880 /* Fill the padding bytes with zeros. */
2882 md_number_to_chars (frag->fr_literal + len + 8 - md.pointer_size + pad, 0,
2883 md.pointer_size - pad);
2885 frag->fr_fix += size;
2886 frag->fr_type = rs_fill;
2888 frag->fr_offset = 0;
2892 convert_expr_to_ab_reg (e, ab, regp)
2899 if (e->X_op != O_register)
2902 reg = e->X_add_number;
2903 if (reg >= (REG_GR + 4) && reg <= (REG_GR + 7))
2906 *regp = reg - REG_GR;
2908 else if ((reg >= (REG_FR + 2) && reg <= (REG_FR + 5))
2909 || (reg >= (REG_FR + 16) && reg <= (REG_FR + 31)))
2912 *regp = reg - REG_FR;
2914 else if (reg >= (REG_BR + 1) && reg <= (REG_BR + 5))
2917 *regp = reg - REG_BR;
2924 case REG_PR: *regp = 0; break;
2925 case REG_PSP: *regp = 1; break;
2926 case REG_PRIUNAT: *regp = 2; break;
2927 case REG_BR + 0: *regp = 3; break;
2928 case REG_AR + AR_BSP: *regp = 4; break;
2929 case REG_AR + AR_BSPSTORE: *regp = 5; break;
2930 case REG_AR + AR_RNAT: *regp = 6; break;
2931 case REG_AR + AR_UNAT: *regp = 7; break;
2932 case REG_AR + AR_FPSR: *regp = 8; break;
2933 case REG_AR + AR_PFS: *regp = 9; break;
2934 case REG_AR + AR_LC: *regp = 10; break;
2944 convert_expr_to_xy_reg (e, xy, regp)
2951 if (e->X_op != O_register)
2954 reg = e->X_add_number;
2956 if (/* reg >= REG_GR && */ reg <= (REG_GR + 127))
2959 *regp = reg - REG_GR;
2961 else if (reg >= REG_FR && reg <= (REG_FR + 127))
2964 *regp = reg - REG_FR;
2966 else if (reg >= REG_BR && reg <= (REG_BR + 7))
2969 *regp = reg - REG_BR;
2978 int dummy ATTRIBUTE_UNUSED;
2983 radix = *input_line_pointer++;
2985 if (radix != 'C' && !is_end_of_line[(unsigned char) radix])
2987 as_bad ("Radix `%c' unsupported", *input_line_pointer);
2988 ignore_rest_of_line ();
2993 /* .sbss, .bss etc. are macros that expand into ".section SECNAME". */
2995 dot_special_section (which)
2998 set_section ((char *) special_section_name[which]);
3002 add_unwind_entry (ptr)
3006 unwind.tail->next = ptr;
3011 /* The current entry can in fact be a chain of unwind entries. */
3012 if (unwind.current_entry == NULL)
3013 unwind.current_entry = ptr;
3018 int dummy ATTRIBUTE_UNUSED;
3024 if (e.X_op != O_constant)
3025 as_bad ("Operand to .fframe must be a constant");
3027 add_unwind_entry (output_mem_stack_f (e.X_add_number));
3032 int dummy ATTRIBUTE_UNUSED;
3038 reg = e.X_add_number - REG_GR;
3039 if (e.X_op == O_register && reg < 128)
3041 add_unwind_entry (output_mem_stack_v ());
3042 if (! (unwind.prologue_mask & 2))
3043 add_unwind_entry (output_psp_gr (reg));
3046 as_bad ("First operand to .vframe must be a general register");
3050 dot_vframesp (dummy)
3051 int dummy ATTRIBUTE_UNUSED;
3056 if (e.X_op == O_constant)
3058 add_unwind_entry (output_mem_stack_v ());
3059 add_unwind_entry (output_psp_sprel (e.X_add_number));
3062 as_bad ("Operand to .vframesp must be a constant (sp-relative offset)");
3066 dot_vframepsp (dummy)
3067 int dummy ATTRIBUTE_UNUSED;
3072 if (e.X_op == O_constant)
3074 add_unwind_entry (output_mem_stack_v ());
3075 add_unwind_entry (output_psp_sprel (e.X_add_number));
3078 as_bad ("Operand to .vframepsp must be a constant (psp-relative offset)");
3083 int dummy ATTRIBUTE_UNUSED;
3089 sep = parse_operand (&e1);
3091 as_bad ("No second operand to .save");
3092 sep = parse_operand (&e2);
3094 reg1 = e1.X_add_number;
3095 reg2 = e2.X_add_number - REG_GR;
3097 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3098 if (e1.X_op == O_register)
3100 if (e2.X_op == O_register && reg2 >= 0 && reg2 < 128)
3104 case REG_AR + AR_BSP:
3105 add_unwind_entry (output_bsp_when ());
3106 add_unwind_entry (output_bsp_gr (reg2));
3108 case REG_AR + AR_BSPSTORE:
3109 add_unwind_entry (output_bspstore_when ());
3110 add_unwind_entry (output_bspstore_gr (reg2));
3112 case REG_AR + AR_RNAT:
3113 add_unwind_entry (output_rnat_when ());
3114 add_unwind_entry (output_rnat_gr (reg2));
3116 case REG_AR + AR_UNAT:
3117 add_unwind_entry (output_unat_when ());
3118 add_unwind_entry (output_unat_gr (reg2));
3120 case REG_AR + AR_FPSR:
3121 add_unwind_entry (output_fpsr_when ());
3122 add_unwind_entry (output_fpsr_gr (reg2));
3124 case REG_AR + AR_PFS:
3125 add_unwind_entry (output_pfs_when ());
3126 if (! (unwind.prologue_mask & 4))
3127 add_unwind_entry (output_pfs_gr (reg2));
3129 case REG_AR + AR_LC:
3130 add_unwind_entry (output_lc_when ());
3131 add_unwind_entry (output_lc_gr (reg2));
3134 add_unwind_entry (output_rp_when ());
3135 if (! (unwind.prologue_mask & 8))
3136 add_unwind_entry (output_rp_gr (reg2));
3139 add_unwind_entry (output_preds_when ());
3140 if (! (unwind.prologue_mask & 1))
3141 add_unwind_entry (output_preds_gr (reg2));
3144 add_unwind_entry (output_priunat_when_gr ());
3145 add_unwind_entry (output_priunat_gr (reg2));
3148 as_bad ("First operand not a valid register");
3152 as_bad (" Second operand not a valid register");
3155 as_bad ("First operand not a register");
3160 int dummy ATTRIBUTE_UNUSED;
3163 unsigned long ecount; /* # of _additional_ regions to pop */
3166 sep = parse_operand (&e1);
3167 if (e1.X_op != O_register || e1.X_add_number != REG_GR + 12)
3169 as_bad ("First operand to .restore must be stack pointer (sp)");
3175 parse_operand (&e2);
3176 if (e2.X_op != O_constant || e2.X_add_number < 0)
3178 as_bad ("Second operand to .restore must be a constant >= 0");
3181 ecount = e2.X_add_number;
3184 ecount = unwind.prologue_count - 1;
3186 if (ecount >= unwind.prologue_count)
3188 as_bad ("Epilogue count of %lu exceeds number of nested prologues (%u)",
3189 ecount + 1, unwind.prologue_count);
3193 add_unwind_entry (output_epilogue (ecount));
3195 if (ecount < unwind.prologue_count)
3196 unwind.prologue_count -= ecount + 1;
3198 unwind.prologue_count = 0;
3202 dot_restorereg (dummy)
3203 int dummy ATTRIBUTE_UNUSED;
3205 unsigned int ab, reg;
3210 if (!convert_expr_to_ab_reg (&e, &ab, ®))
3212 as_bad ("First operand to .restorereg must be a preserved register");
3215 add_unwind_entry (output_spill_reg (ab, reg, 0, 0));
3219 dot_restorereg_p (dummy)
3220 int dummy ATTRIBUTE_UNUSED;
3222 unsigned int qp, ab, reg;
3226 sep = parse_operand (&e1);
3229 as_bad ("No second operand to .restorereg.p");
3233 parse_operand (&e2);
3235 qp = e1.X_add_number - REG_P;
3236 if (e1.X_op != O_register || qp > 63)
3238 as_bad ("First operand to .restorereg.p must be a predicate");
3242 if (!convert_expr_to_ab_reg (&e2, &ab, ®))
3244 as_bad ("Second operand to .restorereg.p must be a preserved register");
3247 add_unwind_entry (output_spill_reg_p (ab, reg, 0, 0, qp));
3251 generate_unwind_image (text_name)
3252 const char *text_name;
3257 /* Force out pending instructions, to make sure all unwind records have
3258 a valid slot_number field. */
3259 ia64_flush_insns ();
3261 /* Generate the unwind record. */
3262 list = optimize_unw_records (unwind.list);
3263 fixup_unw_records (list);
3264 size = calc_record_size (list);
3266 if (size > 0 || unwind.force_unwind_entry)
3268 unwind.force_unwind_entry = 0;
3269 /* pad to pointer-size boundary. */
3270 pad = size % md.pointer_size;
3272 size += md.pointer_size - pad;
3273 /* Add 8 for the header + a pointer for the personality
3275 size += 8 + md.pointer_size;
3278 /* If there are unwind records, switch sections, and output the info. */
3283 bfd_reloc_code_real_type reloc;
3285 make_unw_section_name (SPECIAL_SECTION_UNWIND_INFO, text_name, sec_name);
3286 set_section (sec_name);
3287 bfd_set_section_flags (stdoutput, now_seg,
3288 SEC_LOAD | SEC_ALLOC | SEC_READONLY);
3290 /* Make sure the section has 4 byte alignment for ILP32 and
3291 8 byte alignment for LP64. */
3292 frag_align (md.pointer_size_shift, 0, 0);
3293 record_alignment (now_seg, md.pointer_size_shift);
3295 /* Set expression which points to start of unwind descriptor area. */
3296 unwind.info = expr_build_dot ();
3298 frag_var (rs_machine_dependent, size, size, 0, 0,
3299 (offsetT) unwind.personality_routine, (char *) list);
3301 /* Add the personality address to the image. */
3302 if (unwind.personality_routine != 0)
3304 exp.X_op = O_symbol;
3305 exp.X_add_symbol = unwind.personality_routine;
3306 exp.X_add_number = 0;
3308 if (md.flags & EF_IA_64_BE)
3310 if (md.flags & EF_IA_64_ABI64)
3311 reloc = BFD_RELOC_IA64_LTOFF_FPTR64MSB;
3313 reloc = BFD_RELOC_IA64_LTOFF_FPTR32MSB;
3317 if (md.flags & EF_IA_64_ABI64)
3318 reloc = BFD_RELOC_IA64_LTOFF_FPTR64LSB;
3320 reloc = BFD_RELOC_IA64_LTOFF_FPTR32LSB;
3323 fix_new_exp (frag_now, frag_now_fix () - md.pointer_size,
3324 md.pointer_size, &exp, 0, reloc);
3325 unwind.personality_routine = 0;
3329 free_saved_prologue_counts ();
3330 unwind.list = unwind.tail = unwind.current_entry = NULL;
3334 dot_handlerdata (dummy)
3335 int dummy ATTRIBUTE_UNUSED;
3337 const char *text_name = segment_name (now_seg);
3339 /* If text section name starts with ".text" (which it should),
3340 strip this prefix off. */
3341 if (strcmp (text_name, ".text") == 0)
3344 unwind.force_unwind_entry = 1;
3346 /* Remember which segment we're in so we can switch back after .endp */
3347 unwind.saved_text_seg = now_seg;
3348 unwind.saved_text_subseg = now_subseg;
3350 /* Generate unwind info into unwind-info section and then leave that
3351 section as the currently active one so dataXX directives go into
3352 the language specific data area of the unwind info block. */
3353 generate_unwind_image (text_name);
3354 demand_empty_rest_of_line ();
3358 dot_unwentry (dummy)
3359 int dummy ATTRIBUTE_UNUSED;
3361 unwind.force_unwind_entry = 1;
3362 demand_empty_rest_of_line ();
3367 int dummy ATTRIBUTE_UNUSED;
3373 reg = e.X_add_number - REG_BR;
3374 if (e.X_op == O_register && reg < 8)
3375 add_unwind_entry (output_rp_br (reg));
3377 as_bad ("First operand not a valid branch register");
3381 dot_savemem (psprel)
3388 sep = parse_operand (&e1);
3390 as_bad ("No second operand to .save%ssp", psprel ? "p" : "");
3391 sep = parse_operand (&e2);
3393 reg1 = e1.X_add_number;
3394 val = e2.X_add_number;
3396 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3397 if (e1.X_op == O_register)
3399 if (e2.X_op == O_constant)
3403 case REG_AR + AR_BSP:
3404 add_unwind_entry (output_bsp_when ());
3405 add_unwind_entry ((psprel
3407 : output_bsp_sprel) (val));
3409 case REG_AR + AR_BSPSTORE:
3410 add_unwind_entry (output_bspstore_when ());
3411 add_unwind_entry ((psprel
3412 ? output_bspstore_psprel
3413 : output_bspstore_sprel) (val));
3415 case REG_AR + AR_RNAT:
3416 add_unwind_entry (output_rnat_when ());
3417 add_unwind_entry ((psprel
3418 ? output_rnat_psprel
3419 : output_rnat_sprel) (val));
3421 case REG_AR + AR_UNAT:
3422 add_unwind_entry (output_unat_when ());
3423 add_unwind_entry ((psprel
3424 ? output_unat_psprel
3425 : output_unat_sprel) (val));
3427 case REG_AR + AR_FPSR:
3428 add_unwind_entry (output_fpsr_when ());
3429 add_unwind_entry ((psprel
3430 ? output_fpsr_psprel
3431 : output_fpsr_sprel) (val));
3433 case REG_AR + AR_PFS:
3434 add_unwind_entry (output_pfs_when ());
3435 add_unwind_entry ((psprel
3437 : output_pfs_sprel) (val));
3439 case REG_AR + AR_LC:
3440 add_unwind_entry (output_lc_when ());
3441 add_unwind_entry ((psprel
3443 : output_lc_sprel) (val));
3446 add_unwind_entry (output_rp_when ());
3447 add_unwind_entry ((psprel
3449 : output_rp_sprel) (val));
3452 add_unwind_entry (output_preds_when ());
3453 add_unwind_entry ((psprel
3454 ? output_preds_psprel
3455 : output_preds_sprel) (val));
3458 add_unwind_entry (output_priunat_when_mem ());
3459 add_unwind_entry ((psprel
3460 ? output_priunat_psprel
3461 : output_priunat_sprel) (val));
3464 as_bad ("First operand not a valid register");
3468 as_bad (" Second operand not a valid constant");
3471 as_bad ("First operand not a register");
3476 int dummy ATTRIBUTE_UNUSED;
3480 sep = parse_operand (&e1);
3482 parse_operand (&e2);
3484 if (e1.X_op != O_constant)
3485 as_bad ("First operand to .save.g must be a constant.");
3488 int grmask = e1.X_add_number;
3490 add_unwind_entry (output_gr_mem (grmask));
3493 int reg = e2.X_add_number - REG_GR;
3494 if (e2.X_op == O_register && reg >= 0 && reg < 128)
3495 add_unwind_entry (output_gr_gr (grmask, reg));
3497 as_bad ("Second operand is an invalid register.");
3504 int dummy ATTRIBUTE_UNUSED;
3508 sep = parse_operand (&e1);
3510 if (e1.X_op != O_constant)
3511 as_bad ("Operand to .save.f must be a constant.");
3513 add_unwind_entry (output_fr_mem (e1.X_add_number));
3518 int dummy ATTRIBUTE_UNUSED;
3525 sep = parse_operand (&e1);
3526 if (e1.X_op != O_constant)
3528 as_bad ("First operand to .save.b must be a constant.");
3531 brmask = e1.X_add_number;
3535 sep = parse_operand (&e2);
3536 reg = e2.X_add_number - REG_GR;
3537 if (e2.X_op != O_register || reg > 127)
3539 as_bad ("Second operand to .save.b must be a general register.");
3542 add_unwind_entry (output_br_gr (brmask, e2.X_add_number));
3545 add_unwind_entry (output_br_mem (brmask));
3547 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3548 ignore_rest_of_line ();
3553 int dummy ATTRIBUTE_UNUSED;
3557 sep = parse_operand (&e1);
3559 parse_operand (&e2);
3561 if (e1.X_op != O_constant || sep != ',' || e2.X_op != O_constant)
3562 as_bad ("Both operands of .save.gf must be constants.");
3565 int grmask = e1.X_add_number;
3566 int frmask = e2.X_add_number;
3567 add_unwind_entry (output_frgr_mem (grmask, frmask));
3573 int dummy ATTRIBUTE_UNUSED;
3578 sep = parse_operand (&e);
3579 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3580 ignore_rest_of_line ();
3582 if (e.X_op != O_constant)
3583 as_bad ("Operand to .spill must be a constant");
3585 add_unwind_entry (output_spill_base (e.X_add_number));
3589 dot_spillreg (dummy)
3590 int dummy ATTRIBUTE_UNUSED;
3592 int sep, ab, xy, reg, treg;
3595 sep = parse_operand (&e1);
3598 as_bad ("No second operand to .spillreg");
3602 parse_operand (&e2);
3604 if (!convert_expr_to_ab_reg (&e1, &ab, ®))
3606 as_bad ("First operand to .spillreg must be a preserved register");
3610 if (!convert_expr_to_xy_reg (&e2, &xy, &treg))
3612 as_bad ("Second operand to .spillreg must be a register");
3616 add_unwind_entry (output_spill_reg (ab, reg, treg, xy));
3620 dot_spillmem (psprel)
3626 sep = parse_operand (&e1);
3629 as_bad ("Second operand missing");
3633 parse_operand (&e2);
3635 if (!convert_expr_to_ab_reg (&e1, &ab, ®))
3637 as_bad ("First operand to .spill%s must be a preserved register",
3638 psprel ? "psp" : "sp");
3642 if (e2.X_op != O_constant)
3644 as_bad ("Second operand to .spill%s must be a constant",
3645 psprel ? "psp" : "sp");
3650 add_unwind_entry (output_spill_psprel (ab, reg, e2.X_add_number));
3652 add_unwind_entry (output_spill_sprel (ab, reg, e2.X_add_number));
3656 dot_spillreg_p (dummy)
3657 int dummy ATTRIBUTE_UNUSED;
3659 int sep, ab, xy, reg, treg;
3660 expressionS e1, e2, e3;
3663 sep = parse_operand (&e1);
3666 as_bad ("No second and third operand to .spillreg.p");
3670 sep = parse_operand (&e2);
3673 as_bad ("No third operand to .spillreg.p");
3677 parse_operand (&e3);
3679 qp = e1.X_add_number - REG_P;
3681 if (e1.X_op != O_register || qp > 63)
3683 as_bad ("First operand to .spillreg.p must be a predicate");
3687 if (!convert_expr_to_ab_reg (&e2, &ab, ®))
3689 as_bad ("Second operand to .spillreg.p must be a preserved register");
3693 if (!convert_expr_to_xy_reg (&e3, &xy, &treg))
3695 as_bad ("Third operand to .spillreg.p must be a register");
3699 add_unwind_entry (output_spill_reg_p (ab, reg, treg, xy, qp));
3703 dot_spillmem_p (psprel)
3706 expressionS e1, e2, e3;
3710 sep = parse_operand (&e1);
3713 as_bad ("Second operand missing");
3717 parse_operand (&e2);
3720 as_bad ("Second operand missing");
3724 parse_operand (&e3);
3726 qp = e1.X_add_number - REG_P;
3727 if (e1.X_op != O_register || qp > 63)
3729 as_bad ("First operand to .spill%s_p must be a predicate",
3730 psprel ? "psp" : "sp");
3734 if (!convert_expr_to_ab_reg (&e2, &ab, ®))
3736 as_bad ("Second operand to .spill%s_p must be a preserved register",
3737 psprel ? "psp" : "sp");
3741 if (e3.X_op != O_constant)
3743 as_bad ("Third operand to .spill%s_p must be a constant",
3744 psprel ? "psp" : "sp");
3749 add_unwind_entry (output_spill_psprel_p (ab, reg, e3.X_add_number, qp));
3751 add_unwind_entry (output_spill_sprel_p (ab, reg, e3.X_add_number, qp));
3755 get_saved_prologue_count (lbl)
3758 label_prologue_count *lpc = unwind.saved_prologue_counts;
3760 while (lpc != NULL && lpc->label_number != lbl)
3764 return lpc->prologue_count;
3766 as_bad ("Missing .label_state %ld", lbl);
3771 save_prologue_count (lbl, count)
3775 label_prologue_count *lpc = unwind.saved_prologue_counts;
3777 while (lpc != NULL && lpc->label_number != lbl)
3781 lpc->prologue_count = count;
3784 label_prologue_count *new_lpc = xmalloc (sizeof (* new_lpc));
3786 new_lpc->next = unwind.saved_prologue_counts;
3787 new_lpc->label_number = lbl;
3788 new_lpc->prologue_count = count;
3789 unwind.saved_prologue_counts = new_lpc;
3794 free_saved_prologue_counts ()
3796 label_prologue_count *lpc = unwind.saved_prologue_counts;
3797 label_prologue_count *next;
3806 unwind.saved_prologue_counts = NULL;
3810 dot_label_state (dummy)
3811 int dummy ATTRIBUTE_UNUSED;
3816 if (e.X_op != O_constant)
3818 as_bad ("Operand to .label_state must be a constant");
3821 add_unwind_entry (output_label_state (e.X_add_number));
3822 save_prologue_count (e.X_add_number, unwind.prologue_count);
3826 dot_copy_state (dummy)
3827 int dummy ATTRIBUTE_UNUSED;
3832 if (e.X_op != O_constant)
3834 as_bad ("Operand to .copy_state must be a constant");
3837 add_unwind_entry (output_copy_state (e.X_add_number));
3838 unwind.prologue_count = get_saved_prologue_count (e.X_add_number);
3843 int dummy ATTRIBUTE_UNUSED;
3848 sep = parse_operand (&e1);
3851 as_bad ("Second operand to .unwabi missing");
3854 sep = parse_operand (&e2);
3855 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3856 ignore_rest_of_line ();
3858 if (e1.X_op != O_constant)
3860 as_bad ("First operand to .unwabi must be a constant");
3864 if (e2.X_op != O_constant)
3866 as_bad ("Second operand to .unwabi must be a constant");
3870 add_unwind_entry (output_unwabi (e1.X_add_number, e2.X_add_number));
3874 dot_personality (dummy)
3875 int dummy ATTRIBUTE_UNUSED;
3879 name = input_line_pointer;
3880 c = get_symbol_end ();
3881 p = input_line_pointer;
3882 unwind.personality_routine = symbol_find_or_make (name);
3883 unwind.force_unwind_entry = 1;
3886 demand_empty_rest_of_line ();
3891 int dummy ATTRIBUTE_UNUSED;
3896 unwind.proc_start = expr_build_dot ();
3897 /* Parse names of main and alternate entry points and mark them as
3898 function symbols: */
3902 name = input_line_pointer;
3903 c = get_symbol_end ();
3904 p = input_line_pointer;
3905 sym = symbol_find_or_make (name);
3906 if (unwind.proc_start == 0)
3908 unwind.proc_start = sym;
3910 symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
3913 if (*input_line_pointer != ',')
3915 ++input_line_pointer;
3917 demand_empty_rest_of_line ();
3920 unwind.prologue_count = 0;
3921 unwind.list = unwind.tail = unwind.current_entry = NULL;
3922 unwind.personality_routine = 0;
3927 int dummy ATTRIBUTE_UNUSED;
3929 unwind.prologue = 0;
3930 unwind.prologue_mask = 0;
3932 add_unwind_entry (output_body ());
3933 demand_empty_rest_of_line ();
3937 dot_prologue (dummy)
3938 int dummy ATTRIBUTE_UNUSED;
3941 int mask = 0, grsave = 0;
3943 if (!is_it_end_of_statement ())
3946 sep = parse_operand (&e1);
3948 as_bad ("No second operand to .prologue");
3949 sep = parse_operand (&e2);
3950 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3951 ignore_rest_of_line ();
3953 if (e1.X_op == O_constant)
3955 mask = e1.X_add_number;
3957 if (e2.X_op == O_constant)
3958 grsave = e2.X_add_number;
3959 else if (e2.X_op == O_register
3960 && (grsave = e2.X_add_number - REG_GR) < 128)
3963 as_bad ("Second operand not a constant or general register");
3965 add_unwind_entry (output_prologue_gr (mask, grsave));
3968 as_bad ("First operand not a constant");
3971 add_unwind_entry (output_prologue ());
3973 unwind.prologue = 1;
3974 unwind.prologue_mask = mask;
3975 ++unwind.prologue_count;
3980 int dummy ATTRIBUTE_UNUSED;
3984 int bytes_per_address;
3987 subsegT saved_subseg;
3988 const char *sec_name, *text_name;
3992 if (unwind.saved_text_seg)
3994 saved_seg = unwind.saved_text_seg;
3995 saved_subseg = unwind.saved_text_subseg;
3996 unwind.saved_text_seg = NULL;
4000 saved_seg = now_seg;
4001 saved_subseg = now_subseg;
4005 Use a slightly ugly scheme to derive the unwind section names from
4006 the text section name:
4008 text sect. unwind table sect.
4009 name: name: comments:
4010 ---------- ----------------- --------------------------------
4012 .text.foo .IA_64.unwind.text.foo
4013 .foo .IA_64.unwind.foo
4015 .gnu.linkonce.ia64unw.foo
4016 _info .IA_64.unwind_info gas issues error message (ditto)
4017 _infoFOO .IA_64.unwind_infoFOO gas issues error message (ditto)
4019 This mapping is done so that:
4021 (a) An object file with unwind info only in .text will use
4022 unwind section names .IA_64.unwind and .IA_64.unwind_info.
4023 This follows the letter of the ABI and also ensures backwards
4024 compatibility with older toolchains.
4026 (b) An object file with unwind info in multiple text sections
4027 will use separate unwind sections for each text section.
4028 This allows us to properly set the "sh_info" and "sh_link"
4029 fields in SHT_IA_64_UNWIND as required by the ABI and also
4030 lets GNU ld support programs with multiple segments
4031 containing unwind info (as might be the case for certain
4032 embedded applications).
4034 (c) An error is issued if there would be a name clash.
4036 text_name = segment_name (saved_seg);
4037 if (strncmp (text_name, "_info", 5) == 0)
4039 as_bad ("Illegal section name `%s' (causes unwind section name clash)",
4041 ignore_rest_of_line ();
4044 if (strcmp (text_name, ".text") == 0)
4047 insn_group_break (1, 0, 0);
4049 add_unwind_entry (output_endp ());
4051 /* If there wasn't a .handlerdata, we haven't generated an image yet. */
4053 generate_unwind_image (text_name);
4055 if (unwind.info || unwind.force_unwind_entry)
4057 subseg_set (md.last_text_seg, 0);
4058 unwind.proc_end = expr_build_dot ();
4060 make_unw_section_name (SPECIAL_SECTION_UNWIND, text_name, sec_name);
4061 set_section ((char *) sec_name);
4062 bfd_set_section_flags (stdoutput, now_seg,
4063 SEC_LOAD | SEC_ALLOC | SEC_READONLY);
4065 /* Make sure that section has 4 byte alignment for ILP32 and
4066 8 byte alignment for LP64. */
4067 record_alignment (now_seg, md.pointer_size_shift);
4069 /* Need space for 3 pointers for procedure start, procedure end,
4071 ptr = frag_more (3 * md.pointer_size);
4072 where = frag_now_fix () - (3 * md.pointer_size);
4073 bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
4075 /* Issue the values of a) Proc Begin, b) Proc End, c) Unwind Record. */
4076 e.X_op = O_pseudo_fixup;
4077 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4079 e.X_add_symbol = unwind.proc_start;
4080 ia64_cons_fix_new (frag_now, where, bytes_per_address, &e);
4082 e.X_op = O_pseudo_fixup;
4083 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4085 e.X_add_symbol = unwind.proc_end;
4086 ia64_cons_fix_new (frag_now, where + bytes_per_address,
4087 bytes_per_address, &e);
4091 e.X_op = O_pseudo_fixup;
4092 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4094 e.X_add_symbol = unwind.info;
4095 ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2),
4096 bytes_per_address, &e);
4099 md_number_to_chars (ptr + (bytes_per_address * 2), 0,
4103 subseg_set (saved_seg, saved_subseg);
4105 /* Parse names of main and alternate entry points and set symbol sizes. */
4109 name = input_line_pointer;
4110 c = get_symbol_end ();
4111 p = input_line_pointer;
4112 sym = symbol_find (name);
4113 if (sym && unwind.proc_start
4114 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION)
4115 && S_GET_SIZE (sym) == 0 && symbol_get_obj (sym)->size == NULL)
4117 fragS *fr = symbol_get_frag (unwind.proc_start);
4118 fragS *frag = symbol_get_frag (sym);
4120 /* Check whether the function label is at or beyond last
4122 while (fr && fr != frag)
4126 if (frag == frag_now && SEG_NORMAL (now_seg))
4127 S_SET_SIZE (sym, frag_now_fix () - S_GET_VALUE (sym));
4130 symbol_get_obj (sym)->size =
4131 (expressionS *) xmalloc (sizeof (expressionS));
4132 symbol_get_obj (sym)->size->X_op = O_subtract;
4133 symbol_get_obj (sym)->size->X_add_symbol
4134 = symbol_new (FAKE_LABEL_NAME, now_seg,
4135 frag_now_fix (), frag_now);
4136 symbol_get_obj (sym)->size->X_op_symbol = sym;
4137 symbol_get_obj (sym)->size->X_add_number = 0;
4143 if (*input_line_pointer != ',')
4145 ++input_line_pointer;
4147 demand_empty_rest_of_line ();
4148 unwind.proc_start = unwind.proc_end = unwind.info = 0;
4152 dot_template (template)
4155 CURR_SLOT.user_template = template;
4160 int dummy ATTRIBUTE_UNUSED;
4162 int ins, locs, outs, rots;
4164 if (is_it_end_of_statement ())
4165 ins = locs = outs = rots = 0;
4168 ins = get_absolute_expression ();
4169 if (*input_line_pointer++ != ',')
4171 locs = get_absolute_expression ();
4172 if (*input_line_pointer++ != ',')
4174 outs = get_absolute_expression ();
4175 if (*input_line_pointer++ != ',')
4177 rots = get_absolute_expression ();
4179 set_regstack (ins, locs, outs, rots);
4183 as_bad ("Comma expected");
4184 ignore_rest_of_line ();
4191 unsigned num_regs, num_alloced = 0;
4192 struct dynreg **drpp, *dr;
4193 int ch, base_reg = 0;
4199 case DYNREG_GR: base_reg = REG_GR + 32; break;
4200 case DYNREG_FR: base_reg = REG_FR + 32; break;
4201 case DYNREG_PR: base_reg = REG_P + 16; break;
4205 /* First, remove existing names from hash table. */
4206 for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
4208 hash_delete (md.dynreg_hash, dr->name);
4212 drpp = &md.dynreg[type];
4215 start = input_line_pointer;
4216 ch = get_symbol_end ();
4217 *input_line_pointer = ch;
4218 len = (input_line_pointer - start);
4221 if (*input_line_pointer != '[')
4223 as_bad ("Expected '['");
4226 ++input_line_pointer; /* skip '[' */
4228 num_regs = get_absolute_expression ();
4230 if (*input_line_pointer++ != ']')
4232 as_bad ("Expected ']'");
4237 num_alloced += num_regs;
4241 if (num_alloced > md.rot.num_regs)
4243 as_bad ("Used more than the declared %d rotating registers",
4249 if (num_alloced > 96)
4251 as_bad ("Used more than the available 96 rotating registers");
4256 if (num_alloced > 48)
4258 as_bad ("Used more than the available 48 rotating registers");
4267 name = obstack_alloc (¬es, len + 1);
4268 memcpy (name, start, len);
4273 *drpp = obstack_alloc (¬es, sizeof (*dr));
4274 memset (*drpp, 0, sizeof (*dr));
4279 dr->num_regs = num_regs;
4280 dr->base = base_reg;
4282 base_reg += num_regs;
4284 if (hash_insert (md.dynreg_hash, name, dr))
4286 as_bad ("Attempt to redefine register set `%s'", name);
4290 if (*input_line_pointer != ',')
4292 ++input_line_pointer; /* skip comma */
4295 demand_empty_rest_of_line ();
4299 ignore_rest_of_line ();
4303 dot_byteorder (byteorder)
4306 segment_info_type *seginfo = seg_info (now_seg);
4308 if (byteorder == -1)
4310 if (seginfo->tc_segment_info_data.endian == 0)
4311 seginfo->tc_segment_info_data.endian
4312 = TARGET_BYTES_BIG_ENDIAN ? 1 : 2;
4313 byteorder = seginfo->tc_segment_info_data.endian == 1;
4316 seginfo->tc_segment_info_data.endian = byteorder ? 1 : 2;
4318 if (target_big_endian != byteorder)
4320 target_big_endian = byteorder;
4321 if (target_big_endian)
4323 ia64_number_to_chars = number_to_chars_bigendian;
4324 ia64_float_to_chars = ia64_float_to_chars_bigendian;
4328 ia64_number_to_chars = number_to_chars_littleendian;
4329 ia64_float_to_chars = ia64_float_to_chars_littleendian;
4336 int dummy ATTRIBUTE_UNUSED;
4343 option = input_line_pointer;
4344 ch = get_symbol_end ();
4345 if (strcmp (option, "lsb") == 0)
4346 md.flags &= ~EF_IA_64_BE;
4347 else if (strcmp (option, "msb") == 0)
4348 md.flags |= EF_IA_64_BE;
4349 else if (strcmp (option, "abi32") == 0)
4350 md.flags &= ~EF_IA_64_ABI64;
4351 else if (strcmp (option, "abi64") == 0)
4352 md.flags |= EF_IA_64_ABI64;
4354 as_bad ("Unknown psr option `%s'", option);
4355 *input_line_pointer = ch;
4358 if (*input_line_pointer != ',')
4361 ++input_line_pointer;
4364 demand_empty_rest_of_line ();
4369 int dummy ATTRIBUTE_UNUSED;
4371 new_logical_line (0, get_absolute_expression ());
4372 demand_empty_rest_of_line ();
4376 parse_section_name ()
4382 if (*input_line_pointer != '"')
4384 as_bad ("Missing section name");
4385 ignore_rest_of_line ();
4388 name = demand_copy_C_string (&len);
4391 ignore_rest_of_line ();
4395 if (*input_line_pointer != ',')
4397 as_bad ("Comma expected after section name");
4398 ignore_rest_of_line ();
4401 ++input_line_pointer; /* skip comma */
4409 char *name = parse_section_name ();
4413 md.keep_pending_output = 1;
4416 obj_elf_previous (0);
4417 md.keep_pending_output = 0;
4420 /* Why doesn't float_cons() call md_cons_align() the way cons() does? */
4423 stmt_float_cons (kind)
4444 ia64_do_align (alignment);
4452 int saved_auto_align = md.auto_align;
4456 md.auto_align = saved_auto_align;
4460 dot_xfloat_cons (kind)
4463 char *name = parse_section_name ();
4467 md.keep_pending_output = 1;
4469 stmt_float_cons (kind);
4470 obj_elf_previous (0);
4471 md.keep_pending_output = 0;
4475 dot_xstringer (zero)
4478 char *name = parse_section_name ();
4482 md.keep_pending_output = 1;
4485 obj_elf_previous (0);
4486 md.keep_pending_output = 0;
4493 int saved_auto_align = md.auto_align;
4494 char *name = parse_section_name ();
4498 md.keep_pending_output = 1;
4502 md.auto_align = saved_auto_align;
4503 obj_elf_previous (0);
4504 md.keep_pending_output = 0;
4508 dot_xfloat_cons_ua (kind)
4511 int saved_auto_align = md.auto_align;
4512 char *name = parse_section_name ();
4516 md.keep_pending_output = 1;
4519 stmt_float_cons (kind);
4520 md.auto_align = saved_auto_align;
4521 obj_elf_previous (0);
4522 md.keep_pending_output = 0;
4525 /* .reg.val <regname>,value */
4529 int dummy ATTRIBUTE_UNUSED;
4534 if (reg.X_op != O_register)
4536 as_bad (_("Register name expected"));
4537 ignore_rest_of_line ();
4539 else if (*input_line_pointer++ != ',')
4541 as_bad (_("Comma expected"));
4542 ignore_rest_of_line ();
4546 valueT value = get_absolute_expression ();
4547 int regno = reg.X_add_number;
4548 if (regno < REG_GR || regno > REG_GR + 128)
4549 as_warn (_("Register value annotation ignored"));
4552 gr_values[regno - REG_GR].known = 1;
4553 gr_values[regno - REG_GR].value = value;
4554 gr_values[regno - REG_GR].path = md.path;
4557 demand_empty_rest_of_line ();
4560 /* select dv checking mode
4565 A stop is inserted when changing modes
4572 if (md.manual_bundling)
4573 as_warn (_("Directive invalid within a bundle"));
4575 if (type == 'E' || type == 'A')
4576 md.mode_explicitly_set = 0;
4578 md.mode_explicitly_set = 1;
4585 if (md.explicit_mode)
4586 insn_group_break (1, 0, 0);
4587 md.explicit_mode = 0;
4591 if (!md.explicit_mode)
4592 insn_group_break (1, 0, 0);
4593 md.explicit_mode = 1;
4597 if (md.explicit_mode != md.default_explicit_mode)
4598 insn_group_break (1, 0, 0);
4599 md.explicit_mode = md.default_explicit_mode;
4600 md.mode_explicitly_set = 0;
4611 for (regno = 0; regno < 64; regno++)
4613 if (mask & ((valueT) 1 << regno))
4615 fprintf (stderr, "%s p%d", comma, regno);
4622 .pred.rel.clear [p1 [,p2 [,...]]] (also .pred.rel "clear")
4623 .pred.rel.imply p1, p2 (also .pred.rel "imply")
4624 .pred.rel.mutex p1, p2 [,...] (also .pred.rel "mutex")
4625 .pred.safe_across_calls p1 [, p2 [,...]]
4634 int p1 = -1, p2 = -1;
4638 if (*input_line_pointer != '"')
4640 as_bad (_("Missing predicate relation type"));
4641 ignore_rest_of_line ();
4647 char *form = demand_copy_C_string (&len);
4648 if (strcmp (form, "mutex") == 0)
4650 else if (strcmp (form, "clear") == 0)
4652 else if (strcmp (form, "imply") == 0)
4656 as_bad (_("Unrecognized predicate relation type"));
4657 ignore_rest_of_line ();
4661 if (*input_line_pointer == ',')
4662 ++input_line_pointer;
4672 if (TOUPPER (*input_line_pointer) != 'P'
4673 || (regno = atoi (++input_line_pointer)) < 0
4676 as_bad (_("Predicate register expected"));
4677 ignore_rest_of_line ();
4680 while (ISDIGIT (*input_line_pointer))
4681 ++input_line_pointer;
4688 as_warn (_("Duplicate predicate register ignored"));
4691 /* See if it's a range. */
4692 if (*input_line_pointer == '-')
4695 ++input_line_pointer;
4697 if (TOUPPER (*input_line_pointer) != 'P'
4698 || (regno = atoi (++input_line_pointer)) < 0
4701 as_bad (_("Predicate register expected"));
4702 ignore_rest_of_line ();
4705 while (ISDIGIT (*input_line_pointer))
4706 ++input_line_pointer;
4710 as_bad (_("Bad register range"));
4711 ignore_rest_of_line ();
4722 if (*input_line_pointer != ',')
4724 ++input_line_pointer;
4733 clear_qp_mutex (mask);
4734 clear_qp_implies (mask, (valueT) 0);
4737 if (count != 2 || p1 == -1 || p2 == -1)
4738 as_bad (_("Predicate source and target required"));
4739 else if (p1 == 0 || p2 == 0)
4740 as_bad (_("Use of p0 is not valid in this context"));
4742 add_qp_imply (p1, p2);
4747 as_bad (_("At least two PR arguments expected"));
4752 as_bad (_("Use of p0 is not valid in this context"));
4755 add_qp_mutex (mask);
4758 /* note that we don't override any existing relations */
4761 as_bad (_("At least one PR argument expected"));
4766 fprintf (stderr, "Safe across calls: ");
4767 print_prmask (mask);
4768 fprintf (stderr, "\n");
4770 qp_safe_across_calls = mask;
4773 demand_empty_rest_of_line ();
4776 /* .entry label [, label [, ...]]
4777 Hint to DV code that the given labels are to be considered entry points.
4778 Otherwise, only global labels are considered entry points. */
4782 int dummy ATTRIBUTE_UNUSED;
4791 name = input_line_pointer;
4792 c = get_symbol_end ();
4793 symbolP = symbol_find_or_make (name);
4795 err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (PTR) symbolP);
4797 as_fatal (_("Inserting \"%s\" into entry hint table failed: %s"),
4800 *input_line_pointer = c;
4802 c = *input_line_pointer;
4805 input_line_pointer++;
4807 if (*input_line_pointer == '\n')
4813 demand_empty_rest_of_line ();
4816 /* .mem.offset offset, base
4817 "base" is used to distinguish between offsets from a different base. */
4820 dot_mem_offset (dummy)
4821 int dummy ATTRIBUTE_UNUSED;
4823 md.mem_offset.hint = 1;
4824 md.mem_offset.offset = get_absolute_expression ();
4825 if (*input_line_pointer != ',')
4827 as_bad (_("Comma expected"));
4828 ignore_rest_of_line ();
4831 ++input_line_pointer;
4832 md.mem_offset.base = get_absolute_expression ();
4833 demand_empty_rest_of_line ();
4836 /* ia64-specific pseudo-ops: */
4837 const pseudo_typeS md_pseudo_table[] =
4839 { "radix", dot_radix, 0 },
4840 { "lcomm", s_lcomm_bytes, 1 },
4841 { "bss", dot_special_section, SPECIAL_SECTION_BSS },
4842 { "sbss", dot_special_section, SPECIAL_SECTION_SBSS },
4843 { "sdata", dot_special_section, SPECIAL_SECTION_SDATA },
4844 { "rodata", dot_special_section, SPECIAL_SECTION_RODATA },
4845 { "comment", dot_special_section, SPECIAL_SECTION_COMMENT },
4846 { "ia_64.unwind", dot_special_section, SPECIAL_SECTION_UNWIND },
4847 { "ia_64.unwind_info", dot_special_section, SPECIAL_SECTION_UNWIND_INFO },
4848 { "init_array", dot_special_section, SPECIAL_SECTION_INIT_ARRAY },
4849 { "fini_array", dot_special_section, SPECIAL_SECTION_FINI_ARRAY },
4850 { "proc", dot_proc, 0 },
4851 { "body", dot_body, 0 },
4852 { "prologue", dot_prologue, 0 },
4853 { "endp", dot_endp, 0 },
4855 { "fframe", dot_fframe, 0 },
4856 { "vframe", dot_vframe, 0 },
4857 { "vframesp", dot_vframesp, 0 },
4858 { "vframepsp", dot_vframepsp, 0 },
4859 { "save", dot_save, 0 },
4860 { "restore", dot_restore, 0 },
4861 { "restorereg", dot_restorereg, 0 },
4862 { "restorereg.p", dot_restorereg_p, 0 },
4863 { "handlerdata", dot_handlerdata, 0 },
4864 { "unwentry", dot_unwentry, 0 },
4865 { "altrp", dot_altrp, 0 },
4866 { "savesp", dot_savemem, 0 },
4867 { "savepsp", dot_savemem, 1 },
4868 { "save.g", dot_saveg, 0 },
4869 { "save.f", dot_savef, 0 },
4870 { "save.b", dot_saveb, 0 },
4871 { "save.gf", dot_savegf, 0 },
4872 { "spill", dot_spill, 0 },
4873 { "spillreg", dot_spillreg, 0 },
4874 { "spillsp", dot_spillmem, 0 },
4875 { "spillpsp", dot_spillmem, 1 },
4876 { "spillreg.p", dot_spillreg_p, 0 },
4877 { "spillsp.p", dot_spillmem_p, 0 },
4878 { "spillpsp.p", dot_spillmem_p, 1 },
4879 { "label_state", dot_label_state, 0 },
4880 { "copy_state", dot_copy_state, 0 },
4881 { "unwabi", dot_unwabi, 0 },
4882 { "personality", dot_personality, 0 },
4884 { "estate", dot_estate, 0 },
4886 { "mii", dot_template, 0x0 },
4887 { "mli", dot_template, 0x2 }, /* old format, for compatibility */
4888 { "mlx", dot_template, 0x2 },
4889 { "mmi", dot_template, 0x4 },
4890 { "mfi", dot_template, 0x6 },
4891 { "mmf", dot_template, 0x7 },
4892 { "mib", dot_template, 0x8 },
4893 { "mbb", dot_template, 0x9 },
4894 { "bbb", dot_template, 0xb },
4895 { "mmb", dot_template, 0xc },
4896 { "mfb", dot_template, 0xe },
4898 { "lb", dot_scope, 0 },
4899 { "le", dot_scope, 1 },
4901 { "align", s_align_bytes, 0 },
4902 { "regstk", dot_regstk, 0 },
4903 { "rotr", dot_rot, DYNREG_GR },
4904 { "rotf", dot_rot, DYNREG_FR },
4905 { "rotp", dot_rot, DYNREG_PR },
4906 { "lsb", dot_byteorder, 0 },
4907 { "msb", dot_byteorder, 1 },
4908 { "psr", dot_psr, 0 },
4909 { "alias", dot_alias, 0 },
4910 { "secalias", dot_alias, 1 },
4911 { "ln", dot_ln, 0 }, /* source line info (for debugging) */
4913 { "xdata1", dot_xdata, 1 },
4914 { "xdata2", dot_xdata, 2 },
4915 { "xdata4", dot_xdata, 4 },
4916 { "xdata8", dot_xdata, 8 },
4917 { "xreal4", dot_xfloat_cons, 'f' },
4918 { "xreal8", dot_xfloat_cons, 'd' },
4919 { "xreal10", dot_xfloat_cons, 'x' },
4920 { "xreal16", dot_xfloat_cons, 'X' },
4921 { "xstring", dot_xstringer, 0 },
4922 { "xstringz", dot_xstringer, 1 },
4924 /* unaligned versions: */
4925 { "xdata2.ua", dot_xdata_ua, 2 },
4926 { "xdata4.ua", dot_xdata_ua, 4 },
4927 { "xdata8.ua", dot_xdata_ua, 8 },
4928 { "xreal4.ua", dot_xfloat_cons_ua, 'f' },
4929 { "xreal8.ua", dot_xfloat_cons_ua, 'd' },
4930 { "xreal10.ua", dot_xfloat_cons_ua, 'x' },
4931 { "xreal16.ua", dot_xfloat_cons_ua, 'X' },
4933 /* annotations/DV checking support */
4934 { "entry", dot_entry, 0 },
4935 { "mem.offset", dot_mem_offset, 0 },
4936 { "pred.rel", dot_pred_rel, 0 },
4937 { "pred.rel.clear", dot_pred_rel, 'c' },
4938 { "pred.rel.imply", dot_pred_rel, 'i' },
4939 { "pred.rel.mutex", dot_pred_rel, 'm' },
4940 { "pred.safe_across_calls", dot_pred_rel, 's' },
4941 { "reg.val", dot_reg_val, 0 },
4942 { "auto", dot_dv_mode, 'a' },
4943 { "explicit", dot_dv_mode, 'e' },
4944 { "default", dot_dv_mode, 'd' },
4946 /* ??? These are needed to make gas/testsuite/gas/elf/ehopt.s work.
4947 IA-64 aligns data allocation pseudo-ops by default, so we have to
4948 tell it that these ones are supposed to be unaligned. Long term,
4949 should rewrite so that only IA-64 specific data allocation pseudo-ops
4950 are aligned by default. */
4951 {"2byte", stmt_cons_ua, 2},
4952 {"4byte", stmt_cons_ua, 4},
4953 {"8byte", stmt_cons_ua, 8},
4958 static const struct pseudo_opcode
4961 void (*handler) (int);
4966 /* these are more like pseudo-ops, but don't start with a dot */
4967 { "data1", cons, 1 },
4968 { "data2", cons, 2 },
4969 { "data4", cons, 4 },
4970 { "data8", cons, 8 },
4971 { "data16", cons, 16 },
4972 { "real4", stmt_float_cons, 'f' },
4973 { "real8", stmt_float_cons, 'd' },
4974 { "real10", stmt_float_cons, 'x' },
4975 { "real16", stmt_float_cons, 'X' },
4976 { "string", stringer, 0 },
4977 { "stringz", stringer, 1 },
4979 /* unaligned versions: */
4980 { "data2.ua", stmt_cons_ua, 2 },
4981 { "data4.ua", stmt_cons_ua, 4 },
4982 { "data8.ua", stmt_cons_ua, 8 },
4983 { "data16.ua", stmt_cons_ua, 16 },
4984 { "real4.ua", float_cons, 'f' },
4985 { "real8.ua", float_cons, 'd' },
4986 { "real10.ua", float_cons, 'x' },
4987 { "real16.ua", float_cons, 'X' },
4990 /* Declare a register by creating a symbol for it and entering it in
4991 the symbol table. */
4994 declare_register (name, regnum)
5001 sym = symbol_new (name, reg_section, regnum, &zero_address_frag);
5003 err = hash_insert (md.reg_hash, S_GET_NAME (sym), (PTR) sym);
5005 as_fatal ("Inserting \"%s\" into register table failed: %s",
5012 declare_register_set (prefix, num_regs, base_regnum)
5020 for (i = 0; i < num_regs; ++i)
5022 sprintf (name, "%s%u", prefix, i);
5023 declare_register (name, base_regnum + i);
5028 operand_width (opnd)
5029 enum ia64_opnd opnd;
5031 const struct ia64_operand *odesc = &elf64_ia64_operands[opnd];
5032 unsigned int bits = 0;
5036 for (i = 0; i < NELEMS (odesc->field) && odesc->field[i].bits; ++i)
5037 bits += odesc->field[i].bits;
5042 static enum operand_match_result
5043 operand_match (idesc, index, e)
5044 const struct ia64_opcode *idesc;
5048 enum ia64_opnd opnd = idesc->operands[index];
5049 int bits, relocatable = 0;
5050 struct insn_fix *fix;
5057 case IA64_OPND_AR_CCV:
5058 if (e->X_op == O_register && e->X_add_number == REG_AR + 32)
5059 return OPERAND_MATCH;
5062 case IA64_OPND_AR_CSD:
5063 if (e->X_op == O_register && e->X_add_number == REG_AR + 25)
5064 return OPERAND_MATCH;
5067 case IA64_OPND_AR_PFS:
5068 if (e->X_op == O_register && e->X_add_number == REG_AR + 64)
5069 return OPERAND_MATCH;
5073 if (e->X_op == O_register && e->X_add_number == REG_GR + 0)
5074 return OPERAND_MATCH;
5078 if (e->X_op == O_register && e->X_add_number == REG_IP)
5079 return OPERAND_MATCH;
5083 if (e->X_op == O_register && e->X_add_number == REG_PR)
5084 return OPERAND_MATCH;
5087 case IA64_OPND_PR_ROT:
5088 if (e->X_op == O_register && e->X_add_number == REG_PR_ROT)
5089 return OPERAND_MATCH;
5093 if (e->X_op == O_register && e->X_add_number == REG_PSR)
5094 return OPERAND_MATCH;
5097 case IA64_OPND_PSR_L:
5098 if (e->X_op == O_register && e->X_add_number == REG_PSR_L)
5099 return OPERAND_MATCH;
5102 case IA64_OPND_PSR_UM:
5103 if (e->X_op == O_register && e->X_add_number == REG_PSR_UM)
5104 return OPERAND_MATCH;
5108 if (e->X_op == O_constant)
5110 if (e->X_add_number == 1)
5111 return OPERAND_MATCH;
5113 return OPERAND_OUT_OF_RANGE;
5118 if (e->X_op == O_constant)
5120 if (e->X_add_number == 8)
5121 return OPERAND_MATCH;
5123 return OPERAND_OUT_OF_RANGE;
5128 if (e->X_op == O_constant)
5130 if (e->X_add_number == 16)
5131 return OPERAND_MATCH;
5133 return OPERAND_OUT_OF_RANGE;
5137 /* register operands: */
5140 if (e->X_op == O_register && e->X_add_number >= REG_AR
5141 && e->X_add_number < REG_AR + 128)
5142 return OPERAND_MATCH;
5147 if (e->X_op == O_register && e->X_add_number >= REG_BR
5148 && e->X_add_number < REG_BR + 8)
5149 return OPERAND_MATCH;
5153 if (e->X_op == O_register && e->X_add_number >= REG_CR
5154 && e->X_add_number < REG_CR + 128)
5155 return OPERAND_MATCH;
5162 if (e->X_op == O_register && e->X_add_number >= REG_FR
5163 && e->X_add_number < REG_FR + 128)
5164 return OPERAND_MATCH;
5169 if (e->X_op == O_register && e->X_add_number >= REG_P
5170 && e->X_add_number < REG_P + 64)
5171 return OPERAND_MATCH;
5177 if (e->X_op == O_register && e->X_add_number >= REG_GR
5178 && e->X_add_number < REG_GR + 128)
5179 return OPERAND_MATCH;
5182 case IA64_OPND_R3_2:
5183 if (e->X_op == O_register && e->X_add_number >= REG_GR)
5185 if (e->X_add_number < REG_GR + 4)
5186 return OPERAND_MATCH;
5187 else if (e->X_add_number < REG_GR + 128)
5188 return OPERAND_OUT_OF_RANGE;
5192 /* indirect operands: */
5193 case IA64_OPND_CPUID_R3:
5194 case IA64_OPND_DBR_R3:
5195 case IA64_OPND_DTR_R3:
5196 case IA64_OPND_ITR_R3:
5197 case IA64_OPND_IBR_R3:
5198 case IA64_OPND_MSR_R3:
5199 case IA64_OPND_PKR_R3:
5200 case IA64_OPND_PMC_R3:
5201 case IA64_OPND_PMD_R3:
5202 case IA64_OPND_RR_R3:
5203 if (e->X_op == O_index && e->X_op_symbol
5204 && (S_GET_VALUE (e->X_op_symbol) - IND_CPUID
5205 == opnd - IA64_OPND_CPUID_R3))
5206 return OPERAND_MATCH;
5210 if (e->X_op == O_index && !e->X_op_symbol)
5211 return OPERAND_MATCH;
5214 /* immediate operands: */
5215 case IA64_OPND_CNT2a:
5216 case IA64_OPND_LEN4:
5217 case IA64_OPND_LEN6:
5218 bits = operand_width (idesc->operands[index]);
5219 if (e->X_op == O_constant)
5221 if ((bfd_vma) (e->X_add_number - 1) < ((bfd_vma) 1 << bits))
5222 return OPERAND_MATCH;
5224 return OPERAND_OUT_OF_RANGE;
5228 case IA64_OPND_CNT2b:
5229 if (e->X_op == O_constant)
5231 if ((bfd_vma) (e->X_add_number - 1) < 3)
5232 return OPERAND_MATCH;
5234 return OPERAND_OUT_OF_RANGE;
5238 case IA64_OPND_CNT2c:
5239 val = e->X_add_number;
5240 if (e->X_op == O_constant)
5242 if ((val == 0 || val == 7 || val == 15 || val == 16))
5243 return OPERAND_MATCH;
5245 return OPERAND_OUT_OF_RANGE;
5250 /* SOR must be an integer multiple of 8 */
5251 if (e->X_op == O_constant && e->X_add_number & 0x7)
5252 return OPERAND_OUT_OF_RANGE;
5255 if (e->X_op == O_constant)
5257 if ((bfd_vma) e->X_add_number <= 96)
5258 return OPERAND_MATCH;
5260 return OPERAND_OUT_OF_RANGE;
5264 case IA64_OPND_IMMU62:
5265 if (e->X_op == O_constant)
5267 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << 62))
5268 return OPERAND_MATCH;
5270 return OPERAND_OUT_OF_RANGE;
5274 /* FIXME -- need 62-bit relocation type */
5275 as_bad (_("62-bit relocation not yet implemented"));
5279 case IA64_OPND_IMMU64:
5280 if (e->X_op == O_symbol || e->X_op == O_pseudo_fixup
5281 || e->X_op == O_subtract)
5283 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5284 fix->code = BFD_RELOC_IA64_IMM64;
5285 if (e->X_op != O_subtract)
5287 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5288 if (e->X_op == O_pseudo_fixup)
5292 fix->opnd = idesc->operands[index];
5295 ++CURR_SLOT.num_fixups;
5296 return OPERAND_MATCH;
5298 else if (e->X_op == O_constant)
5299 return OPERAND_MATCH;
5302 case IA64_OPND_CCNT5:
5303 case IA64_OPND_CNT5:
5304 case IA64_OPND_CNT6:
5305 case IA64_OPND_CPOS6a:
5306 case IA64_OPND_CPOS6b:
5307 case IA64_OPND_CPOS6c:
5308 case IA64_OPND_IMMU2:
5309 case IA64_OPND_IMMU7a:
5310 case IA64_OPND_IMMU7b:
5311 case IA64_OPND_IMMU21:
5312 case IA64_OPND_IMMU24:
5313 case IA64_OPND_MBTYPE4:
5314 case IA64_OPND_MHTYPE8:
5315 case IA64_OPND_POS6:
5316 bits = operand_width (idesc->operands[index]);
5317 if (e->X_op == O_constant)
5319 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5320 return OPERAND_MATCH;
5322 return OPERAND_OUT_OF_RANGE;
5326 case IA64_OPND_IMMU9:
5327 bits = operand_width (idesc->operands[index]);
5328 if (e->X_op == O_constant)
5330 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5332 int lobits = e->X_add_number & 0x3;
5333 if (((bfd_vma) e->X_add_number & 0x3C) != 0 && lobits == 0)
5334 e->X_add_number |= (bfd_vma) 0x3;
5335 return OPERAND_MATCH;
5338 return OPERAND_OUT_OF_RANGE;
5342 case IA64_OPND_IMM44:
5343 /* least 16 bits must be zero */
5344 if ((e->X_add_number & 0xffff) != 0)
5345 /* XXX technically, this is wrong: we should not be issuing warning
5346 messages until we're sure this instruction pattern is going to
5348 as_warn (_("lower 16 bits of mask ignored"));
5350 if (e->X_op == O_constant)
5352 if (((e->X_add_number >= 0
5353 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 44))
5354 || (e->X_add_number < 0
5355 && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 44))))
5358 if (e->X_add_number >= 0
5359 && (e->X_add_number & ((bfd_vma) 1 << 43)) != 0)
5361 e->X_add_number |= ~(((bfd_vma) 1 << 44) - 1);
5363 return OPERAND_MATCH;
5366 return OPERAND_OUT_OF_RANGE;
5370 case IA64_OPND_IMM17:
5371 /* bit 0 is a don't care (pr0 is hardwired to 1) */
5372 if (e->X_op == O_constant)
5374 if (((e->X_add_number >= 0
5375 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 17))
5376 || (e->X_add_number < 0
5377 && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 17))))
5380 if (e->X_add_number >= 0
5381 && (e->X_add_number & ((bfd_vma) 1 << 16)) != 0)
5383 e->X_add_number |= ~(((bfd_vma) 1 << 17) - 1);
5385 return OPERAND_MATCH;
5388 return OPERAND_OUT_OF_RANGE;
5392 case IA64_OPND_IMM14:
5393 case IA64_OPND_IMM22:
5395 case IA64_OPND_IMM1:
5396 case IA64_OPND_IMM8:
5397 case IA64_OPND_IMM8U4:
5398 case IA64_OPND_IMM8M1:
5399 case IA64_OPND_IMM8M1U4:
5400 case IA64_OPND_IMM8M1U8:
5401 case IA64_OPND_IMM9a:
5402 case IA64_OPND_IMM9b:
5403 bits = operand_width (idesc->operands[index]);
5404 if (relocatable && (e->X_op == O_symbol
5405 || e->X_op == O_subtract
5406 || e->X_op == O_pseudo_fixup))
5408 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5410 if (idesc->operands[index] == IA64_OPND_IMM14)
5411 fix->code = BFD_RELOC_IA64_IMM14;
5413 fix->code = BFD_RELOC_IA64_IMM22;
5415 if (e->X_op != O_subtract)
5417 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5418 if (e->X_op == O_pseudo_fixup)
5422 fix->opnd = idesc->operands[index];
5425 ++CURR_SLOT.num_fixups;
5426 return OPERAND_MATCH;
5428 else if (e->X_op != O_constant
5429 && ! (e->X_op == O_big && opnd == IA64_OPND_IMM8M1U8))
5430 return OPERAND_MISMATCH;
5432 if (opnd == IA64_OPND_IMM8M1U4)
5434 /* Zero is not valid for unsigned compares that take an adjusted
5435 constant immediate range. */
5436 if (e->X_add_number == 0)
5437 return OPERAND_OUT_OF_RANGE;
5439 /* Sign-extend 32-bit unsigned numbers, so that the following range
5440 checks will work. */
5441 val = e->X_add_number;
5442 if (((val & (~(bfd_vma) 0 << 32)) == 0)
5443 && ((val & ((bfd_vma) 1 << 31)) != 0))
5444 val = ((val << 32) >> 32);
5446 /* Check for 0x100000000. This is valid because
5447 0x100000000-1 is the same as ((uint32_t) -1). */
5448 if (val == ((bfd_signed_vma) 1 << 32))
5449 return OPERAND_MATCH;
5453 else if (opnd == IA64_OPND_IMM8M1U8)
5455 /* Zero is not valid for unsigned compares that take an adjusted
5456 constant immediate range. */
5457 if (e->X_add_number == 0)
5458 return OPERAND_OUT_OF_RANGE;
5460 /* Check for 0x10000000000000000. */
5461 if (e->X_op == O_big)
5463 if (generic_bignum[0] == 0
5464 && generic_bignum[1] == 0
5465 && generic_bignum[2] == 0
5466 && generic_bignum[3] == 0
5467 && generic_bignum[4] == 1)
5468 return OPERAND_MATCH;
5470 return OPERAND_OUT_OF_RANGE;
5473 val = e->X_add_number - 1;
5475 else if (opnd == IA64_OPND_IMM8M1)
5476 val = e->X_add_number - 1;
5477 else if (opnd == IA64_OPND_IMM8U4)
5479 /* Sign-extend 32-bit unsigned numbers, so that the following range
5480 checks will work. */
5481 val = e->X_add_number;
5482 if (((val & (~(bfd_vma) 0 << 32)) == 0)
5483 && ((val & ((bfd_vma) 1 << 31)) != 0))
5484 val = ((val << 32) >> 32);
5487 val = e->X_add_number;
5489 if ((val >= 0 && (bfd_vma) val < ((bfd_vma) 1 << (bits - 1)))
5490 || (val < 0 && (bfd_vma) -val <= ((bfd_vma) 1 << (bits - 1))))
5491 return OPERAND_MATCH;
5493 return OPERAND_OUT_OF_RANGE;
5495 case IA64_OPND_INC3:
5496 /* +/- 1, 4, 8, 16 */
5497 val = e->X_add_number;
5500 if (e->X_op == O_constant)
5502 if ((val == 1 || val == 4 || val == 8 || val == 16))
5503 return OPERAND_MATCH;
5505 return OPERAND_OUT_OF_RANGE;
5509 case IA64_OPND_TGT25:
5510 case IA64_OPND_TGT25b:
5511 case IA64_OPND_TGT25c:
5512 case IA64_OPND_TGT64:
5513 if (e->X_op == O_symbol)
5515 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5516 if (opnd == IA64_OPND_TGT25)
5517 fix->code = BFD_RELOC_IA64_PCREL21F;
5518 else if (opnd == IA64_OPND_TGT25b)
5519 fix->code = BFD_RELOC_IA64_PCREL21M;
5520 else if (opnd == IA64_OPND_TGT25c)
5521 fix->code = BFD_RELOC_IA64_PCREL21B;
5522 else if (opnd == IA64_OPND_TGT64)
5523 fix->code = BFD_RELOC_IA64_PCREL60B;
5527 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5528 fix->opnd = idesc->operands[index];
5531 ++CURR_SLOT.num_fixups;
5532 return OPERAND_MATCH;
5534 case IA64_OPND_TAG13:
5535 case IA64_OPND_TAG13b:
5539 return OPERAND_MATCH;
5542 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5543 /* There are no external relocs for TAG13/TAG13b fields, so we
5544 create a dummy reloc. This will not live past md_apply_fix3. */
5545 fix->code = BFD_RELOC_UNUSED;
5546 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5547 fix->opnd = idesc->operands[index];
5550 ++CURR_SLOT.num_fixups;
5551 return OPERAND_MATCH;
5558 case IA64_OPND_LDXMOV:
5559 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5560 fix->code = BFD_RELOC_IA64_LDXMOV;
5561 fix->opnd = idesc->operands[index];
5564 ++CURR_SLOT.num_fixups;
5565 return OPERAND_MATCH;
5570 return OPERAND_MISMATCH;
5579 memset (e, 0, sizeof (*e));
5582 if (*input_line_pointer != '}')
5584 sep = *input_line_pointer++;
5588 if (!md.manual_bundling)
5589 as_warn ("Found '}' when manual bundling is off");
5591 CURR_SLOT.manual_bundling_off = 1;
5592 md.manual_bundling = 0;
5598 /* Returns the next entry in the opcode table that matches the one in
5599 IDESC, and frees the entry in IDESC. If no matching entry is
5600 found, NULL is returned instead. */
5602 static struct ia64_opcode *
5603 get_next_opcode (struct ia64_opcode *idesc)
5605 struct ia64_opcode *next = ia64_find_next_opcode (idesc);
5606 ia64_free_opcode (idesc);
5610 /* Parse the operands for the opcode and find the opcode variant that
5611 matches the specified operands, or NULL if no match is possible. */
5613 static struct ia64_opcode *
5614 parse_operands (idesc)
5615 struct ia64_opcode *idesc;
5617 int i = 0, highest_unmatched_operand, num_operands = 0, num_outputs = 0;
5618 int error_pos, out_of_range_pos, curr_out_of_range_pos, sep = 0;
5619 enum ia64_opnd expected_operand = IA64_OPND_NIL;
5620 enum operand_match_result result;
5622 char *first_arg = 0, *end, *saved_input_pointer;
5625 assert (strlen (idesc->name) <= 128);
5627 strcpy (mnemonic, idesc->name);
5628 if (idesc->operands[2] == IA64_OPND_SOF)
5630 /* To make the common idiom "alloc loc?=ar.pfs,0,1,0,0" work, we
5631 can't parse the first operand until we have parsed the
5632 remaining operands of the "alloc" instruction. */
5634 first_arg = input_line_pointer;
5635 end = strchr (input_line_pointer, '=');
5638 as_bad ("Expected separator `='");
5641 input_line_pointer = end + 1;
5646 for (; i < NELEMS (CURR_SLOT.opnd); ++i)
5648 sep = parse_operand (CURR_SLOT.opnd + i);
5649 if (CURR_SLOT.opnd[i].X_op == O_absent)
5654 if (sep != '=' && sep != ',')
5659 if (num_outputs > 0)
5660 as_bad ("Duplicate equal sign (=) in instruction");
5662 num_outputs = i + 1;
5667 as_bad ("Illegal operand separator `%c'", sep);
5671 if (idesc->operands[2] == IA64_OPND_SOF)
5673 /* map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r */
5674 know (strcmp (idesc->name, "alloc") == 0);
5675 if (num_operands == 5 /* first_arg not included in this count! */
5676 && CURR_SLOT.opnd[2].X_op == O_constant
5677 && CURR_SLOT.opnd[3].X_op == O_constant
5678 && CURR_SLOT.opnd[4].X_op == O_constant
5679 && CURR_SLOT.opnd[5].X_op == O_constant)
5681 sof = set_regstack (CURR_SLOT.opnd[2].X_add_number,
5682 CURR_SLOT.opnd[3].X_add_number,
5683 CURR_SLOT.opnd[4].X_add_number,
5684 CURR_SLOT.opnd[5].X_add_number);
5686 /* now we can parse the first arg: */
5687 saved_input_pointer = input_line_pointer;
5688 input_line_pointer = first_arg;
5689 sep = parse_operand (CURR_SLOT.opnd + 0);
5691 --num_outputs; /* force error */
5692 input_line_pointer = saved_input_pointer;
5694 CURR_SLOT.opnd[2].X_add_number = sof;
5695 CURR_SLOT.opnd[3].X_add_number
5696 = sof - CURR_SLOT.opnd[4].X_add_number;
5697 CURR_SLOT.opnd[4] = CURR_SLOT.opnd[5];
5701 highest_unmatched_operand = 0;
5702 curr_out_of_range_pos = -1;
5704 expected_operand = idesc->operands[0];
5705 for (; idesc; idesc = get_next_opcode (idesc))
5707 if (num_outputs != idesc->num_outputs)
5708 continue; /* mismatch in # of outputs */
5710 CURR_SLOT.num_fixups = 0;
5712 /* Try to match all operands. If we see an out-of-range operand,
5713 then continue trying to match the rest of the operands, since if
5714 the rest match, then this idesc will give the best error message. */
5716 out_of_range_pos = -1;
5717 for (i = 0; i < num_operands && idesc->operands[i]; ++i)
5719 result = operand_match (idesc, i, CURR_SLOT.opnd + i);
5720 if (result != OPERAND_MATCH)
5722 if (result != OPERAND_OUT_OF_RANGE)
5724 if (out_of_range_pos < 0)
5725 /* remember position of the first out-of-range operand: */
5726 out_of_range_pos = i;
5730 /* If we did not match all operands, or if at least one operand was
5731 out-of-range, then this idesc does not match. Keep track of which
5732 idesc matched the most operands before failing. If we have two
5733 idescs that failed at the same position, and one had an out-of-range
5734 operand, then prefer the out-of-range operand. Thus if we have
5735 "add r0=0x1000000,r1" we get an error saying the constant is out
5736 of range instead of an error saying that the constant should have been
5739 if (i != num_operands || out_of_range_pos >= 0)
5741 if (i > highest_unmatched_operand
5742 || (i == highest_unmatched_operand
5743 && out_of_range_pos > curr_out_of_range_pos))
5745 highest_unmatched_operand = i;
5746 if (out_of_range_pos >= 0)
5748 expected_operand = idesc->operands[out_of_range_pos];
5749 error_pos = out_of_range_pos;
5753 expected_operand = idesc->operands[i];
5756 curr_out_of_range_pos = out_of_range_pos;
5761 if (num_operands < NELEMS (idesc->operands)
5762 && idesc->operands[num_operands])
5763 continue; /* mismatch in number of arguments */
5769 if (expected_operand)
5770 as_bad ("Operand %u of `%s' should be %s",
5771 error_pos + 1, mnemonic,
5772 elf64_ia64_operands[expected_operand].desc);
5774 as_bad ("Operand mismatch");
5780 /* Keep track of state necessary to determine whether a NOP is necessary
5781 to avoid an erratum in A and B step Itanium chips, and return 1 if we
5782 detect a case where additional NOPs may be necessary. */
5784 errata_nop_necessary_p (slot, insn_unit)
5786 enum ia64_unit insn_unit;
5789 struct group *this_group = md.last_groups + md.group_idx;
5790 struct group *prev_group = md.last_groups + (md.group_idx + 2) % 3;
5791 struct ia64_opcode *idesc = slot->idesc;
5793 /* Test whether this could be the first insn in a problematic sequence. */
5794 if (insn_unit == IA64_UNIT_F)
5796 for (i = 0; i < idesc->num_outputs; i++)
5797 if (idesc->operands[i] == IA64_OPND_P1
5798 || idesc->operands[i] == IA64_OPND_P2)
5800 int regno = slot->opnd[i].X_add_number - REG_P;
5801 /* Ignore invalid operands; they generate errors elsewhere. */
5804 this_group->p_reg_set[regno] = 1;
5808 /* Test whether this could be the second insn in a problematic sequence. */
5809 if (insn_unit == IA64_UNIT_M && slot->qp_regno > 0
5810 && prev_group->p_reg_set[slot->qp_regno])
5812 for (i = 0; i < idesc->num_outputs; i++)
5813 if (idesc->operands[i] == IA64_OPND_R1
5814 || idesc->operands[i] == IA64_OPND_R2
5815 || idesc->operands[i] == IA64_OPND_R3)
5817 int regno = slot->opnd[i].X_add_number - REG_GR;
5818 /* Ignore invalid operands; they generate errors elsewhere. */
5821 if (strncmp (idesc->name, "add", 3) != 0
5822 && strncmp (idesc->name, "sub", 3) != 0
5823 && strncmp (idesc->name, "shladd", 6) != 0
5824 && (idesc->flags & IA64_OPCODE_POSTINC) == 0)
5825 this_group->g_reg_set_conditionally[regno] = 1;
5829 /* Test whether this could be the third insn in a problematic sequence. */
5830 for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; i++)
5832 if (/* For fc, ptc, ptr, tak, thash, tpa, ttag, probe, ptr, ptc. */
5833 idesc->operands[i] == IA64_OPND_R3
5834 /* For mov indirect. */
5835 || idesc->operands[i] == IA64_OPND_RR_R3
5836 || idesc->operands[i] == IA64_OPND_DBR_R3
5837 || idesc->operands[i] == IA64_OPND_IBR_R3
5838 || idesc->operands[i] == IA64_OPND_PKR_R3
5839 || idesc->operands[i] == IA64_OPND_PMC_R3
5840 || idesc->operands[i] == IA64_OPND_PMD_R3
5841 || idesc->operands[i] == IA64_OPND_MSR_R3
5842 || idesc->operands[i] == IA64_OPND_CPUID_R3
5844 || idesc->operands[i] == IA64_OPND_ITR_R3
5845 || idesc->operands[i] == IA64_OPND_DTR_R3
5846 /* Normal memory addresses (load, store, xchg, cmpxchg, etc.). */
5847 || idesc->operands[i] == IA64_OPND_MR3)
5849 int regno = slot->opnd[i].X_add_number - REG_GR;
5850 /* Ignore invalid operands; they generate errors elsewhere. */
5853 if (idesc->operands[i] == IA64_OPND_R3)
5855 if (strcmp (idesc->name, "fc") != 0
5856 && strcmp (idesc->name, "tak") != 0
5857 && strcmp (idesc->name, "thash") != 0
5858 && strcmp (idesc->name, "tpa") != 0
5859 && strcmp (idesc->name, "ttag") != 0
5860 && strncmp (idesc->name, "ptr", 3) != 0
5861 && strncmp (idesc->name, "ptc", 3) != 0
5862 && strncmp (idesc->name, "probe", 5) != 0)
5865 if (prev_group->g_reg_set_conditionally[regno])
5873 build_insn (slot, insnp)
5877 const struct ia64_operand *odesc, *o2desc;
5878 struct ia64_opcode *idesc = slot->idesc;
5879 bfd_signed_vma insn, val;
5883 insn = idesc->opcode | slot->qp_regno;
5885 for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; ++i)
5887 if (slot->opnd[i].X_op == O_register
5888 || slot->opnd[i].X_op == O_constant
5889 || slot->opnd[i].X_op == O_index)
5890 val = slot->opnd[i].X_add_number;
5891 else if (slot->opnd[i].X_op == O_big)
5893 /* This must be the value 0x10000000000000000. */
5894 assert (idesc->operands[i] == IA64_OPND_IMM8M1U8);
5900 switch (idesc->operands[i])
5902 case IA64_OPND_IMMU64:
5903 *insnp++ = (val >> 22) & 0x1ffffffffffLL;
5904 insn |= (((val & 0x7f) << 13) | (((val >> 7) & 0x1ff) << 27)
5905 | (((val >> 16) & 0x1f) << 22) | (((val >> 21) & 0x1) << 21)
5906 | (((val >> 63) & 0x1) << 36));
5909 case IA64_OPND_IMMU62:
5910 val &= 0x3fffffffffffffffULL;
5911 if (val != slot->opnd[i].X_add_number)
5912 as_warn (_("Value truncated to 62 bits"));
5913 *insnp++ = (val >> 21) & 0x1ffffffffffLL;
5914 insn |= (((val & 0xfffff) << 6) | (((val >> 20) & 0x1) << 36));
5917 case IA64_OPND_TGT64:
5919 *insnp++ = ((val >> 20) & 0x7fffffffffLL) << 2;
5920 insn |= ((((val >> 59) & 0x1) << 36)
5921 | (((val >> 0) & 0xfffff) << 13));
5952 case IA64_OPND_R3_2:
5953 case IA64_OPND_CPUID_R3:
5954 case IA64_OPND_DBR_R3:
5955 case IA64_OPND_DTR_R3:
5956 case IA64_OPND_ITR_R3:
5957 case IA64_OPND_IBR_R3:
5959 case IA64_OPND_MSR_R3:
5960 case IA64_OPND_PKR_R3:
5961 case IA64_OPND_PMC_R3:
5962 case IA64_OPND_PMD_R3:
5963 case IA64_OPND_RR_R3:
5971 odesc = elf64_ia64_operands + idesc->operands[i];
5972 err = (*odesc->insert) (odesc, val, &insn);
5974 as_bad_where (slot->src_file, slot->src_line,
5975 "Bad operand value: %s", err);
5976 if (idesc->flags & IA64_OPCODE_PSEUDO)
5978 if ((idesc->flags & IA64_OPCODE_F2_EQ_F3)
5979 && odesc == elf64_ia64_operands + IA64_OPND_F3)
5981 o2desc = elf64_ia64_operands + IA64_OPND_F2;
5982 (*o2desc->insert) (o2desc, val, &insn);
5984 if ((idesc->flags & IA64_OPCODE_LEN_EQ_64MCNT)
5985 && (odesc == elf64_ia64_operands + IA64_OPND_CPOS6a
5986 || odesc == elf64_ia64_operands + IA64_OPND_POS6))
5988 o2desc = elf64_ia64_operands + IA64_OPND_LEN6;
5989 (*o2desc->insert) (o2desc, 64 - val, &insn);
5999 unsigned int manual_bundling_on = 0, manual_bundling_off = 0;
6000 unsigned int manual_bundling = 0;
6001 enum ia64_unit required_unit, insn_unit = 0;
6002 enum ia64_insn_type type[3], insn_type;
6003 unsigned int template, orig_template;
6004 bfd_vma insn[3] = { -1, -1, -1 };
6005 struct ia64_opcode *idesc;
6006 int end_of_insn_group = 0, user_template = -1;
6007 int n, i, j, first, curr;
6008 unw_rec_list *ptr, *last_ptr, *end_ptr;
6009 bfd_vma t0 = 0, t1 = 0;
6010 struct label_fix *lfix;
6011 struct insn_fix *ifix;
6016 first = (md.curr_slot + NUM_SLOTS - md.num_slots_in_use) % NUM_SLOTS;
6017 know (first >= 0 & first < NUM_SLOTS);
6018 n = MIN (3, md.num_slots_in_use);
6020 /* Determine template: user user_template if specified, best match
6023 if (md.slot[first].user_template >= 0)
6024 user_template = template = md.slot[first].user_template;
6027 /* Auto select appropriate template. */
6028 memset (type, 0, sizeof (type));
6030 for (i = 0; i < n; ++i)
6032 if (md.slot[curr].label_fixups && i != 0)
6034 type[i] = md.slot[curr].idesc->type;
6035 curr = (curr + 1) % NUM_SLOTS;
6037 template = best_template[type[0]][type[1]][type[2]];
6040 /* initialize instructions with appropriate nops: */
6041 for (i = 0; i < 3; ++i)
6042 insn[i] = nop[ia64_templ_desc[template].exec_unit[i]];
6046 /* now fill in slots with as many insns as possible: */
6048 idesc = md.slot[curr].idesc;
6049 end_of_insn_group = 0;
6050 for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
6052 /* If we have unwind records, we may need to update some now. */
6053 ptr = md.slot[curr].unwind_record;
6056 /* Find the last prologue/body record in the list for the current
6057 insn, and set the slot number for all records up to that point.
6058 This needs to be done now, because prologue/body records refer to
6059 the current point, not the point after the instruction has been
6060 issued. This matters because there may have been nops emitted
6061 meanwhile. Any non-prologue non-body record followed by a
6062 prologue/body record must also refer to the current point. */
6064 end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6065 for (; ptr != end_ptr; ptr = ptr->next)
6066 if (ptr->r.type == prologue || ptr->r.type == prologue_gr
6067 || ptr->r.type == body)
6071 /* Make last_ptr point one after the last prologue/body
6073 last_ptr = last_ptr->next;
6074 for (ptr = md.slot[curr].unwind_record; ptr != last_ptr;
6077 ptr->slot_number = (unsigned long) f + i;
6078 ptr->slot_frag = frag_now;
6080 /* Remove the initialized records, so that we won't accidentally
6081 update them again if we insert a nop and continue. */
6082 md.slot[curr].unwind_record = last_ptr;
6086 if (idesc->flags & IA64_OPCODE_SLOT2)
6088 if (manual_bundling && i != 2)
6089 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6090 "`%s' must be last in bundle", idesc->name);
6094 if (idesc->flags & IA64_OPCODE_LAST)
6097 unsigned int required_template;
6099 /* If we need a stop bit after an M slot, our only choice is
6100 template 5 (M;;MI). If we need a stop bit after a B
6101 slot, our only choice is to place it at the end of the
6102 bundle, because the only available templates are MIB,
6103 MBB, BBB, MMB, and MFB. We don't handle anything other
6104 than M and B slots because these are the only kind of
6105 instructions that can have the IA64_OPCODE_LAST bit set. */
6106 required_template = template;
6107 switch (idesc->type)
6111 required_template = 5;
6119 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6120 "Internal error: don't know how to force %s to end"
6121 "of instruction group", idesc->name);
6125 if (manual_bundling && i != required_slot)
6126 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6127 "`%s' must be last in instruction group",
6129 if (required_slot < i)
6130 /* Can't fit this instruction. */
6134 if (required_template != template)
6136 /* If we switch the template, we need to reset the NOPs
6137 after slot i. The slot-types of the instructions ahead
6138 of i never change, so we don't need to worry about
6139 changing NOPs in front of this slot. */
6140 for (j = i; j < 3; ++j)
6141 insn[j] = nop[ia64_templ_desc[required_template].exec_unit[j]];
6143 template = required_template;
6145 if (curr != first && md.slot[curr].label_fixups)
6147 if (manual_bundling_on)
6148 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6149 "Label must be first in a bundle");
6150 /* This insn must go into the first slot of a bundle. */
6154 manual_bundling_on = md.slot[curr].manual_bundling_on;
6155 manual_bundling_off = md.slot[curr].manual_bundling_off;
6157 if (manual_bundling_on)
6160 manual_bundling = 1;
6162 break; /* need to start a new bundle */
6165 if (end_of_insn_group && md.num_slots_in_use >= 1)
6167 /* We need an instruction group boundary in the middle of a
6168 bundle. See if we can switch to an other template with
6169 an appropriate boundary. */
6171 orig_template = template;
6172 if (i == 1 && (user_template == 4
6173 || (user_template < 0
6174 && (ia64_templ_desc[template].exec_unit[0]
6178 end_of_insn_group = 0;
6180 else if (i == 2 && (user_template == 0
6181 || (user_template < 0
6182 && (ia64_templ_desc[template].exec_unit[1]
6184 /* This test makes sure we don't switch the template if
6185 the next instruction is one that needs to be first in
6186 an instruction group. Since all those instructions are
6187 in the M group, there is no way such an instruction can
6188 fit in this bundle even if we switch the template. The
6189 reason we have to check for this is that otherwise we
6190 may end up generating "MI;;I M.." which has the deadly
6191 effect that the second M instruction is no longer the
6192 first in the bundle! --davidm 99/12/16 */
6193 && (idesc->flags & IA64_OPCODE_FIRST) == 0)
6196 end_of_insn_group = 0;
6198 else if (curr != first)
6199 /* can't fit this insn */
6202 if (template != orig_template)
6203 /* if we switch the template, we need to reset the NOPs
6204 after slot i. The slot-types of the instructions ahead
6205 of i never change, so we don't need to worry about
6206 changing NOPs in front of this slot. */
6207 for (j = i; j < 3; ++j)
6208 insn[j] = nop[ia64_templ_desc[template].exec_unit[j]];
6210 required_unit = ia64_templ_desc[template].exec_unit[i];
6212 /* resolve dynamic opcodes such as "break", "hint", and "nop": */
6213 if (idesc->type == IA64_TYPE_DYN)
6215 if ((strcmp (idesc->name, "nop") == 0)
6216 || (strcmp (idesc->name, "hint") == 0)
6217 || (strcmp (idesc->name, "break") == 0))
6218 insn_unit = required_unit;
6219 else if (strcmp (idesc->name, "chk.s") == 0)
6221 insn_unit = IA64_UNIT_M;
6222 if (required_unit == IA64_UNIT_I)
6223 insn_unit = IA64_UNIT_I;
6226 as_fatal ("emit_one_bundle: unexpected dynamic op");
6228 sprintf (mnemonic, "%s.%c", idesc->name, "?imbf??"[insn_unit]);
6229 ia64_free_opcode (idesc);
6230 md.slot[curr].idesc = idesc = ia64_find_opcode (mnemonic);
6232 know (!idesc->next); /* no resolved dynamic ops have collisions */
6237 insn_type = idesc->type;
6238 insn_unit = IA64_UNIT_NIL;
6242 if (required_unit == IA64_UNIT_I || required_unit == IA64_UNIT_M)
6243 insn_unit = required_unit;
6245 case IA64_TYPE_X: insn_unit = IA64_UNIT_L; break;
6246 case IA64_TYPE_I: insn_unit = IA64_UNIT_I; break;
6247 case IA64_TYPE_M: insn_unit = IA64_UNIT_M; break;
6248 case IA64_TYPE_B: insn_unit = IA64_UNIT_B; break;
6249 case IA64_TYPE_F: insn_unit = IA64_UNIT_F; break;
6254 if (insn_unit != required_unit)
6256 if (required_unit == IA64_UNIT_L
6257 && insn_unit == IA64_UNIT_I
6258 && !(idesc->flags & IA64_OPCODE_X_IN_MLX))
6260 /* we got ourselves an MLX template but the current
6261 instruction isn't an X-unit, or an I-unit instruction
6262 that can go into the X slot of an MLX template. Duh. */
6263 if (md.num_slots_in_use >= NUM_SLOTS)
6265 as_bad_where (md.slot[curr].src_file,
6266 md.slot[curr].src_line,
6267 "`%s' can't go in X slot of "
6268 "MLX template", idesc->name);
6269 /* drop this insn so we don't livelock: */
6270 --md.num_slots_in_use;
6274 continue; /* try next slot */
6280 addr = frag_now->fr_address + frag_now_fix () - 16 + i;
6281 dwarf2_gen_line_info (addr, &md.slot[curr].debug_line);
6284 if (errata_nop_necessary_p (md.slot + curr, insn_unit))
6285 as_warn (_("Additional NOP may be necessary to workaround Itanium processor A/B step errata"));
6287 build_insn (md.slot + curr, insn + i);
6289 ptr = md.slot[curr].unwind_record;
6292 /* Set slot numbers for all remaining unwind records belonging to the
6293 current insn. There can not be any prologue/body unwind records
6295 end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6296 for (; ptr != end_ptr; ptr = ptr->next)
6298 ptr->slot_number = (unsigned long) f + i;
6299 ptr->slot_frag = frag_now;
6301 md.slot[curr].unwind_record = NULL;
6304 if (required_unit == IA64_UNIT_L)
6307 /* skip one slot for long/X-unit instructions */
6310 --md.num_slots_in_use;
6312 /* now is a good time to fix up the labels for this insn: */
6313 for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next)
6315 S_SET_VALUE (lfix->sym, frag_now_fix () - 16);
6316 symbol_set_frag (lfix->sym, frag_now);
6318 /* and fix up the tags also. */
6319 for (lfix = md.slot[curr].tag_fixups; lfix; lfix = lfix->next)
6321 S_SET_VALUE (lfix->sym, frag_now_fix () - 16 + i);
6322 symbol_set_frag (lfix->sym, frag_now);
6325 for (j = 0; j < md.slot[curr].num_fixups; ++j)
6327 ifix = md.slot[curr].fixup + j;
6328 fix = fix_new_exp (frag_now, frag_now_fix () - 16 + i, 8,
6329 &ifix->expr, ifix->is_pcrel, ifix->code);
6330 fix->tc_fix_data.opnd = ifix->opnd;
6331 fix->fx_plt = (fix->fx_r_type == BFD_RELOC_IA64_PLTOFF22);
6332 fix->fx_file = md.slot[curr].src_file;
6333 fix->fx_line = md.slot[curr].src_line;
6336 end_of_insn_group = md.slot[curr].end_of_insn_group;
6338 if (end_of_insn_group)
6340 md.group_idx = (md.group_idx + 1) % 3;
6341 memset (md.last_groups + md.group_idx, 0, sizeof md.last_groups[0]);
6345 ia64_free_opcode (md.slot[curr].idesc);
6346 memset (md.slot + curr, 0, sizeof (md.slot[curr]));
6347 md.slot[curr].user_template = -1;
6349 if (manual_bundling_off)
6351 manual_bundling = 0;
6354 curr = (curr + 1) % NUM_SLOTS;
6355 idesc = md.slot[curr].idesc;
6357 if (manual_bundling)
6359 if (md.num_slots_in_use > 0)
6360 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6361 "`%s' does not fit into %s template",
6362 idesc->name, ia64_templ_desc[template].name);
6364 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6365 "Missing '}' at end of file");
6367 know (md.num_slots_in_use < NUM_SLOTS);
6369 t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
6370 t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
6372 number_to_chars_littleendian (f + 0, t0, 8);
6373 number_to_chars_littleendian (f + 8, t1, 8);
6377 unwind.list->next_slot_number = (unsigned long) f + 16;
6378 unwind.list->next_slot_frag = frag_now;
6383 md_parse_option (c, arg)
6390 /* Switches from the Intel assembler. */
6392 if (strcmp (arg, "ilp64") == 0
6393 || strcmp (arg, "lp64") == 0
6394 || strcmp (arg, "p64") == 0)
6396 md.flags |= EF_IA_64_ABI64;
6398 else if (strcmp (arg, "ilp32") == 0)
6400 md.flags &= ~EF_IA_64_ABI64;
6402 else if (strcmp (arg, "le") == 0)
6404 md.flags &= ~EF_IA_64_BE;
6406 else if (strcmp (arg, "be") == 0)
6408 md.flags |= EF_IA_64_BE;
6415 if (strcmp (arg, "so") == 0)
6417 /* Suppress signon message. */
6419 else if (strcmp (arg, "pi") == 0)
6421 /* Reject privileged instructions. FIXME */
6423 else if (strcmp (arg, "us") == 0)
6425 /* Allow union of signed and unsigned range. FIXME */
6427 else if (strcmp (arg, "close_fcalls") == 0)
6429 /* Do not resolve global function calls. */
6436 /* temp[="prefix"] Insert temporary labels into the object file
6437 symbol table prefixed by "prefix".
6438 Default prefix is ":temp:".
6443 /* indirect=<tgt> Assume unannotated indirect branches behavior
6444 according to <tgt> --
6445 exit: branch out from the current context (default)
6446 labels: all labels in context may be branch targets
6448 if (strncmp (arg, "indirect=", 9) != 0)
6453 /* -X conflicts with an ignored option, use -x instead */
6455 if (!arg || strcmp (arg, "explicit") == 0)
6457 /* set default mode to explicit */
6458 md.default_explicit_mode = 1;
6461 else if (strcmp (arg, "auto") == 0)
6463 md.default_explicit_mode = 0;
6465 else if (strcmp (arg, "debug") == 0)
6469 else if (strcmp (arg, "debugx") == 0)
6471 md.default_explicit_mode = 1;
6476 as_bad (_("Unrecognized option '-x%s'"), arg);
6481 /* nops Print nops statistics. */
6484 /* GNU specific switches for gcc. */
6485 case OPTION_MCONSTANT_GP:
6486 md.flags |= EF_IA_64_CONS_GP;
6489 case OPTION_MAUTO_PIC:
6490 md.flags |= EF_IA_64_NOFUNCDESC_CONS_GP;
6501 md_show_usage (stream)
6506 --mconstant-gp mark output file as using the constant-GP model\n\
6507 (sets ELF header flag EF_IA_64_CONS_GP)\n\
6508 --mauto-pic mark output file as using the constant-GP model\n\
6509 without function descriptors (sets ELF header flag\n\
6510 EF_IA_64_NOFUNCDESC_CONS_GP)\n\
6511 -milp32|-milp64|-mlp64|-mp64 select data model (default -mlp64)\n\
6512 -mle | -mbe select little- or big-endian byte order (default -mle)\n\
6513 -x | -xexplicit turn on dependency violation checking (default)\n\
6514 -xauto automagically remove dependency violations\n\
6515 -xdebug debug dependency violation checker\n"),
6520 ia64_after_parse_args ()
6522 if (debug_type == DEBUG_STABS)
6523 as_fatal (_("--gstabs is not supported for ia64"));
6526 /* Return true if TYPE fits in TEMPL at SLOT. */
6529 match (int templ, int type, int slot)
6531 enum ia64_unit unit;
6534 unit = ia64_templ_desc[templ].exec_unit[slot];
6537 case IA64_TYPE_DYN: result = 1; break; /* for nop and break */
6539 result = (unit == IA64_UNIT_I || unit == IA64_UNIT_M);
6541 case IA64_TYPE_X: result = (unit == IA64_UNIT_L); break;
6542 case IA64_TYPE_I: result = (unit == IA64_UNIT_I); break;
6543 case IA64_TYPE_M: result = (unit == IA64_UNIT_M); break;
6544 case IA64_TYPE_B: result = (unit == IA64_UNIT_B); break;
6545 case IA64_TYPE_F: result = (unit == IA64_UNIT_F); break;
6546 default: result = 0; break;
6551 /* Add a bit of extra goodness if a nop of type F or B would fit
6552 in TEMPL at SLOT. */
6555 extra_goodness (int templ, int slot)
6557 if (slot == 1 && match (templ, IA64_TYPE_F, slot))
6559 if (slot == 2 && match (templ, IA64_TYPE_B, slot))
6564 /* This function is called once, at assembler startup time. It sets
6565 up all the tables, etc. that the MD part of the assembler will need
6566 that can be determined before arguments are parsed. */
6570 int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum, ok;
6575 md.explicit_mode = md.default_explicit_mode;
6577 bfd_set_section_alignment (stdoutput, text_section, 4);
6579 /* Make sure function pointers get initialized. */
6580 target_big_endian = -1;
6581 dot_byteorder (TARGET_BYTES_BIG_ENDIAN);
6583 alias_hash = hash_new ();
6584 alias_name_hash = hash_new ();
6585 secalias_hash = hash_new ();
6586 secalias_name_hash = hash_new ();
6588 pseudo_func[FUNC_DTP_MODULE].u.sym =
6589 symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
6590 &zero_address_frag);
6592 pseudo_func[FUNC_DTP_RELATIVE].u.sym =
6593 symbol_new (".<dtprel>", undefined_section, FUNC_DTP_RELATIVE,
6594 &zero_address_frag);
6596 pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
6597 symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
6598 &zero_address_frag);
6600 pseudo_func[FUNC_GP_RELATIVE].u.sym =
6601 symbol_new (".<gprel>", undefined_section, FUNC_GP_RELATIVE,
6602 &zero_address_frag);
6604 pseudo_func[FUNC_LT_RELATIVE].u.sym =
6605 symbol_new (".<ltoff>", undefined_section, FUNC_LT_RELATIVE,
6606 &zero_address_frag);
6608 pseudo_func[FUNC_LT_RELATIVE_X].u.sym =
6609 symbol_new (".<ltoffx>", undefined_section, FUNC_LT_RELATIVE_X,
6610 &zero_address_frag);
6612 pseudo_func[FUNC_PC_RELATIVE].u.sym =
6613 symbol_new (".<pcrel>", undefined_section, FUNC_PC_RELATIVE,
6614 &zero_address_frag);
6616 pseudo_func[FUNC_PLT_RELATIVE].u.sym =
6617 symbol_new (".<pltoff>", undefined_section, FUNC_PLT_RELATIVE,
6618 &zero_address_frag);
6620 pseudo_func[FUNC_SEC_RELATIVE].u.sym =
6621 symbol_new (".<secrel>", undefined_section, FUNC_SEC_RELATIVE,
6622 &zero_address_frag);
6624 pseudo_func[FUNC_SEG_RELATIVE].u.sym =
6625 symbol_new (".<segrel>", undefined_section, FUNC_SEG_RELATIVE,
6626 &zero_address_frag);
6628 pseudo_func[FUNC_TP_RELATIVE].u.sym =
6629 symbol_new (".<tprel>", undefined_section, FUNC_TP_RELATIVE,
6630 &zero_address_frag);
6632 pseudo_func[FUNC_LTV_RELATIVE].u.sym =
6633 symbol_new (".<ltv>", undefined_section, FUNC_LTV_RELATIVE,
6634 &zero_address_frag);
6636 pseudo_func[FUNC_LT_FPTR_RELATIVE].u.sym =
6637 symbol_new (".<ltoff.fptr>", undefined_section, FUNC_LT_FPTR_RELATIVE,
6638 &zero_address_frag);
6640 pseudo_func[FUNC_LT_DTP_MODULE].u.sym =
6641 symbol_new (".<ltoff.dtpmod>", undefined_section, FUNC_LT_DTP_MODULE,
6642 &zero_address_frag);
6644 pseudo_func[FUNC_LT_DTP_RELATIVE].u.sym =
6645 symbol_new (".<ltoff.dptrel>", undefined_section, FUNC_LT_DTP_RELATIVE,
6646 &zero_address_frag);
6648 pseudo_func[FUNC_LT_TP_RELATIVE].u.sym =
6649 symbol_new (".<ltoff.tprel>", undefined_section, FUNC_LT_TP_RELATIVE,
6650 &zero_address_frag);
6652 pseudo_func[FUNC_IPLT_RELOC].u.sym =
6653 symbol_new (".<iplt>", undefined_section, FUNC_IPLT_RELOC,
6654 &zero_address_frag);
6656 /* Compute the table of best templates. We compute goodness as a
6657 base 4 value, in which each match counts for 3, each F counts
6658 for 2, each B counts for 1. This should maximize the number of
6659 F and B nops in the chosen bundles, which is good because these
6660 pipelines are least likely to be overcommitted. */
6661 for (i = 0; i < IA64_NUM_TYPES; ++i)
6662 for (j = 0; j < IA64_NUM_TYPES; ++j)
6663 for (k = 0; k < IA64_NUM_TYPES; ++k)
6666 for (t = 0; t < NELEMS (ia64_templ_desc); ++t)
6669 if (match (t, i, 0))
6671 if (match (t, j, 1))
6673 if (match (t, k, 2))
6674 goodness = 3 + 3 + 3;
6676 goodness = 3 + 3 + extra_goodness (t, 2);
6678 else if (match (t, j, 2))
6679 goodness = 3 + 3 + extra_goodness (t, 1);
6683 goodness += extra_goodness (t, 1);
6684 goodness += extra_goodness (t, 2);
6687 else if (match (t, i, 1))
6689 if (match (t, j, 2))
6692 goodness = 3 + extra_goodness (t, 2);
6694 else if (match (t, i, 2))
6695 goodness = 3 + extra_goodness (t, 1);
6697 if (goodness > best)
6700 best_template[i][j][k] = t;
6705 for (i = 0; i < NUM_SLOTS; ++i)
6706 md.slot[i].user_template = -1;
6708 md.pseudo_hash = hash_new ();
6709 for (i = 0; i < NELEMS (pseudo_opcode); ++i)
6711 err = hash_insert (md.pseudo_hash, pseudo_opcode[i].name,
6712 (void *) (pseudo_opcode + i));
6714 as_fatal ("ia64.md_begin: can't hash `%s': %s",
6715 pseudo_opcode[i].name, err);
6718 md.reg_hash = hash_new ();
6719 md.dynreg_hash = hash_new ();
6720 md.const_hash = hash_new ();
6721 md.entry_hash = hash_new ();
6723 /* general registers: */
6726 for (i = 0; i < total; ++i)
6728 sprintf (name, "r%d", i - REG_GR);
6729 md.regsym[i] = declare_register (name, i);
6732 /* floating point registers: */
6734 for (; i < total; ++i)
6736 sprintf (name, "f%d", i - REG_FR);
6737 md.regsym[i] = declare_register (name, i);
6740 /* application registers: */
6743 for (; i < total; ++i)
6745 sprintf (name, "ar%d", i - REG_AR);
6746 md.regsym[i] = declare_register (name, i);
6749 /* control registers: */
6752 for (; i < total; ++i)
6754 sprintf (name, "cr%d", i - REG_CR);
6755 md.regsym[i] = declare_register (name, i);
6758 /* predicate registers: */
6760 for (; i < total; ++i)
6762 sprintf (name, "p%d", i - REG_P);
6763 md.regsym[i] = declare_register (name, i);
6766 /* branch registers: */
6768 for (; i < total; ++i)
6770 sprintf (name, "b%d", i - REG_BR);
6771 md.regsym[i] = declare_register (name, i);
6774 md.regsym[REG_IP] = declare_register ("ip", REG_IP);
6775 md.regsym[REG_CFM] = declare_register ("cfm", REG_CFM);
6776 md.regsym[REG_PR] = declare_register ("pr", REG_PR);
6777 md.regsym[REG_PR_ROT] = declare_register ("pr.rot", REG_PR_ROT);
6778 md.regsym[REG_PSR] = declare_register ("psr", REG_PSR);
6779 md.regsym[REG_PSR_L] = declare_register ("psr.l", REG_PSR_L);
6780 md.regsym[REG_PSR_UM] = declare_register ("psr.um", REG_PSR_UM);
6782 for (i = 0; i < NELEMS (indirect_reg); ++i)
6784 regnum = indirect_reg[i].regnum;
6785 md.regsym[regnum] = declare_register (indirect_reg[i].name, regnum);
6788 /* define synonyms for application registers: */
6789 for (i = REG_AR; i < REG_AR + NELEMS (ar); ++i)
6790 md.regsym[i] = declare_register (ar[i - REG_AR].name,
6791 REG_AR + ar[i - REG_AR].regnum);
6793 /* define synonyms for control registers: */
6794 for (i = REG_CR; i < REG_CR + NELEMS (cr); ++i)
6795 md.regsym[i] = declare_register (cr[i - REG_CR].name,
6796 REG_CR + cr[i - REG_CR].regnum);
6798 declare_register ("gp", REG_GR + 1);
6799 declare_register ("sp", REG_GR + 12);
6800 declare_register ("rp", REG_BR + 0);
6802 /* pseudo-registers used to specify unwind info: */
6803 declare_register ("psp", REG_PSP);
6805 declare_register_set ("ret", 4, REG_GR + 8);
6806 declare_register_set ("farg", 8, REG_FR + 8);
6807 declare_register_set ("fret", 8, REG_FR + 8);
6809 for (i = 0; i < NELEMS (const_bits); ++i)
6811 err = hash_insert (md.const_hash, const_bits[i].name,
6812 (PTR) (const_bits + i));
6814 as_fatal ("Inserting \"%s\" into constant hash table failed: %s",
6818 /* Set the architecture and machine depending on defaults and command line
6820 if (md.flags & EF_IA_64_ABI64)
6821 ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf64);
6823 ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf32);
6826 as_warn (_("Could not set architecture and machine"));
6828 /* Set the pointer size and pointer shift size depending on md.flags */
6830 if (md.flags & EF_IA_64_ABI64)
6832 md.pointer_size = 8; /* pointers are 8 bytes */
6833 md.pointer_size_shift = 3; /* alignment is 8 bytes = 2^2 */
6837 md.pointer_size = 4; /* pointers are 4 bytes */
6838 md.pointer_size_shift = 2; /* alignment is 4 bytes = 2^2 */
6841 md.mem_offset.hint = 0;
6844 md.entry_labels = NULL;
6847 /* Set the elf type to 64 bit ABI by default. Cannot do this in md_begin
6848 because that is called after md_parse_option which is where we do the
6849 dynamic changing of md.flags based on -mlp64 or -milp32. Also, set the
6850 default endianness. */
6853 ia64_init (argc, argv)
6854 int argc ATTRIBUTE_UNUSED;
6855 char **argv ATTRIBUTE_UNUSED;
6857 md.flags = MD_FLAGS_DEFAULT;
6860 /* Return a string for the target object file format. */
6863 ia64_target_format ()
6865 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
6867 if (md.flags & EF_IA_64_BE)
6869 if (md.flags & EF_IA_64_ABI64)
6870 #if defined(TE_AIX50)
6871 return "elf64-ia64-aix-big";
6872 #elif defined(TE_HPUX)
6873 return "elf64-ia64-hpux-big";
6875 return "elf64-ia64-big";
6878 #if defined(TE_AIX50)
6879 return "elf32-ia64-aix-big";
6880 #elif defined(TE_HPUX)
6881 return "elf32-ia64-hpux-big";
6883 return "elf32-ia64-big";
6888 if (md.flags & EF_IA_64_ABI64)
6890 return "elf64-ia64-aix-little";
6892 return "elf64-ia64-little";
6896 return "elf32-ia64-aix-little";
6898 return "elf32-ia64-little";
6903 return "unknown-format";
6907 ia64_end_of_source ()
6909 /* terminate insn group upon reaching end of file: */
6910 insn_group_break (1, 0, 0);
6912 /* emits slots we haven't written yet: */
6913 ia64_flush_insns ();
6915 bfd_set_private_flags (stdoutput, md.flags);
6917 md.mem_offset.hint = 0;
6923 if (md.qp.X_op == O_register)
6924 as_bad ("qualifying predicate not followed by instruction");
6925 md.qp.X_op = O_absent;
6927 if (ignore_input ())
6930 if (input_line_pointer[0] == ';' && input_line_pointer[-1] == ';')
6932 if (md.detect_dv && !md.explicit_mode)
6933 as_warn (_("Explicit stops are ignored in auto mode"));
6935 insn_group_break (1, 0, 0);
6939 /* This is a hook for ia64_frob_label, so that it can distinguish tags from
6941 static int defining_tag = 0;
6944 ia64_unrecognized_line (ch)
6950 expression (&md.qp);
6951 if (*input_line_pointer++ != ')')
6953 as_bad ("Expected ')'");
6956 if (md.qp.X_op != O_register)
6958 as_bad ("Qualifying predicate expected");
6961 if (md.qp.X_add_number < REG_P || md.qp.X_add_number >= REG_P + 64)
6963 as_bad ("Predicate register expected");
6969 if (md.manual_bundling)
6970 as_warn ("Found '{' when manual bundling is already turned on");
6972 CURR_SLOT.manual_bundling_on = 1;
6973 md.manual_bundling = 1;
6975 /* Bundling is only acceptable in explicit mode
6976 or when in default automatic mode. */
6977 if (md.detect_dv && !md.explicit_mode)
6979 if (!md.mode_explicitly_set
6980 && !md.default_explicit_mode)
6983 as_warn (_("Found '{' after explicit switch to automatic mode"));
6988 if (!md.manual_bundling)
6989 as_warn ("Found '}' when manual bundling is off");
6991 PREV_SLOT.manual_bundling_off = 1;
6992 md.manual_bundling = 0;
6994 /* switch back to automatic mode, if applicable */
6997 && !md.mode_explicitly_set
6998 && !md.default_explicit_mode)
7001 /* Allow '{' to follow on the same line. We also allow ";;", but that
7002 happens automatically because ';' is an end of line marker. */
7004 if (input_line_pointer[0] == '{')
7006 input_line_pointer++;
7007 return ia64_unrecognized_line ('{');
7010 demand_empty_rest_of_line ();
7020 if (md.qp.X_op == O_register)
7022 as_bad ("Tag must come before qualifying predicate.");
7026 /* This implements just enough of read_a_source_file in read.c to
7027 recognize labels. */
7028 if (is_name_beginner (*input_line_pointer))
7030 s = input_line_pointer;
7031 c = get_symbol_end ();
7033 else if (LOCAL_LABELS_FB
7034 && ISDIGIT (*input_line_pointer))
7037 while (ISDIGIT (*input_line_pointer))
7038 temp = (temp * 10) + *input_line_pointer++ - '0';
7039 fb_label_instance_inc (temp);
7040 s = fb_label_name (temp, 0);
7041 c = *input_line_pointer;
7050 /* Put ':' back for error messages' sake. */
7051 *input_line_pointer++ = ':';
7052 as_bad ("Expected ':'");
7059 /* Put ':' back for error messages' sake. */
7060 *input_line_pointer++ = ':';
7061 if (*input_line_pointer++ != ']')
7063 as_bad ("Expected ']'");
7068 as_bad ("Tag name expected");
7078 /* Not a valid line. */
7083 ia64_frob_label (sym)
7086 struct label_fix *fix;
7088 /* Tags need special handling since they are not bundle breaks like
7092 fix = obstack_alloc (¬es, sizeof (*fix));
7094 fix->next = CURR_SLOT.tag_fixups;
7095 CURR_SLOT.tag_fixups = fix;
7100 if (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7102 md.last_text_seg = now_seg;
7103 fix = obstack_alloc (¬es, sizeof (*fix));
7105 fix->next = CURR_SLOT.label_fixups;
7106 CURR_SLOT.label_fixups = fix;
7108 /* Keep track of how many code entry points we've seen. */
7109 if (md.path == md.maxpaths)
7112 md.entry_labels = (const char **)
7113 xrealloc ((void *) md.entry_labels,
7114 md.maxpaths * sizeof (char *));
7116 md.entry_labels[md.path++] = S_GET_NAME (sym);
7121 ia64_flush_pending_output ()
7123 if (!md.keep_pending_output
7124 && bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7126 /* ??? This causes many unnecessary stop bits to be emitted.
7127 Unfortunately, it isn't clear if it is safe to remove this. */
7128 insn_group_break (1, 0, 0);
7129 ia64_flush_insns ();
7133 /* Do ia64-specific expression optimization. All that's done here is
7134 to transform index expressions that are either due to the indexing
7135 of rotating registers or due to the indexing of indirect register
7138 ia64_optimize_expr (l, op, r)
7147 if (l->X_op == O_register && r->X_op == O_constant)
7149 num_regs = (l->X_add_number >> 16);
7150 if ((unsigned) r->X_add_number >= num_regs)
7153 as_bad ("No current frame");
7155 as_bad ("Index out of range 0..%u", num_regs - 1);
7156 r->X_add_number = 0;
7158 l->X_add_number = (l->X_add_number & 0xffff) + r->X_add_number;
7161 else if (l->X_op == O_register && r->X_op == O_register)
7163 if (l->X_add_number < IND_CPUID || l->X_add_number > IND_RR
7164 || l->X_add_number == IND_MEM)
7166 as_bad ("Indirect register set name expected");
7167 l->X_add_number = IND_CPUID;
7170 l->X_op_symbol = md.regsym[l->X_add_number];
7171 l->X_add_number = r->X_add_number;
7179 ia64_parse_name (name, e)
7183 struct const_desc *cdesc;
7184 struct dynreg *dr = 0;
7185 unsigned int regnum;
7189 /* first see if NAME is a known register name: */
7190 sym = hash_find (md.reg_hash, name);
7193 e->X_op = O_register;
7194 e->X_add_number = S_GET_VALUE (sym);
7198 cdesc = hash_find (md.const_hash, name);
7201 e->X_op = O_constant;
7202 e->X_add_number = cdesc->value;
7206 /* check for inN, locN, or outN: */
7210 if (name[1] == 'n' && ISDIGIT (name[2]))
7218 if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
7226 if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
7239 /* The name is inN, locN, or outN; parse the register number. */
7240 regnum = strtoul (name, &end, 10);
7241 if (end > name && *end == '\0')
7243 if ((unsigned) regnum >= dr->num_regs)
7246 as_bad ("No current frame");
7248 as_bad ("Register number out of range 0..%u",
7252 e->X_op = O_register;
7253 e->X_add_number = dr->base + regnum;
7258 if ((dr = hash_find (md.dynreg_hash, name)))
7260 /* We've got ourselves the name of a rotating register set.
7261 Store the base register number in the low 16 bits of
7262 X_add_number and the size of the register set in the top 16
7264 e->X_op = O_register;
7265 e->X_add_number = dr->base | (dr->num_regs << 16);
7271 /* Remove the '#' suffix that indicates a symbol as opposed to a register. */
7274 ia64_canonicalize_symbol_name (name)
7277 size_t len = strlen (name);
7278 if (len > 1 && name[len - 1] == '#')
7279 name[len - 1] = '\0';
7283 /* Return true if idesc is a conditional branch instruction. This excludes
7284 the modulo scheduled branches, and br.ia. Mod-sched branches are excluded
7285 because they always read/write resources regardless of the value of the
7286 qualifying predicate. br.ia must always use p0, and hence is always
7287 taken. Thus this function returns true for branches which can fall
7288 through, and which use no resources if they do fall through. */
7291 is_conditional_branch (idesc)
7292 struct ia64_opcode *idesc;
7294 /* br is a conditional branch. Everything that starts with br. except
7295 br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
7296 Everything that starts with brl is a conditional branch. */
7297 return (idesc->name[0] == 'b' && idesc->name[1] == 'r'
7298 && (idesc->name[2] == '\0'
7299 || (idesc->name[2] == '.' && idesc->name[3] != 'i'
7300 && idesc->name[3] != 'c' && idesc->name[3] != 'w')
7301 || idesc->name[2] == 'l'
7302 /* br.cond, br.call, br.clr */
7303 || (idesc->name[2] == '.' && idesc->name[3] == 'c'
7304 && (idesc->name[4] == 'a' || idesc->name[4] == 'o'
7305 || (idesc->name[4] == 'l' && idesc->name[5] == 'r')))));
7308 /* Return whether the given opcode is a taken branch. If there's any doubt,
7312 is_taken_branch (idesc)
7313 struct ia64_opcode *idesc;
7315 return ((is_conditional_branch (idesc) && CURR_SLOT.qp_regno == 0)
7316 || strncmp (idesc->name, "br.ia", 5) == 0);
7319 /* Return whether the given opcode is an interruption or rfi. If there's any
7320 doubt, returns zero. */
7323 is_interruption_or_rfi (idesc)
7324 struct ia64_opcode *idesc;
7326 if (strcmp (idesc->name, "rfi") == 0)
7331 /* Returns the index of the given dependency in the opcode's list of chks, or
7332 -1 if there is no dependency. */
7335 depends_on (depind, idesc)
7337 struct ia64_opcode *idesc;
7340 const struct ia64_opcode_dependency *dep = idesc->dependencies;
7341 for (i = 0; i < dep->nchks; i++)
7343 if (depind == DEP (dep->chks[i]))
7349 /* Determine a set of specific resources used for a particular resource
7350 class. Returns the number of specific resources identified For those
7351 cases which are not determinable statically, the resource returned is
7354 Meanings of value in 'NOTE':
7355 1) only read/write when the register number is explicitly encoded in the
7357 2) only read CFM when accessing a rotating GR, FR, or PR. mov pr only
7358 accesses CFM when qualifying predicate is in the rotating region.
7359 3) general register value is used to specify an indirect register; not
7360 determinable statically.
7361 4) only read the given resource when bits 7:0 of the indirect index
7362 register value does not match the register number of the resource; not
7363 determinable statically.
7364 5) all rules are implementation specific.
7365 6) only when both the index specified by the reader and the index specified
7366 by the writer have the same value in bits 63:61; not determinable
7368 7) only access the specified resource when the corresponding mask bit is
7370 8) PSR.dfh is only read when these insns reference FR32-127. PSR.dfl is
7371 only read when these insns reference FR2-31
7372 9) PSR.mfl is only written when these insns write FR2-31. PSR.mfh is only
7373 written when these insns write FR32-127
7374 10) The PSR.bn bit is only accessed when one of GR16-31 is specified in the
7376 11) The target predicates are written independently of PR[qp], but source
7377 registers are only read if PR[qp] is true. Since the state of PR[qp]
7378 cannot statically be determined, all source registers are marked used.
7379 12) This insn only reads the specified predicate register when that
7380 register is the PR[qp].
7381 13) This reference to ld-c only applies to teh GR whose value is loaded
7382 with data returned from memory, not the post-incremented address register.
7383 14) The RSE resource includes the implementation-specific RSE internal
7384 state resources. At least one (and possibly more) of these resources are
7385 read by each instruction listed in IC:rse-readers. At least one (and
7386 possibly more) of these resources are written by each insn listed in
7388 15+16) Represents reserved instructions, which the assembler does not
7391 Memory resources (i.e. locations in memory) are *not* marked or tracked by
7392 this code; there are no dependency violations based on memory access.
7395 #define MAX_SPECS 256
7400 specify_resource (dep, idesc, type, specs, note, path)
7401 const struct ia64_dependency *dep;
7402 struct ia64_opcode *idesc;
7403 int type; /* is this a DV chk or a DV reg? */
7404 struct rsrc specs[MAX_SPECS]; /* returned specific resources */
7405 int note; /* resource note for this insn's usage */
7406 int path; /* which execution path to examine */
7413 if (dep->mode == IA64_DV_WAW
7414 || (dep->mode == IA64_DV_RAW && type == DV_REG)
7415 || (dep->mode == IA64_DV_WAR && type == DV_CHK))
7418 /* template for any resources we identify */
7419 tmpl.dependency = dep;
7421 tmpl.insn_srlz = tmpl.data_srlz = 0;
7422 tmpl.qp_regno = CURR_SLOT.qp_regno;
7423 tmpl.link_to_qp_branch = 1;
7424 tmpl.mem_offset.hint = 0;
7427 tmpl.cmp_type = CMP_NONE;
7430 as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
7431 dep->name, idesc->name, (rsrc_write?"write":"read"), note)
7432 #define KNOWN(REG) (gr_values[REG].known && gr_values[REG].path >= path)
7434 /* we don't need to track these */
7435 if (dep->semantics == IA64_DVS_NONE)
7438 switch (dep->specifier)
7443 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7445 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7446 if (regno >= 0 && regno <= 7)
7448 specs[count] = tmpl;
7449 specs[count++].index = regno;
7455 for (i = 0; i < 8; i++)
7457 specs[count] = tmpl;
7458 specs[count++].index = i;
7467 case IA64_RS_AR_UNAT:
7468 /* This is a mov =AR or mov AR= instruction. */
7469 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7471 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7472 if (regno == AR_UNAT)
7474 specs[count++] = tmpl;
7479 /* This is a spill/fill, or other instruction that modifies the
7482 /* Unless we can determine the specific bits used, mark the whole
7483 thing; bits 8:3 of the memory address indicate the bit used in
7484 UNAT. The .mem.offset hint may be used to eliminate a small
7485 subset of conflicts. */
7486 specs[count] = tmpl;
7487 if (md.mem_offset.hint)
7490 fprintf (stderr, " Using hint for spill/fill\n");
7491 /* The index isn't actually used, just set it to something
7492 approximating the bit index. */
7493 specs[count].index = (md.mem_offset.offset >> 3) & 0x3F;
7494 specs[count].mem_offset.hint = 1;
7495 specs[count].mem_offset.offset = md.mem_offset.offset;
7496 specs[count++].mem_offset.base = md.mem_offset.base;
7500 specs[count++].specific = 0;
7508 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7510 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7511 if ((regno >= 8 && regno <= 15)
7512 || (regno >= 20 && regno <= 23)
7513 || (regno >= 31 && regno <= 39)
7514 || (regno >= 41 && regno <= 47)
7515 || (regno >= 67 && regno <= 111))
7517 specs[count] = tmpl;
7518 specs[count++].index = regno;
7531 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7533 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7534 if ((regno >= 48 && regno <= 63)
7535 || (regno >= 112 && regno <= 127))
7537 specs[count] = tmpl;
7538 specs[count++].index = regno;
7544 for (i = 48; i < 64; i++)
7546 specs[count] = tmpl;
7547 specs[count++].index = i;
7549 for (i = 112; i < 128; i++)
7551 specs[count] = tmpl;
7552 specs[count++].index = i;
7570 for (i = 0; i < idesc->num_outputs; i++)
7571 if (idesc->operands[i] == IA64_OPND_B1
7572 || idesc->operands[i] == IA64_OPND_B2)
7574 specs[count] = tmpl;
7575 specs[count++].index =
7576 CURR_SLOT.opnd[i].X_add_number - REG_BR;
7581 for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
7582 if (idesc->operands[i] == IA64_OPND_B1
7583 || idesc->operands[i] == IA64_OPND_B2)
7585 specs[count] = tmpl;
7586 specs[count++].index =
7587 CURR_SLOT.opnd[i].X_add_number - REG_BR;
7593 case IA64_RS_CPUID: /* four or more registers */
7596 if (idesc->operands[!rsrc_write] == IA64_OPND_CPUID_R3)
7598 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7599 if (regno >= 0 && regno < NELEMS (gr_values)
7602 specs[count] = tmpl;
7603 specs[count++].index = gr_values[regno].value & 0xFF;
7607 specs[count] = tmpl;
7608 specs[count++].specific = 0;
7618 case IA64_RS_DBR: /* four or more registers */
7621 if (idesc->operands[!rsrc_write] == IA64_OPND_DBR_R3)
7623 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7624 if (regno >= 0 && regno < NELEMS (gr_values)
7627 specs[count] = tmpl;
7628 specs[count++].index = gr_values[regno].value & 0xFF;
7632 specs[count] = tmpl;
7633 specs[count++].specific = 0;
7637 else if (note == 0 && !rsrc_write)
7639 specs[count] = tmpl;
7640 specs[count++].specific = 0;
7648 case IA64_RS_IBR: /* four or more registers */
7651 if (idesc->operands[!rsrc_write] == IA64_OPND_IBR_R3)
7653 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7654 if (regno >= 0 && regno < NELEMS (gr_values)
7657 specs[count] = tmpl;
7658 specs[count++].index = gr_values[regno].value & 0xFF;
7662 specs[count] = tmpl;
7663 specs[count++].specific = 0;
7676 /* These are implementation specific. Force all references to
7677 conflict with all other references. */
7678 specs[count] = tmpl;
7679 specs[count++].specific = 0;
7687 case IA64_RS_PKR: /* 16 or more registers */
7688 if (note == 3 || note == 4)
7690 if (idesc->operands[!rsrc_write] == IA64_OPND_PKR_R3)
7692 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7693 if (regno >= 0 && regno < NELEMS (gr_values)
7698 specs[count] = tmpl;
7699 specs[count++].index = gr_values[regno].value & 0xFF;
7702 for (i = 0; i < NELEMS (gr_values); i++)
7704 /* Uses all registers *except* the one in R3. */
7705 if ((unsigned)i != (gr_values[regno].value & 0xFF))
7707 specs[count] = tmpl;
7708 specs[count++].index = i;
7714 specs[count] = tmpl;
7715 specs[count++].specific = 0;
7722 specs[count] = tmpl;
7723 specs[count++].specific = 0;
7727 case IA64_RS_PMC: /* four or more registers */
7730 if (idesc->operands[!rsrc_write] == IA64_OPND_PMC_R3
7731 || (!rsrc_write && idesc->operands[1] == IA64_OPND_PMD_R3))
7734 int index = ((idesc->operands[1] == IA64_OPND_R3 && !rsrc_write)
7736 int regno = CURR_SLOT.opnd[index].X_add_number - REG_GR;
7737 if (regno >= 0 && regno < NELEMS (gr_values)
7740 specs[count] = tmpl;
7741 specs[count++].index = gr_values[regno].value & 0xFF;
7745 specs[count] = tmpl;
7746 specs[count++].specific = 0;
7756 case IA64_RS_PMD: /* four or more registers */
7759 if (idesc->operands[!rsrc_write] == IA64_OPND_PMD_R3)
7761 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7762 if (regno >= 0 && regno < NELEMS (gr_values)
7765 specs[count] = tmpl;
7766 specs[count++].index = gr_values[regno].value & 0xFF;
7770 specs[count] = tmpl;
7771 specs[count++].specific = 0;
7781 case IA64_RS_RR: /* eight registers */
7784 if (idesc->operands[!rsrc_write] == IA64_OPND_RR_R3)
7786 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
7787 if (regno >= 0 && regno < NELEMS (gr_values)
7790 specs[count] = tmpl;
7791 specs[count++].index = (gr_values[regno].value >> 61) & 0x7;
7795 specs[count] = tmpl;
7796 specs[count++].specific = 0;
7800 else if (note == 0 && !rsrc_write)
7802 specs[count] = tmpl;
7803 specs[count++].specific = 0;
7811 case IA64_RS_CR_IRR:
7814 /* handle mov-from-CR-IVR; it's a read that writes CR[IRR] */
7815 int regno = CURR_SLOT.opnd[1].X_add_number - REG_CR;
7817 && idesc->operands[1] == IA64_OPND_CR3
7820 for (i = 0; i < 4; i++)
7822 specs[count] = tmpl;
7823 specs[count++].index = CR_IRR0 + i;
7829 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
7830 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
7832 && regno <= CR_IRR3)
7834 specs[count] = tmpl;
7835 specs[count++].index = regno;
7844 case IA64_RS_CR_LRR:
7851 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
7852 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
7853 && (regno == CR_LRR0 || regno == CR_LRR1))
7855 specs[count] = tmpl;
7856 specs[count++].index = regno;
7864 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
7866 specs[count] = tmpl;
7867 specs[count++].index =
7868 CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
7883 else if (rsrc_write)
7885 if (dep->specifier == IA64_RS_FRb
7886 && idesc->operands[0] == IA64_OPND_F1)
7888 specs[count] = tmpl;
7889 specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_FR;
7894 for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
7896 if (idesc->operands[i] == IA64_OPND_F2
7897 || idesc->operands[i] == IA64_OPND_F3
7898 || idesc->operands[i] == IA64_OPND_F4)
7900 specs[count] = tmpl;
7901 specs[count++].index =
7902 CURR_SLOT.opnd[i].X_add_number - REG_FR;
7911 /* This reference applies only to the GR whose value is loaded with
7912 data returned from memory. */
7913 specs[count] = tmpl;
7914 specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_GR;
7920 for (i = 0; i < idesc->num_outputs; i++)
7921 if (idesc->operands[i] == IA64_OPND_R1
7922 || idesc->operands[i] == IA64_OPND_R2
7923 || idesc->operands[i] == IA64_OPND_R3)
7925 specs[count] = tmpl;
7926 specs[count++].index =
7927 CURR_SLOT.opnd[i].X_add_number - REG_GR;
7929 if (idesc->flags & IA64_OPCODE_POSTINC)
7930 for (i = 0; i < NELEMS (idesc->operands); i++)
7931 if (idesc->operands[i] == IA64_OPND_MR3)
7933 specs[count] = tmpl;
7934 specs[count++].index =
7935 CURR_SLOT.opnd[i].X_add_number - REG_GR;
7940 /* Look for anything that reads a GR. */
7941 for (i = 0; i < NELEMS (idesc->operands); i++)
7943 if (idesc->operands[i] == IA64_OPND_MR3
7944 || idesc->operands[i] == IA64_OPND_CPUID_R3
7945 || idesc->operands[i] == IA64_OPND_DBR_R3
7946 || idesc->operands[i] == IA64_OPND_IBR_R3
7947 || idesc->operands[i] == IA64_OPND_MSR_R3
7948 || idesc->operands[i] == IA64_OPND_PKR_R3
7949 || idesc->operands[i] == IA64_OPND_PMC_R3
7950 || idesc->operands[i] == IA64_OPND_PMD_R3
7951 || idesc->operands[i] == IA64_OPND_RR_R3
7952 || ((i >= idesc->num_outputs)
7953 && (idesc->operands[i] == IA64_OPND_R1
7954 || idesc->operands[i] == IA64_OPND_R2
7955 || idesc->operands[i] == IA64_OPND_R3
7956 /* addl source register. */
7957 || idesc->operands[i] == IA64_OPND_R3_2)))
7959 specs[count] = tmpl;
7960 specs[count++].index =
7961 CURR_SLOT.opnd[i].X_add_number - REG_GR;
7972 /* This is the same as IA64_RS_PRr, except that the register range is
7973 from 1 - 15, and there are no rotating register reads/writes here. */
7977 for (i = 1; i < 16; i++)
7979 specs[count] = tmpl;
7980 specs[count++].index = i;
7986 /* Mark only those registers indicated by the mask. */
7989 mask = CURR_SLOT.opnd[2].X_add_number;
7990 for (i = 1; i < 16; i++)
7991 if (mask & ((valueT) 1 << i))
7993 specs[count] = tmpl;
7994 specs[count++].index = i;
8002 else if (note == 11) /* note 11 implies note 1 as well */
8006 for (i = 0; i < idesc->num_outputs; i++)
8008 if (idesc->operands[i] == IA64_OPND_P1
8009 || idesc->operands[i] == IA64_OPND_P2)
8011 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8012 if (regno >= 1 && regno < 16)
8014 specs[count] = tmpl;
8015 specs[count++].index = regno;
8025 else if (note == 12)
8027 if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8029 specs[count] = tmpl;
8030 specs[count++].index = CURR_SLOT.qp_regno;
8037 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8038 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8039 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8040 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8042 if ((idesc->operands[0] == IA64_OPND_P1
8043 || idesc->operands[0] == IA64_OPND_P2)
8044 && p1 >= 1 && p1 < 16)
8046 specs[count] = tmpl;
8047 specs[count].cmp_type =
8048 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8049 specs[count++].index = p1;
8051 if ((idesc->operands[1] == IA64_OPND_P1
8052 || idesc->operands[1] == IA64_OPND_P2)
8053 && p2 >= 1 && p2 < 16)
8055 specs[count] = tmpl;
8056 specs[count].cmp_type =
8057 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8058 specs[count++].index = p2;
8063 if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8065 specs[count] = tmpl;
8066 specs[count++].index = CURR_SLOT.qp_regno;
8068 if (idesc->operands[1] == IA64_OPND_PR)
8070 for (i = 1; i < 16; i++)
8072 specs[count] = tmpl;
8073 specs[count++].index = i;
8084 /* This is the general case for PRs. IA64_RS_PR and IA64_RS_PR63 are
8085 simplified cases of this. */
8089 for (i = 16; i < 63; i++)
8091 specs[count] = tmpl;
8092 specs[count++].index = i;
8098 /* Mark only those registers indicated by the mask. */
8100 && idesc->operands[0] == IA64_OPND_PR)
8102 mask = CURR_SLOT.opnd[2].X_add_number;
8103 if (mask & ((valueT) 1 << 16))
8104 for (i = 16; i < 63; i++)
8106 specs[count] = tmpl;
8107 specs[count++].index = i;
8111 && idesc->operands[0] == IA64_OPND_PR_ROT)
8113 for (i = 16; i < 63; i++)
8115 specs[count] = tmpl;
8116 specs[count++].index = i;
8124 else if (note == 11) /* note 11 implies note 1 as well */
8128 for (i = 0; i < idesc->num_outputs; i++)
8130 if (idesc->operands[i] == IA64_OPND_P1
8131 || idesc->operands[i] == IA64_OPND_P2)
8133 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8134 if (regno >= 16 && regno < 63)
8136 specs[count] = tmpl;
8137 specs[count++].index = regno;
8147 else if (note == 12)
8149 if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8151 specs[count] = tmpl;
8152 specs[count++].index = CURR_SLOT.qp_regno;
8159 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8160 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8161 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8162 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8164 if ((idesc->operands[0] == IA64_OPND_P1
8165 || idesc->operands[0] == IA64_OPND_P2)
8166 && p1 >= 16 && p1 < 63)
8168 specs[count] = tmpl;
8169 specs[count].cmp_type =
8170 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8171 specs[count++].index = p1;
8173 if ((idesc->operands[1] == IA64_OPND_P1
8174 || idesc->operands[1] == IA64_OPND_P2)
8175 && p2 >= 16 && p2 < 63)
8177 specs[count] = tmpl;
8178 specs[count].cmp_type =
8179 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8180 specs[count++].index = p2;
8185 if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8187 specs[count] = tmpl;
8188 specs[count++].index = CURR_SLOT.qp_regno;
8190 if (idesc->operands[1] == IA64_OPND_PR)
8192 for (i = 16; i < 63; i++)
8194 specs[count] = tmpl;
8195 specs[count++].index = i;
8207 /* Verify that the instruction is using the PSR bit indicated in
8211 if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_UM)
8213 if (dep->regindex < 6)
8215 specs[count++] = tmpl;
8218 else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR)
8220 if (dep->regindex < 32
8221 || dep->regindex == 35
8222 || dep->regindex == 36
8223 || (!rsrc_write && dep->regindex == PSR_CPL))
8225 specs[count++] = tmpl;
8228 else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_L)
8230 if (dep->regindex < 32
8231 || dep->regindex == 35
8232 || dep->regindex == 36
8233 || (rsrc_write && dep->regindex == PSR_CPL))
8235 specs[count++] = tmpl;
8240 /* Several PSR bits have very specific dependencies. */
8241 switch (dep->regindex)
8244 specs[count++] = tmpl;
8249 specs[count++] = tmpl;
8253 /* Only certain CR accesses use PSR.ic */
8254 if (idesc->operands[0] == IA64_OPND_CR3
8255 || idesc->operands[1] == IA64_OPND_CR3)
8258 ((idesc->operands[0] == IA64_OPND_CR3)
8261 CURR_SLOT.opnd[index].X_add_number - REG_CR;
8276 specs[count++] = tmpl;
8285 specs[count++] = tmpl;
8289 /* Only some AR accesses use cpl */
8290 if (idesc->operands[0] == IA64_OPND_AR3
8291 || idesc->operands[1] == IA64_OPND_AR3)
8294 ((idesc->operands[0] == IA64_OPND_AR3)
8297 CURR_SLOT.opnd[index].X_add_number - REG_AR;
8304 && regno <= AR_K7))))
8306 specs[count++] = tmpl;
8311 specs[count++] = tmpl;
8321 if (idesc->operands[0] == IA64_OPND_IMMU24)
8323 mask = CURR_SLOT.opnd[0].X_add_number;
8329 if (mask & ((valueT) 1 << dep->regindex))
8331 specs[count++] = tmpl;
8336 int min = dep->regindex == PSR_DFL ? 2 : 32;
8337 int max = dep->regindex == PSR_DFL ? 31 : 127;
8338 /* dfh is read on FR32-127; dfl is read on FR2-31 */
8339 for (i = 0; i < NELEMS (idesc->operands); i++)
8341 if (idesc->operands[i] == IA64_OPND_F1
8342 || idesc->operands[i] == IA64_OPND_F2
8343 || idesc->operands[i] == IA64_OPND_F3
8344 || idesc->operands[i] == IA64_OPND_F4)
8346 int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8347 if (reg >= min && reg <= max)
8349 specs[count++] = tmpl;
8356 int min = dep->regindex == PSR_MFL ? 2 : 32;
8357 int max = dep->regindex == PSR_MFL ? 31 : 127;
8358 /* mfh is read on writes to FR32-127; mfl is read on writes to
8360 for (i = 0; i < idesc->num_outputs; i++)
8362 if (idesc->operands[i] == IA64_OPND_F1)
8364 int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8365 if (reg >= min && reg <= max)
8367 specs[count++] = tmpl;
8372 else if (note == 10)
8374 for (i = 0; i < NELEMS (idesc->operands); i++)
8376 if (idesc->operands[i] == IA64_OPND_R1
8377 || idesc->operands[i] == IA64_OPND_R2
8378 || idesc->operands[i] == IA64_OPND_R3)
8380 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8381 if (regno >= 16 && regno <= 31)
8383 specs[count++] = tmpl;
8394 case IA64_RS_AR_FPSR:
8395 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8397 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8398 if (regno == AR_FPSR)
8400 specs[count++] = tmpl;
8405 specs[count++] = tmpl;
8410 /* Handle all AR[REG] resources */
8411 if (note == 0 || note == 1)
8413 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8414 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3
8415 && regno == dep->regindex)
8417 specs[count++] = tmpl;
8419 /* other AR[REG] resources may be affected by AR accesses */
8420 else if (idesc->operands[0] == IA64_OPND_AR3)
8423 regno = CURR_SLOT.opnd[0].X_add_number - REG_AR;
8424 switch (dep->regindex)
8430 if (regno == AR_BSPSTORE)
8432 specs[count++] = tmpl;
8436 (regno == AR_BSPSTORE
8437 || regno == AR_RNAT))
8439 specs[count++] = tmpl;
8444 else if (idesc->operands[1] == IA64_OPND_AR3)
8447 regno = CURR_SLOT.opnd[1].X_add_number - REG_AR;
8448 switch (dep->regindex)
8453 if (regno == AR_BSPSTORE || regno == AR_RNAT)
8455 specs[count++] = tmpl;
8462 specs[count++] = tmpl;
8472 /* Handle all CR[REG] resources */
8473 if (note == 0 || note == 1)
8475 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8477 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8478 if (regno == dep->regindex)
8480 specs[count++] = tmpl;
8482 else if (!rsrc_write)
8484 /* Reads from CR[IVR] affect other resources. */
8485 if (regno == CR_IVR)
8487 if ((dep->regindex >= CR_IRR0
8488 && dep->regindex <= CR_IRR3)
8489 || dep->regindex == CR_TPR)
8491 specs[count++] = tmpl;
8498 specs[count++] = tmpl;
8507 case IA64_RS_INSERVICE:
8508 /* look for write of EOI (67) or read of IVR (65) */
8509 if ((idesc->operands[0] == IA64_OPND_CR3
8510 && CURR_SLOT.opnd[0].X_add_number - REG_CR == CR_EOI)
8511 || (idesc->operands[1] == IA64_OPND_CR3
8512 && CURR_SLOT.opnd[1].X_add_number - REG_CR == CR_IVR))
8514 specs[count++] = tmpl;
8521 specs[count++] = tmpl;
8532 specs[count++] = tmpl;
8536 /* Check if any of the registers accessed are in the rotating region.
8537 mov to/from pr accesses CFM only when qp_regno is in the rotating
8539 for (i = 0; i < NELEMS (idesc->operands); i++)
8541 if (idesc->operands[i] == IA64_OPND_R1
8542 || idesc->operands[i] == IA64_OPND_R2
8543 || idesc->operands[i] == IA64_OPND_R3)
8545 int num = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8546 /* Assumes that md.rot.num_regs is always valid */
8547 if (md.rot.num_regs > 0
8549 && num < 31 + md.rot.num_regs)
8551 specs[count] = tmpl;
8552 specs[count++].specific = 0;
8555 else if (idesc->operands[i] == IA64_OPND_F1
8556 || idesc->operands[i] == IA64_OPND_F2
8557 || idesc->operands[i] == IA64_OPND_F3
8558 || idesc->operands[i] == IA64_OPND_F4)
8560 int num = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8563 specs[count] = tmpl;
8564 specs[count++].specific = 0;
8567 else if (idesc->operands[i] == IA64_OPND_P1
8568 || idesc->operands[i] == IA64_OPND_P2)
8570 int num = CURR_SLOT.opnd[i].X_add_number - REG_P;
8573 specs[count] = tmpl;
8574 specs[count++].specific = 0;
8578 if (CURR_SLOT.qp_regno > 15)
8580 specs[count] = tmpl;
8581 specs[count++].specific = 0;
8586 /* This is the same as IA64_RS_PRr, except simplified to account for
8587 the fact that there is only one register. */
8591 specs[count++] = tmpl;
8596 if (idesc->operands[2] == IA64_OPND_IMM17)
8597 mask = CURR_SLOT.opnd[2].X_add_number;
8598 if (mask & ((valueT) 1 << 63))
8599 specs[count++] = tmpl;
8601 else if (note == 11)
8603 if ((idesc->operands[0] == IA64_OPND_P1
8604 && CURR_SLOT.opnd[0].X_add_number - REG_P == 63)
8605 || (idesc->operands[1] == IA64_OPND_P2
8606 && CURR_SLOT.opnd[1].X_add_number - REG_P == 63))
8608 specs[count++] = tmpl;
8611 else if (note == 12)
8613 if (CURR_SLOT.qp_regno == 63)
8615 specs[count++] = tmpl;
8622 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8623 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8624 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8625 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8628 && (idesc->operands[0] == IA64_OPND_P1
8629 || idesc->operands[0] == IA64_OPND_P2))
8631 specs[count] = tmpl;
8632 specs[count++].cmp_type =
8633 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8636 && (idesc->operands[1] == IA64_OPND_P1
8637 || idesc->operands[1] == IA64_OPND_P2))
8639 specs[count] = tmpl;
8640 specs[count++].cmp_type =
8641 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8646 if (CURR_SLOT.qp_regno == 63)
8648 specs[count++] = tmpl;
8659 /* FIXME we can identify some individual RSE written resources, but RSE
8660 read resources have not yet been completely identified, so for now
8661 treat RSE as a single resource */
8662 if (strncmp (idesc->name, "mov", 3) == 0)
8666 if (idesc->operands[0] == IA64_OPND_AR3
8667 && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE)
8669 specs[count] = tmpl;
8670 specs[count++].index = 0; /* IA64_RSE_BSPLOAD/RNATBITINDEX */
8675 if (idesc->operands[0] == IA64_OPND_AR3)
8677 if (CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE
8678 || CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_RNAT)
8680 specs[count++] = tmpl;
8683 else if (idesc->operands[1] == IA64_OPND_AR3)
8685 if (CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSP
8686 || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSPSTORE
8687 || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_RNAT)
8689 specs[count++] = tmpl;
8696 specs[count++] = tmpl;
8701 /* FIXME -- do any of these need to be non-specific? */
8702 specs[count++] = tmpl;
8706 as_bad (_("Unrecognized dependency specifier %d\n"), dep->specifier);
8713 /* Clear branch flags on marked resources. This breaks the link between the
8714 QP of the marking instruction and a subsequent branch on the same QP. */
8717 clear_qp_branch_flag (mask)
8721 for (i = 0; i < regdepslen; i++)
8723 valueT bit = ((valueT) 1 << regdeps[i].qp_regno);
8724 if ((bit & mask) != 0)
8726 regdeps[i].link_to_qp_branch = 0;
8731 /* MASK contains 2 and only 2 PRs which are mutually exclusive. Remove
8732 any mutexes which contain one of the PRs and create new ones when
8736 update_qp_mutex (valueT mask)
8742 while (i < qp_mutexeslen)
8744 if ((qp_mutexes[i].prmask & mask) != 0)
8746 /* If it destroys and creates the same mutex, do nothing. */
8747 if (qp_mutexes[i].prmask == mask
8748 && qp_mutexes[i].path == md.path)
8759 fprintf (stderr, " Clearing mutex relation");
8760 print_prmask (qp_mutexes[i].prmask);
8761 fprintf (stderr, "\n");
8764 /* Deal with the old mutex with more than 3+ PRs only if
8765 the new mutex on the same execution path with it.
8767 FIXME: The 3+ mutex support is incomplete.
8768 dot_pred_rel () may be a better place to fix it. */
8769 if (qp_mutexes[i].path == md.path)
8771 /* If it is a proper subset of the mutex, create a
8774 && (qp_mutexes[i].prmask & mask) == mask)
8777 qp_mutexes[i].prmask &= ~mask;
8778 if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
8780 /* Modify the mutex if there are more than one
8788 /* Remove the mutex. */
8789 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
8797 add_qp_mutex (mask);
8802 /* Remove any mutexes which contain any of the PRs indicated in the mask.
8804 Any changes to a PR clears the mutex relations which include that PR. */
8807 clear_qp_mutex (mask)
8813 while (i < qp_mutexeslen)
8815 if ((qp_mutexes[i].prmask & mask) != 0)
8819 fprintf (stderr, " Clearing mutex relation");
8820 print_prmask (qp_mutexes[i].prmask);
8821 fprintf (stderr, "\n");
8823 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
8830 /* Clear implies relations which contain PRs in the given masks.
8831 P1_MASK indicates the source of the implies relation, while P2_MASK
8832 indicates the implied PR. */
8835 clear_qp_implies (p1_mask, p2_mask)
8842 while (i < qp_implieslen)
8844 if ((((valueT) 1 << qp_implies[i].p1) & p1_mask) != 0
8845 || (((valueT) 1 << qp_implies[i].p2) & p2_mask) != 0)
8848 fprintf (stderr, "Clearing implied relation PR%d->PR%d\n",
8849 qp_implies[i].p1, qp_implies[i].p2);
8850 qp_implies[i] = qp_implies[--qp_implieslen];
8857 /* Add the PRs specified to the list of implied relations. */
8860 add_qp_imply (p1, p2)
8867 /* p0 is not meaningful here. */
8868 if (p1 == 0 || p2 == 0)
8874 /* If it exists already, ignore it. */
8875 for (i = 0; i < qp_implieslen; i++)
8877 if (qp_implies[i].p1 == p1
8878 && qp_implies[i].p2 == p2
8879 && qp_implies[i].path == md.path
8880 && !qp_implies[i].p2_branched)
8884 if (qp_implieslen == qp_impliestotlen)
8886 qp_impliestotlen += 20;
8887 qp_implies = (struct qp_imply *)
8888 xrealloc ((void *) qp_implies,
8889 qp_impliestotlen * sizeof (struct qp_imply));
8892 fprintf (stderr, " Registering PR%d implies PR%d\n", p1, p2);
8893 qp_implies[qp_implieslen].p1 = p1;
8894 qp_implies[qp_implieslen].p2 = p2;
8895 qp_implies[qp_implieslen].path = md.path;
8896 qp_implies[qp_implieslen++].p2_branched = 0;
8898 /* Add in the implied transitive relations; for everything that p2 implies,
8899 make p1 imply that, too; for everything that implies p1, make it imply p2
8901 for (i = 0; i < qp_implieslen; i++)
8903 if (qp_implies[i].p1 == p2)
8904 add_qp_imply (p1, qp_implies[i].p2);
8905 if (qp_implies[i].p2 == p1)
8906 add_qp_imply (qp_implies[i].p1, p2);
8908 /* Add in mutex relations implied by this implies relation; for each mutex
8909 relation containing p2, duplicate it and replace p2 with p1. */
8910 bit = (valueT) 1 << p1;
8911 mask = (valueT) 1 << p2;
8912 for (i = 0; i < qp_mutexeslen; i++)
8914 if (qp_mutexes[i].prmask & mask)
8915 add_qp_mutex ((qp_mutexes[i].prmask & ~mask) | bit);
8919 /* Add the PRs specified in the mask to the mutex list; this means that only
8920 one of the PRs can be true at any time. PR0 should never be included in
8930 if (qp_mutexeslen == qp_mutexestotlen)
8932 qp_mutexestotlen += 20;
8933 qp_mutexes = (struct qpmutex *)
8934 xrealloc ((void *) qp_mutexes,
8935 qp_mutexestotlen * sizeof (struct qpmutex));
8939 fprintf (stderr, " Registering mutex on");
8940 print_prmask (mask);
8941 fprintf (stderr, "\n");
8943 qp_mutexes[qp_mutexeslen].path = md.path;
8944 qp_mutexes[qp_mutexeslen++].prmask = mask;
8948 has_suffix_p (name, suffix)
8952 size_t namelen = strlen (name);
8953 size_t sufflen = strlen (suffix);
8955 if (namelen <= sufflen)
8957 return strcmp (name + namelen - sufflen, suffix) == 0;
8961 clear_register_values ()
8965 fprintf (stderr, " Clearing register values\n");
8966 for (i = 1; i < NELEMS (gr_values); i++)
8967 gr_values[i].known = 0;
8970 /* Keep track of register values/changes which affect DV tracking.
8972 optimization note: should add a flag to classes of insns where otherwise we
8973 have to examine a group of strings to identify them. */
8976 note_register_values (idesc)
8977 struct ia64_opcode *idesc;
8979 valueT qp_changemask = 0;
8982 /* Invalidate values for registers being written to. */
8983 for (i = 0; i < idesc->num_outputs; i++)
8985 if (idesc->operands[i] == IA64_OPND_R1
8986 || idesc->operands[i] == IA64_OPND_R2
8987 || idesc->operands[i] == IA64_OPND_R3)
8989 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8990 if (regno > 0 && regno < NELEMS (gr_values))
8991 gr_values[regno].known = 0;
8993 else if (idesc->operands[i] == IA64_OPND_R3_2)
8995 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8996 if (regno > 0 && regno < 4)
8997 gr_values[regno].known = 0;
8999 else if (idesc->operands[i] == IA64_OPND_P1
9000 || idesc->operands[i] == IA64_OPND_P2)
9002 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
9003 qp_changemask |= (valueT) 1 << regno;
9005 else if (idesc->operands[i] == IA64_OPND_PR)
9007 if (idesc->operands[2] & (valueT) 0x10000)
9008 qp_changemask = ~(valueT) 0x1FFFF | idesc->operands[2];
9010 qp_changemask = idesc->operands[2];
9013 else if (idesc->operands[i] == IA64_OPND_PR_ROT)
9015 if (idesc->operands[1] & ((valueT) 1 << 43))
9016 qp_changemask = -((valueT) 1 << 44) | idesc->operands[1];
9018 qp_changemask = idesc->operands[1];
9019 qp_changemask &= ~(valueT) 0xFFFF;
9024 /* Always clear qp branch flags on any PR change. */
9025 /* FIXME there may be exceptions for certain compares. */
9026 clear_qp_branch_flag (qp_changemask);
9028 /* Invalidate rotating registers on insns which affect RRBs in CFM. */
9029 if (idesc->flags & IA64_OPCODE_MOD_RRBS)
9031 qp_changemask |= ~(valueT) 0xFFFF;
9032 if (strcmp (idesc->name, "clrrrb.pr") != 0)
9034 for (i = 32; i < 32 + md.rot.num_regs; i++)
9035 gr_values[i].known = 0;
9037 clear_qp_mutex (qp_changemask);
9038 clear_qp_implies (qp_changemask, qp_changemask);
9040 /* After a call, all register values are undefined, except those marked
9042 else if (strncmp (idesc->name, "br.call", 6) == 0
9043 || strncmp (idesc->name, "brl.call", 7) == 0)
9045 /* FIXME keep GR values which are marked as "safe_across_calls" */
9046 clear_register_values ();
9047 clear_qp_mutex (~qp_safe_across_calls);
9048 clear_qp_implies (~qp_safe_across_calls, ~qp_safe_across_calls);
9049 clear_qp_branch_flag (~qp_safe_across_calls);
9051 else if (is_interruption_or_rfi (idesc)
9052 || is_taken_branch (idesc))
9054 clear_register_values ();
9055 clear_qp_mutex (~(valueT) 0);
9056 clear_qp_implies (~(valueT) 0, ~(valueT) 0);
9058 /* Look for mutex and implies relations. */
9059 else if ((idesc->operands[0] == IA64_OPND_P1
9060 || idesc->operands[0] == IA64_OPND_P2)
9061 && (idesc->operands[1] == IA64_OPND_P1
9062 || idesc->operands[1] == IA64_OPND_P2))
9064 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9065 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9066 valueT p1mask = (p1 != 0) ? (valueT) 1 << p1 : 0;
9067 valueT p2mask = (p2 != 0) ? (valueT) 1 << p2 : 0;
9069 /* If both PRs are PR0, we can't really do anything. */
9070 if (p1 == 0 && p2 == 0)
9073 fprintf (stderr, " Ignoring PRs due to inclusion of p0\n");
9075 /* In general, clear mutexes and implies which include P1 or P2,
9076 with the following exceptions. */
9077 else if (has_suffix_p (idesc->name, ".or.andcm")
9078 || has_suffix_p (idesc->name, ".and.orcm"))
9080 clear_qp_implies (p2mask, p1mask);
9082 else if (has_suffix_p (idesc->name, ".andcm")
9083 || has_suffix_p (idesc->name, ".and"))
9085 clear_qp_implies (0, p1mask | p2mask);
9087 else if (has_suffix_p (idesc->name, ".orcm")
9088 || has_suffix_p (idesc->name, ".or"))
9090 clear_qp_mutex (p1mask | p2mask);
9091 clear_qp_implies (p1mask | p2mask, 0);
9097 clear_qp_implies (p1mask | p2mask, p1mask | p2mask);
9099 /* If one of the PRs is PR0, we call clear_qp_mutex. */
9100 if (p1 == 0 || p2 == 0)
9101 clear_qp_mutex (p1mask | p2mask);
9103 added = update_qp_mutex (p1mask | p2mask);
9105 if (CURR_SLOT.qp_regno == 0
9106 || has_suffix_p (idesc->name, ".unc"))
9108 if (added == 0 && p1 && p2)
9109 add_qp_mutex (p1mask | p2mask);
9110 if (CURR_SLOT.qp_regno != 0)
9113 add_qp_imply (p1, CURR_SLOT.qp_regno);
9115 add_qp_imply (p2, CURR_SLOT.qp_regno);
9120 /* Look for mov imm insns into GRs. */
9121 else if (idesc->operands[0] == IA64_OPND_R1
9122 && (idesc->operands[1] == IA64_OPND_IMM22
9123 || idesc->operands[1] == IA64_OPND_IMMU64)
9124 && (strcmp (idesc->name, "mov") == 0
9125 || strcmp (idesc->name, "movl") == 0))
9127 int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
9128 if (regno > 0 && regno < NELEMS (gr_values))
9130 gr_values[regno].known = 1;
9131 gr_values[regno].value = CURR_SLOT.opnd[1].X_add_number;
9132 gr_values[regno].path = md.path;
9135 fprintf (stderr, " Know gr%d = ", regno);
9136 fprintf_vma (stderr, gr_values[regno].value);
9137 fputs ("\n", stderr);
9143 clear_qp_mutex (qp_changemask);
9144 clear_qp_implies (qp_changemask, qp_changemask);
9148 /* Return whether the given predicate registers are currently mutex. */
9151 qp_mutex (p1, p2, path)
9161 mask = ((valueT) 1 << p1) | (valueT) 1 << p2;
9162 for (i = 0; i < qp_mutexeslen; i++)
9164 if (qp_mutexes[i].path >= path
9165 && (qp_mutexes[i].prmask & mask) == mask)
9172 /* Return whether the given resource is in the given insn's list of chks
9173 Return 1 if the conflict is absolutely determined, 2 if it's a potential
9177 resources_match (rs, idesc, note, qp_regno, path)
9179 struct ia64_opcode *idesc;
9184 struct rsrc specs[MAX_SPECS];
9187 /* If the marked resource's qp_regno and the given qp_regno are mutex,
9188 we don't need to check. One exception is note 11, which indicates that
9189 target predicates are written regardless of PR[qp]. */
9190 if (qp_mutex (rs->qp_regno, qp_regno, path)
9194 count = specify_resource (rs->dependency, idesc, DV_CHK, specs, note, path);
9197 /* UNAT checking is a bit more specific than other resources */
9198 if (rs->dependency->specifier == IA64_RS_AR_UNAT
9199 && specs[count].mem_offset.hint
9200 && rs->mem_offset.hint)
9202 if (rs->mem_offset.base == specs[count].mem_offset.base)
9204 if (((rs->mem_offset.offset >> 3) & 0x3F) ==
9205 ((specs[count].mem_offset.offset >> 3) & 0x3F))
9212 /* Skip apparent PR write conflicts where both writes are an AND or both
9213 writes are an OR. */
9214 if (rs->dependency->specifier == IA64_RS_PR
9215 || rs->dependency->specifier == IA64_RS_PRr
9216 || rs->dependency->specifier == IA64_RS_PR63)
9218 if (specs[count].cmp_type != CMP_NONE
9219 && specs[count].cmp_type == rs->cmp_type)
9222 fprintf (stderr, " %s on parallel compare allowed (PR%d)\n",
9223 dv_mode[rs->dependency->mode],
9224 rs->dependency->specifier != IA64_RS_PR63 ?
9225 specs[count].index : 63);
9230 " %s on parallel compare conflict %s vs %s on PR%d\n",
9231 dv_mode[rs->dependency->mode],
9232 dv_cmp_type[rs->cmp_type],
9233 dv_cmp_type[specs[count].cmp_type],
9234 rs->dependency->specifier != IA64_RS_PR63 ?
9235 specs[count].index : 63);
9239 /* If either resource is not specific, conservatively assume a conflict
9241 if (!specs[count].specific || !rs->specific)
9243 else if (specs[count].index == rs->index)
9248 fprintf (stderr, " No %s conflicts\n", rs->dependency->name);
9254 /* Indicate an instruction group break; if INSERT_STOP is non-zero, then
9255 insert a stop to create the break. Update all resource dependencies
9256 appropriately. If QP_REGNO is non-zero, only apply the break to resources
9257 which use the same QP_REGNO and have the link_to_qp_branch flag set.
9258 If SAVE_CURRENT is non-zero, don't affect resources marked by the current
9262 insn_group_break (insert_stop, qp_regno, save_current)
9269 if (insert_stop && md.num_slots_in_use > 0)
9270 PREV_SLOT.end_of_insn_group = 1;
9274 fprintf (stderr, " Insn group break%s",
9275 (insert_stop ? " (w/stop)" : ""));
9277 fprintf (stderr, " effective for QP=%d", qp_regno);
9278 fprintf (stderr, "\n");
9282 while (i < regdepslen)
9284 const struct ia64_dependency *dep = regdeps[i].dependency;
9287 && regdeps[i].qp_regno != qp_regno)
9294 && CURR_SLOT.src_file == regdeps[i].file
9295 && CURR_SLOT.src_line == regdeps[i].line)
9301 /* clear dependencies which are automatically cleared by a stop, or
9302 those that have reached the appropriate state of insn serialization */
9303 if (dep->semantics == IA64_DVS_IMPLIED
9304 || dep->semantics == IA64_DVS_IMPLIEDF
9305 || regdeps[i].insn_srlz == STATE_SRLZ)
9307 print_dependency ("Removing", i);
9308 regdeps[i] = regdeps[--regdepslen];
9312 if (dep->semantics == IA64_DVS_DATA
9313 || dep->semantics == IA64_DVS_INSTR
9314 || dep->semantics == IA64_DVS_SPECIFIC)
9316 if (regdeps[i].insn_srlz == STATE_NONE)
9317 regdeps[i].insn_srlz = STATE_STOP;
9318 if (regdeps[i].data_srlz == STATE_NONE)
9319 regdeps[i].data_srlz = STATE_STOP;
9326 /* Add the given resource usage spec to the list of active dependencies. */
9329 mark_resource (idesc, dep, spec, depind, path)
9330 struct ia64_opcode *idesc ATTRIBUTE_UNUSED;
9331 const struct ia64_dependency *dep ATTRIBUTE_UNUSED;
9336 if (regdepslen == regdepstotlen)
9338 regdepstotlen += 20;
9339 regdeps = (struct rsrc *)
9340 xrealloc ((void *) regdeps,
9341 regdepstotlen * sizeof (struct rsrc));
9344 regdeps[regdepslen] = *spec;
9345 regdeps[regdepslen].depind = depind;
9346 regdeps[regdepslen].path = path;
9347 regdeps[regdepslen].file = CURR_SLOT.src_file;
9348 regdeps[regdepslen].line = CURR_SLOT.src_line;
9350 print_dependency ("Adding", regdepslen);
9356 print_dependency (action, depind)
9362 fprintf (stderr, " %s %s '%s'",
9363 action, dv_mode[(regdeps[depind].dependency)->mode],
9364 (regdeps[depind].dependency)->name);
9365 if (regdeps[depind].specific && regdeps[depind].index != 0)
9366 fprintf (stderr, " (%d)", regdeps[depind].index);
9367 if (regdeps[depind].mem_offset.hint)
9369 fputs (" ", stderr);
9370 fprintf_vma (stderr, regdeps[depind].mem_offset.base);
9371 fputs ("+", stderr);
9372 fprintf_vma (stderr, regdeps[depind].mem_offset.offset);
9374 fprintf (stderr, "\n");
9379 instruction_serialization ()
9383 fprintf (stderr, " Instruction serialization\n");
9384 for (i = 0; i < regdepslen; i++)
9385 if (regdeps[i].insn_srlz == STATE_STOP)
9386 regdeps[i].insn_srlz = STATE_SRLZ;
9390 data_serialization ()
9394 fprintf (stderr, " Data serialization\n");
9395 while (i < regdepslen)
9397 if (regdeps[i].data_srlz == STATE_STOP
9398 /* Note: as of 991210, all "other" dependencies are cleared by a
9399 data serialization. This might change with new tables */
9400 || (regdeps[i].dependency)->semantics == IA64_DVS_OTHER)
9402 print_dependency ("Removing", i);
9403 regdeps[i] = regdeps[--regdepslen];
9410 /* Insert stops and serializations as needed to avoid DVs. */
9413 remove_marked_resource (rs)
9416 switch (rs->dependency->semantics)
9418 case IA64_DVS_SPECIFIC:
9420 fprintf (stderr, "Implementation-specific, assume worst case...\n");
9421 /* ...fall through... */
9422 case IA64_DVS_INSTR:
9424 fprintf (stderr, "Inserting instr serialization\n");
9425 if (rs->insn_srlz < STATE_STOP)
9426 insn_group_break (1, 0, 0);
9427 if (rs->insn_srlz < STATE_SRLZ)
9429 int oldqp = CURR_SLOT.qp_regno;
9430 struct ia64_opcode *oldidesc = CURR_SLOT.idesc;
9431 /* Manually jam a srlz.i insn into the stream */
9432 CURR_SLOT.qp_regno = 0;
9433 CURR_SLOT.idesc = ia64_find_opcode ("srlz.i");
9434 instruction_serialization ();
9435 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9436 if (++md.num_slots_in_use >= NUM_SLOTS)
9438 CURR_SLOT.qp_regno = oldqp;
9439 CURR_SLOT.idesc = oldidesc;
9441 insn_group_break (1, 0, 0);
9443 case IA64_DVS_OTHER: /* as of rev2 (991220) of the DV tables, all
9444 "other" types of DV are eliminated
9445 by a data serialization */
9448 fprintf (stderr, "Inserting data serialization\n");
9449 if (rs->data_srlz < STATE_STOP)
9450 insn_group_break (1, 0, 0);
9452 int oldqp = CURR_SLOT.qp_regno;
9453 struct ia64_opcode *oldidesc = CURR_SLOT.idesc;
9454 /* Manually jam a srlz.d insn into the stream */
9455 CURR_SLOT.qp_regno = 0;
9456 CURR_SLOT.idesc = ia64_find_opcode ("srlz.d");
9457 data_serialization ();
9458 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9459 if (++md.num_slots_in_use >= NUM_SLOTS)
9461 CURR_SLOT.qp_regno = oldqp;
9462 CURR_SLOT.idesc = oldidesc;
9465 case IA64_DVS_IMPLIED:
9466 case IA64_DVS_IMPLIEDF:
9468 fprintf (stderr, "Inserting stop\n");
9469 insn_group_break (1, 0, 0);
9476 /* Check the resources used by the given opcode against the current dependency
9479 The check is run once for each execution path encountered. In this case,
9480 a unique execution path is the sequence of instructions following a code
9481 entry point, e.g. the following has three execution paths, one starting
9482 at L0, one at L1, and one at L2.
9491 check_dependencies (idesc)
9492 struct ia64_opcode *idesc;
9494 const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
9498 /* Note that the number of marked resources may change within the
9499 loop if in auto mode. */
9501 while (i < regdepslen)
9503 struct rsrc *rs = ®deps[i];
9504 const struct ia64_dependency *dep = rs->dependency;
9509 if (dep->semantics == IA64_DVS_NONE
9510 || (chkind = depends_on (rs->depind, idesc)) == -1)
9516 note = NOTE (opdeps->chks[chkind]);
9518 /* Check this resource against each execution path seen thus far. */
9519 for (path = 0; path <= md.path; path++)
9523 /* If the dependency wasn't on the path being checked, ignore it. */
9524 if (rs->path < path)
9527 /* If the QP for this insn implies a QP which has branched, don't
9528 bother checking. Ed. NOTE: I don't think this check is terribly
9529 useful; what's the point of generating code which will only be
9530 reached if its QP is zero?
9531 This code was specifically inserted to handle the following code,
9532 based on notes from Intel's DV checking code, where p1 implies p2.
9538 if (CURR_SLOT.qp_regno != 0)
9542 for (implies = 0; implies < qp_implieslen; implies++)
9544 if (qp_implies[implies].path >= path
9545 && qp_implies[implies].p1 == CURR_SLOT.qp_regno
9546 && qp_implies[implies].p2_branched)
9556 if ((matchtype = resources_match (rs, idesc, note,
9557 CURR_SLOT.qp_regno, path)) != 0)
9560 char pathmsg[256] = "";
9561 char indexmsg[256] = "";
9562 int certain = (matchtype == 1 && CURR_SLOT.qp_regno == 0);
9565 sprintf (pathmsg, " when entry is at label '%s'",
9566 md.entry_labels[path - 1]);
9567 if (rs->specific && rs->index != 0)
9568 sprintf (indexmsg, ", specific resource number is %d",
9570 sprintf (msg, "Use of '%s' %s %s dependency '%s' (%s)%s%s",
9572 (certain ? "violates" : "may violate"),
9573 dv_mode[dep->mode], dep->name,
9574 dv_sem[dep->semantics],
9577 if (md.explicit_mode)
9579 as_warn ("%s", msg);
9581 as_warn (_("Only the first path encountering the conflict "
9583 as_warn_where (rs->file, rs->line,
9584 _("This is the location of the "
9585 "conflicting usage"));
9586 /* Don't bother checking other paths, to avoid duplicating
9593 fprintf (stderr, "%s @ %s:%d\n", msg, rs->file, rs->line);
9595 remove_marked_resource (rs);
9597 /* since the set of dependencies has changed, start over */
9598 /* FIXME -- since we're removing dvs as we go, we
9599 probably don't really need to start over... */
9612 /* Register new dependencies based on the given opcode. */
9615 mark_resources (idesc)
9616 struct ia64_opcode *idesc;
9619 const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
9620 int add_only_qp_reads = 0;
9622 /* A conditional branch only uses its resources if it is taken; if it is
9623 taken, we stop following that path. The other branch types effectively
9624 *always* write their resources. If it's not taken, register only QP
9626 if (is_conditional_branch (idesc) || is_interruption_or_rfi (idesc))
9628 add_only_qp_reads = 1;
9632 fprintf (stderr, "Registering '%s' resource usage\n", idesc->name);
9634 for (i = 0; i < opdeps->nregs; i++)
9636 const struct ia64_dependency *dep;
9637 struct rsrc specs[MAX_SPECS];
9642 dep = ia64_find_dependency (opdeps->regs[i]);
9643 note = NOTE (opdeps->regs[i]);
9645 if (add_only_qp_reads
9646 && !(dep->mode == IA64_DV_WAR
9647 && (dep->specifier == IA64_RS_PR
9648 || dep->specifier == IA64_RS_PRr
9649 || dep->specifier == IA64_RS_PR63)))
9652 count = specify_resource (dep, idesc, DV_REG, specs, note, md.path);
9655 if (md.debug_dv && !count)
9656 fprintf (stderr, " No %s %s usage found (path %d)\n",
9657 dv_mode[dep->mode], dep->name, md.path);
9662 mark_resource (idesc, dep, &specs[count],
9663 DEP (opdeps->regs[i]), md.path);
9666 /* The execution path may affect register values, which may in turn
9667 affect which indirect-access resources are accessed. */
9668 switch (dep->specifier)
9680 for (path = 0; path < md.path; path++)
9682 count = specify_resource (dep, idesc, DV_REG, specs, note, path);
9684 mark_resource (idesc, dep, &specs[count],
9685 DEP (opdeps->regs[i]), path);
9692 /* Remove dependencies when they no longer apply. */
9695 update_dependencies (idesc)
9696 struct ia64_opcode *idesc;
9700 if (strcmp (idesc->name, "srlz.i") == 0)
9702 instruction_serialization ();
9704 else if (strcmp (idesc->name, "srlz.d") == 0)
9706 data_serialization ();
9708 else if (is_interruption_or_rfi (idesc)
9709 || is_taken_branch (idesc))
9711 /* Although technically the taken branch doesn't clear dependencies
9712 which require a srlz.[id], we don't follow the branch; the next
9713 instruction is assumed to start with a clean slate. */
9717 else if (is_conditional_branch (idesc)
9718 && CURR_SLOT.qp_regno != 0)
9720 int is_call = strstr (idesc->name, ".call") != NULL;
9722 for (i = 0; i < qp_implieslen; i++)
9724 /* If the conditional branch's predicate is implied by the predicate
9725 in an existing dependency, remove that dependency. */
9726 if (qp_implies[i].p2 == CURR_SLOT.qp_regno)
9729 /* Note that this implied predicate takes a branch so that if
9730 a later insn generates a DV but its predicate implies this
9731 one, we can avoid the false DV warning. */
9732 qp_implies[i].p2_branched = 1;
9733 while (depind < regdepslen)
9735 if (regdeps[depind].qp_regno == qp_implies[i].p1)
9737 print_dependency ("Removing", depind);
9738 regdeps[depind] = regdeps[--regdepslen];
9745 /* Any marked resources which have this same predicate should be
9746 cleared, provided that the QP hasn't been modified between the
9747 marking instruction and the branch. */
9750 insn_group_break (0, CURR_SLOT.qp_regno, 1);
9755 while (i < regdepslen)
9757 if (regdeps[i].qp_regno == CURR_SLOT.qp_regno
9758 && regdeps[i].link_to_qp_branch
9759 && (regdeps[i].file != CURR_SLOT.src_file
9760 || regdeps[i].line != CURR_SLOT.src_line))
9762 /* Treat like a taken branch */
9763 print_dependency ("Removing", i);
9764 regdeps[i] = regdeps[--regdepslen];
9773 /* Examine the current instruction for dependency violations. */
9777 struct ia64_opcode *idesc;
9781 fprintf (stderr, "Checking %s for violations (line %d, %d/%d)\n",
9782 idesc->name, CURR_SLOT.src_line,
9783 idesc->dependencies->nchks,
9784 idesc->dependencies->nregs);
9787 /* Look through the list of currently marked resources; if the current
9788 instruction has the dependency in its chks list which uses that resource,
9789 check against the specific resources used. */
9790 check_dependencies (idesc);
9792 /* Look up the instruction's regdeps (RAW writes, WAW writes, and WAR reads),
9793 then add them to the list of marked resources. */
9794 mark_resources (idesc);
9796 /* There are several types of dependency semantics, and each has its own
9797 requirements for being cleared
9799 Instruction serialization (insns separated by interruption, rfi, or
9800 writer + srlz.i + reader, all in separate groups) clears DVS_INSTR.
9802 Data serialization (instruction serialization, or writer + srlz.d +
9803 reader, where writer and srlz.d are in separate groups) clears
9804 DVS_DATA. (This also clears DVS_OTHER, but that is not guaranteed to
9805 always be the case).
9807 Instruction group break (groups separated by stop, taken branch,
9808 interruption or rfi) clears DVS_IMPLIED and DVS_IMPLIEDF.
9810 update_dependencies (idesc);
9812 /* Sometimes, knowing a register value allows us to avoid giving a false DV
9813 warning. Keep track of as many as possible that are useful. */
9814 note_register_values (idesc);
9816 /* We don't need or want this anymore. */
9817 md.mem_offset.hint = 0;
9822 /* Translate one line of assembly. Pseudo ops and labels do not show
9828 char *saved_input_line_pointer, *mnemonic;
9829 const struct pseudo_opcode *pdesc;
9830 struct ia64_opcode *idesc;
9831 unsigned char qp_regno;
9835 saved_input_line_pointer = input_line_pointer;
9836 input_line_pointer = str;
9838 /* extract the opcode (mnemonic): */
9840 mnemonic = input_line_pointer;
9841 ch = get_symbol_end ();
9842 pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
9845 *input_line_pointer = ch;
9846 (*pdesc->handler) (pdesc->arg);
9850 /* Find the instruction descriptor matching the arguments. */
9852 idesc = ia64_find_opcode (mnemonic);
9853 *input_line_pointer = ch;
9856 as_bad ("Unknown opcode `%s'", mnemonic);
9860 idesc = parse_operands (idesc);
9864 /* Handle the dynamic ops we can handle now: */
9865 if (idesc->type == IA64_TYPE_DYN)
9867 if (strcmp (idesc->name, "add") == 0)
9869 if (CURR_SLOT.opnd[2].X_op == O_register
9870 && CURR_SLOT.opnd[2].X_add_number < 4)
9874 ia64_free_opcode (idesc);
9875 idesc = ia64_find_opcode (mnemonic);
9877 know (!idesc->next);
9880 else if (strcmp (idesc->name, "mov") == 0)
9882 enum ia64_opnd opnd1, opnd2;
9885 opnd1 = idesc->operands[0];
9886 opnd2 = idesc->operands[1];
9887 if (opnd1 == IA64_OPND_AR3)
9889 else if (opnd2 == IA64_OPND_AR3)
9893 if (CURR_SLOT.opnd[rop].X_op == O_register
9894 && ar_is_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
9898 ia64_free_opcode (idesc);
9899 idesc = ia64_find_opcode (mnemonic);
9900 while (idesc != NULL
9901 && (idesc->operands[0] != opnd1
9902 || idesc->operands[1] != opnd2))
9903 idesc = get_next_opcode (idesc);
9908 if (md.qp.X_op == O_register)
9910 qp_regno = md.qp.X_add_number - REG_P;
9911 md.qp.X_op = O_absent;
9914 flags = idesc->flags;
9916 if ((flags & IA64_OPCODE_FIRST) != 0)
9917 insn_group_break (1, 0, 0);
9919 if ((flags & IA64_OPCODE_NO_PRED) != 0 && qp_regno != 0)
9921 as_bad ("`%s' cannot be predicated", idesc->name);
9925 /* Build the instruction. */
9926 CURR_SLOT.qp_regno = qp_regno;
9927 CURR_SLOT.idesc = idesc;
9928 as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
9929 dwarf2_where (&CURR_SLOT.debug_line);
9931 /* Add unwind entry, if there is one. */
9932 if (unwind.current_entry)
9934 CURR_SLOT.unwind_record = unwind.current_entry;
9935 unwind.current_entry = NULL;
9938 /* Check for dependency violations. */
9942 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9943 if (++md.num_slots_in_use >= NUM_SLOTS)
9946 if ((flags & IA64_OPCODE_LAST) != 0)
9947 insn_group_break (1, 0, 0);
9949 md.last_text_seg = now_seg;
9952 input_line_pointer = saved_input_line_pointer;
9955 /* Called when symbol NAME cannot be found in the symbol table.
9956 Should be used for dynamic valued symbols only. */
9959 md_undefined_symbol (name)
9960 char *name ATTRIBUTE_UNUSED;
9965 /* Called for any expression that can not be recognized. When the
9966 function is called, `input_line_pointer' will point to the start of
9973 enum pseudo_type pseudo_type;
9978 switch (*input_line_pointer)
9981 /* Find what relocation pseudo-function we're dealing with. */
9983 ch = *++input_line_pointer;
9984 for (i = 0; i < NELEMS (pseudo_func); ++i)
9985 if (pseudo_func[i].name && pseudo_func[i].name[0] == ch)
9987 len = strlen (pseudo_func[i].name);
9988 if (strncmp (pseudo_func[i].name + 1,
9989 input_line_pointer + 1, len - 1) == 0
9990 && !is_part_of_name (input_line_pointer[len]))
9992 input_line_pointer += len;
9993 pseudo_type = pseudo_func[i].type;
9997 switch (pseudo_type)
9999 case PSEUDO_FUNC_RELOC:
10000 SKIP_WHITESPACE ();
10001 if (*input_line_pointer != '(')
10003 as_bad ("Expected '('");
10007 ++input_line_pointer;
10009 if (*input_line_pointer++ != ')')
10011 as_bad ("Missing ')'");
10014 if (e->X_op != O_symbol)
10016 if (e->X_op != O_pseudo_fixup)
10018 as_bad ("Not a symbolic expression");
10021 if (i != FUNC_LT_RELATIVE)
10023 as_bad ("Illegal combination of relocation functions");
10026 switch (S_GET_VALUE (e->X_op_symbol))
10028 case FUNC_FPTR_RELATIVE:
10029 i = FUNC_LT_FPTR_RELATIVE; break;
10030 case FUNC_DTP_MODULE:
10031 i = FUNC_LT_DTP_MODULE; break;
10032 case FUNC_DTP_RELATIVE:
10033 i = FUNC_LT_DTP_RELATIVE; break;
10034 case FUNC_TP_RELATIVE:
10035 i = FUNC_LT_TP_RELATIVE; break;
10037 as_bad ("Illegal combination of relocation functions");
10041 /* Make sure gas doesn't get rid of local symbols that are used
10043 e->X_op = O_pseudo_fixup;
10044 e->X_op_symbol = pseudo_func[i].u.sym;
10047 case PSEUDO_FUNC_CONST:
10048 e->X_op = O_constant;
10049 e->X_add_number = pseudo_func[i].u.ival;
10052 case PSEUDO_FUNC_REG:
10053 e->X_op = O_register;
10054 e->X_add_number = pseudo_func[i].u.ival;
10058 name = input_line_pointer - 1;
10060 as_bad ("Unknown pseudo function `%s'", name);
10066 ++input_line_pointer;
10068 if (*input_line_pointer != ']')
10070 as_bad ("Closing bracket misssing");
10075 if (e->X_op != O_register)
10076 as_bad ("Register expected as index");
10078 ++input_line_pointer;
10089 ignore_rest_of_line ();
10092 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
10093 a section symbol plus some offset. For relocs involving @fptr(),
10094 directives we don't want such adjustments since we need to have the
10095 original symbol's name in the reloc. */
10097 ia64_fix_adjustable (fix)
10100 /* Prevent all adjustments to global symbols */
10101 if (S_IS_EXTERN (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
10104 switch (fix->fx_r_type)
10106 case BFD_RELOC_IA64_FPTR64I:
10107 case BFD_RELOC_IA64_FPTR32MSB:
10108 case BFD_RELOC_IA64_FPTR32LSB:
10109 case BFD_RELOC_IA64_FPTR64MSB:
10110 case BFD_RELOC_IA64_FPTR64LSB:
10111 case BFD_RELOC_IA64_LTOFF_FPTR22:
10112 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10122 ia64_force_relocation (fix)
10125 switch (fix->fx_r_type)
10127 case BFD_RELOC_IA64_FPTR64I:
10128 case BFD_RELOC_IA64_FPTR32MSB:
10129 case BFD_RELOC_IA64_FPTR32LSB:
10130 case BFD_RELOC_IA64_FPTR64MSB:
10131 case BFD_RELOC_IA64_FPTR64LSB:
10133 case BFD_RELOC_IA64_LTOFF22:
10134 case BFD_RELOC_IA64_LTOFF64I:
10135 case BFD_RELOC_IA64_LTOFF_FPTR22:
10136 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10137 case BFD_RELOC_IA64_PLTOFF22:
10138 case BFD_RELOC_IA64_PLTOFF64I:
10139 case BFD_RELOC_IA64_PLTOFF64MSB:
10140 case BFD_RELOC_IA64_PLTOFF64LSB:
10142 case BFD_RELOC_IA64_LTOFF22X:
10143 case BFD_RELOC_IA64_LDXMOV:
10150 return generic_force_reloc (fix);
10153 /* Decide from what point a pc-relative relocation is relative to,
10154 relative to the pc-relative fixup. Er, relatively speaking. */
10156 ia64_pcrel_from_section (fix, sec)
10160 unsigned long off = fix->fx_frag->fr_address + fix->fx_where;
10162 if (bfd_get_section_flags (stdoutput, sec) & SEC_CODE)
10169 /* Used to emit section-relative relocs for the dwarf2 debug data. */
10171 ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
10175 expr.X_op = O_pseudo_fixup;
10176 expr.X_op_symbol = pseudo_func[FUNC_SEC_RELATIVE].u.sym;
10177 expr.X_add_number = 0;
10178 expr.X_add_symbol = symbol;
10179 emit_expr (&expr, size);
10182 /* This is called whenever some data item (not an instruction) needs a
10183 fixup. We pick the right reloc code depending on the byteorder
10184 currently in effect. */
10186 ia64_cons_fix_new (f, where, nbytes, exp)
10192 bfd_reloc_code_real_type code;
10197 /* There are no reloc for 8 and 16 bit quantities, but we allow
10198 them here since they will work fine as long as the expression
10199 is fully defined at the end of the pass over the source file. */
10200 case 1: code = BFD_RELOC_8; break;
10201 case 2: code = BFD_RELOC_16; break;
10203 if (target_big_endian)
10204 code = BFD_RELOC_IA64_DIR32MSB;
10206 code = BFD_RELOC_IA64_DIR32LSB;
10210 /* In 32-bit mode, data8 could mean function descriptors too. */
10211 if (exp->X_op == O_pseudo_fixup
10212 && exp->X_op_symbol
10213 && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC
10214 && !(md.flags & EF_IA_64_ABI64))
10216 if (target_big_endian)
10217 code = BFD_RELOC_IA64_IPLTMSB;
10219 code = BFD_RELOC_IA64_IPLTLSB;
10220 exp->X_op = O_symbol;
10225 if (target_big_endian)
10226 code = BFD_RELOC_IA64_DIR64MSB;
10228 code = BFD_RELOC_IA64_DIR64LSB;
10233 if (exp->X_op == O_pseudo_fixup
10234 && exp->X_op_symbol
10235 && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC)
10237 if (target_big_endian)
10238 code = BFD_RELOC_IA64_IPLTMSB;
10240 code = BFD_RELOC_IA64_IPLTLSB;
10241 exp->X_op = O_symbol;
10247 as_bad ("Unsupported fixup size %d", nbytes);
10248 ignore_rest_of_line ();
10252 if (exp->X_op == O_pseudo_fixup)
10254 exp->X_op = O_symbol;
10255 code = ia64_gen_real_reloc_type (exp->X_op_symbol, code);
10256 /* ??? If code unchanged, unsupported. */
10259 fix = fix_new_exp (f, where, nbytes, exp, 0, code);
10260 /* We need to store the byte order in effect in case we're going
10261 to fix an 8 or 16 bit relocation (for which there no real
10262 relocs available). See md_apply_fix3(). */
10263 fix->tc_fix_data.bigendian = target_big_endian;
10266 /* Return the actual relocation we wish to associate with the pseudo
10267 reloc described by SYM and R_TYPE. SYM should be one of the
10268 symbols in the pseudo_func array, or NULL. */
10270 static bfd_reloc_code_real_type
10271 ia64_gen_real_reloc_type (sym, r_type)
10272 struct symbol *sym;
10273 bfd_reloc_code_real_type r_type;
10275 bfd_reloc_code_real_type new = 0;
10282 switch (S_GET_VALUE (sym))
10284 case FUNC_FPTR_RELATIVE:
10287 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_FPTR64I; break;
10288 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_FPTR32MSB; break;
10289 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_FPTR32LSB; break;
10290 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_FPTR64MSB; break;
10291 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_FPTR64LSB; break;
10296 case FUNC_GP_RELATIVE:
10299 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_GPREL22; break;
10300 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_GPREL64I; break;
10301 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_GPREL32MSB; break;
10302 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_GPREL32LSB; break;
10303 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_GPREL64MSB; break;
10304 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_GPREL64LSB; break;
10309 case FUNC_LT_RELATIVE:
10312 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_LTOFF22; break;
10313 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_LTOFF64I; break;
10318 case FUNC_LT_RELATIVE_X:
10321 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_LTOFF22X; break;
10326 case FUNC_PC_RELATIVE:
10329 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_PCREL22; break;
10330 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_PCREL64I; break;
10331 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_PCREL32MSB; break;
10332 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_PCREL32LSB; break;
10333 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_PCREL64MSB; break;
10334 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_PCREL64LSB; break;
10339 case FUNC_PLT_RELATIVE:
10342 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_PLTOFF22; break;
10343 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_PLTOFF64I; break;
10344 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_PLTOFF64MSB;break;
10345 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_PLTOFF64LSB;break;
10350 case FUNC_SEC_RELATIVE:
10353 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_SECREL32MSB;break;
10354 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_SECREL32LSB;break;
10355 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_SECREL64MSB;break;
10356 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_SECREL64LSB;break;
10361 case FUNC_SEG_RELATIVE:
10364 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_SEGREL32MSB;break;
10365 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_SEGREL32LSB;break;
10366 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_SEGREL64MSB;break;
10367 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_SEGREL64LSB;break;
10372 case FUNC_LTV_RELATIVE:
10375 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_LTV32MSB; break;
10376 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_LTV32LSB; break;
10377 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_LTV64MSB; break;
10378 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_LTV64LSB; break;
10383 case FUNC_LT_FPTR_RELATIVE:
10386 case BFD_RELOC_IA64_IMM22:
10387 new = BFD_RELOC_IA64_LTOFF_FPTR22; break;
10388 case BFD_RELOC_IA64_IMM64:
10389 new = BFD_RELOC_IA64_LTOFF_FPTR64I; break;
10395 case FUNC_TP_RELATIVE:
10398 case BFD_RELOC_IA64_IMM14:
10399 new = BFD_RELOC_IA64_TPREL14; break;
10400 case BFD_RELOC_IA64_IMM22:
10401 new = BFD_RELOC_IA64_TPREL22; break;
10402 case BFD_RELOC_IA64_IMM64:
10403 new = BFD_RELOC_IA64_TPREL64I; break;
10409 case FUNC_LT_TP_RELATIVE:
10412 case BFD_RELOC_IA64_IMM22:
10413 new = BFD_RELOC_IA64_LTOFF_TPREL22; break;
10419 case FUNC_LT_DTP_MODULE:
10422 case BFD_RELOC_IA64_IMM22:
10423 new = BFD_RELOC_IA64_LTOFF_DTPMOD22; break;
10429 case FUNC_DTP_RELATIVE:
10432 case BFD_RELOC_IA64_DIR64MSB:
10433 new = BFD_RELOC_IA64_DTPREL64MSB; break;
10434 case BFD_RELOC_IA64_DIR64LSB:
10435 new = BFD_RELOC_IA64_DTPREL64LSB; break;
10436 case BFD_RELOC_IA64_IMM14:
10437 new = BFD_RELOC_IA64_DTPREL14; break;
10438 case BFD_RELOC_IA64_IMM22:
10439 new = BFD_RELOC_IA64_DTPREL22; break;
10440 case BFD_RELOC_IA64_IMM64:
10441 new = BFD_RELOC_IA64_DTPREL64I; break;
10447 case FUNC_LT_DTP_RELATIVE:
10450 case BFD_RELOC_IA64_IMM22:
10451 new = BFD_RELOC_IA64_LTOFF_DTPREL22; break;
10457 case FUNC_IPLT_RELOC:
10464 /* Hmmmm. Should this ever occur? */
10471 /* Here is where generate the appropriate reloc for pseudo relocation
10474 ia64_validate_fix (fix)
10477 switch (fix->fx_r_type)
10479 case BFD_RELOC_IA64_FPTR64I:
10480 case BFD_RELOC_IA64_FPTR32MSB:
10481 case BFD_RELOC_IA64_FPTR64LSB:
10482 case BFD_RELOC_IA64_LTOFF_FPTR22:
10483 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10484 if (fix->fx_offset != 0)
10485 as_bad_where (fix->fx_file, fix->fx_line,
10486 "No addend allowed in @fptr() relocation");
10494 fix_insn (fix, odesc, value)
10496 const struct ia64_operand *odesc;
10499 bfd_vma insn[3], t0, t1, control_bits;
10504 slot = fix->fx_where & 0x3;
10505 fixpos = fix->fx_frag->fr_literal + (fix->fx_where - slot);
10507 /* Bundles are always in little-endian byte order */
10508 t0 = bfd_getl64 (fixpos);
10509 t1 = bfd_getl64 (fixpos + 8);
10510 control_bits = t0 & 0x1f;
10511 insn[0] = (t0 >> 5) & 0x1ffffffffffLL;
10512 insn[1] = ((t0 >> 46) & 0x3ffff) | ((t1 & 0x7fffff) << 18);
10513 insn[2] = (t1 >> 23) & 0x1ffffffffffLL;
10516 if (odesc - elf64_ia64_operands == IA64_OPND_IMMU64)
10518 insn[1] = (value >> 22) & 0x1ffffffffffLL;
10519 insn[2] |= (((value & 0x7f) << 13)
10520 | (((value >> 7) & 0x1ff) << 27)
10521 | (((value >> 16) & 0x1f) << 22)
10522 | (((value >> 21) & 0x1) << 21)
10523 | (((value >> 63) & 0x1) << 36));
10525 else if (odesc - elf64_ia64_operands == IA64_OPND_IMMU62)
10527 if (value & ~0x3fffffffffffffffULL)
10528 err = "integer operand out of range";
10529 insn[1] = (value >> 21) & 0x1ffffffffffLL;
10530 insn[2] |= (((value & 0xfffff) << 6) | (((value >> 20) & 0x1) << 36));
10532 else if (odesc - elf64_ia64_operands == IA64_OPND_TGT64)
10535 insn[1] = ((value >> 20) & 0x7fffffffffLL) << 2;
10536 insn[2] |= ((((value >> 59) & 0x1) << 36)
10537 | (((value >> 0) & 0xfffff) << 13));
10540 err = (*odesc->insert) (odesc, value, insn + slot);
10543 as_bad_where (fix->fx_file, fix->fx_line, err);
10545 t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
10546 t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
10547 number_to_chars_littleendian (fixpos + 0, t0, 8);
10548 number_to_chars_littleendian (fixpos + 8, t1, 8);
10551 /* Attempt to simplify or even eliminate a fixup. The return value is
10552 ignored; perhaps it was once meaningful, but now it is historical.
10553 To indicate that a fixup has been eliminated, set FIXP->FX_DONE.
10555 If fixp->fx_addsy is non-NULL, we'll have to generate a reloc entry
10559 md_apply_fix3 (fix, valP, seg)
10562 segT seg ATTRIBUTE_UNUSED;
10565 valueT value = *valP;
10567 fixpos = fix->fx_frag->fr_literal + fix->fx_where;
10571 switch (fix->fx_r_type)
10573 case BFD_RELOC_IA64_DIR32MSB:
10574 fix->fx_r_type = BFD_RELOC_IA64_PCREL32MSB;
10577 case BFD_RELOC_IA64_DIR32LSB:
10578 fix->fx_r_type = BFD_RELOC_IA64_PCREL32LSB;
10581 case BFD_RELOC_IA64_DIR64MSB:
10582 fix->fx_r_type = BFD_RELOC_IA64_PCREL64MSB;
10585 case BFD_RELOC_IA64_DIR64LSB:
10586 fix->fx_r_type = BFD_RELOC_IA64_PCREL64LSB;
10595 switch (fix->fx_r_type)
10597 case BFD_RELOC_UNUSED:
10598 /* This must be a TAG13 or TAG13b operand. There are no external
10599 relocs defined for them, so we must give an error. */
10600 as_bad_where (fix->fx_file, fix->fx_line,
10601 "%s must have a constant value",
10602 elf64_ia64_operands[fix->tc_fix_data.opnd].desc);
10606 case BFD_RELOC_IA64_TPREL14:
10607 case BFD_RELOC_IA64_TPREL22:
10608 case BFD_RELOC_IA64_TPREL64I:
10609 case BFD_RELOC_IA64_LTOFF_TPREL22:
10610 case BFD_RELOC_IA64_LTOFF_DTPMOD22:
10611 case BFD_RELOC_IA64_DTPREL14:
10612 case BFD_RELOC_IA64_DTPREL22:
10613 case BFD_RELOC_IA64_DTPREL64I:
10614 case BFD_RELOC_IA64_LTOFF_DTPREL22:
10615 S_SET_THREAD_LOCAL (fix->fx_addsy);
10622 else if (fix->tc_fix_data.opnd == IA64_OPND_NIL)
10624 if (fix->tc_fix_data.bigendian)
10625 number_to_chars_bigendian (fixpos, value, fix->fx_size);
10627 number_to_chars_littleendian (fixpos, value, fix->fx_size);
10632 fix_insn (fix, elf64_ia64_operands + fix->tc_fix_data.opnd, value);
10637 /* Generate the BFD reloc to be stuck in the object file from the
10638 fixup used internally in the assembler. */
10641 tc_gen_reloc (sec, fixp)
10642 asection *sec ATTRIBUTE_UNUSED;
10647 reloc = xmalloc (sizeof (*reloc));
10648 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
10649 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
10650 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
10651 reloc->addend = fixp->fx_offset;
10652 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
10656 as_bad_where (fixp->fx_file, fixp->fx_line,
10657 "Cannot represent %s relocation in object file",
10658 bfd_get_reloc_code_name (fixp->fx_r_type));
10663 /* Turn a string in input_line_pointer into a floating point constant
10664 of type TYPE, and store the appropriate bytes in *LIT. The number
10665 of LITTLENUMS emitted is stored in *SIZE. An error message is
10666 returned, or NULL on OK. */
10668 #define MAX_LITTLENUMS 5
10671 md_atof (type, lit, size)
10676 LITTLENUM_TYPE words[MAX_LITTLENUMS];
10706 return "Bad call to MD_ATOF()";
10708 t = atof_ieee (input_line_pointer, type, words);
10710 input_line_pointer = t;
10712 (*ia64_float_to_chars) (lit, words, prec);
10716 /* It is 10 byte floating point with 6 byte padding. */
10717 memset (&lit [10], 0, 6);
10718 *size = 8 * sizeof (LITTLENUM_TYPE);
10721 *size = prec * sizeof (LITTLENUM_TYPE);
10726 /* Handle ia64 specific semantics of the align directive. */
10729 ia64_md_do_align (n, fill, len, max)
10730 int n ATTRIBUTE_UNUSED;
10731 const char *fill ATTRIBUTE_UNUSED;
10732 int len ATTRIBUTE_UNUSED;
10733 int max ATTRIBUTE_UNUSED;
10735 if (subseg_text_p (now_seg))
10736 ia64_flush_insns ();
10739 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
10740 of an rs_align_code fragment. */
10743 ia64_handle_align (fragp)
10746 /* Use mfi bundle of nops with no stop bits. */
10747 static const unsigned char le_nop[]
10748 = { 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
10749 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
10754 if (fragp->fr_type != rs_align_code)
10757 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
10758 p = fragp->fr_literal + fragp->fr_fix;
10760 /* Make sure we are on a 16-byte boundary, in case someone has been
10761 putting data into a text section. */
10764 int fix = bytes & 15;
10765 memset (p, 0, fix);
10768 fragp->fr_fix += fix;
10771 /* Instruction bundles are always little-endian. */
10772 memcpy (p, le_nop, 16);
10773 fragp->fr_var = 16;
10777 ia64_float_to_chars_bigendian (char *lit, LITTLENUM_TYPE *words,
10782 number_to_chars_bigendian (lit, (long) (*words++),
10783 sizeof (LITTLENUM_TYPE));
10784 lit += sizeof (LITTLENUM_TYPE);
10789 ia64_float_to_chars_littleendian (char *lit, LITTLENUM_TYPE *words,
10794 number_to_chars_littleendian (lit, (long) (words[prec]),
10795 sizeof (LITTLENUM_TYPE));
10796 lit += sizeof (LITTLENUM_TYPE);
10801 ia64_elf_section_change_hook (void)
10803 dot_byteorder (-1);
10806 /* Check if a label should be made global. */
10808 ia64_check_label (symbolS *label)
10810 if (*input_line_pointer == ':')
10812 S_SET_EXTERNAL (label);
10813 input_line_pointer++;
10817 /* Used to remember where .alias and .secalias directives are seen. We
10818 will rename symbol and section names when we are about to output
10819 the relocatable file. */
10822 char *file; /* The file where the directive is seen. */
10823 unsigned int line; /* The line number the directive is at. */
10824 const char *name; /* The orignale name of the symbol. */
10827 /* Called for .alias and .secalias directives. If SECTION is 1, it is
10828 .secalias. Otherwise, it is .alias. */
10830 dot_alias (int section)
10832 char *name, *alias;
10836 const char *error_string;
10839 struct hash_control *ahash, *nhash;
10842 name = input_line_pointer;
10843 delim = get_symbol_end ();
10844 end_name = input_line_pointer;
10847 if (name == end_name)
10849 as_bad (_("expected symbol name"));
10850 discard_rest_of_line ();
10854 SKIP_WHITESPACE ();
10856 if (*input_line_pointer != ',')
10859 as_bad (_("expected comma after \"%s\""), name);
10861 ignore_rest_of_line ();
10865 input_line_pointer++;
10868 /* We call demand_copy_C_string to check if alias string is valid.
10869 There should be a closing `"' and no `\0' in the string. */
10870 alias = demand_copy_C_string (&len);
10873 ignore_rest_of_line ();
10877 /* Make a copy of name string. */
10878 len = strlen (name) + 1;
10879 obstack_grow (¬es, name, len);
10880 name = obstack_finish (¬es);
10885 ahash = secalias_hash;
10886 nhash = secalias_name_hash;
10891 ahash = alias_hash;
10892 nhash = alias_name_hash;
10895 /* Check if alias has been used before. */
10896 h = (struct alias *) hash_find (ahash, alias);
10899 if (strcmp (h->name, name))
10900 as_bad (_("`%s' is already the alias of %s `%s'"),
10901 alias, kind, h->name);
10905 /* Check if name already has an alias. */
10906 a = (const char *) hash_find (nhash, name);
10909 if (strcmp (a, alias))
10910 as_bad (_("%s `%s' already has an alias `%s'"), kind, name, a);
10914 h = (struct alias *) xmalloc (sizeof (struct alias));
10915 as_where (&h->file, &h->line);
10918 error_string = hash_jam (ahash, alias, (PTR) h);
10921 as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
10922 alias, kind, error_string);
10926 error_string = hash_jam (nhash, name, (PTR) alias);
10929 as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
10930 alias, kind, error_string);
10932 obstack_free (¬es, name);
10933 obstack_free (¬es, alias);
10936 demand_empty_rest_of_line ();
10939 /* It renames the original symbol name to its alias. */
10941 do_alias (const char *alias, PTR value)
10943 struct alias *h = (struct alias *) value;
10944 symbolS *sym = symbol_find (h->name);
10947 as_warn_where (h->file, h->line,
10948 _("symbol `%s' aliased to `%s' is not used"),
10951 S_SET_NAME (sym, (char *) alias);
10954 /* Called from write_object_file. */
10956 ia64_adjust_symtab (void)
10958 hash_traverse (alias_hash, do_alias);
10961 /* It renames the original section name to its alias. */
10963 do_secalias (const char *alias, PTR value)
10965 struct alias *h = (struct alias *) value;
10966 segT sec = bfd_get_section_by_name (stdoutput, h->name);
10969 as_warn_where (h->file, h->line,
10970 _("section `%s' aliased to `%s' is not used"),
10976 /* Called from write_object_file. */
10978 ia64_frob_file (void)
10980 hash_traverse (secalias_hash, do_secalias);