1 /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009 Free Software Foundation, Inc.
4 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
21 Boston, MA 02110-1301, USA. */
35 - labels are wrong if automatic alignment is introduced
36 (e.g., checkout the second real10 definition in test-data.s)
38 <reg>.safe_across_calls and any other DV-related directives I don't
39 have documentation for.
40 verify mod-sched-brs reads/writes are checked/marked (and other
46 #include "safe-ctype.h"
47 #include "dwarf2dbg.h"
50 #include "opcode/ia64.h"
60 #define NELEMS(a) ((int) (sizeof (a)/sizeof ((a)[0])))
62 /* Some systems define MIN in, e.g., param.h. */
64 #define MIN(a,b) ((a) < (b) ? (a) : (b))
67 #define PREV_SLOT md.slot[(md.curr_slot + NUM_SLOTS - 1) % NUM_SLOTS]
68 #define CURR_SLOT md.slot[md.curr_slot]
70 #define O_pseudo_fixup (O_max + 1)
74 /* IA-64 ABI section pseudo-ops. */
75 SPECIAL_SECTION_BSS
= 0,
77 SPECIAL_SECTION_SDATA
,
78 SPECIAL_SECTION_RODATA
,
79 SPECIAL_SECTION_COMMENT
,
80 SPECIAL_SECTION_UNWIND
,
81 SPECIAL_SECTION_UNWIND_INFO
,
82 /* HPUX specific section pseudo-ops. */
83 SPECIAL_SECTION_INIT_ARRAY
,
84 SPECIAL_SECTION_FINI_ARRAY
,
101 FUNC_LT_FPTR_RELATIVE
,
103 FUNC_LT_DTP_RELATIVE
,
111 REG_FR
= (REG_GR
+ 128),
112 REG_AR
= (REG_FR
+ 128),
113 REG_CR
= (REG_AR
+ 128),
114 REG_P
= (REG_CR
+ 128),
115 REG_BR
= (REG_P
+ 64),
116 REG_IP
= (REG_BR
+ 8),
123 /* The following are pseudo-registers for use by gas only. */
134 /* The following pseudo-registers are used for unwind directives only: */
142 DYNREG_GR
= 0, /* dynamic general purpose register */
143 DYNREG_FR
, /* dynamic floating point register */
144 DYNREG_PR
, /* dynamic predicate register */
148 enum operand_match_result
151 OPERAND_OUT_OF_RANGE
,
155 /* On the ia64, we can't know the address of a text label until the
156 instructions are packed into a bundle. To handle this, we keep
157 track of the list of labels that appear in front of each
161 struct label_fix
*next
;
163 bfd_boolean dw2_mark_labels
;
166 /* This is the endianness of the current section. */
167 extern int target_big_endian
;
169 /* This is the default endianness. */
170 static int default_big_endian
= TARGET_BYTES_BIG_ENDIAN
;
172 void (*ia64_number_to_chars
) (char *, valueT
, int);
174 static void ia64_float_to_chars_bigendian (char *, LITTLENUM_TYPE
*, int);
175 static void ia64_float_to_chars_littleendian (char *, LITTLENUM_TYPE
*, int);
177 static void (*ia64_float_to_chars
) (char *, LITTLENUM_TYPE
*, int);
179 static struct hash_control
*alias_hash
;
180 static struct hash_control
*alias_name_hash
;
181 static struct hash_control
*secalias_hash
;
182 static struct hash_control
*secalias_name_hash
;
184 /* List of chars besides those in app.c:symbol_chars that can start an
185 operand. Used to prevent the scrubber eating vital white-space. */
186 const char ia64_symbol_chars
[] = "@?";
188 /* Characters which always start a comment. */
189 const char comment_chars
[] = "";
191 /* Characters which start a comment at the beginning of a line. */
192 const char line_comment_chars
[] = "#";
194 /* Characters which may be used to separate multiple commands on a
196 const char line_separator_chars
[] = ";{}";
198 /* Characters which are used to indicate an exponent in a floating
200 const char EXP_CHARS
[] = "eE";
202 /* Characters which mean that a number is a floating point constant,
204 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
206 /* ia64-specific option processing: */
208 const char *md_shortopts
= "m:N:x::";
210 struct option md_longopts
[] =
212 #define OPTION_MCONSTANT_GP (OPTION_MD_BASE + 1)
213 {"mconstant-gp", no_argument
, NULL
, OPTION_MCONSTANT_GP
},
214 #define OPTION_MAUTO_PIC (OPTION_MD_BASE + 2)
215 {"mauto-pic", no_argument
, NULL
, OPTION_MAUTO_PIC
}
218 size_t md_longopts_size
= sizeof (md_longopts
);
222 struct hash_control
*pseudo_hash
; /* pseudo opcode hash table */
223 struct hash_control
*reg_hash
; /* register name hash table */
224 struct hash_control
*dynreg_hash
; /* dynamic register hash table */
225 struct hash_control
*const_hash
; /* constant hash table */
226 struct hash_control
*entry_hash
; /* code entry hint hash table */
228 /* If X_op is != O_absent, the registername for the instruction's
229 qualifying predicate. If NULL, p0 is assumed for instructions
230 that are predictable. */
233 /* Optimize for which CPU. */
240 /* What to do when hint.b is used. */
252 explicit_mode
: 1, /* which mode we're in */
253 default_explicit_mode
: 1, /* which mode is the default */
254 mode_explicitly_set
: 1, /* was the current mode explicitly set? */
256 keep_pending_output
: 1;
258 /* What to do when something is wrong with unwind directives. */
261 unwind_check_warning
,
265 /* Each bundle consists of up to three instructions. We keep
266 track of four most recent instructions so we can correctly set
267 the end_of_insn_group for the last instruction in a bundle. */
269 int num_slots_in_use
;
273 end_of_insn_group
: 1,
274 manual_bundling_on
: 1,
275 manual_bundling_off
: 1,
276 loc_directive_seen
: 1;
277 signed char user_template
; /* user-selected template, if any */
278 unsigned char qp_regno
; /* qualifying predicate */
279 /* This duplicates a good fraction of "struct fix" but we
280 can't use a "struct fix" instead since we can't call
281 fix_new_exp() until we know the address of the instruction. */
285 bfd_reloc_code_real_type code
;
286 enum ia64_opnd opnd
; /* type of operand in need of fix */
287 unsigned int is_pcrel
: 1; /* is operand pc-relative? */
288 expressionS expr
; /* the value to be inserted */
290 fixup
[2]; /* at most two fixups per insn */
291 struct ia64_opcode
*idesc
;
292 struct label_fix
*label_fixups
;
293 struct label_fix
*tag_fixups
;
294 struct unw_rec_list
*unwind_record
; /* Unwind directive. */
297 unsigned int src_line
;
298 struct dwarf2_line_info debug_line
;
306 struct dynreg
*next
; /* next dynamic register */
308 unsigned short base
; /* the base register number */
309 unsigned short num_regs
; /* # of registers in this set */
311 *dynreg
[DYNREG_NUM_TYPES
], in
, loc
, out
, rot
;
313 flagword flags
; /* ELF-header flags */
316 unsigned hint
:1; /* is this hint currently valid? */
317 bfd_vma offset
; /* mem.offset offset */
318 bfd_vma base
; /* mem.offset base */
321 int path
; /* number of alt. entry points seen */
322 const char **entry_labels
; /* labels of all alternate paths in
323 the current DV-checking block. */
324 int maxpaths
; /* size currently allocated for
327 int pointer_size
; /* size in bytes of a pointer */
328 int pointer_size_shift
; /* shift size of a pointer for alignment */
330 symbolS
*indregsym
[IND_RR
- IND_CPUID
+ 1];
334 /* These are not const, because they are modified to MMI for non-itanium1
336 /* MFI bundle of nops. */
337 static unsigned char le_nop
[16] =
339 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
340 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
342 /* MFI bundle of nops with stop-bit. */
343 static unsigned char le_nop_stop
[16] =
345 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
346 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
349 /* application registers: */
355 #define AR_BSPSTORE 18
381 {"ar.k0", AR_K0
}, {"ar.k1", AR_K0
+ 1},
382 {"ar.k2", AR_K0
+ 2}, {"ar.k3", AR_K0
+ 3},
383 {"ar.k4", AR_K0
+ 4}, {"ar.k5", AR_K0
+ 5},
384 {"ar.k6", AR_K0
+ 6}, {"ar.k7", AR_K7
},
385 {"ar.rsc", AR_RSC
}, {"ar.bsp", AR_BSP
},
386 {"ar.bspstore", AR_BSPSTORE
}, {"ar.rnat", AR_RNAT
},
387 {"ar.fcr", AR_FCR
}, {"ar.eflag", AR_EFLAG
},
388 {"ar.csd", AR_CSD
}, {"ar.ssd", AR_SSD
},
389 {"ar.cflg", AR_CFLG
}, {"ar.fsr", AR_FSR
},
390 {"ar.fir", AR_FIR
}, {"ar.fdr", AR_FDR
},
391 {"ar.ccv", AR_CCV
}, {"ar.unat", AR_UNAT
},
392 {"ar.fpsr", AR_FPSR
}, {"ar.itc", AR_ITC
},
393 {"ar.ruc", AR_RUC
}, {"ar.pfs", AR_PFS
},
394 {"ar.lc", AR_LC
}, {"ar.ec", AR_EC
},
397 /* control registers: */
438 {"cr.gpta", CR_GPTA
},
439 {"cr.ipsr", CR_IPSR
},
443 {"cr.itir", CR_ITIR
},
444 {"cr.iipa", CR_IIPA
},
448 {"cr.iib0", CR_IIB0
},
449 {"cr.iib1", CR_IIB1
},
454 {"cr.irr0", CR_IRR0
},
455 {"cr.irr1", CR_IRR0
+ 1},
456 {"cr.irr2", CR_IRR0
+ 2},
457 {"cr.irr3", CR_IRR3
},
460 {"cr.cmcv", CR_CMCV
},
461 {"cr.lrr0", CR_LRR0
},
470 static const struct const_desc
477 /* PSR constant masks: */
480 {"psr.be", ((valueT
) 1) << 1},
481 {"psr.up", ((valueT
) 1) << 2},
482 {"psr.ac", ((valueT
) 1) << 3},
483 {"psr.mfl", ((valueT
) 1) << 4},
484 {"psr.mfh", ((valueT
) 1) << 5},
486 {"psr.ic", ((valueT
) 1) << 13},
487 {"psr.i", ((valueT
) 1) << 14},
488 {"psr.pk", ((valueT
) 1) << 15},
490 {"psr.dt", ((valueT
) 1) << 17},
491 {"psr.dfl", ((valueT
) 1) << 18},
492 {"psr.dfh", ((valueT
) 1) << 19},
493 {"psr.sp", ((valueT
) 1) << 20},
494 {"psr.pp", ((valueT
) 1) << 21},
495 {"psr.di", ((valueT
) 1) << 22},
496 {"psr.si", ((valueT
) 1) << 23},
497 {"psr.db", ((valueT
) 1) << 24},
498 {"psr.lp", ((valueT
) 1) << 25},
499 {"psr.tb", ((valueT
) 1) << 26},
500 {"psr.rt", ((valueT
) 1) << 27},
501 /* 28-31: reserved */
502 /* 32-33: cpl (current privilege level) */
503 {"psr.is", ((valueT
) 1) << 34},
504 {"psr.mc", ((valueT
) 1) << 35},
505 {"psr.it", ((valueT
) 1) << 36},
506 {"psr.id", ((valueT
) 1) << 37},
507 {"psr.da", ((valueT
) 1) << 38},
508 {"psr.dd", ((valueT
) 1) << 39},
509 {"psr.ss", ((valueT
) 1) << 40},
510 /* 41-42: ri (restart instruction) */
511 {"psr.ed", ((valueT
) 1) << 43},
512 {"psr.bn", ((valueT
) 1) << 44},
515 /* indirect register-sets/memory: */
524 { "CPUID", IND_CPUID
},
525 { "cpuid", IND_CPUID
},
537 /* Pseudo functions used to indicate relocation types (these functions
538 start with an at sign (@). */
560 /* reloc pseudo functions (these must come first!): */
561 { "dtpmod", PSEUDO_FUNC_RELOC
, { 0 } },
562 { "dtprel", PSEUDO_FUNC_RELOC
, { 0 } },
563 { "fptr", PSEUDO_FUNC_RELOC
, { 0 } },
564 { "gprel", PSEUDO_FUNC_RELOC
, { 0 } },
565 { "ltoff", PSEUDO_FUNC_RELOC
, { 0 } },
566 { "ltoffx", PSEUDO_FUNC_RELOC
, { 0 } },
567 { "pcrel", PSEUDO_FUNC_RELOC
, { 0 } },
568 { "pltoff", PSEUDO_FUNC_RELOC
, { 0 } },
569 { "secrel", PSEUDO_FUNC_RELOC
, { 0 } },
570 { "segrel", PSEUDO_FUNC_RELOC
, { 0 } },
571 { "tprel", PSEUDO_FUNC_RELOC
, { 0 } },
572 { "ltv", PSEUDO_FUNC_RELOC
, { 0 } },
573 { NULL
, 0, { 0 } }, /* placeholder for FUNC_LT_FPTR_RELATIVE */
574 { NULL
, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_MODULE */
575 { NULL
, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_RELATIVE */
576 { NULL
, 0, { 0 } }, /* placeholder for FUNC_LT_TP_RELATIVE */
577 { "iplt", PSEUDO_FUNC_RELOC
, { 0 } },
579 /* mbtype4 constants: */
580 { "alt", PSEUDO_FUNC_CONST
, { 0xa } },
581 { "brcst", PSEUDO_FUNC_CONST
, { 0x0 } },
582 { "mix", PSEUDO_FUNC_CONST
, { 0x8 } },
583 { "rev", PSEUDO_FUNC_CONST
, { 0xb } },
584 { "shuf", PSEUDO_FUNC_CONST
, { 0x9 } },
586 /* fclass constants: */
587 { "nat", PSEUDO_FUNC_CONST
, { 0x100 } },
588 { "qnan", PSEUDO_FUNC_CONST
, { 0x080 } },
589 { "snan", PSEUDO_FUNC_CONST
, { 0x040 } },
590 { "pos", PSEUDO_FUNC_CONST
, { 0x001 } },
591 { "neg", PSEUDO_FUNC_CONST
, { 0x002 } },
592 { "zero", PSEUDO_FUNC_CONST
, { 0x004 } },
593 { "unorm", PSEUDO_FUNC_CONST
, { 0x008 } },
594 { "norm", PSEUDO_FUNC_CONST
, { 0x010 } },
595 { "inf", PSEUDO_FUNC_CONST
, { 0x020 } },
597 { "natval", PSEUDO_FUNC_CONST
, { 0x100 } }, /* old usage */
599 /* hint constants: */
600 { "pause", PSEUDO_FUNC_CONST
, { 0x0 } },
602 /* unwind-related constants: */
603 { "svr4", PSEUDO_FUNC_CONST
, { ELFOSABI_NONE
} },
604 { "hpux", PSEUDO_FUNC_CONST
, { ELFOSABI_HPUX
} },
605 { "nt", PSEUDO_FUNC_CONST
, { 2 } }, /* conflicts w/ELFOSABI_NETBSD */
606 { "linux", PSEUDO_FUNC_CONST
, { ELFOSABI_LINUX
} },
607 { "freebsd", PSEUDO_FUNC_CONST
, { ELFOSABI_FREEBSD
} },
608 { "openvms", PSEUDO_FUNC_CONST
, { ELFOSABI_OPENVMS
} },
609 { "nsk", PSEUDO_FUNC_CONST
, { ELFOSABI_NSK
} },
611 /* unwind-related registers: */
612 { "priunat",PSEUDO_FUNC_REG
, { REG_PRIUNAT
} }
615 /* 41-bit nop opcodes (one per unit): */
616 static const bfd_vma nop
[IA64_NUM_UNITS
] =
618 0x0000000000LL
, /* NIL => break 0 */
619 0x0008000000LL
, /* I-unit nop */
620 0x0008000000LL
, /* M-unit nop */
621 0x4000000000LL
, /* B-unit nop */
622 0x0008000000LL
, /* F-unit nop */
623 0x0000000000LL
, /* L-"unit" nop immediate */
624 0x0008000000LL
, /* X-unit nop */
627 /* Can't be `const' as it's passed to input routines (which have the
628 habit of setting temporary sentinels. */
629 static char special_section_name
[][20] =
631 {".bss"}, {".sbss"}, {".sdata"}, {".rodata"}, {".comment"},
632 {".IA_64.unwind"}, {".IA_64.unwind_info"},
633 {".init_array"}, {".fini_array"}
636 /* The best template for a particular sequence of up to three
638 #define N IA64_NUM_TYPES
639 static unsigned char best_template
[N
][N
][N
];
642 /* Resource dependencies currently in effect */
644 int depind
; /* dependency index */
645 const struct ia64_dependency
*dependency
; /* actual dependency */
646 unsigned specific
:1, /* is this a specific bit/regno? */
647 link_to_qp_branch
:1; /* will a branch on the same QP clear it?*/
648 int index
; /* specific regno/bit within dependency */
649 int note
; /* optional qualifying note (0 if none) */
653 int insn_srlz
; /* current insn serialization state */
654 int data_srlz
; /* current data serialization state */
655 int qp_regno
; /* qualifying predicate for this usage */
656 char *file
; /* what file marked this dependency */
657 unsigned int line
; /* what line marked this dependency */
658 struct mem_offset mem_offset
; /* optional memory offset hint */
659 enum { CMP_NONE
, CMP_OR
, CMP_AND
} cmp_type
; /* OR or AND compare? */
660 int path
; /* corresponding code entry index */
662 static int regdepslen
= 0;
663 static int regdepstotlen
= 0;
664 static const char *dv_mode
[] = { "RAW", "WAW", "WAR" };
665 static const char *dv_sem
[] = { "none", "implied", "impliedf",
666 "data", "instr", "specific", "stop", "other" };
667 static const char *dv_cmp_type
[] = { "none", "OR", "AND" };
669 /* Current state of PR mutexation */
670 static struct qpmutex
{
673 } *qp_mutexes
= NULL
; /* QP mutex bitmasks */
674 static int qp_mutexeslen
= 0;
675 static int qp_mutexestotlen
= 0;
676 static valueT qp_safe_across_calls
= 0;
678 /* Current state of PR implications */
679 static struct qp_imply
{
682 unsigned p2_branched
:1;
684 } *qp_implies
= NULL
;
685 static int qp_implieslen
= 0;
686 static int qp_impliestotlen
= 0;
688 /* Keep track of static GR values so that indirect register usage can
689 sometimes be tracked. */
700 (((1 << (8 * sizeof(gr_values
->path
) - 2)) - 1) << 1) + 1,
706 /* Remember the alignment frag. */
707 static fragS
*align_frag
;
709 /* These are the routines required to output the various types of
712 /* A slot_number is a frag address plus the slot index (0-2). We use the
713 frag address here so that if there is a section switch in the middle of
714 a function, then instructions emitted to a different section are not
715 counted. Since there may be more than one frag for a function, this
716 means we also need to keep track of which frag this address belongs to
717 so we can compute inter-frag distances. This also nicely solves the
718 problem with nops emitted for align directives, which can't easily be
719 counted, but can easily be derived from frag sizes. */
721 typedef struct unw_rec_list
{
723 unsigned long slot_number
;
725 struct unw_rec_list
*next
;
728 #define SLOT_NUM_NOT_SET (unsigned)-1
730 /* Linked list of saved prologue counts. A very poor
731 implementation of a map from label numbers to prologue counts. */
732 typedef struct label_prologue_count
734 struct label_prologue_count
*next
;
735 unsigned long label_number
;
736 unsigned int prologue_count
;
737 } label_prologue_count
;
739 typedef struct proc_pending
742 struct proc_pending
*next
;
747 /* Maintain a list of unwind entries for the current function. */
751 /* Any unwind entries that should be attached to the current slot
752 that an insn is being constructed for. */
753 unw_rec_list
*current_entry
;
755 /* These are used to create the unwind table entry for this function. */
756 proc_pending proc_pending
;
757 symbolS
*info
; /* pointer to unwind info */
758 symbolS
*personality_routine
;
760 subsegT saved_text_subseg
;
761 unsigned int force_unwind_entry
: 1; /* force generation of unwind entry? */
763 /* TRUE if processing unwind directives in a prologue region. */
764 unsigned int prologue
: 1;
765 unsigned int prologue_mask
: 4;
766 unsigned int prologue_gr
: 7;
767 unsigned int body
: 1;
768 unsigned int insn
: 1;
769 unsigned int prologue_count
; /* number of .prologues seen so far */
770 /* Prologue counts at previous .label_state directives. */
771 struct label_prologue_count
* saved_prologue_counts
;
773 /* List of split up .save-s. */
774 unw_p_record
*pending_saves
;
777 /* The input value is a negated offset from psp, and specifies an address
778 psp - offset. The encoded value is psp + 16 - (4 * offset). Thus we
779 must add 16 and divide by 4 to get the encoded value. */
781 #define ENCODED_PSP_OFFSET(OFFSET) (((OFFSET) + 16) / 4)
783 typedef void (*vbyte_func
) (int, char *, char *);
785 /* Forward declarations: */
786 static void dot_alias (int);
787 static int parse_operand (expressionS
*, int);
788 static void emit_one_bundle (void);
789 static bfd_reloc_code_real_type
ia64_gen_real_reloc_type (struct symbol
*,
790 bfd_reloc_code_real_type
);
791 static void insn_group_break (int, int, int);
792 static void add_qp_mutex (valueT
);
793 static void add_qp_imply (int, int);
794 static void clear_qp_mutex (valueT
);
795 static void clear_qp_implies (valueT
, valueT
);
796 static void print_dependency (const char *, int);
797 static void instruction_serialization (void);
798 static void data_serialization (void);
799 static void output_R3_format (vbyte_func
, unw_record_type
, unsigned long);
800 static void output_B3_format (vbyte_func
, unsigned long, unsigned long);
801 static void output_B4_format (vbyte_func
, unw_record_type
, unsigned long);
802 static void free_saved_prologue_counts (void);
804 /* Determine if application register REGNUM resides only in the integer
805 unit (as opposed to the memory unit). */
807 ar_is_only_in_integer_unit (int reg
)
810 return reg
>= 64 && reg
<= 111;
813 /* Determine if application register REGNUM resides only in the memory
814 unit (as opposed to the integer unit). */
816 ar_is_only_in_memory_unit (int reg
)
819 return reg
>= 0 && reg
<= 47;
822 /* Switch to section NAME and create section if necessary. It's
823 rather ugly that we have to manipulate input_line_pointer but I
824 don't see any other way to accomplish the same thing without
825 changing obj-elf.c (which may be the Right Thing, in the end). */
827 set_section (char *name
)
829 char *saved_input_line_pointer
;
831 saved_input_line_pointer
= input_line_pointer
;
832 input_line_pointer
= name
;
834 input_line_pointer
= saved_input_line_pointer
;
837 /* Map 's' to SHF_IA_64_SHORT. */
840 ia64_elf_section_letter (int letter
, char **ptr_msg
)
843 return SHF_IA_64_SHORT
;
844 else if (letter
== 'o')
845 return SHF_LINK_ORDER
;
847 else if (letter
== 'O')
848 return SHF_IA_64_VMS_OVERLAID
;
849 else if (letter
== 'g')
850 return SHF_IA_64_VMS_GLOBAL
;
853 *ptr_msg
= _("Bad .section directive: want a,o,s,w,x,M,S,G,T in string");
857 /* Map SHF_IA_64_SHORT to SEC_SMALL_DATA. */
860 ia64_elf_section_flags (flagword flags
,
862 int type ATTRIBUTE_UNUSED
)
864 if (attr
& SHF_IA_64_SHORT
)
865 flags
|= SEC_SMALL_DATA
;
870 ia64_elf_section_type (const char *str
, size_t len
)
872 #define STREQ(s) ((len == sizeof (s) - 1) && (strncmp (str, s, sizeof (s) - 1) == 0))
874 if (STREQ (ELF_STRING_ia64_unwind_info
))
877 if (STREQ (ELF_STRING_ia64_unwind_info_once
))
880 if (STREQ (ELF_STRING_ia64_unwind
))
881 return SHT_IA_64_UNWIND
;
883 if (STREQ (ELF_STRING_ia64_unwind_once
))
884 return SHT_IA_64_UNWIND
;
886 if (STREQ ("unwind"))
887 return SHT_IA_64_UNWIND
;
894 set_regstack (unsigned int ins
,
902 sof
= ins
+ locs
+ outs
;
905 as_bad (_("Size of frame exceeds maximum of 96 registers"));
910 as_warn (_("Size of rotating registers exceeds frame size"));
913 md
.in
.base
= REG_GR
+ 32;
914 md
.loc
.base
= md
.in
.base
+ ins
;
915 md
.out
.base
= md
.loc
.base
+ locs
;
917 md
.in
.num_regs
= ins
;
918 md
.loc
.num_regs
= locs
;
919 md
.out
.num_regs
= outs
;
920 md
.rot
.num_regs
= rots
;
925 ia64_flush_insns (void)
927 struct label_fix
*lfix
;
929 subsegT saved_subseg
;
933 if (!md
.last_text_seg
)
937 saved_subseg
= now_subseg
;
939 subseg_set (md
.last_text_seg
, 0);
941 while (md
.num_slots_in_use
> 0)
942 emit_one_bundle (); /* force out queued instructions */
944 /* In case there are labels following the last instruction, resolve
947 for (lfix
= CURR_SLOT
.label_fixups
; lfix
; lfix
= lfix
->next
)
949 symbol_set_value_now (lfix
->sym
);
950 mark
|= lfix
->dw2_mark_labels
;
954 dwarf2_where (&CURR_SLOT
.debug_line
);
955 CURR_SLOT
.debug_line
.flags
|= DWARF2_FLAG_BASIC_BLOCK
;
956 dwarf2_gen_line_info (frag_now_fix (), &CURR_SLOT
.debug_line
);
957 dwarf2_consume_line_info ();
959 CURR_SLOT
.label_fixups
= 0;
961 for (lfix
= CURR_SLOT
.tag_fixups
; lfix
; lfix
= lfix
->next
)
962 symbol_set_value_now (lfix
->sym
);
963 CURR_SLOT
.tag_fixups
= 0;
965 /* In case there are unwind directives following the last instruction,
966 resolve those now. We only handle prologue, body, and endp directives
967 here. Give an error for others. */
968 for (ptr
= unwind
.current_entry
; ptr
; ptr
= ptr
->next
)
976 ptr
->slot_number
= (unsigned long) frag_more (0);
977 ptr
->slot_frag
= frag_now
;
980 /* Allow any record which doesn't have a "t" field (i.e.,
981 doesn't relate to a particular instruction). */
997 as_bad (_("Unwind directive not followed by an instruction."));
1001 unwind
.current_entry
= NULL
;
1003 subseg_set (saved_seg
, saved_subseg
);
1005 if (md
.qp
.X_op
== O_register
)
1006 as_bad (_("qualifying predicate not followed by instruction"));
1010 ia64_do_align (int nbytes
)
1012 char *saved_input_line_pointer
= input_line_pointer
;
1014 input_line_pointer
= "";
1015 s_align_bytes (nbytes
);
1016 input_line_pointer
= saved_input_line_pointer
;
1020 ia64_cons_align (int nbytes
)
1024 char *saved_input_line_pointer
= input_line_pointer
;
1025 input_line_pointer
= "";
1026 s_align_bytes (nbytes
);
1027 input_line_pointer
= saved_input_line_pointer
;
1031 /* Output COUNT bytes to a memory location. */
1032 static char *vbyte_mem_ptr
= NULL
;
1035 output_vbyte_mem (int count
, char *ptr
, char *comment ATTRIBUTE_UNUSED
)
1038 if (vbyte_mem_ptr
== NULL
)
1043 for (x
= 0; x
< count
; x
++)
1044 *(vbyte_mem_ptr
++) = ptr
[x
];
1047 /* Count the number of bytes required for records. */
1048 static int vbyte_count
= 0;
1050 count_output (int count
,
1051 char *ptr ATTRIBUTE_UNUSED
,
1052 char *comment ATTRIBUTE_UNUSED
)
1054 vbyte_count
+= count
;
1058 output_R1_format (vbyte_func f
, unw_record_type rtype
, int rlen
)
1064 output_R3_format (f
, rtype
, rlen
);
1070 else if (rtype
!= prologue
)
1071 as_bad (_("record type is not valid"));
1073 byte
= UNW_R1
| (r
<< 5) | (rlen
& 0x1f);
1074 (*f
) (1, &byte
, NULL
);
1078 output_R2_format (vbyte_func f
, int mask
, int grsave
, unsigned long rlen
)
1082 mask
= (mask
& 0x0f);
1083 grsave
= (grsave
& 0x7f);
1085 bytes
[0] = (UNW_R2
| (mask
>> 1));
1086 bytes
[1] = (((mask
& 0x01) << 7) | grsave
);
1087 count
+= output_leb128 (bytes
+ 2, rlen
, 0);
1088 (*f
) (count
, bytes
, NULL
);
1092 output_R3_format (vbyte_func f
, unw_record_type rtype
, unsigned long rlen
)
1098 output_R1_format (f
, rtype
, rlen
);
1104 else if (rtype
!= prologue
)
1105 as_bad (_("record type is not valid"));
1106 bytes
[0] = (UNW_R3
| r
);
1107 count
= output_leb128 (bytes
+ 1, rlen
, 0);
1108 (*f
) (count
+ 1, bytes
, NULL
);
1112 output_P1_format (vbyte_func f
, int brmask
)
1115 byte
= UNW_P1
| (brmask
& 0x1f);
1116 (*f
) (1, &byte
, NULL
);
1120 output_P2_format (vbyte_func f
, int brmask
, int gr
)
1123 brmask
= (brmask
& 0x1f);
1124 bytes
[0] = UNW_P2
| (brmask
>> 1);
1125 bytes
[1] = (((brmask
& 1) << 7) | gr
);
1126 (*f
) (2, bytes
, NULL
);
1130 output_P3_format (vbyte_func f
, unw_record_type rtype
, int reg
)
1174 as_bad (_("Invalid record type for P3 format."));
1176 bytes
[0] = (UNW_P3
| (r
>> 1));
1177 bytes
[1] = (((r
& 1) << 7) | reg
);
1178 (*f
) (2, bytes
, NULL
);
1182 output_P4_format (vbyte_func f
, unsigned char *imask
, unsigned long imask_size
)
1185 (*f
) (imask_size
, (char *) imask
, NULL
);
1189 output_P5_format (vbyte_func f
, int grmask
, unsigned long frmask
)
1192 grmask
= (grmask
& 0x0f);
1195 bytes
[1] = ((grmask
<< 4) | ((frmask
& 0x000f0000) >> 16));
1196 bytes
[2] = ((frmask
& 0x0000ff00) >> 8);
1197 bytes
[3] = (frmask
& 0x000000ff);
1198 (*f
) (4, bytes
, NULL
);
1202 output_P6_format (vbyte_func f
, unw_record_type rtype
, int rmask
)
1207 if (rtype
== gr_mem
)
1209 else if (rtype
!= fr_mem
)
1210 as_bad (_("Invalid record type for format P6"));
1211 byte
= (UNW_P6
| (r
<< 4) | (rmask
& 0x0f));
1212 (*f
) (1, &byte
, NULL
);
1216 output_P7_format (vbyte_func f
,
1217 unw_record_type rtype
,
1224 count
+= output_leb128 (bytes
+ 1, w1
, 0);
1229 count
+= output_leb128 (bytes
+ count
, w2
>> 4, 0);
1279 bytes
[0] = (UNW_P7
| r
);
1280 (*f
) (count
, bytes
, NULL
);
1284 output_P8_format (vbyte_func f
, unw_record_type rtype
, unsigned long t
)
1322 case bspstore_psprel
:
1325 case bspstore_sprel
:
1337 case priunat_when_gr
:
1340 case priunat_psprel
:
1346 case priunat_when_mem
:
1353 count
+= output_leb128 (bytes
+ 2, t
, 0);
1354 (*f
) (count
, bytes
, NULL
);
1358 output_P9_format (vbyte_func f
, int grmask
, int gr
)
1362 bytes
[1] = (grmask
& 0x0f);
1363 bytes
[2] = (gr
& 0x7f);
1364 (*f
) (3, bytes
, NULL
);
1368 output_P10_format (vbyte_func f
, int abi
, int context
)
1372 bytes
[1] = (abi
& 0xff);
1373 bytes
[2] = (context
& 0xff);
1374 (*f
) (3, bytes
, NULL
);
1378 output_B1_format (vbyte_func f
, unw_record_type rtype
, unsigned long label
)
1384 output_B4_format (f
, rtype
, label
);
1387 if (rtype
== copy_state
)
1389 else if (rtype
!= label_state
)
1390 as_bad (_("Invalid record type for format B1"));
1392 byte
= (UNW_B1
| (r
<< 5) | (label
& 0x1f));
1393 (*f
) (1, &byte
, NULL
);
1397 output_B2_format (vbyte_func f
, unsigned long ecount
, unsigned long t
)
1403 output_B3_format (f
, ecount
, t
);
1406 bytes
[0] = (UNW_B2
| (ecount
& 0x1f));
1407 count
+= output_leb128 (bytes
+ 1, t
, 0);
1408 (*f
) (count
, bytes
, NULL
);
1412 output_B3_format (vbyte_func f
, unsigned long ecount
, unsigned long t
)
1418 output_B2_format (f
, ecount
, t
);
1422 count
+= output_leb128 (bytes
+ 1, t
, 0);
1423 count
+= output_leb128 (bytes
+ count
, ecount
, 0);
1424 (*f
) (count
, bytes
, NULL
);
1428 output_B4_format (vbyte_func f
, unw_record_type rtype
, unsigned long label
)
1435 output_B1_format (f
, rtype
, label
);
1439 if (rtype
== copy_state
)
1441 else if (rtype
!= label_state
)
1442 as_bad (_("Invalid record type for format B1"));
1444 bytes
[0] = (UNW_B4
| (r
<< 3));
1445 count
+= output_leb128 (bytes
+ 1, label
, 0);
1446 (*f
) (count
, bytes
, NULL
);
1450 format_ab_reg (int ab
, int reg
)
1455 ret
= (ab
<< 5) | reg
;
1460 output_X1_format (vbyte_func f
,
1461 unw_record_type rtype
,
1472 if (rtype
== spill_sprel
)
1474 else if (rtype
!= spill_psprel
)
1475 as_bad (_("Invalid record type for format X1"));
1476 bytes
[1] = ((r
<< 7) | format_ab_reg (ab
, reg
));
1477 count
+= output_leb128 (bytes
+ 2, t
, 0);
1478 count
+= output_leb128 (bytes
+ count
, w1
, 0);
1479 (*f
) (count
, bytes
, NULL
);
1483 output_X2_format (vbyte_func f
,
1494 bytes
[1] = (((x
& 1) << 7) | format_ab_reg (ab
, reg
));
1495 bytes
[2] = (((y
& 1) << 7) | (treg
& 0x7f));
1496 count
+= output_leb128 (bytes
+ 3, t
, 0);
1497 (*f
) (count
, bytes
, NULL
);
1501 output_X3_format (vbyte_func f
,
1502 unw_record_type rtype
,
1514 if (rtype
== spill_sprel_p
)
1516 else if (rtype
!= spill_psprel_p
)
1517 as_bad (_("Invalid record type for format X3"));
1518 bytes
[1] = ((r
<< 7) | (qp
& 0x3f));
1519 bytes
[2] = format_ab_reg (ab
, reg
);
1520 count
+= output_leb128 (bytes
+ 3, t
, 0);
1521 count
+= output_leb128 (bytes
+ count
, w1
, 0);
1522 (*f
) (count
, bytes
, NULL
);
1526 output_X4_format (vbyte_func f
,
1538 bytes
[1] = (qp
& 0x3f);
1539 bytes
[2] = (((x
& 1) << 7) | format_ab_reg (ab
, reg
));
1540 bytes
[3] = (((y
& 1) << 7) | (treg
& 0x7f));
1541 count
+= output_leb128 (bytes
+ 4, t
, 0);
1542 (*f
) (count
, bytes
, NULL
);
1545 /* This function checks whether there are any outstanding .save-s and
1546 discards them if so. */
1549 check_pending_save (void)
1551 if (unwind
.pending_saves
)
1553 unw_rec_list
*cur
, *prev
;
1555 as_warn (_("Previous .save incomplete"));
1556 for (cur
= unwind
.list
, prev
= NULL
; cur
; )
1557 if (&cur
->r
.record
.p
== unwind
.pending_saves
)
1560 prev
->next
= cur
->next
;
1562 unwind
.list
= cur
->next
;
1563 if (cur
== unwind
.tail
)
1565 if (cur
== unwind
.current_entry
)
1566 unwind
.current_entry
= cur
->next
;
1567 /* Don't free the first discarded record, it's being used as
1568 terminator for (currently) br_gr and gr_gr processing, and
1569 also prevents leaving a dangling pointer to it in its
1571 cur
->r
.record
.p
.grmask
= 0;
1572 cur
->r
.record
.p
.brmask
= 0;
1573 cur
->r
.record
.p
.frmask
= 0;
1574 prev
= cur
->r
.record
.p
.next
;
1575 cur
->r
.record
.p
.next
= NULL
;
1587 cur
= cur
->r
.record
.p
.next
;
1590 unwind
.pending_saves
= NULL
;
1594 /* This function allocates a record list structure, and initializes fields. */
1596 static unw_rec_list
*
1597 alloc_record (unw_record_type t
)
1600 ptr
= xmalloc (sizeof (*ptr
));
1601 memset (ptr
, 0, sizeof (*ptr
));
1602 ptr
->slot_number
= SLOT_NUM_NOT_SET
;
1607 /* Dummy unwind record used for calculating the length of the last prologue or
1610 static unw_rec_list
*
1613 unw_rec_list
*ptr
= alloc_record (endp
);
1617 static unw_rec_list
*
1618 output_prologue (void)
1620 unw_rec_list
*ptr
= alloc_record (prologue
);
1621 memset (&ptr
->r
.record
.r
.mask
, 0, sizeof (ptr
->r
.record
.r
.mask
));
1625 static unw_rec_list
*
1626 output_prologue_gr (unsigned int saved_mask
, unsigned int reg
)
1628 unw_rec_list
*ptr
= alloc_record (prologue_gr
);
1629 memset (&ptr
->r
.record
.r
.mask
, 0, sizeof (ptr
->r
.record
.r
.mask
));
1630 ptr
->r
.record
.r
.grmask
= saved_mask
;
1631 ptr
->r
.record
.r
.grsave
= reg
;
1635 static unw_rec_list
*
1638 unw_rec_list
*ptr
= alloc_record (body
);
1642 static unw_rec_list
*
1643 output_mem_stack_f (unsigned int size
)
1645 unw_rec_list
*ptr
= alloc_record (mem_stack_f
);
1646 ptr
->r
.record
.p
.size
= size
;
1650 static unw_rec_list
*
1651 output_mem_stack_v (void)
1653 unw_rec_list
*ptr
= alloc_record (mem_stack_v
);
1657 static unw_rec_list
*
1658 output_psp_gr (unsigned int gr
)
1660 unw_rec_list
*ptr
= alloc_record (psp_gr
);
1661 ptr
->r
.record
.p
.r
.gr
= gr
;
1665 static unw_rec_list
*
1666 output_psp_sprel (unsigned int offset
)
1668 unw_rec_list
*ptr
= alloc_record (psp_sprel
);
1669 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
1673 static unw_rec_list
*
1674 output_rp_when (void)
1676 unw_rec_list
*ptr
= alloc_record (rp_when
);
1680 static unw_rec_list
*
1681 output_rp_gr (unsigned int gr
)
1683 unw_rec_list
*ptr
= alloc_record (rp_gr
);
1684 ptr
->r
.record
.p
.r
.gr
= gr
;
1688 static unw_rec_list
*
1689 output_rp_br (unsigned int br
)
1691 unw_rec_list
*ptr
= alloc_record (rp_br
);
1692 ptr
->r
.record
.p
.r
.br
= br
;
1696 static unw_rec_list
*
1697 output_rp_psprel (unsigned int offset
)
1699 unw_rec_list
*ptr
= alloc_record (rp_psprel
);
1700 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
1704 static unw_rec_list
*
1705 output_rp_sprel (unsigned int offset
)
1707 unw_rec_list
*ptr
= alloc_record (rp_sprel
);
1708 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
1712 static unw_rec_list
*
1713 output_pfs_when (void)
1715 unw_rec_list
*ptr
= alloc_record (pfs_when
);
1719 static unw_rec_list
*
1720 output_pfs_gr (unsigned int gr
)
1722 unw_rec_list
*ptr
= alloc_record (pfs_gr
);
1723 ptr
->r
.record
.p
.r
.gr
= gr
;
1727 static unw_rec_list
*
1728 output_pfs_psprel (unsigned int offset
)
1730 unw_rec_list
*ptr
= alloc_record (pfs_psprel
);
1731 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
1735 static unw_rec_list
*
1736 output_pfs_sprel (unsigned int offset
)
1738 unw_rec_list
*ptr
= alloc_record (pfs_sprel
);
1739 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
1743 static unw_rec_list
*
1744 output_preds_when (void)
1746 unw_rec_list
*ptr
= alloc_record (preds_when
);
1750 static unw_rec_list
*
1751 output_preds_gr (unsigned int gr
)
1753 unw_rec_list
*ptr
= alloc_record (preds_gr
);
1754 ptr
->r
.record
.p
.r
.gr
= gr
;
1758 static unw_rec_list
*
1759 output_preds_psprel (unsigned int offset
)
1761 unw_rec_list
*ptr
= alloc_record (preds_psprel
);
1762 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
1766 static unw_rec_list
*
1767 output_preds_sprel (unsigned int offset
)
1769 unw_rec_list
*ptr
= alloc_record (preds_sprel
);
1770 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
1774 static unw_rec_list
*
1775 output_fr_mem (unsigned int mask
)
1777 unw_rec_list
*ptr
= alloc_record (fr_mem
);
1778 unw_rec_list
*cur
= ptr
;
1780 ptr
->r
.record
.p
.frmask
= mask
;
1781 unwind
.pending_saves
= &ptr
->r
.record
.p
;
1784 unw_rec_list
*prev
= cur
;
1786 /* Clear least significant set bit. */
1787 mask
&= ~(mask
& (~mask
+ 1));
1790 cur
= alloc_record (fr_mem
);
1791 cur
->r
.record
.p
.frmask
= mask
;
1792 /* Retain only least significant bit. */
1793 prev
->r
.record
.p
.frmask
^= mask
;
1794 prev
->r
.record
.p
.next
= cur
;
1798 static unw_rec_list
*
1799 output_frgr_mem (unsigned int gr_mask
, unsigned int fr_mask
)
1801 unw_rec_list
*ptr
= alloc_record (frgr_mem
);
1802 unw_rec_list
*cur
= ptr
;
1804 unwind
.pending_saves
= &cur
->r
.record
.p
;
1805 cur
->r
.record
.p
.frmask
= fr_mask
;
1808 unw_rec_list
*prev
= cur
;
1810 /* Clear least significant set bit. */
1811 fr_mask
&= ~(fr_mask
& (~fr_mask
+ 1));
1812 if (!gr_mask
&& !fr_mask
)
1814 cur
= alloc_record (frgr_mem
);
1815 cur
->r
.record
.p
.frmask
= fr_mask
;
1816 /* Retain only least significant bit. */
1817 prev
->r
.record
.p
.frmask
^= fr_mask
;
1818 prev
->r
.record
.p
.next
= cur
;
1820 cur
->r
.record
.p
.grmask
= gr_mask
;
1823 unw_rec_list
*prev
= cur
;
1825 /* Clear least significant set bit. */
1826 gr_mask
&= ~(gr_mask
& (~gr_mask
+ 1));
1829 cur
= alloc_record (frgr_mem
);
1830 cur
->r
.record
.p
.grmask
= gr_mask
;
1831 /* Retain only least significant bit. */
1832 prev
->r
.record
.p
.grmask
^= gr_mask
;
1833 prev
->r
.record
.p
.next
= cur
;
1837 static unw_rec_list
*
1838 output_gr_gr (unsigned int mask
, unsigned int reg
)
1840 unw_rec_list
*ptr
= alloc_record (gr_gr
);
1841 unw_rec_list
*cur
= ptr
;
1843 ptr
->r
.record
.p
.grmask
= mask
;
1844 ptr
->r
.record
.p
.r
.gr
= reg
;
1845 unwind
.pending_saves
= &ptr
->r
.record
.p
;
1848 unw_rec_list
*prev
= cur
;
1850 /* Clear least significant set bit. */
1851 mask
&= ~(mask
& (~mask
+ 1));
1854 cur
= alloc_record (gr_gr
);
1855 cur
->r
.record
.p
.grmask
= mask
;
1856 /* Indicate this record shouldn't be output. */
1857 cur
->r
.record
.p
.r
.gr
= REG_NUM
;
1858 /* Retain only least significant bit. */
1859 prev
->r
.record
.p
.grmask
^= mask
;
1860 prev
->r
.record
.p
.next
= cur
;
1864 static unw_rec_list
*
1865 output_gr_mem (unsigned int mask
)
1867 unw_rec_list
*ptr
= alloc_record (gr_mem
);
1868 unw_rec_list
*cur
= ptr
;
1870 ptr
->r
.record
.p
.grmask
= mask
;
1871 unwind
.pending_saves
= &ptr
->r
.record
.p
;
1874 unw_rec_list
*prev
= cur
;
1876 /* Clear least significant set bit. */
1877 mask
&= ~(mask
& (~mask
+ 1));
1880 cur
= alloc_record (gr_mem
);
1881 cur
->r
.record
.p
.grmask
= mask
;
1882 /* Retain only least significant bit. */
1883 prev
->r
.record
.p
.grmask
^= mask
;
1884 prev
->r
.record
.p
.next
= cur
;
1888 static unw_rec_list
*
1889 output_br_mem (unsigned int mask
)
1891 unw_rec_list
*ptr
= alloc_record (br_mem
);
1892 unw_rec_list
*cur
= ptr
;
1894 ptr
->r
.record
.p
.brmask
= mask
;
1895 unwind
.pending_saves
= &ptr
->r
.record
.p
;
1898 unw_rec_list
*prev
= cur
;
1900 /* Clear least significant set bit. */
1901 mask
&= ~(mask
& (~mask
+ 1));
1904 cur
= alloc_record (br_mem
);
1905 cur
->r
.record
.p
.brmask
= mask
;
1906 /* Retain only least significant bit. */
1907 prev
->r
.record
.p
.brmask
^= mask
;
1908 prev
->r
.record
.p
.next
= cur
;
1912 static unw_rec_list
*
1913 output_br_gr (unsigned int mask
, unsigned int reg
)
1915 unw_rec_list
*ptr
= alloc_record (br_gr
);
1916 unw_rec_list
*cur
= ptr
;
1918 ptr
->r
.record
.p
.brmask
= mask
;
1919 ptr
->r
.record
.p
.r
.gr
= reg
;
1920 unwind
.pending_saves
= &ptr
->r
.record
.p
;
1923 unw_rec_list
*prev
= cur
;
1925 /* Clear least significant set bit. */
1926 mask
&= ~(mask
& (~mask
+ 1));
1929 cur
= alloc_record (br_gr
);
1930 cur
->r
.record
.p
.brmask
= mask
;
1931 /* Indicate this record shouldn't be output. */
1932 cur
->r
.record
.p
.r
.gr
= REG_NUM
;
1933 /* Retain only least significant bit. */
1934 prev
->r
.record
.p
.brmask
^= mask
;
1935 prev
->r
.record
.p
.next
= cur
;
1939 static unw_rec_list
*
1940 output_spill_base (unsigned int offset
)
1942 unw_rec_list
*ptr
= alloc_record (spill_base
);
1943 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
1947 static unw_rec_list
*
1948 output_unat_when (void)
1950 unw_rec_list
*ptr
= alloc_record (unat_when
);
1954 static unw_rec_list
*
1955 output_unat_gr (unsigned int gr
)
1957 unw_rec_list
*ptr
= alloc_record (unat_gr
);
1958 ptr
->r
.record
.p
.r
.gr
= gr
;
1962 static unw_rec_list
*
1963 output_unat_psprel (unsigned int offset
)
1965 unw_rec_list
*ptr
= alloc_record (unat_psprel
);
1966 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
1970 static unw_rec_list
*
1971 output_unat_sprel (unsigned int offset
)
1973 unw_rec_list
*ptr
= alloc_record (unat_sprel
);
1974 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
1978 static unw_rec_list
*
1979 output_lc_when (void)
1981 unw_rec_list
*ptr
= alloc_record (lc_when
);
1985 static unw_rec_list
*
1986 output_lc_gr (unsigned int gr
)
1988 unw_rec_list
*ptr
= alloc_record (lc_gr
);
1989 ptr
->r
.record
.p
.r
.gr
= gr
;
1993 static unw_rec_list
*
1994 output_lc_psprel (unsigned int offset
)
1996 unw_rec_list
*ptr
= alloc_record (lc_psprel
);
1997 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
2001 static unw_rec_list
*
2002 output_lc_sprel (unsigned int offset
)
2004 unw_rec_list
*ptr
= alloc_record (lc_sprel
);
2005 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
2009 static unw_rec_list
*
2010 output_fpsr_when (void)
2012 unw_rec_list
*ptr
= alloc_record (fpsr_when
);
2016 static unw_rec_list
*
2017 output_fpsr_gr (unsigned int gr
)
2019 unw_rec_list
*ptr
= alloc_record (fpsr_gr
);
2020 ptr
->r
.record
.p
.r
.gr
= gr
;
2024 static unw_rec_list
*
2025 output_fpsr_psprel (unsigned int offset
)
2027 unw_rec_list
*ptr
= alloc_record (fpsr_psprel
);
2028 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
2032 static unw_rec_list
*
2033 output_fpsr_sprel (unsigned int offset
)
2035 unw_rec_list
*ptr
= alloc_record (fpsr_sprel
);
2036 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
2040 static unw_rec_list
*
2041 output_priunat_when_gr (void)
2043 unw_rec_list
*ptr
= alloc_record (priunat_when_gr
);
2047 static unw_rec_list
*
2048 output_priunat_when_mem (void)
2050 unw_rec_list
*ptr
= alloc_record (priunat_when_mem
);
2054 static unw_rec_list
*
2055 output_priunat_gr (unsigned int gr
)
2057 unw_rec_list
*ptr
= alloc_record (priunat_gr
);
2058 ptr
->r
.record
.p
.r
.gr
= gr
;
2062 static unw_rec_list
*
2063 output_priunat_psprel (unsigned int offset
)
2065 unw_rec_list
*ptr
= alloc_record (priunat_psprel
);
2066 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
2070 static unw_rec_list
*
2071 output_priunat_sprel (unsigned int offset
)
2073 unw_rec_list
*ptr
= alloc_record (priunat_sprel
);
2074 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
2078 static unw_rec_list
*
2079 output_bsp_when (void)
2081 unw_rec_list
*ptr
= alloc_record (bsp_when
);
2085 static unw_rec_list
*
2086 output_bsp_gr (unsigned int gr
)
2088 unw_rec_list
*ptr
= alloc_record (bsp_gr
);
2089 ptr
->r
.record
.p
.r
.gr
= gr
;
2093 static unw_rec_list
*
2094 output_bsp_psprel (unsigned int offset
)
2096 unw_rec_list
*ptr
= alloc_record (bsp_psprel
);
2097 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
2101 static unw_rec_list
*
2102 output_bsp_sprel (unsigned int offset
)
2104 unw_rec_list
*ptr
= alloc_record (bsp_sprel
);
2105 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
2109 static unw_rec_list
*
2110 output_bspstore_when (void)
2112 unw_rec_list
*ptr
= alloc_record (bspstore_when
);
2116 static unw_rec_list
*
2117 output_bspstore_gr (unsigned int gr
)
2119 unw_rec_list
*ptr
= alloc_record (bspstore_gr
);
2120 ptr
->r
.record
.p
.r
.gr
= gr
;
2124 static unw_rec_list
*
2125 output_bspstore_psprel (unsigned int offset
)
2127 unw_rec_list
*ptr
= alloc_record (bspstore_psprel
);
2128 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
2132 static unw_rec_list
*
2133 output_bspstore_sprel (unsigned int offset
)
2135 unw_rec_list
*ptr
= alloc_record (bspstore_sprel
);
2136 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
2140 static unw_rec_list
*
2141 output_rnat_when (void)
2143 unw_rec_list
*ptr
= alloc_record (rnat_when
);
2147 static unw_rec_list
*
2148 output_rnat_gr (unsigned int gr
)
2150 unw_rec_list
*ptr
= alloc_record (rnat_gr
);
2151 ptr
->r
.record
.p
.r
.gr
= gr
;
2155 static unw_rec_list
*
2156 output_rnat_psprel (unsigned int offset
)
2158 unw_rec_list
*ptr
= alloc_record (rnat_psprel
);
2159 ptr
->r
.record
.p
.off
.psp
= ENCODED_PSP_OFFSET (offset
);
2163 static unw_rec_list
*
2164 output_rnat_sprel (unsigned int offset
)
2166 unw_rec_list
*ptr
= alloc_record (rnat_sprel
);
2167 ptr
->r
.record
.p
.off
.sp
= offset
/ 4;
2171 static unw_rec_list
*
2172 output_unwabi (unsigned long abi
, unsigned long context
)
2174 unw_rec_list
*ptr
= alloc_record (unwabi
);
2175 ptr
->r
.record
.p
.abi
= abi
;
2176 ptr
->r
.record
.p
.context
= context
;
2180 static unw_rec_list
*
2181 output_epilogue (unsigned long ecount
)
2183 unw_rec_list
*ptr
= alloc_record (epilogue
);
2184 ptr
->r
.record
.b
.ecount
= ecount
;
2188 static unw_rec_list
*
2189 output_label_state (unsigned long label
)
2191 unw_rec_list
*ptr
= alloc_record (label_state
);
2192 ptr
->r
.record
.b
.label
= label
;
2196 static unw_rec_list
*
2197 output_copy_state (unsigned long label
)
2199 unw_rec_list
*ptr
= alloc_record (copy_state
);
2200 ptr
->r
.record
.b
.label
= label
;
2204 static unw_rec_list
*
2205 output_spill_psprel (unsigned int ab
,
2207 unsigned int offset
,
2208 unsigned int predicate
)
2210 unw_rec_list
*ptr
= alloc_record (predicate
? spill_psprel_p
: spill_psprel
);
2211 ptr
->r
.record
.x
.ab
= ab
;
2212 ptr
->r
.record
.x
.reg
= reg
;
2213 ptr
->r
.record
.x
.where
.pspoff
= ENCODED_PSP_OFFSET (offset
);
2214 ptr
->r
.record
.x
.qp
= predicate
;
2218 static unw_rec_list
*
2219 output_spill_sprel (unsigned int ab
,
2221 unsigned int offset
,
2222 unsigned int predicate
)
2224 unw_rec_list
*ptr
= alloc_record (predicate
? spill_sprel_p
: spill_sprel
);
2225 ptr
->r
.record
.x
.ab
= ab
;
2226 ptr
->r
.record
.x
.reg
= reg
;
2227 ptr
->r
.record
.x
.where
.spoff
= offset
/ 4;
2228 ptr
->r
.record
.x
.qp
= predicate
;
2232 static unw_rec_list
*
2233 output_spill_reg (unsigned int ab
,
2235 unsigned int targ_reg
,
2237 unsigned int predicate
)
2239 unw_rec_list
*ptr
= alloc_record (predicate
? spill_reg_p
: spill_reg
);
2240 ptr
->r
.record
.x
.ab
= ab
;
2241 ptr
->r
.record
.x
.reg
= reg
;
2242 ptr
->r
.record
.x
.where
.reg
= targ_reg
;
2243 ptr
->r
.record
.x
.xy
= xy
;
2244 ptr
->r
.record
.x
.qp
= predicate
;
2248 /* Given a unw_rec_list process the correct format with the
2249 specified function. */
2252 process_one_record (unw_rec_list
*ptr
, vbyte_func f
)
2254 unsigned int fr_mask
, gr_mask
;
2256 switch (ptr
->r
.type
)
2258 /* This is a dummy record that takes up no space in the output. */
2266 /* These are taken care of by prologue/prologue_gr. */
2271 if (ptr
->r
.type
== prologue_gr
)
2272 output_R2_format (f
, ptr
->r
.record
.r
.grmask
,
2273 ptr
->r
.record
.r
.grsave
, ptr
->r
.record
.r
.rlen
);
2275 output_R1_format (f
, ptr
->r
.type
, ptr
->r
.record
.r
.rlen
);
2277 /* Output descriptor(s) for union of register spills (if any). */
2278 gr_mask
= ptr
->r
.record
.r
.mask
.gr_mem
;
2279 fr_mask
= ptr
->r
.record
.r
.mask
.fr_mem
;
2282 if ((fr_mask
& ~0xfUL
) == 0)
2283 output_P6_format (f
, fr_mem
, fr_mask
);
2286 output_P5_format (f
, gr_mask
, fr_mask
);
2291 output_P6_format (f
, gr_mem
, gr_mask
);
2292 if (ptr
->r
.record
.r
.mask
.br_mem
)
2293 output_P1_format (f
, ptr
->r
.record
.r
.mask
.br_mem
);
2295 /* output imask descriptor if necessary: */
2296 if (ptr
->r
.record
.r
.mask
.i
)
2297 output_P4_format (f
, ptr
->r
.record
.r
.mask
.i
,
2298 ptr
->r
.record
.r
.imask_size
);
2302 output_R1_format (f
, ptr
->r
.type
, ptr
->r
.record
.r
.rlen
);
2306 output_P7_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.t
,
2307 ptr
->r
.record
.p
.size
);
2320 output_P3_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.r
.gr
);
2323 output_P3_format (f
, rp_br
, ptr
->r
.record
.p
.r
.br
);
2326 output_P7_format (f
, psp_sprel
, ptr
->r
.record
.p
.off
.sp
, 0);
2334 output_P7_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.t
, 0);
2343 output_P7_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.off
.psp
, 0);
2353 case bspstore_sprel
:
2355 output_P8_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.off
.sp
);
2358 if (ptr
->r
.record
.p
.r
.gr
< REG_NUM
)
2360 const unw_rec_list
*cur
= ptr
;
2362 gr_mask
= cur
->r
.record
.p
.grmask
;
2363 while ((cur
= cur
->r
.record
.p
.next
) != NULL
)
2364 gr_mask
|= cur
->r
.record
.p
.grmask
;
2365 output_P9_format (f
, gr_mask
, ptr
->r
.record
.p
.r
.gr
);
2369 if (ptr
->r
.record
.p
.r
.gr
< REG_NUM
)
2371 const unw_rec_list
*cur
= ptr
;
2373 gr_mask
= cur
->r
.record
.p
.brmask
;
2374 while ((cur
= cur
->r
.record
.p
.next
) != NULL
)
2375 gr_mask
|= cur
->r
.record
.p
.brmask
;
2376 output_P2_format (f
, gr_mask
, ptr
->r
.record
.p
.r
.gr
);
2380 as_bad (_("spill_mask record unimplemented."));
2382 case priunat_when_gr
:
2383 case priunat_when_mem
:
2387 output_P8_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.t
);
2389 case priunat_psprel
:
2391 case bspstore_psprel
:
2393 output_P8_format (f
, ptr
->r
.type
, ptr
->r
.record
.p
.off
.psp
);
2396 output_P10_format (f
, ptr
->r
.record
.p
.abi
, ptr
->r
.record
.p
.context
);
2399 output_B3_format (f
, ptr
->r
.record
.b
.ecount
, ptr
->r
.record
.b
.t
);
2403 output_B4_format (f
, ptr
->r
.type
, ptr
->r
.record
.b
.label
);
2406 output_X1_format (f
, ptr
->r
.type
, ptr
->r
.record
.x
.ab
,
2407 ptr
->r
.record
.x
.reg
, ptr
->r
.record
.x
.t
,
2408 ptr
->r
.record
.x
.where
.pspoff
);
2411 output_X1_format (f
, ptr
->r
.type
, ptr
->r
.record
.x
.ab
,
2412 ptr
->r
.record
.x
.reg
, ptr
->r
.record
.x
.t
,
2413 ptr
->r
.record
.x
.where
.spoff
);
2416 output_X2_format (f
, ptr
->r
.record
.x
.ab
, ptr
->r
.record
.x
.reg
,
2417 ptr
->r
.record
.x
.xy
>> 1, ptr
->r
.record
.x
.xy
,
2418 ptr
->r
.record
.x
.where
.reg
, ptr
->r
.record
.x
.t
);
2420 case spill_psprel_p
:
2421 output_X3_format (f
, ptr
->r
.type
, ptr
->r
.record
.x
.qp
,
2422 ptr
->r
.record
.x
.ab
, ptr
->r
.record
.x
.reg
,
2423 ptr
->r
.record
.x
.t
, ptr
->r
.record
.x
.where
.pspoff
);
2426 output_X3_format (f
, ptr
->r
.type
, ptr
->r
.record
.x
.qp
,
2427 ptr
->r
.record
.x
.ab
, ptr
->r
.record
.x
.reg
,
2428 ptr
->r
.record
.x
.t
, ptr
->r
.record
.x
.where
.spoff
);
2431 output_X4_format (f
, ptr
->r
.record
.x
.qp
, ptr
->r
.record
.x
.ab
,
2432 ptr
->r
.record
.x
.reg
, ptr
->r
.record
.x
.xy
>> 1,
2433 ptr
->r
.record
.x
.xy
, ptr
->r
.record
.x
.where
.reg
,
2437 as_bad (_("record_type_not_valid"));
2442 /* Given a unw_rec_list list, process all the records with
2443 the specified function. */
2445 process_unw_records (unw_rec_list
*list
, vbyte_func f
)
2448 for (ptr
= list
; ptr
; ptr
= ptr
->next
)
2449 process_one_record (ptr
, f
);
2452 /* Determine the size of a record list in bytes. */
2454 calc_record_size (unw_rec_list
*list
)
2457 process_unw_records (list
, count_output
);
2461 /* Return the number of bits set in the input value.
2462 Perhaps this has a better place... */
2463 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
2464 # define popcount __builtin_popcount
2467 popcount (unsigned x
)
2469 static const unsigned char popcnt
[16] =
2477 if (x
< NELEMS (popcnt
))
2479 return popcnt
[x
% NELEMS (popcnt
)] + popcount (x
/ NELEMS (popcnt
));
2483 /* Update IMASK bitmask to reflect the fact that one or more registers
2484 of type TYPE are saved starting at instruction with index T. If N
2485 bits are set in REGMASK, it is assumed that instructions T through
2486 T+N-1 save these registers.
2490 1: instruction saves next fp reg
2491 2: instruction saves next general reg
2492 3: instruction saves next branch reg */
2494 set_imask (unw_rec_list
*region
,
2495 unsigned long regmask
,
2499 unsigned char *imask
;
2500 unsigned long imask_size
;
2504 imask
= region
->r
.record
.r
.mask
.i
;
2505 imask_size
= region
->r
.record
.r
.imask_size
;
2508 imask_size
= (region
->r
.record
.r
.rlen
* 2 + 7) / 8 + 1;
2509 imask
= xmalloc (imask_size
);
2510 memset (imask
, 0, imask_size
);
2512 region
->r
.record
.r
.imask_size
= imask_size
;
2513 region
->r
.record
.r
.mask
.i
= imask
;
2517 pos
= 2 * (3 - t
% 4);
2520 if (i
>= imask_size
)
2522 as_bad (_("Ignoring attempt to spill beyond end of region"));
2526 imask
[i
] |= (type
& 0x3) << pos
;
2528 regmask
&= (regmask
- 1);
2538 /* Return the number of instruction slots from FIRST_ADDR to SLOT_ADDR.
2539 SLOT_FRAG is the frag containing SLOT_ADDR, and FIRST_FRAG is the frag
2540 containing FIRST_ADDR. If BEFORE_RELAX, then we use worst-case estimates
2543 static unsigned long
2544 slot_index (unsigned long slot_addr
,
2546 unsigned long first_addr
,
2550 unsigned long index
= 0;
2552 /* First time we are called, the initial address and frag are invalid. */
2553 if (first_addr
== 0)
2556 /* If the two addresses are in different frags, then we need to add in
2557 the remaining size of this frag, and then the entire size of intermediate
2559 while (slot_frag
!= first_frag
)
2561 unsigned long start_addr
= (unsigned long) &first_frag
->fr_literal
;
2565 /* We can get the final addresses only during and after
2567 if (first_frag
->fr_next
&& first_frag
->fr_next
->fr_address
)
2568 index
+= 3 * ((first_frag
->fr_next
->fr_address
2569 - first_frag
->fr_address
2570 - first_frag
->fr_fix
) >> 4);
2573 /* We don't know what the final addresses will be. We try our
2574 best to estimate. */
2575 switch (first_frag
->fr_type
)
2581 as_fatal (_("Only constant space allocation is supported"));
2587 /* Take alignment into account. Assume the worst case
2588 before relaxation. */
2589 index
+= 3 * ((1 << first_frag
->fr_offset
) >> 4);
2593 if (first_frag
->fr_symbol
)
2595 as_fatal (_("Only constant offsets are supported"));
2599 index
+= 3 * (first_frag
->fr_offset
>> 4);
2603 /* Add in the full size of the frag converted to instruction slots. */
2604 index
+= 3 * (first_frag
->fr_fix
>> 4);
2605 /* Subtract away the initial part before first_addr. */
2606 index
-= (3 * ((first_addr
>> 4) - (start_addr
>> 4))
2607 + ((first_addr
& 0x3) - (start_addr
& 0x3)));
2609 /* Move to the beginning of the next frag. */
2610 first_frag
= first_frag
->fr_next
;
2611 first_addr
= (unsigned long) &first_frag
->fr_literal
;
2613 /* This can happen if there is section switching in the middle of a
2614 function, causing the frag chain for the function to be broken.
2615 It is too difficult to recover safely from this problem, so we just
2616 exit with an error. */
2617 if (first_frag
== NULL
)
2618 as_fatal (_("Section switching in code is not supported."));
2621 /* Add in the used part of the last frag. */
2622 index
+= (3 * ((slot_addr
>> 4) - (first_addr
>> 4))
2623 + ((slot_addr
& 0x3) - (first_addr
& 0x3)));
2627 /* Optimize unwind record directives. */
2629 static unw_rec_list
*
2630 optimize_unw_records (unw_rec_list
*list
)
2635 /* If the only unwind record is ".prologue" or ".prologue" followed
2636 by ".body", then we can optimize the unwind directives away. */
2637 if (list
->r
.type
== prologue
2638 && (list
->next
->r
.type
== endp
2639 || (list
->next
->r
.type
== body
&& list
->next
->next
->r
.type
== endp
)))
2645 /* Given a complete record list, process any records which have
2646 unresolved fields, (ie length counts for a prologue). After
2647 this has been run, all necessary information should be available
2648 within each record to generate an image. */
2651 fixup_unw_records (unw_rec_list
*list
, int before_relax
)
2653 unw_rec_list
*ptr
, *region
= 0;
2654 unsigned long first_addr
= 0, rlen
= 0, t
;
2655 fragS
*first_frag
= 0;
2657 for (ptr
= list
; ptr
; ptr
= ptr
->next
)
2659 if (ptr
->slot_number
== SLOT_NUM_NOT_SET
)
2660 as_bad (_(" Insn slot not set in unwind record."));
2661 t
= slot_index (ptr
->slot_number
, ptr
->slot_frag
,
2662 first_addr
, first_frag
, before_relax
);
2663 switch (ptr
->r
.type
)
2671 unsigned long last_addr
= 0;
2672 fragS
*last_frag
= NULL
;
2674 first_addr
= ptr
->slot_number
;
2675 first_frag
= ptr
->slot_frag
;
2676 /* Find either the next body/prologue start, or the end of
2677 the function, and determine the size of the region. */
2678 for (last
= ptr
->next
; last
!= NULL
; last
= last
->next
)
2679 if (last
->r
.type
== prologue
|| last
->r
.type
== prologue_gr
2680 || last
->r
.type
== body
|| last
->r
.type
== endp
)
2682 last_addr
= last
->slot_number
;
2683 last_frag
= last
->slot_frag
;
2686 size
= slot_index (last_addr
, last_frag
, first_addr
, first_frag
,
2688 rlen
= ptr
->r
.record
.r
.rlen
= size
;
2689 if (ptr
->r
.type
== body
)
2690 /* End of region. */
2698 ptr
->r
.record
.b
.t
= rlen
- 1 - t
;
2700 /* This happens when a memory-stack-less procedure uses a
2701 ".restore sp" directive at the end of a region to pop
2703 ptr
->r
.record
.b
.t
= 0;
2714 case priunat_when_gr
:
2715 case priunat_when_mem
:
2719 ptr
->r
.record
.p
.t
= t
;
2727 case spill_psprel_p
:
2728 ptr
->r
.record
.x
.t
= t
;
2734 as_bad (_("frgr_mem record before region record!"));
2737 region
->r
.record
.r
.mask
.fr_mem
|= ptr
->r
.record
.p
.frmask
;
2738 region
->r
.record
.r
.mask
.gr_mem
|= ptr
->r
.record
.p
.grmask
;
2739 set_imask (region
, ptr
->r
.record
.p
.frmask
, t
, 1);
2740 set_imask (region
, ptr
->r
.record
.p
.grmask
, t
, 2);
2745 as_bad (_("fr_mem record before region record!"));
2748 region
->r
.record
.r
.mask
.fr_mem
|= ptr
->r
.record
.p
.frmask
;
2749 set_imask (region
, ptr
->r
.record
.p
.frmask
, t
, 1);
2754 as_bad (_("gr_mem record before region record!"));
2757 region
->r
.record
.r
.mask
.gr_mem
|= ptr
->r
.record
.p
.grmask
;
2758 set_imask (region
, ptr
->r
.record
.p
.grmask
, t
, 2);
2763 as_bad (_("br_mem record before region record!"));
2766 region
->r
.record
.r
.mask
.br_mem
|= ptr
->r
.record
.p
.brmask
;
2767 set_imask (region
, ptr
->r
.record
.p
.brmask
, t
, 3);
2773 as_bad (_("gr_gr record before region record!"));
2776 set_imask (region
, ptr
->r
.record
.p
.grmask
, t
, 2);
2781 as_bad (_("br_gr record before region record!"));
2784 set_imask (region
, ptr
->r
.record
.p
.brmask
, t
, 3);
2793 /* Estimate the size of a frag before relaxing. We only have one type of frag
2794 to handle here, which is the unwind info frag. */
2797 ia64_estimate_size_before_relax (fragS
*frag
,
2798 asection
*segtype ATTRIBUTE_UNUSED
)
2803 /* ??? This code is identical to the first part of ia64_convert_frag. */
2804 list
= (unw_rec_list
*) frag
->fr_opcode
;
2805 fixup_unw_records (list
, 0);
2807 len
= calc_record_size (list
);
2808 /* pad to pointer-size boundary. */
2809 pad
= len
% md
.pointer_size
;
2811 len
+= md
.pointer_size
- pad
;
2812 /* Add 8 for the header. */
2814 /* Add a pointer for the personality offset. */
2815 if (frag
->fr_offset
)
2816 size
+= md
.pointer_size
;
2818 /* fr_var carries the max_chars that we created the fragment with.
2819 We must, of course, have allocated enough memory earlier. */
2820 gas_assert (frag
->fr_var
>= size
);
2822 return frag
->fr_fix
+ size
;
2825 /* This function converts a rs_machine_dependent variant frag into a
2826 normal fill frag with the unwind image from the the record list. */
2828 ia64_convert_frag (fragS
*frag
)
2834 /* ??? This code is identical to ia64_estimate_size_before_relax. */
2835 list
= (unw_rec_list
*) frag
->fr_opcode
;
2836 fixup_unw_records (list
, 0);
2838 len
= calc_record_size (list
);
2839 /* pad to pointer-size boundary. */
2840 pad
= len
% md
.pointer_size
;
2842 len
+= md
.pointer_size
- pad
;
2843 /* Add 8 for the header. */
2845 /* Add a pointer for the personality offset. */
2846 if (frag
->fr_offset
)
2847 size
+= md
.pointer_size
;
2849 /* fr_var carries the max_chars that we created the fragment with.
2850 We must, of course, have allocated enough memory earlier. */
2851 gas_assert (frag
->fr_var
>= size
);
2853 /* Initialize the header area. fr_offset is initialized with
2854 unwind.personality_routine. */
2855 if (frag
->fr_offset
)
2857 if (md
.flags
& EF_IA_64_ABI64
)
2858 flag_value
= (bfd_vma
) 3 << 32;
2860 /* 32-bit unwind info block. */
2861 flag_value
= (bfd_vma
) 0x1003 << 32;
2866 md_number_to_chars (frag
->fr_literal
,
2867 (((bfd_vma
) 1 << 48) /* Version. */
2868 | flag_value
/* U & E handler flags. */
2869 | (len
/ md
.pointer_size
)), /* Length. */
2872 /* Skip the header. */
2873 vbyte_mem_ptr
= frag
->fr_literal
+ 8;
2874 process_unw_records (list
, output_vbyte_mem
);
2876 /* Fill the padding bytes with zeros. */
2878 md_number_to_chars (frag
->fr_literal
+ len
+ 8 - md
.pointer_size
+ pad
, 0,
2879 md
.pointer_size
- pad
);
2880 /* Fill the unwind personality with zeros. */
2881 if (frag
->fr_offset
)
2882 md_number_to_chars (frag
->fr_literal
+ size
- md
.pointer_size
, 0,
2885 frag
->fr_fix
+= size
;
2886 frag
->fr_type
= rs_fill
;
2888 frag
->fr_offset
= 0;
2892 parse_predicate_and_operand (expressionS
*e
, unsigned *qp
, const char *po
)
2894 int sep
= parse_operand (e
, ',');
2896 *qp
= e
->X_add_number
- REG_P
;
2897 if (e
->X_op
!= O_register
|| *qp
> 63)
2899 as_bad (_("First operand to .%s must be a predicate"), po
);
2903 as_warn (_("Pointless use of p0 as first operand to .%s"), po
);
2905 sep
= parse_operand (e
, ',');
2912 convert_expr_to_ab_reg (const expressionS
*e
,
2918 unsigned int reg
= e
->X_add_number
;
2920 *ab
= *regp
= 0; /* Anything valid is good here. */
2922 if (e
->X_op
!= O_register
)
2923 reg
= REG_GR
; /* Anything invalid is good here. */
2925 if (reg
>= (REG_GR
+ 4) && reg
<= (REG_GR
+ 7))
2928 *regp
= reg
- REG_GR
;
2930 else if ((reg
>= (REG_FR
+ 2) && reg
<= (REG_FR
+ 5))
2931 || (reg
>= (REG_FR
+ 16) && reg
<= (REG_FR
+ 31)))
2934 *regp
= reg
- REG_FR
;
2936 else if (reg
>= (REG_BR
+ 1) && reg
<= (REG_BR
+ 5))
2939 *regp
= reg
- REG_BR
;
2946 case REG_PR
: *regp
= 0; break;
2947 case REG_PSP
: *regp
= 1; break;
2948 case REG_PRIUNAT
: *regp
= 2; break;
2949 case REG_BR
+ 0: *regp
= 3; break;
2950 case REG_AR
+ AR_BSP
: *regp
= 4; break;
2951 case REG_AR
+ AR_BSPSTORE
: *regp
= 5; break;
2952 case REG_AR
+ AR_RNAT
: *regp
= 6; break;
2953 case REG_AR
+ AR_UNAT
: *regp
= 7; break;
2954 case REG_AR
+ AR_FPSR
: *regp
= 8; break;
2955 case REG_AR
+ AR_PFS
: *regp
= 9; break;
2956 case REG_AR
+ AR_LC
: *regp
= 10; break;
2959 as_bad (_("Operand %d to .%s must be a preserved register"), n
, po
);
2966 convert_expr_to_xy_reg (const expressionS
*e
,
2972 unsigned int reg
= e
->X_add_number
;
2974 *xy
= *regp
= 0; /* Anything valid is good here. */
2976 if (e
->X_op
!= O_register
)
2977 reg
= REG_GR
; /* Anything invalid is good here. */
2979 if (reg
>= (REG_GR
+ 1) && reg
<= (REG_GR
+ 127))
2982 *regp
= reg
- REG_GR
;
2984 else if (reg
>= (REG_FR
+ 2) && reg
<= (REG_FR
+ 127))
2987 *regp
= reg
- REG_FR
;
2989 else if (reg
>= REG_BR
&& reg
<= (REG_BR
+ 7))
2992 *regp
= reg
- REG_BR
;
2995 as_bad (_("Operand %d to .%s must be a writable register"), n
, po
);
3001 /* The current frag is an alignment frag. */
3002 align_frag
= frag_now
;
3003 s_align_bytes (arg
);
3007 dot_radix (int dummy ATTRIBUTE_UNUSED
)
3014 if (is_it_end_of_statement ())
3016 radix
= input_line_pointer
;
3017 ch
= get_symbol_end ();
3018 ia64_canonicalize_symbol_name (radix
);
3019 if (strcasecmp (radix
, "C"))
3020 as_bad (_("Radix `%s' unsupported or invalid"), radix
);
3021 *input_line_pointer
= ch
;
3022 demand_empty_rest_of_line ();
3025 /* Helper function for .loc directives. If the assembler is not generating
3026 line number info, then we need to remember which instructions have a .loc
3027 directive, and only call dwarf2_gen_line_info for those instructions. */
3032 CURR_SLOT
.loc_directive_seen
= 1;
3033 dwarf2_directive_loc (x
);
3036 /* .sbss, .bss etc. are macros that expand into ".section SECNAME". */
3038 dot_special_section (int which
)
3040 set_section ((char *) special_section_name
[which
]);
3043 /* Return -1 for warning and 0 for error. */
3046 unwind_diagnostic (const char * region
, const char *directive
)
3048 if (md
.unwind_check
== unwind_check_warning
)
3050 as_warn (_(".%s outside of %s"), directive
, region
);
3055 as_bad (_(".%s outside of %s"), directive
, region
);
3056 ignore_rest_of_line ();
3061 /* Return 1 if a directive is in a procedure, -1 if a directive isn't in
3062 a procedure but the unwind directive check is set to warning, 0 if
3063 a directive isn't in a procedure and the unwind directive check is set
3067 in_procedure (const char *directive
)
3069 if (unwind
.proc_pending
.sym
3070 && (!unwind
.saved_text_seg
|| strcmp (directive
, "endp") == 0))
3072 return unwind_diagnostic ("procedure", directive
);
3075 /* Return 1 if a directive is in a prologue, -1 if a directive isn't in
3076 a prologue but the unwind directive check is set to warning, 0 if
3077 a directive isn't in a prologue and the unwind directive check is set
3081 in_prologue (const char *directive
)
3083 int in
= in_procedure (directive
);
3085 if (in
> 0 && !unwind
.prologue
)
3086 in
= unwind_diagnostic ("prologue", directive
);
3087 check_pending_save ();
3091 /* Return 1 if a directive is in a body, -1 if a directive isn't in
3092 a body but the unwind directive check is set to warning, 0 if
3093 a directive isn't in a body and the unwind directive check is set
3097 in_body (const char *directive
)
3099 int in
= in_procedure (directive
);
3101 if (in
> 0 && !unwind
.body
)
3102 in
= unwind_diagnostic ("body region", directive
);
3107 add_unwind_entry (unw_rec_list
*ptr
, int sep
)
3112 unwind
.tail
->next
= ptr
;
3117 /* The current entry can in fact be a chain of unwind entries. */
3118 if (unwind
.current_entry
== NULL
)
3119 unwind
.current_entry
= ptr
;
3122 /* The current entry can in fact be a chain of unwind entries. */
3123 if (unwind
.current_entry
== NULL
)
3124 unwind
.current_entry
= ptr
;
3128 /* Parse a tag permitted for the current directive. */
3132 ch
= get_symbol_end ();
3133 /* FIXME: For now, just issue a warning that this isn't implemented. */
3140 as_warn (_("Tags on unwind pseudo-ops aren't supported, yet"));
3143 *input_line_pointer
= ch
;
3145 if (sep
!= NOT_A_CHAR
)
3146 demand_empty_rest_of_line ();
3150 dot_fframe (int dummy ATTRIBUTE_UNUSED
)
3155 if (!in_prologue ("fframe"))
3158 sep
= parse_operand (&e
, ',');
3160 if (e
.X_op
!= O_constant
)
3162 as_bad (_("First operand to .fframe must be a constant"));
3165 add_unwind_entry (output_mem_stack_f (e
.X_add_number
), sep
);
3169 dot_vframe (int dummy ATTRIBUTE_UNUSED
)
3175 if (!in_prologue ("vframe"))
3178 sep
= parse_operand (&e
, ',');
3179 reg
= e
.X_add_number
- REG_GR
;
3180 if (e
.X_op
!= O_register
|| reg
> 127)
3182 as_bad (_("First operand to .vframe must be a general register"));
3185 add_unwind_entry (output_mem_stack_v (), sep
);
3186 if (! (unwind
.prologue_mask
& 2))
3187 add_unwind_entry (output_psp_gr (reg
), NOT_A_CHAR
);
3188 else if (reg
!= unwind
.prologue_gr
3189 + (unsigned) popcount (unwind
.prologue_mask
& (-2 << 1)))
3190 as_warn (_("Operand of .vframe contradicts .prologue"));
3194 dot_vframesp (int psp
)
3200 as_warn (_(".vframepsp is meaningless, assuming .vframesp was meant"));
3202 if (!in_prologue ("vframesp"))
3205 sep
= parse_operand (&e
, ',');
3206 if (e
.X_op
!= O_constant
)
3208 as_bad (_("Operand to .vframesp must be a constant (sp-relative offset)"));
3211 add_unwind_entry (output_mem_stack_v (), sep
);
3212 add_unwind_entry (output_psp_sprel (e
.X_add_number
), NOT_A_CHAR
);
3216 dot_save (int dummy ATTRIBUTE_UNUSED
)
3219 unsigned reg1
, reg2
;
3222 if (!in_prologue ("save"))
3225 sep
= parse_operand (&e1
, ',');
3227 sep
= parse_operand (&e2
, ',');
3231 reg1
= e1
.X_add_number
;
3232 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3233 if (e1
.X_op
!= O_register
)
3235 as_bad (_("First operand to .save not a register"));
3236 reg1
= REG_PR
; /* Anything valid is good here. */
3238 reg2
= e2
.X_add_number
- REG_GR
;
3239 if (e2
.X_op
!= O_register
|| reg2
> 127)
3241 as_bad (_("Second operand to .save not a valid register"));
3246 case REG_AR
+ AR_BSP
:
3247 add_unwind_entry (output_bsp_when (), sep
);
3248 add_unwind_entry (output_bsp_gr (reg2
), NOT_A_CHAR
);
3250 case REG_AR
+ AR_BSPSTORE
:
3251 add_unwind_entry (output_bspstore_when (), sep
);
3252 add_unwind_entry (output_bspstore_gr (reg2
), NOT_A_CHAR
);
3254 case REG_AR
+ AR_RNAT
:
3255 add_unwind_entry (output_rnat_when (), sep
);
3256 add_unwind_entry (output_rnat_gr (reg2
), NOT_A_CHAR
);
3258 case REG_AR
+ AR_UNAT
:
3259 add_unwind_entry (output_unat_when (), sep
);
3260 add_unwind_entry (output_unat_gr (reg2
), NOT_A_CHAR
);
3262 case REG_AR
+ AR_FPSR
:
3263 add_unwind_entry (output_fpsr_when (), sep
);
3264 add_unwind_entry (output_fpsr_gr (reg2
), NOT_A_CHAR
);
3266 case REG_AR
+ AR_PFS
:
3267 add_unwind_entry (output_pfs_when (), sep
);
3268 if (! (unwind
.prologue_mask
& 4))
3269 add_unwind_entry (output_pfs_gr (reg2
), NOT_A_CHAR
);
3270 else if (reg2
!= unwind
.prologue_gr
3271 + (unsigned) popcount (unwind
.prologue_mask
& (-4 << 1)))
3272 as_warn (_("Second operand of .save contradicts .prologue"));
3274 case REG_AR
+ AR_LC
:
3275 add_unwind_entry (output_lc_when (), sep
);
3276 add_unwind_entry (output_lc_gr (reg2
), NOT_A_CHAR
);
3279 add_unwind_entry (output_rp_when (), sep
);
3280 if (! (unwind
.prologue_mask
& 8))
3281 add_unwind_entry (output_rp_gr (reg2
), NOT_A_CHAR
);
3282 else if (reg2
!= unwind
.prologue_gr
)
3283 as_warn (_("Second operand of .save contradicts .prologue"));
3286 add_unwind_entry (output_preds_when (), sep
);
3287 if (! (unwind
.prologue_mask
& 1))
3288 add_unwind_entry (output_preds_gr (reg2
), NOT_A_CHAR
);
3289 else if (reg2
!= unwind
.prologue_gr
3290 + (unsigned) popcount (unwind
.prologue_mask
& (-1 << 1)))
3291 as_warn (_("Second operand of .save contradicts .prologue"));
3294 add_unwind_entry (output_priunat_when_gr (), sep
);
3295 add_unwind_entry (output_priunat_gr (reg2
), NOT_A_CHAR
);
3298 as_bad (_("First operand to .save not a valid register"));
3299 add_unwind_entry (NULL
, sep
);
3305 dot_restore (int dummy ATTRIBUTE_UNUSED
)
3308 unsigned long ecount
; /* # of _additional_ regions to pop */
3311 if (!in_body ("restore"))
3314 sep
= parse_operand (&e1
, ',');
3315 if (e1
.X_op
!= O_register
|| e1
.X_add_number
!= REG_GR
+ 12)
3316 as_bad (_("First operand to .restore must be stack pointer (sp)"));
3322 sep
= parse_operand (&e2
, ',');
3323 if (e2
.X_op
!= O_constant
|| e2
.X_add_number
< 0)
3325 as_bad (_("Second operand to .restore must be a constant >= 0"));
3326 e2
.X_add_number
= 0;
3328 ecount
= e2
.X_add_number
;
3331 ecount
= unwind
.prologue_count
- 1;
3333 if (ecount
>= unwind
.prologue_count
)
3335 as_bad (_("Epilogue count of %lu exceeds number of nested prologues (%u)"),
3336 ecount
+ 1, unwind
.prologue_count
);
3340 add_unwind_entry (output_epilogue (ecount
), sep
);
3342 if (ecount
< unwind
.prologue_count
)
3343 unwind
.prologue_count
-= ecount
+ 1;
3345 unwind
.prologue_count
= 0;
3349 dot_restorereg (int pred
)
3351 unsigned int qp
, ab
, reg
;
3354 const char * const po
= pred
? "restorereg.p" : "restorereg";
3356 if (!in_procedure (po
))
3360 sep
= parse_predicate_and_operand (&e
, &qp
, po
);
3363 sep
= parse_operand (&e
, ',');
3366 convert_expr_to_ab_reg (&e
, &ab
, ®
, po
, 1 + pred
);
3368 add_unwind_entry (output_spill_reg (ab
, reg
, 0, 0, qp
), sep
);
3371 static char *special_linkonce_name
[] =
3373 ".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
3377 start_unwind_section (const segT text_seg
, int sec_index
)
3380 Use a slightly ugly scheme to derive the unwind section names from
3381 the text section name:
3383 text sect. unwind table sect.
3384 name: name: comments:
3385 ---------- ----------------- --------------------------------
3387 .text.foo .IA_64.unwind.text.foo
3388 .foo .IA_64.unwind.foo
3390 .gnu.linkonce.ia64unw.foo
3391 _info .IA_64.unwind_info gas issues error message (ditto)
3392 _infoFOO .IA_64.unwind_infoFOO gas issues error message (ditto)
3394 This mapping is done so that:
3396 (a) An object file with unwind info only in .text will use
3397 unwind section names .IA_64.unwind and .IA_64.unwind_info.
3398 This follows the letter of the ABI and also ensures backwards
3399 compatibility with older toolchains.
3401 (b) An object file with unwind info in multiple text sections
3402 will use separate unwind sections for each text section.
3403 This allows us to properly set the "sh_info" and "sh_link"
3404 fields in SHT_IA_64_UNWIND as required by the ABI and also
3405 lets GNU ld support programs with multiple segments
3406 containing unwind info (as might be the case for certain
3407 embedded applications).
3409 (c) An error is issued if there would be a name clash.
3412 const char *text_name
, *sec_text_name
;
3414 const char *prefix
= special_section_name
[sec_index
];
3416 size_t prefix_len
, suffix_len
, sec_name_len
;
3418 sec_text_name
= segment_name (text_seg
);
3419 text_name
= sec_text_name
;
3420 if (strncmp (text_name
, "_info", 5) == 0)
3422 as_bad (_("Illegal section name `%s' (causes unwind section name clash)"),
3424 ignore_rest_of_line ();
3427 if (strcmp (text_name
, ".text") == 0)
3430 /* Build the unwind section name by appending the (possibly stripped)
3431 text section name to the unwind prefix. */
3433 if (strncmp (text_name
, ".gnu.linkonce.t.",
3434 sizeof (".gnu.linkonce.t.") - 1) == 0)
3436 prefix
= special_linkonce_name
[sec_index
- SPECIAL_SECTION_UNWIND
];
3437 suffix
+= sizeof (".gnu.linkonce.t.") - 1;
3440 prefix_len
= strlen (prefix
);
3441 suffix_len
= strlen (suffix
);
3442 sec_name_len
= prefix_len
+ suffix_len
;
3443 sec_name
= alloca (sec_name_len
+ 1);
3444 memcpy (sec_name
, prefix
, prefix_len
);
3445 memcpy (sec_name
+ prefix_len
, suffix
, suffix_len
);
3446 sec_name
[sec_name_len
] = '\0';
3448 /* Handle COMDAT group. */
3449 if ((text_seg
->flags
& SEC_LINK_ONCE
) != 0
3450 && (elf_section_flags (text_seg
) & SHF_GROUP
) != 0)
3453 size_t len
, group_name_len
;
3454 const char *group_name
= elf_group_name (text_seg
);
3456 if (group_name
== NULL
)
3458 as_bad (_("Group section `%s' has no group signature"),
3460 ignore_rest_of_line ();
3463 /* We have to construct a fake section directive. */
3464 group_name_len
= strlen (group_name
);
3466 + 16 /* ,"aG",@progbits, */
3467 + group_name_len
/* ,group_name */
3470 section
= alloca (len
+ 1);
3471 memcpy (section
, sec_name
, sec_name_len
);
3472 memcpy (section
+ sec_name_len
, ",\"aG\",@progbits,", 16);
3473 memcpy (section
+ sec_name_len
+ 16, group_name
, group_name_len
);
3474 memcpy (section
+ len
- 7, ",comdat", 7);
3475 section
[len
] = '\0';
3476 set_section (section
);
3480 set_section (sec_name
);
3481 bfd_set_section_flags (stdoutput
, now_seg
,
3482 SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
);
3485 elf_linked_to_section (now_seg
) = text_seg
;
3489 generate_unwind_image (const segT text_seg
)
3494 /* Mark the end of the unwind info, so that we can compute the size of the
3495 last unwind region. */
3496 add_unwind_entry (output_endp (), NOT_A_CHAR
);
3498 /* Force out pending instructions, to make sure all unwind records have
3499 a valid slot_number field. */
3500 ia64_flush_insns ();
3502 /* Generate the unwind record. */
3503 list
= optimize_unw_records (unwind
.list
);
3504 fixup_unw_records (list
, 1);
3505 size
= calc_record_size (list
);
3507 if (size
> 0 || unwind
.force_unwind_entry
)
3509 unwind
.force_unwind_entry
= 0;
3510 /* pad to pointer-size boundary. */
3511 pad
= size
% md
.pointer_size
;
3513 size
+= md
.pointer_size
- pad
;
3514 /* Add 8 for the header. */
3516 /* Add a pointer for the personality offset. */
3517 if (unwind
.personality_routine
)
3518 size
+= md
.pointer_size
;
3521 /* If there are unwind records, switch sections, and output the info. */
3525 bfd_reloc_code_real_type reloc
;
3527 start_unwind_section (text_seg
, SPECIAL_SECTION_UNWIND_INFO
);
3529 /* Make sure the section has 4 byte alignment for ILP32 and
3530 8 byte alignment for LP64. */
3531 frag_align (md
.pointer_size_shift
, 0, 0);
3532 record_alignment (now_seg
, md
.pointer_size_shift
);
3534 /* Set expression which points to start of unwind descriptor area. */
3535 unwind
.info
= expr_build_dot ();
3537 frag_var (rs_machine_dependent
, size
, size
, 0, 0,
3538 (offsetT
) (long) unwind
.personality_routine
,
3541 /* Add the personality address to the image. */
3542 if (unwind
.personality_routine
!= 0)
3544 exp
.X_op
= O_symbol
;
3545 exp
.X_add_symbol
= unwind
.personality_routine
;
3546 exp
.X_add_number
= 0;
3548 if (md
.flags
& EF_IA_64_BE
)
3550 if (md
.flags
& EF_IA_64_ABI64
)
3551 reloc
= BFD_RELOC_IA64_LTOFF_FPTR64MSB
;
3553 reloc
= BFD_RELOC_IA64_LTOFF_FPTR32MSB
;
3557 if (md
.flags
& EF_IA_64_ABI64
)
3558 reloc
= BFD_RELOC_IA64_LTOFF_FPTR64LSB
;
3560 reloc
= BFD_RELOC_IA64_LTOFF_FPTR32LSB
;
3563 fix_new_exp (frag_now
, frag_now_fix () - md
.pointer_size
,
3564 md
.pointer_size
, &exp
, 0, reloc
);
3565 unwind
.personality_routine
= 0;
3569 free_saved_prologue_counts ();
3570 unwind
.list
= unwind
.tail
= unwind
.current_entry
= NULL
;
3574 dot_handlerdata (int dummy ATTRIBUTE_UNUSED
)
3576 if (!in_procedure ("handlerdata"))
3578 unwind
.force_unwind_entry
= 1;
3580 /* Remember which segment we're in so we can switch back after .endp */
3581 unwind
.saved_text_seg
= now_seg
;
3582 unwind
.saved_text_subseg
= now_subseg
;
3584 /* Generate unwind info into unwind-info section and then leave that
3585 section as the currently active one so dataXX directives go into
3586 the language specific data area of the unwind info block. */
3587 generate_unwind_image (now_seg
);
3588 demand_empty_rest_of_line ();
3592 dot_unwentry (int dummy ATTRIBUTE_UNUSED
)
3594 if (!in_procedure ("unwentry"))
3596 unwind
.force_unwind_entry
= 1;
3597 demand_empty_rest_of_line ();
3601 dot_altrp (int dummy ATTRIBUTE_UNUSED
)
3606 if (!in_prologue ("altrp"))
3609 parse_operand (&e
, 0);
3610 reg
= e
.X_add_number
- REG_BR
;
3611 if (e
.X_op
!= O_register
|| reg
> 7)
3613 as_bad (_("First operand to .altrp not a valid branch register"));
3616 add_unwind_entry (output_rp_br (reg
), 0);
3620 dot_savemem (int psprel
)
3625 const char * const po
= psprel
? "savepsp" : "savesp";
3627 if (!in_prologue (po
))
3630 sep
= parse_operand (&e1
, ',');
3632 sep
= parse_operand (&e2
, ',');
3636 reg1
= e1
.X_add_number
;
3637 val
= e2
.X_add_number
;
3639 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3640 if (e1
.X_op
!= O_register
)
3642 as_bad (_("First operand to .%s not a register"), po
);
3643 reg1
= REG_PR
; /* Anything valid is good here. */
3645 if (e2
.X_op
!= O_constant
)
3647 as_bad (_("Second operand to .%s not a constant"), po
);
3653 case REG_AR
+ AR_BSP
:
3654 add_unwind_entry (output_bsp_when (), sep
);
3655 add_unwind_entry ((psprel
3657 : output_bsp_sprel
) (val
), NOT_A_CHAR
);
3659 case REG_AR
+ AR_BSPSTORE
:
3660 add_unwind_entry (output_bspstore_when (), sep
);
3661 add_unwind_entry ((psprel
3662 ? output_bspstore_psprel
3663 : output_bspstore_sprel
) (val
), NOT_A_CHAR
);
3665 case REG_AR
+ AR_RNAT
:
3666 add_unwind_entry (output_rnat_when (), sep
);
3667 add_unwind_entry ((psprel
3668 ? output_rnat_psprel
3669 : output_rnat_sprel
) (val
), NOT_A_CHAR
);
3671 case REG_AR
+ AR_UNAT
:
3672 add_unwind_entry (output_unat_when (), sep
);
3673 add_unwind_entry ((psprel
3674 ? output_unat_psprel
3675 : output_unat_sprel
) (val
), NOT_A_CHAR
);
3677 case REG_AR
+ AR_FPSR
:
3678 add_unwind_entry (output_fpsr_when (), sep
);
3679 add_unwind_entry ((psprel
3680 ? output_fpsr_psprel
3681 : output_fpsr_sprel
) (val
), NOT_A_CHAR
);
3683 case REG_AR
+ AR_PFS
:
3684 add_unwind_entry (output_pfs_when (), sep
);
3685 add_unwind_entry ((psprel
3687 : output_pfs_sprel
) (val
), NOT_A_CHAR
);
3689 case REG_AR
+ AR_LC
:
3690 add_unwind_entry (output_lc_when (), sep
);
3691 add_unwind_entry ((psprel
3693 : output_lc_sprel
) (val
), NOT_A_CHAR
);
3696 add_unwind_entry (output_rp_when (), sep
);
3697 add_unwind_entry ((psprel
3699 : output_rp_sprel
) (val
), NOT_A_CHAR
);
3702 add_unwind_entry (output_preds_when (), sep
);
3703 add_unwind_entry ((psprel
3704 ? output_preds_psprel
3705 : output_preds_sprel
) (val
), NOT_A_CHAR
);
3708 add_unwind_entry (output_priunat_when_mem (), sep
);
3709 add_unwind_entry ((psprel
3710 ? output_priunat_psprel
3711 : output_priunat_sprel
) (val
), NOT_A_CHAR
);
3714 as_bad (_("First operand to .%s not a valid register"), po
);
3715 add_unwind_entry (NULL
, sep
);
3721 dot_saveg (int dummy ATTRIBUTE_UNUSED
)
3727 if (!in_prologue ("save.g"))
3730 sep
= parse_operand (&e
, ',');
3732 grmask
= e
.X_add_number
;
3733 if (e
.X_op
!= O_constant
3734 || e
.X_add_number
<= 0
3735 || e
.X_add_number
> 0xf)
3737 as_bad (_("First operand to .save.g must be a positive 4-bit constant"));
3744 int n
= popcount (grmask
);
3746 parse_operand (&e
, 0);
3747 reg
= e
.X_add_number
- REG_GR
;
3748 if (e
.X_op
!= O_register
|| reg
> 127)
3750 as_bad (_("Second operand to .save.g must be a general register"));
3753 else if (reg
> 128U - n
)
3755 as_bad (_("Second operand to .save.g must be the first of %d general registers"), n
);
3758 add_unwind_entry (output_gr_gr (grmask
, reg
), 0);
3761 add_unwind_entry (output_gr_mem (grmask
), 0);
3765 dot_savef (int dummy ATTRIBUTE_UNUSED
)
3769 if (!in_prologue ("save.f"))
3772 parse_operand (&e
, 0);
3774 if (e
.X_op
!= O_constant
3775 || e
.X_add_number
<= 0
3776 || e
.X_add_number
> 0xfffff)
3778 as_bad (_("Operand to .save.f must be a positive 20-bit constant"));
3781 add_unwind_entry (output_fr_mem (e
.X_add_number
), 0);
3785 dot_saveb (int dummy ATTRIBUTE_UNUSED
)
3791 if (!in_prologue ("save.b"))
3794 sep
= parse_operand (&e
, ',');
3796 brmask
= e
.X_add_number
;
3797 if (e
.X_op
!= O_constant
3798 || e
.X_add_number
<= 0
3799 || e
.X_add_number
> 0x1f)
3801 as_bad (_("First operand to .save.b must be a positive 5-bit constant"));
3808 int n
= popcount (brmask
);
3810 parse_operand (&e
, 0);
3811 reg
= e
.X_add_number
- REG_GR
;
3812 if (e
.X_op
!= O_register
|| reg
> 127)
3814 as_bad (_("Second operand to .save.b must be a general register"));
3817 else if (reg
> 128U - n
)
3819 as_bad (_("Second operand to .save.b must be the first of %d general registers"), n
);
3822 add_unwind_entry (output_br_gr (brmask
, reg
), 0);
3825 add_unwind_entry (output_br_mem (brmask
), 0);
3829 dot_savegf (int dummy ATTRIBUTE_UNUSED
)
3833 if (!in_prologue ("save.gf"))
3836 if (parse_operand (&e1
, ',') == ',')
3837 parse_operand (&e2
, 0);
3841 if (e1
.X_op
!= O_constant
3842 || e1
.X_add_number
< 0
3843 || e1
.X_add_number
> 0xf)
3845 as_bad (_("First operand to .save.gf must be a non-negative 4-bit constant"));
3847 e1
.X_add_number
= 0;
3849 if (e2
.X_op
!= O_constant
3850 || e2
.X_add_number
< 0
3851 || e2
.X_add_number
> 0xfffff)
3853 as_bad (_("Second operand to .save.gf must be a non-negative 20-bit constant"));
3855 e2
.X_add_number
= 0;
3857 if (e1
.X_op
== O_constant
3858 && e2
.X_op
== O_constant
3859 && e1
.X_add_number
== 0
3860 && e2
.X_add_number
== 0)
3861 as_bad (_("Operands to .save.gf may not be both zero"));
3863 add_unwind_entry (output_frgr_mem (e1
.X_add_number
, e2
.X_add_number
), 0);
3867 dot_spill (int dummy ATTRIBUTE_UNUSED
)
3871 if (!in_prologue ("spill"))
3874 parse_operand (&e
, 0);
3876 if (e
.X_op
!= O_constant
)
3878 as_bad (_("Operand to .spill must be a constant"));
3881 add_unwind_entry (output_spill_base (e
.X_add_number
), 0);
3885 dot_spillreg (int pred
)
3888 unsigned int qp
, ab
, xy
, reg
, treg
;
3890 const char * const po
= pred
? "spillreg.p" : "spillreg";
3892 if (!in_procedure (po
))
3896 sep
= parse_predicate_and_operand (&e
, &qp
, po
);
3899 sep
= parse_operand (&e
, ',');
3902 convert_expr_to_ab_reg (&e
, &ab
, ®
, po
, 1 + pred
);
3905 sep
= parse_operand (&e
, ',');
3908 convert_expr_to_xy_reg (&e
, &xy
, &treg
, po
, 2 + pred
);
3910 add_unwind_entry (output_spill_reg (ab
, reg
, treg
, xy
, qp
), sep
);
3914 dot_spillmem (int psprel
)
3917 int pred
= (psprel
< 0), sep
;
3918 unsigned int qp
, ab
, reg
;
3924 po
= psprel
? "spillpsp.p" : "spillsp.p";
3927 po
= psprel
? "spillpsp" : "spillsp";
3929 if (!in_procedure (po
))
3933 sep
= parse_predicate_and_operand (&e
, &qp
, po
);
3936 sep
= parse_operand (&e
, ',');
3939 convert_expr_to_ab_reg (&e
, &ab
, ®
, po
, 1 + pred
);
3942 sep
= parse_operand (&e
, ',');
3945 if (e
.X_op
!= O_constant
)
3947 as_bad (_("Operand %d to .%s must be a constant"), 2 + pred
, po
);
3952 add_unwind_entry (output_spill_psprel (ab
, reg
, e
.X_add_number
, qp
), sep
);
3954 add_unwind_entry (output_spill_sprel (ab
, reg
, e
.X_add_number
, qp
), sep
);
3958 get_saved_prologue_count (unsigned long lbl
)
3960 label_prologue_count
*lpc
= unwind
.saved_prologue_counts
;
3962 while (lpc
!= NULL
&& lpc
->label_number
!= lbl
)
3966 return lpc
->prologue_count
;
3968 as_bad (_("Missing .label_state %ld"), lbl
);
3973 save_prologue_count (unsigned long lbl
, unsigned int count
)
3975 label_prologue_count
*lpc
= unwind
.saved_prologue_counts
;
3977 while (lpc
!= NULL
&& lpc
->label_number
!= lbl
)
3981 lpc
->prologue_count
= count
;
3984 label_prologue_count
*new_lpc
= xmalloc (sizeof (* new_lpc
));
3986 new_lpc
->next
= unwind
.saved_prologue_counts
;
3987 new_lpc
->label_number
= lbl
;
3988 new_lpc
->prologue_count
= count
;
3989 unwind
.saved_prologue_counts
= new_lpc
;
3994 free_saved_prologue_counts ()
3996 label_prologue_count
*lpc
= unwind
.saved_prologue_counts
;
3997 label_prologue_count
*next
;
4006 unwind
.saved_prologue_counts
= NULL
;
4010 dot_label_state (int dummy ATTRIBUTE_UNUSED
)
4014 if (!in_body ("label_state"))
4017 parse_operand (&e
, 0);
4018 if (e
.X_op
== O_constant
)
4019 save_prologue_count (e
.X_add_number
, unwind
.prologue_count
);
4022 as_bad (_("Operand to .label_state must be a constant"));
4025 add_unwind_entry (output_label_state (e
.X_add_number
), 0);
4029 dot_copy_state (int dummy ATTRIBUTE_UNUSED
)
4033 if (!in_body ("copy_state"))
4036 parse_operand (&e
, 0);
4037 if (e
.X_op
== O_constant
)
4038 unwind
.prologue_count
= get_saved_prologue_count (e
.X_add_number
);
4041 as_bad (_("Operand to .copy_state must be a constant"));
4044 add_unwind_entry (output_copy_state (e
.X_add_number
), 0);
4048 dot_unwabi (int dummy ATTRIBUTE_UNUSED
)
4053 if (!in_prologue ("unwabi"))
4056 sep
= parse_operand (&e1
, ',');
4058 parse_operand (&e2
, 0);
4062 if (e1
.X_op
!= O_constant
)
4064 as_bad (_("First operand to .unwabi must be a constant"));
4065 e1
.X_add_number
= 0;
4068 if (e2
.X_op
!= O_constant
)
4070 as_bad (_("Second operand to .unwabi must be a constant"));
4071 e2
.X_add_number
= 0;
4074 add_unwind_entry (output_unwabi (e1
.X_add_number
, e2
.X_add_number
), 0);
4078 dot_personality (int dummy ATTRIBUTE_UNUSED
)
4081 if (!in_procedure ("personality"))
4084 name
= input_line_pointer
;
4085 c
= get_symbol_end ();
4086 p
= input_line_pointer
;
4087 unwind
.personality_routine
= symbol_find_or_make (name
);
4088 unwind
.force_unwind_entry
= 1;
4091 demand_empty_rest_of_line ();
4095 dot_proc (int dummy ATTRIBUTE_UNUSED
)
4099 proc_pending
*pending
, *last_pending
;
4101 if (unwind
.proc_pending
.sym
)
4103 (md
.unwind_check
== unwind_check_warning
4105 : as_bad
) (_("Missing .endp after previous .proc"));
4106 while (unwind
.proc_pending
.next
)
4108 pending
= unwind
.proc_pending
.next
;
4109 unwind
.proc_pending
.next
= pending
->next
;
4113 last_pending
= NULL
;
4115 /* Parse names of main and alternate entry points and mark them as
4116 function symbols: */
4120 name
= input_line_pointer
;
4121 c
= get_symbol_end ();
4122 p
= input_line_pointer
;
4124 as_bad (_("Empty argument of .proc"));
4127 sym
= symbol_find_or_make (name
);
4128 if (S_IS_DEFINED (sym
))
4129 as_bad (_("`%s' was already defined"), name
);
4130 else if (!last_pending
)
4132 unwind
.proc_pending
.sym
= sym
;
4133 last_pending
= &unwind
.proc_pending
;
4137 pending
= xmalloc (sizeof (*pending
));
4139 last_pending
= last_pending
->next
= pending
;
4141 symbol_get_bfdsym (sym
)->flags
|= BSF_FUNCTION
;
4145 if (*input_line_pointer
!= ',')
4147 ++input_line_pointer
;
4151 unwind
.proc_pending
.sym
= expr_build_dot ();
4152 last_pending
= &unwind
.proc_pending
;
4154 last_pending
->next
= NULL
;
4155 demand_empty_rest_of_line ();
4158 unwind
.prologue
= 0;
4159 unwind
.prologue_count
= 0;
4162 unwind
.list
= unwind
.tail
= unwind
.current_entry
= NULL
;
4163 unwind
.personality_routine
= 0;
4167 dot_body (int dummy ATTRIBUTE_UNUSED
)
4169 if (!in_procedure ("body"))
4171 if (!unwind
.prologue
&& !unwind
.body
&& unwind
.insn
)
4172 as_warn (_("Initial .body should precede any instructions"));
4173 check_pending_save ();
4175 unwind
.prologue
= 0;
4176 unwind
.prologue_mask
= 0;
4179 add_unwind_entry (output_body (), 0);
4183 dot_prologue (int dummy ATTRIBUTE_UNUSED
)
4185 unsigned mask
= 0, grsave
= 0;
4187 if (!in_procedure ("prologue"))
4189 if (unwind
.prologue
)
4191 as_bad (_(".prologue within prologue"));
4192 ignore_rest_of_line ();
4195 if (!unwind
.body
&& unwind
.insn
)
4196 as_warn (_("Initial .prologue should precede any instructions"));
4198 if (!is_it_end_of_statement ())
4201 int n
, sep
= parse_operand (&e
, ',');
4203 if (e
.X_op
!= O_constant
4204 || e
.X_add_number
< 0
4205 || e
.X_add_number
> 0xf)
4206 as_bad (_("First operand to .prologue must be a positive 4-bit constant"));
4207 else if (e
.X_add_number
== 0)
4208 as_warn (_("Pointless use of zero first operand to .prologue"));
4210 mask
= e
.X_add_number
;
4211 n
= popcount (mask
);
4214 parse_operand (&e
, 0);
4217 if (e
.X_op
== O_constant
4218 && e
.X_add_number
>= 0
4219 && e
.X_add_number
< 128)
4221 if (md
.unwind_check
== unwind_check_error
)
4222 as_warn (_("Using a constant as second operand to .prologue is deprecated"));
4223 grsave
= e
.X_add_number
;
4225 else if (e
.X_op
!= O_register
4226 || (grsave
= e
.X_add_number
- REG_GR
) > 127)
4228 as_bad (_("Second operand to .prologue must be a general register"));
4231 else if (grsave
> 128U - n
)
4233 as_bad (_("Second operand to .prologue must be the first of %d general registers"), n
);
4240 add_unwind_entry (output_prologue_gr (mask
, grsave
), 0);
4242 add_unwind_entry (output_prologue (), 0);
4244 unwind
.prologue
= 1;
4245 unwind
.prologue_mask
= mask
;
4246 unwind
.prologue_gr
= grsave
;
4248 ++unwind
.prologue_count
;
4252 dot_endp (int dummy ATTRIBUTE_UNUSED
)
4255 int bytes_per_address
;
4258 subsegT saved_subseg
;
4259 proc_pending
*pending
;
4260 int unwind_check
= md
.unwind_check
;
4262 md
.unwind_check
= unwind_check_error
;
4263 if (!in_procedure ("endp"))
4265 md
.unwind_check
= unwind_check
;
4267 if (unwind
.saved_text_seg
)
4269 saved_seg
= unwind
.saved_text_seg
;
4270 saved_subseg
= unwind
.saved_text_subseg
;
4271 unwind
.saved_text_seg
= NULL
;
4275 saved_seg
= now_seg
;
4276 saved_subseg
= now_subseg
;
4279 insn_group_break (1, 0, 0);
4281 /* If there wasn't a .handlerdata, we haven't generated an image yet. */
4283 generate_unwind_image (saved_seg
);
4285 if (unwind
.info
|| unwind
.force_unwind_entry
)
4289 subseg_set (md
.last_text_seg
, 0);
4290 proc_end
= expr_build_dot ();
4292 start_unwind_section (saved_seg
, SPECIAL_SECTION_UNWIND
);
4294 /* Make sure that section has 4 byte alignment for ILP32 and
4295 8 byte alignment for LP64. */
4296 record_alignment (now_seg
, md
.pointer_size_shift
);
4298 /* Need space for 3 pointers for procedure start, procedure end,
4300 memset (frag_more (3 * md
.pointer_size
), 0, 3 * md
.pointer_size
);
4301 where
= frag_now_fix () - (3 * md
.pointer_size
);
4302 bytes_per_address
= bfd_arch_bits_per_address (stdoutput
) / 8;
4304 /* Issue the values of a) Proc Begin, b) Proc End, c) Unwind Record. */
4305 e
.X_op
= O_pseudo_fixup
;
4306 e
.X_op_symbol
= pseudo_func
[FUNC_SEG_RELATIVE
].u
.sym
;
4308 if (!S_IS_LOCAL (unwind
.proc_pending
.sym
)
4309 && S_IS_DEFINED (unwind
.proc_pending
.sym
))
4310 e
.X_add_symbol
= symbol_temp_new (S_GET_SEGMENT (unwind
.proc_pending
.sym
),
4311 S_GET_VALUE (unwind
.proc_pending
.sym
),
4312 symbol_get_frag (unwind
.proc_pending
.sym
));
4314 e
.X_add_symbol
= unwind
.proc_pending
.sym
;
4315 ia64_cons_fix_new (frag_now
, where
, bytes_per_address
, &e
);
4317 e
.X_op
= O_pseudo_fixup
;
4318 e
.X_op_symbol
= pseudo_func
[FUNC_SEG_RELATIVE
].u
.sym
;
4320 e
.X_add_symbol
= proc_end
;
4321 ia64_cons_fix_new (frag_now
, where
+ bytes_per_address
,
4322 bytes_per_address
, &e
);
4326 e
.X_op
= O_pseudo_fixup
;
4327 e
.X_op_symbol
= pseudo_func
[FUNC_SEG_RELATIVE
].u
.sym
;
4329 e
.X_add_symbol
= unwind
.info
;
4330 ia64_cons_fix_new (frag_now
, where
+ (bytes_per_address
* 2),
4331 bytes_per_address
, &e
);
4334 subseg_set (saved_seg
, saved_subseg
);
4336 /* Set symbol sizes. */
4337 pending
= &unwind
.proc_pending
;
4338 if (S_GET_NAME (pending
->sym
))
4342 symbolS
*sym
= pending
->sym
;
4344 if (!S_IS_DEFINED (sym
))
4345 as_bad (_("`%s' was not defined within procedure"), S_GET_NAME (sym
));
4346 else if (S_GET_SIZE (sym
) == 0
4347 && symbol_get_obj (sym
)->size
== NULL
)
4349 fragS
*frag
= symbol_get_frag (sym
);
4353 if (frag
== frag_now
&& SEG_NORMAL (now_seg
))
4354 S_SET_SIZE (sym
, frag_now_fix () - S_GET_VALUE (sym
));
4357 symbol_get_obj (sym
)->size
=
4358 (expressionS
*) xmalloc (sizeof (expressionS
));
4359 symbol_get_obj (sym
)->size
->X_op
= O_subtract
;
4360 symbol_get_obj (sym
)->size
->X_add_symbol
4361 = symbol_new (FAKE_LABEL_NAME
, now_seg
,
4362 frag_now_fix (), frag_now
);
4363 symbol_get_obj (sym
)->size
->X_op_symbol
= sym
;
4364 symbol_get_obj (sym
)->size
->X_add_number
= 0;
4368 } while ((pending
= pending
->next
) != NULL
);
4371 /* Parse names of main and alternate entry points. */
4377 name
= input_line_pointer
;
4378 c
= get_symbol_end ();
4379 p
= input_line_pointer
;
4381 (md
.unwind_check
== unwind_check_warning
4383 : as_bad
) (_("Empty argument of .endp"));
4386 symbolS
*sym
= symbol_find (name
);
4388 for (pending
= &unwind
.proc_pending
; pending
; pending
= pending
->next
)
4390 if (sym
== pending
->sym
)
4392 pending
->sym
= NULL
;
4396 if (!sym
|| !pending
)
4397 as_warn (_("`%s' was not specified with previous .proc"), name
);
4401 if (*input_line_pointer
!= ',')
4403 ++input_line_pointer
;
4405 demand_empty_rest_of_line ();
4407 /* Deliberately only checking for the main entry point here; the
4408 language spec even says all arguments to .endp are ignored. */
4409 if (unwind
.proc_pending
.sym
4410 && S_GET_NAME (unwind
.proc_pending
.sym
)
4411 && strcmp (S_GET_NAME (unwind
.proc_pending
.sym
), FAKE_LABEL_NAME
))
4412 as_warn (_("`%s' should be an operand to this .endp"),
4413 S_GET_NAME (unwind
.proc_pending
.sym
));
4414 while (unwind
.proc_pending
.next
)
4416 pending
= unwind
.proc_pending
.next
;
4417 unwind
.proc_pending
.next
= pending
->next
;
4420 unwind
.proc_pending
.sym
= unwind
.info
= NULL
;
4424 dot_template (int template)
4426 CURR_SLOT
.user_template
= template;
4430 dot_regstk (int dummy ATTRIBUTE_UNUSED
)
4432 int ins
, locs
, outs
, rots
;
4434 if (is_it_end_of_statement ())
4435 ins
= locs
= outs
= rots
= 0;
4438 ins
= get_absolute_expression ();
4439 if (*input_line_pointer
++ != ',')
4441 locs
= get_absolute_expression ();
4442 if (*input_line_pointer
++ != ',')
4444 outs
= get_absolute_expression ();
4445 if (*input_line_pointer
++ != ',')
4447 rots
= get_absolute_expression ();
4449 set_regstack (ins
, locs
, outs
, rots
);
4453 as_bad (_("Comma expected"));
4454 ignore_rest_of_line ();
4461 valueT num_alloced
= 0;
4462 struct dynreg
**drpp
, *dr
;
4463 int ch
, base_reg
= 0;
4469 case DYNREG_GR
: base_reg
= REG_GR
+ 32; break;
4470 case DYNREG_FR
: base_reg
= REG_FR
+ 32; break;
4471 case DYNREG_PR
: base_reg
= REG_P
+ 16; break;
4475 /* First, remove existing names from hash table. */
4476 for (dr
= md
.dynreg
[type
]; dr
&& dr
->num_regs
; dr
= dr
->next
)
4478 hash_delete (md
.dynreg_hash
, dr
->name
, FALSE
);
4479 /* FIXME: Free dr->name. */
4483 drpp
= &md
.dynreg
[type
];
4486 start
= input_line_pointer
;
4487 ch
= get_symbol_end ();
4488 len
= strlen (ia64_canonicalize_symbol_name (start
));
4489 *input_line_pointer
= ch
;
4492 if (*input_line_pointer
!= '[')
4494 as_bad (_("Expected '['"));
4497 ++input_line_pointer
; /* skip '[' */
4499 num_regs
= get_absolute_expression ();
4501 if (*input_line_pointer
++ != ']')
4503 as_bad (_("Expected ']'"));
4508 as_bad (_("Number of elements must be positive"));
4513 num_alloced
+= num_regs
;
4517 if (num_alloced
> md
.rot
.num_regs
)
4519 as_bad (_("Used more than the declared %d rotating registers"),
4525 if (num_alloced
> 96)
4527 as_bad (_("Used more than the available 96 rotating registers"));
4532 if (num_alloced
> 48)
4534 as_bad (_("Used more than the available 48 rotating registers"));
4545 *drpp
= obstack_alloc (¬es
, sizeof (*dr
));
4546 memset (*drpp
, 0, sizeof (*dr
));
4549 name
= obstack_alloc (¬es
, len
+ 1);
4550 memcpy (name
, start
, len
);
4555 dr
->num_regs
= num_regs
;
4556 dr
->base
= base_reg
;
4558 base_reg
+= num_regs
;
4560 if (hash_insert (md
.dynreg_hash
, name
, dr
))
4562 as_bad (_("Attempt to redefine register set `%s'"), name
);
4563 obstack_free (¬es
, name
);
4567 if (*input_line_pointer
!= ',')
4569 ++input_line_pointer
; /* skip comma */
4572 demand_empty_rest_of_line ();
4576 ignore_rest_of_line ();
4580 dot_byteorder (int byteorder
)
4582 segment_info_type
*seginfo
= seg_info (now_seg
);
4584 if (byteorder
== -1)
4586 if (seginfo
->tc_segment_info_data
.endian
== 0)
4587 seginfo
->tc_segment_info_data
.endian
= default_big_endian
? 1 : 2;
4588 byteorder
= seginfo
->tc_segment_info_data
.endian
== 1;
4591 seginfo
->tc_segment_info_data
.endian
= byteorder
? 1 : 2;
4593 if (target_big_endian
!= byteorder
)
4595 target_big_endian
= byteorder
;
4596 if (target_big_endian
)
4598 ia64_number_to_chars
= number_to_chars_bigendian
;
4599 ia64_float_to_chars
= ia64_float_to_chars_bigendian
;
4603 ia64_number_to_chars
= number_to_chars_littleendian
;
4604 ia64_float_to_chars
= ia64_float_to_chars_littleendian
;
4610 dot_psr (int dummy ATTRIBUTE_UNUSED
)
4617 option
= input_line_pointer
;
4618 ch
= get_symbol_end ();
4619 if (strcmp (option
, "lsb") == 0)
4620 md
.flags
&= ~EF_IA_64_BE
;
4621 else if (strcmp (option
, "msb") == 0)
4622 md
.flags
|= EF_IA_64_BE
;
4623 else if (strcmp (option
, "abi32") == 0)
4624 md
.flags
&= ~EF_IA_64_ABI64
;
4625 else if (strcmp (option
, "abi64") == 0)
4626 md
.flags
|= EF_IA_64_ABI64
;
4628 as_bad (_("Unknown psr option `%s'"), option
);
4629 *input_line_pointer
= ch
;
4632 if (*input_line_pointer
!= ',')
4635 ++input_line_pointer
;
4638 demand_empty_rest_of_line ();
4642 dot_ln (int dummy ATTRIBUTE_UNUSED
)
4644 new_logical_line (0, get_absolute_expression ());
4645 demand_empty_rest_of_line ();
4649 cross_section (int ref
, void (*cons
) (int), int ua
)
4652 int saved_auto_align
;
4653 unsigned int section_count
;
4656 start
= input_line_pointer
;
4662 name
= demand_copy_C_string (&len
);
4663 obstack_free(¬es
, name
);
4666 ignore_rest_of_line ();
4672 char c
= get_symbol_end ();
4674 if (input_line_pointer
== start
)
4676 as_bad (_("Missing section name"));
4677 ignore_rest_of_line ();
4680 *input_line_pointer
= c
;
4682 end
= input_line_pointer
;
4684 if (*input_line_pointer
!= ',')
4686 as_bad (_("Comma expected after section name"));
4687 ignore_rest_of_line ();
4691 end
= input_line_pointer
+ 1; /* skip comma */
4692 input_line_pointer
= start
;
4693 md
.keep_pending_output
= 1;
4694 section_count
= bfd_count_sections(stdoutput
);
4695 obj_elf_section (0);
4696 if (section_count
!= bfd_count_sections(stdoutput
))
4697 as_warn (_("Creating sections with .xdataN/.xrealN/.xstringZ is deprecated."));
4698 input_line_pointer
= end
;
4699 saved_auto_align
= md
.auto_align
;
4704 md
.auto_align
= saved_auto_align
;
4705 obj_elf_previous (0);
4706 md
.keep_pending_output
= 0;
4710 dot_xdata (int size
)
4712 cross_section (size
, cons
, 0);
4715 /* Why doesn't float_cons() call md_cons_align() the way cons() does? */
4718 stmt_float_cons (int kind
)
4738 ia64_do_align (alignment
);
4743 stmt_cons_ua (int size
)
4745 int saved_auto_align
= md
.auto_align
;
4749 md
.auto_align
= saved_auto_align
;
4753 dot_xfloat_cons (int kind
)
4755 cross_section (kind
, stmt_float_cons
, 0);
4759 dot_xstringer (int zero
)
4761 cross_section (zero
, stringer
, 0);
4765 dot_xdata_ua (int size
)
4767 cross_section (size
, cons
, 1);
4771 dot_xfloat_cons_ua (int kind
)
4773 cross_section (kind
, float_cons
, 1);
4776 /* .reg.val <regname>,value */
4779 dot_reg_val (int dummy ATTRIBUTE_UNUSED
)
4783 expression_and_evaluate (®
);
4784 if (reg
.X_op
!= O_register
)
4786 as_bad (_("Register name expected"));
4787 ignore_rest_of_line ();
4789 else if (*input_line_pointer
++ != ',')
4791 as_bad (_("Comma expected"));
4792 ignore_rest_of_line ();
4796 valueT value
= get_absolute_expression ();
4797 int regno
= reg
.X_add_number
;
4798 if (regno
<= REG_GR
|| regno
> REG_GR
+ 127)
4799 as_warn (_("Register value annotation ignored"));
4802 gr_values
[regno
- REG_GR
].known
= 1;
4803 gr_values
[regno
- REG_GR
].value
= value
;
4804 gr_values
[regno
- REG_GR
].path
= md
.path
;
4807 demand_empty_rest_of_line ();
4812 .serialize.instruction
4815 dot_serialize (int type
)
4817 insn_group_break (0, 0, 0);
4819 instruction_serialization ();
4821 data_serialization ();
4822 insn_group_break (0, 0, 0);
4823 demand_empty_rest_of_line ();
4826 /* select dv checking mode
4831 A stop is inserted when changing modes
4835 dot_dv_mode (int type
)
4837 if (md
.manual_bundling
)
4838 as_warn (_("Directive invalid within a bundle"));
4840 if (type
== 'E' || type
== 'A')
4841 md
.mode_explicitly_set
= 0;
4843 md
.mode_explicitly_set
= 1;
4850 if (md
.explicit_mode
)
4851 insn_group_break (1, 0, 0);
4852 md
.explicit_mode
= 0;
4856 if (!md
.explicit_mode
)
4857 insn_group_break (1, 0, 0);
4858 md
.explicit_mode
= 1;
4862 if (md
.explicit_mode
!= md
.default_explicit_mode
)
4863 insn_group_break (1, 0, 0);
4864 md
.explicit_mode
= md
.default_explicit_mode
;
4865 md
.mode_explicitly_set
= 0;
4871 print_prmask (valueT mask
)
4875 for (regno
= 0; regno
< 64; regno
++)
4877 if (mask
& ((valueT
) 1 << regno
))
4879 fprintf (stderr
, "%s p%d", comma
, regno
);
4886 .pred.rel.clear [p1 [,p2 [,...]]] (also .pred.rel "clear" or @clear)
4887 .pred.rel.imply p1, p2 (also .pred.rel "imply" or @imply)
4888 .pred.rel.mutex p1, p2 [,...] (also .pred.rel "mutex" or @mutex)
4889 .pred.safe_across_calls p1 [, p2 [,...]]
4893 dot_pred_rel (int type
)
4897 int p1
= -1, p2
= -1;
4901 if (*input_line_pointer
== '"')
4904 char *form
= demand_copy_C_string (&len
);
4906 if (strcmp (form
, "mutex") == 0)
4908 else if (strcmp (form
, "clear") == 0)
4910 else if (strcmp (form
, "imply") == 0)
4912 obstack_free (¬es
, form
);
4914 else if (*input_line_pointer
== '@')
4916 char *form
= ++input_line_pointer
;
4917 char c
= get_symbol_end();
4919 if (strcmp (form
, "mutex") == 0)
4921 else if (strcmp (form
, "clear") == 0)
4923 else if (strcmp (form
, "imply") == 0)
4925 *input_line_pointer
= c
;
4929 as_bad (_("Missing predicate relation type"));
4930 ignore_rest_of_line ();
4935 as_bad (_("Unrecognized predicate relation type"));
4936 ignore_rest_of_line ();
4939 if (*input_line_pointer
== ',')
4940 ++input_line_pointer
;
4948 expressionS pr
, *pr1
, *pr2
;
4950 sep
= parse_operand (&pr
, ',');
4951 if (pr
.X_op
== O_register
4952 && pr
.X_add_number
>= REG_P
4953 && pr
.X_add_number
<= REG_P
+ 63)
4955 regno
= pr
.X_add_number
- REG_P
;
4963 else if (type
!= 'i'
4964 && pr
.X_op
== O_subtract
4965 && (pr1
= symbol_get_value_expression (pr
.X_add_symbol
))
4966 && pr1
->X_op
== O_register
4967 && pr1
->X_add_number
>= REG_P
4968 && pr1
->X_add_number
<= REG_P
+ 63
4969 && (pr2
= symbol_get_value_expression (pr
.X_op_symbol
))
4970 && pr2
->X_op
== O_register
4971 && pr2
->X_add_number
>= REG_P
4972 && pr2
->X_add_number
<= REG_P
+ 63)
4977 regno
= pr1
->X_add_number
- REG_P
;
4978 stop
= pr2
->X_add_number
- REG_P
;
4981 as_bad (_("Bad register range"));
4982 ignore_rest_of_line ();
4985 bits
= ((bits
<< stop
) << 1) - (bits
<< regno
);
4986 count
+= stop
- regno
+ 1;
4990 as_bad (_("Predicate register expected"));
4991 ignore_rest_of_line ();
4995 as_warn (_("Duplicate predicate register ignored"));
5006 clear_qp_mutex (mask
);
5007 clear_qp_implies (mask
, (valueT
) 0);
5010 if (count
!= 2 || p1
== -1 || p2
== -1)
5011 as_bad (_("Predicate source and target required"));
5012 else if (p1
== 0 || p2
== 0)
5013 as_bad (_("Use of p0 is not valid in this context"));
5015 add_qp_imply (p1
, p2
);
5020 as_bad (_("At least two PR arguments expected"));
5025 as_bad (_("Use of p0 is not valid in this context"));
5028 add_qp_mutex (mask
);
5031 /* note that we don't override any existing relations */
5034 as_bad (_("At least one PR argument expected"));
5039 fprintf (stderr
, "Safe across calls: ");
5040 print_prmask (mask
);
5041 fprintf (stderr
, "\n");
5043 qp_safe_across_calls
= mask
;
5046 demand_empty_rest_of_line ();
5049 /* .entry label [, label [, ...]]
5050 Hint to DV code that the given labels are to be considered entry points.
5051 Otherwise, only global labels are considered entry points. */
5054 dot_entry (int dummy ATTRIBUTE_UNUSED
)
5063 name
= input_line_pointer
;
5064 c
= get_symbol_end ();
5065 symbolP
= symbol_find_or_make (name
);
5067 err
= hash_insert (md
.entry_hash
, S_GET_NAME (symbolP
), (void *) symbolP
);
5069 as_fatal (_("Inserting \"%s\" into entry hint table failed: %s"),
5072 *input_line_pointer
= c
;
5074 c
= *input_line_pointer
;
5077 input_line_pointer
++;
5079 if (*input_line_pointer
== '\n')
5085 demand_empty_rest_of_line ();
5088 /* .mem.offset offset, base
5089 "base" is used to distinguish between offsets from a different base. */
5092 dot_mem_offset (int dummy ATTRIBUTE_UNUSED
)
5094 md
.mem_offset
.hint
= 1;
5095 md
.mem_offset
.offset
= get_absolute_expression ();
5096 if (*input_line_pointer
!= ',')
5098 as_bad (_("Comma expected"));
5099 ignore_rest_of_line ();
5102 ++input_line_pointer
;
5103 md
.mem_offset
.base
= get_absolute_expression ();
5104 demand_empty_rest_of_line ();
5107 /* ia64-specific pseudo-ops: */
5108 const pseudo_typeS md_pseudo_table
[] =
5110 { "radix", dot_radix
, 0 },
5111 { "lcomm", s_lcomm_bytes
, 1 },
5112 { "loc", dot_loc
, 0 },
5113 { "bss", dot_special_section
, SPECIAL_SECTION_BSS
},
5114 { "sbss", dot_special_section
, SPECIAL_SECTION_SBSS
},
5115 { "sdata", dot_special_section
, SPECIAL_SECTION_SDATA
},
5116 { "rodata", dot_special_section
, SPECIAL_SECTION_RODATA
},
5117 { "comment", dot_special_section
, SPECIAL_SECTION_COMMENT
},
5118 { "ia_64.unwind", dot_special_section
, SPECIAL_SECTION_UNWIND
},
5119 { "ia_64.unwind_info", dot_special_section
, SPECIAL_SECTION_UNWIND_INFO
},
5120 { "init_array", dot_special_section
, SPECIAL_SECTION_INIT_ARRAY
},
5121 { "fini_array", dot_special_section
, SPECIAL_SECTION_FINI_ARRAY
},
5122 { "proc", dot_proc
, 0 },
5123 { "body", dot_body
, 0 },
5124 { "prologue", dot_prologue
, 0 },
5125 { "endp", dot_endp
, 0 },
5127 { "fframe", dot_fframe
, 0 },
5128 { "vframe", dot_vframe
, 0 },
5129 { "vframesp", dot_vframesp
, 0 },
5130 { "vframepsp", dot_vframesp
, 1 },
5131 { "save", dot_save
, 0 },
5132 { "restore", dot_restore
, 0 },
5133 { "restorereg", dot_restorereg
, 0 },
5134 { "restorereg.p", dot_restorereg
, 1 },
5135 { "handlerdata", dot_handlerdata
, 0 },
5136 { "unwentry", dot_unwentry
, 0 },
5137 { "altrp", dot_altrp
, 0 },
5138 { "savesp", dot_savemem
, 0 },
5139 { "savepsp", dot_savemem
, 1 },
5140 { "save.g", dot_saveg
, 0 },
5141 { "save.f", dot_savef
, 0 },
5142 { "save.b", dot_saveb
, 0 },
5143 { "save.gf", dot_savegf
, 0 },
5144 { "spill", dot_spill
, 0 },
5145 { "spillreg", dot_spillreg
, 0 },
5146 { "spillsp", dot_spillmem
, 0 },
5147 { "spillpsp", dot_spillmem
, 1 },
5148 { "spillreg.p", dot_spillreg
, 1 },
5149 { "spillsp.p", dot_spillmem
, ~0 },
5150 { "spillpsp.p", dot_spillmem
, ~1 },
5151 { "label_state", dot_label_state
, 0 },
5152 { "copy_state", dot_copy_state
, 0 },
5153 { "unwabi", dot_unwabi
, 0 },
5154 { "personality", dot_personality
, 0 },
5155 { "mii", dot_template
, 0x0 },
5156 { "mli", dot_template
, 0x2 }, /* old format, for compatibility */
5157 { "mlx", dot_template
, 0x2 },
5158 { "mmi", dot_template
, 0x4 },
5159 { "mfi", dot_template
, 0x6 },
5160 { "mmf", dot_template
, 0x7 },
5161 { "mib", dot_template
, 0x8 },
5162 { "mbb", dot_template
, 0x9 },
5163 { "bbb", dot_template
, 0xb },
5164 { "mmb", dot_template
, 0xc },
5165 { "mfb", dot_template
, 0xe },
5166 { "align", dot_align
, 0 },
5167 { "regstk", dot_regstk
, 0 },
5168 { "rotr", dot_rot
, DYNREG_GR
},
5169 { "rotf", dot_rot
, DYNREG_FR
},
5170 { "rotp", dot_rot
, DYNREG_PR
},
5171 { "lsb", dot_byteorder
, 0 },
5172 { "msb", dot_byteorder
, 1 },
5173 { "psr", dot_psr
, 0 },
5174 { "alias", dot_alias
, 0 },
5175 { "secalias", dot_alias
, 1 },
5176 { "ln", dot_ln
, 0 }, /* source line info (for debugging) */
5178 { "xdata1", dot_xdata
, 1 },
5179 { "xdata2", dot_xdata
, 2 },
5180 { "xdata4", dot_xdata
, 4 },
5181 { "xdata8", dot_xdata
, 8 },
5182 { "xdata16", dot_xdata
, 16 },
5183 { "xreal4", dot_xfloat_cons
, 'f' },
5184 { "xreal8", dot_xfloat_cons
, 'd' },
5185 { "xreal10", dot_xfloat_cons
, 'x' },
5186 { "xreal16", dot_xfloat_cons
, 'X' },
5187 { "xstring", dot_xstringer
, 8 + 0 },
5188 { "xstringz", dot_xstringer
, 8 + 1 },
5190 /* unaligned versions: */
5191 { "xdata2.ua", dot_xdata_ua
, 2 },
5192 { "xdata4.ua", dot_xdata_ua
, 4 },
5193 { "xdata8.ua", dot_xdata_ua
, 8 },
5194 { "xdata16.ua", dot_xdata_ua
, 16 },
5195 { "xreal4.ua", dot_xfloat_cons_ua
, 'f' },
5196 { "xreal8.ua", dot_xfloat_cons_ua
, 'd' },
5197 { "xreal10.ua", dot_xfloat_cons_ua
, 'x' },
5198 { "xreal16.ua", dot_xfloat_cons_ua
, 'X' },
5200 /* annotations/DV checking support */
5201 { "entry", dot_entry
, 0 },
5202 { "mem.offset", dot_mem_offset
, 0 },
5203 { "pred.rel", dot_pred_rel
, 0 },
5204 { "pred.rel.clear", dot_pred_rel
, 'c' },
5205 { "pred.rel.imply", dot_pred_rel
, 'i' },
5206 { "pred.rel.mutex", dot_pred_rel
, 'm' },
5207 { "pred.safe_across_calls", dot_pred_rel
, 's' },
5208 { "reg.val", dot_reg_val
, 0 },
5209 { "serialize.data", dot_serialize
, 0 },
5210 { "serialize.instruction", dot_serialize
, 1 },
5211 { "auto", dot_dv_mode
, 'a' },
5212 { "explicit", dot_dv_mode
, 'e' },
5213 { "default", dot_dv_mode
, 'd' },
5215 /* ??? These are needed to make gas/testsuite/gas/elf/ehopt.s work.
5216 IA-64 aligns data allocation pseudo-ops by default, so we have to
5217 tell it that these ones are supposed to be unaligned. Long term,
5218 should rewrite so that only IA-64 specific data allocation pseudo-ops
5219 are aligned by default. */
5220 {"2byte", stmt_cons_ua
, 2},
5221 {"4byte", stmt_cons_ua
, 4},
5222 {"8byte", stmt_cons_ua
, 8},
5227 static const struct pseudo_opcode
5230 void (*handler
) (int);
5235 /* these are more like pseudo-ops, but don't start with a dot */
5236 { "data1", cons
, 1 },
5237 { "data2", cons
, 2 },
5238 { "data4", cons
, 4 },
5239 { "data8", cons
, 8 },
5240 { "data16", cons
, 16 },
5241 { "real4", stmt_float_cons
, 'f' },
5242 { "real8", stmt_float_cons
, 'd' },
5243 { "real10", stmt_float_cons
, 'x' },
5244 { "real16", stmt_float_cons
, 'X' },
5245 { "string", stringer
, 8 + 0 },
5246 { "stringz", stringer
, 8 + 1 },
5248 /* unaligned versions: */
5249 { "data2.ua", stmt_cons_ua
, 2 },
5250 { "data4.ua", stmt_cons_ua
, 4 },
5251 { "data8.ua", stmt_cons_ua
, 8 },
5252 { "data16.ua", stmt_cons_ua
, 16 },
5253 { "real4.ua", float_cons
, 'f' },
5254 { "real8.ua", float_cons
, 'd' },
5255 { "real10.ua", float_cons
, 'x' },
5256 { "real16.ua", float_cons
, 'X' },
5259 /* Declare a register by creating a symbol for it and entering it in
5260 the symbol table. */
5263 declare_register (const char *name
, unsigned int regnum
)
5268 sym
= symbol_create (name
, reg_section
, regnum
, &zero_address_frag
);
5270 err
= hash_insert (md
.reg_hash
, S_GET_NAME (sym
), (void *) sym
);
5272 as_fatal ("Inserting \"%s\" into register table failed: %s",
5279 declare_register_set (const char *prefix
,
5280 unsigned int num_regs
,
5281 unsigned int base_regnum
)
5286 for (i
= 0; i
< num_regs
; ++i
)
5288 snprintf (name
, sizeof (name
), "%s%u", prefix
, i
);
5289 declare_register (name
, base_regnum
+ i
);
5294 operand_width (enum ia64_opnd opnd
)
5296 const struct ia64_operand
*odesc
= &elf64_ia64_operands
[opnd
];
5297 unsigned int bits
= 0;
5301 for (i
= 0; i
< NELEMS (odesc
->field
) && odesc
->field
[i
].bits
; ++i
)
5302 bits
+= odesc
->field
[i
].bits
;
5307 static enum operand_match_result
5308 operand_match (const struct ia64_opcode
*idesc
, int index
, expressionS
*e
)
5310 enum ia64_opnd opnd
= idesc
->operands
[index
];
5311 int bits
, relocatable
= 0;
5312 struct insn_fix
*fix
;
5319 case IA64_OPND_AR_CCV
:
5320 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_AR
+ 32)
5321 return OPERAND_MATCH
;
5324 case IA64_OPND_AR_CSD
:
5325 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_AR
+ 25)
5326 return OPERAND_MATCH
;
5329 case IA64_OPND_AR_PFS
:
5330 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_AR
+ 64)
5331 return OPERAND_MATCH
;
5335 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_GR
+ 0)
5336 return OPERAND_MATCH
;
5340 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_IP
)
5341 return OPERAND_MATCH
;
5345 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_PR
)
5346 return OPERAND_MATCH
;
5349 case IA64_OPND_PR_ROT
:
5350 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_PR_ROT
)
5351 return OPERAND_MATCH
;
5355 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_PSR
)
5356 return OPERAND_MATCH
;
5359 case IA64_OPND_PSR_L
:
5360 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_PSR_L
)
5361 return OPERAND_MATCH
;
5364 case IA64_OPND_PSR_UM
:
5365 if (e
->X_op
== O_register
&& e
->X_add_number
== REG_PSR_UM
)
5366 return OPERAND_MATCH
;
5370 if (e
->X_op
== O_constant
)
5372 if (e
->X_add_number
== 1)
5373 return OPERAND_MATCH
;
5375 return OPERAND_OUT_OF_RANGE
;
5380 if (e
->X_op
== O_constant
)
5382 if (e
->X_add_number
== 8)
5383 return OPERAND_MATCH
;
5385 return OPERAND_OUT_OF_RANGE
;
5390 if (e
->X_op
== O_constant
)
5392 if (e
->X_add_number
== 16)
5393 return OPERAND_MATCH
;
5395 return OPERAND_OUT_OF_RANGE
;
5399 /* register operands: */
5402 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_AR
5403 && e
->X_add_number
< REG_AR
+ 128)
5404 return OPERAND_MATCH
;
5409 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_BR
5410 && e
->X_add_number
< REG_BR
+ 8)
5411 return OPERAND_MATCH
;
5415 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_CR
5416 && e
->X_add_number
< REG_CR
+ 128)
5417 return OPERAND_MATCH
;
5424 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_FR
5425 && e
->X_add_number
< REG_FR
+ 128)
5426 return OPERAND_MATCH
;
5431 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_P
5432 && e
->X_add_number
< REG_P
+ 64)
5433 return OPERAND_MATCH
;
5439 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_GR
5440 && e
->X_add_number
< REG_GR
+ 128)
5441 return OPERAND_MATCH
;
5444 case IA64_OPND_R3_2
:
5445 if (e
->X_op
== O_register
&& e
->X_add_number
>= REG_GR
)
5447 if (e
->X_add_number
< REG_GR
+ 4)
5448 return OPERAND_MATCH
;
5449 else if (e
->X_add_number
< REG_GR
+ 128)
5450 return OPERAND_OUT_OF_RANGE
;
5454 /* indirect operands: */
5455 case IA64_OPND_CPUID_R3
:
5456 case IA64_OPND_DBR_R3
:
5457 case IA64_OPND_DTR_R3
:
5458 case IA64_OPND_ITR_R3
:
5459 case IA64_OPND_IBR_R3
:
5460 case IA64_OPND_MSR_R3
:
5461 case IA64_OPND_PKR_R3
:
5462 case IA64_OPND_PMC_R3
:
5463 case IA64_OPND_PMD_R3
:
5464 case IA64_OPND_RR_R3
:
5465 if (e
->X_op
== O_index
&& e
->X_op_symbol
5466 && (S_GET_VALUE (e
->X_op_symbol
) - IND_CPUID
5467 == opnd
- IA64_OPND_CPUID_R3
))
5468 return OPERAND_MATCH
;
5472 if (e
->X_op
== O_index
&& !e
->X_op_symbol
)
5473 return OPERAND_MATCH
;
5476 /* immediate operands: */
5477 case IA64_OPND_CNT2a
:
5478 case IA64_OPND_LEN4
:
5479 case IA64_OPND_LEN6
:
5480 bits
= operand_width (idesc
->operands
[index
]);
5481 if (e
->X_op
== O_constant
)
5483 if ((bfd_vma
) (e
->X_add_number
- 1) < ((bfd_vma
) 1 << bits
))
5484 return OPERAND_MATCH
;
5486 return OPERAND_OUT_OF_RANGE
;
5490 case IA64_OPND_CNT2b
:
5491 if (e
->X_op
== O_constant
)
5493 if ((bfd_vma
) (e
->X_add_number
- 1) < 3)
5494 return OPERAND_MATCH
;
5496 return OPERAND_OUT_OF_RANGE
;
5500 case IA64_OPND_CNT2c
:
5501 val
= e
->X_add_number
;
5502 if (e
->X_op
== O_constant
)
5504 if ((val
== 0 || val
== 7 || val
== 15 || val
== 16))
5505 return OPERAND_MATCH
;
5507 return OPERAND_OUT_OF_RANGE
;
5512 /* SOR must be an integer multiple of 8 */
5513 if (e
->X_op
== O_constant
&& e
->X_add_number
& 0x7)
5514 return OPERAND_OUT_OF_RANGE
;
5517 if (e
->X_op
== O_constant
)
5519 if ((bfd_vma
) e
->X_add_number
<= 96)
5520 return OPERAND_MATCH
;
5522 return OPERAND_OUT_OF_RANGE
;
5526 case IA64_OPND_IMMU62
:
5527 if (e
->X_op
== O_constant
)
5529 if ((bfd_vma
) e
->X_add_number
< ((bfd_vma
) 1 << 62))
5530 return OPERAND_MATCH
;
5532 return OPERAND_OUT_OF_RANGE
;
5536 /* FIXME -- need 62-bit relocation type */
5537 as_bad (_("62-bit relocation not yet implemented"));
5541 case IA64_OPND_IMMU64
:
5542 if (e
->X_op
== O_symbol
|| e
->X_op
== O_pseudo_fixup
5543 || e
->X_op
== O_subtract
)
5545 fix
= CURR_SLOT
.fixup
+ CURR_SLOT
.num_fixups
;
5546 fix
->code
= BFD_RELOC_IA64_IMM64
;
5547 if (e
->X_op
!= O_subtract
)
5549 fix
->code
= ia64_gen_real_reloc_type (e
->X_op_symbol
, fix
->code
);
5550 if (e
->X_op
== O_pseudo_fixup
)
5554 fix
->opnd
= idesc
->operands
[index
];
5557 ++CURR_SLOT
.num_fixups
;
5558 return OPERAND_MATCH
;
5560 else if (e
->X_op
== O_constant
)
5561 return OPERAND_MATCH
;
5564 case IA64_OPND_IMMU5b
:
5565 if (e
->X_op
== O_constant
)
5567 val
= e
->X_add_number
;
5568 if (val
>= 32 && val
<= 63)
5569 return OPERAND_MATCH
;
5571 return OPERAND_OUT_OF_RANGE
;
5575 case IA64_OPND_CCNT5
:
5576 case IA64_OPND_CNT5
:
5577 case IA64_OPND_CNT6
:
5578 case IA64_OPND_CPOS6a
:
5579 case IA64_OPND_CPOS6b
:
5580 case IA64_OPND_CPOS6c
:
5581 case IA64_OPND_IMMU2
:
5582 case IA64_OPND_IMMU7a
:
5583 case IA64_OPND_IMMU7b
:
5584 case IA64_OPND_IMMU21
:
5585 case IA64_OPND_IMMU24
:
5586 case IA64_OPND_MBTYPE4
:
5587 case IA64_OPND_MHTYPE8
:
5588 case IA64_OPND_POS6
:
5589 bits
= operand_width (idesc
->operands
[index
]);
5590 if (e
->X_op
== O_constant
)
5592 if ((bfd_vma
) e
->X_add_number
< ((bfd_vma
) 1 << bits
))
5593 return OPERAND_MATCH
;
5595 return OPERAND_OUT_OF_RANGE
;
5599 case IA64_OPND_IMMU9
:
5600 bits
= operand_width (idesc
->operands
[index
]);
5601 if (e
->X_op
== O_constant
)
5603 if ((bfd_vma
) e
->X_add_number
< ((bfd_vma
) 1 << bits
))
5605 int lobits
= e
->X_add_number
& 0x3;
5606 if (((bfd_vma
) e
->X_add_number
& 0x3C) != 0 && lobits
== 0)
5607 e
->X_add_number
|= (bfd_vma
) 0x3;
5608 return OPERAND_MATCH
;
5611 return OPERAND_OUT_OF_RANGE
;
5615 case IA64_OPND_IMM44
:
5616 /* least 16 bits must be zero */
5617 if ((e
->X_add_number
& 0xffff) != 0)
5618 /* XXX technically, this is wrong: we should not be issuing warning
5619 messages until we're sure this instruction pattern is going to
5621 as_warn (_("lower 16 bits of mask ignored"));
5623 if (e
->X_op
== O_constant
)
5625 if (((e
->X_add_number
>= 0
5626 && (bfd_vma
) e
->X_add_number
< ((bfd_vma
) 1 << 44))
5627 || (e
->X_add_number
< 0
5628 && (bfd_vma
) -e
->X_add_number
<= ((bfd_vma
) 1 << 44))))
5631 if (e
->X_add_number
>= 0
5632 && (e
->X_add_number
& ((bfd_vma
) 1 << 43)) != 0)
5634 e
->X_add_number
|= ~(((bfd_vma
) 1 << 44) - 1);
5636 return OPERAND_MATCH
;
5639 return OPERAND_OUT_OF_RANGE
;
5643 case IA64_OPND_IMM17
:
5644 /* bit 0 is a don't care (pr0 is hardwired to 1) */
5645 if (e
->X_op
== O_constant
)
5647 if (((e
->X_add_number
>= 0
5648 && (bfd_vma
) e
->X_add_number
< ((bfd_vma
) 1 << 17))
5649 || (e
->X_add_number
< 0
5650 && (bfd_vma
) -e
->X_add_number
<= ((bfd_vma
) 1 << 17))))
5653 if (e
->X_add_number
>= 0
5654 && (e
->X_add_number
& ((bfd_vma
) 1 << 16)) != 0)
5656 e
->X_add_number
|= ~(((bfd_vma
) 1 << 17) - 1);
5658 return OPERAND_MATCH
;
5661 return OPERAND_OUT_OF_RANGE
;
5665 case IA64_OPND_IMM14
:
5666 case IA64_OPND_IMM22
:
5668 case IA64_OPND_IMM1
:
5669 case IA64_OPND_IMM8
:
5670 case IA64_OPND_IMM8U4
:
5671 case IA64_OPND_IMM8M1
:
5672 case IA64_OPND_IMM8M1U4
:
5673 case IA64_OPND_IMM8M1U8
:
5674 case IA64_OPND_IMM9a
:
5675 case IA64_OPND_IMM9b
:
5676 bits
= operand_width (idesc
->operands
[index
]);
5677 if (relocatable
&& (e
->X_op
== O_symbol
5678 || e
->X_op
== O_subtract
5679 || e
->X_op
== O_pseudo_fixup
))
5681 fix
= CURR_SLOT
.fixup
+ CURR_SLOT
.num_fixups
;
5683 if (idesc
->operands
[index
] == IA64_OPND_IMM14
)
5684 fix
->code
= BFD_RELOC_IA64_IMM14
;
5686 fix
->code
= BFD_RELOC_IA64_IMM22
;
5688 if (e
->X_op
!= O_subtract
)
5690 fix
->code
= ia64_gen_real_reloc_type (e
->X_op_symbol
, fix
->code
);
5691 if (e
->X_op
== O_pseudo_fixup
)
5695 fix
->opnd
= idesc
->operands
[index
];
5698 ++CURR_SLOT
.num_fixups
;
5699 return OPERAND_MATCH
;
5701 else if (e
->X_op
!= O_constant
5702 && ! (e
->X_op
== O_big
&& opnd
== IA64_OPND_IMM8M1U8
))
5703 return OPERAND_MISMATCH
;
5705 if (opnd
== IA64_OPND_IMM8M1U4
)
5707 /* Zero is not valid for unsigned compares that take an adjusted
5708 constant immediate range. */
5709 if (e
->X_add_number
== 0)
5710 return OPERAND_OUT_OF_RANGE
;
5712 /* Sign-extend 32-bit unsigned numbers, so that the following range
5713 checks will work. */
5714 val
= e
->X_add_number
;
5715 if (((val
& (~(bfd_vma
) 0 << 32)) == 0)
5716 && ((val
& ((bfd_vma
) 1 << 31)) != 0))
5717 val
= ((val
<< 32) >> 32);
5719 /* Check for 0x100000000. This is valid because
5720 0x100000000-1 is the same as ((uint32_t) -1). */
5721 if (val
== ((bfd_signed_vma
) 1 << 32))
5722 return OPERAND_MATCH
;
5726 else if (opnd
== IA64_OPND_IMM8M1U8
)
5728 /* Zero is not valid for unsigned compares that take an adjusted
5729 constant immediate range. */
5730 if (e
->X_add_number
== 0)
5731 return OPERAND_OUT_OF_RANGE
;
5733 /* Check for 0x10000000000000000. */
5734 if (e
->X_op
== O_big
)
5736 if (generic_bignum
[0] == 0
5737 && generic_bignum
[1] == 0
5738 && generic_bignum
[2] == 0
5739 && generic_bignum
[3] == 0
5740 && generic_bignum
[4] == 1)
5741 return OPERAND_MATCH
;
5743 return OPERAND_OUT_OF_RANGE
;
5746 val
= e
->X_add_number
- 1;
5748 else if (opnd
== IA64_OPND_IMM8M1
)
5749 val
= e
->X_add_number
- 1;
5750 else if (opnd
== IA64_OPND_IMM8U4
)
5752 /* Sign-extend 32-bit unsigned numbers, so that the following range
5753 checks will work. */
5754 val
= e
->X_add_number
;
5755 if (((val
& (~(bfd_vma
) 0 << 32)) == 0)
5756 && ((val
& ((bfd_vma
) 1 << 31)) != 0))
5757 val
= ((val
<< 32) >> 32);
5760 val
= e
->X_add_number
;
5762 if ((val
>= 0 && (bfd_vma
) val
< ((bfd_vma
) 1 << (bits
- 1)))
5763 || (val
< 0 && (bfd_vma
) -val
<= ((bfd_vma
) 1 << (bits
- 1))))
5764 return OPERAND_MATCH
;
5766 return OPERAND_OUT_OF_RANGE
;
5768 case IA64_OPND_INC3
:
5769 /* +/- 1, 4, 8, 16 */
5770 val
= e
->X_add_number
;
5773 if (e
->X_op
== O_constant
)
5775 if ((val
== 1 || val
== 4 || val
== 8 || val
== 16))
5776 return OPERAND_MATCH
;
5778 return OPERAND_OUT_OF_RANGE
;
5782 case IA64_OPND_TGT25
:
5783 case IA64_OPND_TGT25b
:
5784 case IA64_OPND_TGT25c
:
5785 case IA64_OPND_TGT64
:
5786 if (e
->X_op
== O_symbol
)
5788 fix
= CURR_SLOT
.fixup
+ CURR_SLOT
.num_fixups
;
5789 if (opnd
== IA64_OPND_TGT25
)
5790 fix
->code
= BFD_RELOC_IA64_PCREL21F
;
5791 else if (opnd
== IA64_OPND_TGT25b
)
5792 fix
->code
= BFD_RELOC_IA64_PCREL21M
;
5793 else if (opnd
== IA64_OPND_TGT25c
)
5794 fix
->code
= BFD_RELOC_IA64_PCREL21B
;
5795 else if (opnd
== IA64_OPND_TGT64
)
5796 fix
->code
= BFD_RELOC_IA64_PCREL60B
;
5800 fix
->code
= ia64_gen_real_reloc_type (e
->X_op_symbol
, fix
->code
);
5801 fix
->opnd
= idesc
->operands
[index
];
5804 ++CURR_SLOT
.num_fixups
;
5805 return OPERAND_MATCH
;
5807 case IA64_OPND_TAG13
:
5808 case IA64_OPND_TAG13b
:
5812 return OPERAND_MATCH
;
5815 fix
= CURR_SLOT
.fixup
+ CURR_SLOT
.num_fixups
;
5816 /* There are no external relocs for TAG13/TAG13b fields, so we
5817 create a dummy reloc. This will not live past md_apply_fix. */
5818 fix
->code
= BFD_RELOC_UNUSED
;
5819 fix
->code
= ia64_gen_real_reloc_type (e
->X_op_symbol
, fix
->code
);
5820 fix
->opnd
= idesc
->operands
[index
];
5823 ++CURR_SLOT
.num_fixups
;
5824 return OPERAND_MATCH
;
5831 case IA64_OPND_LDXMOV
:
5832 fix
= CURR_SLOT
.fixup
+ CURR_SLOT
.num_fixups
;
5833 fix
->code
= BFD_RELOC_IA64_LDXMOV
;
5834 fix
->opnd
= idesc
->operands
[index
];
5837 ++CURR_SLOT
.num_fixups
;
5838 return OPERAND_MATCH
;
5843 return OPERAND_MISMATCH
;
5847 parse_operand (expressionS
*e
, int more
)
5851 memset (e
, 0, sizeof (*e
));
5854 expression_and_evaluate (e
);
5855 sep
= *input_line_pointer
;
5856 if (more
&& (sep
== ',' || sep
== more
))
5857 ++input_line_pointer
;
5861 /* Returns the next entry in the opcode table that matches the one in
5862 IDESC, and frees the entry in IDESC. If no matching entry is
5863 found, NULL is returned instead. */
5865 static struct ia64_opcode
*
5866 get_next_opcode (struct ia64_opcode
*idesc
)
5868 struct ia64_opcode
*next
= ia64_find_next_opcode (idesc
);
5869 ia64_free_opcode (idesc
);
5873 /* Parse the operands for the opcode and find the opcode variant that
5874 matches the specified operands, or NULL if no match is possible. */
5876 static struct ia64_opcode
*
5877 parse_operands (struct ia64_opcode
*idesc
)
5879 int i
= 0, highest_unmatched_operand
, num_operands
= 0, num_outputs
= 0;
5880 int error_pos
, out_of_range_pos
, curr_out_of_range_pos
, sep
= 0;
5883 enum ia64_opnd expected_operand
= IA64_OPND_NIL
;
5884 enum operand_match_result result
;
5886 char *first_arg
= 0, *end
, *saved_input_pointer
;
5889 gas_assert (strlen (idesc
->name
) <= 128);
5891 strcpy (mnemonic
, idesc
->name
);
5892 if (idesc
->operands
[2] == IA64_OPND_SOF
5893 || idesc
->operands
[1] == IA64_OPND_SOF
)
5895 /* To make the common idiom "alloc loc?=ar.pfs,0,1,0,0" work, we
5896 can't parse the first operand until we have parsed the
5897 remaining operands of the "alloc" instruction. */
5899 first_arg
= input_line_pointer
;
5900 end
= strchr (input_line_pointer
, '=');
5903 as_bad (_("Expected separator `='"));
5906 input_line_pointer
= end
+ 1;
5913 if (i
< NELEMS (CURR_SLOT
.opnd
))
5915 sep
= parse_operand (CURR_SLOT
.opnd
+ i
, '=');
5916 if (CURR_SLOT
.opnd
[i
].X_op
== O_absent
)
5923 sep
= parse_operand (&dummy
, '=');
5924 if (dummy
.X_op
== O_absent
)
5930 if (sep
!= '=' && sep
!= ',')
5935 if (num_outputs
> 0)
5936 as_bad (_("Duplicate equal sign (=) in instruction"));
5938 num_outputs
= i
+ 1;
5943 as_bad (_("Illegal operand separator `%c'"), sep
);
5947 if (idesc
->operands
[2] == IA64_OPND_SOF
5948 || idesc
->operands
[1] == IA64_OPND_SOF
)
5950 /* Map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r.
5951 Note, however, that due to that mapping operand numbers in error
5952 messages for any of the constant operands will not be correct. */
5953 know (strcmp (idesc
->name
, "alloc") == 0);
5954 /* The first operand hasn't been parsed/initialized, yet (but
5955 num_operands intentionally doesn't account for that). */
5956 i
= num_operands
> 4 ? 2 : 1;
5957 #define FORCE_CONST(n) (CURR_SLOT.opnd[n].X_op == O_constant \
5958 ? CURR_SLOT.opnd[n].X_add_number \
5960 sof
= set_regstack (FORCE_CONST(i
),
5963 FORCE_CONST(i
+ 3));
5966 /* now we can parse the first arg: */
5967 saved_input_pointer
= input_line_pointer
;
5968 input_line_pointer
= first_arg
;
5969 sep
= parse_operand (CURR_SLOT
.opnd
+ 0, '=');
5971 --num_outputs
; /* force error */
5972 input_line_pointer
= saved_input_pointer
;
5974 CURR_SLOT
.opnd
[i
].X_add_number
= sof
;
5975 if (CURR_SLOT
.opnd
[i
+ 1].X_op
== O_constant
5976 && CURR_SLOT
.opnd
[i
+ 2].X_op
== O_constant
)
5977 CURR_SLOT
.opnd
[i
+ 1].X_add_number
5978 = sof
- CURR_SLOT
.opnd
[i
+ 2].X_add_number
;
5980 CURR_SLOT
.opnd
[i
+ 1].X_op
= O_illegal
;
5981 CURR_SLOT
.opnd
[i
+ 2] = CURR_SLOT
.opnd
[i
+ 3];
5984 highest_unmatched_operand
= -4;
5985 curr_out_of_range_pos
= -1;
5987 for (; idesc
; idesc
= get_next_opcode (idesc
))
5989 if (num_outputs
!= idesc
->num_outputs
)
5990 continue; /* mismatch in # of outputs */
5991 if (highest_unmatched_operand
< 0)
5992 highest_unmatched_operand
|= 1;
5993 if (num_operands
> NELEMS (idesc
->operands
)
5994 || (num_operands
< NELEMS (idesc
->operands
)
5995 && idesc
->operands
[num_operands
])
5996 || (num_operands
> 0 && !idesc
->operands
[num_operands
- 1]))
5997 continue; /* mismatch in number of arguments */
5998 if (highest_unmatched_operand
< 0)
5999 highest_unmatched_operand
|= 2;
6001 CURR_SLOT
.num_fixups
= 0;
6003 /* Try to match all operands. If we see an out-of-range operand,
6004 then continue trying to match the rest of the operands, since if
6005 the rest match, then this idesc will give the best error message. */
6007 out_of_range_pos
= -1;
6008 for (i
= 0; i
< num_operands
&& idesc
->operands
[i
]; ++i
)
6010 result
= operand_match (idesc
, i
, CURR_SLOT
.opnd
+ i
);
6011 if (result
!= OPERAND_MATCH
)
6013 if (result
!= OPERAND_OUT_OF_RANGE
)
6015 if (out_of_range_pos
< 0)
6016 /* remember position of the first out-of-range operand: */
6017 out_of_range_pos
= i
;
6021 /* If we did not match all operands, or if at least one operand was
6022 out-of-range, then this idesc does not match. Keep track of which
6023 idesc matched the most operands before failing. If we have two
6024 idescs that failed at the same position, and one had an out-of-range
6025 operand, then prefer the out-of-range operand. Thus if we have
6026 "add r0=0x1000000,r1" we get an error saying the constant is out
6027 of range instead of an error saying that the constant should have been
6030 if (i
!= num_operands
|| out_of_range_pos
>= 0)
6032 if (i
> highest_unmatched_operand
6033 || (i
== highest_unmatched_operand
6034 && out_of_range_pos
> curr_out_of_range_pos
))
6036 highest_unmatched_operand
= i
;
6037 if (out_of_range_pos
>= 0)
6039 expected_operand
= idesc
->operands
[out_of_range_pos
];
6040 error_pos
= out_of_range_pos
;
6044 expected_operand
= idesc
->operands
[i
];
6047 curr_out_of_range_pos
= out_of_range_pos
;
6056 if (expected_operand
)
6057 as_bad (_("Operand %u of `%s' should be %s"),
6058 error_pos
+ 1, mnemonic
,
6059 elf64_ia64_operands
[expected_operand
].desc
);
6060 else if (highest_unmatched_operand
< 0 && !(highest_unmatched_operand
& 1))
6061 as_bad (_("Wrong number of output operands"));
6062 else if (highest_unmatched_operand
< 0 && !(highest_unmatched_operand
& 2))
6063 as_bad (_("Wrong number of input operands"));
6065 as_bad (_("Operand mismatch"));
6069 /* Check that the instruction doesn't use
6070 - r0, f0, or f1 as output operands
6071 - the same predicate twice as output operands
6072 - r0 as address of a base update load or store
6073 - the same GR as output and address of a base update load
6074 - two even- or two odd-numbered FRs as output operands of a floating
6075 point parallel load.
6076 At most two (conflicting) output (or output-like) operands can exist,
6077 (floating point parallel loads have three outputs, but the base register,
6078 if updated, cannot conflict with the actual outputs). */
6080 for (i
= 0; i
< num_operands
; ++i
)
6085 switch (idesc
->operands
[i
])
6090 if (i
< num_outputs
)
6092 if (CURR_SLOT
.opnd
[i
].X_add_number
== REG_GR
)
6095 reg1
= CURR_SLOT
.opnd
[i
].X_add_number
;
6097 reg2
= CURR_SLOT
.opnd
[i
].X_add_number
;
6102 if (i
< num_outputs
)
6105 reg1
= CURR_SLOT
.opnd
[i
].X_add_number
;
6107 reg2
= CURR_SLOT
.opnd
[i
].X_add_number
;
6114 if (i
< num_outputs
)
6116 if (CURR_SLOT
.opnd
[i
].X_add_number
>= REG_FR
6117 && CURR_SLOT
.opnd
[i
].X_add_number
<= REG_FR
+ 1)
6120 regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_FR
;
6123 reg1
= CURR_SLOT
.opnd
[i
].X_add_number
;
6125 reg2
= CURR_SLOT
.opnd
[i
].X_add_number
;
6129 if (idesc
->flags
& IA64_OPCODE_POSTINC
)
6131 if (CURR_SLOT
.opnd
[i
].X_add_number
== REG_GR
)
6134 reg1
= CURR_SLOT
.opnd
[i
].X_add_number
;
6136 reg2
= CURR_SLOT
.opnd
[i
].X_add_number
;
6147 as_warn (_("Invalid use of `%c%d' as output operand"), reg_class
, regno
);
6150 as_warn (_("Invalid use of `r%d' as base update address operand"), regno
);
6156 if (reg1
>= REG_GR
&& reg1
<= REG_GR
+ 127)
6161 else if (reg1
>= REG_P
&& reg1
<= REG_P
+ 63)
6166 else if (reg1
>= REG_FR
&& reg1
<= REG_FR
+ 127)
6174 as_warn (_("Invalid duplicate use of `%c%d'"), reg_class
, reg1
);
6176 else if (((reg1
>= REG_FR
&& reg1
<= REG_FR
+ 31
6177 && reg2
>= REG_FR
&& reg2
<= REG_FR
+ 31)
6178 || (reg1
>= REG_FR
+ 32 && reg1
<= REG_FR
+ 127
6179 && reg2
>= REG_FR
+ 32 && reg2
<= REG_FR
+ 127))
6180 && ! ((reg1
^ reg2
) & 1))
6181 as_warn (_("Invalid simultaneous use of `f%d' and `f%d'"),
6182 reg1
- REG_FR
, reg2
- REG_FR
);
6183 else if ((reg1
>= REG_FR
&& reg1
<= REG_FR
+ 31
6184 && reg2
>= REG_FR
+ 32 && reg2
<= REG_FR
+ 127)
6185 || (reg1
>= REG_FR
+ 32 && reg1
<= REG_FR
+ 127
6186 && reg2
>= REG_FR
&& reg2
<= REG_FR
+ 31))
6187 as_warn (_("Dangerous simultaneous use of `f%d' and `f%d'"),
6188 reg1
- REG_FR
, reg2
- REG_FR
);
6193 build_insn (struct slot
*slot
, bfd_vma
*insnp
)
6195 const struct ia64_operand
*odesc
, *o2desc
;
6196 struct ia64_opcode
*idesc
= slot
->idesc
;
6202 insn
= idesc
->opcode
| slot
->qp_regno
;
6204 for (i
= 0; i
< NELEMS (idesc
->operands
) && idesc
->operands
[i
]; ++i
)
6206 if (slot
->opnd
[i
].X_op
== O_register
6207 || slot
->opnd
[i
].X_op
== O_constant
6208 || slot
->opnd
[i
].X_op
== O_index
)
6209 val
= slot
->opnd
[i
].X_add_number
;
6210 else if (slot
->opnd
[i
].X_op
== O_big
)
6212 /* This must be the value 0x10000000000000000. */
6213 gas_assert (idesc
->operands
[i
] == IA64_OPND_IMM8M1U8
);
6219 switch (idesc
->operands
[i
])
6221 case IA64_OPND_IMMU64
:
6222 *insnp
++ = (val
>> 22) & 0x1ffffffffffLL
;
6223 insn
|= (((val
& 0x7f) << 13) | (((val
>> 7) & 0x1ff) << 27)
6224 | (((val
>> 16) & 0x1f) << 22) | (((val
>> 21) & 0x1) << 21)
6225 | (((val
>> 63) & 0x1) << 36));
6228 case IA64_OPND_IMMU62
:
6229 val
&= 0x3fffffffffffffffULL
;
6230 if (val
!= slot
->opnd
[i
].X_add_number
)
6231 as_warn (_("Value truncated to 62 bits"));
6232 *insnp
++ = (val
>> 21) & 0x1ffffffffffLL
;
6233 insn
|= (((val
& 0xfffff) << 6) | (((val
>> 20) & 0x1) << 36));
6236 case IA64_OPND_TGT64
:
6238 *insnp
++ = ((val
>> 20) & 0x7fffffffffLL
) << 2;
6239 insn
|= ((((val
>> 59) & 0x1) << 36)
6240 | (((val
>> 0) & 0xfffff) << 13));
6271 case IA64_OPND_R3_2
:
6272 case IA64_OPND_CPUID_R3
:
6273 case IA64_OPND_DBR_R3
:
6274 case IA64_OPND_DTR_R3
:
6275 case IA64_OPND_ITR_R3
:
6276 case IA64_OPND_IBR_R3
:
6278 case IA64_OPND_MSR_R3
:
6279 case IA64_OPND_PKR_R3
:
6280 case IA64_OPND_PMC_R3
:
6281 case IA64_OPND_PMD_R3
:
6282 case IA64_OPND_RR_R3
:
6290 odesc
= elf64_ia64_operands
+ idesc
->operands
[i
];
6291 err
= (*odesc
->insert
) (odesc
, val
, &insn
);
6293 as_bad_where (slot
->src_file
, slot
->src_line
,
6294 _("Bad operand value: %s"), err
);
6295 if (idesc
->flags
& IA64_OPCODE_PSEUDO
)
6297 if ((idesc
->flags
& IA64_OPCODE_F2_EQ_F3
)
6298 && odesc
== elf64_ia64_operands
+ IA64_OPND_F3
)
6300 o2desc
= elf64_ia64_operands
+ IA64_OPND_F2
;
6301 (*o2desc
->insert
) (o2desc
, val
, &insn
);
6303 if ((idesc
->flags
& IA64_OPCODE_LEN_EQ_64MCNT
)
6304 && (odesc
== elf64_ia64_operands
+ IA64_OPND_CPOS6a
6305 || odesc
== elf64_ia64_operands
+ IA64_OPND_POS6
))
6307 o2desc
= elf64_ia64_operands
+ IA64_OPND_LEN6
;
6308 (*o2desc
->insert
) (o2desc
, 64 - val
, &insn
);
6316 emit_one_bundle (void)
6318 int manual_bundling_off
= 0, manual_bundling
= 0;
6319 enum ia64_unit required_unit
, insn_unit
= 0;
6320 enum ia64_insn_type type
[3], insn_type
;
6321 unsigned int template, orig_template
;
6322 bfd_vma insn
[3] = { -1, -1, -1 };
6323 struct ia64_opcode
*idesc
;
6324 int end_of_insn_group
= 0, user_template
= -1;
6325 int n
, i
, j
, first
, curr
, last_slot
;
6326 bfd_vma t0
= 0, t1
= 0;
6327 struct label_fix
*lfix
;
6328 bfd_boolean mark_label
;
6329 struct insn_fix
*ifix
;
6335 first
= (md
.curr_slot
+ NUM_SLOTS
- md
.num_slots_in_use
) % NUM_SLOTS
;
6336 know (first
>= 0 && first
< NUM_SLOTS
);
6337 n
= MIN (3, md
.num_slots_in_use
);
6339 /* Determine template: user user_template if specified, best match
6342 if (md
.slot
[first
].user_template
>= 0)
6343 user_template
= template = md
.slot
[first
].user_template
;
6346 /* Auto select appropriate template. */
6347 memset (type
, 0, sizeof (type
));
6349 for (i
= 0; i
< n
; ++i
)
6351 if (md
.slot
[curr
].label_fixups
&& i
!= 0)
6353 type
[i
] = md
.slot
[curr
].idesc
->type
;
6354 curr
= (curr
+ 1) % NUM_SLOTS
;
6356 template = best_template
[type
[0]][type
[1]][type
[2]];
6359 /* initialize instructions with appropriate nops: */
6360 for (i
= 0; i
< 3; ++i
)
6361 insn
[i
] = nop
[ia64_templ_desc
[template].exec_unit
[i
]];
6365 /* Check to see if this bundle is at an offset that is a multiple of 16-bytes
6366 from the start of the frag. */
6367 addr_mod
= frag_now_fix () & 15;
6368 if (frag_now
->has_code
&& frag_now
->insn_addr
!= addr_mod
)
6369 as_bad (_("instruction address is not a multiple of 16"));
6370 frag_now
->insn_addr
= addr_mod
;
6371 frag_now
->has_code
= 1;
6373 /* now fill in slots with as many insns as possible: */
6375 idesc
= md
.slot
[curr
].idesc
;
6376 end_of_insn_group
= 0;
6378 for (i
= 0; i
< 3 && md
.num_slots_in_use
> 0; ++i
)
6380 /* If we have unwind records, we may need to update some now. */
6381 unw_rec_list
*ptr
= md
.slot
[curr
].unwind_record
;
6382 unw_rec_list
*end_ptr
= NULL
;
6386 /* Find the last prologue/body record in the list for the current
6387 insn, and set the slot number for all records up to that point.
6388 This needs to be done now, because prologue/body records refer to
6389 the current point, not the point after the instruction has been
6390 issued. This matters because there may have been nops emitted
6391 meanwhile. Any non-prologue non-body record followed by a
6392 prologue/body record must also refer to the current point. */
6393 unw_rec_list
*last_ptr
;
6395 for (j
= 1; end_ptr
== NULL
&& j
< md
.num_slots_in_use
; ++j
)
6396 end_ptr
= md
.slot
[(curr
+ j
) % NUM_SLOTS
].unwind_record
;
6397 for (last_ptr
= NULL
; ptr
!= end_ptr
; ptr
= ptr
->next
)
6398 if (ptr
->r
.type
== prologue
|| ptr
->r
.type
== prologue_gr
6399 || ptr
->r
.type
== body
)
6403 /* Make last_ptr point one after the last prologue/body
6405 last_ptr
= last_ptr
->next
;
6406 for (ptr
= md
.slot
[curr
].unwind_record
; ptr
!= last_ptr
;
6409 ptr
->slot_number
= (unsigned long) f
+ i
;
6410 ptr
->slot_frag
= frag_now
;
6412 /* Remove the initialized records, so that we won't accidentally
6413 update them again if we insert a nop and continue. */
6414 md
.slot
[curr
].unwind_record
= last_ptr
;
6418 manual_bundling_off
= md
.slot
[curr
].manual_bundling_off
;
6419 if (md
.slot
[curr
].manual_bundling_on
)
6422 manual_bundling
= 1;
6424 break; /* Need to start a new bundle. */
6427 /* If this instruction specifies a template, then it must be the first
6428 instruction of a bundle. */
6429 if (curr
!= first
&& md
.slot
[curr
].user_template
>= 0)
6432 if (idesc
->flags
& IA64_OPCODE_SLOT2
)
6434 if (manual_bundling
&& !manual_bundling_off
)
6436 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6437 _("`%s' must be last in bundle"), idesc
->name
);
6439 manual_bundling
= -1; /* Suppress meaningless post-loop errors. */
6443 if (idesc
->flags
& IA64_OPCODE_LAST
)
6446 unsigned int required_template
;
6448 /* If we need a stop bit after an M slot, our only choice is
6449 template 5 (M;;MI). If we need a stop bit after a B
6450 slot, our only choice is to place it at the end of the
6451 bundle, because the only available templates are MIB,
6452 MBB, BBB, MMB, and MFB. We don't handle anything other
6453 than M and B slots because these are the only kind of
6454 instructions that can have the IA64_OPCODE_LAST bit set. */
6455 required_template
= template;
6456 switch (idesc
->type
)
6460 required_template
= 5;
6468 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6469 _("Internal error: don't know how to force %s to end of instruction group"),
6475 && (i
> required_slot
6476 || (required_slot
== 2 && !manual_bundling_off
)
6477 || (user_template
>= 0
6478 /* Changing from MMI to M;MI is OK. */
6479 && (template ^ required_template
) > 1)))
6481 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6482 _("`%s' must be last in instruction group"),
6484 if (i
< 2 && required_slot
== 2 && !manual_bundling_off
)
6485 manual_bundling
= -1; /* Suppress meaningless post-loop errors. */
6487 if (required_slot
< i
)
6488 /* Can't fit this instruction. */
6492 if (required_template
!= template)
6494 /* If we switch the template, we need to reset the NOPs
6495 after slot i. The slot-types of the instructions ahead
6496 of i never change, so we don't need to worry about
6497 changing NOPs in front of this slot. */
6498 for (j
= i
; j
< 3; ++j
)
6499 insn
[j
] = nop
[ia64_templ_desc
[required_template
].exec_unit
[j
]];
6501 /* We just picked a template that includes the stop bit in the
6502 middle, so we don't need another one emitted later. */
6503 md
.slot
[curr
].end_of_insn_group
= 0;
6505 template = required_template
;
6507 if (curr
!= first
&& md
.slot
[curr
].label_fixups
)
6509 if (manual_bundling
)
6511 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6512 _("Label must be first in a bundle"));
6513 manual_bundling
= -1; /* Suppress meaningless post-loop errors. */
6515 /* This insn must go into the first slot of a bundle. */
6519 if (end_of_insn_group
&& md
.num_slots_in_use
>= 1)
6521 /* We need an instruction group boundary in the middle of a
6522 bundle. See if we can switch to an other template with
6523 an appropriate boundary. */
6525 orig_template
= template;
6526 if (i
== 1 && (user_template
== 4
6527 || (user_template
< 0
6528 && (ia64_templ_desc
[template].exec_unit
[0]
6532 end_of_insn_group
= 0;
6534 else if (i
== 2 && (user_template
== 0
6535 || (user_template
< 0
6536 && (ia64_templ_desc
[template].exec_unit
[1]
6538 /* This test makes sure we don't switch the template if
6539 the next instruction is one that needs to be first in
6540 an instruction group. Since all those instructions are
6541 in the M group, there is no way such an instruction can
6542 fit in this bundle even if we switch the template. The
6543 reason we have to check for this is that otherwise we
6544 may end up generating "MI;;I M.." which has the deadly
6545 effect that the second M instruction is no longer the
6546 first in the group! --davidm 99/12/16 */
6547 && (idesc
->flags
& IA64_OPCODE_FIRST
) == 0)
6550 end_of_insn_group
= 0;
6553 && user_template
== 0
6554 && !(idesc
->flags
& IA64_OPCODE_FIRST
))
6555 /* Use the next slot. */
6557 else if (curr
!= first
)
6558 /* can't fit this insn */
6561 if (template != orig_template
)
6562 /* if we switch the template, we need to reset the NOPs
6563 after slot i. The slot-types of the instructions ahead
6564 of i never change, so we don't need to worry about
6565 changing NOPs in front of this slot. */
6566 for (j
= i
; j
< 3; ++j
)
6567 insn
[j
] = nop
[ia64_templ_desc
[template].exec_unit
[j
]];
6569 required_unit
= ia64_templ_desc
[template].exec_unit
[i
];
6571 /* resolve dynamic opcodes such as "break", "hint", and "nop": */
6572 if (idesc
->type
== IA64_TYPE_DYN
)
6574 enum ia64_opnd opnd1
, opnd2
;
6576 if ((strcmp (idesc
->name
, "nop") == 0)
6577 || (strcmp (idesc
->name
, "break") == 0))
6578 insn_unit
= required_unit
;
6579 else if (strcmp (idesc
->name
, "hint") == 0)
6581 insn_unit
= required_unit
;
6582 if (required_unit
== IA64_UNIT_B
)
6588 case hint_b_warning
:
6589 as_warn (_("hint in B unit may be treated as nop"));
6592 /* When manual bundling is off and there is no
6593 user template, we choose a different unit so
6594 that hint won't go into the current slot. We
6595 will fill the current bundle with nops and
6596 try to put hint into the next bundle. */
6597 if (!manual_bundling
&& user_template
< 0)
6598 insn_unit
= IA64_UNIT_I
;
6600 as_bad (_("hint in B unit can't be used"));
6605 else if (strcmp (idesc
->name
, "chk.s") == 0
6606 || strcmp (idesc
->name
, "mov") == 0)
6608 insn_unit
= IA64_UNIT_M
;
6609 if (required_unit
== IA64_UNIT_I
6610 || (required_unit
== IA64_UNIT_F
&& template == 6))
6611 insn_unit
= IA64_UNIT_I
;
6614 as_fatal (_("emit_one_bundle: unexpected dynamic op"));
6616 snprintf (mnemonic
, sizeof (mnemonic
), "%s.%c",
6617 idesc
->name
, "?imbfxx"[insn_unit
]);
6618 opnd1
= idesc
->operands
[0];
6619 opnd2
= idesc
->operands
[1];
6620 ia64_free_opcode (idesc
);
6621 idesc
= ia64_find_opcode (mnemonic
);
6622 /* moves to/from ARs have collisions */
6623 if (opnd1
== IA64_OPND_AR3
|| opnd2
== IA64_OPND_AR3
)
6625 while (idesc
!= NULL
6626 && (idesc
->operands
[0] != opnd1
6627 || idesc
->operands
[1] != opnd2
))
6628 idesc
= get_next_opcode (idesc
);
6630 md
.slot
[curr
].idesc
= idesc
;
6634 insn_type
= idesc
->type
;
6635 insn_unit
= IA64_UNIT_NIL
;
6639 if (required_unit
== IA64_UNIT_I
|| required_unit
== IA64_UNIT_M
)
6640 insn_unit
= required_unit
;
6642 case IA64_TYPE_X
: insn_unit
= IA64_UNIT_L
; break;
6643 case IA64_TYPE_I
: insn_unit
= IA64_UNIT_I
; break;
6644 case IA64_TYPE_M
: insn_unit
= IA64_UNIT_M
; break;
6645 case IA64_TYPE_B
: insn_unit
= IA64_UNIT_B
; break;
6646 case IA64_TYPE_F
: insn_unit
= IA64_UNIT_F
; break;
6651 if (insn_unit
!= required_unit
)
6652 continue; /* Try next slot. */
6654 /* Now is a good time to fix up the labels for this insn. */
6656 for (lfix
= md
.slot
[curr
].label_fixups
; lfix
; lfix
= lfix
->next
)
6658 S_SET_VALUE (lfix
->sym
, frag_now_fix () - 16);
6659 symbol_set_frag (lfix
->sym
, frag_now
);
6660 mark_label
|= lfix
->dw2_mark_labels
;
6662 for (lfix
= md
.slot
[curr
].tag_fixups
; lfix
; lfix
= lfix
->next
)
6664 S_SET_VALUE (lfix
->sym
, frag_now_fix () - 16 + i
);
6665 symbol_set_frag (lfix
->sym
, frag_now
);
6668 if (debug_type
== DEBUG_DWARF2
6669 || md
.slot
[curr
].loc_directive_seen
6672 bfd_vma addr
= frag_now
->fr_address
+ frag_now_fix () - 16 + i
;
6674 md
.slot
[curr
].loc_directive_seen
= 0;
6676 md
.slot
[curr
].debug_line
.flags
|= DWARF2_FLAG_BASIC_BLOCK
;
6678 dwarf2_gen_line_info (addr
, &md
.slot
[curr
].debug_line
);
6681 build_insn (md
.slot
+ curr
, insn
+ i
);
6683 ptr
= md
.slot
[curr
].unwind_record
;
6686 /* Set slot numbers for all remaining unwind records belonging to the
6687 current insn. There can not be any prologue/body unwind records
6689 for (; ptr
!= end_ptr
; ptr
= ptr
->next
)
6691 ptr
->slot_number
= (unsigned long) f
+ i
;
6692 ptr
->slot_frag
= frag_now
;
6694 md
.slot
[curr
].unwind_record
= NULL
;
6697 if (required_unit
== IA64_UNIT_L
)
6700 /* skip one slot for long/X-unit instructions */
6703 --md
.num_slots_in_use
;
6706 for (j
= 0; j
< md
.slot
[curr
].num_fixups
; ++j
)
6708 ifix
= md
.slot
[curr
].fixup
+ j
;
6709 fix
= fix_new_exp (frag_now
, frag_now_fix () - 16 + i
, 8,
6710 &ifix
->expr
, ifix
->is_pcrel
, ifix
->code
);
6711 fix
->tc_fix_data
.opnd
= ifix
->opnd
;
6712 fix
->fx_file
= md
.slot
[curr
].src_file
;
6713 fix
->fx_line
= md
.slot
[curr
].src_line
;
6716 end_of_insn_group
= md
.slot
[curr
].end_of_insn_group
;
6719 ia64_free_opcode (md
.slot
[curr
].idesc
);
6720 memset (md
.slot
+ curr
, 0, sizeof (md
.slot
[curr
]));
6721 md
.slot
[curr
].user_template
= -1;
6723 if (manual_bundling_off
)
6725 manual_bundling
= 0;
6728 curr
= (curr
+ 1) % NUM_SLOTS
;
6729 idesc
= md
.slot
[curr
].idesc
;
6732 /* A user template was specified, but the first following instruction did
6733 not fit. This can happen with or without manual bundling. */
6734 if (md
.num_slots_in_use
> 0 && last_slot
< 0)
6736 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6737 _("`%s' does not fit into %s template"),
6738 idesc
->name
, ia64_templ_desc
[template].name
);
6739 /* Drop first insn so we don't livelock. */
6740 --md
.num_slots_in_use
;
6741 know (curr
== first
);
6742 ia64_free_opcode (md
.slot
[curr
].idesc
);
6743 memset (md
.slot
+ curr
, 0, sizeof (md
.slot
[curr
]));
6744 md
.slot
[curr
].user_template
= -1;
6746 else if (manual_bundling
> 0)
6748 if (md
.num_slots_in_use
> 0)
6751 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6752 _("`%s' does not fit into bundle"), idesc
->name
);
6759 else if (last_slot
== 0)
6760 where
= "slots 2 or 3";
6763 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6764 _("`%s' can't go in %s of %s template"),
6765 idesc
->name
, where
, ia64_templ_desc
[template].name
);
6769 as_bad_where (md
.slot
[curr
].src_file
, md
.slot
[curr
].src_line
,
6770 _("Missing '}' at end of file"));
6773 know (md
.num_slots_in_use
< NUM_SLOTS
);
6775 t0
= end_of_insn_group
| (template << 1) | (insn
[0] << 5) | (insn
[1] << 46);
6776 t1
= ((insn
[1] >> 18) & 0x7fffff) | (insn
[2] << 23);
6778 number_to_chars_littleendian (f
+ 0, t0
, 8);
6779 number_to_chars_littleendian (f
+ 8, t1
, 8);
6783 md_parse_option (int c
, char *arg
)
6788 /* Switches from the Intel assembler. */
6790 if (strcmp (arg
, "ilp64") == 0
6791 || strcmp (arg
, "lp64") == 0
6792 || strcmp (arg
, "p64") == 0)
6794 md
.flags
|= EF_IA_64_ABI64
;
6796 else if (strcmp (arg
, "ilp32") == 0)
6798 md
.flags
&= ~EF_IA_64_ABI64
;
6800 else if (strcmp (arg
, "le") == 0)
6802 md
.flags
&= ~EF_IA_64_BE
;
6803 default_big_endian
= 0;
6805 else if (strcmp (arg
, "be") == 0)
6807 md
.flags
|= EF_IA_64_BE
;
6808 default_big_endian
= 1;
6810 else if (strncmp (arg
, "unwind-check=", 13) == 0)
6813 if (strcmp (arg
, "warning") == 0)
6814 md
.unwind_check
= unwind_check_warning
;
6815 else if (strcmp (arg
, "error") == 0)
6816 md
.unwind_check
= unwind_check_error
;
6820 else if (strncmp (arg
, "hint.b=", 7) == 0)
6823 if (strcmp (arg
, "ok") == 0)
6824 md
.hint_b
= hint_b_ok
;
6825 else if (strcmp (arg
, "warning") == 0)
6826 md
.hint_b
= hint_b_warning
;
6827 else if (strcmp (arg
, "error") == 0)
6828 md
.hint_b
= hint_b_error
;
6832 else if (strncmp (arg
, "tune=", 5) == 0)
6835 if (strcmp (arg
, "itanium1") == 0)
6837 else if (strcmp (arg
, "itanium2") == 0)
6847 if (strcmp (arg
, "so") == 0)
6849 /* Suppress signon message. */
6851 else if (strcmp (arg
, "pi") == 0)
6853 /* Reject privileged instructions. FIXME */
6855 else if (strcmp (arg
, "us") == 0)
6857 /* Allow union of signed and unsigned range. FIXME */
6859 else if (strcmp (arg
, "close_fcalls") == 0)
6861 /* Do not resolve global function calls. */
6868 /* temp[="prefix"] Insert temporary labels into the object file
6869 symbol table prefixed by "prefix".
6870 Default prefix is ":temp:".
6875 /* indirect=<tgt> Assume unannotated indirect branches behavior
6876 according to <tgt> --
6877 exit: branch out from the current context (default)
6878 labels: all labels in context may be branch targets
6880 if (strncmp (arg
, "indirect=", 9) != 0)
6885 /* -X conflicts with an ignored option, use -x instead */
6887 if (!arg
|| strcmp (arg
, "explicit") == 0)
6889 /* set default mode to explicit */
6890 md
.default_explicit_mode
= 1;
6893 else if (strcmp (arg
, "auto") == 0)
6895 md
.default_explicit_mode
= 0;
6897 else if (strcmp (arg
, "none") == 0)
6901 else if (strcmp (arg
, "debug") == 0)
6905 else if (strcmp (arg
, "debugx") == 0)
6907 md
.default_explicit_mode
= 1;
6910 else if (strcmp (arg
, "debugn") == 0)
6917 as_bad (_("Unrecognized option '-x%s'"), arg
);
6922 /* nops Print nops statistics. */
6925 /* GNU specific switches for gcc. */
6926 case OPTION_MCONSTANT_GP
:
6927 md
.flags
|= EF_IA_64_CONS_GP
;
6930 case OPTION_MAUTO_PIC
:
6931 md
.flags
|= EF_IA_64_NOFUNCDESC_CONS_GP
;
6942 md_show_usage (FILE *stream
)
6946 --mconstant-gp mark output file as using the constant-GP model\n\
6947 (sets ELF header flag EF_IA_64_CONS_GP)\n\
6948 --mauto-pic mark output file as using the constant-GP model\n\
6949 without function descriptors (sets ELF header flag\n\
6950 EF_IA_64_NOFUNCDESC_CONS_GP)\n\
6951 -milp32|-milp64|-mlp64|-mp64 select data model (default -mlp64)\n\
6952 -mle | -mbe select little- or big-endian byte order (default -mle)\n\
6953 -mtune=[itanium1|itanium2]\n\
6954 tune for a specific CPU (default -mtune=itanium2)\n\
6955 -munwind-check=[warning|error]\n\
6956 unwind directive check (default -munwind-check=warning)\n\
6957 -mhint.b=[ok|warning|error]\n\
6958 hint.b check (default -mhint.b=error)\n\
6959 -x | -xexplicit turn on dependency violation checking\n\
6960 -xauto automagically remove dependency violations (default)\n\
6961 -xnone turn off dependency violation checking\n\
6962 -xdebug debug dependency violation checker\n\
6963 -xdebugn debug dependency violation checker but turn off\n\
6964 dependency violation checking\n\
6965 -xdebugx debug dependency violation checker and turn on\n\
6966 dependency violation checking\n"),
6971 ia64_after_parse_args (void)
6973 if (debug_type
== DEBUG_STABS
)
6974 as_fatal (_("--gstabs is not supported for ia64"));
6977 /* Return true if TYPE fits in TEMPL at SLOT. */
6980 match (int templ
, int type
, int slot
)
6982 enum ia64_unit unit
;
6985 unit
= ia64_templ_desc
[templ
].exec_unit
[slot
];
6988 case IA64_TYPE_DYN
: result
= 1; break; /* for nop and break */
6990 result
= (unit
== IA64_UNIT_I
|| unit
== IA64_UNIT_M
);
6992 case IA64_TYPE_X
: result
= (unit
== IA64_UNIT_L
); break;
6993 case IA64_TYPE_I
: result
= (unit
== IA64_UNIT_I
); break;
6994 case IA64_TYPE_M
: result
= (unit
== IA64_UNIT_M
); break;
6995 case IA64_TYPE_B
: result
= (unit
== IA64_UNIT_B
); break;
6996 case IA64_TYPE_F
: result
= (unit
== IA64_UNIT_F
); break;
6997 default: result
= 0; break;
7002 /* For Itanium 1, add a bit of extra goodness if a nop of type F or B would fit
7003 in TEMPL at SLOT. For Itanium 2, add a bit of extra goodness if a nop of
7004 type M or I would fit in TEMPL at SLOT. */
7007 extra_goodness (int templ
, int slot
)
7012 if (slot
== 1 && match (templ
, IA64_TYPE_F
, slot
))
7014 else if (slot
== 2 && match (templ
, IA64_TYPE_B
, slot
))
7020 if (match (templ
, IA64_TYPE_M
, slot
)
7021 || match (templ
, IA64_TYPE_I
, slot
))
7022 /* Favor M- and I-unit NOPs. We definitely want to avoid
7023 F-unit and B-unit may cause split-issue or less-than-optimal
7024 branch-prediction. */
7035 /* This function is called once, at assembler startup time. It sets
7036 up all the tables, etc. that the MD part of the assembler will need
7037 that can be determined before arguments are parsed. */
7041 int i
, j
, k
, t
, goodness
, best
, ok
;
7046 md
.explicit_mode
= md
.default_explicit_mode
;
7048 bfd_set_section_alignment (stdoutput
, text_section
, 4);
7050 /* Make sure function pointers get initialized. */
7051 target_big_endian
= -1;
7052 dot_byteorder (default_big_endian
);
7054 alias_hash
= hash_new ();
7055 alias_name_hash
= hash_new ();
7056 secalias_hash
= hash_new ();
7057 secalias_name_hash
= hash_new ();
7059 pseudo_func
[FUNC_DTP_MODULE
].u
.sym
=
7060 symbol_new (".<dtpmod>", undefined_section
, FUNC_DTP_MODULE
,
7061 &zero_address_frag
);
7063 pseudo_func
[FUNC_DTP_RELATIVE
].u
.sym
=
7064 symbol_new (".<dtprel>", undefined_section
, FUNC_DTP_RELATIVE
,
7065 &zero_address_frag
);
7067 pseudo_func
[FUNC_FPTR_RELATIVE
].u
.sym
=
7068 symbol_new (".<fptr>", undefined_section
, FUNC_FPTR_RELATIVE
,
7069 &zero_address_frag
);
7071 pseudo_func
[FUNC_GP_RELATIVE
].u
.sym
=
7072 symbol_new (".<gprel>", undefined_section
, FUNC_GP_RELATIVE
,
7073 &zero_address_frag
);
7075 pseudo_func
[FUNC_LT_RELATIVE
].u
.sym
=
7076 symbol_new (".<ltoff>", undefined_section
, FUNC_LT_RELATIVE
,
7077 &zero_address_frag
);
7079 pseudo_func
[FUNC_LT_RELATIVE_X
].u
.sym
=
7080 symbol_new (".<ltoffx>", undefined_section
, FUNC_LT_RELATIVE_X
,
7081 &zero_address_frag
);
7083 pseudo_func
[FUNC_PC_RELATIVE
].u
.sym
=
7084 symbol_new (".<pcrel>", undefined_section
, FUNC_PC_RELATIVE
,
7085 &zero_address_frag
);
7087 pseudo_func
[FUNC_PLT_RELATIVE
].u
.sym
=
7088 symbol_new (".<pltoff>", undefined_section
, FUNC_PLT_RELATIVE
,
7089 &zero_address_frag
);
7091 pseudo_func
[FUNC_SEC_RELATIVE
].u
.sym
=
7092 symbol_new (".<secrel>", undefined_section
, FUNC_SEC_RELATIVE
,
7093 &zero_address_frag
);
7095 pseudo_func
[FUNC_SEG_RELATIVE
].u
.sym
=
7096 symbol_new (".<segrel>", undefined_section
, FUNC_SEG_RELATIVE
,
7097 &zero_address_frag
);
7099 pseudo_func
[FUNC_TP_RELATIVE
].u
.sym
=
7100 symbol_new (".<tprel>", undefined_section
, FUNC_TP_RELATIVE
,
7101 &zero_address_frag
);
7103 pseudo_func
[FUNC_LTV_RELATIVE
].u
.sym
=
7104 symbol_new (".<ltv>", undefined_section
, FUNC_LTV_RELATIVE
,
7105 &zero_address_frag
);
7107 pseudo_func
[FUNC_LT_FPTR_RELATIVE
].u
.sym
=
7108 symbol_new (".<ltoff.fptr>", undefined_section
, FUNC_LT_FPTR_RELATIVE
,
7109 &zero_address_frag
);
7111 pseudo_func
[FUNC_LT_DTP_MODULE
].u
.sym
=
7112 symbol_new (".<ltoff.dtpmod>", undefined_section
, FUNC_LT_DTP_MODULE
,
7113 &zero_address_frag
);
7115 pseudo_func
[FUNC_LT_DTP_RELATIVE
].u
.sym
=
7116 symbol_new (".<ltoff.dptrel>", undefined_section
, FUNC_LT_DTP_RELATIVE
,
7117 &zero_address_frag
);
7119 pseudo_func
[FUNC_LT_TP_RELATIVE
].u
.sym
=
7120 symbol_new (".<ltoff.tprel>", undefined_section
, FUNC_LT_TP_RELATIVE
,
7121 &zero_address_frag
);
7123 pseudo_func
[FUNC_IPLT_RELOC
].u
.sym
=
7124 symbol_new (".<iplt>", undefined_section
, FUNC_IPLT_RELOC
,
7125 &zero_address_frag
);
7127 if (md
.tune
!= itanium1
)
7129 /* Convert MFI NOPs bundles into MMI NOPs bundles. */
7131 le_nop_stop
[0] = 0x9;
7134 /* Compute the table of best templates. We compute goodness as a
7135 base 4 value, in which each match counts for 3. Match-failures
7136 result in NOPs and we use extra_goodness() to pick the execution
7137 units that are best suited for issuing the NOP. */
7138 for (i
= 0; i
< IA64_NUM_TYPES
; ++i
)
7139 for (j
= 0; j
< IA64_NUM_TYPES
; ++j
)
7140 for (k
= 0; k
< IA64_NUM_TYPES
; ++k
)
7143 for (t
= 0; t
< NELEMS (ia64_templ_desc
); ++t
)
7146 if (match (t
, i
, 0))
7148 if (match (t
, j
, 1))
7150 if ((t
== 2 && j
== IA64_TYPE_X
) || match (t
, k
, 2))
7151 goodness
= 3 + 3 + 3;
7153 goodness
= 3 + 3 + extra_goodness (t
, 2);
7155 else if (match (t
, j
, 2))
7156 goodness
= 3 + 3 + extra_goodness (t
, 1);
7160 goodness
+= extra_goodness (t
, 1);
7161 goodness
+= extra_goodness (t
, 2);
7164 else if (match (t
, i
, 1))
7166 if ((t
== 2 && i
== IA64_TYPE_X
) || match (t
, j
, 2))
7169 goodness
= 3 + extra_goodness (t
, 2);
7171 else if (match (t
, i
, 2))
7172 goodness
= 3 + extra_goodness (t
, 1);
7174 if (goodness
> best
)
7177 best_template
[i
][j
][k
] = t
;
7182 #ifdef DEBUG_TEMPLATES
7183 /* For debugging changes to the best_template calculations. We don't care
7184 about combinations with invalid instructions, so start the loops at 1. */
7185 for (i
= 0; i
< IA64_NUM_TYPES
; ++i
)
7186 for (j
= 0; j
< IA64_NUM_TYPES
; ++j
)
7187 for (k
= 0; k
< IA64_NUM_TYPES
; ++k
)
7189 char type_letter
[IA64_NUM_TYPES
] = { 'n', 'a', 'i', 'm', 'b', 'f',
7191 fprintf (stderr
, "%c%c%c %s\n", type_letter
[i
], type_letter
[j
],
7193 ia64_templ_desc
[best_template
[i
][j
][k
]].name
);
7197 for (i
= 0; i
< NUM_SLOTS
; ++i
)
7198 md
.slot
[i
].user_template
= -1;
7200 md
.pseudo_hash
= hash_new ();
7201 for (i
= 0; i
< NELEMS (pseudo_opcode
); ++i
)
7203 err
= hash_insert (md
.pseudo_hash
, pseudo_opcode
[i
].name
,
7204 (void *) (pseudo_opcode
+ i
));
7206 as_fatal (_("ia64.md_begin: can't hash `%s': %s"),
7207 pseudo_opcode
[i
].name
, err
);
7210 md
.reg_hash
= hash_new ();
7211 md
.dynreg_hash
= hash_new ();
7212 md
.const_hash
= hash_new ();
7213 md
.entry_hash
= hash_new ();
7215 /* general registers: */
7216 declare_register_set ("r", 128, REG_GR
);
7217 declare_register ("gp", REG_GR
+ 1);
7218 declare_register ("sp", REG_GR
+ 12);
7219 declare_register ("tp", REG_GR
+ 13);
7220 declare_register_set ("ret", 4, REG_GR
+ 8);
7222 /* floating point registers: */
7223 declare_register_set ("f", 128, REG_FR
);
7224 declare_register_set ("farg", 8, REG_FR
+ 8);
7225 declare_register_set ("fret", 8, REG_FR
+ 8);
7227 /* branch registers: */
7228 declare_register_set ("b", 8, REG_BR
);
7229 declare_register ("rp", REG_BR
+ 0);
7231 /* predicate registers: */
7232 declare_register_set ("p", 64, REG_P
);
7233 declare_register ("pr", REG_PR
);
7234 declare_register ("pr.rot", REG_PR_ROT
);
7236 /* application registers: */
7237 declare_register_set ("ar", 128, REG_AR
);
7238 for (i
= 0; i
< NELEMS (ar
); ++i
)
7239 declare_register (ar
[i
].name
, REG_AR
+ ar
[i
].regnum
);
7241 /* control registers: */
7242 declare_register_set ("cr", 128, REG_CR
);
7243 for (i
= 0; i
< NELEMS (cr
); ++i
)
7244 declare_register (cr
[i
].name
, REG_CR
+ cr
[i
].regnum
);
7246 declare_register ("ip", REG_IP
);
7247 declare_register ("cfm", REG_CFM
);
7248 declare_register ("psr", REG_PSR
);
7249 declare_register ("psr.l", REG_PSR_L
);
7250 declare_register ("psr.um", REG_PSR_UM
);
7252 for (i
= 0; i
< NELEMS (indirect_reg
); ++i
)
7254 unsigned int regnum
= indirect_reg
[i
].regnum
;
7256 md
.indregsym
[regnum
- IND_CPUID
] = declare_register (indirect_reg
[i
].name
, regnum
);
7259 /* pseudo-registers used to specify unwind info: */
7260 declare_register ("psp", REG_PSP
);
7262 for (i
= 0; i
< NELEMS (const_bits
); ++i
)
7264 err
= hash_insert (md
.const_hash
, const_bits
[i
].name
,
7265 (void *) (const_bits
+ i
));
7267 as_fatal (_("Inserting \"%s\" into constant hash table failed: %s"),
7271 /* Set the architecture and machine depending on defaults and command line
7273 if (md
.flags
& EF_IA_64_ABI64
)
7274 ok
= bfd_set_arch_mach (stdoutput
, bfd_arch_ia64
, bfd_mach_ia64_elf64
);
7276 ok
= bfd_set_arch_mach (stdoutput
, bfd_arch_ia64
, bfd_mach_ia64_elf32
);
7279 as_warn (_("Could not set architecture and machine"));
7281 /* Set the pointer size and pointer shift size depending on md.flags */
7283 if (md
.flags
& EF_IA_64_ABI64
)
7285 md
.pointer_size
= 8; /* pointers are 8 bytes */
7286 md
.pointer_size_shift
= 3; /* alignment is 8 bytes = 2^2 */
7290 md
.pointer_size
= 4; /* pointers are 4 bytes */
7291 md
.pointer_size_shift
= 2; /* alignment is 4 bytes = 2^2 */
7294 md
.mem_offset
.hint
= 0;
7297 md
.entry_labels
= NULL
;
7300 /* Set the default options in md. Cannot do this in md_begin because
7301 that is called after md_parse_option which is where we set the
7302 options in md based on command line options. */
7305 ia64_init (int argc ATTRIBUTE_UNUSED
, char **argv ATTRIBUTE_UNUSED
)
7307 md
.flags
= MD_FLAGS_DEFAULT
;
7309 /* Don't turn on dependency checking for VMS, doesn't work. */
7312 /* FIXME: We should change it to unwind_check_error someday. */
7313 md
.unwind_check
= unwind_check_warning
;
7314 md
.hint_b
= hint_b_error
;
7318 /* Return a string for the target object file format. */
7321 ia64_target_format (void)
7323 if (OUTPUT_FLAVOR
== bfd_target_elf_flavour
)
7325 if (md
.flags
& EF_IA_64_BE
)
7327 if (md
.flags
& EF_IA_64_ABI64
)
7328 #if defined(TE_AIX50)
7329 return "elf64-ia64-aix-big";
7330 #elif defined(TE_HPUX)
7331 return "elf64-ia64-hpux-big";
7333 return "elf64-ia64-big";
7336 #if defined(TE_AIX50)
7337 return "elf32-ia64-aix-big";
7338 #elif defined(TE_HPUX)
7339 return "elf32-ia64-hpux-big";
7341 return "elf32-ia64-big";
7346 if (md
.flags
& EF_IA_64_ABI64
)
7347 #if defined (TE_AIX50)
7348 return "elf64-ia64-aix-little";
7349 #elif defined (TE_VMS)
7351 md
.flags
|= EF_IA_64_ARCHVER_1
;
7352 return "elf64-ia64-vms";
7355 return "elf64-ia64-little";
7359 return "elf32-ia64-aix-little";
7361 return "elf32-ia64-little";
7366 return "unknown-format";
7370 ia64_end_of_source (void)
7372 /* terminate insn group upon reaching end of file: */
7373 insn_group_break (1, 0, 0);
7375 /* emits slots we haven't written yet: */
7376 ia64_flush_insns ();
7378 bfd_set_private_flags (stdoutput
, md
.flags
);
7380 md
.mem_offset
.hint
= 0;
7384 ia64_start_line (void)
7389 /* Make sure we don't reference input_line_pointer[-1] when that's
7395 if (md
.qp
.X_op
== O_register
)
7396 as_bad (_("qualifying predicate not followed by instruction"));
7397 md
.qp
.X_op
= O_absent
;
7399 if (ignore_input ())
7402 if (input_line_pointer
[0] == ';' && input_line_pointer
[-1] == ';')
7404 if (md
.detect_dv
&& !md
.explicit_mode
)
7411 as_warn (_("Explicit stops are ignored in auto mode"));
7415 insn_group_break (1, 0, 0);
7417 else if (input_line_pointer
[-1] == '{')
7419 if (md
.manual_bundling
)
7420 as_warn (_("Found '{' when manual bundling is already turned on"));
7422 CURR_SLOT
.manual_bundling_on
= 1;
7423 md
.manual_bundling
= 1;
7425 /* Bundling is only acceptable in explicit mode
7426 or when in default automatic mode. */
7427 if (md
.detect_dv
&& !md
.explicit_mode
)
7429 if (!md
.mode_explicitly_set
7430 && !md
.default_explicit_mode
)
7433 as_warn (_("Found '{' after explicit switch to automatic mode"));
7436 else if (input_line_pointer
[-1] == '}')
7438 if (!md
.manual_bundling
)
7439 as_warn (_("Found '}' when manual bundling is off"));
7441 PREV_SLOT
.manual_bundling_off
= 1;
7442 md
.manual_bundling
= 0;
7444 /* switch back to automatic mode, if applicable */
7447 && !md
.mode_explicitly_set
7448 && !md
.default_explicit_mode
)
7453 /* This is a hook for ia64_frob_label, so that it can distinguish tags from
7455 static int defining_tag
= 0;
7458 ia64_unrecognized_line (int ch
)
7463 expression_and_evaluate (&md
.qp
);
7464 if (*input_line_pointer
++ != ')')
7466 as_bad (_("Expected ')'"));
7469 if (md
.qp
.X_op
!= O_register
)
7471 as_bad (_("Qualifying predicate expected"));
7474 if (md
.qp
.X_add_number
< REG_P
|| md
.qp
.X_add_number
>= REG_P
+ 64)
7476 as_bad (_("Predicate register expected"));
7488 if (md
.qp
.X_op
== O_register
)
7490 as_bad (_("Tag must come before qualifying predicate."));
7494 /* This implements just enough of read_a_source_file in read.c to
7495 recognize labels. */
7496 if (is_name_beginner (*input_line_pointer
))
7498 s
= input_line_pointer
;
7499 c
= get_symbol_end ();
7501 else if (LOCAL_LABELS_FB
7502 && ISDIGIT (*input_line_pointer
))
7505 while (ISDIGIT (*input_line_pointer
))
7506 temp
= (temp
* 10) + *input_line_pointer
++ - '0';
7507 fb_label_instance_inc (temp
);
7508 s
= fb_label_name (temp
, 0);
7509 c
= *input_line_pointer
;
7518 /* Put ':' back for error messages' sake. */
7519 *input_line_pointer
++ = ':';
7520 as_bad (_("Expected ':'"));
7527 /* Put ':' back for error messages' sake. */
7528 *input_line_pointer
++ = ':';
7529 if (*input_line_pointer
++ != ']')
7531 as_bad (_("Expected ']'"));
7536 as_bad (_("Tag name expected"));
7546 /* Not a valid line. */
7551 ia64_frob_label (struct symbol
*sym
)
7553 struct label_fix
*fix
;
7555 /* Tags need special handling since they are not bundle breaks like
7559 fix
= obstack_alloc (¬es
, sizeof (*fix
));
7561 fix
->next
= CURR_SLOT
.tag_fixups
;
7562 fix
->dw2_mark_labels
= FALSE
;
7563 CURR_SLOT
.tag_fixups
= fix
;
7568 if (bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
)
7570 md
.last_text_seg
= now_seg
;
7571 fix
= obstack_alloc (¬es
, sizeof (*fix
));
7573 fix
->next
= CURR_SLOT
.label_fixups
;
7574 fix
->dw2_mark_labels
= dwarf2_loc_mark_labels
;
7575 CURR_SLOT
.label_fixups
= fix
;
7577 /* Keep track of how many code entry points we've seen. */
7578 if (md
.path
== md
.maxpaths
)
7581 md
.entry_labels
= (const char **)
7582 xrealloc ((void *) md
.entry_labels
,
7583 md
.maxpaths
* sizeof (char *));
7585 md
.entry_labels
[md
.path
++] = S_GET_NAME (sym
);
7590 /* The HP-UX linker will give unresolved symbol errors for symbols
7591 that are declared but unused. This routine removes declared,
7592 unused symbols from an object. */
7594 ia64_frob_symbol (struct symbol
*sym
)
7596 if ((S_GET_SEGMENT (sym
) == &bfd_und_section
&& ! symbol_used_p (sym
) &&
7597 ELF_ST_VISIBILITY (S_GET_OTHER (sym
)) == STV_DEFAULT
)
7598 || (S_GET_SEGMENT (sym
) == &bfd_abs_section
7599 && ! S_IS_EXTERNAL (sym
)))
7606 ia64_flush_pending_output (void)
7608 if (!md
.keep_pending_output
7609 && bfd_get_section_flags (stdoutput
, now_seg
) & SEC_CODE
)
7611 /* ??? This causes many unnecessary stop bits to be emitted.
7612 Unfortunately, it isn't clear if it is safe to remove this. */
7613 insn_group_break (1, 0, 0);
7614 ia64_flush_insns ();
7618 /* Do ia64-specific expression optimization. All that's done here is
7619 to transform index expressions that are either due to the indexing
7620 of rotating registers or due to the indexing of indirect register
7623 ia64_optimize_expr (expressionS
*l
, operatorT op
, expressionS
*r
)
7627 resolve_expression (l
);
7628 if (l
->X_op
== O_register
)
7630 unsigned num_regs
= l
->X_add_number
>> 16;
7632 resolve_expression (r
);
7635 /* Left side is a .rotX-allocated register. */
7636 if (r
->X_op
!= O_constant
)
7638 as_bad (_("Rotating register index must be a non-negative constant"));
7639 r
->X_add_number
= 0;
7641 else if ((valueT
) r
->X_add_number
>= num_regs
)
7643 as_bad (_("Index out of range 0..%u"), num_regs
- 1);
7644 r
->X_add_number
= 0;
7646 l
->X_add_number
= (l
->X_add_number
& 0xffff) + r
->X_add_number
;
7649 else if (l
->X_add_number
>= IND_CPUID
&& l
->X_add_number
<= IND_RR
)
7651 if (r
->X_op
!= O_register
7652 || r
->X_add_number
< REG_GR
7653 || r
->X_add_number
> REG_GR
+ 127)
7655 as_bad (_("Indirect register index must be a general register"));
7656 r
->X_add_number
= REG_GR
;
7659 l
->X_op_symbol
= md
.indregsym
[l
->X_add_number
- IND_CPUID
];
7660 l
->X_add_number
= r
->X_add_number
;
7664 as_bad (_("Index can only be applied to rotating or indirect registers"));
7665 /* Fall back to some register use of which has as little as possible
7666 side effects, to minimize subsequent error messages. */
7667 l
->X_op
= O_register
;
7668 l
->X_add_number
= REG_GR
+ 3;
7673 ia64_parse_name (char *name
, expressionS
*e
, char *nextcharP
)
7675 struct const_desc
*cdesc
;
7676 struct dynreg
*dr
= 0;
7683 enum pseudo_type pseudo_type
= PSEUDO_FUNC_NONE
;
7685 /* Find what relocation pseudo-function we're dealing with. */
7686 for (idx
= 0; idx
< NELEMS (pseudo_func
); ++idx
)
7687 if (pseudo_func
[idx
].name
7688 && pseudo_func
[idx
].name
[0] == name
[1]
7689 && strcmp (pseudo_func
[idx
].name
+ 1, name
+ 2) == 0)
7691 pseudo_type
= pseudo_func
[idx
].type
;
7694 switch (pseudo_type
)
7696 case PSEUDO_FUNC_RELOC
:
7697 end
= input_line_pointer
;
7698 if (*nextcharP
!= '(')
7700 as_bad (_("Expected '('"));
7704 ++input_line_pointer
;
7706 if (*input_line_pointer
!= ')')
7708 as_bad (_("Missing ')'"));
7712 ++input_line_pointer
;
7713 if (e
->X_op
!= O_symbol
)
7715 if (e
->X_op
!= O_pseudo_fixup
)
7717 as_bad (_("Not a symbolic expression"));
7720 if (idx
!= FUNC_LT_RELATIVE
)
7722 as_bad (_("Illegal combination of relocation functions"));
7725 switch (S_GET_VALUE (e
->X_op_symbol
))
7727 case FUNC_FPTR_RELATIVE
:
7728 idx
= FUNC_LT_FPTR_RELATIVE
; break;
7729 case FUNC_DTP_MODULE
:
7730 idx
= FUNC_LT_DTP_MODULE
; break;
7731 case FUNC_DTP_RELATIVE
:
7732 idx
= FUNC_LT_DTP_RELATIVE
; break;
7733 case FUNC_TP_RELATIVE
:
7734 idx
= FUNC_LT_TP_RELATIVE
; break;
7736 as_bad (_("Illegal combination of relocation functions"));
7740 /* Make sure gas doesn't get rid of local symbols that are used
7742 e
->X_op
= O_pseudo_fixup
;
7743 e
->X_op_symbol
= pseudo_func
[idx
].u
.sym
;
7745 *nextcharP
= *input_line_pointer
;
7748 case PSEUDO_FUNC_CONST
:
7749 e
->X_op
= O_constant
;
7750 e
->X_add_number
= pseudo_func
[idx
].u
.ival
;
7753 case PSEUDO_FUNC_REG
:
7754 e
->X_op
= O_register
;
7755 e
->X_add_number
= pseudo_func
[idx
].u
.ival
;
7764 /* first see if NAME is a known register name: */
7765 sym
= hash_find (md
.reg_hash
, name
);
7768 e
->X_op
= O_register
;
7769 e
->X_add_number
= S_GET_VALUE (sym
);
7773 cdesc
= hash_find (md
.const_hash
, name
);
7776 e
->X_op
= O_constant
;
7777 e
->X_add_number
= cdesc
->value
;
7781 /* check for inN, locN, or outN: */
7786 if (name
[1] == 'n' && ISDIGIT (name
[2]))
7794 if (name
[1] == 'o' && name
[2] == 'c' && ISDIGIT (name
[3]))
7802 if (name
[1] == 'u' && name
[2] == 't' && ISDIGIT (name
[3]))
7813 /* Ignore register numbers with leading zeroes, except zero itself. */
7814 if (dr
&& (name
[idx
] != '0' || name
[idx
+ 1] == '\0'))
7816 unsigned long regnum
;
7818 /* The name is inN, locN, or outN; parse the register number. */
7819 regnum
= strtoul (name
+ idx
, &end
, 10);
7820 if (end
> name
+ idx
&& *end
== '\0' && regnum
< 96)
7822 if (regnum
>= dr
->num_regs
)
7825 as_bad (_("No current frame"));
7827 as_bad (_("Register number out of range 0..%u"),
7831 e
->X_op
= O_register
;
7832 e
->X_add_number
= dr
->base
+ regnum
;
7837 end
= alloca (strlen (name
) + 1);
7839 name
= ia64_canonicalize_symbol_name (end
);
7840 if ((dr
= hash_find (md
.dynreg_hash
, name
)))
7842 /* We've got ourselves the name of a rotating register set.
7843 Store the base register number in the low 16 bits of
7844 X_add_number and the size of the register set in the top 16
7846 e
->X_op
= O_register
;
7847 e
->X_add_number
= dr
->base
| (dr
->num_regs
<< 16);
7853 /* Remove the '#' suffix that indicates a symbol as opposed to a register. */
7856 ia64_canonicalize_symbol_name (char *name
)
7858 size_t len
= strlen (name
), full
= len
;
7860 while (len
> 0 && name
[len
- 1] == '#')
7865 as_bad (_("Standalone `#' is illegal"));
7867 else if (len
< full
- 1)
7868 as_warn (_("Redundant `#' suffix operators"));
7873 /* Return true if idesc is a conditional branch instruction. This excludes
7874 the modulo scheduled branches, and br.ia. Mod-sched branches are excluded
7875 because they always read/write resources regardless of the value of the
7876 qualifying predicate. br.ia must always use p0, and hence is always
7877 taken. Thus this function returns true for branches which can fall
7878 through, and which use no resources if they do fall through. */
7881 is_conditional_branch (struct ia64_opcode
*idesc
)
7883 /* br is a conditional branch. Everything that starts with br. except
7884 br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
7885 Everything that starts with brl is a conditional branch. */
7886 return (idesc
->name
[0] == 'b' && idesc
->name
[1] == 'r'
7887 && (idesc
->name
[2] == '\0'
7888 || (idesc
->name
[2] == '.' && idesc
->name
[3] != 'i'
7889 && idesc
->name
[3] != 'c' && idesc
->name
[3] != 'w')
7890 || idesc
->name
[2] == 'l'
7891 /* br.cond, br.call, br.clr */
7892 || (idesc
->name
[2] == '.' && idesc
->name
[3] == 'c'
7893 && (idesc
->name
[4] == 'a' || idesc
->name
[4] == 'o'
7894 || (idesc
->name
[4] == 'l' && idesc
->name
[5] == 'r')))));
7897 /* Return whether the given opcode is a taken branch. If there's any doubt,
7901 is_taken_branch (struct ia64_opcode
*idesc
)
7903 return ((is_conditional_branch (idesc
) && CURR_SLOT
.qp_regno
== 0)
7904 || strncmp (idesc
->name
, "br.ia", 5) == 0);
7907 /* Return whether the given opcode is an interruption or rfi. If there's any
7908 doubt, returns zero. */
7911 is_interruption_or_rfi (struct ia64_opcode
*idesc
)
7913 if (strcmp (idesc
->name
, "rfi") == 0)
7918 /* Returns the index of the given dependency in the opcode's list of chks, or
7919 -1 if there is no dependency. */
7922 depends_on (int depind
, struct ia64_opcode
*idesc
)
7925 const struct ia64_opcode_dependency
*dep
= idesc
->dependencies
;
7926 for (i
= 0; i
< dep
->nchks
; i
++)
7928 if (depind
== DEP (dep
->chks
[i
]))
7934 /* Determine a set of specific resources used for a particular resource
7935 class. Returns the number of specific resources identified For those
7936 cases which are not determinable statically, the resource returned is
7939 Meanings of value in 'NOTE':
7940 1) only read/write when the register number is explicitly encoded in the
7942 2) only read CFM when accessing a rotating GR, FR, or PR. mov pr only
7943 accesses CFM when qualifying predicate is in the rotating region.
7944 3) general register value is used to specify an indirect register; not
7945 determinable statically.
7946 4) only read the given resource when bits 7:0 of the indirect index
7947 register value does not match the register number of the resource; not
7948 determinable statically.
7949 5) all rules are implementation specific.
7950 6) only when both the index specified by the reader and the index specified
7951 by the writer have the same value in bits 63:61; not determinable
7953 7) only access the specified resource when the corresponding mask bit is
7955 8) PSR.dfh is only read when these insns reference FR32-127. PSR.dfl is
7956 only read when these insns reference FR2-31
7957 9) PSR.mfl is only written when these insns write FR2-31. PSR.mfh is only
7958 written when these insns write FR32-127
7959 10) The PSR.bn bit is only accessed when one of GR16-31 is specified in the
7961 11) The target predicates are written independently of PR[qp], but source
7962 registers are only read if PR[qp] is true. Since the state of PR[qp]
7963 cannot statically be determined, all source registers are marked used.
7964 12) This insn only reads the specified predicate register when that
7965 register is the PR[qp].
7966 13) This reference to ld-c only applies to the GR whose value is loaded
7967 with data returned from memory, not the post-incremented address register.
7968 14) The RSE resource includes the implementation-specific RSE internal
7969 state resources. At least one (and possibly more) of these resources are
7970 read by each instruction listed in IC:rse-readers. At least one (and
7971 possibly more) of these resources are written by each insn listed in
7973 15+16) Represents reserved instructions, which the assembler does not
7975 17) CR[TPR] has a RAW dependency only between mov-to-CR-TPR and
7976 mov-to-PSR-l or ssm instructions that set PSR.i, PSR.pp or PSR.up.
7978 Memory resources (i.e. locations in memory) are *not* marked or tracked by
7979 this code; there are no dependency violations based on memory access.
7982 #define MAX_SPECS 256
7987 specify_resource (const struct ia64_dependency
*dep
,
7988 struct ia64_opcode
*idesc
,
7989 /* is this a DV chk or a DV reg? */
7991 /* returned specific resources */
7992 struct rsrc specs
[MAX_SPECS
],
7993 /* resource note for this insn's usage */
7995 /* which execution path to examine */
8003 if (dep
->mode
== IA64_DV_WAW
8004 || (dep
->mode
== IA64_DV_RAW
&& type
== DV_REG
)
8005 || (dep
->mode
== IA64_DV_WAR
&& type
== DV_CHK
))
8008 /* template for any resources we identify */
8009 tmpl
.dependency
= dep
;
8011 tmpl
.insn_srlz
= tmpl
.data_srlz
= 0;
8012 tmpl
.qp_regno
= CURR_SLOT
.qp_regno
;
8013 tmpl
.link_to_qp_branch
= 1;
8014 tmpl
.mem_offset
.hint
= 0;
8015 tmpl
.mem_offset
.offset
= 0;
8016 tmpl
.mem_offset
.base
= 0;
8019 tmpl
.cmp_type
= CMP_NONE
;
8026 as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
8027 dep->name, idesc->name, (rsrc_write?"write":"read"), note)
8028 #define KNOWN(REG) (gr_values[REG].known && gr_values[REG].path >= path)
8030 /* we don't need to track these */
8031 if (dep
->semantics
== IA64_DVS_NONE
)
8034 switch (dep
->specifier
)
8039 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_AR3
)
8041 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_AR
;
8042 if (regno
>= 0 && regno
<= 7)
8044 specs
[count
] = tmpl
;
8045 specs
[count
++].index
= regno
;
8051 for (i
= 0; i
< 8; i
++)
8053 specs
[count
] = tmpl
;
8054 specs
[count
++].index
= i
;
8063 case IA64_RS_AR_UNAT
:
8064 /* This is a mov =AR or mov AR= instruction. */
8065 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_AR3
)
8067 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_AR
;
8068 if (regno
== AR_UNAT
)
8070 specs
[count
++] = tmpl
;
8075 /* This is a spill/fill, or other instruction that modifies the
8078 /* Unless we can determine the specific bits used, mark the whole
8079 thing; bits 8:3 of the memory address indicate the bit used in
8080 UNAT. The .mem.offset hint may be used to eliminate a small
8081 subset of conflicts. */
8082 specs
[count
] = tmpl
;
8083 if (md
.mem_offset
.hint
)
8086 fprintf (stderr
, " Using hint for spill/fill\n");
8087 /* The index isn't actually used, just set it to something
8088 approximating the bit index. */
8089 specs
[count
].index
= (md
.mem_offset
.offset
>> 3) & 0x3F;
8090 specs
[count
].mem_offset
.hint
= 1;
8091 specs
[count
].mem_offset
.offset
= md
.mem_offset
.offset
;
8092 specs
[count
++].mem_offset
.base
= md
.mem_offset
.base
;
8096 specs
[count
++].specific
= 0;
8104 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_AR3
)
8106 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_AR
;
8107 if ((regno
>= 8 && regno
<= 15)
8108 || (regno
>= 20 && regno
<= 23)
8109 || (regno
>= 31 && regno
<= 39)
8110 || (regno
>= 41 && regno
<= 47)
8111 || (regno
>= 67 && regno
<= 111))
8113 specs
[count
] = tmpl
;
8114 specs
[count
++].index
= regno
;
8127 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_AR3
)
8129 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_AR
;
8130 if ((regno
>= 48 && regno
<= 63)
8131 || (regno
>= 112 && regno
<= 127))
8133 specs
[count
] = tmpl
;
8134 specs
[count
++].index
= regno
;
8140 for (i
= 48; i
< 64; i
++)
8142 specs
[count
] = tmpl
;
8143 specs
[count
++].index
= i
;
8145 for (i
= 112; i
< 128; i
++)
8147 specs
[count
] = tmpl
;
8148 specs
[count
++].index
= i
;
8166 for (i
= 0; i
< idesc
->num_outputs
; i
++)
8167 if (idesc
->operands
[i
] == IA64_OPND_B1
8168 || idesc
->operands
[i
] == IA64_OPND_B2
)
8170 specs
[count
] = tmpl
;
8171 specs
[count
++].index
=
8172 CURR_SLOT
.opnd
[i
].X_add_number
- REG_BR
;
8177 for (i
= idesc
->num_outputs
; i
< NELEMS (idesc
->operands
); i
++)
8178 if (idesc
->operands
[i
] == IA64_OPND_B1
8179 || idesc
->operands
[i
] == IA64_OPND_B2
)
8181 specs
[count
] = tmpl
;
8182 specs
[count
++].index
=
8183 CURR_SLOT
.opnd
[i
].X_add_number
- REG_BR
;
8189 case IA64_RS_CPUID
: /* four or more registers */
8192 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_CPUID_R3
)
8194 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_GR
;
8195 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8198 specs
[count
] = tmpl
;
8199 specs
[count
++].index
= gr_values
[regno
].value
& 0xFF;
8203 specs
[count
] = tmpl
;
8204 specs
[count
++].specific
= 0;
8214 case IA64_RS_DBR
: /* four or more registers */
8217 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_DBR_R3
)
8219 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_GR
;
8220 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8223 specs
[count
] = tmpl
;
8224 specs
[count
++].index
= gr_values
[regno
].value
& 0xFF;
8228 specs
[count
] = tmpl
;
8229 specs
[count
++].specific
= 0;
8233 else if (note
== 0 && !rsrc_write
)
8235 specs
[count
] = tmpl
;
8236 specs
[count
++].specific
= 0;
8244 case IA64_RS_IBR
: /* four or more registers */
8247 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_IBR_R3
)
8249 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_GR
;
8250 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8253 specs
[count
] = tmpl
;
8254 specs
[count
++].index
= gr_values
[regno
].value
& 0xFF;
8258 specs
[count
] = tmpl
;
8259 specs
[count
++].specific
= 0;
8272 /* These are implementation specific. Force all references to
8273 conflict with all other references. */
8274 specs
[count
] = tmpl
;
8275 specs
[count
++].specific
= 0;
8283 case IA64_RS_PKR
: /* 16 or more registers */
8284 if (note
== 3 || note
== 4)
8286 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_PKR_R3
)
8288 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_GR
;
8289 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8294 specs
[count
] = tmpl
;
8295 specs
[count
++].index
= gr_values
[regno
].value
& 0xFF;
8298 for (i
= 0; i
< NELEMS (gr_values
); i
++)
8300 /* Uses all registers *except* the one in R3. */
8301 if ((unsigned)i
!= (gr_values
[regno
].value
& 0xFF))
8303 specs
[count
] = tmpl
;
8304 specs
[count
++].index
= i
;
8310 specs
[count
] = tmpl
;
8311 specs
[count
++].specific
= 0;
8318 specs
[count
] = tmpl
;
8319 specs
[count
++].specific
= 0;
8323 case IA64_RS_PMC
: /* four or more registers */
8326 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_PMC_R3
8327 || (!rsrc_write
&& idesc
->operands
[1] == IA64_OPND_PMD_R3
))
8330 int index
= ((idesc
->operands
[1] == IA64_OPND_R3
&& !rsrc_write
)
8332 int regno
= CURR_SLOT
.opnd
[index
].X_add_number
- REG_GR
;
8333 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8336 specs
[count
] = tmpl
;
8337 specs
[count
++].index
= gr_values
[regno
].value
& 0xFF;
8341 specs
[count
] = tmpl
;
8342 specs
[count
++].specific
= 0;
8352 case IA64_RS_PMD
: /* four or more registers */
8355 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_PMD_R3
)
8357 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_GR
;
8358 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8361 specs
[count
] = tmpl
;
8362 specs
[count
++].index
= gr_values
[regno
].value
& 0xFF;
8366 specs
[count
] = tmpl
;
8367 specs
[count
++].specific
= 0;
8377 case IA64_RS_RR
: /* eight registers */
8380 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_RR_R3
)
8382 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_GR
;
8383 if (regno
>= 0 && regno
< NELEMS (gr_values
)
8386 specs
[count
] = tmpl
;
8387 specs
[count
++].index
= (gr_values
[regno
].value
>> 61) & 0x7;
8391 specs
[count
] = tmpl
;
8392 specs
[count
++].specific
= 0;
8396 else if (note
== 0 && !rsrc_write
)
8398 specs
[count
] = tmpl
;
8399 specs
[count
++].specific
= 0;
8407 case IA64_RS_CR_IRR
:
8410 /* handle mov-from-CR-IVR; it's a read that writes CR[IRR] */
8411 int regno
= CURR_SLOT
.opnd
[1].X_add_number
- REG_CR
;
8413 && idesc
->operands
[1] == IA64_OPND_CR3
8416 for (i
= 0; i
< 4; i
++)
8418 specs
[count
] = tmpl
;
8419 specs
[count
++].index
= CR_IRR0
+ i
;
8425 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_CR
;
8426 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_CR3
8428 && regno
<= CR_IRR3
)
8430 specs
[count
] = tmpl
;
8431 specs
[count
++].index
= regno
;
8440 case IA64_RS_CR_IIB
:
8447 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_CR
;
8448 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_CR3
8449 && (regno
== CR_IIB0
|| regno
== CR_IIB1
))
8451 specs
[count
] = tmpl
;
8452 specs
[count
++].index
= regno
;
8457 case IA64_RS_CR_LRR
:
8464 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_CR
;
8465 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_CR3
8466 && (regno
== CR_LRR0
|| regno
== CR_LRR1
))
8468 specs
[count
] = tmpl
;
8469 specs
[count
++].index
= regno
;
8477 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_CR3
)
8479 specs
[count
] = tmpl
;
8480 specs
[count
++].index
=
8481 CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_CR
;
8496 else if (rsrc_write
)
8498 if (dep
->specifier
== IA64_RS_FRb
8499 && idesc
->operands
[0] == IA64_OPND_F1
)
8501 specs
[count
] = tmpl
;
8502 specs
[count
++].index
= CURR_SLOT
.opnd
[0].X_add_number
- REG_FR
;
8507 for (i
= idesc
->num_outputs
; i
< NELEMS (idesc
->operands
); i
++)
8509 if (idesc
->operands
[i
] == IA64_OPND_F2
8510 || idesc
->operands
[i
] == IA64_OPND_F3
8511 || idesc
->operands
[i
] == IA64_OPND_F4
)
8513 specs
[count
] = tmpl
;
8514 specs
[count
++].index
=
8515 CURR_SLOT
.opnd
[i
].X_add_number
- REG_FR
;
8524 /* This reference applies only to the GR whose value is loaded with
8525 data returned from memory. */
8526 specs
[count
] = tmpl
;
8527 specs
[count
++].index
= CURR_SLOT
.opnd
[0].X_add_number
- REG_GR
;
8533 for (i
= 0; i
< idesc
->num_outputs
; i
++)
8534 if (idesc
->operands
[i
] == IA64_OPND_R1
8535 || idesc
->operands
[i
] == IA64_OPND_R2
8536 || idesc
->operands
[i
] == IA64_OPND_R3
)
8538 specs
[count
] = tmpl
;
8539 specs
[count
++].index
=
8540 CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
8542 if (idesc
->flags
& IA64_OPCODE_POSTINC
)
8543 for (i
= 0; i
< NELEMS (idesc
->operands
); i
++)
8544 if (idesc
->operands
[i
] == IA64_OPND_MR3
)
8546 specs
[count
] = tmpl
;
8547 specs
[count
++].index
=
8548 CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
8553 /* Look for anything that reads a GR. */
8554 for (i
= 0; i
< NELEMS (idesc
->operands
); i
++)
8556 if (idesc
->operands
[i
] == IA64_OPND_MR3
8557 || idesc
->operands
[i
] == IA64_OPND_CPUID_R3
8558 || idesc
->operands
[i
] == IA64_OPND_DBR_R3
8559 || idesc
->operands
[i
] == IA64_OPND_IBR_R3
8560 || idesc
->operands
[i
] == IA64_OPND_MSR_R3
8561 || idesc
->operands
[i
] == IA64_OPND_PKR_R3
8562 || idesc
->operands
[i
] == IA64_OPND_PMC_R3
8563 || idesc
->operands
[i
] == IA64_OPND_PMD_R3
8564 || idesc
->operands
[i
] == IA64_OPND_RR_R3
8565 || ((i
>= idesc
->num_outputs
)
8566 && (idesc
->operands
[i
] == IA64_OPND_R1
8567 || idesc
->operands
[i
] == IA64_OPND_R2
8568 || idesc
->operands
[i
] == IA64_OPND_R3
8569 /* addl source register. */
8570 || idesc
->operands
[i
] == IA64_OPND_R3_2
)))
8572 specs
[count
] = tmpl
;
8573 specs
[count
++].index
=
8574 CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
8585 /* This is the same as IA64_RS_PRr, except that the register range is
8586 from 1 - 15, and there are no rotating register reads/writes here. */
8590 for (i
= 1; i
< 16; i
++)
8592 specs
[count
] = tmpl
;
8593 specs
[count
++].index
= i
;
8599 /* Mark only those registers indicated by the mask. */
8602 mask
= CURR_SLOT
.opnd
[2].X_add_number
;
8603 for (i
= 1; i
< 16; i
++)
8604 if (mask
& ((valueT
) 1 << i
))
8606 specs
[count
] = tmpl
;
8607 specs
[count
++].index
= i
;
8615 else if (note
== 11) /* note 11 implies note 1 as well */
8619 for (i
= 0; i
< idesc
->num_outputs
; i
++)
8621 if (idesc
->operands
[i
] == IA64_OPND_P1
8622 || idesc
->operands
[i
] == IA64_OPND_P2
)
8624 int regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_P
;
8625 if (regno
>= 1 && regno
< 16)
8627 specs
[count
] = tmpl
;
8628 specs
[count
++].index
= regno
;
8638 else if (note
== 12)
8640 if (CURR_SLOT
.qp_regno
>= 1 && CURR_SLOT
.qp_regno
< 16)
8642 specs
[count
] = tmpl
;
8643 specs
[count
++].index
= CURR_SLOT
.qp_regno
;
8650 int p1
= CURR_SLOT
.opnd
[0].X_add_number
- REG_P
;
8651 int p2
= CURR_SLOT
.opnd
[1].X_add_number
- REG_P
;
8652 int or_andcm
= strstr (idesc
->name
, "or.andcm") != NULL
;
8653 int and_orcm
= strstr (idesc
->name
, "and.orcm") != NULL
;
8655 if ((idesc
->operands
[0] == IA64_OPND_P1
8656 || idesc
->operands
[0] == IA64_OPND_P2
)
8657 && p1
>= 1 && p1
< 16)
8659 specs
[count
] = tmpl
;
8660 specs
[count
].cmp_type
=
8661 (or_andcm
? CMP_OR
: (and_orcm
? CMP_AND
: CMP_NONE
));
8662 specs
[count
++].index
= p1
;
8664 if ((idesc
->operands
[1] == IA64_OPND_P1
8665 || idesc
->operands
[1] == IA64_OPND_P2
)
8666 && p2
>= 1 && p2
< 16)
8668 specs
[count
] = tmpl
;
8669 specs
[count
].cmp_type
=
8670 (or_andcm
? CMP_AND
: (and_orcm
? CMP_OR
: CMP_NONE
));
8671 specs
[count
++].index
= p2
;
8676 if (CURR_SLOT
.qp_regno
>= 1 && CURR_SLOT
.qp_regno
< 16)
8678 specs
[count
] = tmpl
;
8679 specs
[count
++].index
= CURR_SLOT
.qp_regno
;
8681 if (idesc
->operands
[1] == IA64_OPND_PR
)
8683 for (i
= 1; i
< 16; i
++)
8685 specs
[count
] = tmpl
;
8686 specs
[count
++].index
= i
;
8697 /* This is the general case for PRs. IA64_RS_PR and IA64_RS_PR63 are
8698 simplified cases of this. */
8702 for (i
= 16; i
< 63; i
++)
8704 specs
[count
] = tmpl
;
8705 specs
[count
++].index
= i
;
8711 /* Mark only those registers indicated by the mask. */
8713 && idesc
->operands
[0] == IA64_OPND_PR
)
8715 mask
= CURR_SLOT
.opnd
[2].X_add_number
;
8716 if (mask
& ((valueT
) 1 << 16))
8717 for (i
= 16; i
< 63; i
++)
8719 specs
[count
] = tmpl
;
8720 specs
[count
++].index
= i
;
8724 && idesc
->operands
[0] == IA64_OPND_PR_ROT
)
8726 for (i
= 16; i
< 63; i
++)
8728 specs
[count
] = tmpl
;
8729 specs
[count
++].index
= i
;
8737 else if (note
== 11) /* note 11 implies note 1 as well */
8741 for (i
= 0; i
< idesc
->num_outputs
; i
++)
8743 if (idesc
->operands
[i
] == IA64_OPND_P1
8744 || idesc
->operands
[i
] == IA64_OPND_P2
)
8746 int regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_P
;
8747 if (regno
>= 16 && regno
< 63)
8749 specs
[count
] = tmpl
;
8750 specs
[count
++].index
= regno
;
8760 else if (note
== 12)
8762 if (CURR_SLOT
.qp_regno
>= 16 && CURR_SLOT
.qp_regno
< 63)
8764 specs
[count
] = tmpl
;
8765 specs
[count
++].index
= CURR_SLOT
.qp_regno
;
8772 int p1
= CURR_SLOT
.opnd
[0].X_add_number
- REG_P
;
8773 int p2
= CURR_SLOT
.opnd
[1].X_add_number
- REG_P
;
8774 int or_andcm
= strstr (idesc
->name
, "or.andcm") != NULL
;
8775 int and_orcm
= strstr (idesc
->name
, "and.orcm") != NULL
;
8777 if ((idesc
->operands
[0] == IA64_OPND_P1
8778 || idesc
->operands
[0] == IA64_OPND_P2
)
8779 && p1
>= 16 && p1
< 63)
8781 specs
[count
] = tmpl
;
8782 specs
[count
].cmp_type
=
8783 (or_andcm
? CMP_OR
: (and_orcm
? CMP_AND
: CMP_NONE
));
8784 specs
[count
++].index
= p1
;
8786 if ((idesc
->operands
[1] == IA64_OPND_P1
8787 || idesc
->operands
[1] == IA64_OPND_P2
)
8788 && p2
>= 16 && p2
< 63)
8790 specs
[count
] = tmpl
;
8791 specs
[count
].cmp_type
=
8792 (or_andcm
? CMP_AND
: (and_orcm
? CMP_OR
: CMP_NONE
));
8793 specs
[count
++].index
= p2
;
8798 if (CURR_SLOT
.qp_regno
>= 16 && CURR_SLOT
.qp_regno
< 63)
8800 specs
[count
] = tmpl
;
8801 specs
[count
++].index
= CURR_SLOT
.qp_regno
;
8803 if (idesc
->operands
[1] == IA64_OPND_PR
)
8805 for (i
= 16; i
< 63; i
++)
8807 specs
[count
] = tmpl
;
8808 specs
[count
++].index
= i
;
8820 /* Verify that the instruction is using the PSR bit indicated in
8824 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_PSR_UM
)
8826 if (dep
->regindex
< 6)
8828 specs
[count
++] = tmpl
;
8831 else if (idesc
->operands
[!rsrc_write
] == IA64_OPND_PSR
)
8833 if (dep
->regindex
< 32
8834 || dep
->regindex
== 35
8835 || dep
->regindex
== 36
8836 || (!rsrc_write
&& dep
->regindex
== PSR_CPL
))
8838 specs
[count
++] = tmpl
;
8841 else if (idesc
->operands
[!rsrc_write
] == IA64_OPND_PSR_L
)
8843 if (dep
->regindex
< 32
8844 || dep
->regindex
== 35
8845 || dep
->regindex
== 36
8846 || (rsrc_write
&& dep
->regindex
== PSR_CPL
))
8848 specs
[count
++] = tmpl
;
8853 /* Several PSR bits have very specific dependencies. */
8854 switch (dep
->regindex
)
8857 specs
[count
++] = tmpl
;
8862 specs
[count
++] = tmpl
;
8866 /* Only certain CR accesses use PSR.ic */
8867 if (idesc
->operands
[0] == IA64_OPND_CR3
8868 || idesc
->operands
[1] == IA64_OPND_CR3
)
8871 ((idesc
->operands
[0] == IA64_OPND_CR3
)
8874 CURR_SLOT
.opnd
[index
].X_add_number
- REG_CR
;
8891 specs
[count
++] = tmpl
;
8900 specs
[count
++] = tmpl
;
8904 /* Only some AR accesses use cpl */
8905 if (idesc
->operands
[0] == IA64_OPND_AR3
8906 || idesc
->operands
[1] == IA64_OPND_AR3
)
8909 ((idesc
->operands
[0] == IA64_OPND_AR3
)
8912 CURR_SLOT
.opnd
[index
].X_add_number
- REG_AR
;
8919 && regno
<= AR_K7
))))
8921 specs
[count
++] = tmpl
;
8926 specs
[count
++] = tmpl
;
8936 if (idesc
->operands
[0] == IA64_OPND_IMMU24
)
8938 mask
= CURR_SLOT
.opnd
[0].X_add_number
;
8944 if (mask
& ((valueT
) 1 << dep
->regindex
))
8946 specs
[count
++] = tmpl
;
8951 int min
= dep
->regindex
== PSR_DFL
? 2 : 32;
8952 int max
= dep
->regindex
== PSR_DFL
? 31 : 127;
8953 /* dfh is read on FR32-127; dfl is read on FR2-31 */
8954 for (i
= 0; i
< NELEMS (idesc
->operands
); i
++)
8956 if (idesc
->operands
[i
] == IA64_OPND_F1
8957 || idesc
->operands
[i
] == IA64_OPND_F2
8958 || idesc
->operands
[i
] == IA64_OPND_F3
8959 || idesc
->operands
[i
] == IA64_OPND_F4
)
8961 int reg
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_FR
;
8962 if (reg
>= min
&& reg
<= max
)
8964 specs
[count
++] = tmpl
;
8971 int min
= dep
->regindex
== PSR_MFL
? 2 : 32;
8972 int max
= dep
->regindex
== PSR_MFL
? 31 : 127;
8973 /* mfh is read on writes to FR32-127; mfl is read on writes to
8975 for (i
= 0; i
< idesc
->num_outputs
; i
++)
8977 if (idesc
->operands
[i
] == IA64_OPND_F1
)
8979 int reg
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_FR
;
8980 if (reg
>= min
&& reg
<= max
)
8982 specs
[count
++] = tmpl
;
8987 else if (note
== 10)
8989 for (i
= 0; i
< NELEMS (idesc
->operands
); i
++)
8991 if (idesc
->operands
[i
] == IA64_OPND_R1
8992 || idesc
->operands
[i
] == IA64_OPND_R2
8993 || idesc
->operands
[i
] == IA64_OPND_R3
)
8995 int regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
8996 if (regno
>= 16 && regno
<= 31)
8998 specs
[count
++] = tmpl
;
9009 case IA64_RS_AR_FPSR
:
9010 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_AR3
)
9012 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_AR
;
9013 if (regno
== AR_FPSR
)
9015 specs
[count
++] = tmpl
;
9020 specs
[count
++] = tmpl
;
9025 /* Handle all AR[REG] resources */
9026 if (note
== 0 || note
== 1)
9028 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_AR
;
9029 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_AR3
9030 && regno
== dep
->regindex
)
9032 specs
[count
++] = tmpl
;
9034 /* other AR[REG] resources may be affected by AR accesses */
9035 else if (idesc
->operands
[0] == IA64_OPND_AR3
)
9038 regno
= CURR_SLOT
.opnd
[0].X_add_number
- REG_AR
;
9039 switch (dep
->regindex
)
9045 if (regno
== AR_BSPSTORE
)
9047 specs
[count
++] = tmpl
;
9051 (regno
== AR_BSPSTORE
9052 || regno
== AR_RNAT
))
9054 specs
[count
++] = tmpl
;
9059 else if (idesc
->operands
[1] == IA64_OPND_AR3
)
9062 regno
= CURR_SLOT
.opnd
[1].X_add_number
- REG_AR
;
9063 switch (dep
->regindex
)
9068 if (regno
== AR_BSPSTORE
|| regno
== AR_RNAT
)
9070 specs
[count
++] = tmpl
;
9077 specs
[count
++] = tmpl
;
9087 /* Handle all CR[REG] resources.
9088 ??? FIXME: The rule 17 isn't really handled correctly. */
9089 if (note
== 0 || note
== 1 || note
== 17)
9091 if (idesc
->operands
[!rsrc_write
] == IA64_OPND_CR3
)
9093 int regno
= CURR_SLOT
.opnd
[!rsrc_write
].X_add_number
- REG_CR
;
9094 if (regno
== dep
->regindex
)
9096 specs
[count
++] = tmpl
;
9098 else if (!rsrc_write
)
9100 /* Reads from CR[IVR] affect other resources. */
9101 if (regno
== CR_IVR
)
9103 if ((dep
->regindex
>= CR_IRR0
9104 && dep
->regindex
<= CR_IRR3
)
9105 || dep
->regindex
== CR_TPR
)
9107 specs
[count
++] = tmpl
;
9114 specs
[count
++] = tmpl
;
9123 case IA64_RS_INSERVICE
:
9124 /* look for write of EOI (67) or read of IVR (65) */
9125 if ((idesc
->operands
[0] == IA64_OPND_CR3
9126 && CURR_SLOT
.opnd
[0].X_add_number
- REG_CR
== CR_EOI
)
9127 || (idesc
->operands
[1] == IA64_OPND_CR3
9128 && CURR_SLOT
.opnd
[1].X_add_number
- REG_CR
== CR_IVR
))
9130 specs
[count
++] = tmpl
;
9137 specs
[count
++] = tmpl
;
9148 specs
[count
++] = tmpl
;
9152 /* Check if any of the registers accessed are in the rotating region.
9153 mov to/from pr accesses CFM only when qp_regno is in the rotating
9155 for (i
= 0; i
< NELEMS (idesc
->operands
); i
++)
9157 if (idesc
->operands
[i
] == IA64_OPND_R1
9158 || idesc
->operands
[i
] == IA64_OPND_R2
9159 || idesc
->operands
[i
] == IA64_OPND_R3
)
9161 int num
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
9162 /* Assumes that md.rot.num_regs is always valid */
9163 if (md
.rot
.num_regs
> 0
9165 && num
< 31 + md
.rot
.num_regs
)
9167 specs
[count
] = tmpl
;
9168 specs
[count
++].specific
= 0;
9171 else if (idesc
->operands
[i
] == IA64_OPND_F1
9172 || idesc
->operands
[i
] == IA64_OPND_F2
9173 || idesc
->operands
[i
] == IA64_OPND_F3
9174 || idesc
->operands
[i
] == IA64_OPND_F4
)
9176 int num
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_FR
;
9179 specs
[count
] = tmpl
;
9180 specs
[count
++].specific
= 0;
9183 else if (idesc
->operands
[i
] == IA64_OPND_P1
9184 || idesc
->operands
[i
] == IA64_OPND_P2
)
9186 int num
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_P
;
9189 specs
[count
] = tmpl
;
9190 specs
[count
++].specific
= 0;
9194 if (CURR_SLOT
.qp_regno
> 15)
9196 specs
[count
] = tmpl
;
9197 specs
[count
++].specific
= 0;
9202 /* This is the same as IA64_RS_PRr, except simplified to account for
9203 the fact that there is only one register. */
9207 specs
[count
++] = tmpl
;
9212 if (idesc
->operands
[2] == IA64_OPND_IMM17
)
9213 mask
= CURR_SLOT
.opnd
[2].X_add_number
;
9214 if (mask
& ((valueT
) 1 << 63))
9215 specs
[count
++] = tmpl
;
9217 else if (note
== 11)
9219 if ((idesc
->operands
[0] == IA64_OPND_P1
9220 && CURR_SLOT
.opnd
[0].X_add_number
- REG_P
== 63)
9221 || (idesc
->operands
[1] == IA64_OPND_P2
9222 && CURR_SLOT
.opnd
[1].X_add_number
- REG_P
== 63))
9224 specs
[count
++] = tmpl
;
9227 else if (note
== 12)
9229 if (CURR_SLOT
.qp_regno
== 63)
9231 specs
[count
++] = tmpl
;
9238 int p1
= CURR_SLOT
.opnd
[0].X_add_number
- REG_P
;
9239 int p2
= CURR_SLOT
.opnd
[1].X_add_number
- REG_P
;
9240 int or_andcm
= strstr (idesc
->name
, "or.andcm") != NULL
;
9241 int and_orcm
= strstr (idesc
->name
, "and.orcm") != NULL
;
9244 && (idesc
->operands
[0] == IA64_OPND_P1
9245 || idesc
->operands
[0] == IA64_OPND_P2
))
9247 specs
[count
] = tmpl
;
9248 specs
[count
++].cmp_type
=
9249 (or_andcm
? CMP_OR
: (and_orcm
? CMP_AND
: CMP_NONE
));
9252 && (idesc
->operands
[1] == IA64_OPND_P1
9253 || idesc
->operands
[1] == IA64_OPND_P2
))
9255 specs
[count
] = tmpl
;
9256 specs
[count
++].cmp_type
=
9257 (or_andcm
? CMP_AND
: (and_orcm
? CMP_OR
: CMP_NONE
));
9262 if (CURR_SLOT
.qp_regno
== 63)
9264 specs
[count
++] = tmpl
;
9275 /* FIXME we can identify some individual RSE written resources, but RSE
9276 read resources have not yet been completely identified, so for now
9277 treat RSE as a single resource */
9278 if (strncmp (idesc
->name
, "mov", 3) == 0)
9282 if (idesc
->operands
[0] == IA64_OPND_AR3
9283 && CURR_SLOT
.opnd
[0].X_add_number
- REG_AR
== AR_BSPSTORE
)
9285 specs
[count
++] = tmpl
;
9290 if (idesc
->operands
[0] == IA64_OPND_AR3
)
9292 if (CURR_SLOT
.opnd
[0].X_add_number
- REG_AR
== AR_BSPSTORE
9293 || CURR_SLOT
.opnd
[0].X_add_number
- REG_AR
== AR_RNAT
)
9295 specs
[count
++] = tmpl
;
9298 else if (idesc
->operands
[1] == IA64_OPND_AR3
)
9300 if (CURR_SLOT
.opnd
[1].X_add_number
- REG_AR
== AR_BSP
9301 || CURR_SLOT
.opnd
[1].X_add_number
- REG_AR
== AR_BSPSTORE
9302 || CURR_SLOT
.opnd
[1].X_add_number
- REG_AR
== AR_RNAT
)
9304 specs
[count
++] = tmpl
;
9311 specs
[count
++] = tmpl
;
9316 /* FIXME -- do any of these need to be non-specific? */
9317 specs
[count
++] = tmpl
;
9321 as_bad (_("Unrecognized dependency specifier %d\n"), dep
->specifier
);
9328 /* Clear branch flags on marked resources. This breaks the link between the
9329 QP of the marking instruction and a subsequent branch on the same QP. */
9332 clear_qp_branch_flag (valueT mask
)
9335 for (i
= 0; i
< regdepslen
; i
++)
9337 valueT bit
= ((valueT
) 1 << regdeps
[i
].qp_regno
);
9338 if ((bit
& mask
) != 0)
9340 regdeps
[i
].link_to_qp_branch
= 0;
9345 /* MASK contains 2 and only 2 PRs which are mutually exclusive. Remove
9346 any mutexes which contain one of the PRs and create new ones when
9350 update_qp_mutex (valueT mask
)
9356 while (i
< qp_mutexeslen
)
9358 if ((qp_mutexes
[i
].prmask
& mask
) != 0)
9360 /* If it destroys and creates the same mutex, do nothing. */
9361 if (qp_mutexes
[i
].prmask
== mask
9362 && qp_mutexes
[i
].path
== md
.path
)
9373 fprintf (stderr
, " Clearing mutex relation");
9374 print_prmask (qp_mutexes
[i
].prmask
);
9375 fprintf (stderr
, "\n");
9378 /* Deal with the old mutex with more than 3+ PRs only if
9379 the new mutex on the same execution path with it.
9381 FIXME: The 3+ mutex support is incomplete.
9382 dot_pred_rel () may be a better place to fix it. */
9383 if (qp_mutexes
[i
].path
== md
.path
)
9385 /* If it is a proper subset of the mutex, create a
9388 && (qp_mutexes
[i
].prmask
& mask
) == mask
)
9391 qp_mutexes
[i
].prmask
&= ~mask
;
9392 if (qp_mutexes
[i
].prmask
& (qp_mutexes
[i
].prmask
- 1))
9394 /* Modify the mutex if there are more than one
9402 /* Remove the mutex. */
9403 qp_mutexes
[i
] = qp_mutexes
[--qp_mutexeslen
];
9411 add_qp_mutex (mask
);
9416 /* Remove any mutexes which contain any of the PRs indicated in the mask.
9418 Any changes to a PR clears the mutex relations which include that PR. */
9421 clear_qp_mutex (valueT mask
)
9426 while (i
< qp_mutexeslen
)
9428 if ((qp_mutexes
[i
].prmask
& mask
) != 0)
9432 fprintf (stderr
, " Clearing mutex relation");
9433 print_prmask (qp_mutexes
[i
].prmask
);
9434 fprintf (stderr
, "\n");
9436 qp_mutexes
[i
] = qp_mutexes
[--qp_mutexeslen
];
9443 /* Clear implies relations which contain PRs in the given masks.
9444 P1_MASK indicates the source of the implies relation, while P2_MASK
9445 indicates the implied PR. */
9448 clear_qp_implies (valueT p1_mask
, valueT p2_mask
)
9453 while (i
< qp_implieslen
)
9455 if ((((valueT
) 1 << qp_implies
[i
].p1
) & p1_mask
) != 0
9456 || (((valueT
) 1 << qp_implies
[i
].p2
) & p2_mask
) != 0)
9459 fprintf (stderr
, "Clearing implied relation PR%d->PR%d\n",
9460 qp_implies
[i
].p1
, qp_implies
[i
].p2
);
9461 qp_implies
[i
] = qp_implies
[--qp_implieslen
];
9468 /* Add the PRs specified to the list of implied relations. */
9471 add_qp_imply (int p1
, int p2
)
9477 /* p0 is not meaningful here. */
9478 if (p1
== 0 || p2
== 0)
9484 /* If it exists already, ignore it. */
9485 for (i
= 0; i
< qp_implieslen
; i
++)
9487 if (qp_implies
[i
].p1
== p1
9488 && qp_implies
[i
].p2
== p2
9489 && qp_implies
[i
].path
== md
.path
9490 && !qp_implies
[i
].p2_branched
)
9494 if (qp_implieslen
== qp_impliestotlen
)
9496 qp_impliestotlen
+= 20;
9497 qp_implies
= (struct qp_imply
*)
9498 xrealloc ((void *) qp_implies
,
9499 qp_impliestotlen
* sizeof (struct qp_imply
));
9502 fprintf (stderr
, " Registering PR%d implies PR%d\n", p1
, p2
);
9503 qp_implies
[qp_implieslen
].p1
= p1
;
9504 qp_implies
[qp_implieslen
].p2
= p2
;
9505 qp_implies
[qp_implieslen
].path
= md
.path
;
9506 qp_implies
[qp_implieslen
++].p2_branched
= 0;
9508 /* Add in the implied transitive relations; for everything that p2 implies,
9509 make p1 imply that, too; for everything that implies p1, make it imply p2
9511 for (i
= 0; i
< qp_implieslen
; i
++)
9513 if (qp_implies
[i
].p1
== p2
)
9514 add_qp_imply (p1
, qp_implies
[i
].p2
);
9515 if (qp_implies
[i
].p2
== p1
)
9516 add_qp_imply (qp_implies
[i
].p1
, p2
);
9518 /* Add in mutex relations implied by this implies relation; for each mutex
9519 relation containing p2, duplicate it and replace p2 with p1. */
9520 bit
= (valueT
) 1 << p1
;
9521 mask
= (valueT
) 1 << p2
;
9522 for (i
= 0; i
< qp_mutexeslen
; i
++)
9524 if (qp_mutexes
[i
].prmask
& mask
)
9525 add_qp_mutex ((qp_mutexes
[i
].prmask
& ~mask
) | bit
);
9529 /* Add the PRs specified in the mask to the mutex list; this means that only
9530 one of the PRs can be true at any time. PR0 should never be included in
9534 add_qp_mutex (valueT mask
)
9539 if (qp_mutexeslen
== qp_mutexestotlen
)
9541 qp_mutexestotlen
+= 20;
9542 qp_mutexes
= (struct qpmutex
*)
9543 xrealloc ((void *) qp_mutexes
,
9544 qp_mutexestotlen
* sizeof (struct qpmutex
));
9548 fprintf (stderr
, " Registering mutex on");
9549 print_prmask (mask
);
9550 fprintf (stderr
, "\n");
9552 qp_mutexes
[qp_mutexeslen
].path
= md
.path
;
9553 qp_mutexes
[qp_mutexeslen
++].prmask
= mask
;
9557 has_suffix_p (const char *name
, const char *suffix
)
9559 size_t namelen
= strlen (name
);
9560 size_t sufflen
= strlen (suffix
);
9562 if (namelen
<= sufflen
)
9564 return strcmp (name
+ namelen
- sufflen
, suffix
) == 0;
9568 clear_register_values (void)
9572 fprintf (stderr
, " Clearing register values\n");
9573 for (i
= 1; i
< NELEMS (gr_values
); i
++)
9574 gr_values
[i
].known
= 0;
9577 /* Keep track of register values/changes which affect DV tracking.
9579 optimization note: should add a flag to classes of insns where otherwise we
9580 have to examine a group of strings to identify them. */
9583 note_register_values (struct ia64_opcode
*idesc
)
9585 valueT qp_changemask
= 0;
9588 /* Invalidate values for registers being written to. */
9589 for (i
= 0; i
< idesc
->num_outputs
; i
++)
9591 if (idesc
->operands
[i
] == IA64_OPND_R1
9592 || idesc
->operands
[i
] == IA64_OPND_R2
9593 || idesc
->operands
[i
] == IA64_OPND_R3
)
9595 int regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
9596 if (regno
> 0 && regno
< NELEMS (gr_values
))
9597 gr_values
[regno
].known
= 0;
9599 else if (idesc
->operands
[i
] == IA64_OPND_R3_2
)
9601 int regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_GR
;
9602 if (regno
> 0 && regno
< 4)
9603 gr_values
[regno
].known
= 0;
9605 else if (idesc
->operands
[i
] == IA64_OPND_P1
9606 || idesc
->operands
[i
] == IA64_OPND_P2
)
9608 int regno
= CURR_SLOT
.opnd
[i
].X_add_number
- REG_P
;
9609 qp_changemask
|= (valueT
) 1 << regno
;
9611 else if (idesc
->operands
[i
] == IA64_OPND_PR
)
9613 if (idesc
->operands
[2] & (valueT
) 0x10000)
9614 qp_changemask
= ~(valueT
) 0x1FFFF | idesc
->operands
[2];
9616 qp_changemask
= idesc
->operands
[2];
9619 else if (idesc
->operands
[i
] == IA64_OPND_PR_ROT
)
9621 if (idesc
->operands
[1] & ((valueT
) 1 << 43))
9622 qp_changemask
= -((valueT
) 1 << 44) | idesc
->operands
[1];
9624 qp_changemask
= idesc
->operands
[1];
9625 qp_changemask
&= ~(valueT
) 0xFFFF;
9630 /* Always clear qp branch flags on any PR change. */
9631 /* FIXME there may be exceptions for certain compares. */
9632 clear_qp_branch_flag (qp_changemask
);
9634 /* Invalidate rotating registers on insns which affect RRBs in CFM. */
9635 if (idesc
->flags
& IA64_OPCODE_MOD_RRBS
)
9637 qp_changemask
|= ~(valueT
) 0xFFFF;
9638 if (strcmp (idesc
->name
, "clrrrb.pr") != 0)
9640 for (i
= 32; i
< 32 + md
.rot
.num_regs
; i
++)
9641 gr_values
[i
].known
= 0;
9643 clear_qp_mutex (qp_changemask
);
9644 clear_qp_implies (qp_changemask
, qp_changemask
);
9646 /* After a call, all register values are undefined, except those marked
9648 else if (strncmp (idesc
->name
, "br.call", 6) == 0
9649 || strncmp (idesc
->name
, "brl.call", 7) == 0)
9651 /* FIXME keep GR values which are marked as "safe_across_calls" */
9652 clear_register_values ();
9653 clear_qp_mutex (~qp_safe_across_calls
);
9654 clear_qp_implies (~qp_safe_across_calls
, ~qp_safe_across_calls
);
9655 clear_qp_branch_flag (~qp_safe_across_calls
);
9657 else if (is_interruption_or_rfi (idesc
)
9658 || is_taken_branch (idesc
))
9660 clear_register_values ();
9661 clear_qp_mutex (~(valueT
) 0);
9662 clear_qp_implies (~(valueT
) 0, ~(valueT
) 0);
9664 /* Look for mutex and implies relations. */
9665 else if ((idesc
->operands
[0] == IA64_OPND_P1
9666 || idesc
->operands
[0] == IA64_OPND_P2
)
9667 && (idesc
->operands
[1] == IA64_OPND_P1
9668 || idesc
->operands
[1] == IA64_OPND_P2
))
9670 int p1
= CURR_SLOT
.opnd
[0].X_add_number
- REG_P
;
9671 int p2
= CURR_SLOT
.opnd
[1].X_add_number
- REG_P
;
9672 valueT p1mask
= (p1
!= 0) ? (valueT
) 1 << p1
: 0;
9673 valueT p2mask
= (p2
!= 0) ? (valueT
) 1 << p2
: 0;
9675 /* If both PRs are PR0, we can't really do anything. */
9676 if (p1
== 0 && p2
== 0)
9679 fprintf (stderr
, " Ignoring PRs due to inclusion of p0\n");
9681 /* In general, clear mutexes and implies which include P1 or P2,
9682 with the following exceptions. */
9683 else if (has_suffix_p (idesc
->name
, ".or.andcm")
9684 || has_suffix_p (idesc
->name
, ".and.orcm"))
9686 clear_qp_implies (p2mask
, p1mask
);
9688 else if (has_suffix_p (idesc
->name
, ".andcm")
9689 || has_suffix_p (idesc
->name
, ".and"))
9691 clear_qp_implies (0, p1mask
| p2mask
);
9693 else if (has_suffix_p (idesc
->name
, ".orcm")
9694 || has_suffix_p (idesc
->name
, ".or"))
9696 clear_qp_mutex (p1mask
| p2mask
);
9697 clear_qp_implies (p1mask
| p2mask
, 0);
9703 clear_qp_implies (p1mask
| p2mask
, p1mask
| p2mask
);
9705 /* If one of the PRs is PR0, we call clear_qp_mutex. */
9706 if (p1
== 0 || p2
== 0)
9707 clear_qp_mutex (p1mask
| p2mask
);
9709 added
= update_qp_mutex (p1mask
| p2mask
);
9711 if (CURR_SLOT
.qp_regno
== 0
9712 || has_suffix_p (idesc
->name
, ".unc"))
9714 if (added
== 0 && p1
&& p2
)
9715 add_qp_mutex (p1mask
| p2mask
);
9716 if (CURR_SLOT
.qp_regno
!= 0)
9719 add_qp_imply (p1
, CURR_SLOT
.qp_regno
);
9721 add_qp_imply (p2
, CURR_SLOT
.qp_regno
);
9726 /* Look for mov imm insns into GRs. */
9727 else if (idesc
->operands
[0] == IA64_OPND_R1
9728 && (idesc
->operands
[1] == IA64_OPND_IMM22
9729 || idesc
->operands
[1] == IA64_OPND_IMMU64
)
9730 && CURR_SLOT
.opnd
[1].X_op
== O_constant
9731 && (strcmp (idesc
->name
, "mov") == 0
9732 || strcmp (idesc
->name
, "movl") == 0))
9734 int regno
= CURR_SLOT
.opnd
[0].X_add_number
- REG_GR
;
9735 if (regno
> 0 && regno
< NELEMS (gr_values
))
9737 gr_values
[regno
].known
= 1;
9738 gr_values
[regno
].value
= CURR_SLOT
.opnd
[1].X_add_number
;
9739 gr_values
[regno
].path
= md
.path
;
9742 fprintf (stderr
, " Know gr%d = ", regno
);
9743 fprintf_vma (stderr
, gr_values
[regno
].value
);
9744 fputs ("\n", stderr
);
9748 /* Look for dep.z imm insns. */
9749 else if (idesc
->operands
[0] == IA64_OPND_R1
9750 && idesc
->operands
[1] == IA64_OPND_IMM8
9751 && strcmp (idesc
->name
, "dep.z") == 0)
9753 int regno
= CURR_SLOT
.opnd
[0].X_add_number
- REG_GR
;
9754 if (regno
> 0 && regno
< NELEMS (gr_values
))
9756 valueT value
= CURR_SLOT
.opnd
[1].X_add_number
;
9758 if (CURR_SLOT
.opnd
[3].X_add_number
< 64)
9759 value
&= ((valueT
)1 << CURR_SLOT
.opnd
[3].X_add_number
) - 1;
9760 value
<<= CURR_SLOT
.opnd
[2].X_add_number
;
9761 gr_values
[regno
].known
= 1;
9762 gr_values
[regno
].value
= value
;
9763 gr_values
[regno
].path
= md
.path
;
9766 fprintf (stderr
, " Know gr%d = ", regno
);
9767 fprintf_vma (stderr
, gr_values
[regno
].value
);
9768 fputs ("\n", stderr
);
9774 clear_qp_mutex (qp_changemask
);
9775 clear_qp_implies (qp_changemask
, qp_changemask
);
9779 /* Return whether the given predicate registers are currently mutex. */
9782 qp_mutex (int p1
, int p2
, int path
)
9789 mask
= ((valueT
) 1 << p1
) | (valueT
) 1 << p2
;
9790 for (i
= 0; i
< qp_mutexeslen
; i
++)
9792 if (qp_mutexes
[i
].path
>= path
9793 && (qp_mutexes
[i
].prmask
& mask
) == mask
)
9800 /* Return whether the given resource is in the given insn's list of chks
9801 Return 1 if the conflict is absolutely determined, 2 if it's a potential
9805 resources_match (struct rsrc
*rs
,
9806 struct ia64_opcode
*idesc
,
9811 struct rsrc specs
[MAX_SPECS
];
9814 /* If the marked resource's qp_regno and the given qp_regno are mutex,
9815 we don't need to check. One exception is note 11, which indicates that
9816 target predicates are written regardless of PR[qp]. */
9817 if (qp_mutex (rs
->qp_regno
, qp_regno
, path
)
9821 count
= specify_resource (rs
->dependency
, idesc
, DV_CHK
, specs
, note
, path
);
9824 /* UNAT checking is a bit more specific than other resources */
9825 if (rs
->dependency
->specifier
== IA64_RS_AR_UNAT
9826 && specs
[count
].mem_offset
.hint
9827 && rs
->mem_offset
.hint
)
9829 if (rs
->mem_offset
.base
== specs
[count
].mem_offset
.base
)
9831 if (((rs
->mem_offset
.offset
>> 3) & 0x3F) ==
9832 ((specs
[count
].mem_offset
.offset
>> 3) & 0x3F))
9839 /* Skip apparent PR write conflicts where both writes are an AND or both
9840 writes are an OR. */
9841 if (rs
->dependency
->specifier
== IA64_RS_PR
9842 || rs
->dependency
->specifier
== IA64_RS_PRr
9843 || rs
->dependency
->specifier
== IA64_RS_PR63
)
9845 if (specs
[count
].cmp_type
!= CMP_NONE
9846 && specs
[count
].cmp_type
== rs
->cmp_type
)
9849 fprintf (stderr
, " %s on parallel compare allowed (PR%d)\n",
9850 dv_mode
[rs
->dependency
->mode
],
9851 rs
->dependency
->specifier
!= IA64_RS_PR63
?
9852 specs
[count
].index
: 63);
9857 " %s on parallel compare conflict %s vs %s on PR%d\n",
9858 dv_mode
[rs
->dependency
->mode
],
9859 dv_cmp_type
[rs
->cmp_type
],
9860 dv_cmp_type
[specs
[count
].cmp_type
],
9861 rs
->dependency
->specifier
!= IA64_RS_PR63
?
9862 specs
[count
].index
: 63);
9866 /* If either resource is not specific, conservatively assume a conflict
9868 if (!specs
[count
].specific
|| !rs
->specific
)
9870 else if (specs
[count
].index
== rs
->index
)
9877 /* Indicate an instruction group break; if INSERT_STOP is non-zero, then
9878 insert a stop to create the break. Update all resource dependencies
9879 appropriately. If QP_REGNO is non-zero, only apply the break to resources
9880 which use the same QP_REGNO and have the link_to_qp_branch flag set.
9881 If SAVE_CURRENT is non-zero, don't affect resources marked by the current
9885 insn_group_break (int insert_stop
, int qp_regno
, int save_current
)
9889 if (insert_stop
&& md
.num_slots_in_use
> 0)
9890 PREV_SLOT
.end_of_insn_group
= 1;
9894 fprintf (stderr
, " Insn group break%s",
9895 (insert_stop
? " (w/stop)" : ""));
9897 fprintf (stderr
, " effective for QP=%d", qp_regno
);
9898 fprintf (stderr
, "\n");
9902 while (i
< regdepslen
)
9904 const struct ia64_dependency
*dep
= regdeps
[i
].dependency
;
9907 && regdeps
[i
].qp_regno
!= qp_regno
)
9914 && CURR_SLOT
.src_file
== regdeps
[i
].file
9915 && CURR_SLOT
.src_line
== regdeps
[i
].line
)
9921 /* clear dependencies which are automatically cleared by a stop, or
9922 those that have reached the appropriate state of insn serialization */
9923 if (dep
->semantics
== IA64_DVS_IMPLIED
9924 || dep
->semantics
== IA64_DVS_IMPLIEDF
9925 || regdeps
[i
].insn_srlz
== STATE_SRLZ
)
9927 print_dependency ("Removing", i
);
9928 regdeps
[i
] = regdeps
[--regdepslen
];
9932 if (dep
->semantics
== IA64_DVS_DATA
9933 || dep
->semantics
== IA64_DVS_INSTR
9934 || dep
->semantics
== IA64_DVS_SPECIFIC
)
9936 if (regdeps
[i
].insn_srlz
== STATE_NONE
)
9937 regdeps
[i
].insn_srlz
= STATE_STOP
;
9938 if (regdeps
[i
].data_srlz
== STATE_NONE
)
9939 regdeps
[i
].data_srlz
= STATE_STOP
;
9946 /* Add the given resource usage spec to the list of active dependencies. */
9949 mark_resource (struct ia64_opcode
*idesc ATTRIBUTE_UNUSED
,
9950 const struct ia64_dependency
*dep ATTRIBUTE_UNUSED
,
9955 if (regdepslen
== regdepstotlen
)
9957 regdepstotlen
+= 20;
9958 regdeps
= (struct rsrc
*)
9959 xrealloc ((void *) regdeps
,
9960 regdepstotlen
* sizeof (struct rsrc
));
9963 regdeps
[regdepslen
] = *spec
;
9964 regdeps
[regdepslen
].depind
= depind
;
9965 regdeps
[regdepslen
].path
= path
;
9966 regdeps
[regdepslen
].file
= CURR_SLOT
.src_file
;
9967 regdeps
[regdepslen
].line
= CURR_SLOT
.src_line
;
9969 print_dependency ("Adding", regdepslen
);
9975 print_dependency (const char *action
, int depind
)
9979 fprintf (stderr
, " %s %s '%s'",
9980 action
, dv_mode
[(regdeps
[depind
].dependency
)->mode
],
9981 (regdeps
[depind
].dependency
)->name
);
9982 if (regdeps
[depind
].specific
&& regdeps
[depind
].index
>= 0)
9983 fprintf (stderr
, " (%d)", regdeps
[depind
].index
);
9984 if (regdeps
[depind
].mem_offset
.hint
)
9986 fputs (" ", stderr
);
9987 fprintf_vma (stderr
, regdeps
[depind
].mem_offset
.base
);
9988 fputs ("+", stderr
);
9989 fprintf_vma (stderr
, regdeps
[depind
].mem_offset
.offset
);
9991 fprintf (stderr
, "\n");
9996 instruction_serialization (void)
10000 fprintf (stderr
, " Instruction serialization\n");
10001 for (i
= 0; i
< regdepslen
; i
++)
10002 if (regdeps
[i
].insn_srlz
== STATE_STOP
)
10003 regdeps
[i
].insn_srlz
= STATE_SRLZ
;
10007 data_serialization (void)
10011 fprintf (stderr
, " Data serialization\n");
10012 while (i
< regdepslen
)
10014 if (regdeps
[i
].data_srlz
== STATE_STOP
10015 /* Note: as of 991210, all "other" dependencies are cleared by a
10016 data serialization. This might change with new tables */
10017 || (regdeps
[i
].dependency
)->semantics
== IA64_DVS_OTHER
)
10019 print_dependency ("Removing", i
);
10020 regdeps
[i
] = regdeps
[--regdepslen
];
10027 /* Insert stops and serializations as needed to avoid DVs. */
10030 remove_marked_resource (struct rsrc
*rs
)
10032 switch (rs
->dependency
->semantics
)
10034 case IA64_DVS_SPECIFIC
:
10036 fprintf (stderr
, "Implementation-specific, assume worst case...\n");
10037 /* ...fall through... */
10038 case IA64_DVS_INSTR
:
10040 fprintf (stderr
, "Inserting instr serialization\n");
10041 if (rs
->insn_srlz
< STATE_STOP
)
10042 insn_group_break (1, 0, 0);
10043 if (rs
->insn_srlz
< STATE_SRLZ
)
10045 struct slot oldslot
= CURR_SLOT
;
10046 /* Manually jam a srlz.i insn into the stream */
10047 memset (&CURR_SLOT
, 0, sizeof (CURR_SLOT
));
10048 CURR_SLOT
.user_template
= -1;
10049 CURR_SLOT
.idesc
= ia64_find_opcode ("srlz.i");
10050 instruction_serialization ();
10051 md
.curr_slot
= (md
.curr_slot
+ 1) % NUM_SLOTS
;
10052 if (++md
.num_slots_in_use
>= NUM_SLOTS
)
10053 emit_one_bundle ();
10054 CURR_SLOT
= oldslot
;
10056 insn_group_break (1, 0, 0);
10058 case IA64_DVS_OTHER
: /* as of rev2 (991220) of the DV tables, all
10059 "other" types of DV are eliminated
10060 by a data serialization */
10061 case IA64_DVS_DATA
:
10063 fprintf (stderr
, "Inserting data serialization\n");
10064 if (rs
->data_srlz
< STATE_STOP
)
10065 insn_group_break (1, 0, 0);
10067 struct slot oldslot
= CURR_SLOT
;
10068 /* Manually jam a srlz.d insn into the stream */
10069 memset (&CURR_SLOT
, 0, sizeof (CURR_SLOT
));
10070 CURR_SLOT
.user_template
= -1;
10071 CURR_SLOT
.idesc
= ia64_find_opcode ("srlz.d");
10072 data_serialization ();
10073 md
.curr_slot
= (md
.curr_slot
+ 1) % NUM_SLOTS
;
10074 if (++md
.num_slots_in_use
>= NUM_SLOTS
)
10075 emit_one_bundle ();
10076 CURR_SLOT
= oldslot
;
10079 case IA64_DVS_IMPLIED
:
10080 case IA64_DVS_IMPLIEDF
:
10082 fprintf (stderr
, "Inserting stop\n");
10083 insn_group_break (1, 0, 0);
10090 /* Check the resources used by the given opcode against the current dependency
10093 The check is run once for each execution path encountered. In this case,
10094 a unique execution path is the sequence of instructions following a code
10095 entry point, e.g. the following has three execution paths, one starting
10096 at L0, one at L1, and one at L2.
10105 check_dependencies (struct ia64_opcode
*idesc
)
10107 const struct ia64_opcode_dependency
*opdeps
= idesc
->dependencies
;
10111 /* Note that the number of marked resources may change within the
10112 loop if in auto mode. */
10114 while (i
< regdepslen
)
10116 struct rsrc
*rs
= ®deps
[i
];
10117 const struct ia64_dependency
*dep
= rs
->dependency
;
10120 int start_over
= 0;
10122 if (dep
->semantics
== IA64_DVS_NONE
10123 || (chkind
= depends_on (rs
->depind
, idesc
)) == -1)
10129 note
= NOTE (opdeps
->chks
[chkind
]);
10131 /* Check this resource against each execution path seen thus far. */
10132 for (path
= 0; path
<= md
.path
; path
++)
10136 /* If the dependency wasn't on the path being checked, ignore it. */
10137 if (rs
->path
< path
)
10140 /* If the QP for this insn implies a QP which has branched, don't
10141 bother checking. Ed. NOTE: I don't think this check is terribly
10142 useful; what's the point of generating code which will only be
10143 reached if its QP is zero?
10144 This code was specifically inserted to handle the following code,
10145 based on notes from Intel's DV checking code, where p1 implies p2.
10151 if (CURR_SLOT
.qp_regno
!= 0)
10155 for (implies
= 0; implies
< qp_implieslen
; implies
++)
10157 if (qp_implies
[implies
].path
>= path
10158 && qp_implies
[implies
].p1
== CURR_SLOT
.qp_regno
10159 && qp_implies
[implies
].p2_branched
)
10169 if ((matchtype
= resources_match (rs
, idesc
, note
,
10170 CURR_SLOT
.qp_regno
, path
)) != 0)
10173 char pathmsg
[256] = "";
10174 char indexmsg
[256] = "";
10175 int certain
= (matchtype
== 1 && CURR_SLOT
.qp_regno
== 0);
10178 snprintf (pathmsg
, sizeof (pathmsg
),
10179 " when entry is at label '%s'",
10180 md
.entry_labels
[path
- 1]);
10181 if (matchtype
== 1 && rs
->index
>= 0)
10182 snprintf (indexmsg
, sizeof (indexmsg
),
10183 ", specific resource number is %d",
10185 snprintf (msg
, sizeof (msg
),
10186 "Use of '%s' %s %s dependency '%s' (%s)%s%s",
10188 (certain
? "violates" : "may violate"),
10189 dv_mode
[dep
->mode
], dep
->name
,
10190 dv_sem
[dep
->semantics
],
10191 pathmsg
, indexmsg
);
10193 if (md
.explicit_mode
)
10195 as_warn ("%s", msg
);
10196 if (path
< md
.path
)
10197 as_warn (_("Only the first path encountering the conflict is reported"));
10198 as_warn_where (rs
->file
, rs
->line
,
10199 _("This is the location of the conflicting usage"));
10200 /* Don't bother checking other paths, to avoid duplicating
10201 the same warning */
10207 fprintf (stderr
, "%s @ %s:%d\n", msg
, rs
->file
, rs
->line
);
10209 remove_marked_resource (rs
);
10211 /* since the set of dependencies has changed, start over */
10212 /* FIXME -- since we're removing dvs as we go, we
10213 probably don't really need to start over... */
10226 /* Register new dependencies based on the given opcode. */
10229 mark_resources (struct ia64_opcode
*idesc
)
10232 const struct ia64_opcode_dependency
*opdeps
= idesc
->dependencies
;
10233 int add_only_qp_reads
= 0;
10235 /* A conditional branch only uses its resources if it is taken; if it is
10236 taken, we stop following that path. The other branch types effectively
10237 *always* write their resources. If it's not taken, register only QP
10239 if (is_conditional_branch (idesc
) || is_interruption_or_rfi (idesc
))
10241 add_only_qp_reads
= 1;
10245 fprintf (stderr
, "Registering '%s' resource usage\n", idesc
->name
);
10247 for (i
= 0; i
< opdeps
->nregs
; i
++)
10249 const struct ia64_dependency
*dep
;
10250 struct rsrc specs
[MAX_SPECS
];
10255 dep
= ia64_find_dependency (opdeps
->regs
[i
]);
10256 note
= NOTE (opdeps
->regs
[i
]);
10258 if (add_only_qp_reads
10259 && !(dep
->mode
== IA64_DV_WAR
10260 && (dep
->specifier
== IA64_RS_PR
10261 || dep
->specifier
== IA64_RS_PRr
10262 || dep
->specifier
== IA64_RS_PR63
)))
10265 count
= specify_resource (dep
, idesc
, DV_REG
, specs
, note
, md
.path
);
10267 while (count
-- > 0)
10269 mark_resource (idesc
, dep
, &specs
[count
],
10270 DEP (opdeps
->regs
[i
]), md
.path
);
10273 /* The execution path may affect register values, which may in turn
10274 affect which indirect-access resources are accessed. */
10275 switch (dep
->specifier
)
10279 case IA64_RS_CPUID
:
10287 for (path
= 0; path
< md
.path
; path
++)
10289 count
= specify_resource (dep
, idesc
, DV_REG
, specs
, note
, path
);
10290 while (count
-- > 0)
10291 mark_resource (idesc
, dep
, &specs
[count
],
10292 DEP (opdeps
->regs
[i
]), path
);
10299 /* Remove dependencies when they no longer apply. */
10302 update_dependencies (struct ia64_opcode
*idesc
)
10306 if (strcmp (idesc
->name
, "srlz.i") == 0)
10308 instruction_serialization ();
10310 else if (strcmp (idesc
->name
, "srlz.d") == 0)
10312 data_serialization ();
10314 else if (is_interruption_or_rfi (idesc
)
10315 || is_taken_branch (idesc
))
10317 /* Although technically the taken branch doesn't clear dependencies
10318 which require a srlz.[id], we don't follow the branch; the next
10319 instruction is assumed to start with a clean slate. */
10323 else if (is_conditional_branch (idesc
)
10324 && CURR_SLOT
.qp_regno
!= 0)
10326 int is_call
= strstr (idesc
->name
, ".call") != NULL
;
10328 for (i
= 0; i
< qp_implieslen
; i
++)
10330 /* If the conditional branch's predicate is implied by the predicate
10331 in an existing dependency, remove that dependency. */
10332 if (qp_implies
[i
].p2
== CURR_SLOT
.qp_regno
)
10335 /* Note that this implied predicate takes a branch so that if
10336 a later insn generates a DV but its predicate implies this
10337 one, we can avoid the false DV warning. */
10338 qp_implies
[i
].p2_branched
= 1;
10339 while (depind
< regdepslen
)
10341 if (regdeps
[depind
].qp_regno
== qp_implies
[i
].p1
)
10343 print_dependency ("Removing", depind
);
10344 regdeps
[depind
] = regdeps
[--regdepslen
];
10351 /* Any marked resources which have this same predicate should be
10352 cleared, provided that the QP hasn't been modified between the
10353 marking instruction and the branch. */
10356 insn_group_break (0, CURR_SLOT
.qp_regno
, 1);
10361 while (i
< regdepslen
)
10363 if (regdeps
[i
].qp_regno
== CURR_SLOT
.qp_regno
10364 && regdeps
[i
].link_to_qp_branch
10365 && (regdeps
[i
].file
!= CURR_SLOT
.src_file
10366 || regdeps
[i
].line
!= CURR_SLOT
.src_line
))
10368 /* Treat like a taken branch */
10369 print_dependency ("Removing", i
);
10370 regdeps
[i
] = regdeps
[--regdepslen
];
10379 /* Examine the current instruction for dependency violations. */
10382 check_dv (struct ia64_opcode
*idesc
)
10386 fprintf (stderr
, "Checking %s for violations (line %d, %d/%d)\n",
10387 idesc
->name
, CURR_SLOT
.src_line
,
10388 idesc
->dependencies
->nchks
,
10389 idesc
->dependencies
->nregs
);
10392 /* Look through the list of currently marked resources; if the current
10393 instruction has the dependency in its chks list which uses that resource,
10394 check against the specific resources used. */
10395 check_dependencies (idesc
);
10397 /* Look up the instruction's regdeps (RAW writes, WAW writes, and WAR reads),
10398 then add them to the list of marked resources. */
10399 mark_resources (idesc
);
10401 /* There are several types of dependency semantics, and each has its own
10402 requirements for being cleared
10404 Instruction serialization (insns separated by interruption, rfi, or
10405 writer + srlz.i + reader, all in separate groups) clears DVS_INSTR.
10407 Data serialization (instruction serialization, or writer + srlz.d +
10408 reader, where writer and srlz.d are in separate groups) clears
10409 DVS_DATA. (This also clears DVS_OTHER, but that is not guaranteed to
10410 always be the case).
10412 Instruction group break (groups separated by stop, taken branch,
10413 interruption or rfi) clears DVS_IMPLIED and DVS_IMPLIEDF.
10415 update_dependencies (idesc
);
10417 /* Sometimes, knowing a register value allows us to avoid giving a false DV
10418 warning. Keep track of as many as possible that are useful. */
10419 note_register_values (idesc
);
10421 /* We don't need or want this anymore. */
10422 md
.mem_offset
.hint
= 0;
10427 /* Translate one line of assembly. Pseudo ops and labels do not show
10430 md_assemble (char *str
)
10432 char *saved_input_line_pointer
, *mnemonic
;
10433 const struct pseudo_opcode
*pdesc
;
10434 struct ia64_opcode
*idesc
;
10435 unsigned char qp_regno
;
10436 unsigned int flags
;
10439 saved_input_line_pointer
= input_line_pointer
;
10440 input_line_pointer
= str
;
10442 /* extract the opcode (mnemonic): */
10444 mnemonic
= input_line_pointer
;
10445 ch
= get_symbol_end ();
10446 pdesc
= (struct pseudo_opcode
*) hash_find (md
.pseudo_hash
, mnemonic
);
10449 *input_line_pointer
= ch
;
10450 (*pdesc
->handler
) (pdesc
->arg
);
10454 /* Find the instruction descriptor matching the arguments. */
10456 idesc
= ia64_find_opcode (mnemonic
);
10457 *input_line_pointer
= ch
;
10460 as_bad (_("Unknown opcode `%s'"), mnemonic
);
10464 idesc
= parse_operands (idesc
);
10468 /* Handle the dynamic ops we can handle now: */
10469 if (idesc
->type
== IA64_TYPE_DYN
)
10471 if (strcmp (idesc
->name
, "add") == 0)
10473 if (CURR_SLOT
.opnd
[2].X_op
== O_register
10474 && CURR_SLOT
.opnd
[2].X_add_number
< 4)
10478 ia64_free_opcode (idesc
);
10479 idesc
= ia64_find_opcode (mnemonic
);
10481 else if (strcmp (idesc
->name
, "mov") == 0)
10483 enum ia64_opnd opnd1
, opnd2
;
10486 opnd1
= idesc
->operands
[0];
10487 opnd2
= idesc
->operands
[1];
10488 if (opnd1
== IA64_OPND_AR3
)
10490 else if (opnd2
== IA64_OPND_AR3
)
10494 if (CURR_SLOT
.opnd
[rop
].X_op
== O_register
)
10496 if (ar_is_only_in_integer_unit (CURR_SLOT
.opnd
[rop
].X_add_number
))
10497 mnemonic
= "mov.i";
10498 else if (ar_is_only_in_memory_unit (CURR_SLOT
.opnd
[rop
].X_add_number
))
10499 mnemonic
= "mov.m";
10507 ia64_free_opcode (idesc
);
10508 idesc
= ia64_find_opcode (mnemonic
);
10509 while (idesc
!= NULL
10510 && (idesc
->operands
[0] != opnd1
10511 || idesc
->operands
[1] != opnd2
))
10512 idesc
= get_next_opcode (idesc
);
10516 else if (strcmp (idesc
->name
, "mov.i") == 0
10517 || strcmp (idesc
->name
, "mov.m") == 0)
10519 enum ia64_opnd opnd1
, opnd2
;
10522 opnd1
= idesc
->operands
[0];
10523 opnd2
= idesc
->operands
[1];
10524 if (opnd1
== IA64_OPND_AR3
)
10526 else if (opnd2
== IA64_OPND_AR3
)
10530 if (CURR_SLOT
.opnd
[rop
].X_op
== O_register
)
10533 if (ar_is_only_in_integer_unit (CURR_SLOT
.opnd
[rop
].X_add_number
))
10535 else if (ar_is_only_in_memory_unit (CURR_SLOT
.opnd
[rop
].X_add_number
))
10537 if (unit
!= 'a' && unit
!= idesc
->name
[4])
10538 as_bad (_("AR %d can only be accessed by %c-unit"),
10539 (int) (CURR_SLOT
.opnd
[rop
].X_add_number
- REG_AR
),
10543 else if (strcmp (idesc
->name
, "hint.b") == 0)
10549 case hint_b_warning
:
10550 as_warn (_("hint.b may be treated as nop"));
10553 as_bad (_("hint.b shouldn't be used"));
10559 if (md
.qp
.X_op
== O_register
)
10561 qp_regno
= md
.qp
.X_add_number
- REG_P
;
10562 md
.qp
.X_op
= O_absent
;
10565 flags
= idesc
->flags
;
10567 if ((flags
& IA64_OPCODE_FIRST
) != 0)
10569 /* The alignment frag has to end with a stop bit only if the
10570 next instruction after the alignment directive has to be
10571 the first instruction in an instruction group. */
10574 while (align_frag
->fr_type
!= rs_align_code
)
10576 align_frag
= align_frag
->fr_next
;
10580 /* align_frag can be NULL if there are directives in
10582 if (align_frag
&& align_frag
->fr_next
== frag_now
)
10583 align_frag
->tc_frag_data
= 1;
10586 insn_group_break (1, 0, 0);
10590 if ((flags
& IA64_OPCODE_NO_PRED
) != 0 && qp_regno
!= 0)
10592 as_bad (_("`%s' cannot be predicated"), idesc
->name
);
10596 /* Build the instruction. */
10597 CURR_SLOT
.qp_regno
= qp_regno
;
10598 CURR_SLOT
.idesc
= idesc
;
10599 as_where (&CURR_SLOT
.src_file
, &CURR_SLOT
.src_line
);
10600 dwarf2_where (&CURR_SLOT
.debug_line
);
10601 dwarf2_consume_line_info ();
10603 /* Add unwind entries, if there are any. */
10604 if (unwind
.current_entry
)
10606 CURR_SLOT
.unwind_record
= unwind
.current_entry
;
10607 unwind
.current_entry
= NULL
;
10609 if (unwind
.pending_saves
)
10611 if (unwind
.pending_saves
->next
)
10613 /* Attach the next pending save to the next slot so that its
10614 slot number will get set correctly. */
10615 add_unwind_entry (unwind
.pending_saves
->next
, NOT_A_CHAR
);
10616 unwind
.pending_saves
= &unwind
.pending_saves
->next
->r
.record
.p
;
10619 unwind
.pending_saves
= NULL
;
10621 if (unwind
.proc_pending
.sym
&& S_IS_DEFINED (unwind
.proc_pending
.sym
))
10624 /* Check for dependency violations. */
10628 md
.curr_slot
= (md
.curr_slot
+ 1) % NUM_SLOTS
;
10629 if (++md
.num_slots_in_use
>= NUM_SLOTS
)
10630 emit_one_bundle ();
10632 if ((flags
& IA64_OPCODE_LAST
) != 0)
10633 insn_group_break (1, 0, 0);
10635 md
.last_text_seg
= now_seg
;
10638 input_line_pointer
= saved_input_line_pointer
;
10641 /* Called when symbol NAME cannot be found in the symbol table.
10642 Should be used for dynamic valued symbols only. */
10645 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
10650 /* Called for any expression that can not be recognized. When the
10651 function is called, `input_line_pointer' will point to the start of
10655 md_operand (expressionS
*e
)
10657 switch (*input_line_pointer
)
10660 ++input_line_pointer
;
10661 expression_and_evaluate (e
);
10662 if (*input_line_pointer
!= ']')
10664 as_bad (_("Closing bracket missing"));
10669 if (e
->X_op
!= O_register
10670 || e
->X_add_number
< REG_GR
10671 || e
->X_add_number
> REG_GR
+ 127)
10673 as_bad (_("Index must be a general register"));
10674 e
->X_add_number
= REG_GR
;
10677 ++input_line_pointer
;
10688 ignore_rest_of_line ();
10691 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
10692 a section symbol plus some offset. For relocs involving @fptr(),
10693 directives we don't want such adjustments since we need to have the
10694 original symbol's name in the reloc. */
10696 ia64_fix_adjustable (fixS
*fix
)
10698 /* Prevent all adjustments to global symbols */
10699 if (S_IS_EXTERNAL (fix
->fx_addsy
) || S_IS_WEAK (fix
->fx_addsy
))
10702 switch (fix
->fx_r_type
)
10704 case BFD_RELOC_IA64_FPTR64I
:
10705 case BFD_RELOC_IA64_FPTR32MSB
:
10706 case BFD_RELOC_IA64_FPTR32LSB
:
10707 case BFD_RELOC_IA64_FPTR64MSB
:
10708 case BFD_RELOC_IA64_FPTR64LSB
:
10709 case BFD_RELOC_IA64_LTOFF_FPTR22
:
10710 case BFD_RELOC_IA64_LTOFF_FPTR64I
:
10720 ia64_force_relocation (fixS
*fix
)
10722 switch (fix
->fx_r_type
)
10724 case BFD_RELOC_IA64_FPTR64I
:
10725 case BFD_RELOC_IA64_FPTR32MSB
:
10726 case BFD_RELOC_IA64_FPTR32LSB
:
10727 case BFD_RELOC_IA64_FPTR64MSB
:
10728 case BFD_RELOC_IA64_FPTR64LSB
:
10730 case BFD_RELOC_IA64_LTOFF22
:
10731 case BFD_RELOC_IA64_LTOFF64I
:
10732 case BFD_RELOC_IA64_LTOFF_FPTR22
:
10733 case BFD_RELOC_IA64_LTOFF_FPTR64I
:
10734 case BFD_RELOC_IA64_PLTOFF22
:
10735 case BFD_RELOC_IA64_PLTOFF64I
:
10736 case BFD_RELOC_IA64_PLTOFF64MSB
:
10737 case BFD_RELOC_IA64_PLTOFF64LSB
:
10739 case BFD_RELOC_IA64_LTOFF22X
:
10740 case BFD_RELOC_IA64_LDXMOV
:
10747 return generic_force_reloc (fix
);
10750 /* Decide from what point a pc-relative relocation is relative to,
10751 relative to the pc-relative fixup. Er, relatively speaking. */
10753 ia64_pcrel_from_section (fixS
*fix
, segT sec
)
10755 unsigned long off
= fix
->fx_frag
->fr_address
+ fix
->fx_where
;
10757 if (bfd_get_section_flags (stdoutput
, sec
) & SEC_CODE
)
10764 /* Used to emit section-relative relocs for the dwarf2 debug data. */
10766 ia64_dwarf2_emit_offset (symbolS
*symbol
, unsigned int size
)
10770 expr
.X_op
= O_pseudo_fixup
;
10771 expr
.X_op_symbol
= pseudo_func
[FUNC_SEC_RELATIVE
].u
.sym
;
10772 expr
.X_add_number
= 0;
10773 expr
.X_add_symbol
= symbol
;
10774 emit_expr (&expr
, size
);
10777 /* This is called whenever some data item (not an instruction) needs a
10778 fixup. We pick the right reloc code depending on the byteorder
10779 currently in effect. */
10781 ia64_cons_fix_new (fragS
*f
, int where
, int nbytes
, expressionS
*exp
)
10783 bfd_reloc_code_real_type code
;
10788 /* There are no reloc for 8 and 16 bit quantities, but we allow
10789 them here since they will work fine as long as the expression
10790 is fully defined at the end of the pass over the source file. */
10791 case 1: code
= BFD_RELOC_8
; break;
10792 case 2: code
= BFD_RELOC_16
; break;
10794 if (target_big_endian
)
10795 code
= BFD_RELOC_IA64_DIR32MSB
;
10797 code
= BFD_RELOC_IA64_DIR32LSB
;
10801 /* In 32-bit mode, data8 could mean function descriptors too. */
10802 if (exp
->X_op
== O_pseudo_fixup
10803 && exp
->X_op_symbol
10804 && S_GET_VALUE (exp
->X_op_symbol
) == FUNC_IPLT_RELOC
10805 && !(md
.flags
& EF_IA_64_ABI64
))
10807 if (target_big_endian
)
10808 code
= BFD_RELOC_IA64_IPLTMSB
;
10810 code
= BFD_RELOC_IA64_IPLTLSB
;
10811 exp
->X_op
= O_symbol
;
10816 if (target_big_endian
)
10817 code
= BFD_RELOC_IA64_DIR64MSB
;
10819 code
= BFD_RELOC_IA64_DIR64LSB
;
10824 if (exp
->X_op
== O_pseudo_fixup
10825 && exp
->X_op_symbol
10826 && S_GET_VALUE (exp
->X_op_symbol
) == FUNC_IPLT_RELOC
)
10828 if (target_big_endian
)
10829 code
= BFD_RELOC_IA64_IPLTMSB
;
10831 code
= BFD_RELOC_IA64_IPLTLSB
;
10832 exp
->X_op
= O_symbol
;
10838 as_bad (_("Unsupported fixup size %d"), nbytes
);
10839 ignore_rest_of_line ();
10843 if (exp
->X_op
== O_pseudo_fixup
)
10845 exp
->X_op
= O_symbol
;
10846 code
= ia64_gen_real_reloc_type (exp
->X_op_symbol
, code
);
10847 /* ??? If code unchanged, unsupported. */
10850 fix
= fix_new_exp (f
, where
, nbytes
, exp
, 0, code
);
10851 /* We need to store the byte order in effect in case we're going
10852 to fix an 8 or 16 bit relocation (for which there no real
10853 relocs available). See md_apply_fix(). */
10854 fix
->tc_fix_data
.bigendian
= target_big_endian
;
10857 /* Return the actual relocation we wish to associate with the pseudo
10858 reloc described by SYM and R_TYPE. SYM should be one of the
10859 symbols in the pseudo_func array, or NULL. */
10861 static bfd_reloc_code_real_type
10862 ia64_gen_real_reloc_type (struct symbol
*sym
, bfd_reloc_code_real_type r_type
)
10864 bfd_reloc_code_real_type
new = 0;
10865 const char *type
= NULL
, *suffix
= "";
10872 switch (S_GET_VALUE (sym
))
10874 case FUNC_FPTR_RELATIVE
:
10877 case BFD_RELOC_IA64_IMM64
: new = BFD_RELOC_IA64_FPTR64I
; break;
10878 case BFD_RELOC_IA64_DIR32MSB
: new = BFD_RELOC_IA64_FPTR32MSB
; break;
10879 case BFD_RELOC_IA64_DIR32LSB
: new = BFD_RELOC_IA64_FPTR32LSB
; break;
10880 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_FPTR64MSB
; break;
10881 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_FPTR64LSB
; break;
10882 default: type
= "FPTR"; break;
10886 case FUNC_GP_RELATIVE
:
10889 case BFD_RELOC_IA64_IMM22
: new = BFD_RELOC_IA64_GPREL22
; break;
10890 case BFD_RELOC_IA64_IMM64
: new = BFD_RELOC_IA64_GPREL64I
; break;
10891 case BFD_RELOC_IA64_DIR32MSB
: new = BFD_RELOC_IA64_GPREL32MSB
; break;
10892 case BFD_RELOC_IA64_DIR32LSB
: new = BFD_RELOC_IA64_GPREL32LSB
; break;
10893 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_GPREL64MSB
; break;
10894 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_GPREL64LSB
; break;
10895 default: type
= "GPREL"; break;
10899 case FUNC_LT_RELATIVE
:
10902 case BFD_RELOC_IA64_IMM22
: new = BFD_RELOC_IA64_LTOFF22
; break;
10903 case BFD_RELOC_IA64_IMM64
: new = BFD_RELOC_IA64_LTOFF64I
; break;
10904 default: type
= "LTOFF"; break;
10908 case FUNC_LT_RELATIVE_X
:
10911 case BFD_RELOC_IA64_IMM22
: new = BFD_RELOC_IA64_LTOFF22X
; break;
10912 default: type
= "LTOFF"; suffix
= "X"; break;
10916 case FUNC_PC_RELATIVE
:
10919 case BFD_RELOC_IA64_IMM22
: new = BFD_RELOC_IA64_PCREL22
; break;
10920 case BFD_RELOC_IA64_IMM64
: new = BFD_RELOC_IA64_PCREL64I
; break;
10921 case BFD_RELOC_IA64_DIR32MSB
: new = BFD_RELOC_IA64_PCREL32MSB
; break;
10922 case BFD_RELOC_IA64_DIR32LSB
: new = BFD_RELOC_IA64_PCREL32LSB
; break;
10923 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_PCREL64MSB
; break;
10924 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_PCREL64LSB
; break;
10925 default: type
= "PCREL"; break;
10929 case FUNC_PLT_RELATIVE
:
10932 case BFD_RELOC_IA64_IMM22
: new = BFD_RELOC_IA64_PLTOFF22
; break;
10933 case BFD_RELOC_IA64_IMM64
: new = BFD_RELOC_IA64_PLTOFF64I
; break;
10934 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_PLTOFF64MSB
;break;
10935 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_PLTOFF64LSB
;break;
10936 default: type
= "PLTOFF"; break;
10940 case FUNC_SEC_RELATIVE
:
10943 case BFD_RELOC_IA64_DIR32MSB
: new = BFD_RELOC_IA64_SECREL32MSB
;break;
10944 case BFD_RELOC_IA64_DIR32LSB
: new = BFD_RELOC_IA64_SECREL32LSB
;break;
10945 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_SECREL64MSB
;break;
10946 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_SECREL64LSB
;break;
10947 default: type
= "SECREL"; break;
10951 case FUNC_SEG_RELATIVE
:
10954 case BFD_RELOC_IA64_DIR32MSB
: new = BFD_RELOC_IA64_SEGREL32MSB
;break;
10955 case BFD_RELOC_IA64_DIR32LSB
: new = BFD_RELOC_IA64_SEGREL32LSB
;break;
10956 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_SEGREL64MSB
;break;
10957 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_SEGREL64LSB
;break;
10958 default: type
= "SEGREL"; break;
10962 case FUNC_LTV_RELATIVE
:
10965 case BFD_RELOC_IA64_DIR32MSB
: new = BFD_RELOC_IA64_LTV32MSB
; break;
10966 case BFD_RELOC_IA64_DIR32LSB
: new = BFD_RELOC_IA64_LTV32LSB
; break;
10967 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_LTV64MSB
; break;
10968 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_LTV64LSB
; break;
10969 default: type
= "LTV"; break;
10973 case FUNC_LT_FPTR_RELATIVE
:
10976 case BFD_RELOC_IA64_IMM22
:
10977 new = BFD_RELOC_IA64_LTOFF_FPTR22
; break;
10978 case BFD_RELOC_IA64_IMM64
:
10979 new = BFD_RELOC_IA64_LTOFF_FPTR64I
; break;
10980 case BFD_RELOC_IA64_DIR32MSB
:
10981 new = BFD_RELOC_IA64_LTOFF_FPTR32MSB
; break;
10982 case BFD_RELOC_IA64_DIR32LSB
:
10983 new = BFD_RELOC_IA64_LTOFF_FPTR32LSB
; break;
10984 case BFD_RELOC_IA64_DIR64MSB
:
10985 new = BFD_RELOC_IA64_LTOFF_FPTR64MSB
; break;
10986 case BFD_RELOC_IA64_DIR64LSB
:
10987 new = BFD_RELOC_IA64_LTOFF_FPTR64LSB
; break;
10989 type
= "LTOFF_FPTR"; break;
10993 case FUNC_TP_RELATIVE
:
10996 case BFD_RELOC_IA64_IMM14
: new = BFD_RELOC_IA64_TPREL14
; break;
10997 case BFD_RELOC_IA64_IMM22
: new = BFD_RELOC_IA64_TPREL22
; break;
10998 case BFD_RELOC_IA64_IMM64
: new = BFD_RELOC_IA64_TPREL64I
; break;
10999 case BFD_RELOC_IA64_DIR64MSB
: new = BFD_RELOC_IA64_TPREL64MSB
; break;
11000 case BFD_RELOC_IA64_DIR64LSB
: new = BFD_RELOC_IA64_TPREL64LSB
; break;
11001 default: type
= "TPREL"; break;
11005 case FUNC_LT_TP_RELATIVE
:
11008 case BFD_RELOC_IA64_IMM22
:
11009 new = BFD_RELOC_IA64_LTOFF_TPREL22
; break;
11011 type
= "LTOFF_TPREL"; break;
11015 case FUNC_DTP_MODULE
:
11018 case BFD_RELOC_IA64_DIR64MSB
:
11019 new = BFD_RELOC_IA64_DTPMOD64MSB
; break;
11020 case BFD_RELOC_IA64_DIR64LSB
:
11021 new = BFD_RELOC_IA64_DTPMOD64LSB
; break;
11023 type
= "DTPMOD"; break;
11027 case FUNC_LT_DTP_MODULE
:
11030 case BFD_RELOC_IA64_IMM22
:
11031 new = BFD_RELOC_IA64_LTOFF_DTPMOD22
; break;
11033 type
= "LTOFF_DTPMOD"; break;
11037 case FUNC_DTP_RELATIVE
:
11040 case BFD_RELOC_IA64_DIR32MSB
:
11041 new = BFD_RELOC_IA64_DTPREL32MSB
; break;
11042 case BFD_RELOC_IA64_DIR32LSB
:
11043 new = BFD_RELOC_IA64_DTPREL32LSB
; break;
11044 case BFD_RELOC_IA64_DIR64MSB
:
11045 new = BFD_RELOC_IA64_DTPREL64MSB
; break;
11046 case BFD_RELOC_IA64_DIR64LSB
:
11047 new = BFD_RELOC_IA64_DTPREL64LSB
; break;
11048 case BFD_RELOC_IA64_IMM14
:
11049 new = BFD_RELOC_IA64_DTPREL14
; break;
11050 case BFD_RELOC_IA64_IMM22
:
11051 new = BFD_RELOC_IA64_DTPREL22
; break;
11052 case BFD_RELOC_IA64_IMM64
:
11053 new = BFD_RELOC_IA64_DTPREL64I
; break;
11055 type
= "DTPREL"; break;
11059 case FUNC_LT_DTP_RELATIVE
:
11062 case BFD_RELOC_IA64_IMM22
:
11063 new = BFD_RELOC_IA64_LTOFF_DTPREL22
; break;
11065 type
= "LTOFF_DTPREL"; break;
11069 case FUNC_IPLT_RELOC
:
11072 case BFD_RELOC_IA64_IPLTMSB
: return r_type
;
11073 case BFD_RELOC_IA64_IPLTLSB
: return r_type
;
11074 default: type
= "IPLT"; break;
11092 case BFD_RELOC_IA64_DIR32MSB
: width
= 32; suffix
= "MSB"; break;
11093 case BFD_RELOC_IA64_DIR32LSB
: width
= 32; suffix
= "LSB"; break;
11094 case BFD_RELOC_IA64_DIR64MSB
: width
= 64; suffix
= "MSB"; break;
11095 case BFD_RELOC_IA64_DIR64LSB
: width
= 64; suffix
= "LSB"; break;
11096 case BFD_RELOC_UNUSED
: width
= 13; break;
11097 case BFD_RELOC_IA64_IMM14
: width
= 14; break;
11098 case BFD_RELOC_IA64_IMM22
: width
= 22; break;
11099 case BFD_RELOC_IA64_IMM64
: width
= 64; suffix
= "I"; break;
11103 /* This should be an error, but since previously there wasn't any
11104 diagnostic here, don't make it fail because of this for now. */
11105 as_warn (_("Cannot express %s%d%s relocation"), type
, width
, suffix
);
11110 /* Here is where generate the appropriate reloc for pseudo relocation
11113 ia64_validate_fix (fixS
*fix
)
11115 switch (fix
->fx_r_type
)
11117 case BFD_RELOC_IA64_FPTR64I
:
11118 case BFD_RELOC_IA64_FPTR32MSB
:
11119 case BFD_RELOC_IA64_FPTR64LSB
:
11120 case BFD_RELOC_IA64_LTOFF_FPTR22
:
11121 case BFD_RELOC_IA64_LTOFF_FPTR64I
:
11122 if (fix
->fx_offset
!= 0)
11123 as_bad_where (fix
->fx_file
, fix
->fx_line
,
11124 _("No addend allowed in @fptr() relocation"));
11132 fix_insn (fixS
*fix
, const struct ia64_operand
*odesc
, valueT value
)
11134 bfd_vma insn
[3], t0
, t1
, control_bits
;
11139 slot
= fix
->fx_where
& 0x3;
11140 fixpos
= fix
->fx_frag
->fr_literal
+ (fix
->fx_where
- slot
);
11142 /* Bundles are always in little-endian byte order */
11143 t0
= bfd_getl64 (fixpos
);
11144 t1
= bfd_getl64 (fixpos
+ 8);
11145 control_bits
= t0
& 0x1f;
11146 insn
[0] = (t0
>> 5) & 0x1ffffffffffLL
;
11147 insn
[1] = ((t0
>> 46) & 0x3ffff) | ((t1
& 0x7fffff) << 18);
11148 insn
[2] = (t1
>> 23) & 0x1ffffffffffLL
;
11151 if (odesc
- elf64_ia64_operands
== IA64_OPND_IMMU64
)
11153 insn
[1] = (value
>> 22) & 0x1ffffffffffLL
;
11154 insn
[2] |= (((value
& 0x7f) << 13)
11155 | (((value
>> 7) & 0x1ff) << 27)
11156 | (((value
>> 16) & 0x1f) << 22)
11157 | (((value
>> 21) & 0x1) << 21)
11158 | (((value
>> 63) & 0x1) << 36));
11160 else if (odesc
- elf64_ia64_operands
== IA64_OPND_IMMU62
)
11162 if (value
& ~0x3fffffffffffffffULL
)
11163 err
= "integer operand out of range";
11164 insn
[1] = (value
>> 21) & 0x1ffffffffffLL
;
11165 insn
[2] |= (((value
& 0xfffff) << 6) | (((value
>> 20) & 0x1) << 36));
11167 else if (odesc
- elf64_ia64_operands
== IA64_OPND_TGT64
)
11170 insn
[1] = ((value
>> 20) & 0x7fffffffffLL
) << 2;
11171 insn
[2] |= ((((value
>> 59) & 0x1) << 36)
11172 | (((value
>> 0) & 0xfffff) << 13));
11175 err
= (*odesc
->insert
) (odesc
, value
, insn
+ slot
);
11178 as_bad_where (fix
->fx_file
, fix
->fx_line
, "%s", err
);
11180 t0
= control_bits
| (insn
[0] << 5) | (insn
[1] << 46);
11181 t1
= ((insn
[1] >> 18) & 0x7fffff) | (insn
[2] << 23);
11182 number_to_chars_littleendian (fixpos
+ 0, t0
, 8);
11183 number_to_chars_littleendian (fixpos
+ 8, t1
, 8);
11186 /* Attempt to simplify or even eliminate a fixup. The return value is
11187 ignored; perhaps it was once meaningful, but now it is historical.
11188 To indicate that a fixup has been eliminated, set FIXP->FX_DONE.
11190 If fixp->fx_addsy is non-NULL, we'll have to generate a reloc entry
11194 md_apply_fix (fixS
*fix
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
11197 valueT value
= *valP
;
11199 fixpos
= fix
->fx_frag
->fr_literal
+ fix
->fx_where
;
11203 switch (fix
->fx_r_type
)
11205 case BFD_RELOC_IA64_PCREL21B
: break;
11206 case BFD_RELOC_IA64_PCREL21BI
: break;
11207 case BFD_RELOC_IA64_PCREL21F
: break;
11208 case BFD_RELOC_IA64_PCREL21M
: break;
11209 case BFD_RELOC_IA64_PCREL60B
: break;
11210 case BFD_RELOC_IA64_PCREL22
: break;
11211 case BFD_RELOC_IA64_PCREL64I
: break;
11212 case BFD_RELOC_IA64_PCREL32MSB
: break;
11213 case BFD_RELOC_IA64_PCREL32LSB
: break;
11214 case BFD_RELOC_IA64_PCREL64MSB
: break;
11215 case BFD_RELOC_IA64_PCREL64LSB
: break;
11217 fix
->fx_r_type
= ia64_gen_real_reloc_type (pseudo_func
[FUNC_PC_RELATIVE
].u
.sym
,
11224 switch (fix
->fx_r_type
)
11226 case BFD_RELOC_UNUSED
:
11227 /* This must be a TAG13 or TAG13b operand. There are no external
11228 relocs defined for them, so we must give an error. */
11229 as_bad_where (fix
->fx_file
, fix
->fx_line
,
11230 _("%s must have a constant value"),
11231 elf64_ia64_operands
[fix
->tc_fix_data
.opnd
].desc
);
11235 case BFD_RELOC_IA64_TPREL14
:
11236 case BFD_RELOC_IA64_TPREL22
:
11237 case BFD_RELOC_IA64_TPREL64I
:
11238 case BFD_RELOC_IA64_LTOFF_TPREL22
:
11239 case BFD_RELOC_IA64_LTOFF_DTPMOD22
:
11240 case BFD_RELOC_IA64_DTPREL14
:
11241 case BFD_RELOC_IA64_DTPREL22
:
11242 case BFD_RELOC_IA64_DTPREL64I
:
11243 case BFD_RELOC_IA64_LTOFF_DTPREL22
:
11244 S_SET_THREAD_LOCAL (fix
->fx_addsy
);
11251 else if (fix
->tc_fix_data
.opnd
== IA64_OPND_NIL
)
11253 if (fix
->tc_fix_data
.bigendian
)
11254 number_to_chars_bigendian (fixpos
, value
, fix
->fx_size
);
11256 number_to_chars_littleendian (fixpos
, value
, fix
->fx_size
);
11261 fix_insn (fix
, elf64_ia64_operands
+ fix
->tc_fix_data
.opnd
, value
);
11266 /* Generate the BFD reloc to be stuck in the object file from the
11267 fixup used internally in the assembler. */
11270 tc_gen_reloc (asection
*sec ATTRIBUTE_UNUSED
, fixS
*fixp
)
11274 reloc
= xmalloc (sizeof (*reloc
));
11275 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
11276 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
11277 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
11278 reloc
->addend
= fixp
->fx_offset
;
11279 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
11283 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
11284 _("Cannot represent %s relocation in object file"),
11285 bfd_get_reloc_code_name (fixp
->fx_r_type
));
11292 /* Turn a string in input_line_pointer into a floating point constant
11293 of type TYPE, and store the appropriate bytes in *LIT. The number
11294 of LITTLENUMS emitted is stored in *SIZE. An error message is
11295 returned, or NULL on OK. */
11297 #define MAX_LITTLENUMS 5
11300 md_atof (int type
, char *lit
, int *size
)
11302 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
11332 return _("Unrecognized or unsupported floating point constant");
11334 t
= atof_ieee (input_line_pointer
, type
, words
);
11336 input_line_pointer
= t
;
11338 (*ia64_float_to_chars
) (lit
, words
, prec
);
11342 /* It is 10 byte floating point with 6 byte padding. */
11343 memset (&lit
[10], 0, 6);
11344 *size
= 8 * sizeof (LITTLENUM_TYPE
);
11347 *size
= prec
* sizeof (LITTLENUM_TYPE
);
11352 /* Handle ia64 specific semantics of the align directive. */
11355 ia64_md_do_align (int n ATTRIBUTE_UNUSED
,
11356 const char *fill ATTRIBUTE_UNUSED
,
11357 int len ATTRIBUTE_UNUSED
,
11358 int max ATTRIBUTE_UNUSED
)
11360 if (subseg_text_p (now_seg
))
11361 ia64_flush_insns ();
11364 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
11365 of an rs_align_code fragment. */
11368 ia64_handle_align (fragS
*fragp
)
11372 const unsigned char *nop
;
11374 if (fragp
->fr_type
!= rs_align_code
)
11377 /* Check if this frag has to end with a stop bit. */
11378 nop
= fragp
->tc_frag_data
? le_nop_stop
: le_nop
;
11380 bytes
= fragp
->fr_next
->fr_address
- fragp
->fr_address
- fragp
->fr_fix
;
11381 p
= fragp
->fr_literal
+ fragp
->fr_fix
;
11383 /* If no paddings are needed, we check if we need a stop bit. */
11384 if (!bytes
&& fragp
->tc_frag_data
)
11386 if (fragp
->fr_fix
< 16)
11388 /* FIXME: It won't work with
11390 alloc r32=ar.pfs,1,2,4,0
11394 as_bad_where (fragp
->fr_file
, fragp
->fr_line
,
11395 _("Can't add stop bit to mark end of instruction group"));
11398 /* Bundles are always in little-endian byte order. Make sure
11399 the previous bundle has the stop bit. */
11403 /* Make sure we are on a 16-byte boundary, in case someone has been
11404 putting data into a text section. */
11407 int fix
= bytes
& 15;
11408 memset (p
, 0, fix
);
11411 fragp
->fr_fix
+= fix
;
11414 /* Instruction bundles are always little-endian. */
11415 memcpy (p
, nop
, 16);
11416 fragp
->fr_var
= 16;
11420 ia64_float_to_chars_bigendian (char *lit
, LITTLENUM_TYPE
*words
,
11425 number_to_chars_bigendian (lit
, (long) (*words
++),
11426 sizeof (LITTLENUM_TYPE
));
11427 lit
+= sizeof (LITTLENUM_TYPE
);
11432 ia64_float_to_chars_littleendian (char *lit
, LITTLENUM_TYPE
*words
,
11437 number_to_chars_littleendian (lit
, (long) (words
[prec
]),
11438 sizeof (LITTLENUM_TYPE
));
11439 lit
+= sizeof (LITTLENUM_TYPE
);
11444 ia64_elf_section_change_hook (void)
11446 if (elf_section_type (now_seg
) == SHT_IA_64_UNWIND
11447 && elf_linked_to_section (now_seg
) == NULL
)
11448 elf_linked_to_section (now_seg
) = text_section
;
11449 dot_byteorder (-1);
11452 /* Check if a label should be made global. */
11454 ia64_check_label (symbolS
*label
)
11456 if (*input_line_pointer
== ':')
11458 S_SET_EXTERNAL (label
);
11459 input_line_pointer
++;
11463 /* Used to remember where .alias and .secalias directives are seen. We
11464 will rename symbol and section names when we are about to output
11465 the relocatable file. */
11468 char *file
; /* The file where the directive is seen. */
11469 unsigned int line
; /* The line number the directive is at. */
11470 const char *name
; /* The original name of the symbol. */
11473 /* Called for .alias and .secalias directives. If SECTION is 1, it is
11474 .secalias. Otherwise, it is .alias. */
11476 dot_alias (int section
)
11478 char *name
, *alias
;
11482 const char *error_string
;
11485 struct hash_control
*ahash
, *nhash
;
11488 name
= input_line_pointer
;
11489 delim
= get_symbol_end ();
11490 end_name
= input_line_pointer
;
11493 if (name
== end_name
)
11495 as_bad (_("expected symbol name"));
11496 ignore_rest_of_line ();
11500 SKIP_WHITESPACE ();
11502 if (*input_line_pointer
!= ',')
11505 as_bad (_("expected comma after \"%s\""), name
);
11507 ignore_rest_of_line ();
11511 input_line_pointer
++;
11513 ia64_canonicalize_symbol_name (name
);
11515 /* We call demand_copy_C_string to check if alias string is valid.
11516 There should be a closing `"' and no `\0' in the string. */
11517 alias
= demand_copy_C_string (&len
);
11520 ignore_rest_of_line ();
11524 /* Make a copy of name string. */
11525 len
= strlen (name
) + 1;
11526 obstack_grow (¬es
, name
, len
);
11527 name
= obstack_finish (¬es
);
11532 ahash
= secalias_hash
;
11533 nhash
= secalias_name_hash
;
11538 ahash
= alias_hash
;
11539 nhash
= alias_name_hash
;
11542 /* Check if alias has been used before. */
11543 h
= (struct alias
*) hash_find (ahash
, alias
);
11546 if (strcmp (h
->name
, name
))
11547 as_bad (_("`%s' is already the alias of %s `%s'"),
11548 alias
, kind
, h
->name
);
11552 /* Check if name already has an alias. */
11553 a
= (const char *) hash_find (nhash
, name
);
11556 if (strcmp (a
, alias
))
11557 as_bad (_("%s `%s' already has an alias `%s'"), kind
, name
, a
);
11561 h
= (struct alias
*) xmalloc (sizeof (struct alias
));
11562 as_where (&h
->file
, &h
->line
);
11565 error_string
= hash_jam (ahash
, alias
, (void *) h
);
11568 as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
11569 alias
, kind
, error_string
);
11573 error_string
= hash_jam (nhash
, name
, (void *) alias
);
11576 as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
11577 alias
, kind
, error_string
);
11579 obstack_free (¬es
, name
);
11580 obstack_free (¬es
, alias
);
11583 demand_empty_rest_of_line ();
11586 /* It renames the original symbol name to its alias. */
11588 do_alias (const char *alias
, void *value
)
11590 struct alias
*h
= (struct alias
*) value
;
11591 symbolS
*sym
= symbol_find (h
->name
);
11596 /* Uses .alias extensively to alias CRTL functions to same with
11597 decc$ prefix. Sometimes function gets optimized away and a
11598 warning results, which should be suppressed. */
11599 if (strncmp (alias
, "decc$", 5) != 0)
11601 as_warn_where (h
->file
, h
->line
,
11602 _("symbol `%s' aliased to `%s' is not used"),
11606 S_SET_NAME (sym
, (char *) alias
);
11609 /* Called from write_object_file. */
11611 ia64_adjust_symtab (void)
11613 hash_traverse (alias_hash
, do_alias
);
11616 /* It renames the original section name to its alias. */
11618 do_secalias (const char *alias
, void *value
)
11620 struct alias
*h
= (struct alias
*) value
;
11621 segT sec
= bfd_get_section_by_name (stdoutput
, h
->name
);
11624 as_warn_where (h
->file
, h
->line
,
11625 _("section `%s' aliased to `%s' is not used"),
11631 /* Called from write_object_file. */
11633 ia64_frob_file (void)
11635 hash_traverse (secalias_hash
, do_secalias
);
11639 #define NT_VMS_MHD 1
11640 #define NT_VMS_LNM 2
11642 /* Integrity VMS 8.x identifies it's ELF modules with a standard ELF
11645 /* Manufacture a VMS-like time string. */
11647 get_vms_time (char *Now
)
11653 pnt
= ctime (&timeb
);
11659 sprintf (Now
, "%2s-%3s-%s %s", pnt
+ 8, pnt
+ 4, pnt
+ 20, pnt
+ 11);
11663 ia64_vms_note (void)
11666 asection
*seg
= now_seg
;
11667 subsegT subseg
= now_subseg
;
11668 Elf_Internal_Note i_note
;
11669 asection
*secp
= NULL
;
11670 char *basec
, *bname
;
11674 /* Create the .note section. */
11676 secp
= subseg_new (".note", 0);
11677 bfd_set_section_flags (stdoutput
,
11679 SEC_HAS_CONTENTS
| SEC_READONLY
);
11681 /* Module header note. */
11682 basec
= xstrdup (out_file_name
);
11683 bname
= basename (basec
);
11684 if ((p
= strrchr (bname
, '.')))
11688 i_note
.descsz
= 40 + strlen (bname
);
11689 i_note
.type
= NT_VMS_MHD
;
11691 p
= frag_more (sizeof (i_note
.namesz
));
11692 number_to_chars_littleendian (p
, i_note
.namesz
, 8);
11694 p
= frag_more (sizeof (i_note
.descsz
));
11695 number_to_chars_littleendian (p
, i_note
.descsz
, 8);
11697 p
= frag_more (sizeof (i_note
.type
));
11698 number_to_chars_littleendian (p
, i_note
.type
, 8);
11701 strcpy (p
, "IPF/VMS");
11703 get_vms_time (buf
);
11704 p
= frag_more (17);
11707 p
= frag_more (17);
11708 strcpy (p
, "24-FEB-2005 15:00");
11710 p
= frag_more (strlen (bname
) + 1);
11714 strcpy (p
, "V1.0");
11716 frag_align (3, 0, 0);
11718 /* Language processor name note. */
11719 sprintf (buf
, "GNU assembler version %s (%s) using BFD version %s",
11720 VERSION
, TARGET_ALIAS
, BFD_VERSION_STRING
);
11723 i_note
.descsz
= 1 + strlen (buf
);
11724 i_note
.type
= NT_VMS_LNM
;
11726 p
= frag_more (sizeof (i_note
.namesz
));
11727 number_to_chars_littleendian (p
, i_note
.namesz
, 8);
11729 p
= frag_more (sizeof (i_note
.descsz
));
11730 number_to_chars_littleendian (p
, i_note
.descsz
, 8);
11732 p
= frag_more (sizeof (i_note
.type
));
11733 number_to_chars_littleendian (p
, i_note
.type
, 8);
11736 strcpy (p
, "IPF/VMS");
11738 p
= frag_more (strlen (buf
) + 1);
11741 frag_align (3, 0, 0);
11743 secp
= subseg_new (".vms_display_name_info", 0);
11744 bfd_set_section_flags (stdoutput
,
11746 SEC_HAS_CONTENTS
| SEC_READONLY
);
11748 /* This symbol should be passed on the command line and be variable
11749 according to language. */
11750 sym
= symbol_new ("__gnat_vms_display_name@gnat_demangler_rtl",
11751 absolute_section
, 0, &zero_address_frag
);
11752 symbol_table_insert (sym
);
11753 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
| BSF_DYNAMIC
;
11756 /* Format 3 of VMS demangler Spec. */
11757 number_to_chars_littleendian (p
, 3, 4);
11760 /* Place holder for symbol table index of above symbol. */
11761 number_to_chars_littleendian (p
, -1, 4);
11763 frag_align (3, 0, 0);
11765 /* We probably can't restore the current segment, for there likely
11766 isn't one yet... */
11768 subseg_set (seg
, subseg
);
11771 #endif /* TE_VMS */