1 /* tc-i386.c -- Assemble code for the Intel 80386
2 Copyright (C) 1989-2024 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 /* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
23 x86_64 support by Jan Hubicka (jh@suse.cz)
24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
29 #include "safe-ctype.h"
31 #include "dwarf2dbg.h"
32 #include "dw2gencfi.h"
34 #include "gen-sframe.h"
36 #include "elf/x86-64.h"
37 #include "opcodes/i386-init.h"
38 #include "opcodes/i386-mnem.h"
41 #ifndef INFER_ADDR_PREFIX
42 #define INFER_ADDR_PREFIX 1
46 #define DEFAULT_ARCH "i386"
51 #define INLINE __inline__
57 /* Prefixes will be emitted in the order defined below.
58 WAIT_PREFIX must be the first prefix since FWAIT is really is an
59 instruction, and so must come before any prefixes.
60 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
61 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
67 #define HLE_PREFIX REP_PREFIX
68 #define BND_PREFIX REP_PREFIX
70 #define REX_PREFIX 6 /* must come last. */
71 #define MAX_PREFIXES 7 /* max prefixes per opcode */
73 /* we define the syntax here (modulo base,index,scale syntax) */
74 #define REGISTER_PREFIX '%'
75 #define IMMEDIATE_PREFIX '$'
76 #define ABSOLUTE_PREFIX '*'
78 /* these are the instruction mnemonic suffixes in AT&T syntax or
79 memory operand size in Intel syntax. */
80 #define WORD_MNEM_SUFFIX 'w'
81 #define BYTE_MNEM_SUFFIX 'b'
82 #define SHORT_MNEM_SUFFIX 's'
83 #define LONG_MNEM_SUFFIX 'l'
84 #define QWORD_MNEM_SUFFIX 'q'
86 #define END_OF_INSN '\0'
88 #define OPERAND_TYPE_NONE { .bitfield = { .class = ClassNone } }
90 /* This matches the C -> StaticRounding alias in the opcode table. */
91 #define commutative staticrounding
94 'templates' is for grouping together 'template' structures for opcodes
95 of the same name. This is only used for storing the insns in the grand
96 ole hash table of insns.
97 The templates themselves start at START and range up to (but not including)
102 const insn_template
*start
;
103 const insn_template
*end
;
107 /* 386 operand encoding bytes: see 386 book for details of this. */
110 unsigned int regmem
; /* codes register or memory operand */
111 unsigned int reg
; /* codes register operand (or extended opcode) */
112 unsigned int mode
; /* how to interpret regmem & reg */
116 /* x86-64 extension prefix. */
117 typedef int rex_byte
;
119 /* 386 opcode byte to code indirect addressing. */
128 /* x86 arch names, types and features */
131 const char *name
; /* arch name */
132 unsigned int len
:8; /* arch string length */
133 bool skip
:1; /* show_arch should skip this. */
134 enum processor_type type
; /* arch type */
135 enum { vsz_none
, vsz_set
, vsz_reset
} vsz
; /* vector size control */
136 i386_cpu_flags enable
; /* cpu feature enable flags */
137 i386_cpu_flags disable
; /* cpu feature disable flags */
141 static void update_code_flag (int, int);
142 static void s_insn (int);
143 static void s_noopt (int);
144 static void set_code_flag (int);
145 static void set_16bit_gcc_code_flag (int);
146 static void set_intel_syntax (int);
147 static void set_intel_mnemonic (int);
148 static void set_allow_index_reg (int);
149 static void set_check (int);
150 static void set_cpu_arch (int);
152 static void pe_directive_secrel (int);
153 static void pe_directive_secidx (int);
155 static void signed_cons (int);
156 static char *output_invalid (int c
);
157 static int i386_finalize_immediate (segT
, expressionS
*, i386_operand_type
,
159 static int i386_finalize_displacement (segT
, expressionS
*, i386_operand_type
,
161 static int i386_att_operand (char *);
162 static int i386_intel_operand (char *, int);
163 static int i386_intel_simplify (expressionS
*);
164 static int i386_intel_parse_name (const char *, expressionS
*);
165 static const reg_entry
*parse_register (const char *, char **);
166 static const char *parse_insn (const char *, char *, bool);
167 static char *parse_operands (char *, const char *);
168 static void swap_operands (void);
169 static void swap_2_operands (unsigned int, unsigned int);
170 static enum i386_flag_code
i386_addressing_mode (void);
171 static void optimize_imm (void);
172 static bool optimize_disp (const insn_template
*t
);
173 static const insn_template
*match_template (char);
174 static int check_string (void);
175 static int process_suffix (void);
176 static int check_byte_reg (void);
177 static int check_long_reg (void);
178 static int check_qword_reg (void);
179 static int check_word_reg (void);
180 static int finalize_imm (void);
181 static int process_operands (void);
182 static const reg_entry
*build_modrm_byte (void);
183 static void output_insn (const struct last_insn
*);
184 static void output_imm (fragS
*, offsetT
);
185 static void output_disp (fragS
*, offsetT
);
187 static void s_bss (int);
189 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
190 static void handle_large_common (int small ATTRIBUTE_UNUSED
);
192 /* GNU_PROPERTY_X86_ISA_1_USED. */
193 static unsigned int x86_isa_1_used
;
194 /* GNU_PROPERTY_X86_FEATURE_2_USED. */
195 static unsigned int x86_feature_2_used
;
196 /* Generate x86 used ISA and feature properties. */
197 static unsigned int x86_used_note
= DEFAULT_X86_USED_NOTE
;
200 static const char *default_arch
= DEFAULT_ARCH
;
202 /* parse_register() returns this when a register alias cannot be used. */
203 static const reg_entry bad_reg
= { "<bad>", OPERAND_TYPE_NONE
, 0, 0,
204 { Dw2Inval
, Dw2Inval
} };
206 static const reg_entry
*reg_eax
;
207 static const reg_entry
*reg_ds
;
208 static const reg_entry
*reg_es
;
209 static const reg_entry
*reg_ss
;
210 static const reg_entry
*reg_st0
;
211 static const reg_entry
*reg_k0
;
216 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
217 unsigned char bytes
[4];
219 /* Destination or source register specifier. */
220 const reg_entry
*register_specifier
;
223 /* 'md_assemble ()' gathers together information and puts it into a
230 const reg_entry
*regs
;
235 no_error
, /* Must be first. */
236 operand_size_mismatch
,
237 operand_type_mismatch
,
238 register_type_mismatch
,
239 number_of_operands_mismatch
,
240 invalid_instruction_suffix
,
242 unsupported_with_intel_mnemonic
,
244 unsupported_EGPR_for_addressing
,
252 invalid_vsib_address
,
253 invalid_vector_register_set
,
254 invalid_tmm_register_set
,
255 invalid_dest_and_src_register_set
,
256 invalid_dest_register_set
,
257 invalid_pseudo_prefix
,
258 unsupported_vector_index_register
,
259 unsupported_broadcast
,
262 mask_not_on_destination
,
265 unsupported_vector_size
,
266 unsupported_rsp_register
,
272 /* TM holds the template for the insn were currently assembling. */
275 /* SUFFIX holds the instruction size suffix for byte, word, dword
276 or qword, if given. */
279 /* OPCODE_LENGTH holds the number of base opcode bytes. */
280 unsigned char opcode_length
;
282 /* OPERANDS gives the number of given operands. */
283 unsigned int operands
;
285 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
286 of given register, displacement, memory operands and immediate
288 unsigned int reg_operands
, disp_operands
, mem_operands
, imm_operands
;
290 /* TYPES [i] is the type (see above #defines) which tells us how to
291 use OP[i] for the corresponding operand. */
292 i386_operand_type types
[MAX_OPERANDS
];
294 /* Displacement expression, immediate expression, or register for each
296 union i386_op op
[MAX_OPERANDS
];
298 /* Flags for operands. */
299 unsigned int flags
[MAX_OPERANDS
];
300 #define Operand_PCrel 1
301 #define Operand_Mem 2
302 #define Operand_Signed 4 /* .insn only */
304 /* Relocation type for operand */
305 enum bfd_reloc_code_real reloc
[MAX_OPERANDS
];
307 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
308 the base index byte below. */
309 const reg_entry
*base_reg
;
310 const reg_entry
*index_reg
;
311 unsigned int log2_scale_factor
;
313 /* SEG gives the seg_entries of this insn. They are zero unless
314 explicit segment overrides are given. */
315 const reg_entry
*seg
[2];
317 /* PREFIX holds all the given prefix opcodes (usually null).
318 PREFIXES is the number of prefix opcodes. */
319 unsigned int prefixes
;
320 unsigned char prefix
[MAX_PREFIXES
];
322 /* .insn allows for reserved opcode spaces. */
323 unsigned char insn_opcode_space
;
325 /* .insn also allows (requires) specifying immediate size. */
326 unsigned char imm_bits
[MAX_OPERANDS
];
328 /* Register is in low 3 bits of opcode. */
331 /* The operand to a branch insn indicates an absolute branch. */
334 /* The operand to a branch insn indicates a far branch. */
337 /* There is a memory operand of (%dx) which should be only used
338 with input/output instructions. */
339 bool input_output_operand
;
341 /* Extended states. */
349 xstate_ymm
= 1 << 2 | xstate_xmm
,
351 xstate_zmm
= 1 << 3 | xstate_ymm
,
354 /* Use MASK state. */
358 /* Has GOTPC or TLS relocation. */
359 bool has_gotpc_tls_reloc
;
361 /* RM and SIB are the modrm byte and the sib byte where the
362 addressing modes of this insn are encoded. */
370 /* Masking attributes.
372 The struct describes masking, applied to OPERAND in the instruction.
373 REG is a pointer to the corresponding mask register. ZEROING tells
374 whether merging or zeroing mask is used. */
375 struct Mask_Operation
377 const reg_entry
*reg
;
378 unsigned int zeroing
;
379 /* The operand where this operation is associated. */
380 unsigned int operand
;
383 /* Rounding control and SAE attributes. */
395 /* In Intel syntax the operand modifier form is supposed to be used, but
396 we continue to accept the immediate forms as well. */
400 /* Broadcasting attributes.
402 The struct describes broadcasting, applied to OPERAND. TYPE is
403 expresses the broadcast factor. */
404 struct Broadcast_Operation
406 /* Type of broadcast: {1to2}, {1to4}, {1to8}, {1to16} or {1to32}. */
409 /* Index of broadcasted operand. */
410 unsigned int operand
;
412 /* Number of bytes to broadcast. */
416 /* Compressed disp8*N attribute. */
417 unsigned int memshift
;
419 /* Prefer load or store in encoding. */
422 dir_encoding_default
= 0,
428 /* Prefer 8bit, 16bit, 32bit displacement in encoding. */
431 disp_encoding_default
= 0,
437 /* Prefer the REX byte in encoding. */
440 /* Prefer the REX2 prefix in encoding. */
443 /* No CSPAZO flags update. */
446 /* Disable instruction size optimization. */
449 /* How to encode instructions. */
452 encoding_default
= 0,
455 encoding_egpr
, /* REX2 or EVEX. */
462 const char *rep_prefix
;
465 const char *hle_prefix
;
467 /* Have BND prefix. */
468 const char *bnd_prefix
;
470 /* Have NOTRACK prefix. */
471 const char *notrack_prefix
;
474 enum i386_error error
;
477 typedef struct _i386_insn i386_insn
;
479 /* Link RC type with corresponding string, that'll be looked for in
488 static const struct RC_name RC_NamesTable
[] =
490 { rne
, STRING_COMMA_LEN ("rn-sae") },
491 { rd
, STRING_COMMA_LEN ("rd-sae") },
492 { ru
, STRING_COMMA_LEN ("ru-sae") },
493 { rz
, STRING_COMMA_LEN ("rz-sae") },
494 { saeonly
, STRING_COMMA_LEN ("sae") },
497 /* To be indexed by segment register number. */
498 static const unsigned char i386_seg_prefixes
[] = {
507 /* List of chars besides those in app.c:symbol_chars that can start an
508 operand. Used to prevent the scrubber eating vital white-space. */
509 const char extra_symbol_chars
[] = "*%-([{}"
518 #if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
519 && !defined (TE_GNU) \
520 && !defined (TE_LINUX) \
521 && !defined (TE_Haiku) \
522 && !defined (TE_FreeBSD) \
523 && !defined (TE_DragonFly) \
524 && !defined (TE_NetBSD))
525 /* This array holds the chars that always start a comment. If the
526 pre-processor is disabled, these aren't very useful. The option
527 --divide will remove '/' from this list. */
528 const char *i386_comment_chars
= "#/";
529 #define SVR4_COMMENT_CHARS 1
530 #define PREFIX_SEPARATOR '\\'
533 const char *i386_comment_chars
= "#";
534 #define PREFIX_SEPARATOR '/'
537 /* This array holds the chars that only start a comment at the beginning of
538 a line. If the line seems to have the form '# 123 filename'
539 .line and .file directives will appear in the pre-processed output.
540 Note that input_file.c hand checks for '#' at the beginning of the
541 first line of the input file. This is because the compiler outputs
542 #NO_APP at the beginning of its output.
543 Also note that comments started like this one will always work if
544 '/' isn't otherwise defined. */
545 const char line_comment_chars
[] = "#/";
547 const char line_separator_chars
[] = ";";
549 /* Chars that can be used to separate mant from exp in floating point
551 const char EXP_CHARS
[] = "eE";
553 /* Chars that mean this number is a floating point constant
556 const char FLT_CHARS
[] = "fFdDxXhHbB";
558 /* Tables for lexical analysis. */
559 static char mnemonic_chars
[256];
560 static char register_chars
[256];
561 static char operand_chars
[256];
563 /* Lexical macros. */
564 #define is_operand_char(x) (operand_chars[(unsigned char) x])
565 #define is_register_char(x) (register_chars[(unsigned char) x])
566 #define is_space_char(x) ((x) == ' ')
568 /* All non-digit non-letter characters that may occur in an operand and
569 which aren't already in extra_symbol_chars[]. */
570 static const char operand_special_chars
[] = "$+,)._~/<>|&^!=:@]";
572 /* md_assemble() always leaves the strings it's passed unaltered. To
573 effect this we maintain a stack of saved characters that we've smashed
574 with '\0's (indicating end of strings for various sub-fields of the
575 assembler instruction). */
576 static char save_stack
[32];
577 static char *save_stack_p
;
578 #define END_STRING_AND_SAVE(s) \
579 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
580 #define RESTORE_END_STRING(s) \
581 do { *(s) = *--save_stack_p; } while (0)
583 /* The instruction we're assembling. */
586 /* Possible templates for current insn. */
587 static templates current_templates
;
589 /* Per instruction expressionS buffers: max displacements & immediates. */
590 static expressionS disp_expressions
[MAX_MEMORY_OPERANDS
];
591 static expressionS im_expressions
[MAX_IMMEDIATE_OPERANDS
];
593 /* Current operand we are working on. */
594 static int this_operand
= -1;
596 /* Are we processing a .insn directive? */
597 #define dot_insn() (i.tm.mnem_off == MN__insn)
599 enum i386_flag_code i386_flag_code
;
600 #define flag_code i386_flag_code /* Permit to continue using original name. */
601 static unsigned int object_64bit
;
602 static unsigned int disallow_64bit_reloc
;
603 static int use_rela_relocations
= 0;
604 /* __tls_get_addr/___tls_get_addr symbol for TLS. */
605 static const char *tls_get_addr
;
607 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
609 /* The ELF ABI to use. */
617 static enum x86_elf_abi x86_elf_abi
= I386_ABI
;
620 #if defined (TE_PE) || defined (TE_PEP)
621 /* Use big object file format. */
622 static int use_big_obj
= 0;
625 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
626 /* 1 if generating code for a shared library. */
627 static int shared
= 0;
629 unsigned int x86_sframe_cfa_sp_reg
;
630 /* The other CFA base register for SFrame stack trace info. */
631 unsigned int x86_sframe_cfa_fp_reg
;
632 unsigned int x86_sframe_cfa_ra_reg
;
636 /* 1 for intel syntax,
638 static int intel_syntax
= 0;
640 static enum x86_64_isa
642 amd64
= 1, /* AMD64 ISA. */
643 intel64
/* Intel64 ISA. */
646 /* 1 for intel mnemonic,
647 0 if att mnemonic. */
648 static int intel_mnemonic
= !SYSV386_COMPAT
;
650 /* 1 if pseudo registers are permitted. */
651 static int allow_pseudo_reg
= 0;
653 /* 1 if register prefix % not required. */
654 static int allow_naked_reg
= 0;
656 /* 1 if the assembler should add BND prefix for all control-transferring
657 instructions supporting it, even if this prefix wasn't specified
659 static int add_bnd_prefix
= 0;
661 /* 1 if pseudo index register, eiz/riz, is allowed . */
662 static int allow_index_reg
= 0;
664 /* 1 if the assembler should ignore LOCK prefix, even if it was
665 specified explicitly. */
666 static int omit_lock_prefix
= 0;
668 /* 1 if the assembler should encode lfence, mfence, and sfence as
669 "lock addl $0, (%{re}sp)". */
670 static int avoid_fence
= 0;
672 /* 1 if lfence should be inserted after every load. */
673 static int lfence_after_load
= 0;
675 /* Non-zero if lfence should be inserted before indirect branch. */
676 static enum lfence_before_indirect_branch_kind
678 lfence_branch_none
= 0,
679 lfence_branch_register
,
680 lfence_branch_memory
,
683 lfence_before_indirect_branch
;
685 /* Non-zero if lfence should be inserted before ret. */
686 static enum lfence_before_ret_kind
688 lfence_before_ret_none
= 0,
689 lfence_before_ret_not
,
690 lfence_before_ret_or
,
691 lfence_before_ret_shl
695 /* 1 if the assembler should generate relax relocations. */
697 static int generate_relax_relocations
698 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS
;
700 static enum check_kind
706 sse_check
, operand_check
= check_warning
;
708 /* Non-zero if branches should be aligned within power of 2 boundary. */
709 static int align_branch_power
= 0;
711 /* Types of branches to align. */
712 enum align_branch_kind
714 align_branch_none
= 0,
715 align_branch_jcc
= 1,
716 align_branch_fused
= 2,
717 align_branch_jmp
= 3,
718 align_branch_call
= 4,
719 align_branch_indirect
= 5,
723 /* Type bits of branches to align. */
724 enum align_branch_bit
726 align_branch_jcc_bit
= 1 << align_branch_jcc
,
727 align_branch_fused_bit
= 1 << align_branch_fused
,
728 align_branch_jmp_bit
= 1 << align_branch_jmp
,
729 align_branch_call_bit
= 1 << align_branch_call
,
730 align_branch_indirect_bit
= 1 << align_branch_indirect
,
731 align_branch_ret_bit
= 1 << align_branch_ret
734 static unsigned int align_branch
= (align_branch_jcc_bit
735 | align_branch_fused_bit
736 | align_branch_jmp_bit
);
738 /* Types of condition jump used by macro-fusion. */
741 mf_jcc_jo
= 0, /* base opcode 0x70 */
742 mf_jcc_jc
, /* base opcode 0x72 */
743 mf_jcc_je
, /* base opcode 0x74 */
744 mf_jcc_jna
, /* base opcode 0x76 */
745 mf_jcc_js
, /* base opcode 0x78 */
746 mf_jcc_jp
, /* base opcode 0x7a */
747 mf_jcc_jl
, /* base opcode 0x7c */
748 mf_jcc_jle
, /* base opcode 0x7e */
751 /* Types of compare flag-modifying insntructions used by macro-fusion. */
754 mf_cmp_test_and
, /* test/cmp */
755 mf_cmp_alu_cmp
, /* add/sub/cmp */
756 mf_cmp_incdec
/* inc/dec */
759 /* The maximum padding size for fused jcc. CMP like instruction can
760 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
762 #define MAX_FUSED_JCC_PADDING_SIZE 20
764 /* The maximum number of prefixes added for an instruction. */
765 static unsigned int align_branch_prefix_size
= 5;
768 1. Clear the REX_W bit with register operand if possible.
769 2. Above plus use 128bit vector instruction to clear the full vector
772 static int optimize
= 0;
775 1. Clear the REX_W bit with register operand if possible.
776 2. Above plus use 128bit vector instruction to clear the full vector
778 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
781 static int optimize_for_space
= 0;
783 /* Register prefix used for error message. */
784 static const char *register_prefix
= "%";
786 /* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
787 leave, push, and pop instructions so that gcc has the same stack
788 frame as in 32 bit mode. */
789 static char stackop_size
= '\0';
791 /* Non-zero to optimize code alignment. */
792 int optimize_align_code
= 1;
794 /* Non-zero to quieten some warnings. */
795 static int quiet_warnings
= 0;
797 /* Guard to avoid repeated warnings about non-16-bit code on 16-bit CPUs. */
798 static bool pre_386_16bit_warned
;
801 static const char *cpu_arch_name
= NULL
;
802 static char *cpu_sub_arch_name
= NULL
;
804 /* CPU feature flags. */
805 i386_cpu_flags cpu_arch_flags
= CPU_UNKNOWN_FLAGS
;
807 /* ISA extensions available in 64-bit mode only. */
808 static const i386_cpu_flags cpu_64_flags
= CPU_ANY_64_FLAGS
;
810 /* If we have selected a cpu we are generating instructions for. */
811 static int cpu_arch_tune_set
= 0;
813 /* Cpu we are generating instructions for. */
814 enum processor_type cpu_arch_tune
= PROCESSOR_UNKNOWN
;
816 /* CPU instruction set architecture used. */
817 enum processor_type cpu_arch_isa
= PROCESSOR_UNKNOWN
;
819 /* CPU feature flags of instruction set architecture used. */
820 i386_cpu_flags cpu_arch_isa_flags
;
822 /* If set, conditional jumps are not automatically promoted to handle
823 larger than a byte offset. */
824 static bool no_cond_jump_promotion
= false;
826 /* This will be set from an expression parser hook if there's any
827 applicable operator involved in an expression. */
830 expr_operator_present
,
834 /* Encode SSE instructions with VEX prefix. */
835 static unsigned int sse2avx
;
837 /* Encode aligned vector move as unaligned vector move. */
838 static unsigned int use_unaligned_vector_move
;
840 /* Maximum permitted vector size. */
844 #define VSZ_DEFAULT VSZ512
845 static unsigned int vector_size
= VSZ_DEFAULT
;
847 /* Encode scalar AVX instructions with specific vector length. */
854 /* Encode VEX WIG instructions with specific vex.w. */
861 /* Encode scalar EVEX LIG instructions with specific vector length. */
869 /* Encode EVEX WIG instructions with specific evex.w. */
876 /* Value to encode in EVEX RC bits, for SAE-only instructions. */
877 static enum rc_type evexrcig
= rne
;
879 /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
880 static symbolS
*GOT_symbol
;
882 /* The dwarf2 return column, adjusted for 32 or 64 bit. */
883 unsigned int x86_dwarf2_return_column
;
885 /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
886 int x86_cie_data_alignment
;
888 /* Interface to relax_segment.
889 There are 3 major relax states for 386 jump insns because the
890 different types of jumps add different sizes to frags when we're
891 figuring out what sort of jump to choose to reach a given label.
893 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
894 branches which are handled by md_estimate_size_before_relax() and
895 i386_generic_table_relax_frag(). */
898 #define UNCOND_JUMP 0
900 #define COND_JUMP86 2
901 #define BRANCH_PADDING 3
902 #define BRANCH_PREFIX 4
903 #define FUSED_JCC_PADDING 5
908 #define SMALL16 (SMALL | CODE16)
910 #define BIG16 (BIG | CODE16)
914 #define INLINE __inline__
920 #define ENCODE_RELAX_STATE(type, size) \
921 ((relax_substateT) (((type) << 2) | (size)))
922 #define TYPE_FROM_RELAX_STATE(s) \
924 #define DISP_SIZE_FROM_RELAX_STATE(s) \
925 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
927 /* This table is used by relax_frag to promote short jumps to long
928 ones where necessary. SMALL (short) jumps may be promoted to BIG
929 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
930 don't allow a short jump in a 32 bit code segment to be promoted to
931 a 16 bit offset jump because it's slower (requires data size
932 prefix), and doesn't work, unless the destination is in the bottom
933 64k of the code segment (The top 16 bits of eip are zeroed). */
935 const relax_typeS md_relax_table
[] =
938 1) most positive reach of this state,
939 2) most negative reach of this state,
940 3) how many bytes this mode will have in the variable part of the frag
941 4) which index into the table to try if we can't fit into this one. */
943 /* UNCOND_JUMP states. */
944 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG
)},
945 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG16
)},
946 /* dword jmp adds 4 bytes to frag:
947 0 extra opcode bytes, 4 displacement bytes. */
949 /* word jmp adds 2 byte2 to frag:
950 0 extra opcode bytes, 2 displacement bytes. */
953 /* COND_JUMP states. */
954 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP
, BIG
)},
955 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP
, BIG16
)},
956 /* dword conditionals adds 5 bytes to frag:
957 1 extra opcode byte, 4 displacement bytes. */
959 /* word conditionals add 3 bytes to frag:
960 1 extra opcode byte, 2 displacement bytes. */
963 /* COND_JUMP86 states. */
964 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86
, BIG
)},
965 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86
, BIG16
)},
966 /* dword conditionals adds 5 bytes to frag:
967 1 extra opcode byte, 4 displacement bytes. */
969 /* word conditionals add 4 bytes to frag:
970 1 displacement byte and a 3 byte long branch insn. */
974 #define ARCH(n, t, f, s) \
975 { STRING_COMMA_LEN (#n), s, PROCESSOR_ ## t, vsz_none, CPU_ ## f ## _FLAGS, \
977 #define SUBARCH(n, e, d, s) \
978 { STRING_COMMA_LEN (#n), s, PROCESSOR_NONE, vsz_none, CPU_ ## e ## _FLAGS, \
979 CPU_ ## d ## _FLAGS }
980 #define VECARCH(n, e, d, v) \
981 { STRING_COMMA_LEN (#n), false, PROCESSOR_NONE, vsz_ ## v, \
982 CPU_ ## e ## _FLAGS, CPU_ ## d ## _FLAGS }
984 static const arch_entry cpu_arch
[] =
986 /* Do not replace the first two entries - i386_target_format() and
987 set_cpu_arch() rely on them being there in this order. */
988 ARCH (generic32
, GENERIC32
, GENERIC32
, false),
989 ARCH (generic64
, GENERIC64
, GENERIC64
, false),
990 ARCH (i8086
, UNKNOWN
, NONE
, false),
991 ARCH (i186
, UNKNOWN
, 186, false),
992 ARCH (i286
, UNKNOWN
, 286, false),
993 ARCH (i386
, I386
, 386, false),
994 ARCH (i486
, I486
, 486, false),
995 ARCH (i586
, PENTIUM
, 586, false),
996 ARCH (pentium
, PENTIUM
, 586, false),
997 ARCH (i686
, I686
, 686, false),
998 ARCH (pentiumpro
, PENTIUMPRO
, PENTIUMPRO
, false),
999 ARCH (pentiumii
, PENTIUMPRO
, P2
, false),
1000 ARCH (pentiumiii
, PENTIUMPRO
, P3
, false),
1001 ARCH (pentium4
, PENTIUM4
, P4
, false),
1002 ARCH (prescott
, NOCONA
, CORE
, false),
1003 ARCH (nocona
, NOCONA
, NOCONA
, false),
1004 ARCH (yonah
, CORE
, CORE
, true),
1005 ARCH (core
, CORE
, CORE
, false),
1006 ARCH (merom
, CORE2
, CORE2
, true),
1007 ARCH (core2
, CORE2
, CORE2
, false),
1008 ARCH (corei7
, COREI7
, COREI7
, false),
1009 ARCH (iamcu
, IAMCU
, IAMCU
, false),
1010 ARCH (k6
, K6
, K6
, false),
1011 ARCH (k6_2
, K6
, K6_2
, false),
1012 ARCH (athlon
, ATHLON
, ATHLON
, false),
1013 ARCH (sledgehammer
, K8
, K8
, true),
1014 ARCH (opteron
, K8
, K8
, false),
1015 ARCH (k8
, K8
, K8
, false),
1016 ARCH (amdfam10
, AMDFAM10
, AMDFAM10
, false),
1017 ARCH (bdver1
, BD
, BDVER1
, false),
1018 ARCH (bdver2
, BD
, BDVER2
, false),
1019 ARCH (bdver3
, BD
, BDVER3
, false),
1020 ARCH (bdver4
, BD
, BDVER4
, false),
1021 ARCH (znver1
, ZNVER
, ZNVER1
, false),
1022 ARCH (znver2
, ZNVER
, ZNVER2
, false),
1023 ARCH (znver3
, ZNVER
, ZNVER3
, false),
1024 ARCH (znver4
, ZNVER
, ZNVER4
, false),
1025 ARCH (znver5
, ZNVER
, ZNVER5
, false),
1026 ARCH (btver1
, BT
, BTVER1
, false),
1027 ARCH (btver2
, BT
, BTVER2
, false),
1029 SUBARCH (8087, 8087, ANY_8087
, false),
1030 SUBARCH (87, NONE
, ANY_8087
, false), /* Disable only! */
1031 SUBARCH (287, 287, ANY_287
, false),
1032 SUBARCH (387, 387, ANY_387
, false),
1033 SUBARCH (687, 687, ANY_687
, false),
1034 SUBARCH (cmov
, CMOV
, CMOV
, false),
1035 SUBARCH (fxsr
, FXSR
, ANY_FXSR
, false),
1036 SUBARCH (mmx
, MMX
, ANY_MMX
, false),
1037 SUBARCH (sse
, SSE
, ANY_SSE
, false),
1038 SUBARCH (sse2
, SSE2
, ANY_SSE2
, false),
1039 SUBARCH (sse3
, SSE3
, ANY_SSE3
, false),
1040 SUBARCH (sse4a
, SSE4A
, ANY_SSE4A
, false),
1041 SUBARCH (ssse3
, SSSE3
, ANY_SSSE3
, false),
1042 SUBARCH (sse4
.1
, SSE4_1
, ANY_SSE4_1
, false),
1043 SUBARCH (sse4
.2
, SSE4_2
, ANY_SSE4_2
, false),
1044 SUBARCH (sse4
, SSE4_2
, ANY_SSE4_1
, false),
1045 VECARCH (avx
, AVX
, ANY_AVX
, reset
),
1046 VECARCH (avx2
, AVX2
, ANY_AVX2
, reset
),
1047 VECARCH (avx512f
, AVX512F
, ANY_AVX512F
, reset
),
1048 VECARCH (avx512cd
, AVX512CD
, ANY_AVX512CD
, reset
),
1049 VECARCH (avx512er
, AVX512ER
, ANY_AVX512ER
, reset
),
1050 VECARCH (avx512pf
, AVX512PF
, ANY_AVX512PF
, reset
),
1051 VECARCH (avx512dq
, AVX512DQ
, ANY_AVX512DQ
, reset
),
1052 VECARCH (avx512bw
, AVX512BW
, ANY_AVX512BW
, reset
),
1053 VECARCH (avx512vl
, AVX512VL
, ANY_AVX512VL
, reset
),
1054 SUBARCH (monitor
, MONITOR
, MONITOR
, false),
1055 SUBARCH (vmx
, VMX
, ANY_VMX
, false),
1056 SUBARCH (vmfunc
, VMFUNC
, ANY_VMFUNC
, false),
1057 SUBARCH (smx
, SMX
, SMX
, false),
1058 SUBARCH (xsave
, XSAVE
, ANY_XSAVE
, false),
1059 SUBARCH (xsaveopt
, XSAVEOPT
, ANY_XSAVEOPT
, false),
1060 SUBARCH (xsavec
, XSAVEC
, ANY_XSAVEC
, false),
1061 SUBARCH (xsaves
, XSAVES
, ANY_XSAVES
, false),
1062 SUBARCH (aes
, AES
, ANY_AES
, false),
1063 SUBARCH (pclmul
, PCLMULQDQ
, ANY_PCLMULQDQ
, false),
1064 SUBARCH (clmul
, PCLMULQDQ
, ANY_PCLMULQDQ
, true),
1065 SUBARCH (fsgsbase
, FSGSBASE
, FSGSBASE
, false),
1066 SUBARCH (rdrnd
, RDRND
, RDRND
, false),
1067 SUBARCH (f16c
, F16C
, ANY_F16C
, false),
1068 SUBARCH (bmi2
, BMI2
, BMI2
, false),
1069 SUBARCH (fma
, FMA
, ANY_FMA
, false),
1070 SUBARCH (fma4
, FMA4
, ANY_FMA4
, false),
1071 SUBARCH (xop
, XOP
, ANY_XOP
, false),
1072 SUBARCH (lwp
, LWP
, ANY_LWP
, false),
1073 SUBARCH (movbe
, MOVBE
, MOVBE
, false),
1074 SUBARCH (cx16
, CX16
, CX16
, false),
1075 SUBARCH (lahf_sahf
, LAHF_SAHF
, LAHF_SAHF
, false),
1076 SUBARCH (ept
, EPT
, ANY_EPT
, false),
1077 SUBARCH (lzcnt
, LZCNT
, LZCNT
, false),
1078 SUBARCH (popcnt
, POPCNT
, POPCNT
, false),
1079 SUBARCH (hle
, HLE
, HLE
, false),
1080 SUBARCH (rtm
, RTM
, ANY_RTM
, false),
1081 SUBARCH (tsx
, TSX
, TSX
, false),
1082 SUBARCH (invpcid
, INVPCID
, INVPCID
, false),
1083 SUBARCH (clflush
, CLFLUSH
, CLFLUSH
, false),
1084 SUBARCH (nop
, NOP
, NOP
, false),
1085 SUBARCH (syscall
, SYSCALL
, SYSCALL
, false),
1086 SUBARCH (rdtscp
, RDTSCP
, RDTSCP
, false),
1087 SUBARCH (3dnow
, 3DNOW
, ANY_3DNOW
, false),
1088 SUBARCH (3dnowa
, 3DNOWA
, ANY_3DNOWA
, false),
1089 SUBARCH (padlock
, PADLOCK
, PADLOCK
, false),
1090 SUBARCH (pacifica
, SVME
, ANY_SVME
, true),
1091 SUBARCH (svme
, SVME
, ANY_SVME
, false),
1092 SUBARCH (abm
, ABM
, ABM
, false),
1093 SUBARCH (bmi
, BMI
, BMI
, false),
1094 SUBARCH (tbm
, TBM
, TBM
, false),
1095 SUBARCH (adx
, ADX
, ADX
, false),
1096 SUBARCH (rdseed
, RDSEED
, RDSEED
, false),
1097 SUBARCH (prfchw
, PRFCHW
, PRFCHW
, false),
1098 SUBARCH (smap
, SMAP
, SMAP
, false),
1099 SUBARCH (mpx
, MPX
, ANY_MPX
, false),
1100 SUBARCH (sha
, SHA
, ANY_SHA
, false),
1101 SUBARCH (clflushopt
, CLFLUSHOPT
, CLFLUSHOPT
, false),
1102 SUBARCH (prefetchwt1
, PREFETCHWT1
, PREFETCHWT1
, false),
1103 SUBARCH (se1
, SE1
, SE1
, false),
1104 SUBARCH (clwb
, CLWB
, CLWB
, false),
1105 VECARCH (avx512ifma
, AVX512IFMA
, ANY_AVX512IFMA
, reset
),
1106 VECARCH (avx512vbmi
, AVX512VBMI
, ANY_AVX512VBMI
, reset
),
1107 VECARCH (avx512_4fmaps
, AVX512_4FMAPS
, ANY_AVX512_4FMAPS
, reset
),
1108 VECARCH (avx512_4vnniw
, AVX512_4VNNIW
, ANY_AVX512_4VNNIW
, reset
),
1109 VECARCH (avx512_vpopcntdq
, AVX512_VPOPCNTDQ
, ANY_AVX512_VPOPCNTDQ
, reset
),
1110 VECARCH (avx512_vbmi2
, AVX512_VBMI2
, ANY_AVX512_VBMI2
, reset
),
1111 VECARCH (avx512_vnni
, AVX512_VNNI
, ANY_AVX512_VNNI
, reset
),
1112 VECARCH (avx512_bitalg
, AVX512_BITALG
, ANY_AVX512_BITALG
, reset
),
1113 VECARCH (avx_vnni
, AVX_VNNI
, ANY_AVX_VNNI
, reset
),
1114 SUBARCH (clzero
, CLZERO
, CLZERO
, false),
1115 SUBARCH (mwaitx
, MWAITX
, MWAITX
, false),
1116 SUBARCH (ospke
, OSPKE
, ANY_OSPKE
, false),
1117 SUBARCH (rdpid
, RDPID
, RDPID
, false),
1118 SUBARCH (ptwrite
, PTWRITE
, PTWRITE
, false),
1119 SUBARCH (ibt
, IBT
, IBT
, false),
1120 SUBARCH (shstk
, SHSTK
, SHSTK
, false),
1121 SUBARCH (gfni
, GFNI
, ANY_GFNI
, false),
1122 VECARCH (vaes
, VAES
, ANY_VAES
, reset
),
1123 VECARCH (vpclmulqdq
, VPCLMULQDQ
, ANY_VPCLMULQDQ
, reset
),
1124 SUBARCH (wbnoinvd
, WBNOINVD
, WBNOINVD
, false),
1125 SUBARCH (pconfig
, PCONFIG
, PCONFIG
, false),
1126 SUBARCH (waitpkg
, WAITPKG
, WAITPKG
, false),
1127 SUBARCH (cldemote
, CLDEMOTE
, CLDEMOTE
, false),
1128 SUBARCH (amx_int8
, AMX_INT8
, ANY_AMX_INT8
, false),
1129 SUBARCH (amx_bf16
, AMX_BF16
, ANY_AMX_BF16
, false),
1130 SUBARCH (amx_fp16
, AMX_FP16
, ANY_AMX_FP16
, false),
1131 SUBARCH (amx_complex
, AMX_COMPLEX
, ANY_AMX_COMPLEX
, false),
1132 SUBARCH (amx_tile
, AMX_TILE
, ANY_AMX_TILE
, false),
1133 SUBARCH (movdiri
, MOVDIRI
, MOVDIRI
, false),
1134 SUBARCH (movdir64b
, MOVDIR64B
, MOVDIR64B
, false),
1135 VECARCH (avx512_bf16
, AVX512_BF16
, ANY_AVX512_BF16
, reset
),
1136 VECARCH (avx512_vp2intersect
, AVX512_VP2INTERSECT
,
1137 ANY_AVX512_VP2INTERSECT
, reset
),
1138 SUBARCH (tdx
, TDX
, TDX
, false),
1139 SUBARCH (enqcmd
, ENQCMD
, ENQCMD
, false),
1140 SUBARCH (serialize
, SERIALIZE
, SERIALIZE
, false),
1141 SUBARCH (rdpru
, RDPRU
, RDPRU
, false),
1142 SUBARCH (mcommit
, MCOMMIT
, MCOMMIT
, false),
1143 SUBARCH (sev_es
, SEV_ES
, ANY_SEV_ES
, false),
1144 SUBARCH (tsxldtrk
, TSXLDTRK
, ANY_TSXLDTRK
, false),
1145 SUBARCH (kl
, KL
, ANY_KL
, false),
1146 SUBARCH (widekl
, WIDEKL
, ANY_WIDEKL
, false),
1147 SUBARCH (uintr
, UINTR
, UINTR
, false),
1148 SUBARCH (hreset
, HRESET
, HRESET
, false),
1149 VECARCH (avx512_fp16
, AVX512_FP16
, ANY_AVX512_FP16
, reset
),
1150 SUBARCH (prefetchi
, PREFETCHI
, PREFETCHI
, false),
1151 VECARCH (avx_ifma
, AVX_IFMA
, ANY_AVX_IFMA
, reset
),
1152 VECARCH (avx_vnni_int8
, AVX_VNNI_INT8
, ANY_AVX_VNNI_INT8
, reset
),
1153 SUBARCH (cmpccxadd
, CMPCCXADD
, CMPCCXADD
, false),
1154 SUBARCH (wrmsrns
, WRMSRNS
, WRMSRNS
, false),
1155 SUBARCH (msrlist
, MSRLIST
, MSRLIST
, false),
1156 VECARCH (avx_ne_convert
, AVX_NE_CONVERT
, ANY_AVX_NE_CONVERT
, reset
),
1157 SUBARCH (rao_int
, RAO_INT
, RAO_INT
, false),
1158 SUBARCH (rmpquery
, RMPQUERY
, ANY_RMPQUERY
, false),
1159 SUBARCH (fred
, FRED
, ANY_FRED
, false),
1160 SUBARCH (lkgs
, LKGS
, ANY_LKGS
, false),
1161 VECARCH (avx_vnni_int16
, AVX_VNNI_INT16
, ANY_AVX_VNNI_INT16
, reset
),
1162 VECARCH (sha512
, SHA512
, ANY_SHA512
, reset
),
1163 VECARCH (sm3
, SM3
, ANY_SM3
, reset
),
1164 VECARCH (sm4
, SM4
, ANY_SM4
, reset
),
1165 SUBARCH (pbndkb
, PBNDKB
, PBNDKB
, false),
1166 VECARCH (avx10
.1
, AVX10_1
, ANY_AVX512F
, set
),
1167 SUBARCH (user_msr
, USER_MSR
, USER_MSR
, false),
1168 SUBARCH (apx_f
, APX_F
, APX_F
, false),
1175 /* Like s_lcomm_internal in gas/read.c but the alignment string
1176 is allowed to be optional. */
1179 pe_lcomm_internal (int needs_align
, symbolS
*symbolP
, addressT size
)
1186 && *input_line_pointer
== ',')
1188 align
= parse_align (needs_align
- 1);
1190 if (align
== (addressT
) -1)
1205 bss_alloc (symbolP
, size
, align
);
1210 pe_lcomm (int needs_align
)
1212 s_comm_internal (needs_align
* 2, pe_lcomm_internal
);
1216 const pseudo_typeS md_pseudo_table
[] =
1218 #if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1219 {"align", s_align_bytes
, 0},
1221 {"align", s_align_ptwo
, 0},
1223 {"arch", set_cpu_arch
, 0},
1228 {"lcomm", pe_lcomm
, 1},
1230 {"ffloat", float_cons
, 'f'},
1231 {"dfloat", float_cons
, 'd'},
1232 {"tfloat", float_cons
, 'x'},
1233 {"hfloat", float_cons
, 'h'},
1234 {"bfloat16", float_cons
, 'b'},
1236 {"slong", signed_cons
, 4},
1237 {"insn", s_insn
, 0},
1238 {"noopt", s_noopt
, 0},
1239 {"optim", s_ignore
, 0},
1240 {"code16gcc", set_16bit_gcc_code_flag
, CODE_16BIT
},
1241 {"code16", set_code_flag
, CODE_16BIT
},
1242 {"code32", set_code_flag
, CODE_32BIT
},
1244 {"code64", set_code_flag
, CODE_64BIT
},
1246 {"intel_syntax", set_intel_syntax
, 1},
1247 {"att_syntax", set_intel_syntax
, 0},
1248 {"intel_mnemonic", set_intel_mnemonic
, 1},
1249 {"att_mnemonic", set_intel_mnemonic
, 0},
1250 {"allow_index_reg", set_allow_index_reg
, 1},
1251 {"disallow_index_reg", set_allow_index_reg
, 0},
1252 {"sse_check", set_check
, 0},
1253 {"operand_check", set_check
, 1},
1254 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1255 {"largecomm", handle_large_common
, 0},
1257 {"file", dwarf2_directive_file
, 0},
1258 {"loc", dwarf2_directive_loc
, 0},
1259 {"loc_mark_labels", dwarf2_directive_loc_mark_labels
, 0},
1262 {"secrel32", pe_directive_secrel
, 0},
1263 {"secidx", pe_directive_secidx
, 0},
1268 /* For interface with expression (). */
1269 extern char *input_line_pointer
;
1271 /* Hash table for instruction mnemonic lookup. */
1272 static htab_t op_hash
;
1274 /* Hash table for register lookup. */
1275 static htab_t reg_hash
;
1277 /* Various efficient no-op patterns for aligning code labels.
1278 Note: Don't try to assemble the instructions in the comments.
1279 0L and 0w are not legal. */
1280 static const unsigned char f32_1
[] =
1282 static const unsigned char f32_2
[] =
1283 {0x66,0x90}; /* xchg %ax,%ax */
1284 static const unsigned char f32_3
[] =
1285 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1286 #define f32_4 (f32_5 + 1) /* leal 0(%esi,%eiz),%esi */
1287 static const unsigned char f32_5
[] =
1288 {0x2e,0x8d,0x74,0x26,0x00}; /* leal %cs:0(%esi,%eiz),%esi */
1289 static const unsigned char f32_6
[] =
1290 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1291 #define f32_7 (f32_8 + 1) /* leal 0L(%esi,%eiz),%esi */
1292 static const unsigned char f32_8
[] =
1293 {0x2e,0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal %cs:0L(%esi,%eiz),%esi */
1294 static const unsigned char f64_3
[] =
1295 {0x48,0x89,0xf6}; /* mov %rsi,%rsi */
1296 static const unsigned char f64_4
[] =
1297 {0x48,0x8d,0x76,0x00}; /* lea 0(%rsi),%rsi */
1298 #define f64_5 (f64_6 + 1) /* lea 0(%rsi,%riz),%rsi */
1299 static const unsigned char f64_6
[] =
1300 {0x2e,0x48,0x8d,0x74,0x26,0x00}; /* lea %cs:0(%rsi,%riz),%rsi */
1301 static const unsigned char f64_7
[] =
1302 {0x48,0x8d,0xb6,0x00,0x00,0x00,0x00}; /* lea 0L(%rsi),%rsi */
1303 #define f64_8 (f64_9 + 1) /* lea 0L(%rsi,%riz),%rsi */
1304 static const unsigned char f64_9
[] =
1305 {0x2e,0x48,0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* lea %cs:0L(%rsi,%riz),%rsi */
1306 #define f16_2 (f64_3 + 1) /* mov %si,%si */
1307 static const unsigned char f16_3
[] =
1308 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
1309 #define f16_4 (f16_5 + 1) /* lea 0W(%si),%si */
1310 static const unsigned char f16_5
[] =
1311 {0x2e,0x8d,0xb4,0x00,0x00}; /* lea %cs:0W(%si),%si */
1312 static const unsigned char jump_disp8
[] =
1313 {0xeb}; /* jmp disp8 */
1314 static const unsigned char jump32_disp32
[] =
1315 {0xe9}; /* jmp disp32 */
1316 static const unsigned char jump16_disp32
[] =
1317 {0x66,0xe9}; /* jmp disp32 */
1318 /* 32-bit NOPs patterns. */
1319 static const unsigned char *const f32_patt
[] = {
1320 f32_1
, f32_2
, f32_3
, f32_4
, f32_5
, f32_6
, f32_7
, f32_8
1322 /* 64-bit NOPs patterns. */
1323 static const unsigned char *const f64_patt
[] = {
1324 f32_1
, f32_2
, f64_3
, f64_4
, f64_5
, f64_6
, f64_7
, f64_8
, f64_9
1326 /* 16-bit NOPs patterns. */
1327 static const unsigned char *const f16_patt
[] = {
1328 f32_1
, f16_2
, f16_3
, f16_4
, f16_5
1330 /* nopl (%[re]ax) */
1331 static const unsigned char alt_3
[] =
1333 /* nopl 0(%[re]ax) */
1334 static const unsigned char alt_4
[] =
1335 {0x0f,0x1f,0x40,0x00};
1336 /* nopl 0(%[re]ax,%[re]ax,1) */
1337 #define alt_5 (alt_6 + 1)
1338 /* nopw 0(%[re]ax,%[re]ax,1) */
1339 static const unsigned char alt_6
[] =
1340 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1341 /* nopl 0L(%[re]ax) */
1342 static const unsigned char alt_7
[] =
1343 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1344 /* nopl 0L(%[re]ax,%[re]ax,1) */
1345 #define alt_8 (alt_9 + 1)
1346 /* nopw 0L(%[re]ax,%[re]ax,1) */
1347 static const unsigned char alt_9
[] =
1348 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1349 /* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1350 #define alt_10 (alt_11 + 1)
1351 /* data16 nopw %cs:0L(%eax,%eax,1) */
1352 static const unsigned char alt_11
[] =
1353 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1354 /* 32-bit and 64-bit NOPs patterns. */
1355 static const unsigned char *const alt_patt
[] = {
1356 f32_1
, f32_2
, alt_3
, alt_4
, alt_5
, alt_6
, alt_7
, alt_8
,
1357 alt_9
, alt_10
, alt_11
1359 #define alt64_9 (alt64_15 + 6) /* nopq 0L(%rax,%rax,1) */
1360 #define alt64_10 (alt64_15 + 5) /* cs nopq 0L(%rax,%rax,1) */
1361 /* data16 cs nopq 0L(%rax,%rax,1) */
1362 #define alt64_11 (alt64_15 + 4)
1363 /* data16 data16 cs nopq 0L(%rax,%rax,1) */
1364 #define alt64_12 (alt64_15 + 3)
1365 /* data16 data16 data16 cs nopq 0L(%rax,%rax,1) */
1366 #define alt64_13 (alt64_15 + 2)
1367 /* data16 data16 data16 data16 cs nopq 0L(%rax,%rax,1) */
1368 #define alt64_14 (alt64_15 + 1)
1369 /* data16 data16 data16 data16 data16 cs nopq 0L(%rax,%rax,1) */
1370 static const unsigned char alt64_15
[] =
1371 {0x66,0x66,0x66,0x66,0x66,0x2e,0x48,
1372 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1373 /* Long 64-bit NOPs patterns. */
1374 static const unsigned char *const alt64_patt
[] = {
1375 f32_1
, f32_2
, alt_3
, alt_4
, alt_5
, alt_6
, alt_7
, alt_8
,
1376 alt64_9
, alt64_10
, alt64_11
,alt64_12
, alt64_13
, alt64_14
, alt64_15
1379 /* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1380 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1383 i386_output_nops (char *where
, const unsigned char *const *patt
,
1384 int count
, int max_single_nop_size
)
1387 /* Place the longer NOP first. */
1390 const unsigned char *nops
;
1392 if (max_single_nop_size
< 1)
1394 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1395 max_single_nop_size
);
1399 nops
= patt
[max_single_nop_size
- 1];
1400 last
= count
% max_single_nop_size
;
1403 for (offset
= 0; offset
< count
; offset
+= max_single_nop_size
)
1404 memcpy (where
+ offset
, nops
, max_single_nop_size
);
1408 nops
= patt
[last
- 1];
1409 memcpy (where
+ offset
, nops
, last
);
1414 fits_in_imm7 (offsetT num
)
1416 return (num
& 0x7f) == num
;
1420 fits_in_imm31 (offsetT num
)
1422 return (num
& 0x7fffffff) == num
;
1425 /* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1426 single NOP instruction LIMIT. */
1429 i386_generate_nops (fragS
*fragP
, char *where
, offsetT count
, int limit
)
1431 const unsigned char *const *patt
= NULL
;
1432 int max_single_nop_size
;
1433 /* Maximum number of NOPs before switching to jump over NOPs. */
1434 int max_number_of_nops
;
1436 switch (fragP
->fr_type
)
1441 case rs_machine_dependent
:
1442 /* Allow NOP padding for jumps and calls. */
1443 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PADDING
1444 || TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == FUSED_JCC_PADDING
)
1451 /* We need to decide which NOP sequence to use for 32bit and
1452 64bit. When -mtune= is used:
1454 1. For PROCESSOR_I?86, PROCESSOR_PENTIUM, PROCESSOR_IAMCU, and
1455 PROCESSOR_GENERIC32, f32_patt will be used.
1456 2. For the rest, alt_patt will be used.
1458 When -mtune= isn't used, alt_patt will be used if
1459 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt/f64_patt will
1462 When -march= or .arch is used, we can't use anything beyond
1463 cpu_arch_isa_flags. */
1465 if (fragP
->tc_frag_data
.code
== CODE_16BIT
)
1468 max_single_nop_size
= sizeof (f16_patt
) / sizeof (f16_patt
[0]);
1469 /* Limit number of NOPs to 2 in 16-bit mode. */
1470 max_number_of_nops
= 2;
1474 patt
= fragP
->tc_frag_data
.code
== CODE_64BIT
? f64_patt
: f32_patt
;
1475 if (fragP
->tc_frag_data
.isa
== PROCESSOR_UNKNOWN
)
1477 /* PROCESSOR_UNKNOWN means that all ISAs may be used, unless
1478 explicitly disabled. */
1479 switch (fragP
->tc_frag_data
.tune
)
1481 case PROCESSOR_UNKNOWN
:
1482 /* We use cpu_arch_isa_flags to check if we SHOULD
1483 optimize with nops. */
1484 if (fragP
->tc_frag_data
.isanop
)
1488 case PROCESSOR_CORE
:
1489 case PROCESSOR_CORE2
:
1490 case PROCESSOR_COREI7
:
1491 if (fragP
->tc_frag_data
.cpunop
)
1493 if (fragP
->tc_frag_data
.code
== CODE_64BIT
)
1500 case PROCESSOR_PENTIUMPRO
:
1501 case PROCESSOR_PENTIUM4
:
1502 case PROCESSOR_NOCONA
:
1503 case PROCESSOR_GENERIC64
:
1505 case PROCESSOR_ATHLON
:
1507 case PROCESSOR_AMDFAM10
:
1509 case PROCESSOR_ZNVER
:
1511 if (fragP
->tc_frag_data
.cpunop
)
1515 case PROCESSOR_I386
:
1516 case PROCESSOR_I486
:
1517 case PROCESSOR_PENTIUM
:
1518 case PROCESSOR_I686
:
1519 case PROCESSOR_IAMCU
:
1520 case PROCESSOR_GENERIC32
:
1522 case PROCESSOR_NONE
:
1528 switch (fragP
->tc_frag_data
.tune
)
1530 case PROCESSOR_UNKNOWN
:
1531 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
1532 PROCESSOR_UNKNOWN. */
1537 /* We use cpu_arch_isa_flags to check if we CAN optimize
1539 if (fragP
->tc_frag_data
.isanop
)
1543 case PROCESSOR_NONE
:
1548 if (patt
!= alt_patt
&& patt
!= alt64_patt
)
1550 max_single_nop_size
= patt
== f32_patt
? ARRAY_SIZE (f32_patt
)
1551 : ARRAY_SIZE (f64_patt
);
1552 /* Limit number of NOPs to 2 for older processors. */
1553 max_number_of_nops
= 2;
1557 max_single_nop_size
= patt
== alt_patt
1558 ? ARRAY_SIZE (alt_patt
)
1559 : ARRAY_SIZE (alt64_patt
);
1560 /* Limit number of NOPs to 7 for newer processors. */
1561 max_number_of_nops
= 7;
1566 limit
= max_single_nop_size
;
1568 if (fragP
->fr_type
== rs_fill_nop
)
1570 /* Output NOPs for .nop directive. */
1571 if (limit
> max_single_nop_size
)
1573 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
1574 _("invalid single nop size: %d "
1575 "(expect within [0, %d])"),
1576 limit
, max_single_nop_size
);
1580 else if (fragP
->fr_type
!= rs_machine_dependent
)
1581 fragP
->fr_var
= count
;
1583 /* Emit a plain NOP first when the last thing we saw may not have been
1584 a proper instruction (e.g. a stand-alone prefix or .byte). */
1585 if (!fragP
->tc_frag_data
.last_insn_normal
)
1591 if ((count
/ max_single_nop_size
) > max_number_of_nops
)
1593 /* Generate jump over NOPs. */
1594 offsetT disp
= count
- 2;
1595 if (fits_in_imm7 (disp
))
1597 /* Use "jmp disp8" if possible. */
1599 where
[0] = jump_disp8
[0];
1605 unsigned int size_of_jump
;
1607 if (flag_code
== CODE_16BIT
)
1609 where
[0] = jump16_disp32
[0];
1610 where
[1] = jump16_disp32
[1];
1615 where
[0] = jump32_disp32
[0];
1619 count
-= size_of_jump
+ 4;
1620 if (!fits_in_imm31 (count
))
1622 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
1623 _("jump over nop padding out of range"));
1627 md_number_to_chars (where
+ size_of_jump
, count
, 4);
1628 where
+= size_of_jump
+ 4;
1632 /* Generate multiple NOPs. */
1633 i386_output_nops (where
, patt
, count
, limit
);
1637 operand_type_all_zero (const union i386_operand_type
*x
)
1639 switch (ARRAY_SIZE(x
->array
))
1650 return !x
->array
[0];
1657 operand_type_set (union i386_operand_type
*x
, unsigned int v
)
1659 switch (ARRAY_SIZE(x
->array
))
1675 x
->bitfield
.class = ClassNone
;
1676 x
->bitfield
.instance
= InstanceNone
;
1680 operand_type_equal (const union i386_operand_type
*x
,
1681 const union i386_operand_type
*y
)
1683 switch (ARRAY_SIZE(x
->array
))
1686 if (x
->array
[2] != y
->array
[2])
1690 if (x
->array
[1] != y
->array
[1])
1694 return x
->array
[0] == y
->array
[0];
1702 _is_cpu (const i386_cpu_attr
*a
, enum i386_cpu cpu
)
1706 case Cpu287
: return a
->bitfield
.cpu287
;
1707 case Cpu387
: return a
->bitfield
.cpu387
;
1708 case Cpu3dnow
: return a
->bitfield
.cpu3dnow
;
1709 case Cpu3dnowA
: return a
->bitfield
.cpu3dnowa
;
1710 case CpuAVX
: return a
->bitfield
.cpuavx
;
1711 case CpuHLE
: return a
->bitfield
.cpuhle
;
1712 case CpuAVX512F
: return a
->bitfield
.cpuavx512f
;
1713 case CpuAVX512VL
: return a
->bitfield
.cpuavx512vl
;
1714 case CpuAPX_F
: return a
->bitfield
.cpuapx_f
;
1715 case Cpu64
: return a
->bitfield
.cpu64
;
1716 case CpuNo64
: return a
->bitfield
.cpuno64
;
1718 gas_assert (cpu
< CpuAttrEnums
);
1720 return a
->bitfield
.isa
== cpu
+ 1u;
1724 is_cpu (const insn_template
*t
, enum i386_cpu cpu
)
1726 return _is_cpu(&t
->cpu
, cpu
);
1730 maybe_cpu (const insn_template
*t
, enum i386_cpu cpu
)
1732 return _is_cpu(&t
->cpu_any
, cpu
);
1735 static i386_cpu_flags
cpu_flags_from_attr (i386_cpu_attr a
)
1737 const unsigned int bps
= sizeof (a
.array
[0]) * CHAR_BIT
;
1738 i386_cpu_flags f
= { .array
[0] = 0 };
1740 switch (ARRAY_SIZE (a
.array
))
1743 f
.array
[CpuAttrEnums
/ bps
]
1744 #ifndef WORDS_BIGENDIAN
1745 |= (a
.array
[0] >> CpuIsaBits
) << (CpuAttrEnums
% bps
);
1747 |= (a
.array
[0] << CpuIsaBits
) >> (CpuAttrEnums
% bps
);
1749 if (CpuMax
/ bps
> CpuAttrEnums
/ bps
)
1750 f
.array
[CpuAttrEnums
/ bps
+ 1]
1751 #ifndef WORDS_BIGENDIAN
1752 = (a
.array
[0] >> CpuIsaBits
) >> (bps
- CpuAttrEnums
% bps
);
1754 = (a
.array
[0] << CpuIsaBits
) << (bps
- CpuAttrEnums
% bps
);
1763 #ifndef WORDS_BIGENDIAN
1764 f
.array
[(a
.bitfield
.isa
- 1) / bps
] |= 1u << ((a
.bitfield
.isa
- 1) % bps
);
1766 f
.array
[(a
.bitfield
.isa
- 1) / bps
] |= 1u << (~(a
.bitfield
.isa
- 1) % bps
);
1773 cpu_flags_all_zero (const union i386_cpu_flags
*x
)
1775 switch (ARRAY_SIZE(x
->array
))
1794 return !x
->array
[0];
1801 cpu_flags_equal (const union i386_cpu_flags
*x
,
1802 const union i386_cpu_flags
*y
)
1804 switch (ARRAY_SIZE(x
->array
))
1807 if (x
->array
[4] != y
->array
[4])
1811 if (x
->array
[3] != y
->array
[3])
1815 if (x
->array
[2] != y
->array
[2])
1819 if (x
->array
[1] != y
->array
[1])
1823 return x
->array
[0] == y
->array
[0];
1831 cpu_flags_check_cpu64 (const insn_template
*t
)
1833 return flag_code
== CODE_64BIT
1834 ? !t
->cpu
.bitfield
.cpuno64
1835 : !t
->cpu
.bitfield
.cpu64
;
1838 static INLINE i386_cpu_flags
1839 cpu_flags_and (i386_cpu_flags x
, i386_cpu_flags y
)
1841 switch (ARRAY_SIZE (x
.array
))
1844 x
.array
[4] &= y
.array
[4];
1847 x
.array
[3] &= y
.array
[3];
1850 x
.array
[2] &= y
.array
[2];
1853 x
.array
[1] &= y
.array
[1];
1856 x
.array
[0] &= y
.array
[0];
1864 static INLINE i386_cpu_flags
1865 cpu_flags_or (i386_cpu_flags x
, i386_cpu_flags y
)
1867 switch (ARRAY_SIZE (x
.array
))
1870 x
.array
[4] |= y
.array
[4];
1873 x
.array
[3] |= y
.array
[3];
1876 x
.array
[2] |= y
.array
[2];
1879 x
.array
[1] |= y
.array
[1];
1882 x
.array
[0] |= y
.array
[0];
1890 static INLINE i386_cpu_flags
1891 cpu_flags_and_not (i386_cpu_flags x
, i386_cpu_flags y
)
1893 switch (ARRAY_SIZE (x
.array
))
1896 x
.array
[4] &= ~y
.array
[4];
1899 x
.array
[3] &= ~y
.array
[3];
1902 x
.array
[2] &= ~y
.array
[2];
1905 x
.array
[1] &= ~y
.array
[1];
1908 x
.array
[0] &= ~y
.array
[0];
1916 static const i386_cpu_flags avx512
= CPU_ANY_AVX512F_FLAGS
;
1918 static INLINE
bool need_evex_encoding (const insn_template
*t
)
1920 return i
.encoding
== encoding_evex
1921 || i
.encoding
== encoding_evex512
1922 || (t
->opcode_modifier
.vex
&& i
.encoding
== encoding_egpr
)
1926 #define CPU_FLAGS_ARCH_MATCH 0x1
1927 #define CPU_FLAGS_64BIT_MATCH 0x2
1929 #define CPU_FLAGS_PERFECT_MATCH \
1930 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
1932 /* Return CPU flags match bits. */
1935 cpu_flags_match (const insn_template
*t
)
1937 i386_cpu_flags cpu
, active
, all
= cpu_flags_from_attr (t
->cpu
);
1938 i386_cpu_flags any
= cpu_flags_from_attr (t
->cpu_any
);
1939 int match
= cpu_flags_check_cpu64 (t
) ? CPU_FLAGS_64BIT_MATCH
: 0;
1941 all
.bitfield
.cpu64
= 0;
1942 all
.bitfield
.cpuno64
= 0;
1943 gas_assert (!any
.bitfield
.cpu64
);
1944 gas_assert (!any
.bitfield
.cpuno64
);
1946 if (cpu_flags_all_zero (&all
) && cpu_flags_all_zero (&any
))
1948 /* This instruction is available on all archs. */
1949 return match
| CPU_FLAGS_ARCH_MATCH
;
1952 /* This instruction is available only on some archs. */
1954 /* Dual VEX/EVEX templates may need stripping of one of the flags. */
1955 if (t
->opcode_modifier
.vex
&& t
->opcode_modifier
.evex
)
1957 /* Dual AVX/AVX512 templates need to retain AVX512* only if we already
1958 know that EVEX encoding will be needed. */
1959 if ((any
.bitfield
.cpuavx
|| any
.bitfield
.cpuavx2
|| any
.bitfield
.cpufma
)
1960 && (any
.bitfield
.cpuavx512f
|| any
.bitfield
.cpuavx512vl
))
1962 if (need_evex_encoding (t
))
1964 any
.bitfield
.cpuavx
= 0;
1965 any
.bitfield
.cpuavx2
= 0;
1966 any
.bitfield
.cpufma
= 0;
1968 /* need_evex_encoding(t) isn't reliable before operands were
1970 else if (i
.operands
)
1972 any
.bitfield
.cpuavx512f
= 0;
1973 any
.bitfield
.cpuavx512vl
= 0;
1977 /* Dual non-APX/APX templates need massaging from what APX_F() in the
1978 opcode table has produced. While the direct transformation of the
1979 incoming cpuid&(cpuid|APX_F) would be to cpuid&(cpuid) / cpuid&(APX_F)
1980 respectively, it's cheaper to move to just cpuid / cpuid&APX_F
1982 if (any
.bitfield
.cpuapx_f
1983 && (any
.bitfield
.cpubmi
|| any
.bitfield
.cpubmi2
1984 || any
.bitfield
.cpuavx512f
|| any
.bitfield
.cpuavx512bw
1985 || any
.bitfield
.cpuavx512dq
|| any
.bitfield
.cpuamx_tile
1986 || any
.bitfield
.cpucmpccxadd
|| any
.bitfield
.cpuuser_msr
))
1988 /* These checks (verifying that APX_F() was properly used in the
1989 opcode table entry) make sure there's no need for an "else" to
1990 the "if()" below. */
1991 gas_assert (!cpu_flags_all_zero (&all
));
1992 cpu
= cpu_flags_and (all
, any
);
1993 gas_assert (cpu_flags_equal (&cpu
, &all
));
1995 if (need_evex_encoding (t
))
1998 memset (&any
, 0, sizeof (any
));
2002 if (flag_code
!= CODE_64BIT
)
2003 active
= cpu_flags_and_not (cpu_arch_flags
, cpu_64_flags
);
2005 active
= cpu_arch_flags
;
2006 cpu
= cpu_flags_and (all
, active
);
2007 if (cpu_flags_equal (&cpu
, &all
))
2009 /* AVX and AVX2 present at the same time express an operand size
2010 dependency - strip AVX2 for the purposes here. The operand size
2011 dependent check occurs in check_vecOperands(). */
2012 if (any
.bitfield
.cpuavx
&& any
.bitfield
.cpuavx2
)
2013 any
.bitfield
.cpuavx2
= 0;
2015 cpu
= cpu_flags_and (any
, active
);
2016 if (cpu_flags_all_zero (&any
) || !cpu_flags_all_zero (&cpu
))
2017 match
|= CPU_FLAGS_ARCH_MATCH
;
2022 static INLINE i386_operand_type
2023 operand_type_and (i386_operand_type x
, i386_operand_type y
)
2025 if (x
.bitfield
.class != y
.bitfield
.class)
2026 x
.bitfield
.class = ClassNone
;
2027 if (x
.bitfield
.instance
!= y
.bitfield
.instance
)
2028 x
.bitfield
.instance
= InstanceNone
;
2030 switch (ARRAY_SIZE (x
.array
))
2033 x
.array
[2] &= y
.array
[2];
2036 x
.array
[1] &= y
.array
[1];
2039 x
.array
[0] &= y
.array
[0];
2047 static INLINE i386_operand_type
2048 operand_type_and_not (i386_operand_type x
, i386_operand_type y
)
2050 gas_assert (y
.bitfield
.class == ClassNone
);
2051 gas_assert (y
.bitfield
.instance
== InstanceNone
);
2053 switch (ARRAY_SIZE (x
.array
))
2056 x
.array
[2] &= ~y
.array
[2];
2059 x
.array
[1] &= ~y
.array
[1];
2062 x
.array
[0] &= ~y
.array
[0];
2070 static INLINE i386_operand_type
2071 operand_type_or (i386_operand_type x
, i386_operand_type y
)
2073 gas_assert (x
.bitfield
.class == ClassNone
||
2074 y
.bitfield
.class == ClassNone
||
2075 x
.bitfield
.class == y
.bitfield
.class);
2076 gas_assert (x
.bitfield
.instance
== InstanceNone
||
2077 y
.bitfield
.instance
== InstanceNone
||
2078 x
.bitfield
.instance
== y
.bitfield
.instance
);
2080 switch (ARRAY_SIZE (x
.array
))
2083 x
.array
[2] |= y
.array
[2];
2086 x
.array
[1] |= y
.array
[1];
2089 x
.array
[0] |= y
.array
[0];
2097 static INLINE i386_operand_type
2098 operand_type_xor (i386_operand_type x
, i386_operand_type y
)
2100 gas_assert (y
.bitfield
.class == ClassNone
);
2101 gas_assert (y
.bitfield
.instance
== InstanceNone
);
2103 switch (ARRAY_SIZE (x
.array
))
2106 x
.array
[2] ^= y
.array
[2];
2109 x
.array
[1] ^= y
.array
[1];
2112 x
.array
[0] ^= y
.array
[0];
2120 static const i386_operand_type anydisp
= {
2121 .bitfield
= { .disp8
= 1, .disp16
= 1, .disp32
= 1, .disp64
= 1 }
2133 operand_type_check (i386_operand_type t
, enum operand_type c
)
2138 return t
.bitfield
.class == Reg
;
2141 return (t
.bitfield
.imm8
2145 || t
.bitfield
.imm32s
2146 || t
.bitfield
.imm64
);
2149 return (t
.bitfield
.disp8
2150 || t
.bitfield
.disp16
2151 || t
.bitfield
.disp32
2152 || t
.bitfield
.disp64
);
2155 return (t
.bitfield
.disp8
2156 || t
.bitfield
.disp16
2157 || t
.bitfield
.disp32
2158 || t
.bitfield
.disp64
2159 || t
.bitfield
.baseindex
);
2168 /* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2169 between operand GIVEN and opeand WANTED for instruction template T. */
2172 match_operand_size (const insn_template
*t
, unsigned int wanted
,
2175 return !((i
.types
[given
].bitfield
.byte
2176 && !t
->operand_types
[wanted
].bitfield
.byte
)
2177 || (i
.types
[given
].bitfield
.word
2178 && !t
->operand_types
[wanted
].bitfield
.word
)
2179 || (i
.types
[given
].bitfield
.dword
2180 && !t
->operand_types
[wanted
].bitfield
.dword
)
2181 || (i
.types
[given
].bitfield
.qword
2182 && (!t
->operand_types
[wanted
].bitfield
.qword
2183 /* Don't allow 64-bit (memory) operands outside of 64-bit
2184 mode, when they're used where a 64-bit GPR could also
2185 be used. Checking is needed for Intel Syntax only. */
2187 && flag_code
!= CODE_64BIT
2188 && (t
->operand_types
[wanted
].bitfield
.class == Reg
2189 || t
->operand_types
[wanted
].bitfield
.class == Accum
2190 || t
->opcode_modifier
.isstring
))))
2191 || (i
.types
[given
].bitfield
.tbyte
2192 && !t
->operand_types
[wanted
].bitfield
.tbyte
));
2195 /* Return 1 if there is no conflict in SIMD register between operand
2196 GIVEN and opeand WANTED for instruction template T. */
2199 match_simd_size (const insn_template
*t
, unsigned int wanted
,
2202 return !((i
.types
[given
].bitfield
.xmmword
2203 && !t
->operand_types
[wanted
].bitfield
.xmmword
)
2204 || (i
.types
[given
].bitfield
.ymmword
2205 && !t
->operand_types
[wanted
].bitfield
.ymmword
)
2206 || (i
.types
[given
].bitfield
.zmmword
2207 && !t
->operand_types
[wanted
].bitfield
.zmmword
)
2208 || (i
.types
[given
].bitfield
.tmmword
2209 && !t
->operand_types
[wanted
].bitfield
.tmmword
));
2212 /* Return 1 if there is no conflict in any size between operand GIVEN
2213 and opeand WANTED for instruction template T. */
2216 match_mem_size (const insn_template
*t
, unsigned int wanted
,
2219 return (match_operand_size (t
, wanted
, given
)
2220 && !((i
.types
[given
].bitfield
.unspecified
2221 && !i
.broadcast
.type
2222 && !i
.broadcast
.bytes
2223 && !t
->operand_types
[wanted
].bitfield
.unspecified
)
2224 || (i
.types
[given
].bitfield
.fword
2225 && !t
->operand_types
[wanted
].bitfield
.fword
)
2226 /* For scalar opcode templates to allow register and memory
2227 operands at the same time, some special casing is needed
2228 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2229 down-conversion vpmov*. */
2230 || ((t
->operand_types
[wanted
].bitfield
.class == RegSIMD
2231 && t
->operand_types
[wanted
].bitfield
.byte
2232 + t
->operand_types
[wanted
].bitfield
.word
2233 + t
->operand_types
[wanted
].bitfield
.dword
2234 + t
->operand_types
[wanted
].bitfield
.qword
2235 > !!t
->opcode_modifier
.broadcast
)
2236 ? (i
.types
[given
].bitfield
.xmmword
2237 || i
.types
[given
].bitfield
.ymmword
2238 || i
.types
[given
].bitfield
.zmmword
)
2239 : !match_simd_size(t
, wanted
, given
))));
2242 /* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2243 operands for instruction template T, and it has MATCH_REVERSE set if there
2244 is no size conflict on any operands for the template with operands reversed
2245 (and the template allows for reversing in the first place). */
2247 #define MATCH_STRAIGHT 1
2248 #define MATCH_REVERSE 2
2250 static INLINE
unsigned int
2251 operand_size_match (const insn_template
*t
)
2253 unsigned int j
, match
= MATCH_STRAIGHT
;
2255 /* Don't check non-absolute jump instructions. */
2256 if (t
->opcode_modifier
.jump
2257 && t
->opcode_modifier
.jump
!= JUMP_ABSOLUTE
)
2260 /* Check memory and accumulator operand size. */
2261 for (j
= 0; j
< i
.operands
; j
++)
2263 if (i
.types
[j
].bitfield
.class != Reg
2264 && i
.types
[j
].bitfield
.class != RegSIMD
2265 && t
->opcode_modifier
.operandconstraint
== ANY_SIZE
)
2268 if (t
->operand_types
[j
].bitfield
.class == Reg
2269 && !match_operand_size (t
, j
, j
))
2275 if (t
->operand_types
[j
].bitfield
.class == RegSIMD
2276 && !match_simd_size (t
, j
, j
))
2282 if (t
->operand_types
[j
].bitfield
.instance
== Accum
2283 && (!match_operand_size (t
, j
, j
) || !match_simd_size (t
, j
, j
)))
2289 if ((i
.flags
[j
] & Operand_Mem
) && !match_mem_size (t
, j
, j
))
2296 if (!t
->opcode_modifier
.d
)
2299 /* Check reverse. */
2300 gas_assert (i
.operands
>= 2);
2302 for (j
= 0; j
< i
.operands
; j
++)
2304 unsigned int given
= i
.operands
- j
- 1;
2306 /* For FMA4 and XOP insns VEX.W controls just the first two
2307 register operands. And APX_F insns just swap the two source operands,
2308 with the 3rd one being the destination. */
2309 if (is_cpu (t
, CpuFMA4
) || is_cpu (t
, CpuXOP
)
2310 || is_cpu (t
, CpuAPX_F
))
2311 given
= j
< 2 ? 1 - j
: j
;
2313 if (t
->operand_types
[j
].bitfield
.class == Reg
2314 && !match_operand_size (t
, j
, given
))
2317 if (t
->operand_types
[j
].bitfield
.class == RegSIMD
2318 && !match_simd_size (t
, j
, given
))
2321 if (t
->operand_types
[j
].bitfield
.instance
== Accum
2322 && (!match_operand_size (t
, j
, given
)
2323 || !match_simd_size (t
, j
, given
)))
2326 if ((i
.flags
[given
] & Operand_Mem
) && !match_mem_size (t
, j
, given
))
2330 return match
| MATCH_REVERSE
;
2334 operand_type_match (i386_operand_type overlap
,
2335 i386_operand_type given
)
2337 i386_operand_type temp
= overlap
;
2339 temp
.bitfield
.unspecified
= 0;
2340 temp
.bitfield
.byte
= 0;
2341 temp
.bitfield
.word
= 0;
2342 temp
.bitfield
.dword
= 0;
2343 temp
.bitfield
.fword
= 0;
2344 temp
.bitfield
.qword
= 0;
2345 temp
.bitfield
.tbyte
= 0;
2346 temp
.bitfield
.xmmword
= 0;
2347 temp
.bitfield
.ymmword
= 0;
2348 temp
.bitfield
.zmmword
= 0;
2349 temp
.bitfield
.tmmword
= 0;
2350 if (operand_type_all_zero (&temp
))
2353 if (given
.bitfield
.baseindex
== overlap
.bitfield
.baseindex
)
2357 i
.error
= operand_type_mismatch
;
2361 /* If given types g0 and g1 are registers they must be of the same type
2362 unless the expected operand type register overlap is null.
2363 Intel syntax sized memory operands are also checked here. */
2366 operand_type_register_match (i386_operand_type g0
,
2367 i386_operand_type t0
,
2368 i386_operand_type g1
,
2369 i386_operand_type t1
)
2371 if (g0
.bitfield
.class != Reg
2372 && g0
.bitfield
.class != RegSIMD
2373 && (g0
.bitfield
.unspecified
2374 || !operand_type_check (g0
, anymem
)))
2377 if (g1
.bitfield
.class != Reg
2378 && g1
.bitfield
.class != RegSIMD
2379 && (g1
.bitfield
.unspecified
2380 || !operand_type_check (g1
, anymem
)))
2383 if (g0
.bitfield
.byte
== g1
.bitfield
.byte
2384 && g0
.bitfield
.word
== g1
.bitfield
.word
2385 && g0
.bitfield
.dword
== g1
.bitfield
.dword
2386 && g0
.bitfield
.qword
== g1
.bitfield
.qword
2387 && g0
.bitfield
.xmmword
== g1
.bitfield
.xmmword
2388 && g0
.bitfield
.ymmword
== g1
.bitfield
.ymmword
2389 && g0
.bitfield
.zmmword
== g1
.bitfield
.zmmword
)
2392 /* If expectations overlap in no more than a single size, all is fine. */
2393 g0
= operand_type_and (t0
, t1
);
2394 if (g0
.bitfield
.byte
2398 + g0
.bitfield
.xmmword
2399 + g0
.bitfield
.ymmword
2400 + g0
.bitfield
.zmmword
<= 1)
2403 i
.error
= register_type_mismatch
;
2408 static INLINE
unsigned int
2409 register_number (const reg_entry
*r
)
2411 unsigned int nr
= r
->reg_num
;
2413 if (r
->reg_flags
& RegRex
)
2416 if (r
->reg_flags
& (RegVRex
| RegRex2
))
2422 static INLINE
unsigned int
2423 mode_from_disp_size (i386_operand_type t
)
2425 if (t
.bitfield
.disp8
)
2427 else if (t
.bitfield
.disp16
2428 || t
.bitfield
.disp32
)
2435 fits_in_signed_byte (addressT num
)
2437 return num
+ 0x80 <= 0xff;
2441 fits_in_unsigned_byte (addressT num
)
2447 fits_in_unsigned_word (addressT num
)
2449 return num
<= 0xffff;
2453 fits_in_signed_word (addressT num
)
2455 return num
+ 0x8000 <= 0xffff;
2459 fits_in_signed_long (addressT num ATTRIBUTE_UNUSED
)
2464 return num
+ 0x80000000 <= 0xffffffff;
2466 } /* fits_in_signed_long() */
2469 fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED
)
2474 return num
<= 0xffffffff;
2476 } /* fits_in_unsigned_long() */
2478 static INLINE valueT
extend_to_32bit_address (addressT num
)
2481 if (fits_in_unsigned_long(num
))
2482 return (num
^ ((addressT
) 1 << 31)) - ((addressT
) 1 << 31);
2484 if (!fits_in_signed_long (num
))
2485 return num
& 0xffffffff;
2492 fits_in_disp8 (offsetT num
)
2494 int shift
= i
.memshift
;
2500 mask
= (1 << shift
) - 1;
2502 /* Return 0 if NUM isn't properly aligned. */
2506 /* Check if NUM will fit in 8bit after shift. */
2507 return fits_in_signed_byte (num
>> shift
);
2511 fits_in_imm4 (offsetT num
)
2513 /* Despite the name, check for imm3 if we're dealing with EVEX. */
2514 return (num
& (i
.encoding
!= encoding_evex
2515 && i
.encoding
!= encoding_egpr
? 0xf : 7)) == num
;
2518 static i386_operand_type
2519 smallest_imm_type (offsetT num
)
2521 i386_operand_type t
;
2523 operand_type_set (&t
, 0);
2524 t
.bitfield
.imm64
= 1;
2526 if (cpu_arch_tune
!= PROCESSOR_I486
&& num
== 1)
2528 /* This code is disabled on the 486 because all the Imm1 forms
2529 in the opcode table are slower on the i486. They're the
2530 versions with the implicitly specified single-position
2531 displacement, which has another syntax if you really want to
2533 t
.bitfield
.imm1
= 1;
2534 t
.bitfield
.imm8
= 1;
2535 t
.bitfield
.imm8s
= 1;
2536 t
.bitfield
.imm16
= 1;
2537 t
.bitfield
.imm32
= 1;
2538 t
.bitfield
.imm32s
= 1;
2540 else if (fits_in_signed_byte (num
))
2542 if (fits_in_unsigned_byte (num
))
2543 t
.bitfield
.imm8
= 1;
2544 t
.bitfield
.imm8s
= 1;
2545 t
.bitfield
.imm16
= 1;
2546 if (flag_code
!= CODE_64BIT
|| fits_in_unsigned_long (num
))
2547 t
.bitfield
.imm32
= 1;
2548 t
.bitfield
.imm32s
= 1;
2550 else if (fits_in_unsigned_byte (num
))
2552 t
.bitfield
.imm8
= 1;
2553 t
.bitfield
.imm16
= 1;
2554 t
.bitfield
.imm32
= 1;
2555 t
.bitfield
.imm32s
= 1;
2557 else if (fits_in_signed_word (num
) || fits_in_unsigned_word (num
))
2559 t
.bitfield
.imm16
= 1;
2560 if (flag_code
!= CODE_64BIT
|| fits_in_unsigned_long (num
))
2561 t
.bitfield
.imm32
= 1;
2562 t
.bitfield
.imm32s
= 1;
2564 else if (fits_in_signed_long (num
))
2566 if (flag_code
!= CODE_64BIT
|| fits_in_unsigned_long (num
))
2567 t
.bitfield
.imm32
= 1;
2568 t
.bitfield
.imm32s
= 1;
2570 else if (fits_in_unsigned_long (num
))
2571 t
.bitfield
.imm32
= 1;
2577 offset_in_range (offsetT val
, int size
)
2583 case 1: mask
= ((addressT
) 1 << 8) - 1; break;
2584 case 2: mask
= ((addressT
) 1 << 16) - 1; break;
2586 case 4: mask
= ((addressT
) 1 << 32) - 1; break;
2588 case sizeof (val
): return val
;
2592 if ((val
& ~mask
) != 0 && (-val
& ~mask
) != 0)
2593 as_warn (_("0x%" PRIx64
" shortened to 0x%" PRIx64
),
2594 (uint64_t) val
, (uint64_t) (val
& mask
));
2599 static INLINE
const char *insn_name (const insn_template
*t
)
2601 return &i386_mnemonics
[t
->mnem_off
];
2614 a. PREFIX_EXIST if attempting to add a prefix where one from the
2615 same class already exists.
2616 b. PREFIX_LOCK if lock prefix is added.
2617 c. PREFIX_REP if rep/repne prefix is added.
2618 d. PREFIX_DS if ds prefix is added.
2619 e. PREFIX_OTHER if other prefix is added.
2622 static enum PREFIX_GROUP
2623 add_prefix (unsigned int prefix
)
2625 enum PREFIX_GROUP ret
= PREFIX_OTHER
;
2628 if (prefix
>= REX_OPCODE
&& prefix
< REX_OPCODE
+ 16
2629 && flag_code
== CODE_64BIT
)
2631 if ((i
.prefix
[REX_PREFIX
] & prefix
& REX_W
)
2632 || (i
.prefix
[REX_PREFIX
] & prefix
& REX_R
)
2633 || (i
.prefix
[REX_PREFIX
] & prefix
& REX_X
)
2634 || (i
.prefix
[REX_PREFIX
] & prefix
& REX_B
))
2645 case DS_PREFIX_OPCODE
:
2648 case CS_PREFIX_OPCODE
:
2649 case ES_PREFIX_OPCODE
:
2650 case FS_PREFIX_OPCODE
:
2651 case GS_PREFIX_OPCODE
:
2652 case SS_PREFIX_OPCODE
:
2656 case REPNE_PREFIX_OPCODE
:
2657 case REPE_PREFIX_OPCODE
:
2662 case LOCK_PREFIX_OPCODE
:
2671 case ADDR_PREFIX_OPCODE
:
2675 case DATA_PREFIX_OPCODE
:
2679 if (i
.prefix
[q
] != 0)
2687 i
.prefix
[q
] |= prefix
;
2690 as_bad (_("same type of prefix used twice"));
2696 update_code_flag (int value
, int check
)
2698 PRINTF_LIKE ((*as_error
)) = check
? as_fatal
: as_bad
;
2700 if (value
== CODE_64BIT
&& !cpu_arch_flags
.bitfield
.cpu64
)
2702 as_error (_("64bit mode not supported on `%s'."),
2703 cpu_arch_name
? cpu_arch_name
: default_arch
);
2707 if (value
== CODE_32BIT
&& !cpu_arch_flags
.bitfield
.cpui386
)
2709 as_error (_("32bit mode not supported on `%s'."),
2710 cpu_arch_name
? cpu_arch_name
: default_arch
);
2714 flag_code
= (enum flag_code
) value
;
2716 stackop_size
= '\0';
2720 set_code_flag (int value
)
2722 update_code_flag (value
, 0);
2726 set_16bit_gcc_code_flag (int new_code_flag
)
2728 flag_code
= (enum flag_code
) new_code_flag
;
2729 if (flag_code
!= CODE_16BIT
)
2731 stackop_size
= LONG_MNEM_SUFFIX
;
2735 _set_intel_syntax (int syntax_flag
)
2737 intel_syntax
= syntax_flag
;
2739 expr_set_rank (O_full_ptr
, syntax_flag
? 10 : 0);
2741 register_prefix
= allow_naked_reg
? "" : "%";
2745 set_intel_syntax (int syntax_flag
)
2747 /* Find out if register prefixing is specified. */
2748 int ask_naked_reg
= 0;
2751 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
2754 int e
= get_symbol_name (&string
);
2756 if (strcmp (string
, "prefix") == 0)
2758 else if (strcmp (string
, "noprefix") == 0)
2761 as_bad (_("bad argument to syntax directive."));
2762 (void) restore_line_pointer (e
);
2764 demand_empty_rest_of_line ();
2766 if (ask_naked_reg
== 0)
2767 allow_naked_reg
= (syntax_flag
2768 && (bfd_get_symbol_leading_char (stdoutput
) != '\0'));
2770 allow_naked_reg
= (ask_naked_reg
< 0);
2772 _set_intel_syntax (syntax_flag
);
2776 set_intel_mnemonic (int mnemonic_flag
)
2778 intel_mnemonic
= mnemonic_flag
;
2782 set_allow_index_reg (int flag
)
2784 allow_index_reg
= flag
;
2788 set_check (int what
)
2790 enum check_kind
*kind
;
2795 kind
= &operand_check
;
2806 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
2809 int e
= get_symbol_name (&string
);
2811 if (strcmp (string
, "none") == 0)
2813 else if (strcmp (string
, "warning") == 0)
2814 *kind
= check_warning
;
2815 else if (strcmp (string
, "error") == 0)
2816 *kind
= check_error
;
2818 as_bad (_("bad argument to %s_check directive."), str
);
2819 (void) restore_line_pointer (e
);
2822 as_bad (_("missing argument for %s_check directive"), str
);
2824 demand_empty_rest_of_line ();
2828 check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED
,
2829 i386_cpu_flags new_flag ATTRIBUTE_UNUSED
)
2831 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2832 static const char *arch
;
2834 /* Intel MCU is only supported on ELF. */
2840 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2841 use default_arch. */
2842 arch
= cpu_arch_name
;
2844 arch
= default_arch
;
2847 /* If we are targeting Intel MCU, we must enable it. */
2848 if ((get_elf_backend_data (stdoutput
)->elf_machine_code
== EM_IAMCU
)
2849 == new_flag
.bitfield
.cpuiamcu
)
2852 as_bad (_("`%s' is not supported on `%s'"), name
, arch
);
2857 extend_cpu_sub_arch_name (const char *pfx
, const char *name
)
2859 if (cpu_sub_arch_name
)
2860 cpu_sub_arch_name
= reconcat (cpu_sub_arch_name
, cpu_sub_arch_name
,
2861 pfx
, name
, (const char *) NULL
);
2863 cpu_sub_arch_name
= concat (pfx
, name
, (const char *) NULL
);
2866 static void isa_enable (unsigned int idx
)
2868 i386_cpu_flags flags
= cpu_flags_or (cpu_arch_flags
, cpu_arch
[idx
].enable
);
2870 if (!cpu_flags_equal (&flags
, &cpu_arch_flags
))
2872 extend_cpu_sub_arch_name (".", cpu_arch
[idx
].name
);
2873 cpu_arch_flags
= flags
;
2876 cpu_arch_isa_flags
= cpu_flags_or (cpu_arch_isa_flags
, cpu_arch
[idx
].enable
);
2879 static void isa_disable (unsigned int idx
)
2881 i386_cpu_flags flags
2882 = cpu_flags_and_not (cpu_arch_flags
, cpu_arch
[idx
].disable
);
2884 if (!cpu_flags_equal (&flags
, &cpu_arch_flags
))
2886 extend_cpu_sub_arch_name (".no", cpu_arch
[idx
].name
);
2887 cpu_arch_flags
= flags
;
2891 = cpu_flags_and_not (cpu_arch_isa_flags
, cpu_arch
[idx
].disable
);
2895 set_cpu_arch (int dummy ATTRIBUTE_UNUSED
)
2897 typedef struct arch_stack_entry
2899 const struct arch_stack_entry
*prev
;
2902 i386_cpu_flags flags
;
2903 i386_cpu_flags isa_flags
;
2904 enum processor_type isa
;
2905 enum flag_code flag_code
;
2906 unsigned int vector_size
;
2908 bool no_cond_jump_promotion
;
2910 static const arch_stack_entry
*arch_stack_top
;
2918 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
2920 as_bad (_("missing cpu architecture"));
2921 input_line_pointer
++;
2925 e
= get_symbol_name (&s
);
2928 if (strcmp (string
, "push") == 0)
2930 arch_stack_entry
*top
= XNEW (arch_stack_entry
);
2932 top
->name
= cpu_arch_name
;
2933 if (cpu_sub_arch_name
)
2934 top
->sub_name
= xstrdup (cpu_sub_arch_name
);
2936 top
->sub_name
= NULL
;
2937 top
->flags
= cpu_arch_flags
;
2938 top
->isa
= cpu_arch_isa
;
2939 top
->isa_flags
= cpu_arch_isa_flags
;
2940 top
->flag_code
= flag_code
;
2941 top
->vector_size
= vector_size
;
2942 top
->stackop_size
= stackop_size
;
2943 top
->no_cond_jump_promotion
= no_cond_jump_promotion
;
2945 top
->prev
= arch_stack_top
;
2946 arch_stack_top
= top
;
2948 (void) restore_line_pointer (e
);
2949 demand_empty_rest_of_line ();
2953 if (strcmp (string
, "pop") == 0)
2955 const arch_stack_entry
*top
= arch_stack_top
;
2958 as_bad (_(".arch stack is empty"));
2959 else if (top
->flag_code
!= flag_code
2960 || top
->stackop_size
!= stackop_size
)
2962 static const unsigned int bits
[] = {
2968 as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"),
2969 bits
[top
->flag_code
],
2970 top
->stackop_size
== LONG_MNEM_SUFFIX
? "gcc" : "");
2974 arch_stack_top
= top
->prev
;
2976 cpu_arch_name
= top
->name
;
2977 free (cpu_sub_arch_name
);
2978 cpu_sub_arch_name
= top
->sub_name
;
2979 cpu_arch_flags
= top
->flags
;
2980 cpu_arch_isa
= top
->isa
;
2981 cpu_arch_isa_flags
= top
->isa_flags
;
2982 vector_size
= top
->vector_size
;
2983 no_cond_jump_promotion
= top
->no_cond_jump_promotion
;
2988 (void) restore_line_pointer (e
);
2989 demand_empty_rest_of_line ();
2993 if (strcmp (string
, "default") == 0)
2995 if (strcmp (default_arch
, "iamcu") == 0)
2996 string
= default_arch
;
2999 static const i386_cpu_flags cpu_unknown_flags
= CPU_UNKNOWN_FLAGS
;
3001 cpu_arch_name
= NULL
;
3002 free (cpu_sub_arch_name
);
3003 cpu_sub_arch_name
= NULL
;
3004 cpu_arch_flags
= cpu_unknown_flags
;
3005 cpu_arch_isa
= PROCESSOR_UNKNOWN
;
3006 cpu_arch_isa_flags
= cpu_arch
[flag_code
== CODE_64BIT
].enable
;
3007 if (!cpu_arch_tune_set
)
3008 cpu_arch_tune
= PROCESSOR_UNKNOWN
;
3010 vector_size
= VSZ_DEFAULT
;
3012 j
= ARRAY_SIZE (cpu_arch
) + 1;
3016 for (; j
< ARRAY_SIZE (cpu_arch
); j
++)
3018 if (strcmp (string
+ (*string
== '.'), cpu_arch
[j
].name
) == 0
3019 && (*string
== '.') == (cpu_arch
[j
].type
== PROCESSOR_NONE
))
3023 check_cpu_arch_compatible (string
, cpu_arch
[j
].enable
);
3025 if (flag_code
== CODE_64BIT
&& !cpu_arch
[j
].enable
.bitfield
.cpu64
)
3027 as_bad (_("64bit mode not supported on `%s'."),
3029 (void) restore_line_pointer (e
);
3030 ignore_rest_of_line ();
3034 if (flag_code
== CODE_32BIT
&& !cpu_arch
[j
].enable
.bitfield
.cpui386
)
3036 as_bad (_("32bit mode not supported on `%s'."),
3038 (void) restore_line_pointer (e
);
3039 ignore_rest_of_line ();
3043 cpu_arch_name
= cpu_arch
[j
].name
;
3044 free (cpu_sub_arch_name
);
3045 cpu_sub_arch_name
= NULL
;
3046 cpu_arch_flags
= cpu_arch
[j
].enable
;
3047 cpu_arch_isa
= cpu_arch
[j
].type
;
3048 cpu_arch_isa_flags
= cpu_arch
[j
].enable
;
3049 if (!cpu_arch_tune_set
)
3050 cpu_arch_tune
= cpu_arch_isa
;
3052 vector_size
= VSZ_DEFAULT
;
3054 pre_386_16bit_warned
= false;
3058 if (cpu_flags_all_zero (&cpu_arch
[j
].enable
))
3063 (void) restore_line_pointer (e
);
3065 switch (cpu_arch
[j
].vsz
)
3071 #ifdef SVR4_COMMENT_CHARS
3072 if (*input_line_pointer
== ':' || *input_line_pointer
== '/')
3074 if (*input_line_pointer
== '/')
3077 ++input_line_pointer
;
3078 switch (get_absolute_expression ())
3080 case 512: vector_size
= VSZ512
; break;
3081 case 256: vector_size
= VSZ256
; break;
3082 case 128: vector_size
= VSZ128
; break;
3084 as_bad (_("Unrecognized vector size specifier"));
3085 ignore_rest_of_line ();
3092 vector_size
= VSZ_DEFAULT
;
3096 demand_empty_rest_of_line ();
3101 if (startswith (string
, ".no") && j
>= ARRAY_SIZE (cpu_arch
))
3103 /* Disable an ISA extension. */
3104 for (j
= 0; j
< ARRAY_SIZE (cpu_arch
); j
++)
3105 if (cpu_arch
[j
].type
== PROCESSOR_NONE
3106 && strcmp (string
+ 3, cpu_arch
[j
].name
) == 0)
3110 if (cpu_arch
[j
].vsz
== vsz_set
)
3111 vector_size
= VSZ_DEFAULT
;
3113 (void) restore_line_pointer (e
);
3114 demand_empty_rest_of_line ();
3119 if (j
== ARRAY_SIZE (cpu_arch
))
3120 as_bad (_("no such architecture: `%s'"), string
);
3122 *input_line_pointer
= e
;
3124 no_cond_jump_promotion
= 0;
3125 if (*input_line_pointer
== ','
3126 && !is_end_of_line
[(unsigned char) input_line_pointer
[1]])
3128 ++input_line_pointer
;
3129 e
= get_symbol_name (&s
);
3132 if (strcmp (string
, "nojumps") == 0)
3133 no_cond_jump_promotion
= 1;
3134 else if (strcmp (string
, "jumps") == 0)
3137 as_bad (_("no such architecture modifier: `%s'"), string
);
3139 (void) restore_line_pointer (e
);
3142 demand_empty_rest_of_line ();
3145 enum bfd_architecture
3148 if (cpu_arch_isa
== PROCESSOR_IAMCU
)
3150 if (!IS_ELF
|| flag_code
== CODE_64BIT
)
3151 as_fatal (_("Intel MCU is 32bit ELF only"));
3152 return bfd_arch_iamcu
;
3155 return bfd_arch_i386
;
3161 if (startswith (default_arch
, "x86_64"))
3163 if (default_arch
[6] == '\0')
3164 return bfd_mach_x86_64
;
3166 return bfd_mach_x64_32
;
3168 else if (!strcmp (default_arch
, "i386")
3169 || !strcmp (default_arch
, "iamcu"))
3171 if (cpu_arch_isa
== PROCESSOR_IAMCU
)
3174 as_fatal (_("Intel MCU is 32bit ELF only"));
3175 return bfd_mach_i386_iamcu
;
3178 return bfd_mach_i386_i386
;
3181 as_fatal (_("unknown architecture"));
3184 #include "opcodes/i386-tbl.h"
3187 op_lookup (const char *mnemonic
)
3189 i386_op_off_t
*pos
= str_hash_find (op_hash
, mnemonic
);
3193 current_templates
.start
= &i386_optab
[pos
[0]];
3194 current_templates
.end
= &i386_optab
[pos
[1]];
3197 current_templates
.end
= current_templates
.start
= NULL
;
3203 /* Support pseudo prefixes like {disp32}. */
3204 lex_type
['{'] = LEX_BEGIN_NAME
;
3206 /* Initialize op_hash hash table. */
3207 op_hash
= str_htab_create ();
3210 const i386_op_off_t
*cur
= i386_op_sets
;
3211 const i386_op_off_t
*end
= cur
+ ARRAY_SIZE (i386_op_sets
) - 1;
3213 for (; cur
< end
; ++cur
)
3214 if (str_hash_insert (op_hash
, insn_name (&i386_optab
[*cur
]), cur
, 0))
3215 as_fatal (_("duplicate %s"), insn_name (&i386_optab
[*cur
]));
3218 /* Initialize reg_hash hash table. */
3219 reg_hash
= str_htab_create ();
3221 const reg_entry
*regtab
;
3222 unsigned int regtab_size
= i386_regtab_size
;
3224 for (regtab
= i386_regtab
; regtab_size
--; regtab
++)
3226 switch (regtab
->reg_type
.bitfield
.class)
3229 if (regtab
->reg_type
.bitfield
.dword
)
3231 if (regtab
->reg_type
.bitfield
.instance
== Accum
)
3234 else if (regtab
->reg_type
.bitfield
.tbyte
)
3236 /* There's no point inserting st(<N>) in the hash table, as
3237 parentheses aren't included in register_chars[] anyway. */
3238 if (regtab
->reg_type
.bitfield
.instance
!= Accum
)
3245 switch (regtab
->reg_num
)
3247 case 0: reg_es
= regtab
; break;
3248 case 2: reg_ss
= regtab
; break;
3249 case 3: reg_ds
= regtab
; break;
3254 if (!regtab
->reg_num
)
3259 if (str_hash_insert (reg_hash
, regtab
->reg_name
, regtab
, 0) != NULL
)
3260 as_fatal (_("duplicate %s"), regtab
->reg_name
);
3264 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
3269 for (c
= 0; c
< 256; c
++)
3271 if (ISDIGIT (c
) || ISLOWER (c
))
3273 mnemonic_chars
[c
] = c
;
3274 register_chars
[c
] = c
;
3275 operand_chars
[c
] = c
;
3277 else if (ISUPPER (c
))
3279 mnemonic_chars
[c
] = TOLOWER (c
);
3280 register_chars
[c
] = mnemonic_chars
[c
];
3281 operand_chars
[c
] = c
;
3283 #ifdef SVR4_COMMENT_CHARS
3284 else if (c
== '\\' && strchr (i386_comment_chars
, '/'))
3285 operand_chars
[c
] = c
;
3289 operand_chars
[c
] = c
;
3292 mnemonic_chars
['_'] = '_';
3293 mnemonic_chars
['-'] = '-';
3294 mnemonic_chars
['.'] = '.';
3296 for (p
= extra_symbol_chars
; *p
!= '\0'; p
++)
3297 operand_chars
[(unsigned char) *p
] = *p
;
3298 for (p
= operand_special_chars
; *p
!= '\0'; p
++)
3299 operand_chars
[(unsigned char) *p
] = *p
;
3304 #if defined (OBJ_COFF) && defined (TE_PE)
3305 x86_dwarf2_return_column
= (OUTPUT_FLAVOR
== bfd_target_coff_flavour
3308 x86_dwarf2_return_column
= 16;
3310 x86_cie_data_alignment
= -8;
3311 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3312 x86_sframe_cfa_sp_reg
= REG_SP
;
3313 x86_sframe_cfa_fp_reg
= REG_FP
;
3318 x86_dwarf2_return_column
= 8;
3319 x86_cie_data_alignment
= -4;
3322 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3323 can be turned into BRANCH_PREFIX frag. */
3324 if (align_branch_prefix_size
> MAX_FUSED_JCC_PADDING_SIZE
)
3329 i386_print_statistics (FILE *file
)
3331 htab_print_statistics (file
, "i386 opcode", op_hash
);
3332 htab_print_statistics (file
, "i386 register", reg_hash
);
3338 htab_delete (op_hash
);
3339 htab_delete (reg_hash
);
3344 /* Debugging routines for md_assemble. */
3345 static void pte (insn_template
*);
3346 static void pt (i386_operand_type
);
3347 static void pe (expressionS
*);
3348 static void ps (symbolS
*);
3351 pi (const char *line
, i386_insn
*x
)
3355 fprintf (stdout
, "%s: template ", line
);
3357 fprintf (stdout
, " address: base %s index %s scale %x\n",
3358 x
->base_reg
? x
->base_reg
->reg_name
: "none",
3359 x
->index_reg
? x
->index_reg
->reg_name
: "none",
3360 x
->log2_scale_factor
);
3361 fprintf (stdout
, " modrm: mode %x reg %x reg/mem %x\n",
3362 x
->rm
.mode
, x
->rm
.reg
, x
->rm
.regmem
);
3363 fprintf (stdout
, " sib: base %x index %x scale %x\n",
3364 x
->sib
.base
, x
->sib
.index
, x
->sib
.scale
);
3365 fprintf (stdout
, " rex: 64bit %x extX %x extY %x extZ %x\n",
3366 (x
->rex
& REX_W
) != 0,
3367 (x
->rex
& REX_R
) != 0,
3368 (x
->rex
& REX_X
) != 0,
3369 (x
->rex
& REX_B
) != 0);
3370 for (j
= 0; j
< x
->operands
; j
++)
3372 fprintf (stdout
, " #%d: ", j
+ 1);
3374 fprintf (stdout
, "\n");
3375 if (x
->types
[j
].bitfield
.class == Reg
3376 || x
->types
[j
].bitfield
.class == RegMMX
3377 || x
->types
[j
].bitfield
.class == RegSIMD
3378 || x
->types
[j
].bitfield
.class == RegMask
3379 || x
->types
[j
].bitfield
.class == SReg
3380 || x
->types
[j
].bitfield
.class == RegCR
3381 || x
->types
[j
].bitfield
.class == RegDR
3382 || x
->types
[j
].bitfield
.class == RegTR
3383 || x
->types
[j
].bitfield
.class == RegBND
)
3384 fprintf (stdout
, "%s\n", x
->op
[j
].regs
->reg_name
);
3385 if (operand_type_check (x
->types
[j
], imm
))
3387 if (operand_type_check (x
->types
[j
], disp
))
3388 pe (x
->op
[j
].disps
);
3393 pte (insn_template
*t
)
3395 static const unsigned char opc_pfx
[] = { 0, 0x66, 0xf3, 0xf2 };
3396 static const char *const opc_spc
[] = {
3397 NULL
, "0f", "0f38", "0f3a", NULL
, "evexmap5", "evexmap6", NULL
,
3398 "XOP08", "XOP09", "XOP0A",
3402 fprintf (stdout
, " %d operands ", t
->operands
);
3403 if (opc_pfx
[t
->opcode_modifier
.opcodeprefix
])
3404 fprintf (stdout
, "pfx %x ", opc_pfx
[t
->opcode_modifier
.opcodeprefix
]);
3405 if (opc_spc
[t
->opcode_space
])
3406 fprintf (stdout
, "space %s ", opc_spc
[t
->opcode_space
]);
3407 fprintf (stdout
, "opcode %x ", t
->base_opcode
);
3408 if (t
->extension_opcode
!= None
)
3409 fprintf (stdout
, "ext %x ", t
->extension_opcode
);
3410 if (t
->opcode_modifier
.d
)
3411 fprintf (stdout
, "D");
3412 if (t
->opcode_modifier
.w
)
3413 fprintf (stdout
, "W");
3414 fprintf (stdout
, "\n");
3415 for (j
= 0; j
< t
->operands
; j
++)
3417 fprintf (stdout
, " #%d type ", j
+ 1);
3418 pt (t
->operand_types
[j
]);
3419 fprintf (stdout
, "\n");
3426 fprintf (stdout
, " operation %d\n", e
->X_op
);
3427 fprintf (stdout
, " add_number %" PRId64
" (%" PRIx64
")\n",
3428 (int64_t) e
->X_add_number
, (uint64_t) (valueT
) e
->X_add_number
);
3429 if (e
->X_add_symbol
)
3431 fprintf (stdout
, " add_symbol ");
3432 ps (e
->X_add_symbol
);
3433 fprintf (stdout
, "\n");
3437 fprintf (stdout
, " op_symbol ");
3438 ps (e
->X_op_symbol
);
3439 fprintf (stdout
, "\n");
3446 fprintf (stdout
, "%s type %s%s",
3448 S_IS_EXTERNAL (s
) ? "EXTERNAL " : "",
3449 segment_name (S_GET_SEGMENT (s
)));
3452 static struct type_name
3454 i386_operand_type mask
;
3457 const type_names
[] =
3459 { { .bitfield
= { .class = Reg
, .byte
= 1 } }, "r8" },
3460 { { .bitfield
= { .class = Reg
, .word
= 1 } }, "r16" },
3461 { { .bitfield
= { .class = Reg
, .dword
= 1 } }, "r32" },
3462 { { .bitfield
= { .class = Reg
, .qword
= 1 } }, "r64" },
3463 { { .bitfield
= { .instance
= Accum
, .byte
= 1 } }, "acc8" },
3464 { { .bitfield
= { .instance
= Accum
, .word
= 1 } }, "acc16" },
3465 { { .bitfield
= { .instance
= Accum
, .dword
= 1 } }, "acc32" },
3466 { { .bitfield
= { .instance
= Accum
, .qword
= 1 } }, "acc64" },
3467 { { .bitfield
= { .imm8
= 1 } }, "i8" },
3468 { { .bitfield
= { .imm8s
= 1 } }, "i8s" },
3469 { { .bitfield
= { .imm16
= 1 } }, "i16" },
3470 { { .bitfield
= { .imm32
= 1 } }, "i32" },
3471 { { .bitfield
= { .imm32s
= 1 } }, "i32s" },
3472 { { .bitfield
= { .imm64
= 1 } }, "i64" },
3473 { { .bitfield
= { .imm1
= 1 } }, "i1" },
3474 { { .bitfield
= { .baseindex
= 1 } }, "BaseIndex" },
3475 { { .bitfield
= { .disp8
= 1 } }, "d8" },
3476 { { .bitfield
= { .disp16
= 1 } }, "d16" },
3477 { { .bitfield
= { .disp32
= 1 } }, "d32" },
3478 { { .bitfield
= { .disp64
= 1 } }, "d64" },
3479 { { .bitfield
= { .instance
= RegD
, .word
= 1 } }, "InOutPortReg" },
3480 { { .bitfield
= { .instance
= RegC
, .byte
= 1 } }, "ShiftCount" },
3481 { { .bitfield
= { .class = RegCR
} }, "control reg" },
3482 { { .bitfield
= { .class = RegTR
} }, "test reg" },
3483 { { .bitfield
= { .class = RegDR
} }, "debug reg" },
3484 { { .bitfield
= { .class = Reg
, .tbyte
= 1 } }, "FReg" },
3485 { { .bitfield
= { .instance
= Accum
, .tbyte
= 1 } }, "FAcc" },
3486 { { .bitfield
= { .class = SReg
} }, "SReg" },
3487 { { .bitfield
= { .class = RegMMX
} }, "rMMX" },
3488 { { .bitfield
= { .class = RegSIMD
, .xmmword
= 1 } }, "rXMM" },
3489 { { .bitfield
= { .class = RegSIMD
, .ymmword
= 1 } }, "rYMM" },
3490 { { .bitfield
= { .class = RegSIMD
, .zmmword
= 1 } }, "rZMM" },
3491 { { .bitfield
= { .class = RegSIMD
, .tmmword
= 1 } }, "rTMM" },
3492 { { .bitfield
= { .class = RegMask
} }, "Mask reg" },
3496 pt (i386_operand_type t
)
3499 i386_operand_type a
;
3501 for (j
= 0; j
< ARRAY_SIZE (type_names
); j
++)
3503 a
= operand_type_and (t
, type_names
[j
].mask
);
3504 if (operand_type_equal (&a
, &type_names
[j
].mask
))
3505 fprintf (stdout
, "%s, ", type_names
[j
].name
);
3510 #endif /* DEBUG386 */
3512 static bfd_reloc_code_real_type
3513 reloc (unsigned int size
,
3516 bfd_reloc_code_real_type other
)
3518 if (other
!= NO_RELOC
)
3520 reloc_howto_type
*rel
;
3525 case BFD_RELOC_X86_64_GOT32
:
3526 return BFD_RELOC_X86_64_GOT64
;
3528 case BFD_RELOC_X86_64_GOTPLT64
:
3529 return BFD_RELOC_X86_64_GOTPLT64
;
3531 case BFD_RELOC_X86_64_PLTOFF64
:
3532 return BFD_RELOC_X86_64_PLTOFF64
;
3534 case BFD_RELOC_X86_64_GOTPC32
:
3535 other
= BFD_RELOC_X86_64_GOTPC64
;
3537 case BFD_RELOC_X86_64_GOTPCREL
:
3538 other
= BFD_RELOC_X86_64_GOTPCREL64
;
3540 case BFD_RELOC_X86_64_TPOFF32
:
3541 other
= BFD_RELOC_X86_64_TPOFF64
;
3543 case BFD_RELOC_X86_64_DTPOFF32
:
3544 other
= BFD_RELOC_X86_64_DTPOFF64
;
3550 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3551 if (other
== BFD_RELOC_SIZE32
)
3554 other
= BFD_RELOC_SIZE64
;
3557 as_bad (_("there are no pc-relative size relocations"));
3563 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
3564 if (size
== 4 && (flag_code
!= CODE_64BIT
|| disallow_64bit_reloc
))
3567 rel
= bfd_reloc_type_lookup (stdoutput
, other
);
3569 as_bad (_("unknown relocation (%u)"), other
);
3570 else if (size
!= bfd_get_reloc_size (rel
))
3571 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
3572 bfd_get_reloc_size (rel
),
3574 else if (pcrel
&& !rel
->pc_relative
)
3575 as_bad (_("non-pc-relative relocation for pc-relative field"));
3576 else if ((rel
->complain_on_overflow
== complain_overflow_signed
3578 || (rel
->complain_on_overflow
== complain_overflow_unsigned
3580 as_bad (_("relocated field and relocation type differ in signedness"));
3589 as_bad (_("there are no unsigned pc-relative relocations"));
3592 case 1: return BFD_RELOC_8_PCREL
;
3593 case 2: return BFD_RELOC_16_PCREL
;
3594 case 4: return BFD_RELOC_32_PCREL
;
3595 case 8: return BFD_RELOC_64_PCREL
;
3597 as_bad (_("cannot do %u byte pc-relative relocation"), size
);
3604 case 4: return BFD_RELOC_X86_64_32S
;
3609 case 1: return BFD_RELOC_8
;
3610 case 2: return BFD_RELOC_16
;
3611 case 4: return BFD_RELOC_32
;
3612 case 8: return BFD_RELOC_64
;
3614 as_bad (_("cannot do %s %u byte relocation"),
3615 sign
> 0 ? "signed" : "unsigned", size
);
3621 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3622 /* Here we decide which fixups can be adjusted to make them relative to
3623 the beginning of the section instead of the symbol. Basically we need
3624 to make sure that the dynamic relocations are done correctly, so in
3625 some cases we force the original symbol to be used. */
3628 tc_i386_fix_adjustable (fixS
*fixP
)
3633 /* Don't adjust pc-relative references to merge sections in 64-bit
3635 if (use_rela_relocations
3636 && (S_GET_SEGMENT (fixP
->fx_addsy
)->flags
& SEC_MERGE
) != 0
3640 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3641 and changed later by validate_fix. */
3642 if (GOT_symbol
&& fixP
->fx_subsy
== GOT_symbol
3643 && fixP
->fx_r_type
== BFD_RELOC_32_PCREL
)
3646 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3647 for size relocations. */
3648 if (fixP
->fx_r_type
== BFD_RELOC_SIZE32
3649 || fixP
->fx_r_type
== BFD_RELOC_SIZE64
3650 || fixP
->fx_r_type
== BFD_RELOC_386_GOTOFF
3651 || fixP
->fx_r_type
== BFD_RELOC_386_GOT32
3652 || fixP
->fx_r_type
== BFD_RELOC_386_GOT32X
3653 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_GD
3654 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LDM
3655 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LDO_32
3656 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_IE_32
3657 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_IE
3658 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_GOTIE
3659 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LE_32
3660 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LE
3661 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_GOTDESC
3662 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_DESC_CALL
3663 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOT32
3664 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTPCREL
3665 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTPCRELX
3666 || fixP
->fx_r_type
== BFD_RELOC_X86_64_REX_GOTPCRELX
3667 || fixP
->fx_r_type
== BFD_RELOC_X86_64_CODE_4_GOTPCRELX
3668 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TLSGD
3669 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TLSLD
3670 || fixP
->fx_r_type
== BFD_RELOC_X86_64_DTPOFF32
3671 || fixP
->fx_r_type
== BFD_RELOC_X86_64_DTPOFF64
3672 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTTPOFF
3673 || fixP
->fx_r_type
== BFD_RELOC_X86_64_CODE_4_GOTTPOFF
3674 || fixP
->fx_r_type
== BFD_RELOC_X86_64_CODE_6_GOTTPOFF
3675 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TPOFF32
3676 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TPOFF64
3677 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTOFF64
3678 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTPC32_TLSDESC
3679 || fixP
->fx_r_type
== BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
3680 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TLSDESC_CALL
3681 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3682 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
3689 want_disp32 (const insn_template
*t
)
3691 return flag_code
!= CODE_64BIT
3692 || i
.prefix
[ADDR_PREFIX
]
3693 || (t
->mnem_off
== MN_lea
3694 && (!i
.types
[1].bitfield
.qword
3695 || t
->opcode_modifier
.size
== SIZE32
));
3699 intel_float_operand (const char *mnemonic
)
3701 /* Note that the value returned is meaningful only for opcodes with (memory)
3702 operands, hence the code here is free to improperly handle opcodes that
3703 have no operands (for better performance and smaller code). */
3705 if (mnemonic
[0] != 'f')
3706 return 0; /* non-math */
3708 switch (mnemonic
[1])
3710 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3711 the fs segment override prefix not currently handled because no
3712 call path can make opcodes without operands get here */
3714 return 2 /* integer op */;
3716 if (mnemonic
[2] == 'd' && (mnemonic
[3] == 'c' || mnemonic
[3] == 'e'))
3717 return 3; /* fldcw/fldenv */
3720 if (mnemonic
[2] != 'o' /* fnop */)
3721 return 3; /* non-waiting control op */
3724 if (mnemonic
[2] == 's')
3725 return 3; /* frstor/frstpm */
3728 if (mnemonic
[2] == 'a')
3729 return 3; /* fsave */
3730 if (mnemonic
[2] == 't')
3732 switch (mnemonic
[3])
3734 case 'c': /* fstcw */
3735 case 'd': /* fstdw */
3736 case 'e': /* fstenv */
3737 case 's': /* fsts[gw] */
3743 if (mnemonic
[2] == 'r' || mnemonic
[2] == 's')
3744 return 0; /* fxsave/fxrstor are not really math ops */
3752 install_template (const insn_template
*t
)
3758 /* Dual VEX/EVEX templates need stripping one of the possible variants. */
3759 if (t
->opcode_modifier
.vex
&& t
->opcode_modifier
.evex
)
3761 if ((maybe_cpu (t
, CpuAVX
) || maybe_cpu (t
, CpuAVX2
)
3762 || maybe_cpu (t
, CpuFMA
))
3763 && (maybe_cpu (t
, CpuAVX512F
) || maybe_cpu (t
, CpuAVX512VL
)))
3765 if (need_evex_encoding (t
))
3767 i
.tm
.opcode_modifier
.vex
= 0;
3768 i
.tm
.cpu
.bitfield
.cpuavx512f
= i
.tm
.cpu_any
.bitfield
.cpuavx512f
;
3769 i
.tm
.cpu
.bitfield
.cpuavx512vl
= i
.tm
.cpu_any
.bitfield
.cpuavx512vl
;
3773 i
.tm
.opcode_modifier
.evex
= 0;
3774 if (i
.tm
.cpu_any
.bitfield
.cpuavx
)
3775 i
.tm
.cpu
.bitfield
.cpuavx
= 1;
3776 else if (!i
.tm
.cpu
.bitfield
.isa
)
3777 i
.tm
.cpu
.bitfield
.isa
= i
.tm
.cpu_any
.bitfield
.isa
;
3779 gas_assert (i
.tm
.cpu
.bitfield
.isa
== i
.tm
.cpu_any
.bitfield
.isa
);
3783 if ((maybe_cpu (t
, CpuCMPCCXADD
) || maybe_cpu (t
, CpuAMX_TILE
)
3784 || maybe_cpu (t
, CpuAVX512F
) || maybe_cpu (t
, CpuAVX512DQ
)
3785 || maybe_cpu (t
, CpuAVX512BW
) || maybe_cpu (t
, CpuBMI
)
3786 || maybe_cpu (t
, CpuBMI2
) || maybe_cpu (t
, CpuUSER_MSR
))
3787 && maybe_cpu (t
, CpuAPX_F
))
3789 if (need_evex_encoding (t
))
3790 i
.tm
.opcode_modifier
.vex
= 0;
3792 i
.tm
.opcode_modifier
.evex
= 0;
3796 /* Note that for pseudo prefixes this produces a length of 1. But for them
3797 the length isn't interesting at all. */
3798 for (l
= 1; l
< 4; ++l
)
3799 if (!(t
->base_opcode
>> (8 * l
)))
3802 i
.opcode_length
= l
;
3805 /* Build the VEX prefix. */
3808 build_vex_prefix (const insn_template
*t
)
3810 unsigned int register_specifier
;
3811 unsigned int vector_length
;
3814 /* Check register specifier. */
3815 if (i
.vex
.register_specifier
)
3817 register_specifier
=
3818 ~register_number (i
.vex
.register_specifier
) & 0xf;
3819 gas_assert ((i
.vex
.register_specifier
->reg_flags
& RegVRex
) == 0);
3822 register_specifier
= 0xf;
3824 /* Use 2-byte VEX prefix by swapping destination and source operand
3825 if there are more than 1 register operand. */
3826 if (i
.reg_operands
> 1
3827 && i
.encoding
!= encoding_vex3
3828 && i
.dir_encoding
== dir_encoding_default
3829 && i
.operands
== i
.reg_operands
3830 && operand_type_equal (&i
.types
[0], &i
.types
[i
.operands
- 1])
3831 && i
.tm
.opcode_space
== SPACE_0F
3832 && (i
.tm
.opcode_modifier
.load
|| i
.tm
.opcode_modifier
.d
)
3837 swap_2_operands (0, i
.operands
- 1);
3839 gas_assert (i
.rm
.mode
== 3);
3843 i
.rm
.regmem
= i
.rm
.reg
;
3846 if (i
.tm
.opcode_modifier
.d
)
3847 i
.tm
.base_opcode
^= (i
.tm
.base_opcode
& 0xee) != 0x6e
3848 ? Opcode_ExtD
: Opcode_SIMD_IntD
;
3849 else /* Use the next insn. */
3850 install_template (&t
[1]);
3853 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3854 are no memory operands and at least 3 register ones. */
3855 if (i
.reg_operands
>= 3
3856 && i
.encoding
!= encoding_vex3
3857 && i
.reg_operands
== i
.operands
- i
.imm_operands
3858 && i
.tm
.opcode_modifier
.vex
3859 && i
.tm
.opcode_modifier
.commutative
3860 /* .commutative aliases .staticrounding; disambiguate. */
3861 && !i
.tm
.opcode_modifier
.sae
3862 && (i
.tm
.opcode_modifier
.sse2avx
3863 || (optimize
> 1 && !i
.no_optimize
))
3865 && i
.vex
.register_specifier
3866 && !(i
.vex
.register_specifier
->reg_flags
& RegRex
))
3868 unsigned int xchg
= i
.operands
- i
.reg_operands
;
3870 gas_assert (i
.tm
.opcode_space
== SPACE_0F
);
3871 gas_assert (!i
.tm
.opcode_modifier
.sae
);
3872 gas_assert (operand_type_equal (&i
.types
[i
.operands
- 2],
3873 &i
.types
[i
.operands
- 3]));
3874 gas_assert (i
.rm
.mode
== 3);
3876 swap_2_operands (xchg
, xchg
+ 1);
3879 xchg
= i
.rm
.regmem
| 8;
3880 i
.rm
.regmem
= ~register_specifier
& 0xf;
3881 gas_assert (!(i
.rm
.regmem
& 8));
3882 i
.vex
.register_specifier
+= xchg
- i
.rm
.regmem
;
3883 register_specifier
= ~xchg
& 0xf;
3886 if (i
.tm
.opcode_modifier
.vex
== VEXScalar
)
3887 vector_length
= avxscalar
;
3888 else if (i
.tm
.opcode_modifier
.vex
== VEX256
)
3890 else if (dot_insn () && i
.tm
.opcode_modifier
.vex
== VEX128
)
3896 /* Determine vector length from the last multi-length vector
3899 for (op
= t
->operands
; op
--;)
3900 if (t
->operand_types
[op
].bitfield
.xmmword
3901 && t
->operand_types
[op
].bitfield
.ymmword
3902 && i
.types
[op
].bitfield
.ymmword
)
3909 /* Check the REX.W bit and VEXW. */
3910 if (i
.tm
.opcode_modifier
.vexw
== VEXWIG
)
3911 w
= (vexwig
== vexw1
|| (i
.rex
& REX_W
)) ? 1 : 0;
3912 else if (i
.tm
.opcode_modifier
.vexw
&& !(i
.rex
& REX_W
))
3913 w
= i
.tm
.opcode_modifier
.vexw
== VEXW1
? 1 : 0;
3915 w
= (flag_code
== CODE_64BIT
? i
.rex
& REX_W
: vexwig
== vexw1
) ? 1 : 0;
3917 /* Use 2-byte VEX prefix if possible. */
3919 && i
.encoding
!= encoding_vex3
3920 && i
.tm
.opcode_space
== SPACE_0F
3921 && (i
.rex
& (REX_W
| REX_X
| REX_B
)) == 0)
3923 /* 2-byte VEX prefix. */
3927 i
.vex
.bytes
[0] = 0xc5;
3929 /* Check the REX.R bit. */
3930 r
= (i
.rex
& REX_R
) ? 0 : 1;
3931 i
.vex
.bytes
[1] = (r
<< 7
3932 | register_specifier
<< 3
3933 | vector_length
<< 2
3934 | i
.tm
.opcode_modifier
.opcodeprefix
);
3938 /* 3-byte VEX prefix. */
3941 switch (i
.tm
.opcode_space
)
3947 i
.vex
.bytes
[0] = 0xc4;
3952 i
.vex
.bytes
[0] = 0x8f;
3958 /* The high 3 bits of the second VEX byte are 1's compliment
3959 of RXB bits from REX. */
3960 i
.vex
.bytes
[1] = ((~i
.rex
& 7) << 5)
3961 | (!dot_insn () ? i
.tm
.opcode_space
3962 : i
.insn_opcode_space
);
3964 i
.vex
.bytes
[2] = (w
<< 7
3965 | register_specifier
<< 3
3966 | vector_length
<< 2
3967 | i
.tm
.opcode_modifier
.opcodeprefix
);
3972 is_any_vex_encoding (const insn_template
*t
)
3974 return t
->opcode_modifier
.vex
|| t
->opcode_modifier
.evex
;
3977 /* We can use this function only when the current encoding is evex. */
3979 is_apx_evex_encoding (void)
3981 return i
.rex2
|| i
.tm
.opcode_space
== SPACE_EVEXMAP4
|| i
.has_nf
3982 || (i
.vex
.register_specifier
3983 && (i
.vex
.register_specifier
->reg_flags
& RegRex2
));
3987 is_apx_rex2_encoding (void)
3989 return i
.rex2
|| i
.rex2_encoding
3990 || i
.tm
.opcode_modifier
.rex2
;
3994 get_broadcast_bytes (const insn_template
*t
, bool diag
)
3996 unsigned int op
, bytes
;
3997 const i386_operand_type
*types
;
3999 if (i
.broadcast
.type
)
4000 return (1 << (t
->opcode_modifier
.broadcast
- 1)) * i
.broadcast
.type
;
4002 gas_assert (intel_syntax
);
4004 for (op
= 0; op
< t
->operands
; ++op
)
4005 if (t
->operand_types
[op
].bitfield
.baseindex
)
4008 gas_assert (op
< t
->operands
);
4010 if (t
->opcode_modifier
.evex
!= EVEXDYN
)
4011 switch (i
.broadcast
.bytes
)
4014 if (t
->operand_types
[op
].bitfield
.word
)
4018 if (t
->operand_types
[op
].bitfield
.dword
)
4022 if (t
->operand_types
[op
].bitfield
.qword
)
4026 if (t
->operand_types
[op
].bitfield
.xmmword
)
4028 if (t
->operand_types
[op
].bitfield
.ymmword
)
4030 if (t
->operand_types
[op
].bitfield
.zmmword
)
4037 gas_assert (op
+ 1 < t
->operands
);
4039 if (t
->operand_types
[op
+ 1].bitfield
.xmmword
4040 + t
->operand_types
[op
+ 1].bitfield
.ymmword
4041 + t
->operand_types
[op
+ 1].bitfield
.zmmword
> 1)
4043 types
= &i
.types
[op
+ 1];
4046 else /* Ambiguous - guess with a preference to non-AVX512VL forms. */
4047 types
= &t
->operand_types
[op
];
4049 if (types
->bitfield
.zmmword
)
4051 else if (types
->bitfield
.ymmword
)
4057 as_warn (_("ambiguous broadcast for `%s', using %u-bit form"),
4058 insn_name (t
), bytes
* 8);
4063 /* Build the EVEX prefix. */
4066 build_evex_prefix (void)
4068 unsigned int register_specifier
, w
;
4069 rex_byte vrex_used
= 0;
4071 /* Check register specifier. */
4072 if (i
.vex
.register_specifier
)
4074 gas_assert ((i
.vrex
& REX_X
) == 0);
4076 register_specifier
= i
.vex
.register_specifier
->reg_num
;
4077 if ((i
.vex
.register_specifier
->reg_flags
& RegRex
))
4078 register_specifier
+= 8;
4079 /* The upper 16 registers are encoded in the fourth byte of the
4081 if (!(i
.vex
.register_specifier
->reg_flags
& RegVRex
))
4082 i
.vex
.bytes
[3] = 0x8;
4083 register_specifier
= ~register_specifier
& 0xf;
4087 register_specifier
= 0xf;
4089 /* Encode upper 16 vector index register in the fourth byte of
4091 if (!(i
.vrex
& REX_X
))
4092 i
.vex
.bytes
[3] = 0x8;
4097 /* 4 byte EVEX prefix. */
4099 i
.vex
.bytes
[0] = 0x62;
4101 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
4103 gas_assert (i
.tm
.opcode_space
>= SPACE_0F
);
4104 gas_assert (i
.tm
.opcode_space
<= SPACE_VEXMAP7
);
4105 i
.vex
.bytes
[1] = ((~i
.rex
& 7) << 5)
4106 | (!dot_insn () ? i
.tm
.opcode_space
4107 : i
.insn_opcode_space
);
4109 /* The fifth bit of the second EVEX byte is 1's compliment of the
4110 REX_R bit in VREX. */
4111 if (!(i
.vrex
& REX_R
))
4112 i
.vex
.bytes
[1] |= 0x10;
4116 if ((i
.reg_operands
+ i
.imm_operands
) == i
.operands
)
4118 /* When all operands are registers, the REX_X bit in REX is not
4119 used. We reuse it to encode the upper 16 registers, which is
4120 indicated by the REX_B bit in VREX. The REX_X bit is encoded
4121 as 1's compliment. */
4122 if ((i
.vrex
& REX_B
))
4125 i
.vex
.bytes
[1] &= ~0x40;
4129 /* EVEX instructions shouldn't need the REX prefix. */
4130 i
.vrex
&= ~vrex_used
;
4131 gas_assert (i
.vrex
== 0);
4133 /* Check the REX.W bit and VEXW. */
4134 if (i
.tm
.opcode_modifier
.vexw
== VEXWIG
)
4135 w
= (evexwig
== evexw1
|| (i
.rex
& REX_W
)) ? 1 : 0;
4136 else if (i
.tm
.opcode_modifier
.vexw
&& !(i
.rex
& REX_W
))
4137 w
= i
.tm
.opcode_modifier
.vexw
== VEXW1
? 1 : 0;
4139 w
= (flag_code
== CODE_64BIT
? i
.rex
& REX_W
: evexwig
== evexw1
) ? 1 : 0;
4141 /* The third byte of the EVEX prefix. */
4142 i
.vex
.bytes
[2] = ((w
<< 7)
4143 | (register_specifier
<< 3)
4144 | 4 /* Encode the U bit. */
4145 | i
.tm
.opcode_modifier
.opcodeprefix
);
4147 /* The fourth byte of the EVEX prefix. */
4148 /* The zeroing-masking bit. */
4149 if (i
.mask
.reg
&& i
.mask
.zeroing
)
4150 i
.vex
.bytes
[3] |= 0x80;
4152 /* Don't always set the broadcast bit if there is no RC. */
4153 if (i
.rounding
.type
== rc_none
)
4155 /* Encode the vector length. */
4156 unsigned int vec_length
;
4158 if (i
.tm
.opcode_modifier
.evex
== EVEXDYN
)
4162 /* Determine vector length from the last multi-length vector
4164 for (op
= i
.operands
; op
--;)
4165 if (i
.tm
.operand_types
[op
].bitfield
.xmmword
4166 + i
.tm
.operand_types
[op
].bitfield
.ymmword
4167 + i
.tm
.operand_types
[op
].bitfield
.zmmword
> 1)
4169 if (i
.types
[op
].bitfield
.zmmword
)
4171 i
.tm
.opcode_modifier
.evex
= EVEX512
;
4174 else if (i
.types
[op
].bitfield
.ymmword
)
4176 i
.tm
.opcode_modifier
.evex
= EVEX256
;
4179 else if (i
.types
[op
].bitfield
.xmmword
)
4181 i
.tm
.opcode_modifier
.evex
= EVEX128
;
4184 else if ((i
.broadcast
.type
|| i
.broadcast
.bytes
)
4185 && op
== i
.broadcast
.operand
)
4187 switch (get_broadcast_bytes (&i
.tm
, true))
4190 i
.tm
.opcode_modifier
.evex
= EVEX512
;
4193 i
.tm
.opcode_modifier
.evex
= EVEX256
;
4196 i
.tm
.opcode_modifier
.evex
= EVEX128
;
4205 if (op
>= MAX_OPERANDS
)
4209 switch (i
.tm
.opcode_modifier
.evex
)
4211 case EVEXLIG
: /* LL' is ignored */
4212 vec_length
= evexlig
<< 5;
4215 vec_length
= 0 << 5;
4218 vec_length
= 1 << 5;
4221 vec_length
= 2 << 5;
4226 vec_length
= 3 << 5;
4234 i
.vex
.bytes
[3] |= vec_length
;
4235 /* Encode the broadcast bit. */
4236 if (i
.broadcast
.type
|| i
.broadcast
.bytes
)
4237 i
.vex
.bytes
[3] |= 0x10;
4239 else if (i
.rounding
.type
!= saeonly
)
4240 i
.vex
.bytes
[3] |= 0x10 | (i
.rounding
.type
<< 5);
4242 i
.vex
.bytes
[3] |= 0x10 | (evexrcig
<< 5);
4245 i
.vex
.bytes
[3] |= i
.mask
.reg
->reg_num
;
4248 /* Build (2 bytes) rex2 prefix.
4250 | m | R4 X4 B4 | W R X B |
4252 Rex2 reuses i.vex as they both encode i.tm.opcode_space in their prefixes.
4255 build_rex2_prefix (void)
4258 i
.vex
.bytes
[0] = 0xd5;
4259 /* For the W R X B bits, the variables of rex prefix will be reused. */
4260 i
.vex
.bytes
[1] = ((i
.tm
.opcode_space
<< 7)
4261 | (i
.rex2
<< 4) | i
.rex
);
4264 /* Build the EVEX prefix (4-byte) for evex insn
4266 | `R`X`B`R' | B'mmm |
4267 | W | v`v`v`v | `x' | pp |
4268 | z| L'L | b | `v | aaa |
4271 build_apx_evex_prefix (void)
4273 build_evex_prefix ();
4275 i
.vex
.bytes
[1] &= ~0x10;
4277 i
.vex
.bytes
[1] |= 0x08;
4280 gas_assert (i
.rm
.mode
!= 3);
4281 i
.vex
.bytes
[2] &= ~0x04;
4283 if (i
.vex
.register_specifier
4284 && i
.vex
.register_specifier
->reg_flags
& RegRex2
)
4285 i
.vex
.bytes
[3] &= ~0x08;
4287 /* Encode the NDD bit of the instruction promoted from the legacy
4289 if (i
.vex
.register_specifier
&& i
.tm
.opcode_space
== SPACE_EVEXMAP4
)
4290 i
.vex
.bytes
[3] |= 0x10;
4292 /* Encode the NF bit. */
4294 i
.vex
.bytes
[3] |= 0x04;
4297 static void establish_rex (void)
4299 /* Note that legacy encodings have at most 2 non-immediate operands. */
4300 unsigned int first
= i
.imm_operands
;
4301 unsigned int last
= i
.operands
> first
? i
.operands
- first
- 1 : first
;
4303 /* Respect a user-specified REX prefix. */
4304 i
.rex
|= i
.prefix
[REX_PREFIX
] & REX_OPCODE
;
4306 /* For 8 bit registers we need an empty rex prefix. Also if the
4307 instruction already has a prefix, we need to convert old
4308 registers to new ones. */
4310 if ((i
.types
[first
].bitfield
.class == Reg
&& i
.types
[first
].bitfield
.byte
4311 && ((i
.op
[first
].regs
->reg_flags
& RegRex64
) != 0 || i
.rex
!= 0
4313 || (i
.types
[last
].bitfield
.class == Reg
&& i
.types
[last
].bitfield
.byte
4314 && ((i
.op
[last
].regs
->reg_flags
& RegRex64
) != 0 || i
.rex
!= 0
4319 if (!is_apx_rex2_encoding () && !is_any_vex_encoding(&i
.tm
))
4320 i
.rex
|= REX_OPCODE
;
4321 for (x
= first
; x
<= last
; x
++)
4323 /* Look for 8 bit operand that uses old registers. */
4324 if (i
.types
[x
].bitfield
.class == Reg
&& i
.types
[x
].bitfield
.byte
4325 && (i
.op
[x
].regs
->reg_flags
& RegRex64
) == 0)
4327 gas_assert (!(i
.op
[x
].regs
->reg_flags
& RegRex
));
4328 /* In case it is "hi" register, give up. */
4329 if (i
.op
[x
].regs
->reg_num
> 3)
4330 as_bad (_("can't encode register '%s%s' in an "
4331 "instruction requiring REX/REX2 prefix"),
4332 register_prefix
, i
.op
[x
].regs
->reg_name
);
4334 /* Otherwise it is equivalent to the extended register.
4335 Since the encoding doesn't change this is merely
4336 cosmetic cleanup for debug output. */
4342 if (i
.rex
== 0 && i
.rex2
== 0 && (i
.rex_encoding
|| i
.rex2_encoding
))
4344 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
4345 that uses legacy register. If it is "hi" register, don't add
4346 rex and rex2 prefix. */
4349 for (x
= first
; x
<= last
; x
++)
4350 if (i
.types
[x
].bitfield
.class == Reg
4351 && i
.types
[x
].bitfield
.byte
4352 && (i
.op
[x
].regs
->reg_flags
& RegRex64
) == 0
4353 && i
.op
[x
].regs
->reg_num
> 3)
4355 gas_assert (!(i
.op
[x
].regs
->reg_flags
& RegRex
));
4356 i
.rex_encoding
= false;
4357 i
.rex2_encoding
= false;
4365 if (is_apx_rex2_encoding ())
4367 build_rex2_prefix ();
4368 /* The individual REX.RXBW bits got consumed. */
4369 i
.rex
&= REX_OPCODE
;
4371 else if (i
.rex
!= 0)
4372 add_prefix (REX_OPCODE
| i
.rex
);
4376 process_immext (void)
4380 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
4381 which is coded in the same place as an 8-bit immediate field
4382 would be. Here we fake an 8-bit immediate operand from the
4383 opcode suffix stored in tm.extension_opcode.
4385 AVX instructions also use this encoding, for some of
4386 3 argument instructions. */
4388 gas_assert (i
.imm_operands
<= 1
4390 || (is_any_vex_encoding (&i
.tm
)
4391 && i
.operands
<= 4)));
4393 exp
= &im_expressions
[i
.imm_operands
++];
4394 i
.op
[i
.operands
].imms
= exp
;
4395 i
.types
[i
.operands
].bitfield
.imm8
= 1;
4397 exp
->X_op
= O_constant
;
4398 exp
->X_add_number
= i
.tm
.extension_opcode
;
4399 i
.tm
.extension_opcode
= None
;
4406 switch (i
.tm
.opcode_modifier
.prefixok
)
4414 as_bad (_("invalid instruction `%s' after `%s'"),
4415 insn_name (&i
.tm
), i
.hle_prefix
);
4418 if (i
.prefix
[LOCK_PREFIX
])
4420 as_bad (_("missing `lock' with `%s'"), i
.hle_prefix
);
4424 case PrefixHLERelease
:
4425 if (i
.prefix
[HLE_PREFIX
] != XRELEASE_PREFIX_OPCODE
)
4427 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4431 if (i
.mem_operands
== 0 || !(i
.flags
[i
.operands
- 1] & Operand_Mem
))
4433 as_bad (_("memory destination needed for instruction `%s'"
4434 " after `xrelease'"), insn_name (&i
.tm
));
4441 /* Encode aligned vector move as unaligned vector move. */
4444 encode_with_unaligned_vector_move (void)
4446 switch (i
.tm
.base_opcode
)
4448 case 0x28: /* Load instructions. */
4449 case 0x29: /* Store instructions. */
4450 /* movaps/movapd/vmovaps/vmovapd. */
4451 if (i
.tm
.opcode_space
== SPACE_0F
4452 && i
.tm
.opcode_modifier
.opcodeprefix
<= PREFIX_0X66
)
4453 i
.tm
.base_opcode
= 0x10 | (i
.tm
.base_opcode
& 1);
4455 case 0x6f: /* Load instructions. */
4456 case 0x7f: /* Store instructions. */
4457 /* movdqa/vmovdqa/vmovdqa64/vmovdqa32. */
4458 if (i
.tm
.opcode_space
== SPACE_0F
4459 && i
.tm
.opcode_modifier
.opcodeprefix
== PREFIX_0X66
)
4460 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_0XF3
;
4467 /* Try the shortest encoding by shortening operand size. */
4470 optimize_encoding (void)
4474 if (i
.tm
.mnem_off
== MN_lea
)
4477 lea symbol, %rN -> mov $symbol, %rN
4478 lea (%rM), %rN -> mov %rM, %rN
4479 lea (,%rM,1), %rN -> mov %rM, %rN
4481 and in 32-bit mode for 16-bit addressing
4483 lea (%rM), %rN -> movzx %rM, %rN
4485 and in 64-bit mode zap 32-bit addressing in favor of using a
4486 32-bit (or less) destination.
4488 if (flag_code
== CODE_64BIT
&& i
.prefix
[ADDR_PREFIX
])
4490 if (!i
.op
[1].regs
->reg_type
.bitfield
.word
)
4491 i
.tm
.opcode_modifier
.size
= SIZE32
;
4492 i
.prefix
[ADDR_PREFIX
] = 0;
4495 if (!i
.index_reg
&& !i
.base_reg
)
4498 lea symbol, %rN -> mov $symbol, %rN
4500 if (flag_code
== CODE_64BIT
)
4502 /* Don't transform a relocation to a 16-bit one. */
4504 && i
.op
[0].disps
->X_op
!= O_constant
4505 && i
.op
[1].regs
->reg_type
.bitfield
.word
)
4508 if (!i
.op
[1].regs
->reg_type
.bitfield
.qword
4509 || i
.tm
.opcode_modifier
.size
== SIZE32
)
4511 i
.tm
.base_opcode
= 0xb8;
4512 i
.tm
.opcode_modifier
.modrm
= 0;
4513 if (!i
.op
[1].regs
->reg_type
.bitfield
.word
)
4514 i
.types
[0].bitfield
.imm32
= 1;
4517 i
.tm
.opcode_modifier
.size
= SIZE16
;
4518 i
.types
[0].bitfield
.imm16
= 1;
4523 /* Subject to further optimization below. */
4524 i
.tm
.base_opcode
= 0xc7;
4525 i
.tm
.extension_opcode
= 0;
4526 i
.types
[0].bitfield
.imm32s
= 1;
4527 i
.types
[0].bitfield
.baseindex
= 0;
4530 /* Outside of 64-bit mode address and operand sizes have to match if
4531 a relocation is involved, as otherwise we wouldn't (currently) or
4532 even couldn't express the relocation correctly. */
4533 else if (i
.op
[0].disps
4534 && i
.op
[0].disps
->X_op
!= O_constant
4535 && ((!i
.prefix
[ADDR_PREFIX
])
4536 != (flag_code
== CODE_32BIT
4537 ? i
.op
[1].regs
->reg_type
.bitfield
.dword
4538 : i
.op
[1].regs
->reg_type
.bitfield
.word
)))
4540 /* In 16-bit mode converting LEA with 16-bit addressing and a 32-bit
4541 destination is going to grow encoding size. */
4542 else if (flag_code
== CODE_16BIT
4543 && (optimize
<= 1 || optimize_for_space
)
4544 && !i
.prefix
[ADDR_PREFIX
]
4545 && i
.op
[1].regs
->reg_type
.bitfield
.dword
)
4549 i
.tm
.base_opcode
= 0xb8;
4550 i
.tm
.opcode_modifier
.modrm
= 0;
4551 if (i
.op
[1].regs
->reg_type
.bitfield
.dword
)
4552 i
.types
[0].bitfield
.imm32
= 1;
4554 i
.types
[0].bitfield
.imm16
= 1;
4557 && i
.op
[0].disps
->X_op
== O_constant
4558 && i
.op
[1].regs
->reg_type
.bitfield
.dword
4559 /* NB: Add () to !i.prefix[ADDR_PREFIX] to silence
4561 && (!i
.prefix
[ADDR_PREFIX
]) != (flag_code
== CODE_32BIT
))
4562 i
.op
[0].disps
->X_add_number
&= 0xffff;
4565 i
.tm
.operand_types
[0] = i
.types
[0];
4569 i
.op
[0].imms
= &im_expressions
[0];
4570 i
.op
[0].imms
->X_op
= O_absent
;
4573 else if (i
.op
[0].disps
4574 && (i
.op
[0].disps
->X_op
!= O_constant
4575 || i
.op
[0].disps
->X_add_number
))
4580 lea (%rM), %rN -> mov %rM, %rN
4581 lea (,%rM,1), %rN -> mov %rM, %rN
4582 lea (%rM), %rN -> movzx %rM, %rN
4584 const reg_entry
*addr_reg
;
4586 if (!i
.index_reg
&& i
.base_reg
->reg_num
!= RegIP
)
4587 addr_reg
= i
.base_reg
;
4588 else if (!i
.base_reg
4589 && i
.index_reg
->reg_num
!= RegIZ
4590 && !i
.log2_scale_factor
)
4591 addr_reg
= i
.index_reg
;
4595 if (addr_reg
->reg_type
.bitfield
.word
4596 && i
.op
[1].regs
->reg_type
.bitfield
.dword
)
4598 if (flag_code
!= CODE_32BIT
)
4600 i
.tm
.opcode_space
= SPACE_0F
;
4601 i
.tm
.base_opcode
= 0xb7;
4604 i
.tm
.base_opcode
= 0x8b;
4606 if (addr_reg
->reg_type
.bitfield
.dword
4607 && i
.op
[1].regs
->reg_type
.bitfield
.qword
)
4608 i
.tm
.opcode_modifier
.size
= SIZE32
;
4610 i
.op
[0].regs
= addr_reg
;
4615 i
.disp_operands
= 0;
4616 i
.prefix
[ADDR_PREFIX
] = 0;
4617 i
.prefix
[SEG_PREFIX
] = 0;
4621 if (optimize_for_space
4622 && i
.tm
.mnem_off
== MN_test
4623 && i
.reg_operands
== 1
4624 && i
.imm_operands
== 1
4625 && !i
.types
[1].bitfield
.byte
4626 && i
.op
[0].imms
->X_op
== O_constant
4627 && fits_in_imm7 (i
.op
[0].imms
->X_add_number
))
4630 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4632 unsigned int base_regnum
= i
.op
[1].regs
->reg_num
;
4633 if (flag_code
== CODE_64BIT
|| base_regnum
< 4)
4635 i
.types
[1].bitfield
.byte
= 1;
4636 /* Ignore the suffix. */
4638 /* Convert to byte registers. 8-bit registers are special,
4639 RegRex64 and non-RegRex64 each have 8 registers. */
4640 if (i
.types
[1].bitfield
.word
)
4641 /* 32 (or 40) 8-bit registers. */
4643 else if (i
.types
[1].bitfield
.dword
)
4644 /* 32 (or 40) 8-bit registers + 32 16-bit registers. */
4647 /* 32 (or 40) 8-bit registers + 32 16-bit registers
4648 + 32 32-bit registers. */
4651 /* In 64-bit mode, the following byte registers cannot be accessed
4652 if using the Rex and Rex2 prefix: AH, BH, CH, DH */
4653 if (!(i
.op
[1].regs
->reg_flags
& (RegRex
| RegRex2
)) && base_regnum
< 4)
4658 else if (flag_code
== CODE_64BIT
4659 && i
.tm
.opcode_space
== SPACE_BASE
4660 && ((i
.types
[1].bitfield
.qword
4661 && i
.reg_operands
== 1
4662 && i
.imm_operands
== 1
4663 && i
.op
[0].imms
->X_op
== O_constant
4664 && ((i
.tm
.base_opcode
== 0xb8
4665 && i
.tm
.extension_opcode
== None
4666 && fits_in_unsigned_long (i
.op
[0].imms
->X_add_number
))
4667 || (fits_in_imm31 (i
.op
[0].imms
->X_add_number
)
4668 && (i
.tm
.base_opcode
== 0x24
4669 || (i
.tm
.base_opcode
== 0x80
4670 && i
.tm
.extension_opcode
== 0x4)
4671 || i
.tm
.mnem_off
== MN_test
4672 || ((i
.tm
.base_opcode
| 1) == 0xc7
4673 && i
.tm
.extension_opcode
== 0x0)))
4674 || (fits_in_imm7 (i
.op
[0].imms
->X_add_number
)
4675 && i
.tm
.base_opcode
== 0x83
4676 && i
.tm
.extension_opcode
== 0x4)))
4677 || (i
.types
[0].bitfield
.qword
4678 && ((i
.reg_operands
== 2
4679 && i
.op
[0].regs
== i
.op
[1].regs
4680 && (i
.tm
.mnem_off
== MN_xor
4681 || i
.tm
.mnem_off
== MN_sub
))
4682 || i
.tm
.mnem_off
== MN_clr
))))
4685 andq $imm31, %r64 -> andl $imm31, %r32
4686 andq $imm7, %r64 -> andl $imm7, %r32
4687 testq $imm31, %r64 -> testl $imm31, %r32
4688 xorq %r64, %r64 -> xorl %r32, %r32
4689 subq %r64, %r64 -> subl %r32, %r32
4690 movq $imm31, %r64 -> movl $imm31, %r32
4691 movq $imm32, %r64 -> movl $imm32, %r32
4693 i
.tm
.opcode_modifier
.size
= SIZE32
;
4696 i
.types
[0].bitfield
.imm32
= 1;
4697 i
.types
[0].bitfield
.imm32s
= 0;
4698 i
.types
[0].bitfield
.imm64
= 0;
4702 i
.types
[0].bitfield
.dword
= 1;
4703 i
.types
[0].bitfield
.qword
= 0;
4705 i
.types
[1].bitfield
.dword
= 1;
4706 i
.types
[1].bitfield
.qword
= 0;
4707 if (i
.tm
.mnem_off
== MN_mov
|| i
.tm
.mnem_off
== MN_lea
)
4710 movq $imm31, %r64 -> movl $imm31, %r32
4711 movq $imm32, %r64 -> movl $imm32, %r32
4713 i
.tm
.operand_types
[0].bitfield
.imm32
= 1;
4714 i
.tm
.operand_types
[0].bitfield
.imm32s
= 0;
4715 i
.tm
.operand_types
[0].bitfield
.imm64
= 0;
4716 if ((i
.tm
.base_opcode
| 1) == 0xc7)
4719 movq $imm31, %r64 -> movl $imm31, %r32
4721 i
.tm
.base_opcode
= 0xb8;
4722 i
.tm
.extension_opcode
= None
;
4723 i
.tm
.opcode_modifier
.w
= 0;
4724 i
.tm
.opcode_modifier
.modrm
= 0;
4728 else if (i
.reg_operands
== 3
4729 && i
.op
[0].regs
== i
.op
[1].regs
4730 && i
.encoding
!= encoding_evex
4731 && (i
.tm
.mnem_off
== MN_xor
4732 || i
.tm
.mnem_off
== MN_sub
))
4735 xorb %rNb, %rNb, %rMb -> xorl %rMd, %rMd
4736 xorw %rNw, %rNw, %rMw -> xorl %rMd, %rMd
4737 xorl %rNd, %rNd, %rMd -> xorl %rMd, %rMd
4738 xorq %rN, %rN, %rM -> xorl %rMd, %rMd
4739 subb %rNb, %rNb, %rMb -> subl %rMd, %rMd
4740 subw %rNw, %rNw, %rMw -> subl %rMd, %rMd
4741 subl %rNd, %rNd, %rMd -> subl %rMd, %rMd
4742 subq %rN, %rN, %rM -> subl %rMd, %rMd
4744 i
.tm
.opcode_space
= SPACE_BASE
;
4745 i
.tm
.opcode_modifier
.evex
= 0;
4746 i
.tm
.opcode_modifier
.size
= SIZE32
;
4747 i
.types
[0].bitfield
.byte
= 0;
4748 i
.types
[0].bitfield
.word
= 0;
4749 i
.types
[0].bitfield
.dword
= 1;
4750 i
.types
[0].bitfield
.qword
= 0;
4751 i
.op
[0].regs
= i
.op
[2].regs
;
4752 i
.types
[1] = i
.types
[0];
4753 i
.op
[1].regs
= i
.op
[2].regs
;
4756 else if (optimize
> 1
4757 && !optimize_for_space
4758 && i
.reg_operands
== 2
4759 && i
.op
[0].regs
== i
.op
[1].regs
4760 && (i
.tm
.mnem_off
== MN_and
|| i
.tm
.mnem_off
== MN_or
)
4761 && (flag_code
!= CODE_64BIT
|| !i
.types
[0].bitfield
.dword
))
4764 andb %rN, %rN -> testb %rN, %rN
4765 andw %rN, %rN -> testw %rN, %rN
4766 andq %rN, %rN -> testq %rN, %rN
4767 orb %rN, %rN -> testb %rN, %rN
4768 orw %rN, %rN -> testw %rN, %rN
4769 orq %rN, %rN -> testq %rN, %rN
4771 and outside of 64-bit mode
4773 andl %rN, %rN -> testl %rN, %rN
4774 orl %rN, %rN -> testl %rN, %rN
4776 i
.tm
.base_opcode
= 0x84 | (i
.tm
.base_opcode
& 1);
4778 else if (i
.tm
.base_opcode
== 0xba
4779 && i
.tm
.opcode_space
== SPACE_0F
4780 && i
.reg_operands
== 1
4781 && i
.op
[0].imms
->X_op
== O_constant
4782 && i
.op
[0].imms
->X_add_number
>= 0)
4785 btw $n, %rN -> btl $n, %rN (outside of 16-bit mode, n < 16)
4786 btq $n, %rN -> btl $n, %rN (in 64-bit mode, n < 32, N < 8)
4787 btl $n, %rN -> btw $n, %rN (in 16-bit mode, n < 16)
4789 With <BT> one of bts, btr, and bts also:
4790 <BT>w $n, %rN -> btl $n, %rN (in 32-bit mode, n < 16)
4791 <BT>l $n, %rN -> btw $n, %rN (in 16-bit mode, n < 16)
4796 if (i
.tm
.extension_opcode
!= 4)
4798 if (i
.types
[1].bitfield
.qword
4799 && i
.op
[0].imms
->X_add_number
< 32
4800 && !(i
.op
[1].regs
->reg_flags
& RegRex
))
4801 i
.tm
.opcode_modifier
.size
= SIZE32
;
4804 if (i
.types
[1].bitfield
.word
4805 && i
.op
[0].imms
->X_add_number
< 16)
4806 i
.tm
.opcode_modifier
.size
= SIZE32
;
4809 if (i
.op
[0].imms
->X_add_number
< 16)
4810 i
.tm
.opcode_modifier
.size
= SIZE16
;
4814 else if (i
.reg_operands
== 3
4815 && i
.op
[0].regs
== i
.op
[1].regs
4816 && !i
.types
[2].bitfield
.xmmword
4817 && (i
.tm
.opcode_modifier
.vex
4818 || ((!i
.mask
.reg
|| i
.mask
.zeroing
)
4819 && i
.tm
.opcode_modifier
.evex
4820 && (i
.encoding
!= encoding_evex
4821 || cpu_arch_isa_flags
.bitfield
.cpuavx512vl
4822 || is_cpu (&i
.tm
, CpuAVX512VL
)
4823 || (i
.tm
.operand_types
[2].bitfield
.zmmword
4824 && i
.types
[2].bitfield
.ymmword
))))
4825 && i
.tm
.opcode_space
== SPACE_0F
4826 && ((i
.tm
.base_opcode
| 2) == 0x57
4827 || i
.tm
.base_opcode
== 0xdf
4828 || i
.tm
.base_opcode
== 0xef
4829 || (i
.tm
.base_opcode
| 3) == 0xfb
4830 || i
.tm
.base_opcode
== 0x42
4831 || i
.tm
.base_opcode
== 0x47))
4834 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4836 EVEX VOP %zmmM, %zmmM, %zmmN
4837 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
4838 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
4839 EVEX VOP %ymmM, %ymmM, %ymmN
4840 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
4841 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
4842 VEX VOP %ymmM, %ymmM, %ymmN
4843 -> VEX VOP %xmmM, %xmmM, %xmmN
4844 VOP, one of vpandn and vpxor:
4845 VEX VOP %ymmM, %ymmM, %ymmN
4846 -> VEX VOP %xmmM, %xmmM, %xmmN
4847 VOP, one of vpandnd and vpandnq:
4848 EVEX VOP %zmmM, %zmmM, %zmmN
4849 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
4850 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
4851 EVEX VOP %ymmM, %ymmM, %ymmN
4852 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
4853 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
4854 VOP, one of vpxord and vpxorq:
4855 EVEX VOP %zmmM, %zmmM, %zmmN
4856 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
4857 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
4858 EVEX VOP %ymmM, %ymmM, %ymmN
4859 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
4860 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
4861 VOP, one of kxord and kxorq:
4862 VEX VOP %kM, %kM, %kN
4863 -> VEX kxorw %kM, %kM, %kN
4864 VOP, one of kandnd and kandnq:
4865 VEX VOP %kM, %kM, %kN
4866 -> VEX kandnw %kM, %kM, %kN
4868 if (i
.tm
.opcode_modifier
.evex
)
4870 if (i
.encoding
!= encoding_evex
)
4872 i
.tm
.opcode_modifier
.vex
= VEX128
;
4873 i
.tm
.opcode_modifier
.vexw
= VEXW0
;
4874 i
.tm
.opcode_modifier
.evex
= 0;
4875 i
.encoding
= encoding_vex
;
4878 else if (optimize
> 1)
4879 i
.tm
.opcode_modifier
.evex
= EVEX128
;
4883 else if (i
.tm
.operand_types
[0].bitfield
.class == RegMask
)
4885 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_NONE
;
4886 i
.tm
.opcode_modifier
.vexw
= VEXW0
;
4889 i
.tm
.opcode_modifier
.vex
= VEX128
;
4891 if (i
.tm
.opcode_modifier
.vex
)
4892 for (j
= 0; j
< 3; j
++)
4894 i
.types
[j
].bitfield
.xmmword
= 1;
4895 i
.types
[j
].bitfield
.ymmword
= 0;
4898 else if (i
.encoding
!= encoding_evex
4899 && i
.encoding
!= encoding_egpr
4900 && !i
.types
[0].bitfield
.zmmword
4901 && !i
.types
[1].bitfield
.zmmword
4903 && !i
.broadcast
.type
4904 && !i
.broadcast
.bytes
4905 && i
.tm
.opcode_modifier
.evex
4906 && ((i
.tm
.base_opcode
& ~Opcode_SIMD_IntD
) == 0x6f
4907 || (i
.tm
.base_opcode
& ~4) == 0xdb
4908 || (i
.tm
.base_opcode
& ~4) == 0xeb)
4909 && i
.tm
.extension_opcode
== None
)
4912 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4913 vmovdqu32 and vmovdqu64:
4914 EVEX VOP %xmmM, %xmmN
4915 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4916 EVEX VOP %ymmM, %ymmN
4917 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4919 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4921 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4923 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4925 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
4926 VOP, one of vpand, vpandn, vpor, vpxor:
4927 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4928 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4929 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4930 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4931 EVEX VOP{d,q} mem, %xmmM, %xmmN
4932 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4933 EVEX VOP{d,q} mem, %ymmM, %ymmN
4934 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
4936 for (j
= 0; j
< i
.operands
; j
++)
4937 if (operand_type_check (i
.types
[j
], disp
)
4938 && i
.op
[j
].disps
->X_op
== O_constant
)
4940 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4941 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4942 bytes, we choose EVEX Disp8 over VEX Disp32. */
4943 int evex_disp8
, vex_disp8
;
4944 unsigned int memshift
= i
.memshift
;
4945 offsetT n
= i
.op
[j
].disps
->X_add_number
;
4947 evex_disp8
= fits_in_disp8 (n
);
4949 vex_disp8
= fits_in_disp8 (n
);
4950 if (evex_disp8
!= vex_disp8
)
4952 i
.memshift
= memshift
;
4956 i
.types
[j
].bitfield
.disp8
= vex_disp8
;
4959 if ((i
.tm
.base_opcode
& ~Opcode_SIMD_IntD
) == 0x6f
4960 && i
.tm
.opcode_modifier
.opcodeprefix
== PREFIX_0XF2
)
4961 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_0XF3
;
4962 i
.tm
.opcode_modifier
.vex
4963 = i
.types
[0].bitfield
.ymmword
? VEX256
: VEX128
;
4964 i
.tm
.opcode_modifier
.vexw
= VEXW0
;
4965 /* VPAND, VPOR, and VPXOR are commutative. */
4966 if (i
.reg_operands
== 3 && i
.tm
.base_opcode
!= 0xdf)
4967 i
.tm
.opcode_modifier
.commutative
= 1;
4968 i
.tm
.opcode_modifier
.evex
= 0;
4969 i
.tm
.opcode_modifier
.masking
= 0;
4970 i
.tm
.opcode_modifier
.broadcast
= 0;
4971 i
.tm
.opcode_modifier
.disp8memshift
= 0;
4974 i
.types
[j
].bitfield
.disp8
4975 = fits_in_disp8 (i
.op
[j
].disps
->X_add_number
);
4977 else if (optimize_for_space
4978 && i
.tm
.base_opcode
== 0x29
4979 && i
.tm
.opcode_space
== SPACE_0F38
4980 && i
.operands
== i
.reg_operands
4981 && i
.op
[0].regs
== i
.op
[1].regs
4982 && (!i
.tm
.opcode_modifier
.vex
4983 || !(i
.op
[0].regs
->reg_flags
& RegRex
))
4984 && !i
.tm
.opcode_modifier
.evex
)
4987 pcmpeqq %xmmN, %xmmN -> pcmpeqd %xmmN, %xmmN
4988 vpcmpeqq %xmmN, %xmmN, %xmmM -> vpcmpeqd %xmmN, %xmmN, %xmmM (N < 8)
4989 vpcmpeqq %ymmN, %ymmN, %ymmM -> vpcmpeqd %ymmN, %ymmN, %ymmM (N < 8)
4991 i
.tm
.opcode_space
= SPACE_0F
;
4992 i
.tm
.base_opcode
= 0x76;
4994 else if (((i
.tm
.base_opcode
>= 0x64
4995 && i
.tm
.base_opcode
<= 0x66
4996 && i
.tm
.opcode_space
== SPACE_0F
)
4997 || (i
.tm
.base_opcode
== 0x37
4998 && i
.tm
.opcode_space
== SPACE_0F38
))
4999 && i
.operands
== i
.reg_operands
5000 && i
.op
[0].regs
== i
.op
[1].regs
5001 && !i
.tm
.opcode_modifier
.evex
)
5004 pcmpgt[bwd] %mmN, %mmN -> pxor %mmN, %mmN
5005 pcmpgt[bwdq] %xmmN, %xmmN -> pxor %xmmN, %xmmN
5006 vpcmpgt[bwdq] %xmmN, %xmmN, %xmmM -> vpxor %xmmN, %xmmN, %xmmM (N < 8)
5007 vpcmpgt[bwdq] %xmmN, %xmmN, %xmmM -> vpxor %xmm0, %xmm0, %xmmM (N > 7)
5008 vpcmpgt[bwdq] %ymmN, %ymmN, %ymmM -> vpxor %ymmN, %ymmN, %ymmM (N < 8)
5009 vpcmpgt[bwdq] %ymmN, %ymmN, %ymmM -> vpxor %ymm0, %ymm0, %ymmM (N > 7)
5011 i
.tm
.opcode_space
= SPACE_0F
;
5012 i
.tm
.base_opcode
= 0xef;
5013 if (i
.tm
.opcode_modifier
.vex
&& (i
.op
[0].regs
->reg_flags
& RegRex
))
5015 if (i
.operands
== 2)
5017 gas_assert (i
.tm
.opcode_modifier
.sse2avx
);
5023 i
.op
[2].regs
= i
.op
[0].regs
;
5024 i
.types
[2] = i
.types
[0];
5025 i
.flags
[2] = i
.flags
[0];
5026 i
.tm
.operand_types
[2] = i
.tm
.operand_types
[0];
5028 i
.tm
.opcode_modifier
.sse2avx
= 0;
5030 i
.op
[0].regs
-= i
.op
[0].regs
->reg_num
+ 8;
5031 i
.op
[1].regs
= i
.op
[0].regs
;
5034 else if (optimize_for_space
5035 && i
.tm
.base_opcode
== 0x59
5036 && i
.tm
.opcode_space
== SPACE_0F38
5037 && i
.operands
== i
.reg_operands
5038 && i
.tm
.opcode_modifier
.vex
5039 && !(i
.op
[0].regs
->reg_flags
& RegRex
)
5040 && i
.op
[0].regs
->reg_type
.bitfield
.xmmword
5041 && i
.encoding
!= encoding_vex3
)
5044 vpbroadcastq %xmmN, %xmmM -> vpunpcklqdq %xmmN, %xmmN, %xmmM (N < 8)
5046 i
.tm
.opcode_space
= SPACE_0F
;
5047 i
.tm
.base_opcode
= 0x6c;
5048 i
.tm
.opcode_modifier
.vexvvvv
= VexVVVV_SRC1
;
5054 i
.op
[2].regs
= i
.op
[0].regs
;
5055 i
.types
[2] = i
.types
[0];
5056 i
.flags
[2] = i
.flags
[0];
5057 i
.tm
.operand_types
[2] = i
.tm
.operand_types
[0];
5059 swap_2_operands (1, 2);
5064 s_noopt (int dummy ATTRIBUTE_UNUSED
)
5066 if (!is_it_end_of_statement ())
5067 as_warn (_("`.noopt' arguments ignored"));
5070 optimize_for_space
= 0;
5072 ignore_rest_of_line ();
5075 /* Return non-zero for load instruction. */
5081 int any_vex_p
= is_any_vex_encoding (&i
.tm
);
5082 unsigned int base_opcode
= i
.tm
.base_opcode
| 1;
5086 /* Anysize insns: lea, invlpg, clflush, prefetch*, bndmk, bndcl, bndcu,
5087 bndcn, bndstx, bndldx, clflushopt, clwb, cldemote. */
5088 if (i
.tm
.opcode_modifier
.operandconstraint
== ANY_SIZE
)
5092 if (i
.tm
.mnem_off
== MN_pop
)
5096 if (i
.tm
.opcode_space
== SPACE_BASE
)
5099 if (i
.tm
.base_opcode
== 0x9d
5100 || i
.tm
.base_opcode
== 0x61)
5103 /* movs, cmps, lods, scas. */
5104 if ((i
.tm
.base_opcode
| 0xb) == 0xaf)
5108 if (base_opcode
== 0x6f
5109 || i
.tm
.base_opcode
== 0xd7)
5111 /* NB: For AMD-specific insns with implicit memory operands,
5112 they're intentionally not covered. */
5115 /* No memory operand. */
5116 if (!i
.mem_operands
)
5121 if (i
.tm
.mnem_off
== MN_vldmxcsr
)
5124 else if (i
.tm
.opcode_space
== SPACE_BASE
)
5126 /* test, not, neg, mul, imul, div, idiv. */
5127 if (base_opcode
== 0xf7 && i
.tm
.extension_opcode
!= 1)
5131 if (base_opcode
== 0xff && i
.tm
.extension_opcode
<= 1)
5134 /* add, or, adc, sbb, and, sub, xor, cmp. */
5135 if (i
.tm
.base_opcode
>= 0x80 && i
.tm
.base_opcode
<= 0x83)
5138 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
5139 if ((base_opcode
== 0xc1 || (base_opcode
| 2) == 0xd3)
5140 && i
.tm
.extension_opcode
!= 6)
5143 /* Check for x87 instructions. */
5144 if ((base_opcode
| 6) == 0xdf)
5146 /* Skip fst, fstp, fstenv, fstcw. */
5147 if (i
.tm
.base_opcode
== 0xd9
5148 && (i
.tm
.extension_opcode
== 2
5149 || i
.tm
.extension_opcode
== 3
5150 || i
.tm
.extension_opcode
== 6
5151 || i
.tm
.extension_opcode
== 7))
5154 /* Skip fisttp, fist, fistp, fstp. */
5155 if (i
.tm
.base_opcode
== 0xdb
5156 && (i
.tm
.extension_opcode
== 1
5157 || i
.tm
.extension_opcode
== 2
5158 || i
.tm
.extension_opcode
== 3
5159 || i
.tm
.extension_opcode
== 7))
5162 /* Skip fisttp, fst, fstp, fsave, fstsw. */
5163 if (i
.tm
.base_opcode
== 0xdd
5164 && (i
.tm
.extension_opcode
== 1
5165 || i
.tm
.extension_opcode
== 2
5166 || i
.tm
.extension_opcode
== 3
5167 || i
.tm
.extension_opcode
== 6
5168 || i
.tm
.extension_opcode
== 7))
5171 /* Skip fisttp, fist, fistp, fbstp, fistp. */
5172 if (i
.tm
.base_opcode
== 0xdf
5173 && (i
.tm
.extension_opcode
== 1
5174 || i
.tm
.extension_opcode
== 2
5175 || i
.tm
.extension_opcode
== 3
5176 || i
.tm
.extension_opcode
== 6
5177 || i
.tm
.extension_opcode
== 7))
5183 else if (i
.tm
.opcode_space
== SPACE_0F
)
5185 /* bt, bts, btr, btc. */
5186 if (i
.tm
.base_opcode
== 0xba
5187 && (i
.tm
.extension_opcode
| 3) == 7)
5190 /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */
5191 if (i
.tm
.base_opcode
== 0xc7
5192 && i
.tm
.opcode_modifier
.opcodeprefix
== PREFIX_NONE
5193 && (i
.tm
.extension_opcode
== 1 || i
.tm
.extension_opcode
== 3
5194 || i
.tm
.extension_opcode
== 6))
5197 /* fxrstor, ldmxcsr, xrstor. */
5198 if (i
.tm
.base_opcode
== 0xae
5199 && (i
.tm
.extension_opcode
== 1
5200 || i
.tm
.extension_opcode
== 2
5201 || i
.tm
.extension_opcode
== 5))
5204 /* lgdt, lidt, lmsw. */
5205 if (i
.tm
.base_opcode
== 0x01
5206 && (i
.tm
.extension_opcode
== 2
5207 || i
.tm
.extension_opcode
== 3
5208 || i
.tm
.extension_opcode
== 6))
5212 dest
= i
.operands
- 1;
5214 /* Check fake imm8 operand and 3 source operands. */
5215 if ((i
.tm
.opcode_modifier
.immext
5216 || i
.reg_operands
+ i
.mem_operands
== 4)
5217 && i
.types
[dest
].bitfield
.imm8
)
5220 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */
5221 if (i
.tm
.opcode_space
== SPACE_BASE
5222 && ((base_opcode
| 0x38) == 0x39
5223 || (base_opcode
| 2) == 0x87))
5226 if (i
.tm
.mnem_off
== MN_xadd
)
5229 /* Check for load instruction. */
5230 return (i
.types
[dest
].bitfield
.class != ClassNone
5231 || i
.types
[dest
].bitfield
.instance
== Accum
);
5234 /* Output lfence, 0xfaee8, after instruction. */
5237 insert_lfence_after (void)
5239 if (lfence_after_load
&& load_insn_p ())
5241 /* There are also two REP string instructions that require
5242 special treatment. Specifically, the compare string (CMPS)
5243 and scan string (SCAS) instructions set EFLAGS in a manner
5244 that depends on the data being compared/scanned. When used
5245 with a REP prefix, the number of iterations may therefore
5246 vary depending on this data. If the data is a program secret
5247 chosen by the adversary using an LVI method,
5248 then this data-dependent behavior may leak some aspect
5250 if (((i
.tm
.base_opcode
| 0x9) == 0xaf)
5251 && i
.prefix
[REP_PREFIX
])
5253 as_warn (_("`%s` changes flags which would affect control flow behavior"),
5256 char *p
= frag_more (3);
5263 /* Output lfence, 0xfaee8, before instruction. */
5266 insert_lfence_before (const struct last_insn
*last_insn
)
5270 if (i
.tm
.opcode_space
!= SPACE_BASE
)
5273 if (i
.tm
.base_opcode
== 0xff
5274 && (i
.tm
.extension_opcode
== 2 || i
.tm
.extension_opcode
== 4))
5276 /* Insert lfence before indirect branch if needed. */
5278 if (lfence_before_indirect_branch
== lfence_branch_none
)
5281 if (i
.operands
!= 1)
5284 if (i
.reg_operands
== 1)
5286 /* Indirect branch via register. Don't insert lfence with
5287 -mlfence-after-load=yes. */
5288 if (lfence_after_load
5289 || lfence_before_indirect_branch
== lfence_branch_memory
)
5292 else if (i
.mem_operands
== 1
5293 && lfence_before_indirect_branch
!= lfence_branch_register
)
5295 as_warn (_("indirect `%s` with memory operand should be avoided"),
5302 if (last_insn
->kind
!= last_insn_other
)
5304 as_warn_where (last_insn
->file
, last_insn
->line
,
5305 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
5306 last_insn
->name
, insn_name (&i
.tm
));
5317 /* Output or/not/shl and lfence before near ret. */
5318 if (lfence_before_ret
!= lfence_before_ret_none
5319 && (i
.tm
.base_opcode
| 1) == 0xc3)
5321 if (last_insn
->kind
!= last_insn_other
)
5323 as_warn_where (last_insn
->file
, last_insn
->line
,
5324 _("`%s` skips -mlfence-before-ret on `%s`"),
5325 last_insn
->name
, insn_name (&i
.tm
));
5329 /* Near ret ingore operand size override under CPU64. */
5330 char prefix
= flag_code
== CODE_64BIT
5332 : i
.prefix
[DATA_PREFIX
] ? 0x66 : 0x0;
5334 if (lfence_before_ret
== lfence_before_ret_not
)
5336 /* not: 0xf71424, may add prefix
5337 for operand size override or 64-bit code. */
5338 p
= frag_more ((prefix
? 2 : 0) + 6 + 3);
5352 p
= frag_more ((prefix
? 1 : 0) + 4 + 3);
5355 if (lfence_before_ret
== lfence_before_ret_or
)
5357 /* or: 0x830c2400, may add prefix
5358 for operand size override or 64-bit code. */
5364 /* shl: 0xc1242400, may add prefix
5365 for operand size override or 64-bit code. */
5380 /* Shared helper for md_assemble() and s_insn(). */
5381 static void init_globals (void)
5385 memset (&i
, '\0', sizeof (i
));
5386 i
.rounding
.type
= rc_none
;
5387 for (j
= 0; j
< MAX_OPERANDS
; j
++)
5388 i
.reloc
[j
] = NO_RELOC
;
5389 memset (disp_expressions
, '\0', sizeof (disp_expressions
));
5390 memset (im_expressions
, '\0', sizeof (im_expressions
));
5391 save_stack_p
= save_stack
;
5394 /* Helper for md_assemble() to decide whether to prepare for a possible 2nd
5395 parsing pass. Instead of introducing a rarely use new insn attribute this
5396 utilizes a common pattern between affected templates. It is deemed
5397 acceptable that this will lead to unnecessary pass 2 preparations in a
5398 limited set of cases. */
5399 static INLINE
bool may_need_pass2 (const insn_template
*t
)
5401 return t
->opcode_modifier
.sse2avx
5402 /* Note that all SSE2AVX templates have at least one operand. */
5403 ? t
->operand_types
[t
->operands
- 1].bitfield
.class == RegSIMD
5404 : (t
->opcode_space
== SPACE_0F
5405 && (t
->base_opcode
| 1) == 0xbf)
5406 || (t
->opcode_space
== SPACE_BASE
5407 && t
->base_opcode
== 0x63);
5410 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
5412 /* DWARF register number for EFLAGS. Used for pushf/popf insns. */
5413 #define GINSN_DW2_REGNUM_EFLAGS 49
5414 /* DWARF register number for RSI. Used as dummy value when RegIP/RegIZ. */
5415 #define GINSN_DW2_REGNUM_RSI_DUMMY 4
5417 /* Identify the callee-saved registers in System V AMD64 ABI. */
5420 x86_scfi_callee_saved_p (unsigned int dw2reg_num
)
5422 if (dw2reg_num
== 3 /* rbx. */
5423 || dw2reg_num
== REG_FP
/* rbp. */
5424 || dw2reg_num
== REG_SP
/* rsp. */
5425 || (dw2reg_num
>= 12 && dw2reg_num
<= 15) /* r12 - r15. */)
5431 /* Check whether an instruction prefix which affects operation size
5432 accompanies. For insns in the legacy space, setting REX.W takes precedence
5433 over the operand-size prefix (66H) when both are used.
5435 The current users of this API are in the handlers for PUSH, POP or other
5436 instructions which affect the stack pointer implicitly: the operation size
5437 (16, 32, or 64 bits) determines the amount by which the stack pointer is
5438 incremented / decremented (2, 4 or 8). */
5441 ginsn_opsize_prefix_p (void)
5443 return (!(i
.prefix
[REX_PREFIX
] & REX_W
) && i
.prefix
[DATA_PREFIX
]);
5446 /* Get the DWARF register number for the given register entry.
5447 For specific byte/word/dword register accesses like al, cl, ah, ch, r8d,
5448 r20w etc., we need to identify the DWARF register number for the
5449 corresponding 8-byte GPR.
5451 This function is a hack - it relies on relative ordering of reg entries in
5452 the i386_regtab. FIXME - it will be good to allow a more direct way to get
5453 this information. */
5456 ginsn_dw2_regnum (const reg_entry
*ireg
)
5458 const reg_entry
*temp
= ireg
;
5459 unsigned int dwarf_reg
= Dw2Inval
, idx
= 0;
5461 /* ginsn creation is available for AMD64 abi only ATM. Other flag_code
5462 are not expected. */
5463 gas_assert (ireg
&& flag_code
== CODE_64BIT
);
5465 /* Watch out for RegIP, RegIZ. These are expected to appear only with
5466 base/index addressing modes. Although creating inaccurate data
5467 dependencies, using a dummy value (lets say volatile register rsi) will
5468 not hurt SCFI. TBD_GINSN_GEN_NOT_SCFI. */
5469 if (ireg
->reg_num
== RegIP
|| ireg
->reg_num
== RegIZ
)
5470 return GINSN_DW2_REGNUM_RSI_DUMMY
;
5472 dwarf_reg
= ireg
->dw2_regnum
[object_64bit
];
5474 if (dwarf_reg
== Dw2Inval
)
5476 if (ireg
<= &i386_regtab
[3])
5477 /* For al, cl, dl, bl, bump over to axl, cxl, dxl, bxl respectively by
5480 else if (ireg
<= &i386_regtab
[7])
5481 /* For ah, ch, dh, bh, bump over to axl, cxl, dxl, bxl respectively by
5486 /* The code relies on the relative ordering of the reg entries in
5487 i386_regtab. There are 32 register entries between axl-r31b,
5488 ax-r31w etc. The assertions here ensures the code does not
5489 recurse indefinitely. */
5490 gas_assert ((temp
- &i386_regtab
[0]) >= 0);
5491 idx
= temp
- &i386_regtab
[0];
5492 gas_assert (idx
+ 32 < i386_regtab_size
- 1);
5497 dwarf_reg
= ginsn_dw2_regnum (temp
);
5500 /* Sanity check - failure may indicate state corruption, bad ginsn or
5501 perhaps the i386-reg table and the current function got out of sync. */
5502 gas_assert (dwarf_reg
< Dw2Inval
);
5508 x86_ginsn_addsub_reg_mem (const symbolS
*insn_end_sym
)
5510 unsigned int dw2_regnum
;
5511 unsigned int src1_dw2_regnum
;
5512 ginsnS
*ginsn
= NULL
;
5513 ginsnS
* (*ginsn_func
) (const symbolS
*, bool,
5514 enum ginsn_src_type
, unsigned int, offsetT
,
5515 enum ginsn_src_type
, unsigned int, offsetT
,
5516 enum ginsn_dst_type
, unsigned int, offsetT
);
5517 uint16_t opcode
= i
.tm
.base_opcode
;
5519 gas_assert (i
.tm
.opcode_space
== SPACE_BASE
5520 && (opcode
== 0x1 || opcode
== 0x29));
5521 ginsn_func
= (opcode
== 0x1) ? ginsn_new_add
: ginsn_new_sub
;
5523 /* op %reg, symbol or even other cases where destination involves indirect
5524 access are unnecessary for SCFI correctness. TBD_GINSN_GEN_NOT_SCFI. */
5528 /* Skip detection of 8/16/32-bit op size; 'add/sub reg, reg/mem' ops always
5529 make the dest reg untraceable for SCFI. */
5531 /* op reg, reg/mem. */
5532 src1_dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
5533 /* Of interest only when second opnd is not memory. */
5534 if (i
.reg_operands
== 2)
5536 dw2_regnum
= ginsn_dw2_regnum (i
.op
[1].regs
);
5537 ginsn
= ginsn_func (insn_end_sym
, true,
5538 GINSN_SRC_REG
, src1_dw2_regnum
, 0,
5539 GINSN_SRC_REG
, dw2_regnum
, 0,
5540 GINSN_DST_REG
, dw2_regnum
, 0);
5541 ginsn_set_where (ginsn
);
5548 x86_ginsn_addsub_mem_reg (const symbolS
*insn_end_sym
)
5550 unsigned int dw2_regnum
;
5551 unsigned int src1_dw2_regnum
;
5552 const reg_entry
*mem_reg
;
5554 ginsnS
*ginsn
= NULL
;
5555 ginsnS
* (*ginsn_func
) (const symbolS
*, bool,
5556 enum ginsn_src_type
, unsigned int, offsetT
,
5557 enum ginsn_src_type
, unsigned int, offsetT
,
5558 enum ginsn_dst_type
, unsigned int, offsetT
);
5559 uint16_t opcode
= i
.tm
.base_opcode
;
5561 gas_assert (i
.tm
.opcode_space
== SPACE_BASE
5562 && (opcode
== 0x3 || opcode
== 0x2b));
5563 ginsn_func
= (opcode
== 0x3) ? ginsn_new_add
: ginsn_new_sub
;
5565 /* op symbol, %reg. */
5566 if (i
.mem_operands
&& !i
.base_reg
&& !i
.index_reg
)
5569 /* Skip detection of 8/16/32-bit op size; 'add/sub reg/mem, reg' ops always
5570 make the dest reg untraceable for SCFI. */
5572 /* op reg/mem, %reg. */
5573 dw2_regnum
= ginsn_dw2_regnum (i
.op
[1].regs
);
5575 if (i
.reg_operands
== 2)
5577 src1_dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
5578 ginsn
= ginsn_func (insn_end_sym
, true,
5579 GINSN_SRC_REG
, src1_dw2_regnum
, 0,
5580 GINSN_SRC_REG
, dw2_regnum
, 0,
5581 GINSN_DST_REG
, dw2_regnum
, 0);
5582 ginsn_set_where (ginsn
);
5584 else if (i
.mem_operands
)
5586 mem_reg
= (i
.base_reg
) ? i
.base_reg
: i
.index_reg
;
5587 src1_dw2_regnum
= ginsn_dw2_regnum (mem_reg
);
5588 if (i
.disp_operands
== 1)
5589 gdisp
= i
.op
[0].disps
->X_add_number
;
5590 ginsn
= ginsn_func (insn_end_sym
, true,
5591 GINSN_SRC_INDIRECT
, src1_dw2_regnum
, gdisp
,
5592 GINSN_SRC_REG
, dw2_regnum
, 0,
5593 GINSN_DST_REG
, dw2_regnum
, 0);
5594 ginsn_set_where (ginsn
);
5601 x86_ginsn_alu_imm (const symbolS
*insn_end_sym
)
5604 unsigned int dw2_regnum
;
5605 ginsnS
*ginsn
= NULL
;
5606 enum ginsn_src_type src_type
= GINSN_SRC_REG
;
5607 enum ginsn_dst_type dst_type
= GINSN_DST_REG
;
5609 ginsnS
* (*ginsn_func
) (const symbolS
*, bool,
5610 enum ginsn_src_type
, unsigned int, offsetT
,
5611 enum ginsn_src_type
, unsigned int, offsetT
,
5612 enum ginsn_dst_type
, unsigned int, offsetT
);
5614 /* FIXME - create ginsn where dest is REG_SP / REG_FP only ? */
5615 /* Map for insn.tm.extension_opcode
5621 /* add/sub/and imm, %reg only at this time for SCFI.
5622 Although all three ('and', 'or' , 'xor') make the destination reg
5623 untraceable, 'and' op is handled but not 'or' / 'xor' because we will look
5624 into supporting the DRAP pattern at some point. Other opcodes ('adc',
5625 'sbb' and 'cmp') are not generated here either. The ginsn representation
5626 does not have support for the latter three opcodes; GINSN_TYPE_OTHER may
5627 be added for these after x86_ginsn_unhandled () invocation if the
5628 destination register is REG_SP or REG_FP. */
5629 if (i
.tm
.extension_opcode
== 5)
5630 ginsn_func
= ginsn_new_sub
;
5631 else if (i
.tm
.extension_opcode
== 4)
5632 ginsn_func
= ginsn_new_and
;
5633 else if (i
.tm
.extension_opcode
== 0)
5634 ginsn_func
= ginsn_new_add
;
5638 /* TBD_GINSN_REPRESENTATION_LIMIT: There is no representation for when a
5639 symbol is used as an operand, like so:
5640 addq $simd_cmp_op+8, %rdx
5641 Skip generating any ginsn for this. */
5642 if (i
.imm_operands
== 1
5643 && i
.op
[0].imms
->X_op
!= O_constant
)
5648 These are not of interest for SCFI. Also, TBD_GINSN_GEN_NOT_SCFI. */
5649 if (i
.mem_operands
== 1)
5652 /* 8/16/32-bit op size makes the destination reg untraceable for SCFI.
5653 Deal with this via the x86_ginsn_unhandled () code path. */
5654 if (i
.suffix
!= QWORD_MNEM_SUFFIX
)
5657 gas_assert (i
.imm_operands
== 1);
5658 src_imm
= i
.op
[0].imms
->X_add_number
;
5659 /* The second operand may be a register or indirect access. For SCFI, only
5660 the case when the second opnd is a register is interesting. Revisit this
5661 if generating ginsns for a different gen mode TBD_GINSN_GEN_NOT_SCFI. */
5662 if (i
.reg_operands
== 1)
5664 dw2_regnum
= ginsn_dw2_regnum (i
.op
[1].regs
);
5665 /* For ginsn, keep the imm as second src operand. */
5666 ginsn
= ginsn_func (insn_end_sym
, true,
5667 src_type
, dw2_regnum
, 0,
5668 GINSN_SRC_IMM
, 0, src_imm
,
5669 dst_type
, dw2_regnum
, 0);
5671 ginsn_set_where (ginsn
);
5677 /* Create ginsn(s) for MOV operations.
5679 The generated ginsns corresponding to mov with indirect access to memory
5680 (src or dest) suffer with loss of information: when both index and base
5681 registers are at play, only base register gets conveyed in ginsn. Note
5682 this TBD_GINSN_GEN_NOT_SCFI. */
5685 x86_ginsn_move (const symbolS
*insn_end_sym
)
5687 ginsnS
*ginsn
= NULL
;
5688 unsigned int dst_reg
;
5689 unsigned int src_reg
;
5690 offsetT src_disp
= 0;
5691 offsetT dst_disp
= 0;
5692 const reg_entry
*dst
= NULL
;
5693 const reg_entry
*src
= NULL
;
5694 uint16_t opcode
= i
.tm
.base_opcode
;
5695 enum ginsn_src_type src_type
= GINSN_SRC_REG
;
5696 enum ginsn_dst_type dst_type
= GINSN_DST_REG
;
5698 /* mov %reg, symbol or mov symbol, %reg.
5699 Not of interest for SCFI. Also, TBD_GINSN_GEN_NOT_SCFI. */
5700 if (i
.mem_operands
== 1 && !i
.base_reg
&& !i
.index_reg
)
5703 /* 8/16/32-bit op size makes the destination reg untraceable for SCFI.
5704 Handle mov reg, reg only. mov to or from a memory operand will make
5705 dest reg, when present, untraceable, irrespective of the op size. */
5706 if (i
.reg_operands
== 2 && i
.suffix
!= QWORD_MNEM_SUFFIX
)
5709 gas_assert (i
.tm
.opcode_space
== SPACE_BASE
);
5710 if (opcode
== 0x8b || opcode
== 0x8a)
5712 /* mov disp(%reg), %reg. */
5715 src
= (i
.base_reg
) ? i
.base_reg
: i
.index_reg
;
5716 if (i
.disp_operands
== 1)
5717 src_disp
= i
.op
[0].disps
->X_add_number
;
5718 src_type
= GINSN_SRC_INDIRECT
;
5725 else if (opcode
== 0x89 || opcode
== 0x88)
5727 /* mov %reg, disp(%reg). */
5731 dst
= (i
.base_reg
) ? i
.base_reg
: i
.index_reg
;
5732 if (i
.disp_operands
== 1)
5733 dst_disp
= i
.op
[1].disps
->X_add_number
;
5734 dst_type
= GINSN_DST_INDIRECT
;
5740 src_reg
= ginsn_dw2_regnum (src
);
5741 dst_reg
= ginsn_dw2_regnum (dst
);
5743 ginsn
= ginsn_new_mov (insn_end_sym
, true,
5744 src_type
, src_reg
, src_disp
,
5745 dst_type
, dst_reg
, dst_disp
);
5746 ginsn_set_where (ginsn
);
5751 /* Generate appropriate ginsn for lea.
5753 Unhandled sub-cases (marked with TBD_GINSN_GEN_NOT_SCFI) also suffer with
5754 some loss of information in the final ginsn chosen eventually (type
5755 GINSN_TYPE_OTHER). But this is fine for now for GINSN_GEN_SCFI generation
5759 x86_ginsn_lea (const symbolS
*insn_end_sym
)
5761 offsetT src_disp
= 0;
5762 ginsnS
*ginsn
= NULL
;
5763 unsigned int src1_reg
;
5764 const reg_entry
*src1
;
5765 offsetT index_scale
;
5766 unsigned int dst_reg
;
5769 if ((!i
.base_reg
) != (!i
.index_reg
|| i
.index_reg
->reg_num
== RegIZ
))
5771 /* lea disp(%base), %dst or lea disp(,%index,imm), %dst.
5772 Either index_reg or base_reg exists, but not both. Further, as per
5773 above, the case when just %index exists but is equal to RegIZ is
5774 excluded. If not excluded, a GINSN_TYPE_MOV of %rsi
5775 (GINSN_DW2_REGNUM_RSI_DUMMY) to %dst will be generated by this block.
5776 Such a mov ginsn is imprecise; so, exclude now and generate
5777 GINSN_TYPE_OTHER instead later via the x86_ginsn_unhandled ().
5778 Excluding other cases is required due to
5779 TBD_GINSN_REPRESENTATION_LIMIT. */
5781 index_scale
= i
.log2_scale_factor
;
5782 index_regiz_p
= i
.index_reg
&& i
.index_reg
->reg_num
== RegIZ
;
5783 src1
= i
.base_reg
? i
.base_reg
: i
.index_reg
;
5784 src1_reg
= ginsn_dw2_regnum (src1
);
5785 dst_reg
= ginsn_dw2_regnum (i
.op
[1].regs
);
5786 /* It makes sense to represent a scale factor of 1 precisely here
5787 (i.e., not using GINSN_TYPE_OTHER, but rather similar to the
5788 base-without-index case). A non-zero scale factor is still OK if
5789 the index reg is zero reg.
5790 However, skip from here the case when disp has a symbol instead.
5791 TBD_GINSN_REPRESENTATION_LIMIT. */
5792 if ((!index_scale
|| index_regiz_p
)
5793 && (!i
.disp_operands
|| i
.op
[0].disps
->X_op
== O_constant
))
5795 if (i
.disp_operands
)
5796 src_disp
= i
.op
[0].disps
->X_add_number
;
5799 /* Generate an ADD ginsn. */
5800 ginsn
= ginsn_new_add (insn_end_sym
, true,
5801 GINSN_SRC_REG
, src1_reg
, 0,
5802 GINSN_SRC_IMM
, 0, src_disp
,
5803 GINSN_DST_REG
, dst_reg
, 0);
5805 /* Generate a MOV ginsn. */
5806 ginsn
= ginsn_new_mov (insn_end_sym
, true,
5807 GINSN_SRC_REG
, src1_reg
, 0,
5808 GINSN_DST_REG
, dst_reg
, 0);
5810 ginsn_set_where (ginsn
);
5813 /* Skip handling other cases here,
5814 - when (i.index_reg && i.base_reg) is true,
5815 e.g., lea disp(%base,%index,imm), %dst
5816 We do not have a ginsn representation for multiply.
5817 - or, when (!i.index_reg && !i.base_reg) is true,
5818 e.g., lea symbol, %dst
5819 Not a frequent pattern. If %dst is a register of interest, the user is
5820 likely to use a MOV op anyway.
5821 Deal with these via the x86_ginsn_unhandled () code path to generate
5822 GINSN_TYPE_OTHER when necessary. TBD_GINSN_GEN_NOT_SCFI. */
5828 x86_ginsn_jump (const symbolS
*insn_end_sym
, bool cond_p
)
5830 ginsnS
*ginsn
= NULL
;
5831 const symbolS
*src_symbol
;
5832 ginsnS
* (*ginsn_func
) (const symbolS
*sym
, bool real_p
,
5833 enum ginsn_src_type src_type
, unsigned int src_reg
,
5834 const symbolS
*src_ginsn_sym
);
5836 gas_assert (i
.disp_operands
== 1);
5838 ginsn_func
= cond_p
? ginsn_new_jump_cond
: ginsn_new_jump
;
5839 if (i
.op
[0].disps
->X_op
== O_symbol
&& !i
.op
[0].disps
->X_add_number
)
5841 src_symbol
= i
.op
[0].disps
->X_add_symbol
;
5842 ginsn
= ginsn_func (insn_end_sym
, true,
5843 GINSN_SRC_SYMBOL
, 0, src_symbol
);
5845 ginsn_set_where (ginsn
);
5849 /* A non-zero addend in jump/JCC target makes control-flow tracking
5850 difficult. Skip SCFI for now. */
5851 as_bad (_("SCFI: `%s' insn with non-zero addend to sym not supported"),
5852 cond_p
? "JCC" : "jmp");
5860 x86_ginsn_enter (const symbolS
*insn_end_sym
)
5862 ginsnS
*ginsn
= NULL
;
5863 ginsnS
*ginsn_next
= NULL
;
5864 ginsnS
*ginsn_last
= NULL
;
5865 /* In 64-bit mode, the default stack update size is 8 bytes. */
5866 int stack_opnd_size
= 8;
5868 gas_assert (i
.imm_operands
== 2);
5870 /* For non-zero size operands, bail out as untraceable for SCFI. */
5871 if (i
.op
[0].imms
->X_op
!= O_constant
|| i
.op
[0].imms
->X_add_symbol
!= 0
5872 || i
.op
[1].imms
->X_op
!= O_constant
|| i
.op
[1].imms
->X_add_symbol
!= 0)
5874 as_bad ("SCFI: enter insn with non-zero operand not supported");
5878 /* Check if this is a 16-bit op. */
5879 if (ginsn_opsize_prefix_p ())
5880 stack_opnd_size
= 2;
5882 /* If the nesting level is 0, the processor pushes the frame pointer from
5883 the BP/EBP/RBP register onto the stack, copies the current stack
5884 pointer from the SP/ESP/RSP register into the BP/EBP/RBP register, and
5885 loads the SP/ESP/RSP register with the current stack-pointer value
5886 minus the value in the size operand. */
5887 ginsn
= ginsn_new_sub (insn_end_sym
, false,
5888 GINSN_SRC_REG
, REG_SP
, 0,
5889 GINSN_SRC_IMM
, 0, stack_opnd_size
,
5890 GINSN_DST_REG
, REG_SP
, 0);
5891 ginsn_set_where (ginsn
);
5892 ginsn_next
= ginsn_new_store (insn_end_sym
, false,
5893 GINSN_SRC_REG
, REG_FP
,
5894 GINSN_DST_INDIRECT
, REG_SP
, 0);
5895 ginsn_set_where (ginsn_next
);
5896 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
5897 ginsn_last
= ginsn_new_mov (insn_end_sym
, false,
5898 GINSN_SRC_REG
, REG_SP
, 0,
5899 GINSN_DST_REG
, REG_FP
, 0);
5900 ginsn_set_where (ginsn_last
);
5901 gas_assert (!ginsn_link_next (ginsn_next
, ginsn_last
));
5907 x86_ginsn_leave (const symbolS
*insn_end_sym
)
5909 ginsnS
*ginsn
= NULL
;
5910 ginsnS
*ginsn_next
= NULL
;
5911 ginsnS
*ginsn_last
= NULL
;
5912 /* In 64-bit mode, the default stack update size is 8 bytes. */
5913 int stack_opnd_size
= 8;
5915 /* Check if this is a 16-bit op. */
5916 if (ginsn_opsize_prefix_p ())
5917 stack_opnd_size
= 2;
5919 /* The 'leave' instruction copies the contents of the RBP register
5920 into the RSP register to release all stack space allocated to the
5922 ginsn
= ginsn_new_mov (insn_end_sym
, false,
5923 GINSN_SRC_REG
, REG_FP
, 0,
5924 GINSN_DST_REG
, REG_SP
, 0);
5925 ginsn_set_where (ginsn
);
5926 /* Then it restores the old value of the RBP register from the stack. */
5927 ginsn_next
= ginsn_new_load (insn_end_sym
, false,
5928 GINSN_SRC_INDIRECT
, REG_SP
, 0,
5929 GINSN_DST_REG
, REG_FP
);
5930 ginsn_set_where (ginsn_next
);
5931 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
5932 ginsn_last
= ginsn_new_add (insn_end_sym
, false,
5933 GINSN_SRC_REG
, REG_SP
, 0,
5934 GINSN_SRC_IMM
, 0, stack_opnd_size
,
5935 GINSN_DST_REG
, REG_SP
, 0);
5936 ginsn_set_where (ginsn_next
);
5937 gas_assert (!ginsn_link_next (ginsn_next
, ginsn_last
));
5942 /* Check if an instruction is whitelisted.
5944 Some instructions may appear with REG_SP or REG_FP as destination, because
5945 which they are deemed 'interesting' for SCFI. Whitelist them here if they
5946 do not affect SCFI correctness. */
5949 x86_ginsn_safe_to_skip_p (void)
5951 bool skip_p
= false;
5952 uint16_t opcode
= i
.tm
.base_opcode
;
5959 if (i
.tm
.opcode_space
!= SPACE_BASE
)
5961 /* cmp imm, reg/rem. */
5962 if (i
.tm
.extension_opcode
== 7)
5970 if (i
.tm
.opcode_space
!= SPACE_BASE
)
5972 /* cmp imm/reg/mem, reg/rem. */
5980 /* test imm/reg/mem, reg/mem. */
5981 if (i
.tm
.opcode_space
!= SPACE_BASE
)
5993 #define X86_GINSN_UNHANDLED_NONE 0
5994 #define X86_GINSN_UNHANDLED_DEST_REG 1
5995 #define X86_GINSN_UNHANDLED_CFG 2
5996 #define X86_GINSN_UNHANDLED_STACKOP 3
5997 #define X86_GINSN_UNHANDLED_UNEXPECTED 4
5999 /* Check the input insn for its impact on the correctness of the synthesized
6000 CFI. Returns an error code to the caller. */
6003 x86_ginsn_unhandled (void)
6005 int err
= X86_GINSN_UNHANDLED_NONE
;
6006 const reg_entry
*reg_op
;
6007 unsigned int dw2_regnum
;
6009 /* Keep an eye out for instructions affecting control flow. */
6010 if (i
.tm
.opcode_modifier
.jump
)
6011 err
= X86_GINSN_UNHANDLED_CFG
;
6012 /* Also, for any instructions involving an implicit update to the stack
6014 else if (i
.tm
.opcode_modifier
.operandconstraint
== IMPLICIT_STACK_OP
)
6015 err
= X86_GINSN_UNHANDLED_STACKOP
;
6016 /* Finally, also check if the missed instructions are affecting REG_SP or
6017 REG_FP. The destination operand is the last at all stages of assembly
6018 (due to following AT&T syntax layout in the internal representation). In
6019 case of Intel syntax input, this still remains true as swap_operands ()
6021 PS: These checks do not involve index / base reg, as indirect memory
6022 accesses via REG_SP or REG_FP do not affect SCFI correctness.
6023 (Also note these instructions are candidates for other ginsn generation
6024 modes in future. TBD_GINSN_GEN_NOT_SCFI.) */
6025 else if (i
.operands
&& i
.reg_operands
6026 && !(i
.flags
[i
.operands
- 1] & Operand_Mem
))
6028 reg_op
= i
.op
[i
.operands
- 1].regs
;
6031 dw2_regnum
= ginsn_dw2_regnum (reg_op
);
6032 if (dw2_regnum
== REG_SP
|| dw2_regnum
== REG_FP
)
6033 err
= X86_GINSN_UNHANDLED_DEST_REG
;
6036 /* Something unexpected. Indicate to caller. */
6037 err
= X86_GINSN_UNHANDLED_UNEXPECTED
;
6043 /* Generate one or more generic GAS instructions, a.k.a, ginsns for the current
6044 machine instruction.
6046 Returns the head of linked list of ginsn(s) added, if success; Returns NULL
6049 The input ginsn_gen_mode GMODE determines the set of minimal necessary
6050 ginsns necessary for correctness of any passes applicable for that mode.
6051 For supporting the GINSN_GEN_SCFI generation mode, following is the list of
6052 machine instructions that must be translated into the corresponding ginsns
6053 to ensure correctness of SCFI:
6054 - All instructions affecting the two registers that could potentially
6055 be used as the base register for CFA tracking. For SCFI, the base
6056 register for CFA tracking is limited to REG_SP and REG_FP only for
6058 - All change of flow instructions: conditional and unconditional branches,
6059 call and return from functions.
6060 - All instructions that can potentially be a register save / restore
6062 - All instructions that perform stack manipulation implicitly: the CALL,
6063 RET, PUSH, POP, ENTER, and LEAVE instructions.
6065 The function currently supports GINSN_GEN_SCFI ginsn generation mode only.
6066 To support other generation modes will require work on this target-specific
6067 process of creation of ginsns:
6068 - Some of such places are tagged with TBD_GINSN_GEN_NOT_SCFI to serve as
6069 possible starting points.
6070 - Also note that ginsn representation may need enhancements. Specifically,
6071 note some TBD_GINSN_INFO_LOSS and TBD_GINSN_REPRESENTATION_LIMIT markers.
6075 x86_ginsn_new (const symbolS
*insn_end_sym
, enum ginsn_gen_mode gmode
)
6079 unsigned int dw2_regnum
;
6080 const reg_entry
*mem_reg
;
6081 ginsnS
*ginsn
= NULL
;
6082 ginsnS
*ginsn_next
= NULL
;
6083 /* In 64-bit mode, the default stack update size is 8 bytes. */
6084 int stack_opnd_size
= 8;
6086 /* Currently supports generation of selected ginsns, sufficient for
6087 the use-case of SCFI only. */
6088 if (gmode
!= GINSN_GEN_SCFI
)
6091 opcode
= i
.tm
.base_opcode
;
6093 /* Until it is clear how to handle APX NDD and other new opcodes, disallow
6095 if (is_apx_rex2_encoding ()
6096 || (i
.tm
.opcode_modifier
.evex
&& is_apx_evex_encoding ()))
6098 as_bad (_("SCFI: unsupported APX op %#x may cause incorrect CFI"),
6106 /* Add opcodes 0x0/0x2 and sub opcodes 0x28/0x2a (with opcode_space
6107 SPACE_BASE) are 8-bit ops. While they are relevant for SCFI
6108 correctness, skip handling them here and use the x86_ginsn_unhandled
6109 code path to generate GINSN_TYPE_OTHER when necessary. */
6111 case 0x1: /* add reg, reg/mem. */
6112 case 0x29: /* sub reg, reg/mem. */
6113 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6115 ginsn
= x86_ginsn_addsub_reg_mem (insn_end_sym
);
6118 case 0x3: /* add reg/mem, reg. */
6119 case 0x2b: /* sub reg/mem, reg. */
6120 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6122 ginsn
= x86_ginsn_addsub_mem_reg (insn_end_sym
);
6125 case 0xa0: /* push fs. */
6126 case 0xa8: /* push gs. */
6127 /* push fs / push gs have opcode_space == SPACE_0F. */
6128 if (i
.tm
.opcode_space
!= SPACE_0F
)
6130 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6131 /* Check if operation size is 16-bit. */
6132 if (ginsn_opsize_prefix_p ())
6133 stack_opnd_size
= 2;
6134 ginsn
= ginsn_new_sub (insn_end_sym
, false,
6135 GINSN_SRC_REG
, REG_SP
, 0,
6136 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6137 GINSN_DST_REG
, REG_SP
, 0);
6138 ginsn_set_where (ginsn
);
6139 ginsn_next
= ginsn_new_store (insn_end_sym
, false,
6140 GINSN_SRC_REG
, dw2_regnum
,
6141 GINSN_DST_INDIRECT
, REG_SP
, 0);
6142 ginsn_set_where (ginsn_next
);
6143 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6146 case 0xa1: /* pop fs. */
6147 case 0xa9: /* pop gs. */
6148 /* pop fs / pop gs have opcode_space == SPACE_0F. */
6149 if (i
.tm
.opcode_space
!= SPACE_0F
)
6151 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6152 /* Check if operation size is 16-bit. */
6153 if (ginsn_opsize_prefix_p ())
6154 stack_opnd_size
= 2;
6155 ginsn
= ginsn_new_load (insn_end_sym
, false,
6156 GINSN_SRC_INDIRECT
, REG_SP
, 0,
6157 GINSN_DST_REG
, dw2_regnum
);
6158 ginsn_set_where (ginsn
);
6159 ginsn_next
= ginsn_new_add (insn_end_sym
, false,
6160 GINSN_SRC_REG
, REG_SP
, 0,
6161 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6162 GINSN_DST_REG
, REG_SP
, 0);
6163 ginsn_set_where (ginsn_next
);
6164 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6168 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6171 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6172 /* Check if operation size is 16-bit. */
6173 if (ginsn_opsize_prefix_p ())
6174 stack_opnd_size
= 2;
6175 ginsn
= ginsn_new_sub (insn_end_sym
, false,
6176 GINSN_SRC_REG
, REG_SP
, 0,
6177 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6178 GINSN_DST_REG
, REG_SP
, 0);
6179 ginsn_set_where (ginsn
);
6180 ginsn_next
= ginsn_new_store (insn_end_sym
, false,
6181 GINSN_SRC_REG
, dw2_regnum
,
6182 GINSN_DST_INDIRECT
, REG_SP
, 0);
6183 ginsn_set_where (ginsn_next
);
6184 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6188 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6191 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6192 ginsn
= ginsn_new_load (insn_end_sym
, false,
6193 GINSN_SRC_INDIRECT
, REG_SP
, 0,
6194 GINSN_DST_REG
, dw2_regnum
);
6195 ginsn_set_where (ginsn
);
6196 /* Check if operation size is 16-bit. */
6197 if (ginsn_opsize_prefix_p ())
6198 stack_opnd_size
= 2;
6199 ginsn_next
= ginsn_new_add (insn_end_sym
, false,
6200 GINSN_SRC_REG
, REG_SP
, 0,
6201 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6202 GINSN_DST_REG
, REG_SP
, 0);
6203 ginsn_set_where (ginsn_next
);
6204 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6207 case 0x6a: /* push imm8. */
6208 case 0x68: /* push imm16/imm32. */
6209 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6211 /* Check if operation size is 16-bit. */
6212 if (ginsn_opsize_prefix_p ())
6213 stack_opnd_size
= 2;
6214 /* Skip getting the value of imm from machine instruction
6215 because this is not important for SCFI. */
6216 ginsn
= ginsn_new_sub (insn_end_sym
, false,
6217 GINSN_SRC_REG
, REG_SP
, 0,
6218 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6219 GINSN_DST_REG
, REG_SP
, 0);
6220 ginsn_set_where (ginsn
);
6221 ginsn_next
= ginsn_new_store (insn_end_sym
, false,
6223 GINSN_DST_INDIRECT
, REG_SP
, 0);
6224 ginsn_set_where (ginsn_next
);
6225 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6228 /* PS: Opcodes 0x80 ... 0x8f with opcode_space SPACE_0F are present
6229 only after relaxation. They do not need to be handled for ginsn
6232 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6234 ginsn
= x86_ginsn_jump (insn_end_sym
, true);
6240 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6242 ginsn
= x86_ginsn_alu_imm (insn_end_sym
);
6245 case 0x8a: /* mov r/m8, r8. */
6246 case 0x8b: /* mov r/m(16/32/64), r(16/32/64). */
6247 case 0x88: /* mov r8, r/m8. */
6248 case 0x89: /* mov r(16/32/64), r/m(16/32/64). */
6249 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6251 ginsn
= x86_ginsn_move (insn_end_sym
);
6255 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6257 /* lea disp(%base,%index,imm), %dst. */
6258 ginsn
= x86_ginsn_lea (insn_end_sym
);
6262 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6264 /* pop to reg/mem. */
6267 mem_reg
= (i
.base_reg
) ? i
.base_reg
: i
.index_reg
;
6268 /* Use dummy register if no base or index. Unlike other opcodes,
6269 ginsns must be generated as this affect stack pointer. */
6270 dw2_regnum
= (mem_reg
6271 ? ginsn_dw2_regnum (mem_reg
)
6272 : GINSN_DW2_REGNUM_RSI_DUMMY
);
6275 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6276 ginsn
= ginsn_new_load (insn_end_sym
, false,
6277 GINSN_SRC_INDIRECT
, REG_SP
, 0,
6278 GINSN_DST_INDIRECT
, dw2_regnum
);
6279 ginsn_set_where (ginsn
);
6280 /* Check if operation size is 16-bit. */
6281 if (ginsn_opsize_prefix_p ())
6282 stack_opnd_size
= 2;
6283 ginsn_next
= ginsn_new_add (insn_end_sym
, false,
6284 GINSN_SRC_REG
, REG_SP
, 0,
6285 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6286 GINSN_DST_REG
, REG_SP
, 0);
6287 ginsn_set_where (ginsn_next
);
6288 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6292 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6294 /* pushf / pushfq. */
6295 /* Check if operation size is 16-bit. */
6296 if (ginsn_opsize_prefix_p ())
6297 stack_opnd_size
= 2;
6298 ginsn
= ginsn_new_sub (insn_end_sym
, false,
6299 GINSN_SRC_REG
, REG_SP
, 0,
6300 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6301 GINSN_DST_REG
, REG_SP
, 0);
6302 ginsn_set_where (ginsn
);
6303 /* FIXME - hardcode the actual DWARF reg number value. As for SCFI
6304 correctness, although this behaves simply a placeholder value; its
6305 just clearer if the value is correct. */
6306 dw2_regnum
= GINSN_DW2_REGNUM_EFLAGS
;
6307 ginsn_next
= ginsn_new_store (insn_end_sym
, false,
6308 GINSN_SRC_REG
, dw2_regnum
,
6309 GINSN_DST_INDIRECT
, REG_SP
, 0);
6310 ginsn_set_where (ginsn_next
);
6311 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6315 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6318 /* Check if operation size is 16-bit. */
6319 if (ginsn_opsize_prefix_p ())
6320 stack_opnd_size
= 2;
6321 /* FIXME - hardcode the actual DWARF reg number value. As for SCFI
6322 correctness, although this behaves simply a placeholder value; its
6323 just clearer if the value is correct. */
6324 dw2_regnum
= GINSN_DW2_REGNUM_EFLAGS
;
6325 ginsn
= ginsn_new_load (insn_end_sym
, false,
6326 GINSN_SRC_INDIRECT
, REG_SP
, 0,
6327 GINSN_DST_REG
, dw2_regnum
);
6328 ginsn_set_where (ginsn
);
6329 ginsn_next
= ginsn_new_add (insn_end_sym
, false,
6330 GINSN_SRC_REG
, REG_SP
, 0,
6331 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6332 GINSN_DST_REG
, REG_SP
, 0);
6333 ginsn_set_where (ginsn_next
);
6334 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6338 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6340 /* push from reg/mem. */
6341 if (i
.tm
.extension_opcode
== 6)
6343 /* Check if operation size is 16-bit. */
6344 if (ginsn_opsize_prefix_p ())
6345 stack_opnd_size
= 2;
6346 ginsn
= ginsn_new_sub (insn_end_sym
, false,
6347 GINSN_SRC_REG
, REG_SP
, 0,
6348 GINSN_SRC_IMM
, 0, stack_opnd_size
,
6349 GINSN_DST_REG
, REG_SP
, 0);
6350 ginsn_set_where (ginsn
);
6353 mem_reg
= (i
.base_reg
) ? i
.base_reg
: i
.index_reg
;
6354 /* Use dummy register if no base or index. Unlike other opcodes,
6355 ginsns must be generated as this affect stack pointer. */
6356 dw2_regnum
= (mem_reg
6357 ? ginsn_dw2_regnum (mem_reg
)
6358 : GINSN_DW2_REGNUM_RSI_DUMMY
);
6361 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6362 ginsn_next
= ginsn_new_store (insn_end_sym
, false,
6363 GINSN_SRC_INDIRECT
, dw2_regnum
,
6364 GINSN_DST_INDIRECT
, REG_SP
, 0);
6365 ginsn_set_where (ginsn_next
);
6366 gas_assert (!ginsn_link_next (ginsn
, ginsn_next
));
6368 else if (i
.tm
.extension_opcode
== 4)
6370 /* jmp r/m. E.g., notrack jmp *%rax. */
6373 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6374 ginsn
= ginsn_new_jump (insn_end_sym
, true,
6375 GINSN_SRC_REG
, dw2_regnum
, NULL
);
6376 ginsn_set_where (ginsn
);
6378 else if (i
.mem_operands
&& i
.index_reg
)
6380 /* jmp *0x0(,%rax,8). */
6381 dw2_regnum
= ginsn_dw2_regnum (i
.index_reg
);
6382 ginsn
= ginsn_new_jump (insn_end_sym
, true,
6383 GINSN_SRC_REG
, dw2_regnum
, NULL
);
6384 ginsn_set_where (ginsn
);
6386 else if (i
.mem_operands
&& i
.base_reg
)
6388 dw2_regnum
= ginsn_dw2_regnum (i
.base_reg
);
6389 ginsn
= ginsn_new_jump (insn_end_sym
, true,
6390 GINSN_SRC_REG
, dw2_regnum
, NULL
);
6391 ginsn_set_where (ginsn
);
6394 else if (i
.tm
.extension_opcode
== 2)
6396 /* 0xFF /2 (call). */
6399 dw2_regnum
= ginsn_dw2_regnum (i
.op
[0].regs
);
6400 ginsn
= ginsn_new_call (insn_end_sym
, true,
6401 GINSN_SRC_REG
, dw2_regnum
, NULL
);
6402 ginsn_set_where (ginsn
);
6404 else if (i
.mem_operands
&& i
.base_reg
)
6406 dw2_regnum
= ginsn_dw2_regnum (i
.base_reg
);
6407 ginsn
= ginsn_new_call (insn_end_sym
, true,
6408 GINSN_SRC_REG
, dw2_regnum
, NULL
);
6409 ginsn_set_where (ginsn
);
6414 case 0xc2: /* ret imm16. */
6415 case 0xc3: /* ret. */
6416 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6419 ginsn
= ginsn_new_return (insn_end_sym
, true);
6420 ginsn_set_where (ginsn
);
6424 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6427 ginsn
= x86_ginsn_enter (insn_end_sym
);
6431 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6434 ginsn
= x86_ginsn_leave (insn_end_sym
);
6437 case 0xe0 ... 0xe2: /* loop / loope / loopne. */
6438 case 0xe3: /* jecxz / jrcxz. */
6439 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6441 ginsn
= x86_ginsn_jump (insn_end_sym
, true);
6442 ginsn_set_where (ginsn
);
6446 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6448 /* PS: SCFI machinery does not care about which func is being
6449 called. OK to skip that info. */
6450 ginsn
= ginsn_new_call (insn_end_sym
, true,
6451 GINSN_SRC_SYMBOL
, 0, NULL
);
6452 ginsn_set_where (ginsn
);
6455 /* PS: opcode 0xe9 appears only after relaxation. Skip here. */
6457 /* If opcode_space != SPACE_BASE, this is not a jmp insn. Skip it
6458 for GINSN_GEN_SCFI. */
6459 if (i
.tm
.opcode_space
!= SPACE_BASE
)
6461 /* Unconditional jmp. */
6462 ginsn
= x86_ginsn_jump (insn_end_sym
, false);
6463 ginsn_set_where (ginsn
);
6467 /* TBD_GINSN_GEN_NOT_SCFI: Skip all other opcodes uninteresting for
6468 GINSN_GEN_SCFI mode. */
6472 if (!ginsn
&& !x86_ginsn_safe_to_skip_p ())
6474 /* For all unhandled insns that are not whitelisted, check that they do
6475 not impact SCFI correctness. */
6476 err
= x86_ginsn_unhandled ();
6479 case X86_GINSN_UNHANDLED_NONE
:
6481 case X86_GINSN_UNHANDLED_DEST_REG
:
6482 /* Not all writes to REG_FP are harmful in context of SCFI. Simply
6483 generate a GINSN_TYPE_OTHER with destination set to the
6484 appropriate register. The SCFI machinery will bail out if this
6485 ginsn affects SCFI correctness. */
6486 dw2_regnum
= ginsn_dw2_regnum (i
.op
[i
.operands
- 1].regs
);
6487 ginsn
= ginsn_new_other (insn_end_sym
, true,
6490 GINSN_DST_REG
, dw2_regnum
);
6491 ginsn_set_where (ginsn
);
6493 case X86_GINSN_UNHANDLED_CFG
:
6494 case X86_GINSN_UNHANDLED_STACKOP
:
6495 as_bad (_("SCFI: unhandled op %#x may cause incorrect CFI"), opcode
);
6497 case X86_GINSN_UNHANDLED_UNEXPECTED
:
6498 as_bad (_("SCFI: unexpected op %#x may cause incorrect CFI"),
6512 /* This is the guts of the machine-dependent assembler. LINE points to a
6513 machine dependent instruction. This function is supposed to emit
6514 the frags/bytes it assembles to. */
6517 md_assemble (char *line
)
6520 char mnemonic
[MAX_MNEM_SIZE
], mnem_suffix
= 0, *copy
= NULL
;
6521 char *xstrdup_copy
= NULL
;
6522 const char *end
, *pass1_mnem
= NULL
;
6523 enum i386_error pass1_err
= 0;
6524 const insn_template
*t
;
6525 struct last_insn
*last_insn
6526 = &seg_info(now_seg
)->tc_segment_info_data
.last_insn
;
6528 /* Initialize globals. */
6529 current_templates
.end
= current_templates
.start
= NULL
;
6533 /* Suppress optimization when the last thing we saw may not have been
6534 a proper instruction (e.g. a stand-alone prefix or .byte). */
6535 if (last_insn
->kind
!= last_insn_other
)
6536 i
.no_optimize
= true;
6538 /* First parse an instruction mnemonic & call i386_operand for the operands.
6539 We assume that the scrubber has arranged it so that line[0] is the valid
6540 start of a (possibly prefixed) mnemonic. */
6542 end
= parse_insn (line
, mnemonic
, false);
6545 if (pass1_mnem
!= NULL
)
6547 if (i
.error
!= no_error
)
6549 gas_assert (current_templates
.start
!= NULL
);
6550 if (may_need_pass2 (current_templates
.start
) && !i
.suffix
)
6552 /* No point in trying a 2nd pass - it'll only find the same suffix
6554 mnem_suffix
= i
.suffix
;
6559 t
= current_templates
.start
;
6560 /* NB: LINE may be change to be the same as XSTRDUP_COPY. */
6561 if (xstrdup_copy
!= line
&& may_need_pass2 (t
))
6563 /* Make a copy of the full line in case we need to retry. */
6564 xstrdup_copy
= xstrdup (line
);
6565 copy
= xstrdup_copy
;
6568 mnem_suffix
= i
.suffix
;
6570 line
= parse_operands (line
, mnemonic
);
6574 free (xstrdup_copy
);
6578 /* Now we've parsed the mnemonic into a set of templates, and have the
6579 operands at hand. */
6581 /* All Intel opcodes have reversed operands except for "bound", "enter",
6582 "invlpg*", "monitor*", "mwait*", "tpause", "umwait", "pvalidate",
6583 "rmpadjust", "rmpupdate", and "rmpquery". We also don't reverse
6584 intersegment "jmp" and "call" instructions with 2 immediate operands so
6585 that the immediate segment precedes the offset consistently in Intel and
6589 && (t
->mnem_off
!= MN_bound
)
6590 && !startswith (mnemonic
, "invlpg")
6591 && !startswith (mnemonic
, "monitor")
6592 && !startswith (mnemonic
, "mwait")
6593 && (t
->mnem_off
!= MN_pvalidate
)
6594 && !startswith (mnemonic
, "rmp")
6595 && (t
->mnem_off
!= MN_tpause
)
6596 && (t
->mnem_off
!= MN_umwait
)
6597 && !(i
.operands
== 2
6598 && operand_type_check (i
.types
[0], imm
)
6599 && operand_type_check (i
.types
[1], imm
)))
6602 /* The order of the immediates should be reversed for 2-immediates EXTRQ
6603 and INSERTQ instructions. Also UWRMSR wants its immediate to be in the
6604 "canonical" place (first), despite it appearing last (in AT&T syntax, or
6605 because of the swapping above) in the incoming set of operands. */
6606 if ((i
.imm_operands
== 2
6607 && (t
->mnem_off
== MN_extrq
|| t
->mnem_off
== MN_insertq
))
6608 || (t
->mnem_off
== MN_uwrmsr
&& i
.imm_operands
6609 && i
.operands
> i
.imm_operands
))
6610 swap_2_operands (0, 1);
6614 /* For USER_MSR instructions, imm32 stands for the name of an model specific
6615 register (MSR). That's an unsigned quantity, whereas all other insns with
6616 32-bit immediate and 64-bit operand size use sign-extended
6617 immediates (imm32s). Therefore these insns are special-cased, bypassing
6618 the normal handling of immediates here. */
6619 if (is_cpu(current_templates
.start
, CpuUSER_MSR
))
6621 for (j
= 0; j
< i
.operands
; j
++)
6623 if (operand_type_check(i
.types
[j
], imm
))
6624 i
.types
[j
] = smallest_imm_type (i
.op
[j
].imms
->X_add_number
);
6631 if (i
.disp_operands
&& !optimize_disp (t
))
6634 /* Next, we find a template that matches the given insn,
6635 making sure the overlap of the given operands types is consistent
6636 with the template operand types. */
6638 if (!(t
= match_template (mnem_suffix
)))
6640 const char *err_msg
;
6642 if (copy
&& !mnem_suffix
)
6647 pass1_err
= i
.error
;
6648 pass1_mnem
= insn_name (current_templates
.start
);
6652 /* If a non-/only-64bit template (group) was found in pass 1, and if
6653 _some_ template (group) was found in pass 2, squash pass 1's
6655 if (pass1_err
== unsupported_64bit
)
6659 free (xstrdup_copy
);
6661 switch (pass1_mnem
? pass1_err
: i
.error
)
6665 case operand_size_mismatch
:
6666 err_msg
= _("operand size mismatch");
6668 case operand_type_mismatch
:
6669 err_msg
= _("operand type mismatch");
6671 case register_type_mismatch
:
6672 err_msg
= _("register type mismatch");
6674 case number_of_operands_mismatch
:
6675 err_msg
= _("number of operands mismatch");
6677 case invalid_instruction_suffix
:
6678 err_msg
= _("invalid instruction suffix");
6681 err_msg
= _("constant doesn't fit in 4 bits");
6683 case unsupported_with_intel_mnemonic
:
6684 err_msg
= _("unsupported with Intel mnemonic");
6686 case unsupported_syntax
:
6687 err_msg
= _("unsupported syntax");
6689 case unsupported_EGPR_for_addressing
:
6690 err_msg
= _("extended GPR cannot be used as base/index");
6692 case unsupported_nf
:
6693 err_msg
= _("{nf} unsupported");
6696 as_bad (_("unsupported instruction `%s'"),
6697 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
));
6699 case unsupported_on_arch
:
6700 as_bad (_("`%s' is not supported on `%s%s'"),
6701 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
),
6702 cpu_arch_name
? cpu_arch_name
: default_arch
,
6703 cpu_sub_arch_name
? cpu_sub_arch_name
: "");
6705 case unsupported_64bit
:
6706 if (ISLOWER (mnem_suffix
))
6708 if (flag_code
== CODE_64BIT
)
6709 as_bad (_("`%s%c' is not supported in 64-bit mode"),
6710 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
),
6713 as_bad (_("`%s%c' is only supported in 64-bit mode"),
6714 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
),
6719 if (flag_code
== CODE_64BIT
)
6720 as_bad (_("`%s' is not supported in 64-bit mode"),
6721 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
));
6723 as_bad (_("`%s' is only supported in 64-bit mode"),
6724 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
));
6727 case no_vex_encoding
:
6728 err_msg
= _("no VEX/XOP encoding");
6730 case no_evex_encoding
:
6731 err_msg
= _("no EVEX encoding");
6733 case invalid_sib_address
:
6734 err_msg
= _("invalid SIB address");
6736 case invalid_vsib_address
:
6737 err_msg
= _("invalid VSIB address");
6739 case invalid_vector_register_set
:
6740 err_msg
= _("mask, index, and destination registers must be distinct");
6742 case invalid_tmm_register_set
:
6743 err_msg
= _("all tmm registers must be distinct");
6745 case invalid_dest_and_src_register_set
:
6746 err_msg
= _("destination and source registers must be distinct");
6748 case invalid_dest_register_set
:
6749 err_msg
= _("two dest registers must be distinct");
6751 case invalid_pseudo_prefix
:
6752 err_msg
= _("rex2 pseudo prefix cannot be used");
6754 case unsupported_vector_index_register
:
6755 err_msg
= _("unsupported vector index register");
6757 case unsupported_broadcast
:
6758 err_msg
= _("unsupported broadcast");
6760 case broadcast_needed
:
6761 err_msg
= _("broadcast is needed for operand of such type");
6763 case unsupported_masking
:
6764 err_msg
= _("unsupported masking");
6766 case mask_not_on_destination
:
6767 err_msg
= _("mask not on destination operand");
6769 case no_default_mask
:
6770 err_msg
= _("default mask isn't allowed");
6772 case unsupported_rc_sae
:
6773 err_msg
= _("unsupported static rounding/sae");
6775 case unsupported_vector_size
:
6776 as_bad (_("vector size above %u required for `%s'"), 128u << vector_size
,
6777 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
));
6779 case unsupported_rsp_register
:
6780 err_msg
= _("'rsp' register cannot be used");
6782 case internal_error
:
6783 err_msg
= _("internal error");
6786 as_bad (_("%s for `%s'"), err_msg
,
6787 pass1_mnem
? pass1_mnem
: insn_name (current_templates
.start
));
6791 free (xstrdup_copy
);
6793 if (sse_check
!= check_none
6794 /* The opcode space check isn't strictly needed; it's there only to
6795 bypass the logic below when easily possible. */
6796 && t
->opcode_space
>= SPACE_0F
6797 && t
->opcode_space
<= SPACE_0F3A
6798 && !is_cpu (&i
.tm
, CpuSSE4a
)
6799 && !is_any_vex_encoding (t
))
6801 /* Some KL and all WideKL insns have only implicit %xmm operands. */
6802 bool simd
= is_cpu (t
, CpuKL
) || is_cpu (t
, CpuWideKL
);
6804 for (j
= 0; j
< t
->operands
; ++j
)
6806 if (t
->operand_types
[j
].bitfield
.class == RegMMX
)
6808 if (t
->operand_types
[j
].bitfield
.class == RegSIMD
)
6812 if (j
>= t
->operands
&& simd
)
6813 (sse_check
== check_warning
6815 : as_bad
) (_("SSE instruction `%s' is used"), insn_name (&i
.tm
));
6818 if (i
.tm
.opcode_modifier
.fwait
)
6819 if (!add_prefix (FWAIT_OPCODE
))
6822 /* Check if REP prefix is OK. */
6823 if (i
.rep_prefix
&& i
.tm
.opcode_modifier
.prefixok
!= PrefixRep
)
6825 as_bad (_("invalid instruction `%s' after `%s'"),
6826 insn_name (&i
.tm
), i
.rep_prefix
);
6830 /* Check for lock without a lockable instruction. Destination operand
6831 must be memory unless it is xchg (0x86). */
6832 if (i
.prefix
[LOCK_PREFIX
])
6834 if (i
.tm
.opcode_modifier
.prefixok
< PrefixLock
6835 || i
.mem_operands
== 0
6836 || (i
.tm
.base_opcode
!= 0x86
6837 && !(i
.flags
[i
.operands
- 1] & Operand_Mem
)))
6839 as_bad (_("expecting lockable instruction after `lock'"));
6843 /* Zap the redundant prefix from XCHG when optimizing. */
6844 if (i
.tm
.base_opcode
== 0x86 && optimize
&& !i
.no_optimize
)
6845 i
.prefix
[LOCK_PREFIX
] = 0;
6848 if (is_any_vex_encoding (&i
.tm
)
6849 || i
.tm
.operand_types
[i
.imm_operands
].bitfield
.class >= RegMMX
6850 || i
.tm
.operand_types
[i
.imm_operands
+ 1].bitfield
.class >= RegMMX
)
6852 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
6853 if (i
.prefix
[DATA_PREFIX
])
6855 as_bad (_("data size prefix invalid with `%s'"), insn_name (&i
.tm
));
6859 /* Don't allow e.g. KMOV in TLS code sequences. */
6860 for (j
= i
.imm_operands
; j
< i
.operands
; ++j
)
6863 case BFD_RELOC_X86_64_GOTTPOFF
:
6864 if (i
.tm
.mnem_off
== MN_add
6865 && i
.tm
.opcode_space
== SPACE_EVEXMAP4
6866 && i
.mem_operands
== 1
6868 && i
.base_reg
->reg_num
== RegIP
6869 && i
.tm
.operand_types
[0].bitfield
.class == Reg
6870 && i
.tm
.operand_types
[2].bitfield
.class == Reg
)
6871 /* Allow APX: add %reg1, foo@gottpoff(%rip), %reg2. */
6874 case BFD_RELOC_386_TLS_GOTIE
:
6875 case BFD_RELOC_386_TLS_LE_32
:
6876 case BFD_RELOC_X86_64_TLSLD
:
6877 as_bad (_("TLS relocation cannot be used with `%s'"), insn_name (&i
.tm
));
6884 /* Check if HLE prefix is OK. */
6885 if (i
.hle_prefix
&& !check_hle ())
6888 /* Check BND prefix. */
6889 if (i
.bnd_prefix
&& !i
.tm
.opcode_modifier
.bndprefixok
)
6890 as_bad (_("expecting valid branch instruction after `bnd'"));
6892 /* Check NOTRACK prefix. */
6893 if (i
.notrack_prefix
&& i
.tm
.opcode_modifier
.prefixok
!= PrefixNoTrack
)
6894 as_bad (_("expecting indirect branch instruction after `notrack'"));
6896 if (is_cpu (&i
.tm
, CpuMPX
))
6898 if (flag_code
== CODE_64BIT
&& i
.prefix
[ADDR_PREFIX
])
6899 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
6900 else if (flag_code
!= CODE_16BIT
6901 ? i
.prefix
[ADDR_PREFIX
]
6902 : i
.mem_operands
&& !i
.prefix
[ADDR_PREFIX
])
6903 as_bad (_("16-bit address isn't allowed in MPX instructions"));
6906 /* Insert BND prefix. */
6907 if (add_bnd_prefix
&& i
.tm
.opcode_modifier
.bndprefixok
)
6909 if (!i
.prefix
[BND_PREFIX
])
6910 add_prefix (BND_PREFIX_OPCODE
);
6911 else if (i
.prefix
[BND_PREFIX
] != BND_PREFIX_OPCODE
)
6913 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
6914 i
.prefix
[BND_PREFIX
] = BND_PREFIX_OPCODE
;
6918 /* Check string instruction segment overrides. */
6919 if (i
.tm
.opcode_modifier
.isstring
>= IS_STRING_ES_OP0
)
6921 gas_assert (i
.mem_operands
);
6922 if (!check_string ())
6924 i
.disp_operands
= 0;
6927 /* The memory operand of (%dx) should be only used with input/output
6928 instructions (base opcodes: 0x6c, 0x6e, 0xec, 0xee). */
6929 if (i
.input_output_operand
6930 && ((i
.tm
.base_opcode
| 0x82) != 0xee
6931 || i
.tm
.opcode_space
!= SPACE_BASE
))
6933 as_bad (_("input/output port address isn't allowed with `%s'"),
6938 if (optimize
&& !i
.no_optimize
&& i
.tm
.opcode_modifier
.optimize
)
6939 optimize_encoding ();
6941 /* Past optimization there's no need to distinguish encoding_evex,
6942 encoding_evex512, and encoding_egpr anymore. */
6943 if (i
.encoding
== encoding_evex512
)
6944 i
.encoding
= encoding_evex
;
6945 else if (i
.encoding
== encoding_egpr
)
6946 i
.encoding
= is_any_vex_encoding (&i
.tm
) ? encoding_evex
6949 if (use_unaligned_vector_move
)
6950 encode_with_unaligned_vector_move ();
6952 if (!process_suffix ())
6955 /* Check if IP-relative addressing requirements can be satisfied. */
6956 if (is_cpu (&i
.tm
, CpuPREFETCHI
)
6957 && !(i
.base_reg
&& i
.base_reg
->reg_num
== RegIP
))
6958 as_warn (_("'%s' only supports RIP-relative address"), insn_name (&i
.tm
));
6960 /* Update operand types and check extended states. */
6961 for (j
= 0; j
< i
.operands
; j
++)
6963 i
.types
[j
] = operand_type_and (i
.types
[j
], i
.tm
.operand_types
[j
]);
6964 switch (i
.tm
.operand_types
[j
].bitfield
.class)
6969 i
.xstate
|= xstate_mmx
;
6972 i
.xstate
|= xstate_mask
;
6975 if (i
.tm
.operand_types
[j
].bitfield
.tmmword
)
6976 i
.xstate
|= xstate_tmm
;
6977 else if (i
.tm
.operand_types
[j
].bitfield
.zmmword
6978 && !i
.tm
.opcode_modifier
.vex
6979 && vector_size
>= VSZ512
)
6980 i
.xstate
|= xstate_zmm
;
6981 else if (i
.tm
.operand_types
[j
].bitfield
.ymmword
6982 && vector_size
>= VSZ256
)
6983 i
.xstate
|= xstate_ymm
;
6984 else if (i
.tm
.operand_types
[j
].bitfield
.xmmword
)
6985 i
.xstate
|= xstate_xmm
;
6990 /* Make still unresolved immediate matches conform to size of immediate
6991 given in i.suffix. */
6992 if (!finalize_imm ())
6995 if (i
.types
[0].bitfield
.imm1
)
6996 i
.imm_operands
= 0; /* kludge for shift insns. */
6998 /* For insns with operands there are more diddles to do to the opcode. */
7001 if (!process_operands ())
7004 else if (!quiet_warnings
&& i
.tm
.opcode_modifier
.operandconstraint
== UGH
)
7006 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
7007 as_warn (_("translating to `%sp'"), insn_name (&i
.tm
));
7010 if (is_any_vex_encoding (&i
.tm
))
7012 if (!cpu_arch_flags
.bitfield
.cpui286
)
7014 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
7019 /* Check for explicit REX prefix. */
7020 if (i
.prefix
[REX_PREFIX
] || i
.rex_encoding
)
7022 as_bad (_("REX prefix invalid with `%s'"), insn_name (&i
.tm
));
7026 /* Check for explicit REX2 prefix. */
7027 if (i
.rex2_encoding
)
7029 as_bad (_("{rex2} prefix invalid with `%s'"), insn_name (&i
.tm
));
7033 if (is_apx_evex_encoding ())
7034 build_apx_evex_prefix ();
7035 else if (i
.tm
.opcode_modifier
.vex
)
7036 build_vex_prefix (t
);
7038 build_evex_prefix ();
7040 /* The individual REX.RXBW bits got consumed. */
7041 i
.rex
&= REX_OPCODE
;
7043 /* The rex2 bits got consumed. */
7047 /* Handle conversion of 'int $3' --> special int3 insn. */
7048 if (i
.tm
.mnem_off
== MN_int
7049 && i
.op
[0].imms
->X_add_number
== 3)
7051 i
.tm
.base_opcode
= INT3_OPCODE
;
7055 if ((i
.tm
.opcode_modifier
.jump
== JUMP
7056 || i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
7057 || i
.tm
.opcode_modifier
.jump
== JUMP_DWORD
)
7058 && i
.op
[0].disps
->X_op
== O_constant
)
7060 /* Convert "jmp constant" (and "call constant") to a jump (call) to
7061 the absolute address given by the constant. Since ix86 jumps and
7062 calls are pc relative, we need to generate a reloc. */
7063 i
.op
[0].disps
->X_add_symbol
= &abs_symbol
;
7064 i
.op
[0].disps
->X_op
= O_symbol
;
7069 insert_lfence_before (last_insn
);
7071 /* We are ready to output the insn. */
7072 output_insn (last_insn
);
7074 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7075 /* PS: SCFI is enabled only for System V AMD64 ABI. The ABI check has been
7076 performed in i386_target_format. */
7077 if (IS_ELF
&& flag_synth_cfi
)
7080 ginsn
= x86_ginsn_new (symbol_temp_new_now (), frch_ginsn_gen_mode ());
7081 frch_ginsn_data_append (ginsn
);
7085 insert_lfence_after ();
7087 if (i
.tm
.opcode_modifier
.isprefix
)
7089 last_insn
->kind
= last_insn_prefix
;
7090 last_insn
->name
= insn_name (&i
.tm
);
7091 last_insn
->file
= as_where (&last_insn
->line
);
7094 last_insn
->kind
= last_insn_other
;
7097 /* The Q suffix is generally valid only in 64-bit mode, with very few
7098 exceptions: fild, fistp, fisttp, and cmpxchg8b. Note that for fild
7099 and fisttp only one of their two templates is matched below: That's
7100 sufficient since other relevant attributes are the same between both
7101 respective templates. */
7102 static INLINE
bool q_suffix_allowed(const insn_template
*t
)
7104 return flag_code
== CODE_64BIT
7105 || (t
->opcode_space
== SPACE_BASE
7106 && t
->base_opcode
== 0xdf
7107 && (t
->extension_opcode
& 1)) /* fild / fistp / fisttp */
7108 || t
->mnem_off
== MN_cmpxchg8b
;
7112 parse_insn (const char *line
, char *mnemonic
, bool prefix_only
)
7114 const char *l
= line
, *token_start
= l
;
7116 bool pass1
= !current_templates
.start
;
7118 const insn_template
*t
;
7124 /* Pseudo-prefixes start with an opening figure brace. */
7125 if ((*mnem_p
= *l
) == '{')
7130 while ((*mnem_p
= mnemonic_chars
[(unsigned char) *l
]) != 0)
7135 if (mnem_p
>= mnemonic
+ MAX_MNEM_SIZE
)
7138 as_bad (_("no such instruction: `%s'"), token_start
);
7143 /* Pseudo-prefixes end with a closing figure brace. */
7144 if (*mnemonic
== '{' && *l
== '}')
7147 if (mnem_p
>= mnemonic
+ MAX_MNEM_SIZE
)
7151 /* Point l at the closing brace if there's no other separator. */
7152 if (*l
!= END_OF_INSN
&& !is_space_char (*l
)
7153 && *l
!= PREFIX_SEPARATOR
)
7156 else if (!is_space_char (*l
)
7157 && *l
!= END_OF_INSN
7159 || (*l
!= PREFIX_SEPARATOR
&& *l
!= ',')))
7163 as_bad (_("invalid character %s in mnemonic"),
7164 output_invalid (*l
));
7167 if (token_start
== l
)
7169 if (!intel_syntax
&& *l
== PREFIX_SEPARATOR
)
7170 as_bad (_("expecting prefix; got nothing"));
7172 as_bad (_("expecting mnemonic; got nothing"));
7176 /* Look up instruction (or prefix) via hash table. */
7177 op_lookup (mnemonic
);
7179 if (*l
!= END_OF_INSN
7180 && (!is_space_char (*l
) || l
[1] != END_OF_INSN
)
7181 && current_templates
.start
7182 && current_templates
.start
->opcode_modifier
.isprefix
)
7184 supported
= cpu_flags_match (current_templates
.start
);
7185 if (!(supported
& CPU_FLAGS_64BIT_MATCH
))
7187 as_bad ((flag_code
!= CODE_64BIT
7188 ? _("`%s' is only supported in 64-bit mode")
7189 : _("`%s' is not supported in 64-bit mode")),
7190 insn_name (current_templates
.start
));
7193 if (supported
!= CPU_FLAGS_PERFECT_MATCH
)
7195 as_bad (_("`%s' is not supported on `%s%s'"),
7196 insn_name (current_templates
.start
),
7197 cpu_arch_name
? cpu_arch_name
: default_arch
,
7198 cpu_sub_arch_name
? cpu_sub_arch_name
: "");
7201 /* If we are in 16-bit mode, do not allow addr16 or data16.
7202 Similarly, in 32-bit mode, do not allow addr32 or data32. */
7203 if ((current_templates
.start
->opcode_modifier
.size
== SIZE16
7204 || current_templates
.start
->opcode_modifier
.size
== SIZE32
)
7205 && flag_code
!= CODE_64BIT
7206 && ((current_templates
.start
->opcode_modifier
.size
== SIZE32
)
7207 ^ (flag_code
== CODE_16BIT
)))
7209 as_bad (_("redundant %s prefix"),
7210 insn_name (current_templates
.start
));
7214 if (current_templates
.start
->base_opcode
== PSEUDO_PREFIX
)
7216 /* Handle pseudo prefixes. */
7217 switch (current_templates
.start
->extension_opcode
)
7221 i
.disp_encoding
= disp_encoding_8bit
;
7225 i
.disp_encoding
= disp_encoding_16bit
;
7229 i
.disp_encoding
= disp_encoding_32bit
;
7233 i
.dir_encoding
= dir_encoding_load
;
7237 i
.dir_encoding
= dir_encoding_store
;
7241 i
.encoding
= encoding_vex
;
7245 i
.encoding
= encoding_vex3
;
7249 i
.encoding
= encoding_evex
;
7253 i
.rex_encoding
= true;
7257 i
.rex2_encoding
= true;
7262 if (i
.encoding
== encoding_default
)
7263 i
.encoding
= encoding_evex
;
7265 case Prefix_NoOptimize
:
7267 i
.no_optimize
= true;
7272 if (i
.has_nf
&& i
.encoding
!= encoding_evex
)
7274 as_bad (_("{nf} cannot be combined with {vex}/{vex3}"));
7280 /* Add prefix, checking for repeated prefixes. */
7281 switch (add_prefix (current_templates
.start
->base_opcode
))
7286 if (is_cpu (current_templates
.start
, CpuIBT
))
7287 i
.notrack_prefix
= insn_name (current_templates
.start
);
7290 if (is_cpu (current_templates
.start
, CpuHLE
))
7291 i
.hle_prefix
= insn_name (current_templates
.start
);
7292 else if (is_cpu (current_templates
.start
, CpuMPX
))
7293 i
.bnd_prefix
= insn_name (current_templates
.start
);
7295 i
.rep_prefix
= insn_name (current_templates
.start
);
7301 /* Skip past PREFIX_SEPARATOR and reset token_start. */
7311 if (!current_templates
.start
)
7313 /* Deprecated functionality (new code should use pseudo-prefixes instead):
7314 Check if we should swap operand or force 32bit displacement in
7316 if (mnem_p
- 2 == dot_p
&& dot_p
[1] == 's')
7318 if (i
.dir_encoding
== dir_encoding_default
)
7319 i
.dir_encoding
= dir_encoding_swap
;
7321 as_warn (_("ignoring `.s' suffix due to earlier `{%s}'"),
7322 i
.dir_encoding
== dir_encoding_load
? "load" : "store");
7324 else if (mnem_p
- 3 == dot_p
7328 if (i
.disp_encoding
== disp_encoding_default
)
7329 i
.disp_encoding
= disp_encoding_8bit
;
7330 else if (i
.disp_encoding
!= disp_encoding_8bit
)
7331 as_warn (_("ignoring `.d8' suffix due to earlier `{disp<N>}'"));
7333 else if (mnem_p
- 4 == dot_p
7338 if (i
.disp_encoding
== disp_encoding_default
)
7339 i
.disp_encoding
= disp_encoding_32bit
;
7340 else if (i
.disp_encoding
!= disp_encoding_32bit
)
7341 as_warn (_("ignoring `.d32' suffix due to earlier `{disp<N>}'"));
7347 op_lookup (mnemonic
);
7350 if (!current_templates
.start
|| !pass1
)
7352 current_templates
.start
= NULL
;
7355 if (mnem_p
> mnemonic
)
7357 /* See if we can get a match by trimming off a suffix. */
7360 case WORD_MNEM_SUFFIX
:
7361 if (intel_syntax
&& (intel_float_operand (mnemonic
) & 2))
7362 i
.suffix
= SHORT_MNEM_SUFFIX
;
7365 case BYTE_MNEM_SUFFIX
:
7366 case QWORD_MNEM_SUFFIX
:
7367 i
.suffix
= mnem_p
[-1];
7369 op_lookup (mnemonic
);
7371 case SHORT_MNEM_SUFFIX
:
7372 case LONG_MNEM_SUFFIX
:
7375 i
.suffix
= mnem_p
[-1];
7377 op_lookup (mnemonic
);
7385 if (intel_float_operand (mnemonic
) == 1)
7386 i
.suffix
= SHORT_MNEM_SUFFIX
;
7388 i
.suffix
= LONG_MNEM_SUFFIX
;
7390 op_lookup (mnemonic
);
7392 /* For compatibility reasons accept MOVSD and CMPSD without
7393 operands even in AT&T mode. */
7394 else if (*l
== END_OF_INSN
7395 || (is_space_char (*l
) && l
[1] == END_OF_INSN
))
7398 op_lookup (mnemonic
);
7399 if (current_templates
.start
!= NULL
7401 && (current_templates
.start
->base_opcode
| 2) == 0xa6
7402 && current_templates
.start
->opcode_space
7404 && mnem_p
[-2] == 's')
7406 as_warn (_("found `%sd'; assuming `%sl' was meant"),
7407 mnemonic
, mnemonic
);
7408 i
.suffix
= LONG_MNEM_SUFFIX
;
7412 current_templates
.start
= NULL
;
7420 if (!current_templates
.start
)
7423 as_bad (_("no such instruction: `%s'"), token_start
);
7428 if (current_templates
.start
->opcode_modifier
.jump
== JUMP
7429 || current_templates
.start
->opcode_modifier
.jump
== JUMP_BYTE
)
7431 /* Check for a branch hint. We allow ",pt" and ",pn" for
7432 predict taken and predict not taken respectively.
7433 I'm not sure that branch hints actually do anything on loop
7434 and jcxz insns (JumpByte) for current Pentium4 chips. They
7435 may work in the future and it doesn't hurt to accept them
7437 if (l
[0] == ',' && l
[1] == 'p')
7441 if (!add_prefix (DS_PREFIX_OPCODE
))
7445 else if (l
[2] == 'n')
7447 if (!add_prefix (CS_PREFIX_OPCODE
))
7453 /* Any other comma loses. */
7456 as_bad (_("invalid character %s in mnemonic"),
7457 output_invalid (*l
));
7461 /* Check if instruction is supported on specified architecture. */
7463 for (t
= current_templates
.start
; t
< current_templates
.end
; ++t
)
7465 supported
|= cpu_flags_match (t
);
7467 if (i
.suffix
== QWORD_MNEM_SUFFIX
&& !q_suffix_allowed (t
))
7468 supported
&= ~CPU_FLAGS_64BIT_MATCH
;
7470 if (supported
== CPU_FLAGS_PERFECT_MATCH
)
7476 if (supported
& CPU_FLAGS_64BIT_MATCH
)
7477 i
.error
= unsupported_on_arch
;
7479 i
.error
= unsupported_64bit
;
7486 parse_operands (char *l
, const char *mnemonic
)
7490 /* 1 if operand is pending after ','. */
7491 unsigned int expecting_operand
= 0;
7493 while (*l
!= END_OF_INSN
)
7495 /* Non-zero if operand parens not balanced. */
7496 unsigned int paren_not_balanced
= 0;
7497 /* True if inside double quotes. */
7498 bool in_quotes
= false;
7500 /* Skip optional white space before operand. */
7501 if (is_space_char (*l
))
7503 if (!is_operand_char (*l
) && *l
!= END_OF_INSN
&& *l
!= '"')
7505 as_bad (_("invalid character %s before operand %d"),
7506 output_invalid (*l
),
7510 token_start
= l
; /* After white space. */
7511 while (in_quotes
|| paren_not_balanced
|| *l
!= ',')
7513 if (*l
== END_OF_INSN
)
7517 as_bad (_("unbalanced double quotes in operand %d."),
7521 if (paren_not_balanced
)
7523 know (!intel_syntax
);
7524 as_bad (_("unbalanced parenthesis in operand %d."),
7529 break; /* we are done */
7531 else if (*l
== '\\' && l
[1] == '"')
7534 in_quotes
= !in_quotes
;
7535 else if (!in_quotes
&& !is_operand_char (*l
) && !is_space_char (*l
))
7537 as_bad (_("invalid character %s in operand %d"),
7538 output_invalid (*l
),
7542 if (!intel_syntax
&& !in_quotes
)
7545 ++paren_not_balanced
;
7547 --paren_not_balanced
;
7551 if (l
!= token_start
)
7552 { /* Yes, we've read in another operand. */
7553 unsigned int operand_ok
;
7554 this_operand
= i
.operands
++;
7555 if (i
.operands
> MAX_OPERANDS
)
7557 as_bad (_("spurious operands; (%d operands/instruction max)"),
7561 i
.types
[this_operand
].bitfield
.unspecified
= 1;
7562 /* Now parse operand adding info to 'i' as we go along. */
7563 END_STRING_AND_SAVE (l
);
7565 if (i
.mem_operands
> 1)
7567 as_bad (_("too many memory references for `%s'"),
7574 i386_intel_operand (token_start
,
7575 intel_float_operand (mnemonic
));
7577 operand_ok
= i386_att_operand (token_start
);
7579 RESTORE_END_STRING (l
);
7585 if (expecting_operand
)
7587 expecting_operand_after_comma
:
7588 as_bad (_("expecting operand after ','; got nothing"));
7593 as_bad (_("expecting operand before ','; got nothing"));
7598 /* Now *l must be either ',' or END_OF_INSN. */
7601 if (*++l
== END_OF_INSN
)
7603 /* Just skip it, if it's \n complain. */
7604 goto expecting_operand_after_comma
;
7606 expecting_operand
= 1;
7613 swap_2_operands (unsigned int xchg1
, unsigned int xchg2
)
7615 union i386_op temp_op
;
7616 i386_operand_type temp_type
;
7617 unsigned int temp_flags
;
7618 enum bfd_reloc_code_real temp_reloc
;
7620 temp_type
= i
.types
[xchg2
];
7621 i
.types
[xchg2
] = i
.types
[xchg1
];
7622 i
.types
[xchg1
] = temp_type
;
7624 temp_flags
= i
.flags
[xchg2
];
7625 i
.flags
[xchg2
] = i
.flags
[xchg1
];
7626 i
.flags
[xchg1
] = temp_flags
;
7628 temp_op
= i
.op
[xchg2
];
7629 i
.op
[xchg2
] = i
.op
[xchg1
];
7630 i
.op
[xchg1
] = temp_op
;
7632 temp_reloc
= i
.reloc
[xchg2
];
7633 i
.reloc
[xchg2
] = i
.reloc
[xchg1
];
7634 i
.reloc
[xchg1
] = temp_reloc
;
7636 temp_flags
= i
.imm_bits
[xchg2
];
7637 i
.imm_bits
[xchg2
] = i
.imm_bits
[xchg1
];
7638 i
.imm_bits
[xchg1
] = temp_flags
;
7642 if (i
.mask
.operand
== xchg1
)
7643 i
.mask
.operand
= xchg2
;
7644 else if (i
.mask
.operand
== xchg2
)
7645 i
.mask
.operand
= xchg1
;
7647 if (i
.broadcast
.type
|| i
.broadcast
.bytes
)
7649 if (i
.broadcast
.operand
== xchg1
)
7650 i
.broadcast
.operand
= xchg2
;
7651 else if (i
.broadcast
.operand
== xchg2
)
7652 i
.broadcast
.operand
= xchg1
;
7657 swap_operands (void)
7663 swap_2_operands (1, i
.operands
- 2);
7667 swap_2_operands (0, i
.operands
- 1);
7673 if (i
.mem_operands
== 2)
7675 const reg_entry
*temp_seg
;
7676 temp_seg
= i
.seg
[0];
7677 i
.seg
[0] = i
.seg
[1];
7678 i
.seg
[1] = temp_seg
;
7682 /* Try to ensure constant immediates are represented in the smallest
7687 char guess_suffix
= 0;
7691 guess_suffix
= i
.suffix
;
7692 else if (i
.reg_operands
)
7694 /* Figure out a suffix from the last register operand specified.
7695 We can't do this properly yet, i.e. excluding special register
7696 instances, but the following works for instructions with
7697 immediates. In any case, we can't set i.suffix yet. */
7698 for (op
= i
.operands
; --op
>= 0;)
7699 if (i
.types
[op
].bitfield
.class != Reg
)
7701 else if (i
.types
[op
].bitfield
.byte
)
7703 guess_suffix
= BYTE_MNEM_SUFFIX
;
7706 else if (i
.types
[op
].bitfield
.word
)
7708 guess_suffix
= WORD_MNEM_SUFFIX
;
7711 else if (i
.types
[op
].bitfield
.dword
)
7713 guess_suffix
= LONG_MNEM_SUFFIX
;
7716 else if (i
.types
[op
].bitfield
.qword
)
7718 guess_suffix
= QWORD_MNEM_SUFFIX
;
7722 else if ((flag_code
== CODE_16BIT
)
7723 ^ (i
.prefix
[DATA_PREFIX
] != 0 && !(i
.prefix
[REX_PREFIX
] & REX_W
)))
7724 guess_suffix
= WORD_MNEM_SUFFIX
;
7725 else if (flag_code
!= CODE_64BIT
7726 || (!(i
.prefix
[REX_PREFIX
] & REX_W
)
7727 /* A more generic (but also more involved) way of dealing
7728 with the special case(s) would be to go look for
7729 DefaultSize attributes on any of the templates. */
7730 && current_templates
.start
->mnem_off
!= MN_push
))
7731 guess_suffix
= LONG_MNEM_SUFFIX
;
7733 for (op
= i
.operands
; --op
>= 0;)
7734 if (operand_type_check (i
.types
[op
], imm
))
7736 switch (i
.op
[op
].imms
->X_op
)
7739 /* If a suffix is given, this operand may be shortened. */
7740 switch (guess_suffix
)
7742 case LONG_MNEM_SUFFIX
:
7743 i
.types
[op
].bitfield
.imm32
= 1;
7744 i
.types
[op
].bitfield
.imm64
= 1;
7746 case WORD_MNEM_SUFFIX
:
7747 i
.types
[op
].bitfield
.imm16
= 1;
7748 i
.types
[op
].bitfield
.imm32
= 1;
7749 i
.types
[op
].bitfield
.imm32s
= 1;
7750 i
.types
[op
].bitfield
.imm64
= 1;
7752 case BYTE_MNEM_SUFFIX
:
7753 i
.types
[op
].bitfield
.imm8
= 1;
7754 i
.types
[op
].bitfield
.imm8s
= 1;
7755 i
.types
[op
].bitfield
.imm16
= 1;
7756 i
.types
[op
].bitfield
.imm32
= 1;
7757 i
.types
[op
].bitfield
.imm32s
= 1;
7758 i
.types
[op
].bitfield
.imm64
= 1;
7762 /* If this operand is at most 16 bits, convert it
7763 to a signed 16 bit number before trying to see
7764 whether it will fit in an even smaller size.
7765 This allows a 16-bit operand such as $0xffe0 to
7766 be recognised as within Imm8S range. */
7767 if ((i
.types
[op
].bitfield
.imm16
)
7768 && fits_in_unsigned_word (i
.op
[op
].imms
->X_add_number
))
7770 i
.op
[op
].imms
->X_add_number
= ((i
.op
[op
].imms
->X_add_number
7771 ^ 0x8000) - 0x8000);
7774 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
7775 if ((i
.types
[op
].bitfield
.imm32
)
7776 && fits_in_unsigned_long (i
.op
[op
].imms
->X_add_number
))
7778 i
.op
[op
].imms
->X_add_number
= ((i
.op
[op
].imms
->X_add_number
7779 ^ ((offsetT
) 1 << 31))
7780 - ((offsetT
) 1 << 31));
7784 = operand_type_or (i
.types
[op
],
7785 smallest_imm_type (i
.op
[op
].imms
->X_add_number
));
7787 /* We must avoid matching of Imm32 templates when 64bit
7788 only immediate is available. */
7789 if (guess_suffix
== QWORD_MNEM_SUFFIX
)
7790 i
.types
[op
].bitfield
.imm32
= 0;
7797 /* Symbols and expressions. */
7799 /* Convert symbolic operand to proper sizes for matching, but don't
7800 prevent matching a set of insns that only supports sizes other
7801 than those matching the insn suffix. */
7803 i386_operand_type mask
, allowed
;
7804 const insn_template
*t
= current_templates
.start
;
7806 operand_type_set (&mask
, 0);
7807 switch (guess_suffix
)
7809 case QWORD_MNEM_SUFFIX
:
7810 mask
.bitfield
.imm64
= 1;
7811 mask
.bitfield
.imm32s
= 1;
7813 case LONG_MNEM_SUFFIX
:
7814 mask
.bitfield
.imm32
= 1;
7816 case WORD_MNEM_SUFFIX
:
7817 mask
.bitfield
.imm16
= 1;
7819 case BYTE_MNEM_SUFFIX
:
7820 mask
.bitfield
.imm8
= 1;
7826 allowed
= operand_type_and (t
->operand_types
[op
], mask
);
7827 while (++t
< current_templates
.end
)
7829 allowed
= operand_type_or (allowed
, t
->operand_types
[op
]);
7830 allowed
= operand_type_and (allowed
, mask
);
7833 if (!operand_type_all_zero (&allowed
))
7834 i
.types
[op
] = operand_type_and (i
.types
[op
], mask
);
7841 /* Try to use the smallest displacement type too. */
7843 optimize_disp (const insn_template
*t
)
7847 if (!want_disp32 (t
)
7848 && (!t
->opcode_modifier
.jump
7849 || i
.jumpabsolute
|| i
.types
[0].bitfield
.baseindex
))
7851 for (op
= 0; op
< i
.operands
; ++op
)
7853 const expressionS
*exp
= i
.op
[op
].disps
;
7855 if (!operand_type_check (i
.types
[op
], disp
))
7858 if (exp
->X_op
!= O_constant
)
7861 /* Since displacement is signed extended to 64bit, don't allow
7862 disp32 if it is out of range. */
7863 if (fits_in_signed_long (exp
->X_add_number
))
7866 i
.types
[op
].bitfield
.disp32
= 0;
7867 if (i
.types
[op
].bitfield
.baseindex
)
7869 as_bad (_("0x%" PRIx64
" out of range of signed 32bit displacement"),
7870 (uint64_t) exp
->X_add_number
);
7876 /* Don't optimize displacement for movabs since it only takes 64bit
7878 if (i
.disp_encoding
> disp_encoding_8bit
7879 || (flag_code
== CODE_64BIT
&& t
->mnem_off
== MN_movabs
))
7882 for (op
= i
.operands
; op
-- > 0;)
7883 if (operand_type_check (i
.types
[op
], disp
))
7885 if (i
.op
[op
].disps
->X_op
== O_constant
)
7887 offsetT op_disp
= i
.op
[op
].disps
->X_add_number
;
7889 if (!op_disp
&& i
.types
[op
].bitfield
.baseindex
)
7891 i
.types
[op
] = operand_type_and_not (i
.types
[op
], anydisp
);
7892 i
.op
[op
].disps
= NULL
;
7897 if (i
.types
[op
].bitfield
.disp16
7898 && fits_in_unsigned_word (op_disp
))
7900 /* If this operand is at most 16 bits, convert
7901 to a signed 16 bit number and don't use 64bit
7903 op_disp
= ((op_disp
^ 0x8000) - 0x8000);
7904 i
.types
[op
].bitfield
.disp64
= 0;
7908 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
7909 if ((flag_code
!= CODE_64BIT
7910 ? i
.types
[op
].bitfield
.disp32
7912 && (!t
->opcode_modifier
.jump
7913 || i
.jumpabsolute
|| i
.types
[op
].bitfield
.baseindex
))
7914 && fits_in_unsigned_long (op_disp
))
7916 /* If this operand is at most 32 bits, convert
7917 to a signed 32 bit number and don't use 64bit
7919 op_disp
= (op_disp
^ ((offsetT
) 1 << 31)) - ((addressT
) 1 << 31);
7920 i
.types
[op
].bitfield
.disp64
= 0;
7921 i
.types
[op
].bitfield
.disp32
= 1;
7924 if (flag_code
== CODE_64BIT
&& fits_in_signed_long (op_disp
))
7926 i
.types
[op
].bitfield
.disp64
= 0;
7927 i
.types
[op
].bitfield
.disp32
= 1;
7930 if ((i
.types
[op
].bitfield
.disp32
7931 || i
.types
[op
].bitfield
.disp16
)
7932 && fits_in_disp8 (op_disp
))
7933 i
.types
[op
].bitfield
.disp8
= 1;
7935 i
.op
[op
].disps
->X_add_number
= op_disp
;
7937 else if (i
.reloc
[op
] == BFD_RELOC_386_TLS_DESC_CALL
7938 || i
.reloc
[op
] == BFD_RELOC_X86_64_TLSDESC_CALL
)
7940 fix_new_exp (frag_now
, frag_more (0) - frag_now
->fr_literal
, 0,
7941 i
.op
[op
].disps
, 0, i
.reloc
[op
]);
7942 i
.types
[op
] = operand_type_and_not (i
.types
[op
], anydisp
);
7945 /* We only support 64bit displacement on constants. */
7946 i
.types
[op
].bitfield
.disp64
= 0;
7952 /* Return 1 if there is a match in broadcast bytes between operand
7953 GIVEN and instruction template T. */
7956 match_broadcast_size (const insn_template
*t
, unsigned int given
)
7958 return ((t
->opcode_modifier
.broadcast
== BYTE_BROADCAST
7959 && i
.types
[given
].bitfield
.byte
)
7960 || (t
->opcode_modifier
.broadcast
== WORD_BROADCAST
7961 && i
.types
[given
].bitfield
.word
)
7962 || (t
->opcode_modifier
.broadcast
== DWORD_BROADCAST
7963 && i
.types
[given
].bitfield
.dword
)
7964 || (t
->opcode_modifier
.broadcast
== QWORD_BROADCAST
7965 && i
.types
[given
].bitfield
.qword
));
7968 /* Check if operands are valid for the instruction. */
7971 check_VecOperands (const insn_template
*t
)
7976 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
7977 any one operand are implicity requiring AVX512VL support if the actual
7978 operand size is YMMword or XMMword. Since this function runs after
7979 template matching, there's no need to check for YMMword/XMMword in
7981 cpu
= cpu_flags_and (cpu_flags_from_attr (t
->cpu
), avx512
);
7982 if (!cpu_flags_all_zero (&cpu
)
7983 && !is_cpu (t
, CpuAVX512VL
)
7984 && !cpu_arch_flags
.bitfield
.cpuavx512vl
7985 && (!t
->opcode_modifier
.vex
|| need_evex_encoding (t
)))
7987 for (op
= 0; op
< t
->operands
; ++op
)
7989 if (t
->operand_types
[op
].bitfield
.zmmword
7990 && (i
.types
[op
].bitfield
.ymmword
7991 || i
.types
[op
].bitfield
.xmmword
))
7993 i
.error
= operand_size_mismatch
;
7999 /* Somewhat similarly, templates specifying both AVX and AVX2 are
8000 requiring AVX2 support if the actual operand size is YMMword. */
8001 if (maybe_cpu (t
, CpuAVX
) && maybe_cpu (t
, CpuAVX2
)
8002 && !cpu_arch_flags
.bitfield
.cpuavx2
)
8004 for (op
= 0; op
< t
->operands
; ++op
)
8006 if (t
->operand_types
[op
].bitfield
.xmmword
8007 && i
.types
[op
].bitfield
.ymmword
)
8009 i
.error
= operand_size_mismatch
;
8015 /* Without VSIB byte, we can't have a vector register for index. */
8016 if (!t
->opcode_modifier
.sib
8018 && (i
.index_reg
->reg_type
.bitfield
.xmmword
8019 || i
.index_reg
->reg_type
.bitfield
.ymmword
8020 || i
.index_reg
->reg_type
.bitfield
.zmmword
))
8022 i
.error
= unsupported_vector_index_register
;
8026 /* Check if default mask is allowed. */
8027 if (t
->opcode_modifier
.operandconstraint
== NO_DEFAULT_MASK
8028 && (!i
.mask
.reg
|| i
.mask
.reg
->reg_num
== 0))
8030 i
.error
= no_default_mask
;
8034 /* For VSIB byte, we need a vector register for index, and all vector
8035 registers must be distinct. */
8036 if (t
->opcode_modifier
.sib
&& t
->opcode_modifier
.sib
!= SIBMEM
)
8039 || !((t
->opcode_modifier
.sib
== VECSIB128
8040 && i
.index_reg
->reg_type
.bitfield
.xmmword
)
8041 || (t
->opcode_modifier
.sib
== VECSIB256
8042 && i
.index_reg
->reg_type
.bitfield
.ymmword
)
8043 || (t
->opcode_modifier
.sib
== VECSIB512
8044 && i
.index_reg
->reg_type
.bitfield
.zmmword
)))
8046 i
.error
= invalid_vsib_address
;
8050 gas_assert (i
.reg_operands
== 2 || i
.mask
.reg
);
8051 if (i
.reg_operands
== 2 && !i
.mask
.reg
)
8053 gas_assert (i
.types
[0].bitfield
.class == RegSIMD
);
8054 gas_assert (i
.types
[0].bitfield
.xmmword
8055 || i
.types
[0].bitfield
.ymmword
);
8056 gas_assert (i
.types
[2].bitfield
.class == RegSIMD
);
8057 gas_assert (i
.types
[2].bitfield
.xmmword
8058 || i
.types
[2].bitfield
.ymmword
);
8059 if (operand_check
== check_none
)
8061 if (register_number (i
.op
[0].regs
)
8062 != register_number (i
.index_reg
)
8063 && register_number (i
.op
[2].regs
)
8064 != register_number (i
.index_reg
)
8065 && register_number (i
.op
[0].regs
)
8066 != register_number (i
.op
[2].regs
))
8068 if (operand_check
== check_error
)
8070 i
.error
= invalid_vector_register_set
;
8073 as_warn (_("mask, index, and destination registers should be distinct"));
8075 else if (i
.reg_operands
== 1 && i
.mask
.reg
)
8077 if (i
.types
[1].bitfield
.class == RegSIMD
8078 && (i
.types
[1].bitfield
.xmmword
8079 || i
.types
[1].bitfield
.ymmword
8080 || i
.types
[1].bitfield
.zmmword
)
8081 && (register_number (i
.op
[1].regs
)
8082 == register_number (i
.index_reg
)))
8084 if (operand_check
== check_error
)
8086 i
.error
= invalid_vector_register_set
;
8089 if (operand_check
!= check_none
)
8090 as_warn (_("index and destination registers should be distinct"));
8095 /* For AMX instructions with 3 TMM register operands, all operands
8096 must be distinct. */
8097 if (i
.reg_operands
== 3
8098 && t
->operand_types
[0].bitfield
.tmmword
8099 && (i
.op
[0].regs
== i
.op
[1].regs
8100 || i
.op
[0].regs
== i
.op
[2].regs
8101 || i
.op
[1].regs
== i
.op
[2].regs
))
8103 i
.error
= invalid_tmm_register_set
;
8107 /* For some special instructions require that destination must be distinct
8108 from source registers. */
8109 if (t
->opcode_modifier
.operandconstraint
== DISTINCT_DEST
)
8111 unsigned int dest_reg
= i
.operands
- 1;
8113 know (i
.operands
>= 3);
8115 /* #UD if dest_reg == src1_reg or dest_reg == src2_reg. */
8116 if (i
.op
[dest_reg
- 1].regs
== i
.op
[dest_reg
].regs
8117 || (i
.reg_operands
> 2
8118 && i
.op
[dest_reg
- 2].regs
== i
.op
[dest_reg
].regs
))
8120 i
.error
= invalid_dest_and_src_register_set
;
8125 /* Check if broadcast is supported by the instruction and is applied
8126 to the memory operand. */
8127 if (i
.broadcast
.type
|| i
.broadcast
.bytes
)
8129 i386_operand_type type
, overlap
;
8131 /* Check if specified broadcast is supported in this instruction,
8132 and its broadcast bytes match the memory operand. */
8133 op
= i
.broadcast
.operand
;
8134 if (!t
->opcode_modifier
.broadcast
8135 || !(i
.flags
[op
] & Operand_Mem
)
8136 || (!i
.types
[op
].bitfield
.unspecified
8137 && !match_broadcast_size (t
, op
)))
8140 i
.error
= unsupported_broadcast
;
8144 operand_type_set (&type
, 0);
8145 switch (get_broadcast_bytes (t
, false))
8148 type
.bitfield
.word
= 1;
8151 type
.bitfield
.dword
= 1;
8154 type
.bitfield
.qword
= 1;
8157 type
.bitfield
.xmmword
= 1;
8160 if (vector_size
< VSZ256
)
8162 type
.bitfield
.ymmword
= 1;
8165 if (vector_size
< VSZ512
)
8167 type
.bitfield
.zmmword
= 1;
8173 overlap
= operand_type_and (type
, t
->operand_types
[op
]);
8174 if (t
->operand_types
[op
].bitfield
.class == RegSIMD
8175 && t
->operand_types
[op
].bitfield
.byte
8176 + t
->operand_types
[op
].bitfield
.word
8177 + t
->operand_types
[op
].bitfield
.dword
8178 + t
->operand_types
[op
].bitfield
.qword
> 1)
8180 overlap
.bitfield
.xmmword
= 0;
8181 overlap
.bitfield
.ymmword
= 0;
8182 overlap
.bitfield
.zmmword
= 0;
8184 if (operand_type_all_zero (&overlap
))
8187 if (t
->opcode_modifier
.checkoperandsize
)
8191 type
.bitfield
.baseindex
= 1;
8192 for (j
= 0; j
< i
.operands
; ++j
)
8195 && !operand_type_register_match(i
.types
[j
],
8196 t
->operand_types
[j
],
8198 t
->operand_types
[op
]))
8203 /* If broadcast is supported in this instruction, we need to check if
8204 operand of one-element size isn't specified without broadcast. */
8205 else if (t
->opcode_modifier
.broadcast
&& i
.mem_operands
)
8207 /* Find memory operand. */
8208 for (op
= 0; op
< i
.operands
; op
++)
8209 if (i
.flags
[op
] & Operand_Mem
)
8211 gas_assert (op
< i
.operands
);
8212 /* Check size of the memory operand. */
8213 if (match_broadcast_size (t
, op
))
8215 i
.error
= broadcast_needed
;
8220 op
= MAX_OPERANDS
- 1; /* Avoid uninitialized variable warning. */
8222 /* Check if requested masking is supported. */
8225 if (!t
->opcode_modifier
.masking
)
8227 i
.error
= unsupported_masking
;
8231 /* Common rules for masking:
8232 - mask register destinations permit only zeroing-masking, without
8233 that actually being expressed by a {z} operand suffix or EVEX.z,
8234 - memory destinations allow only merging-masking,
8235 - scatter/gather insns (i.e. ones using vSIB) only allow merging-
8238 && (t
->operand_types
[t
->operands
- 1].bitfield
.class == RegMask
8239 || (i
.flags
[t
->operands
- 1] & Operand_Mem
)
8240 || t
->opcode_modifier
.sib
))
8242 i
.error
= unsupported_masking
;
8247 /* Check if masking is applied to dest operand. */
8248 if (i
.mask
.reg
&& (i
.mask
.operand
!= i
.operands
- 1))
8250 i
.error
= mask_not_on_destination
;
8255 if (i
.rounding
.type
!= rc_none
)
8257 if (!t
->opcode_modifier
.sae
8258 || ((i
.rounding
.type
!= saeonly
) != t
->opcode_modifier
.staticrounding
)
8261 i
.error
= unsupported_rc_sae
;
8265 /* Non-EVEX.LIG forms need to have a ZMM register as at least one
8267 if (t
->opcode_modifier
.evex
!= EVEXLIG
)
8269 for (op
= 0; op
< t
->operands
; ++op
)
8270 if (i
.types
[op
].bitfield
.zmmword
)
8272 if (op
>= t
->operands
)
8274 i
.error
= operand_size_mismatch
;
8280 /* Check the special Imm4 cases; must be the first operand. */
8281 if ((is_cpu (t
, CpuXOP
) && t
->operands
== 5)
8282 || (t
->opcode_space
== SPACE_0F3A
8283 && (t
->base_opcode
| 3) == 0x0b
8284 && (is_cpu (t
, CpuAPX_F
)
8285 || (t
->opcode_modifier
.sse2avx
&& t
->opcode_modifier
.evex
8286 && (!t
->opcode_modifier
.vex
8287 || (i
.encoding
!= encoding_default
8288 && i
.encoding
!= encoding_vex
8289 && i
.encoding
!= encoding_vex3
))))))
8291 if (i
.op
[0].imms
->X_op
!= O_constant
8292 || !fits_in_imm4 (i
.op
[0].imms
->X_add_number
))
8298 /* Turn off Imm<N> so that update_imm won't complain. */
8299 if (t
->operands
== 5)
8300 operand_type_set (&i
.types
[0], 0);
8303 /* Check vector Disp8 operand. */
8304 if (t
->opcode_modifier
.disp8memshift
8305 && (!t
->opcode_modifier
.vex
8306 || need_evex_encoding (t
))
8307 && i
.disp_encoding
<= disp_encoding_8bit
)
8309 if (i
.broadcast
.type
|| i
.broadcast
.bytes
)
8310 i
.memshift
= t
->opcode_modifier
.broadcast
- 1;
8311 else if (t
->opcode_modifier
.disp8memshift
!= DISP8_SHIFT_VL
)
8312 i
.memshift
= t
->opcode_modifier
.disp8memshift
;
8315 const i386_operand_type
*type
= NULL
, *fallback
= NULL
;
8318 for (op
= 0; op
< i
.operands
; op
++)
8319 if (i
.flags
[op
] & Operand_Mem
)
8321 if (t
->opcode_modifier
.evex
== EVEXLIG
)
8322 i
.memshift
= 2 + (i
.suffix
== QWORD_MNEM_SUFFIX
);
8323 else if (t
->operand_types
[op
].bitfield
.xmmword
8324 + t
->operand_types
[op
].bitfield
.ymmword
8325 + t
->operand_types
[op
].bitfield
.zmmword
<= 1)
8326 type
= &t
->operand_types
[op
];
8327 else if (!i
.types
[op
].bitfield
.unspecified
)
8328 type
= &i
.types
[op
];
8329 else /* Ambiguities get resolved elsewhere. */
8330 fallback
= &t
->operand_types
[op
];
8332 else if (i
.types
[op
].bitfield
.class == RegSIMD
8333 && t
->opcode_modifier
.evex
!= EVEXLIG
)
8335 if (i
.types
[op
].bitfield
.zmmword
)
8337 else if (i
.types
[op
].bitfield
.ymmword
&& i
.memshift
< 5)
8339 else if (i
.types
[op
].bitfield
.xmmword
&& i
.memshift
< 4)
8343 if (!type
&& !i
.memshift
)
8347 if (type
->bitfield
.zmmword
)
8349 else if (type
->bitfield
.ymmword
)
8351 else if (type
->bitfield
.xmmword
)
8355 /* For the check in fits_in_disp8(). */
8356 if (i
.memshift
== 0)
8360 for (op
= 0; op
< i
.operands
; op
++)
8361 if (operand_type_check (i
.types
[op
], disp
)
8362 && i
.op
[op
].disps
->X_op
== O_constant
)
8364 if (fits_in_disp8 (i
.op
[op
].disps
->X_add_number
))
8366 i
.types
[op
].bitfield
.disp8
= 1;
8369 i
.types
[op
].bitfield
.disp8
= 0;
8378 /* Check if encoding requirements are met by the instruction. */
8381 VEX_check_encoding (const insn_template
*t
)
8383 if (i
.encoding
== encoding_error
)
8385 i
.error
= unsupported
;
8389 /* Vector size restrictions. */
8390 if ((vector_size
< VSZ512
8391 && t
->opcode_modifier
.evex
== EVEX512
)
8392 || (vector_size
< VSZ256
8393 && (t
->opcode_modifier
.evex
== EVEX256
8394 || t
->opcode_modifier
.vex
== VEX256
)))
8396 i
.error
= unsupported_vector_size
;
8402 case encoding_default
:
8407 /* This instruction must be encoded with VEX prefix. */
8408 if (!t
->opcode_modifier
.vex
)
8410 i
.error
= no_vex_encoding
;
8416 case encoding_evex512
:
8417 /* This instruction must be encoded with EVEX prefix. */
8418 if (!t
->opcode_modifier
.evex
)
8420 i
.error
= no_evex_encoding
;
8426 /* This instruction must be encoded with REX2 or EVEX prefix. */
8427 if (t
->opcode_modifier
.vex
&& !t
->opcode_modifier
.evex
)
8429 i
.error
= no_evex_encoding
;
8441 /* Check if Egprs operands are valid for the instruction. */
8444 check_EgprOperands (const insn_template
*t
)
8446 if (!t
->opcode_modifier
.noegpr
)
8449 for (unsigned int op
= 0; op
< i
.operands
; op
++)
8451 if (i
.types
[op
].bitfield
.class != Reg
)
8454 if (i
.op
[op
].regs
->reg_flags
& RegRex2
)
8456 i
.error
= register_type_mismatch
;
8461 if ((i
.index_reg
&& (i
.index_reg
->reg_flags
& RegRex2
))
8462 || (i
.base_reg
&& (i
.base_reg
->reg_flags
& RegRex2
)))
8464 i
.error
= unsupported_EGPR_for_addressing
;
8468 /* Check if pseudo prefix {rex2} is valid. */
8469 if (i
.rex2_encoding
&& !t
->opcode_modifier
.sse2avx
)
8471 i
.error
= invalid_pseudo_prefix
;
8478 /* Check if APX operands are valid for the instruction. */
8480 check_APX_operands (const insn_template
*t
)
8482 /* Push2* and Pop2* cannot use RSP and Pop2* cannot pop two same registers.
8484 switch (t
->mnem_off
)
8488 if (register_number (i
.op
[0].regs
) == register_number (i
.op
[1].regs
))
8490 i
.error
= invalid_dest_register_set
;
8496 if (register_number (i
.op
[0].regs
) == 4
8497 || register_number (i
.op
[1].regs
) == 4)
8499 i
.error
= unsupported_rsp_register
;
8507 /* Check if the instruction use the REX registers or REX prefix. */
8509 check_Rex_required (void)
8511 for (unsigned int op
= 0; op
< i
.operands
; op
++)
8513 if (i
.types
[op
].bitfield
.class != Reg
)
8516 if (i
.op
[op
].regs
->reg_flags
& (RegRex
| RegRex64
))
8520 if ((i
.index_reg
&& (i
.index_reg
->reg_flags
& (RegRex
| RegRex64
)))
8521 || (i
.base_reg
&& (i
.base_reg
->reg_flags
& (RegRex
| RegRex64
))))
8524 /* Check pseudo prefix {rex} are valid. */
8525 return i
.rex_encoding
;
8528 /* Optimize APX NDD insns to legacy insns. */
8530 can_convert_NDD_to_legacy (const insn_template
*t
)
8532 unsigned int match_dest_op
= ~0;
8534 if (!i
.has_nf
&& i
.reg_operands
>= 2)
8536 unsigned int dest
= i
.operands
- 1;
8537 unsigned int src1
= i
.operands
- 2;
8538 unsigned int src2
= (i
.operands
> 3) ? i
.operands
- 3 : 0;
8540 if (i
.types
[src1
].bitfield
.class == Reg
8541 && i
.op
[src1
].regs
== i
.op
[dest
].regs
)
8542 match_dest_op
= src1
;
8543 /* If the first operand is the same as the third operand,
8544 these instructions need to support the ability to commutative
8545 the first two operands and still not change the semantics in order
8547 else if (optimize
> 1
8548 && t
->opcode_modifier
.commutative
8549 && i
.types
[src2
].bitfield
.class == Reg
8550 && i
.op
[src2
].regs
== i
.op
[dest
].regs
)
8551 match_dest_op
= src2
;
8553 return match_dest_op
;
8556 /* Helper function for the progress() macro in match_template(). */
8557 static INLINE
enum i386_error
progress (enum i386_error
new,
8558 enum i386_error last
,
8559 unsigned int line
, unsigned int *line_p
)
8561 if (line
<= *line_p
)
8567 static const insn_template
*
8568 match_template (char mnem_suffix
)
8570 /* Points to template once we've found it. */
8571 const insn_template
*t
;
8572 i386_operand_type overlap0
, overlap1
, overlap2
, overlap3
;
8573 i386_operand_type overlap4
;
8574 unsigned int found_reverse_match
;
8575 i386_operand_type operand_types
[MAX_OPERANDS
];
8576 int addr_prefix_disp
;
8577 unsigned int j
, size_match
, check_register
, errline
= __LINE__
;
8578 enum i386_error specific_error
= number_of_operands_mismatch
;
8579 #define progress(err) progress (err, specific_error, __LINE__, &errline)
8581 #if MAX_OPERANDS != 5
8582 # error "MAX_OPERANDS must be 5."
8585 found_reverse_match
= 0;
8586 addr_prefix_disp
= -1;
8588 for (t
= current_templates
.start
; t
< current_templates
.end
; t
++)
8590 addr_prefix_disp
= -1;
8591 found_reverse_match
= 0;
8593 /* Must have right number of operands. */
8594 if (i
.operands
!= t
->operands
)
8597 /* Skip SSE2AVX templates when inapplicable. */
8598 if (t
->opcode_modifier
.sse2avx
8599 && (!sse2avx
|| i
.prefix
[DATA_PREFIX
]))
8601 /* Another non-SSE2AVX template has to follow. */
8602 gas_assert (t
+ 1 < current_templates
.end
);
8606 /* Check processor support. */
8607 specific_error
= progress (unsupported
);
8608 if (cpu_flags_match (t
) != CPU_FLAGS_PERFECT_MATCH
)
8611 /* Check AT&T mnemonic. */
8612 specific_error
= progress (unsupported_with_intel_mnemonic
);
8613 if (!intel_syntax
&& intel_mnemonic
8614 && t
->opcode_modifier
.dialect
== ATT_MNEMONIC
)
8617 /* Check AT&T/Intel syntax. */
8618 specific_error
= progress (unsupported_syntax
);
8620 ? t
->opcode_modifier
.dialect
>= ATT_SYNTAX
8621 : t
->opcode_modifier
.dialect
== INTEL_SYNTAX
)
8624 /* Check NF support. */
8625 specific_error
= progress (unsupported_nf
);
8626 if (i
.has_nf
&& !t
->opcode_modifier
.nf
)
8629 /* Check Intel64/AMD64 ISA. */
8633 /* Default: Don't accept Intel64. */
8634 if (t
->opcode_modifier
.isa64
== INTEL64
)
8638 /* -mamd64: Don't accept Intel64 and Intel64 only. */
8639 if (t
->opcode_modifier
.isa64
>= INTEL64
)
8643 /* -mintel64: Don't accept AMD64. */
8644 if (t
->opcode_modifier
.isa64
== AMD64
&& flag_code
== CODE_64BIT
)
8649 /* Check the suffix. */
8650 specific_error
= progress (invalid_instruction_suffix
);
8651 if ((t
->opcode_modifier
.no_bsuf
&& mnem_suffix
== BYTE_MNEM_SUFFIX
)
8652 || (t
->opcode_modifier
.no_wsuf
&& mnem_suffix
== WORD_MNEM_SUFFIX
)
8653 || (t
->opcode_modifier
.no_lsuf
&& mnem_suffix
== LONG_MNEM_SUFFIX
)
8654 || (t
->opcode_modifier
.no_ssuf
&& mnem_suffix
== SHORT_MNEM_SUFFIX
)
8655 || (t
->opcode_modifier
.no_qsuf
&& mnem_suffix
== QWORD_MNEM_SUFFIX
))
8658 specific_error
= progress (operand_size_mismatch
);
8659 size_match
= operand_size_match (t
);
8663 /* This is intentionally not
8665 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
8667 as the case of a missing * on the operand is accepted (perhaps with
8668 a warning, issued further down). */
8669 specific_error
= progress (operand_type_mismatch
);
8670 if (i
.jumpabsolute
&& t
->opcode_modifier
.jump
!= JUMP_ABSOLUTE
)
8673 /* In Intel syntax, normally we can check for memory operand size when
8674 there is no mnemonic suffix. But jmp and call have 2 different
8675 encodings with Dword memory operand size. Skip the "near" one
8676 (permitting a register operand) when "far" was requested. */
8678 && t
->opcode_modifier
.jump
== JUMP_ABSOLUTE
8679 && t
->operand_types
[0].bitfield
.class == Reg
)
8682 for (j
= 0; j
< MAX_OPERANDS
; j
++)
8683 operand_types
[j
] = t
->operand_types
[j
];
8685 /* In general, don't allow 32-bit operands on pre-386. */
8686 specific_error
= progress (mnem_suffix
? invalid_instruction_suffix
8687 : operand_size_mismatch
);
8688 j
= i
.imm_operands
+ (t
->operands
> i
.imm_operands
+ 1);
8689 if (i
.suffix
== LONG_MNEM_SUFFIX
8690 && !cpu_arch_flags
.bitfield
.cpui386
8692 ? (t
->opcode_modifier
.mnemonicsize
!= IGNORESIZE
8693 && !intel_float_operand (insn_name (t
)))
8694 : intel_float_operand (insn_name (t
)) != 2)
8695 && (t
->operands
== i
.imm_operands
8696 || (operand_types
[i
.imm_operands
].bitfield
.class != RegMMX
8697 && operand_types
[i
.imm_operands
].bitfield
.class != RegSIMD
8698 && operand_types
[i
.imm_operands
].bitfield
.class != RegMask
)
8699 || (operand_types
[j
].bitfield
.class != RegMMX
8700 && operand_types
[j
].bitfield
.class != RegSIMD
8701 && operand_types
[j
].bitfield
.class != RegMask
))
8702 && !t
->opcode_modifier
.sib
)
8705 /* Do not verify operands when there are none. */
8708 if (VEX_check_encoding (t
))
8710 specific_error
= progress (i
.error
);
8714 /* Check if pseudo prefix {rex2} is valid. */
8715 if (t
->opcode_modifier
.noegpr
&& i
.rex2_encoding
)
8717 specific_error
= progress (invalid_pseudo_prefix
);
8721 /* We've found a match; break out of loop. */
8725 if (!t
->opcode_modifier
.jump
8726 || t
->opcode_modifier
.jump
== JUMP_ABSOLUTE
)
8728 /* There should be only one Disp operand. */
8729 for (j
= 0; j
< MAX_OPERANDS
; j
++)
8730 if (operand_type_check (operand_types
[j
], disp
))
8732 if (j
< MAX_OPERANDS
)
8734 bool override
= (i
.prefix
[ADDR_PREFIX
] != 0);
8736 addr_prefix_disp
= j
;
8738 /* Address size prefix will turn Disp64 operand into Disp32 and
8739 Disp32/Disp16 one into Disp16/Disp32 respectively. */
8743 override
= !override
;
8746 if (operand_types
[j
].bitfield
.disp32
8747 && operand_types
[j
].bitfield
.disp16
)
8749 operand_types
[j
].bitfield
.disp16
= override
;
8750 operand_types
[j
].bitfield
.disp32
= !override
;
8752 gas_assert (!operand_types
[j
].bitfield
.disp64
);
8756 if (operand_types
[j
].bitfield
.disp64
)
8758 gas_assert (!operand_types
[j
].bitfield
.disp32
);
8759 operand_types
[j
].bitfield
.disp32
= override
;
8760 operand_types
[j
].bitfield
.disp64
= !override
;
8762 operand_types
[j
].bitfield
.disp16
= 0;
8768 /* We check register size if needed. */
8769 if (t
->opcode_modifier
.checkoperandsize
)
8771 check_register
= (1 << t
->operands
) - 1;
8772 if (i
.broadcast
.type
|| i
.broadcast
.bytes
)
8773 check_register
&= ~(1 << i
.broadcast
.operand
);
8778 overlap0
= operand_type_and (i
.types
[0], operand_types
[0]);
8779 switch (t
->operands
)
8782 if (!operand_type_match (overlap0
, i
.types
[0]))
8785 /* Allow the ModR/M encoding to be requested by using the {load} or
8786 {store} pseudo prefix on an applicable insn. */
8787 if (!t
->opcode_modifier
.modrm
8788 && i
.reg_operands
== 1
8789 && ((i
.dir_encoding
== dir_encoding_load
8790 && t
->mnem_off
!= MN_pop
)
8791 || (i
.dir_encoding
== dir_encoding_store
8792 && t
->mnem_off
!= MN_push
))
8794 && t
->mnem_off
!= MN_bswap
)
8799 /* xchg %eax, %eax is a special case. It is an alias for nop
8800 only in 32bit mode and we can use opcode 0x90. In 64bit
8801 mode, we can't use 0x90 for xchg %eax, %eax since it should
8802 zero-extend %eax to %rax. */
8803 if (t
->base_opcode
== 0x90
8804 && t
->opcode_space
== SPACE_BASE
)
8806 if (flag_code
== CODE_64BIT
8807 && i
.types
[0].bitfield
.instance
== Accum
8808 && i
.types
[0].bitfield
.dword
8809 && i
.types
[1].bitfield
.instance
== Accum
)
8812 /* Allow the ModR/M encoding to be requested by using the
8813 {load} or {store} pseudo prefix. */
8814 if (i
.dir_encoding
== dir_encoding_load
8815 || i
.dir_encoding
== dir_encoding_store
)
8819 if (t
->base_opcode
== MOV_AX_DISP32
8820 && t
->opcode_space
== SPACE_BASE
8821 && t
->mnem_off
!= MN_movabs
)
8823 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
8824 if (i
.reloc
[0] == BFD_RELOC_386_GOT32
)
8827 /* xrelease mov %eax, <disp> is another special case. It must not
8828 match the accumulator-only encoding of mov. */
8832 /* Allow the ModR/M encoding to be requested by using a suitable
8833 {load} or {store} pseudo prefix. */
8834 if (i
.dir_encoding
== (i
.types
[0].bitfield
.instance
== Accum
8835 ? dir_encoding_store
8836 : dir_encoding_load
)
8837 && !i
.types
[0].bitfield
.disp64
8838 && !i
.types
[1].bitfield
.disp64
)
8842 /* Allow the ModR/M encoding to be requested by using the {load} or
8843 {store} pseudo prefix on an applicable insn. */
8844 if (!t
->opcode_modifier
.modrm
8845 && i
.reg_operands
== 1
8846 && i
.imm_operands
== 1
8847 && (i
.dir_encoding
== dir_encoding_load
8848 || i
.dir_encoding
== dir_encoding_store
)
8849 && t
->opcode_space
== SPACE_BASE
)
8851 if (t
->base_opcode
== 0xb0 /* mov $imm, %reg */
8852 && i
.dir_encoding
== dir_encoding_store
)
8855 if ((t
->base_opcode
| 0x38) == 0x3c /* <alu> $imm, %acc */
8856 && (t
->base_opcode
!= 0x3c /* cmp $imm, %acc */
8857 || i
.dir_encoding
== dir_encoding_load
))
8860 if (t
->base_opcode
== 0xa8 /* test $imm, %acc */
8861 && i
.dir_encoding
== dir_encoding_load
)
8867 if (!(size_match
& MATCH_STRAIGHT
))
8869 /* Reverse direction of operands if swapping is possible in the first
8870 place (operands need to be symmetric) and
8871 - the load form is requested, and the template is a store form,
8872 - the store form is requested, and the template is a load form,
8873 - the non-default (swapped) form is requested. */
8874 overlap1
= operand_type_and (operand_types
[0], operand_types
[1]);
8876 j
= i
.operands
- 1 - (t
->opcode_space
== SPACE_EVEXMAP4
8877 && t
->opcode_modifier
.vexvvvv
);
8879 if (t
->opcode_modifier
.d
&& i
.reg_operands
== i
.operands
8880 && !operand_type_all_zero (&overlap1
))
8881 switch (i
.dir_encoding
)
8883 case dir_encoding_load
:
8884 if (operand_type_check (operand_types
[j
], anymem
)
8885 || t
->opcode_modifier
.regmem
)
8889 case dir_encoding_store
:
8890 if (!operand_type_check (operand_types
[j
], anymem
)
8891 && !t
->opcode_modifier
.regmem
)
8895 case dir_encoding_swap
:
8898 case dir_encoding_default
:
8902 /* If we want store form, we skip the current load. */
8903 if ((i
.dir_encoding
== dir_encoding_store
8904 || i
.dir_encoding
== dir_encoding_swap
)
8905 && i
.mem_operands
== 0
8906 && t
->opcode_modifier
.load
)
8911 overlap1
= operand_type_and (i
.types
[1], operand_types
[1]);
8912 if (!operand_type_match (overlap0
, i
.types
[0])
8913 || !operand_type_match (overlap1
, i
.types
[1])
8914 || ((check_register
& 3) == 3
8915 && !operand_type_register_match (i
.types
[0],
8920 specific_error
= progress (i
.error
);
8922 /* Check if other direction is valid ... */
8923 if (!t
->opcode_modifier
.d
)
8927 if (!(size_match
& MATCH_REVERSE
))
8929 /* Try reversing direction of operands. */
8930 j
= is_cpu (t
, CpuFMA4
)
8931 || is_cpu (t
, CpuXOP
)
8932 || is_cpu (t
, CpuAPX_F
) ? 1 : i
.operands
- 1;
8933 overlap0
= operand_type_and (i
.types
[0], operand_types
[j
]);
8934 overlap1
= operand_type_and (i
.types
[j
], operand_types
[0]);
8935 overlap2
= operand_type_and (i
.types
[1], operand_types
[1]);
8936 gas_assert (t
->operands
!= 3 || !check_register
8937 || is_cpu (t
, CpuAPX_F
));
8938 if (!operand_type_match (overlap0
, i
.types
[0])
8939 || !operand_type_match (overlap1
, i
.types
[j
])
8940 || (t
->operands
== 3
8941 && !operand_type_match (overlap2
, i
.types
[1]))
8943 && !operand_type_register_match (i
.types
[0],
8948 /* Does not match either direction. */
8949 specific_error
= progress (i
.error
);
8952 /* found_reverse_match holds which variant of D
8954 if (!t
->opcode_modifier
.d
)
8955 found_reverse_match
= 0;
8956 else if (operand_types
[0].bitfield
.tbyte
)
8958 if (t
->opcode_modifier
.operandconstraint
!= UGH
)
8959 found_reverse_match
= Opcode_FloatD
;
8961 found_reverse_match
= ~0;
8962 /* FSUB{,R} and FDIV{,R} may need a 2nd bit flipped. */
8963 if ((t
->extension_opcode
& 4)
8964 && (intel_syntax
|| intel_mnemonic
))
8965 found_reverse_match
|= Opcode_FloatR
;
8967 else if (is_cpu (t
, CpuFMA4
) || is_cpu (t
, CpuXOP
))
8969 found_reverse_match
= Opcode_VexW
;
8970 goto check_operands_345
;
8972 else if (t
->opcode_space
== SPACE_EVEXMAP4
8973 && t
->opcode_modifier
.w
)
8975 found_reverse_match
= Opcode_D
;
8976 goto check_operands_345
;
8978 else if (t
->opcode_space
!= SPACE_BASE
8979 && (t
->opcode_space
!= SPACE_0F
8980 /* MOV to/from CR/DR/TR, as an exception, follow
8981 the base opcode space encoding model. */
8982 || (t
->base_opcode
| 7) != 0x27))
8983 found_reverse_match
= (t
->base_opcode
& 0xee) != 0x6e
8984 ? Opcode_ExtD
: Opcode_SIMD_IntD
;
8985 else if (!t
->opcode_modifier
.commutative
)
8986 found_reverse_match
= Opcode_D
;
8988 found_reverse_match
= ~0;
8992 /* Found a forward 2 operand match here. */
8994 switch (t
->operands
)
8997 overlap4
= operand_type_and (i
.types
[4], operand_types
[4]);
8998 if (!operand_type_match (overlap4
, i
.types
[4])
8999 || !operand_type_register_match (i
.types
[3],
9004 specific_error
= progress (i
.error
);
9009 overlap3
= operand_type_and (i
.types
[3], operand_types
[3]);
9010 if (!operand_type_match (overlap3
, i
.types
[3])
9011 || ((check_register
& 0xa) == 0xa
9012 && !operand_type_register_match (i
.types
[1],
9016 || ((check_register
& 0xc) == 0xc
9017 && !operand_type_register_match (i
.types
[2],
9022 specific_error
= progress (i
.error
);
9027 overlap2
= operand_type_and (i
.types
[2], operand_types
[2]);
9028 if (!operand_type_match (overlap2
, i
.types
[2])
9029 || ((check_register
& 5) == 5
9030 && !operand_type_register_match (i
.types
[0],
9034 || ((check_register
& 6) == 6
9035 && !operand_type_register_match (i
.types
[1],
9040 specific_error
= progress (i
.error
);
9046 /* Found either forward/reverse 2, 3 or 4 operand match here:
9047 slip through to break. */
9050 /* Check if VEX/EVEX encoding requirements can be satisfied. */
9051 if (VEX_check_encoding (t
))
9053 specific_error
= progress (i
.error
);
9057 /* Check if EGPR operands(r16-r31) are valid. */
9058 if (check_EgprOperands (t
))
9060 specific_error
= progress (i
.error
);
9064 /* Check if vector operands are valid. */
9065 if (check_VecOperands (t
))
9067 specific_error
= progress (i
.error
);
9071 /* Check if APX operands are valid. */
9072 if (check_APX_operands (t
))
9074 specific_error
= progress (i
.error
);
9078 /* Check whether to use the shorter VEX encoding for certain insns where
9079 the EVEX encoding comes first in the table. This requires the respective
9080 AVX-* feature to be explicitly enabled.
9082 Most of the respective insns have just a single EVEX and a single VEX
9083 template. The one that's presently different is generated using the
9084 Vxy / Exy constructs: There are 3 suffix-less EVEX forms, the latter
9085 two of which may fall back to their two corresponding VEX forms. */
9086 j
= t
->mnem_off
!= MN_vcvtneps2bf16
? 1 : 2;
9087 if ((t
== current_templates
.start
|| j
> 1)
9088 && t
->opcode_modifier
.disp8memshift
9089 && !t
->opcode_modifier
.vex
9090 && !need_evex_encoding (t
)
9091 && t
+ j
< current_templates
.end
9092 && t
[j
].opcode_modifier
.vex
)
9095 unsigned int memshift
= i
.memshift
;
9098 cpu
= cpu_flags_and (cpu_flags_from_attr (t
[j
].cpu
),
9099 cpu_arch_isa_flags
);
9100 if (!cpu_flags_all_zero (&cpu
)
9101 && (!i
.types
[0].bitfield
.disp8
9102 || !operand_type_check (i
.types
[0], disp
)
9103 || i
.op
[0].disps
->X_op
!= O_constant
9104 || fits_in_disp8 (i
.op
[0].disps
->X_add_number
)))
9106 specific_error
= progress (internal_error
);
9110 i
.memshift
= memshift
;
9113 /* If we can optimize a NDD insn to legacy insn, like
9114 add %r16, %r8, %r8 -> add %r16, %r8,
9115 add %r8, %r16, %r8 -> add %r16, %r8, then rematch template.
9116 Note that the semantics have not been changed. */
9119 && i
.encoding
!= encoding_evex
9120 && ((t
+ 1 < current_templates
.end
9121 && !t
[1].opcode_modifier
.evex
9122 && t
[1].opcode_space
<= SPACE_0F38
9123 && t
->opcode_modifier
.vexvvvv
== VexVVVV_DST
)
9124 || t
->mnem_off
== MN_movbe
)
9125 && (i
.types
[i
.operands
- 1].bitfield
.dword
9126 || i
.types
[i
.operands
- 1].bitfield
.qword
))
9128 unsigned int match_dest_op
= can_convert_NDD_to_legacy (t
);
9130 if (match_dest_op
!= (unsigned int) ~0)
9133 /* We ensure that the next template has the same input
9134 operands as the original matching template by the first
9135 opernd (ATT). To avoid someone support new NDD insns and
9136 put it in the wrong position. */
9137 overlap0
= operand_type_and (i
.types
[0],
9138 t
[1].operand_types
[0]);
9139 if (t
->opcode_modifier
.d
)
9140 overlap1
= operand_type_and (i
.types
[0],
9141 t
[1].operand_types
[1]);
9142 if (!operand_type_match (overlap0
, i
.types
[0])
9143 && (!t
->opcode_modifier
.d
9144 || !operand_type_match (overlap1
, i
.types
[0])))
9148 && (t
[1].opcode_space
<= SPACE_0F
9149 /* Some non-legacy-map0/1 insns can be shorter when
9150 legacy-encoded and when no REX prefix is required. */
9151 || (!check_EgprOperands (t
+ 1)
9152 && !check_Rex_required ()
9153 && !i
.op
[i
.operands
- 1].regs
->reg_type
.bitfield
.qword
)))
9155 if (i
.operands
> 2 && match_dest_op
== i
.operands
- 3)
9156 swap_2_operands (match_dest_op
, i
.operands
- 2);
9161 if (t
->mnem_off
== MN_movbe
)
9163 gas_assert (t
[1].mnem_off
== MN_bswap
);
9164 ++current_templates
.end
;
9167 specific_error
= progress (internal_error
);
9174 /* We've found a match; break out of loop. */
9180 if (t
== current_templates
.end
)
9182 /* We found no match. */
9183 i
.error
= specific_error
;
9187 if (!quiet_warnings
)
9190 && (i
.jumpabsolute
!= (t
->opcode_modifier
.jump
== JUMP_ABSOLUTE
)))
9191 as_warn (_("indirect %s without `*'"), insn_name (t
));
9193 if (t
->opcode_modifier
.isprefix
9194 && t
->opcode_modifier
.mnemonicsize
== IGNORESIZE
)
9196 /* Warn them that a data or address size prefix doesn't
9197 affect assembly of the next line of code. */
9198 as_warn (_("stand-alone `%s' prefix"), insn_name (t
));
9202 /* Copy the template we found. */
9203 install_template (t
);
9205 if (addr_prefix_disp
!= -1)
9206 i
.tm
.operand_types
[addr_prefix_disp
]
9207 = operand_types
[addr_prefix_disp
];
9209 /* APX insns acting on byte operands are WIG, yet that can't be expressed
9210 in the templates (they're also covering word/dword/qword operands). */
9211 if (t
->opcode_space
== SPACE_EVEXMAP4
&& !t
->opcode_modifier
.vexw
&&
9212 i
.types
[i
.operands
- 1].bitfield
.byte
)
9214 gas_assert (t
->opcode_modifier
.w
);
9215 i
.tm
.opcode_modifier
.vexw
= VEXWIG
;
9218 switch (found_reverse_match
)
9224 case Opcode_FloatR
| Opcode_FloatD
:
9225 i
.tm
.extension_opcode
^= Opcode_FloatR
>> 3;
9226 found_reverse_match
&= Opcode_FloatD
;
9230 /* If we found a reverse match we must alter the opcode direction
9231 bit and clear/flip the regmem modifier one. found_reverse_match
9232 holds bits to change (different for int & float insns). */
9234 i
.tm
.base_opcode
^= found_reverse_match
;
9236 if (i
.tm
.opcode_space
== SPACE_EVEXMAP4
)
9239 /* Certain SIMD insns have their load forms specified in the opcode
9240 table, and hence we need to _set_ RegMem instead of clearing it.
9241 We need to avoid setting the bit though on insns like KMOVW. */
9242 i
.tm
.opcode_modifier
.regmem
9243 = i
.tm
.opcode_modifier
.modrm
&& i
.tm
.opcode_modifier
.d
9244 && i
.tm
.operands
> 2U - i
.tm
.opcode_modifier
.sse2avx
9245 && !i
.tm
.opcode_modifier
.regmem
;
9249 i
.tm
.operand_types
[0] = operand_types
[i
.operands
- 1];
9250 i
.tm
.operand_types
[i
.operands
- 1] = operand_types
[0];
9254 /* Only the first two register operands need reversing, alongside
9256 i
.tm
.opcode_modifier
.vexw
^= VEXW0
^ VEXW1
;
9259 j
= i
.tm
.operand_types
[0].bitfield
.imm8
;
9260 i
.tm
.operand_types
[j
] = operand_types
[j
+ 1];
9261 i
.tm
.operand_types
[j
+ 1] = operand_types
[j
];
9271 unsigned int es_op
= i
.tm
.opcode_modifier
.isstring
- IS_STRING_ES_OP0
;
9272 unsigned int op
= i
.tm
.operand_types
[0].bitfield
.baseindex
? es_op
: 0;
9274 if (i
.seg
[op
] != NULL
&& i
.seg
[op
] != reg_es
)
9276 as_bad (_("`%s' operand %u must use `%ses' segment"),
9278 intel_syntax
? i
.tm
.operands
- es_op
: es_op
+ 1,
9283 /* There's only ever one segment override allowed per instruction.
9284 This instruction possibly has a legal segment override on the
9285 second operand, so copy the segment to where non-string
9286 instructions store it, allowing common code. */
9287 i
.seg
[op
] = i
.seg
[1];
9293 process_suffix (void)
9295 bool is_movx
= false;
9297 /* If matched instruction specifies an explicit instruction mnemonic
9299 if (i
.tm
.opcode_modifier
.size
== SIZE16
)
9300 i
.suffix
= WORD_MNEM_SUFFIX
;
9301 else if (i
.tm
.opcode_modifier
.size
== SIZE32
)
9302 i
.suffix
= LONG_MNEM_SUFFIX
;
9303 else if (i
.tm
.opcode_modifier
.size
== SIZE64
)
9304 i
.suffix
= QWORD_MNEM_SUFFIX
;
9305 else if (i
.reg_operands
9306 && (i
.operands
> 1 || i
.types
[0].bitfield
.class == Reg
)
9307 && i
.tm
.opcode_modifier
.operandconstraint
!= ADDR_PREFIX_OP_REG
)
9309 unsigned int numop
= i
.operands
;
9312 is_movx
= (i
.tm
.opcode_space
== SPACE_0F
9313 && (i
.tm
.base_opcode
| 8) == 0xbe)
9314 || (i
.tm
.opcode_space
== SPACE_BASE
9315 && i
.tm
.base_opcode
== 0x63
9316 && is_cpu (&i
.tm
, Cpu64
));
9318 /* movsx/movzx want only their source operand considered here, for the
9319 ambiguity checking below. The suffix will be replaced afterwards
9320 to represent the destination (register). */
9321 if (is_movx
&& (i
.tm
.opcode_modifier
.w
|| i
.tm
.base_opcode
== 0x63))
9324 /* crc32 needs REX.W set regardless of suffix / source operand size. */
9325 if (i
.tm
.mnem_off
== MN_crc32
&& i
.tm
.operand_types
[1].bitfield
.qword
)
9328 /* If there's no instruction mnemonic suffix we try to invent one
9329 based on GPR operands. */
9332 /* We take i.suffix from the last register operand specified,
9333 Destination register type is more significant than source
9334 register type. crc32 in SSE4.2 prefers source register
9336 unsigned int op
= i
.tm
.mnem_off
== MN_crc32
? 1 : i
.operands
;
9339 if (i
.tm
.operand_types
[op
].bitfield
.instance
== InstanceNone
9340 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9342 if (i
.types
[op
].bitfield
.class != Reg
)
9344 if (i
.types
[op
].bitfield
.byte
)
9345 i
.suffix
= BYTE_MNEM_SUFFIX
;
9346 else if (i
.types
[op
].bitfield
.word
)
9347 i
.suffix
= WORD_MNEM_SUFFIX
;
9348 else if (i
.types
[op
].bitfield
.dword
)
9349 i
.suffix
= LONG_MNEM_SUFFIX
;
9350 else if (i
.types
[op
].bitfield
.qword
)
9351 i
.suffix
= QWORD_MNEM_SUFFIX
;
9357 /* As an exception, movsx/movzx silently default to a byte source
9359 if (is_movx
&& i
.tm
.opcode_modifier
.w
&& !i
.suffix
&& !intel_syntax
)
9360 i
.suffix
= BYTE_MNEM_SUFFIX
;
9362 else if (i
.suffix
== BYTE_MNEM_SUFFIX
)
9364 if (!check_byte_reg ())
9367 else if (i
.suffix
== LONG_MNEM_SUFFIX
)
9369 if (!check_long_reg ())
9372 else if (i
.suffix
== QWORD_MNEM_SUFFIX
)
9374 if (!check_qword_reg ())
9377 else if (i
.suffix
== WORD_MNEM_SUFFIX
)
9379 if (!check_word_reg ())
9382 else if (intel_syntax
9383 && i
.tm
.opcode_modifier
.mnemonicsize
== IGNORESIZE
)
9384 /* Do nothing if the instruction is going to ignore the prefix. */
9389 /* Undo the movsx/movzx change done above. */
9392 else if (i
.tm
.opcode_modifier
.mnemonicsize
== DEFAULTSIZE
9395 i
.suffix
= stackop_size
;
9396 if (stackop_size
== LONG_MNEM_SUFFIX
)
9398 /* stackop_size is set to LONG_MNEM_SUFFIX for the
9399 .code16gcc directive to support 16-bit mode with
9400 32-bit address. For IRET without a suffix, generate
9401 16-bit IRET (opcode 0xcf) to return from an interrupt
9403 if (i
.tm
.base_opcode
== 0xcf)
9405 i
.suffix
= WORD_MNEM_SUFFIX
;
9406 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
9408 /* Warn about changed behavior for segment register push/pop. */
9409 else if ((i
.tm
.base_opcode
| 1) == 0x07)
9410 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
9415 && (i
.tm
.opcode_modifier
.jump
== JUMP_ABSOLUTE
9416 || i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
9417 || i
.tm
.opcode_modifier
.jump
== JUMP_INTERSEGMENT
9418 || (i
.tm
.opcode_space
== SPACE_0F
9419 && i
.tm
.base_opcode
== 0x01 /* [ls][gi]dt */
9420 && i
.tm
.extension_opcode
<= 3)))
9425 if (!i
.tm
.opcode_modifier
.no_qsuf
)
9427 if (i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
9428 || i
.tm
.opcode_modifier
.no_lsuf
)
9429 i
.suffix
= QWORD_MNEM_SUFFIX
;
9434 if (!i
.tm
.opcode_modifier
.no_lsuf
)
9435 i
.suffix
= LONG_MNEM_SUFFIX
;
9438 if (!i
.tm
.opcode_modifier
.no_wsuf
)
9439 i
.suffix
= WORD_MNEM_SUFFIX
;
9445 && (i
.tm
.opcode_modifier
.mnemonicsize
!= DEFAULTSIZE
9446 /* Also cover lret/retf/iret in 64-bit mode. */
9447 || (flag_code
== CODE_64BIT
9448 && !i
.tm
.opcode_modifier
.no_lsuf
9449 && !i
.tm
.opcode_modifier
.no_qsuf
))
9450 && i
.tm
.opcode_modifier
.mnemonicsize
!= IGNORESIZE
9451 /* Explicit sizing prefixes are assumed to disambiguate insns. */
9452 && !i
.prefix
[DATA_PREFIX
] && !(i
.prefix
[REX_PREFIX
] & REX_W
)
9453 /* Accept FLDENV et al without suffix. */
9454 && (i
.tm
.opcode_modifier
.no_ssuf
|| i
.tm
.opcode_modifier
.floatmf
))
9456 unsigned int suffixes
, evex
= 0;
9458 suffixes
= !i
.tm
.opcode_modifier
.no_bsuf
;
9459 if (!i
.tm
.opcode_modifier
.no_wsuf
)
9461 if (!i
.tm
.opcode_modifier
.no_lsuf
)
9463 if (!i
.tm
.opcode_modifier
.no_ssuf
)
9465 if (flag_code
== CODE_64BIT
&& !i
.tm
.opcode_modifier
.no_qsuf
)
9468 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
9469 also suitable for AT&T syntax mode, it was requested that this be
9470 restricted to just Intel syntax. */
9471 if (intel_syntax
&& is_any_vex_encoding (&i
.tm
)
9472 && !i
.broadcast
.type
&& !i
.broadcast
.bytes
)
9476 for (op
= 0; op
< i
.tm
.operands
; ++op
)
9478 if (vector_size
< VSZ512
)
9480 i
.tm
.operand_types
[op
].bitfield
.zmmword
= 0;
9481 if (vector_size
< VSZ256
)
9483 i
.tm
.operand_types
[op
].bitfield
.ymmword
= 0;
9484 if (i
.tm
.operand_types
[op
].bitfield
.xmmword
9485 && i
.tm
.opcode_modifier
.evex
== EVEXDYN
)
9486 i
.tm
.opcode_modifier
.evex
= EVEX128
;
9488 else if (i
.tm
.operand_types
[op
].bitfield
.ymmword
9489 && !i
.tm
.operand_types
[op
].bitfield
.xmmword
9490 && i
.tm
.opcode_modifier
.evex
== EVEXDYN
)
9491 i
.tm
.opcode_modifier
.evex
= EVEX256
;
9493 else if (i
.tm
.opcode_modifier
.evex
9494 && !cpu_arch_flags
.bitfield
.cpuavx512vl
)
9496 if (i
.tm
.operand_types
[op
].bitfield
.ymmword
)
9497 i
.tm
.operand_types
[op
].bitfield
.xmmword
= 0;
9498 if (i
.tm
.operand_types
[op
].bitfield
.zmmword
)
9499 i
.tm
.operand_types
[op
].bitfield
.ymmword
= 0;
9500 if (i
.tm
.opcode_modifier
.evex
== EVEXDYN
)
9501 i
.tm
.opcode_modifier
.evex
= EVEX512
;
9504 if (i
.tm
.operand_types
[op
].bitfield
.xmmword
9505 + i
.tm
.operand_types
[op
].bitfield
.ymmword
9506 + i
.tm
.operand_types
[op
].bitfield
.zmmword
< 2)
9509 /* Any properly sized operand disambiguates the insn. */
9510 if (i
.types
[op
].bitfield
.xmmword
9511 || i
.types
[op
].bitfield
.ymmword
9512 || i
.types
[op
].bitfield
.zmmword
)
9514 suffixes
&= ~(7 << 6);
9519 if ((i
.flags
[op
] & Operand_Mem
)
9520 && i
.tm
.operand_types
[op
].bitfield
.unspecified
)
9522 if (i
.tm
.operand_types
[op
].bitfield
.xmmword
)
9524 if (i
.tm
.operand_types
[op
].bitfield
.ymmword
)
9526 if (i
.tm
.operand_types
[op
].bitfield
.zmmword
)
9528 if (i
.tm
.opcode_modifier
.evex
)
9534 /* Are multiple suffixes / operand sizes allowed? */
9535 if (suffixes
& (suffixes
- 1))
9538 && (i
.tm
.opcode_modifier
.mnemonicsize
!= DEFAULTSIZE
9539 || operand_check
== check_error
))
9541 as_bad (_("ambiguous operand size for `%s'"), insn_name (&i
.tm
));
9544 if (operand_check
== check_error
)
9546 as_bad (_("no instruction mnemonic suffix given and "
9547 "no register operands; can't size `%s'"), insn_name (&i
.tm
));
9550 if (operand_check
== check_warning
)
9551 as_warn (_("%s; using default for `%s'"),
9553 ? _("ambiguous operand size")
9554 : _("no instruction mnemonic suffix given and "
9555 "no register operands"),
9558 if (i
.tm
.opcode_modifier
.floatmf
)
9559 i
.suffix
= SHORT_MNEM_SUFFIX
;
9561 /* handled below */;
9563 i
.tm
.opcode_modifier
.evex
= evex
;
9564 else if (flag_code
== CODE_16BIT
)
9565 i
.suffix
= WORD_MNEM_SUFFIX
;
9566 else if (!i
.tm
.opcode_modifier
.no_lsuf
)
9567 i
.suffix
= LONG_MNEM_SUFFIX
;
9569 i
.suffix
= QWORD_MNEM_SUFFIX
;
9575 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
9576 In AT&T syntax, if there is no suffix (warned about above), the default
9577 will be byte extension. */
9578 if (i
.tm
.opcode_modifier
.w
&& i
.suffix
&& i
.suffix
!= BYTE_MNEM_SUFFIX
)
9579 i
.tm
.base_opcode
|= 1;
9581 /* For further processing, the suffix should represent the destination
9582 (register). This is already the case when one was used with
9583 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
9584 no suffix to begin with. */
9585 if (i
.tm
.opcode_modifier
.w
|| i
.tm
.base_opcode
== 0x63 || !i
.suffix
)
9587 if (i
.types
[1].bitfield
.word
)
9588 i
.suffix
= WORD_MNEM_SUFFIX
;
9589 else if (i
.types
[1].bitfield
.qword
)
9590 i
.suffix
= QWORD_MNEM_SUFFIX
;
9592 i
.suffix
= LONG_MNEM_SUFFIX
;
9594 i
.tm
.opcode_modifier
.w
= 0;
9598 if (!i
.tm
.opcode_modifier
.modrm
&& i
.reg_operands
&& i
.tm
.operands
< 3)
9599 i
.short_form
= (i
.tm
.operand_types
[0].bitfield
.class == Reg
)
9600 != (i
.tm
.operand_types
[1].bitfield
.class == Reg
);
9602 /* Change the opcode based on the operand size given by i.suffix. */
9605 /* Size floating point instruction. */
9606 case LONG_MNEM_SUFFIX
:
9607 if (i
.tm
.opcode_modifier
.floatmf
)
9609 i
.tm
.base_opcode
^= 4;
9613 case WORD_MNEM_SUFFIX
:
9614 case QWORD_MNEM_SUFFIX
:
9615 /* It's not a byte, select word/dword operation. */
9616 if (i
.tm
.opcode_modifier
.w
)
9619 i
.tm
.base_opcode
|= 8;
9621 i
.tm
.base_opcode
|= 1;
9624 /* Set mode64 for an operand. */
9625 if (i
.suffix
== QWORD_MNEM_SUFFIX
)
9627 if (flag_code
== CODE_64BIT
9628 && !i
.tm
.opcode_modifier
.norex64
9629 && !i
.tm
.opcode_modifier
.vexw
9630 /* Special case for xchg %rax,%rax. It is NOP and doesn't
9632 && ! (i
.operands
== 2
9633 && i
.tm
.base_opcode
== 0x90
9634 && i
.tm
.opcode_space
== SPACE_BASE
9635 && i
.types
[0].bitfield
.instance
== Accum
9636 && i
.types
[1].bitfield
.instance
== Accum
))
9643 case SHORT_MNEM_SUFFIX
:
9644 /* Now select between word & dword operations via the operand
9645 size prefix, except for instructions that will ignore this
9647 if (i
.tm
.opcode_modifier
.mnemonicsize
!= IGNORESIZE
9648 && !i
.tm
.opcode_modifier
.floatmf
9649 && (!is_any_vex_encoding (&i
.tm
)
9650 || i
.tm
.opcode_space
== SPACE_EVEXMAP4
)
9651 && ((i
.suffix
== LONG_MNEM_SUFFIX
) == (flag_code
== CODE_16BIT
)
9652 || (flag_code
== CODE_64BIT
9653 && i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
)))
9655 unsigned int prefix
= DATA_PREFIX_OPCODE
;
9657 if (i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
) /* jcxz, loop */
9658 prefix
= ADDR_PREFIX_OPCODE
;
9660 /* The DATA PREFIX of EVEX promoted from legacy APX instructions
9661 needs to be adjusted. */
9662 if (i
.tm
.opcode_space
== SPACE_EVEXMAP4
)
9664 gas_assert (!i
.tm
.opcode_modifier
.opcodeprefix
);
9665 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_0X66
;
9667 else if (!add_prefix (prefix
))
9674 /* Select word/dword/qword operation with explicit data sizing prefix
9675 when there are no suitable register operands. */
9676 if (i
.tm
.opcode_modifier
.w
9677 && (i
.prefix
[DATA_PREFIX
] || (i
.prefix
[REX_PREFIX
] & REX_W
))
9679 || (i
.reg_operands
== 1
9681 && (i
.tm
.operand_types
[0].bitfield
.instance
== RegC
9683 || i
.tm
.operand_types
[0].bitfield
.instance
== RegD
9684 || i
.tm
.operand_types
[1].bitfield
.instance
== RegD
9685 || i
.tm
.mnem_off
== MN_crc32
))))
9686 i
.tm
.base_opcode
|= 1;
9690 if (i
.tm
.opcode_modifier
.operandconstraint
== ADDR_PREFIX_OP_REG
)
9692 gas_assert (!i
.suffix
);
9693 gas_assert (i
.reg_operands
);
9695 if (i
.tm
.operand_types
[0].bitfield
.instance
== Accum
9698 /* The address size override prefix changes the size of the
9700 if (flag_code
== CODE_64BIT
9701 && i
.op
[0].regs
->reg_type
.bitfield
.word
)
9703 as_bad (_("16-bit addressing unavailable for `%s'"),
9708 if ((flag_code
== CODE_32BIT
9709 ? i
.op
[0].regs
->reg_type
.bitfield
.word
9710 : i
.op
[0].regs
->reg_type
.bitfield
.dword
)
9711 && !add_prefix (ADDR_PREFIX_OPCODE
))
9716 /* Check invalid register operand when the address size override
9717 prefix changes the size of register operands. */
9719 enum { need_word
, need_dword
, need_qword
} need
;
9721 /* Check the register operand for the address size prefix if
9722 the memory operand has no real registers, like symbol, DISP
9723 or bogus (x32-only) symbol(%rip) when symbol(%eip) is meant. */
9724 if (i
.mem_operands
== 1
9725 && i
.reg_operands
== 1
9727 && i
.types
[1].bitfield
.class == Reg
9728 && (flag_code
== CODE_32BIT
9729 ? i
.op
[1].regs
->reg_type
.bitfield
.word
9730 : i
.op
[1].regs
->reg_type
.bitfield
.dword
)
9731 && ((i
.base_reg
== NULL
&& i
.index_reg
== NULL
)
9732 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
9733 || (x86_elf_abi
== X86_64_X32_ABI
9735 && i
.base_reg
->reg_num
== RegIP
9736 && i
.base_reg
->reg_type
.bitfield
.qword
))
9740 && !add_prefix (ADDR_PREFIX_OPCODE
))
9743 if (flag_code
== CODE_32BIT
)
9744 need
= i
.prefix
[ADDR_PREFIX
] ? need_word
: need_dword
;
9745 else if (i
.prefix
[ADDR_PREFIX
])
9748 need
= flag_code
== CODE_64BIT
? need_qword
: need_word
;
9750 for (op
= 0; op
< i
.operands
; op
++)
9752 if (i
.types
[op
].bitfield
.class != Reg
)
9758 if (i
.op
[op
].regs
->reg_type
.bitfield
.word
)
9762 if (i
.op
[op
].regs
->reg_type
.bitfield
.dword
)
9766 if (i
.op
[op
].regs
->reg_type
.bitfield
.qword
)
9771 as_bad (_("invalid register operand size for `%s'"),
9782 check_byte_reg (void)
9786 for (op
= i
.operands
; --op
>= 0;)
9788 /* Skip non-register operands. */
9789 if (i
.types
[op
].bitfield
.class != Reg
)
9792 /* If this is an eight bit register, it's OK. If it's the 16 or
9793 32 bit version of an eight bit register, we will just use the
9794 low portion, and that's OK too. */
9795 if (i
.types
[op
].bitfield
.byte
)
9798 /* I/O port address operands are OK too. */
9799 if (i
.tm
.operand_types
[op
].bitfield
.instance
== RegD
9800 && i
.tm
.operand_types
[op
].bitfield
.word
)
9803 /* crc32 only wants its source operand checked here. */
9804 if (i
.tm
.mnem_off
== MN_crc32
&& op
!= 0)
9807 /* Any other register is bad. */
9808 as_bad (_("`%s%s' not allowed with `%s%c'"),
9809 register_prefix
, i
.op
[op
].regs
->reg_name
,
9810 insn_name (&i
.tm
), i
.suffix
);
9817 check_long_reg (void)
9821 for (op
= i
.operands
; --op
>= 0;)
9822 /* Skip non-register operands. */
9823 if (i
.types
[op
].bitfield
.class != Reg
)
9825 /* Reject eight bit registers, except where the template requires
9826 them. (eg. movzb) */
9827 else if (i
.types
[op
].bitfield
.byte
9828 && (i
.tm
.operand_types
[op
].bitfield
.class == Reg
9829 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9830 && (i
.tm
.operand_types
[op
].bitfield
.word
9831 || i
.tm
.operand_types
[op
].bitfield
.dword
))
9833 as_bad (_("`%s%s' not allowed with `%s%c'"),
9835 i
.op
[op
].regs
->reg_name
,
9840 /* Error if the e prefix on a general reg is missing, or if the r
9841 prefix on a general reg is present. */
9842 else if ((i
.types
[op
].bitfield
.word
9843 || i
.types
[op
].bitfield
.qword
)
9844 && (i
.tm
.operand_types
[op
].bitfield
.class == Reg
9845 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9846 && i
.tm
.operand_types
[op
].bitfield
.dword
)
9848 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
9849 register_prefix
, i
.op
[op
].regs
->reg_name
,
9857 check_qword_reg (void)
9861 for (op
= i
.operands
; --op
>= 0; )
9862 /* Skip non-register operands. */
9863 if (i
.types
[op
].bitfield
.class != Reg
)
9865 /* Reject eight bit registers, except where the template requires
9866 them. (eg. movzb) */
9867 else if (i
.types
[op
].bitfield
.byte
9868 && (i
.tm
.operand_types
[op
].bitfield
.class == Reg
9869 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9870 && (i
.tm
.operand_types
[op
].bitfield
.word
9871 || i
.tm
.operand_types
[op
].bitfield
.dword
9872 || i
.tm
.operand_types
[op
].bitfield
.qword
))
9874 as_bad (_("`%s%s' not allowed with `%s%c'"),
9876 i
.op
[op
].regs
->reg_name
,
9881 /* Error if the r prefix on a general reg is missing. */
9882 else if ((i
.types
[op
].bitfield
.word
9883 || i
.types
[op
].bitfield
.dword
)
9884 && (i
.tm
.operand_types
[op
].bitfield
.class == Reg
9885 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9886 && i
.tm
.operand_types
[op
].bitfield
.qword
)
9888 /* Prohibit these changes in the 64bit mode, since the
9889 lowering is more complicated. */
9890 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
9891 register_prefix
, i
.op
[op
].regs
->reg_name
, i
.suffix
);
9898 check_word_reg (void)
9901 for (op
= i
.operands
; --op
>= 0;)
9902 /* Skip non-register operands. */
9903 if (i
.types
[op
].bitfield
.class != Reg
)
9905 /* Reject eight bit registers, except where the template requires
9906 them. (eg. movzb) */
9907 else if (i
.types
[op
].bitfield
.byte
9908 && (i
.tm
.operand_types
[op
].bitfield
.class == Reg
9909 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9910 && (i
.tm
.operand_types
[op
].bitfield
.word
9911 || i
.tm
.operand_types
[op
].bitfield
.dword
))
9913 as_bad (_("`%s%s' not allowed with `%s%c'"),
9915 i
.op
[op
].regs
->reg_name
,
9920 /* Error if the e or r prefix on a general reg is present. */
9921 else if ((i
.types
[op
].bitfield
.dword
9922 || i
.types
[op
].bitfield
.qword
)
9923 && (i
.tm
.operand_types
[op
].bitfield
.class == Reg
9924 || i
.tm
.operand_types
[op
].bitfield
.instance
== Accum
)
9925 && i
.tm
.operand_types
[op
].bitfield
.word
)
9927 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
9928 register_prefix
, i
.op
[op
].regs
->reg_name
,
9936 update_imm (unsigned int j
)
9938 i386_operand_type overlap
= i
.types
[j
];
9940 if (i
.tm
.operand_types
[j
].bitfield
.imm8
9941 && i
.tm
.operand_types
[j
].bitfield
.imm8s
9942 && overlap
.bitfield
.imm8
&& overlap
.bitfield
.imm8s
)
9944 /* This combination is used on 8-bit immediates where e.g. $~0 is
9945 desirable to permit. We're past operand type matching, so simply
9946 put things back in the shape they were before introducing the
9947 distinction between Imm8, Imm8S, and Imm8|Imm8S. */
9948 overlap
.bitfield
.imm8s
= 0;
9951 if (overlap
.bitfield
.imm8
9952 + overlap
.bitfield
.imm8s
9953 + overlap
.bitfield
.imm16
9954 + overlap
.bitfield
.imm32
9955 + overlap
.bitfield
.imm32s
9956 + overlap
.bitfield
.imm64
> 1)
9958 static const i386_operand_type imm16
= { .bitfield
= { .imm16
= 1 } };
9959 static const i386_operand_type imm32
= { .bitfield
= { .imm32
= 1 } };
9960 static const i386_operand_type imm32s
= { .bitfield
= { .imm32s
= 1 } };
9961 static const i386_operand_type imm16_32
= { .bitfield
=
9962 { .imm16
= 1, .imm32
= 1 }
9964 static const i386_operand_type imm16_32s
= { .bitfield
=
9965 { .imm16
= 1, .imm32s
= 1 }
9967 static const i386_operand_type imm16_32_32s
= { .bitfield
=
9968 { .imm16
= 1, .imm32
= 1, .imm32s
= 1 }
9973 i386_operand_type temp
;
9975 operand_type_set (&temp
, 0);
9976 if (i
.suffix
== BYTE_MNEM_SUFFIX
)
9978 temp
.bitfield
.imm8
= overlap
.bitfield
.imm8
;
9979 temp
.bitfield
.imm8s
= overlap
.bitfield
.imm8s
;
9981 else if (i
.suffix
== WORD_MNEM_SUFFIX
)
9982 temp
.bitfield
.imm16
= overlap
.bitfield
.imm16
;
9983 else if (i
.suffix
== QWORD_MNEM_SUFFIX
)
9985 temp
.bitfield
.imm64
= overlap
.bitfield
.imm64
;
9986 temp
.bitfield
.imm32s
= overlap
.bitfield
.imm32s
;
9989 temp
.bitfield
.imm32
= overlap
.bitfield
.imm32
;
9992 else if (operand_type_equal (&overlap
, &imm16_32_32s
)
9993 || operand_type_equal (&overlap
, &imm16_32
)
9994 || operand_type_equal (&overlap
, &imm16_32s
))
9996 if ((flag_code
== CODE_16BIT
)
9997 ^ (i
.prefix
[DATA_PREFIX
] != 0 && !(i
.prefix
[REX_PREFIX
] & REX_W
)))
10002 else if (i
.prefix
[REX_PREFIX
] & REX_W
)
10003 overlap
= operand_type_and (overlap
, imm32s
);
10004 else if (i
.prefix
[DATA_PREFIX
])
10005 overlap
= operand_type_and (overlap
,
10006 flag_code
!= CODE_16BIT
? imm16
: imm32
);
10007 if (overlap
.bitfield
.imm8
10008 + overlap
.bitfield
.imm8s
10009 + overlap
.bitfield
.imm16
10010 + overlap
.bitfield
.imm32
10011 + overlap
.bitfield
.imm32s
10012 + overlap
.bitfield
.imm64
!= 1)
10014 as_bad (_("no instruction mnemonic suffix given; "
10015 "can't determine immediate size"));
10019 i
.types
[j
] = overlap
;
10025 finalize_imm (void)
10029 /* Update the first 2 immediate operands. */
10030 n
= i
.operands
> 2 ? 2 : i
.operands
;
10033 for (j
= 0; j
< n
; j
++)
10034 if (update_imm (j
) == 0)
10037 /* The 3rd operand can't be immediate operand. */
10038 gas_assert (operand_type_check (i
.types
[2], imm
) == 0);
10044 static INLINE
void set_rex_vrex (const reg_entry
*r
, unsigned int rex_bit
,
10047 if (r
->reg_flags
& RegRex
)
10049 if (i
.rex
& rex_bit
)
10050 as_bad (_("same type of prefix used twice"));
10053 else if (do_sse2avx
&& (i
.rex
& rex_bit
) && i
.vex
.register_specifier
)
10055 gas_assert (i
.vex
.register_specifier
== r
);
10056 i
.vex
.register_specifier
+= 8;
10059 if (r
->reg_flags
& RegVRex
)
10062 if (r
->reg_flags
& RegRex2
)
10067 set_rex_rex2 (const reg_entry
*r
, unsigned int rex_bit
)
10069 if ((r
->reg_flags
& RegRex
) != 0)
10071 if ((r
->reg_flags
& RegRex2
) != 0)
10076 process_operands (void)
10078 /* Default segment register this instruction will use for memory
10079 accesses. 0 means unknown. This is only for optimizing out
10080 unnecessary segment overrides. */
10081 const reg_entry
*default_seg
= NULL
;
10083 for (unsigned int j
= 0; j
< i
.operands
; j
++)
10084 if (i
.types
[j
].bitfield
.instance
!= InstanceNone
)
10087 if (i
.tm
.opcode_modifier
.sse2avx
)
10089 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
10090 need converting. */
10091 i
.rex
|= i
.prefix
[REX_PREFIX
] & (REX_W
| REX_R
| REX_X
| REX_B
);
10092 i
.prefix
[REX_PREFIX
] = 0;
10093 i
.rex_encoding
= 0;
10094 i
.rex2_encoding
= 0;
10096 /* ImmExt should be processed after SSE2AVX. */
10097 else if (i
.tm
.opcode_modifier
.immext
)
10100 /* TILEZERO is unusual in that it has a single operand encoded in ModR/M.reg,
10101 not ModR/M.rm. To avoid special casing this in build_modrm_byte(), fake a
10102 new destination operand here, while converting the source one to register
10104 if (i
.tm
.mnem_off
== MN_tilezero
)
10106 i
.op
[1].regs
= i
.op
[0].regs
;
10107 i
.op
[0].regs
-= i
.op
[0].regs
->reg_num
;
10108 i
.types
[1] = i
.types
[0];
10109 i
.tm
.operand_types
[1] = i
.tm
.operand_types
[0];
10110 i
.flags
[1] = i
.flags
[0];
10116 if (i
.tm
.opcode_modifier
.sse2avx
&& i
.tm
.opcode_modifier
.vexvvvv
)
10118 static const i386_operand_type regxmm
= {
10119 .bitfield
= { .class = RegSIMD
, .xmmword
= 1 }
10121 unsigned int dupl
= i
.operands
;
10122 unsigned int dest
= dupl
- 1;
10125 /* The destination must be an xmm register. */
10126 gas_assert (i
.reg_operands
10127 && MAX_OPERANDS
> dupl
10128 && operand_type_equal (&i
.types
[dest
], ®xmm
));
10130 if (i
.tm
.operand_types
[0].bitfield
.instance
== Accum
10131 && i
.tm
.operand_types
[0].bitfield
.xmmword
)
10133 /* Keep xmm0 for instructions with VEX prefix and 3
10135 i
.tm
.operand_types
[0].bitfield
.instance
= InstanceNone
;
10136 i
.tm
.operand_types
[0].bitfield
.class = RegSIMD
;
10141 if (i
.tm
.opcode_modifier
.operandconstraint
== IMPLICIT_1ST_XMM0
)
10143 gas_assert ((MAX_OPERANDS
- 1) > dupl
);
10145 /* Add the implicit xmm0 for instructions with VEX prefix
10147 for (j
= i
.operands
; j
> 0; j
--)
10149 i
.op
[j
] = i
.op
[j
- 1];
10150 i
.types
[j
] = i
.types
[j
- 1];
10151 i
.tm
.operand_types
[j
] = i
.tm
.operand_types
[j
- 1];
10152 i
.flags
[j
] = i
.flags
[j
- 1];
10155 = (const reg_entry
*) str_hash_find (reg_hash
, "xmm0");
10156 i
.types
[0] = regxmm
;
10157 i
.tm
.operand_types
[0] = regxmm
;
10160 i
.reg_operands
+= 2;
10161 i
.tm
.operands
+= 2;
10165 i
.op
[dupl
] = i
.op
[dest
];
10166 i
.types
[dupl
] = i
.types
[dest
];
10167 i
.tm
.operand_types
[dupl
] = i
.tm
.operand_types
[dest
];
10168 i
.flags
[dupl
] = i
.flags
[dest
];
10177 i
.op
[dupl
] = i
.op
[dest
];
10178 i
.types
[dupl
] = i
.types
[dest
];
10179 i
.tm
.operand_types
[dupl
] = i
.tm
.operand_types
[dest
];
10180 i
.flags
[dupl
] = i
.flags
[dest
];
10183 if (i
.tm
.opcode_modifier
.immext
)
10186 else if (i
.tm
.operand_types
[0].bitfield
.instance
== Accum
10187 && i
.tm
.opcode_modifier
.modrm
)
10191 for (j
= 1; j
< i
.operands
; j
++)
10193 i
.op
[j
- 1] = i
.op
[j
];
10194 i
.types
[j
- 1] = i
.types
[j
];
10196 /* We need to adjust fields in i.tm since they are used by
10197 build_modrm_byte. */
10198 i
.tm
.operand_types
[j
- 1] = i
.tm
.operand_types
[j
];
10200 i
.flags
[j
- 1] = i
.flags
[j
];
10203 /* No adjustment to i.reg_operands: This was already done at the top
10204 of the function. */
10208 else if (i
.tm
.opcode_modifier
.operandconstraint
== IMPLICIT_QUAD_GROUP
)
10210 unsigned int regnum
, first_reg_in_group
, last_reg_in_group
;
10212 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
10213 gas_assert (i
.operands
>= 2 && i
.types
[1].bitfield
.class == RegSIMD
);
10214 regnum
= register_number (i
.op
[1].regs
);
10215 first_reg_in_group
= regnum
& ~3;
10216 last_reg_in_group
= first_reg_in_group
+ 3;
10217 if (regnum
!= first_reg_in_group
)
10218 as_warn (_("source register `%s%s' implicitly denotes"
10219 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
10220 register_prefix
, i
.op
[1].regs
->reg_name
,
10221 register_prefix
, i
.op
[1].regs
->reg_name
, first_reg_in_group
,
10222 register_prefix
, i
.op
[1].regs
->reg_name
, last_reg_in_group
,
10223 insn_name (&i
.tm
));
10225 else if (i
.tm
.opcode_modifier
.operandconstraint
== REG_KLUDGE
)
10227 /* The imul $imm, %reg instruction is converted into
10228 imul $imm, %reg, %reg, and the clr %reg instruction
10229 is converted into xor %reg, %reg. */
10231 unsigned int first_reg_op
;
10233 if (operand_type_check (i
.types
[0], reg
))
10237 /* Pretend we saw the extra register operand. */
10238 gas_assert (i
.reg_operands
== 1
10239 && i
.op
[first_reg_op
+ 1].regs
== 0);
10240 i
.op
[first_reg_op
+ 1].regs
= i
.op
[first_reg_op
].regs
;
10241 i
.types
[first_reg_op
+ 1] = i
.types
[first_reg_op
];
10246 if (i
.tm
.opcode_modifier
.modrm
)
10248 /* The opcode is completed (modulo i.tm.extension_opcode which
10249 must be put into the modrm byte). Now, we make the modrm and
10250 index base bytes based on all the info we've collected. */
10252 default_seg
= build_modrm_byte ();
10254 if (!quiet_warnings
&& i
.tm
.opcode_modifier
.operandconstraint
== UGH
)
10256 /* Warn about some common errors, but press on regardless. */
10257 if (i
.operands
== 2)
10259 /* Reversed arguments on faddp or fmulp. */
10260 as_warn (_("translating to `%s %s%s,%s%s'"), insn_name (&i
.tm
),
10261 register_prefix
, i
.op
[!intel_syntax
].regs
->reg_name
,
10262 register_prefix
, i
.op
[intel_syntax
].regs
->reg_name
);
10264 else if (i
.tm
.opcode_modifier
.mnemonicsize
== IGNORESIZE
)
10266 /* Extraneous `l' suffix on fp insn. */
10267 as_warn (_("translating to `%s %s%s'"), insn_name (&i
.tm
),
10268 register_prefix
, i
.op
[0].regs
->reg_name
);
10272 else if (i
.types
[0].bitfield
.class == SReg
&& !dot_insn ())
10274 if (flag_code
!= CODE_64BIT
10275 ? i
.tm
.base_opcode
== POP_SEG_SHORT
10276 && i
.op
[0].regs
->reg_num
== 1
10277 : (i
.tm
.base_opcode
| 1) == (POP_SEG386_SHORT
& 0xff)
10278 && i
.op
[0].regs
->reg_num
< 4)
10280 as_bad (_("you can't `%s %s%s'"),
10281 insn_name (&i
.tm
), register_prefix
, i
.op
[0].regs
->reg_name
);
10284 if (i
.op
[0].regs
->reg_num
> 3
10285 && i
.tm
.opcode_space
== SPACE_BASE
)
10287 i
.tm
.base_opcode
^= (POP_SEG_SHORT
^ POP_SEG386_SHORT
) & 0xff;
10288 i
.tm
.opcode_space
= SPACE_0F
;
10290 i
.tm
.base_opcode
|= (i
.op
[0].regs
->reg_num
<< 3);
10292 else if (i
.tm
.opcode_space
== SPACE_BASE
10293 && (i
.tm
.base_opcode
& ~3) == MOV_AX_DISP32
)
10295 default_seg
= reg_ds
;
10297 else if (i
.tm
.opcode_modifier
.isstring
)
10299 /* For the string instructions that allow a segment override
10300 on one of their operands, the default segment is ds. */
10301 default_seg
= reg_ds
;
10303 else if (i
.short_form
)
10305 /* The register operand is in the 1st or 2nd non-immediate operand. */
10306 const reg_entry
*r
= i
.op
[i
.imm_operands
].regs
;
10309 && r
->reg_type
.bitfield
.instance
== Accum
10310 && i
.op
[i
.imm_operands
+ 1].regs
)
10311 r
= i
.op
[i
.imm_operands
+ 1].regs
;
10312 /* Register goes in low 3 bits of opcode. */
10313 i
.tm
.base_opcode
|= r
->reg_num
;
10314 set_rex_vrex (r
, REX_B
, false);
10316 if (dot_insn () && i
.reg_operands
== 2)
10318 gas_assert (is_any_vex_encoding (&i
.tm
)
10319 || i
.encoding
!= encoding_default
);
10320 i
.vex
.register_specifier
= i
.op
[i
.operands
- 1].regs
;
10323 else if (i
.reg_operands
== 1
10324 && !i
.flags
[i
.operands
- 1]
10325 && i
.tm
.operand_types
[i
.operands
- 1].bitfield
.instance
10328 gas_assert (is_any_vex_encoding (&i
.tm
)
10329 || i
.encoding
!= encoding_default
);
10330 i
.vex
.register_specifier
= i
.op
[i
.operands
- 1].regs
;
10333 if ((i
.seg
[0] || i
.prefix
[SEG_PREFIX
])
10334 && i
.tm
.mnem_off
== MN_lea
)
10336 if (!quiet_warnings
)
10337 as_warn (_("segment override on `%s' is ineffectual"), insn_name (&i
.tm
));
10338 if (optimize
&& !i
.no_optimize
)
10341 i
.prefix
[SEG_PREFIX
] = 0;
10345 /* If a segment was explicitly specified, and the specified segment
10346 is neither the default nor the one already recorded from a prefix,
10347 use an opcode prefix to select it. If we never figured out what
10348 the default segment is, then default_seg will be zero at this
10349 point, and the specified segment prefix will always be used. */
10351 && i
.seg
[0] != default_seg
10352 && i386_seg_prefixes
[i
.seg
[0]->reg_num
] != i
.prefix
[SEG_PREFIX
])
10354 if (!add_prefix (i386_seg_prefixes
[i
.seg
[0]->reg_num
]))
10360 static const reg_entry
*
10361 build_modrm_byte (void)
10363 const reg_entry
*default_seg
= NULL
;
10364 unsigned int source
= i
.imm_operands
- i
.tm
.opcode_modifier
.immext
10365 /* Compensate for kludge in md_assemble(). */
10366 + i
.tm
.operand_types
[0].bitfield
.imm1
;
10367 unsigned int dest
= i
.operands
- 1 - i
.tm
.opcode_modifier
.immext
;
10368 unsigned int v
, op
, reg_slot
;
10370 /* Accumulator (in particular %st), shift count (%cl), and alike need
10371 to be skipped just like immediate operands do. */
10372 if (i
.tm
.operand_types
[source
].bitfield
.instance
)
10374 while (i
.tm
.operand_types
[dest
].bitfield
.instance
)
10377 for (op
= source
; op
< i
.operands
; ++op
)
10378 if (i
.tm
.operand_types
[op
].bitfield
.baseindex
)
10381 if (i
.reg_operands
+ i
.mem_operands
+ (i
.tm
.extension_opcode
!= None
) == 4)
10385 /* There are 2 kinds of instructions:
10386 1. 5 operands: 4 register operands or 3 register operands
10387 plus 1 memory operand plus one Imm4 operand, VexXDS, and
10388 VexW0 or VexW1. The destination must be either XMM, YMM or
10390 2. 4 operands: 4 register operands or 3 register operands
10391 plus 1 memory operand, with VexXDS.
10392 3. Other equivalent combinations when coming from s_insn(). */
10393 gas_assert (i
.tm
.opcode_modifier
.vexvvvv
10394 && i
.tm
.opcode_modifier
.vexw
);
10395 gas_assert (dot_insn ()
10396 || i
.tm
.operand_types
[dest
].bitfield
.class == RegSIMD
);
10398 /* Of the first two non-immediate operands the one with the template
10399 not allowing for a memory one is encoded in the immediate operand. */
10401 reg_slot
= source
+ 1;
10403 reg_slot
= source
++;
10407 gas_assert (i
.tm
.operand_types
[reg_slot
].bitfield
.class == RegSIMD
);
10408 gas_assert (!(i
.op
[reg_slot
].regs
->reg_flags
& RegVRex
));
10411 gas_assert (i
.tm
.operand_types
[reg_slot
].bitfield
.class != ClassNone
);
10413 if (i
.imm_operands
== 0)
10415 /* When there is no immediate operand, generate an 8bit
10416 immediate operand to encode the first operand. */
10417 exp
= &im_expressions
[i
.imm_operands
++];
10418 i
.op
[i
.operands
].imms
= exp
;
10419 i
.types
[i
.operands
].bitfield
.imm8
= 1;
10422 exp
->X_op
= O_constant
;
10426 gas_assert (i
.imm_operands
== 1);
10427 gas_assert (fits_in_imm4 (i
.op
[0].imms
->X_add_number
));
10428 gas_assert (!i
.tm
.opcode_modifier
.immext
);
10430 /* Turn on Imm8 again so that output_imm will generate it. */
10431 i
.types
[0].bitfield
.imm8
= 1;
10433 exp
= i
.op
[0].imms
;
10435 exp
->X_add_number
|= register_number (i
.op
[reg_slot
].regs
)
10436 << (3 + !(i
.tm
.opcode_modifier
.evex
10437 || i
.encoding
== encoding_evex
));
10440 switch (i
.tm
.opcode_modifier
.vexvvvv
)
10442 /* VEX.vvvv encodes the last source register operand. */
10449 /* For vprot*, vpshl*, and vpsha*, XOP.W controls the swapping of src1
10450 and src2, and it requires fall through when the operands are swapped.
10452 /* Fall through. */
10453 /* VEX.vvvv encodes the first source register operand. */
10457 /* VEX.vvvv encodes the destination register operand. */
10466 if (dest
== source
)
10469 gas_assert (source
< dest
);
10471 if (v
< MAX_OPERANDS
)
10473 gas_assert (i
.tm
.opcode_modifier
.vexvvvv
);
10474 i
.vex
.register_specifier
= i
.op
[v
].regs
;
10477 if (op
< i
.operands
)
10479 if (i
.mem_operands
)
10481 unsigned int fake_zero_displacement
= 0;
10483 gas_assert (i
.flags
[op
] & Operand_Mem
);
10485 if (i
.tm
.opcode_modifier
.sib
)
10487 /* The index register of VSIB shouldn't be RegIZ. */
10488 if (i
.tm
.opcode_modifier
.sib
!= SIBMEM
10489 && i
.index_reg
->reg_num
== RegIZ
)
10492 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
10495 i
.sib
.base
= NO_BASE_REGISTER
;
10496 i
.sib
.scale
= i
.log2_scale_factor
;
10497 i
.types
[op
] = operand_type_and_not (i
.types
[op
], anydisp
);
10498 i
.types
[op
].bitfield
.disp32
= 1;
10501 /* Since the mandatory SIB always has index register, so
10502 the code logic remains unchanged. The non-mandatory SIB
10503 without index register is allowed and will be handled
10507 if (i
.index_reg
->reg_num
== RegIZ
)
10508 i
.sib
.index
= NO_INDEX_REGISTER
;
10510 i
.sib
.index
= i
.index_reg
->reg_num
;
10511 set_rex_vrex (i
.index_reg
, REX_X
, false);
10515 default_seg
= reg_ds
;
10517 if (i
.base_reg
== 0)
10520 if (!i
.disp_operands
)
10521 fake_zero_displacement
= 1;
10522 if (i
.index_reg
== 0)
10524 /* Both check for VSIB and mandatory non-vector SIB. */
10525 gas_assert (!i
.tm
.opcode_modifier
.sib
10526 || i
.tm
.opcode_modifier
.sib
== SIBMEM
);
10527 /* Operand is just <disp> */
10528 i
.types
[op
] = operand_type_and_not (i
.types
[op
], anydisp
);
10529 if (flag_code
== CODE_64BIT
)
10531 /* 64bit mode overwrites the 32bit absolute
10532 addressing by RIP relative addressing and
10533 absolute addressing is encoded by one of the
10534 redundant SIB forms. */
10535 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
10536 i
.sib
.base
= NO_BASE_REGISTER
;
10537 i
.sib
.index
= NO_INDEX_REGISTER
;
10538 i
.types
[op
].bitfield
.disp32
= 1;
10540 else if ((flag_code
== CODE_16BIT
)
10541 ^ (i
.prefix
[ADDR_PREFIX
] != 0))
10543 i
.rm
.regmem
= NO_BASE_REGISTER_16
;
10544 i
.types
[op
].bitfield
.disp16
= 1;
10548 i
.rm
.regmem
= NO_BASE_REGISTER
;
10549 i
.types
[op
].bitfield
.disp32
= 1;
10552 else if (!i
.tm
.opcode_modifier
.sib
)
10554 /* !i.base_reg && i.index_reg */
10555 if (i
.index_reg
->reg_num
== RegIZ
)
10556 i
.sib
.index
= NO_INDEX_REGISTER
;
10558 i
.sib
.index
= i
.index_reg
->reg_num
;
10559 i
.sib
.base
= NO_BASE_REGISTER
;
10560 i
.sib
.scale
= i
.log2_scale_factor
;
10561 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
10562 i
.types
[op
] = operand_type_and_not (i
.types
[op
], anydisp
);
10563 i
.types
[op
].bitfield
.disp32
= 1;
10564 set_rex_rex2 (i
.index_reg
, REX_X
);
10567 /* RIP addressing for 64bit mode. */
10568 else if (i
.base_reg
->reg_num
== RegIP
)
10570 gas_assert (!i
.tm
.opcode_modifier
.sib
);
10571 i
.rm
.regmem
= NO_BASE_REGISTER
;
10572 i
.types
[op
].bitfield
.disp8
= 0;
10573 i
.types
[op
].bitfield
.disp16
= 0;
10574 i
.types
[op
].bitfield
.disp32
= 1;
10575 i
.types
[op
].bitfield
.disp64
= 0;
10576 i
.flags
[op
] |= Operand_PCrel
;
10577 if (! i
.disp_operands
)
10578 fake_zero_displacement
= 1;
10580 else if (i
.base_reg
->reg_type
.bitfield
.word
)
10582 gas_assert (!i
.tm
.opcode_modifier
.sib
);
10583 switch (i
.base_reg
->reg_num
)
10585 case 3: /* (%bx) */
10586 if (i
.index_reg
== 0)
10588 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
10589 i
.rm
.regmem
= i
.index_reg
->reg_num
- 6;
10591 case 5: /* (%bp) */
10592 default_seg
= reg_ss
;
10593 if (i
.index_reg
== 0)
10596 if (operand_type_check (i
.types
[op
], disp
) == 0)
10598 /* fake (%bp) into 0(%bp) */
10599 if (i
.disp_encoding
== disp_encoding_16bit
)
10600 i
.types
[op
].bitfield
.disp16
= 1;
10602 i
.types
[op
].bitfield
.disp8
= 1;
10603 fake_zero_displacement
= 1;
10606 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
10607 i
.rm
.regmem
= i
.index_reg
->reg_num
- 6 + 2;
10609 default: /* (%si) -> 4 or (%di) -> 5 */
10610 i
.rm
.regmem
= i
.base_reg
->reg_num
- 6 + 4;
10612 if (!fake_zero_displacement
10613 && !i
.disp_operands
10614 && i
.disp_encoding
)
10616 fake_zero_displacement
= 1;
10617 if (i
.disp_encoding
== disp_encoding_8bit
)
10618 i
.types
[op
].bitfield
.disp8
= 1;
10620 i
.types
[op
].bitfield
.disp16
= 1;
10622 i
.rm
.mode
= mode_from_disp_size (i
.types
[op
]);
10624 else /* i.base_reg and 32/64 bit mode */
10626 if (operand_type_check (i
.types
[op
], disp
))
10628 i
.types
[op
].bitfield
.disp16
= 0;
10629 i
.types
[op
].bitfield
.disp64
= 0;
10630 i
.types
[op
].bitfield
.disp32
= 1;
10633 if (!i
.tm
.opcode_modifier
.sib
)
10634 i
.rm
.regmem
= i
.base_reg
->reg_num
;
10635 set_rex_rex2 (i
.base_reg
, REX_B
);
10636 i
.sib
.base
= i
.base_reg
->reg_num
;
10637 /* x86-64 ignores REX prefix bit here to avoid decoder
10639 if (!(i
.base_reg
->reg_flags
& RegRex
)
10640 && (i
.base_reg
->reg_num
== EBP_REG_NUM
10641 || i
.base_reg
->reg_num
== ESP_REG_NUM
))
10642 default_seg
= reg_ss
;
10643 if (i
.base_reg
->reg_num
== 5 && i
.disp_operands
== 0)
10645 fake_zero_displacement
= 1;
10646 if (i
.disp_encoding
== disp_encoding_32bit
)
10647 i
.types
[op
].bitfield
.disp32
= 1;
10649 i
.types
[op
].bitfield
.disp8
= 1;
10651 i
.sib
.scale
= i
.log2_scale_factor
;
10652 if (i
.index_reg
== 0)
10654 /* Only check for VSIB. */
10655 gas_assert (i
.tm
.opcode_modifier
.sib
!= VECSIB128
10656 && i
.tm
.opcode_modifier
.sib
!= VECSIB256
10657 && i
.tm
.opcode_modifier
.sib
!= VECSIB512
);
10659 /* <disp>(%esp) becomes two byte modrm with no index
10660 register. We've already stored the code for esp
10661 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
10662 Any base register besides %esp will not use the
10663 extra modrm byte. */
10664 i
.sib
.index
= NO_INDEX_REGISTER
;
10666 else if (!i
.tm
.opcode_modifier
.sib
)
10668 if (i
.index_reg
->reg_num
== RegIZ
)
10669 i
.sib
.index
= NO_INDEX_REGISTER
;
10671 i
.sib
.index
= i
.index_reg
->reg_num
;
10672 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
10673 set_rex_rex2 (i
.index_reg
, REX_X
);
10676 if (i
.disp_operands
10677 && (i
.reloc
[op
] == BFD_RELOC_386_TLS_DESC_CALL
10678 || i
.reloc
[op
] == BFD_RELOC_X86_64_TLSDESC_CALL
))
10682 if (!fake_zero_displacement
10683 && !i
.disp_operands
10684 && i
.disp_encoding
)
10686 fake_zero_displacement
= 1;
10687 if (i
.disp_encoding
== disp_encoding_8bit
)
10688 i
.types
[op
].bitfield
.disp8
= 1;
10690 i
.types
[op
].bitfield
.disp32
= 1;
10692 i
.rm
.mode
= mode_from_disp_size (i
.types
[op
]);
10696 if (fake_zero_displacement
)
10698 /* Fakes a zero displacement assuming that i.types[op]
10699 holds the correct displacement size. */
10702 gas_assert (i
.op
[op
].disps
== 0);
10703 exp
= &disp_expressions
[i
.disp_operands
++];
10704 i
.op
[op
].disps
= exp
;
10705 exp
->X_op
= O_constant
;
10706 exp
->X_add_number
= 0;
10707 exp
->X_add_symbol
= (symbolS
*) 0;
10708 exp
->X_op_symbol
= (symbolS
*) 0;
10714 i
.rm
.regmem
= i
.op
[op
].regs
->reg_num
;
10715 set_rex_vrex (i
.op
[op
].regs
, REX_B
, false);
10726 if (!i
.tm
.opcode_modifier
.regmem
)
10728 gas_assert (source
< MAX_OPERANDS
);
10729 i
.rm
.regmem
= i
.op
[source
].regs
->reg_num
;
10730 set_rex_vrex (i
.op
[source
].regs
, REX_B
,
10731 dest
>= MAX_OPERANDS
&& i
.tm
.opcode_modifier
.sse2avx
);
10736 gas_assert (dest
< MAX_OPERANDS
);
10737 i
.rm
.regmem
= i
.op
[dest
].regs
->reg_num
;
10738 set_rex_vrex (i
.op
[dest
].regs
, REX_B
, i
.tm
.opcode_modifier
.sse2avx
);
10743 /* Fill in i.rm.reg field with extension opcode (if any) or the
10744 appropriate register. */
10745 if (i
.tm
.extension_opcode
!= None
)
10746 i
.rm
.reg
= i
.tm
.extension_opcode
;
10747 else if (!i
.tm
.opcode_modifier
.regmem
&& dest
< MAX_OPERANDS
)
10749 i
.rm
.reg
= i
.op
[dest
].regs
->reg_num
;
10750 set_rex_vrex (i
.op
[dest
].regs
, REX_R
, i
.tm
.opcode_modifier
.sse2avx
);
10754 gas_assert (source
< MAX_OPERANDS
);
10755 i
.rm
.reg
= i
.op
[source
].regs
->reg_num
;
10756 set_rex_vrex (i
.op
[source
].regs
, REX_R
, false);
10759 if (flag_code
!= CODE_64BIT
&& (i
.rex
& REX_R
))
10761 gas_assert (i
.types
[!i
.tm
.opcode_modifier
.regmem
].bitfield
.class == RegCR
);
10763 add_prefix (LOCK_PREFIX_OPCODE
);
10766 return default_seg
;
10770 frag_opcode_byte (unsigned char byte
)
10772 if (now_seg
!= absolute_section
)
10773 FRAG_APPEND_1_CHAR (byte
);
10775 ++abs_section_offset
;
10778 static unsigned int
10779 flip_code16 (unsigned int code16
)
10781 gas_assert (i
.tm
.operands
== 1);
10783 return !(i
.prefix
[REX_PREFIX
] & REX_W
)
10784 && (code16
? i
.tm
.operand_types
[0].bitfield
.disp32
10785 : i
.tm
.operand_types
[0].bitfield
.disp16
)
10790 output_branch (void)
10796 relax_substateT subtype
;
10800 if (now_seg
== absolute_section
)
10802 as_bad (_("relaxable branches not supported in absolute section"));
10806 code16
= flag_code
== CODE_16BIT
? CODE16
: 0;
10807 size
= i
.disp_encoding
> disp_encoding_8bit
? BIG
: SMALL
;
10810 if (i
.prefix
[DATA_PREFIX
] != 0)
10814 code16
^= flip_code16(code16
);
10816 /* Pentium4 branch hints. */
10817 if (i
.prefix
[SEG_PREFIX
] == CS_PREFIX_OPCODE
/* not taken */
10818 || i
.prefix
[SEG_PREFIX
] == DS_PREFIX_OPCODE
/* taken */)
10823 if (i
.prefix
[REX_PREFIX
] != 0)
10829 /* BND prefixed jump. */
10830 if (i
.prefix
[BND_PREFIX
] != 0)
10836 if (i
.prefixes
!= 0)
10837 as_warn (_("skipping prefixes on `%s'"), insn_name (&i
.tm
));
10839 /* It's always a symbol; End frag & setup for relax.
10840 Make sure there is enough room in this frag for the largest
10841 instruction we may generate in md_convert_frag. This is 2
10842 bytes for the opcode and room for the prefix and largest
10844 frag_grow (prefix
+ 2 + 4);
10845 /* Prefix and 1 opcode byte go in fr_fix. */
10846 p
= frag_more (prefix
+ 1);
10847 if (i
.prefix
[DATA_PREFIX
] != 0)
10848 *p
++ = DATA_PREFIX_OPCODE
;
10849 if (i
.prefix
[SEG_PREFIX
] == CS_PREFIX_OPCODE
10850 || i
.prefix
[SEG_PREFIX
] == DS_PREFIX_OPCODE
)
10851 *p
++ = i
.prefix
[SEG_PREFIX
];
10852 if (i
.prefix
[BND_PREFIX
] != 0)
10853 *p
++ = BND_PREFIX_OPCODE
;
10854 if (i
.prefix
[REX_PREFIX
] != 0)
10855 *p
++ = i
.prefix
[REX_PREFIX
];
10856 *p
= i
.tm
.base_opcode
;
10858 if ((unsigned char) *p
== JUMP_PC_RELATIVE
)
10859 subtype
= ENCODE_RELAX_STATE (UNCOND_JUMP
, size
);
10860 else if (cpu_arch_flags
.bitfield
.cpui386
)
10861 subtype
= ENCODE_RELAX_STATE (COND_JUMP
, size
);
10863 subtype
= ENCODE_RELAX_STATE (COND_JUMP86
, size
);
10866 sym
= i
.op
[0].disps
->X_add_symbol
;
10867 off
= i
.op
[0].disps
->X_add_number
;
10869 if (i
.op
[0].disps
->X_op
!= O_constant
10870 && i
.op
[0].disps
->X_op
!= O_symbol
)
10872 /* Handle complex expressions. */
10873 sym
= make_expr_symbol (i
.op
[0].disps
);
10877 /* 1 possible extra opcode + 4 byte displacement go in var part.
10878 Pass reloc in fr_var. */
10879 frag_var (rs_machine_dependent
, 5, i
.reloc
[0], subtype
, sym
, off
, p
);
10882 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10883 /* Return TRUE iff PLT32 relocation should be used for branching to
10887 need_plt32_p (symbolS
*s
)
10889 /* PLT32 relocation is ELF only. */
10894 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
10895 krtld support it. */
10899 /* Since there is no need to prepare for PLT branch on x86-64, we
10900 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
10901 be used as a marker for 32-bit PC-relative branches. */
10908 /* Weak or undefined symbol need PLT32 relocation. */
10909 if (S_IS_WEAK (s
) || !S_IS_DEFINED (s
))
10912 /* Non-global symbol doesn't need PLT32 relocation. */
10913 if (! S_IS_EXTERNAL (s
))
10916 /* Other global symbols need PLT32 relocation. NB: Symbol with
10917 non-default visibilities are treated as normal global symbol
10918 so that PLT32 relocation can be used as a marker for 32-bit
10919 PC-relative branches. It is useful for linker relaxation. */
10930 bfd_reloc_code_real_type jump_reloc
= i
.reloc
[0];
10932 if (i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
)
10934 /* This is a loop or jecxz type instruction. */
10936 if (i
.prefix
[ADDR_PREFIX
] != 0)
10938 frag_opcode_byte (ADDR_PREFIX_OPCODE
);
10941 /* Pentium4 branch hints. */
10942 if (i
.prefix
[SEG_PREFIX
] == CS_PREFIX_OPCODE
/* not taken */
10943 || i
.prefix
[SEG_PREFIX
] == DS_PREFIX_OPCODE
/* taken */)
10945 frag_opcode_byte (i
.prefix
[SEG_PREFIX
]);
10954 if (flag_code
== CODE_16BIT
)
10957 if (i
.prefix
[DATA_PREFIX
] != 0)
10959 frag_opcode_byte (DATA_PREFIX_OPCODE
);
10961 code16
^= flip_code16(code16
);
10969 /* BND prefixed jump. */
10970 if (i
.prefix
[BND_PREFIX
] != 0)
10972 frag_opcode_byte (i
.prefix
[BND_PREFIX
]);
10976 if (i
.prefix
[REX_PREFIX
] != 0)
10978 frag_opcode_byte (i
.prefix
[REX_PREFIX
]);
10982 if (i
.prefixes
!= 0)
10983 as_warn (_("skipping prefixes on `%s'"), insn_name (&i
.tm
));
10985 if (now_seg
== absolute_section
)
10987 abs_section_offset
+= i
.opcode_length
+ size
;
10991 p
= frag_more (i
.opcode_length
+ size
);
10992 switch (i
.opcode_length
)
10995 *p
++ = i
.tm
.base_opcode
>> 8;
10996 /* Fall through. */
10998 *p
++ = i
.tm
.base_opcode
;
11004 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11005 if (flag_code
== CODE_64BIT
&& size
== 4
11006 && jump_reloc
== NO_RELOC
&& i
.op
[0].disps
->X_add_number
== 0
11007 && need_plt32_p (i
.op
[0].disps
->X_add_symbol
))
11008 jump_reloc
= BFD_RELOC_X86_64_PLT32
;
11011 jump_reloc
= reloc (size
, 1, 1, jump_reloc
);
11013 fixP
= fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
11014 i
.op
[0].disps
, 1, jump_reloc
);
11016 /* All jumps handled here are signed, but don't unconditionally use a
11017 signed limit check for 32 and 16 bit jumps as we want to allow wrap
11018 around at 4G (outside of 64-bit mode) and 64k (except for XBEGIN)
11023 fixP
->fx_signed
= 1;
11027 if (i
.tm
.mnem_off
== MN_xbegin
)
11028 fixP
->fx_signed
= 1;
11032 if (flag_code
== CODE_64BIT
)
11033 fixP
->fx_signed
= 1;
11039 output_interseg_jump (void)
11047 if (flag_code
== CODE_16BIT
)
11051 if (i
.prefix
[DATA_PREFIX
] != 0)
11058 gas_assert (!i
.prefix
[REX_PREFIX
]);
11064 if (i
.prefixes
!= 0)
11065 as_warn (_("skipping prefixes on `%s'"), insn_name (&i
.tm
));
11067 if (now_seg
== absolute_section
)
11069 abs_section_offset
+= prefix
+ 1 + 2 + size
;
11073 /* 1 opcode; 2 segment; offset */
11074 p
= frag_more (prefix
+ 1 + 2 + size
);
11076 if (i
.prefix
[DATA_PREFIX
] != 0)
11077 *p
++ = DATA_PREFIX_OPCODE
;
11079 if (i
.prefix
[REX_PREFIX
] != 0)
11080 *p
++ = i
.prefix
[REX_PREFIX
];
11082 *p
++ = i
.tm
.base_opcode
;
11083 if (i
.op
[1].imms
->X_op
== O_constant
)
11085 offsetT n
= i
.op
[1].imms
->X_add_number
;
11088 && !fits_in_unsigned_word (n
)
11089 && !fits_in_signed_word (n
))
11091 as_bad (_("16-bit jump out of range"));
11094 md_number_to_chars (p
, n
, size
);
11097 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
11098 i
.op
[1].imms
, 0, reloc (size
, 0, 0, i
.reloc
[1]));
11101 if (i
.op
[0].imms
->X_op
== O_constant
)
11102 md_number_to_chars (p
, (valueT
) i
.op
[0].imms
->X_add_number
, 2);
11104 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 2,
11105 i
.op
[0].imms
, 0, reloc (2, 0, 0, i
.reloc
[0]));
11108 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11113 asection
*seg
= now_seg
;
11114 subsegT subseg
= now_subseg
;
11116 unsigned int alignment
, align_size_1
;
11117 unsigned int isa_1_descsz
, feature_2_descsz
, descsz
;
11118 unsigned int isa_1_descsz_raw
, feature_2_descsz_raw
;
11119 unsigned int padding
;
11121 if (!IS_ELF
|| !x86_used_note
)
11124 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_X86
;
11126 /* The .note.gnu.property section layout:
11128 Field Length Contents
11131 n_descsz 4 The note descriptor size
11132 n_type 4 NT_GNU_PROPERTY_TYPE_0
11134 n_desc n_descsz The program property array
11138 /* Create the .note.gnu.property section. */
11139 sec
= subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME
, 0);
11140 bfd_set_section_flags (sec
,
11147 if (get_elf_backend_data (stdoutput
)->s
->elfclass
== ELFCLASS64
)
11158 bfd_set_section_alignment (sec
, alignment
);
11159 elf_section_type (sec
) = SHT_NOTE
;
11161 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
11163 isa_1_descsz_raw
= 4 + 4 + 4;
11164 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
11165 isa_1_descsz
= (isa_1_descsz_raw
+ align_size_1
) & ~align_size_1
;
11167 feature_2_descsz_raw
= isa_1_descsz
;
11168 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
11170 feature_2_descsz_raw
+= 4 + 4 + 4;
11171 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
11172 feature_2_descsz
= ((feature_2_descsz_raw
+ align_size_1
)
11175 descsz
= feature_2_descsz
;
11176 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
11177 p
= frag_more (4 + 4 + 4 + 4 + descsz
);
11179 /* Write n_namsz. */
11180 md_number_to_chars (p
, (valueT
) 4, 4);
11182 /* Write n_descsz. */
11183 md_number_to_chars (p
+ 4, (valueT
) descsz
, 4);
11185 /* Write n_type. */
11186 md_number_to_chars (p
+ 4 * 2, (valueT
) NT_GNU_PROPERTY_TYPE_0
, 4);
11188 /* Write n_name. */
11189 memcpy (p
+ 4 * 3, "GNU", 4);
11191 /* Write 4-byte type. */
11192 md_number_to_chars (p
+ 4 * 4,
11193 (valueT
) GNU_PROPERTY_X86_ISA_1_USED
, 4);
11195 /* Write 4-byte data size. */
11196 md_number_to_chars (p
+ 4 * 5, (valueT
) 4, 4);
11198 /* Write 4-byte data. */
11199 md_number_to_chars (p
+ 4 * 6, (valueT
) x86_isa_1_used
, 4);
11201 /* Zero out paddings. */
11202 padding
= isa_1_descsz
- isa_1_descsz_raw
;
11204 memset (p
+ 4 * 7, 0, padding
);
11206 /* Write 4-byte type. */
11207 md_number_to_chars (p
+ isa_1_descsz
+ 4 * 4,
11208 (valueT
) GNU_PROPERTY_X86_FEATURE_2_USED
, 4);
11210 /* Write 4-byte data size. */
11211 md_number_to_chars (p
+ isa_1_descsz
+ 4 * 5, (valueT
) 4, 4);
11213 /* Write 4-byte data. */
11214 md_number_to_chars (p
+ isa_1_descsz
+ 4 * 6,
11215 (valueT
) x86_feature_2_used
, 4);
11217 /* Zero out paddings. */
11218 padding
= feature_2_descsz
- feature_2_descsz_raw
;
11220 memset (p
+ isa_1_descsz
+ 4 * 7, 0, padding
);
11222 /* We probably can't restore the current segment, for there likely
11223 isn't one yet... */
11225 subseg_set (seg
, subseg
);
11229 x86_support_sframe_p (void)
11231 /* At this time, SFrame stack trace is supported for AMD64 ABI only. */
11232 return (x86_elf_abi
== X86_64_ABI
);
11236 x86_sframe_ra_tracking_p (void)
11238 /* In AMD64, return address is always stored on the stack at a fixed offset
11239 from the CFA (provided via x86_sframe_cfa_ra_offset ()).
11240 Do not track explicitly via an SFrame Frame Row Entry. */
11245 x86_sframe_cfa_ra_offset (void)
11247 gas_assert (x86_elf_abi
== X86_64_ABI
);
11248 return (offsetT
) -8;
11252 x86_sframe_get_abi_arch (void)
11254 unsigned char sframe_abi_arch
= 0;
11256 if (x86_support_sframe_p ())
11258 gas_assert (!target_big_endian
);
11259 sframe_abi_arch
= SFRAME_ABI_AMD64_ENDIAN_LITTLE
;
11262 return sframe_abi_arch
;
11267 static unsigned int
11268 encoding_length (const fragS
*start_frag
, offsetT start_off
,
11269 const char *frag_now_ptr
)
11271 unsigned int len
= 0;
11273 if (start_frag
!= frag_now
)
11275 const fragS
*fr
= start_frag
;
11280 } while (fr
&& fr
!= frag_now
);
11283 return len
- start_off
+ (frag_now_ptr
- frag_now
->fr_literal
);
11286 /* Return 1 for test, and, cmp, add, sub, inc and dec which may
11287 be macro-fused with conditional jumps.
11288 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
11289 or is one of the following format:
11299 it is unfusible. */
11302 maybe_fused_with_jcc_p (enum mf_cmp_kind
* mf_cmp_p
)
11304 /* No RIP address. */
11305 if (i
.base_reg
&& i
.base_reg
->reg_num
== RegIP
)
11308 /* No opcodes outside of base encoding space. */
11309 if (i
.tm
.opcode_space
!= SPACE_BASE
)
11312 /* add, sub without add/sub m, imm. */
11313 if (i
.tm
.base_opcode
<= 5
11314 || (i
.tm
.base_opcode
>= 0x28 && i
.tm
.base_opcode
<= 0x2d)
11315 || ((i
.tm
.base_opcode
| 3) == 0x83
11316 && (i
.tm
.extension_opcode
== 0x5
11317 || i
.tm
.extension_opcode
== 0x0)))
11319 *mf_cmp_p
= mf_cmp_alu_cmp
;
11320 return !(i
.mem_operands
&& i
.imm_operands
);
11323 /* and without and m, imm. */
11324 if ((i
.tm
.base_opcode
>= 0x20 && i
.tm
.base_opcode
<= 0x25)
11325 || ((i
.tm
.base_opcode
| 3) == 0x83
11326 && i
.tm
.extension_opcode
== 0x4))
11328 *mf_cmp_p
= mf_cmp_test_and
;
11329 return !(i
.mem_operands
&& i
.imm_operands
);
11332 /* test without test m imm. */
11333 if ((i
.tm
.base_opcode
| 1) == 0x85
11334 || (i
.tm
.base_opcode
| 1) == 0xa9
11335 || ((i
.tm
.base_opcode
| 1) == 0xf7
11336 && i
.tm
.extension_opcode
== 0))
11338 *mf_cmp_p
= mf_cmp_test_and
;
11339 return !(i
.mem_operands
&& i
.imm_operands
);
11342 /* cmp without cmp m, imm. */
11343 if ((i
.tm
.base_opcode
>= 0x38 && i
.tm
.base_opcode
<= 0x3d)
11344 || ((i
.tm
.base_opcode
| 3) == 0x83
11345 && (i
.tm
.extension_opcode
== 0x7)))
11347 *mf_cmp_p
= mf_cmp_alu_cmp
;
11348 return !(i
.mem_operands
&& i
.imm_operands
);
11351 /* inc, dec without inc/dec m. */
11352 if ((is_cpu (&i
.tm
, CpuNo64
)
11353 && (i
.tm
.base_opcode
| 0xf) == 0x4f)
11354 || ((i
.tm
.base_opcode
| 1) == 0xff
11355 && i
.tm
.extension_opcode
<= 0x1))
11357 *mf_cmp_p
= mf_cmp_incdec
;
11358 return !i
.mem_operands
;
11364 /* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
11367 add_fused_jcc_padding_frag_p (enum mf_cmp_kind
*mf_cmp_p
,
11368 const struct last_insn
*last_insn
)
11370 /* NB: Don't work with COND_JUMP86 without i386. */
11371 if (!align_branch_power
11372 || now_seg
== absolute_section
11373 || !cpu_arch_flags
.bitfield
.cpui386
11374 || !(align_branch
& align_branch_fused_bit
))
11377 if (maybe_fused_with_jcc_p (mf_cmp_p
))
11379 if (last_insn
->kind
== last_insn_other
)
11382 as_warn_where (last_insn
->file
, last_insn
->line
,
11383 _("`%s` skips -malign-branch-boundary on `%s`"),
11384 last_insn
->name
, insn_name (&i
.tm
));
11390 /* Return 1 if a BRANCH_PREFIX frag should be generated. */
11393 add_branch_prefix_frag_p (const struct last_insn
*last_insn
)
11395 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
11396 to PadLock instructions since they include prefixes in opcode. */
11397 if (!align_branch_power
11398 || !align_branch_prefix_size
11399 || now_seg
== absolute_section
11400 || is_cpu (&i
.tm
, CpuPadLock
)
11401 || !cpu_arch_flags
.bitfield
.cpui386
)
11404 /* Don't add prefix if it is a prefix or there is no operand in case
11405 that segment prefix is special. */
11406 if (!i
.operands
|| i
.tm
.opcode_modifier
.isprefix
)
11409 if (last_insn
->kind
== last_insn_other
)
11413 as_warn_where (last_insn
->file
, last_insn
->line
,
11414 _("`%s` skips -malign-branch-boundary on `%s`"),
11415 last_insn
->name
, insn_name (&i
.tm
));
11420 /* Return 1 if a BRANCH_PADDING frag should be generated. */
11423 add_branch_padding_frag_p (enum align_branch_kind
*branch_p
,
11424 enum mf_jcc_kind
*mf_jcc_p
,
11425 const struct last_insn
*last_insn
)
11429 /* NB: Don't work with COND_JUMP86 without i386. */
11430 if (!align_branch_power
11431 || now_seg
== absolute_section
11432 || !cpu_arch_flags
.bitfield
.cpui386
11433 || i
.tm
.opcode_space
!= SPACE_BASE
)
11438 /* Check for jcc and direct jmp. */
11439 if (i
.tm
.opcode_modifier
.jump
== JUMP
)
11441 if (i
.tm
.base_opcode
== JUMP_PC_RELATIVE
)
11443 *branch_p
= align_branch_jmp
;
11444 add_padding
= align_branch
& align_branch_jmp_bit
;
11448 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
11449 igore the lowest bit. */
11450 *mf_jcc_p
= (i
.tm
.base_opcode
& 0x0e) >> 1;
11451 *branch_p
= align_branch_jcc
;
11452 if ((align_branch
& align_branch_jcc_bit
))
11456 else if ((i
.tm
.base_opcode
| 1) == 0xc3)
11459 *branch_p
= align_branch_ret
;
11460 if ((align_branch
& align_branch_ret_bit
))
11465 /* Check for indirect jmp, direct and indirect calls. */
11466 if (i
.tm
.base_opcode
== 0xe8)
11469 *branch_p
= align_branch_call
;
11470 if ((align_branch
& align_branch_call_bit
))
11473 else if (i
.tm
.base_opcode
== 0xff
11474 && (i
.tm
.extension_opcode
== 2
11475 || i
.tm
.extension_opcode
== 4))
11477 /* Indirect call and jmp. */
11478 *branch_p
= align_branch_indirect
;
11479 if ((align_branch
& align_branch_indirect_bit
))
11486 && (i
.op
[0].disps
->X_op
== O_symbol
11487 || (i
.op
[0].disps
->X_op
== O_subtract
11488 && i
.op
[0].disps
->X_op_symbol
== GOT_symbol
)))
11490 symbolS
*s
= i
.op
[0].disps
->X_add_symbol
;
11491 /* No padding to call to global or undefined tls_get_addr. */
11492 if ((S_IS_EXTERNAL (s
) || !S_IS_DEFINED (s
))
11493 && strcmp (S_GET_NAME (s
), tls_get_addr
) == 0)
11499 && last_insn
->kind
!= last_insn_other
)
11502 as_warn_where (last_insn
->file
, last_insn
->line
,
11503 _("`%s` skips -malign-branch-boundary on `%s`"),
11504 last_insn
->name
, insn_name (&i
.tm
));
11508 return add_padding
;
11512 output_insn (const struct last_insn
*last_insn
)
11514 fragS
*insn_start_frag
;
11515 offsetT insn_start_off
;
11516 fragS
*fragP
= NULL
;
11517 enum align_branch_kind branch
= align_branch_none
;
11518 /* The initializer is arbitrary just to avoid uninitialized error.
11519 it's actually either assigned in add_branch_padding_frag_p
11520 or never be used. */
11521 enum mf_jcc_kind mf_jcc
= mf_jcc_jo
;
11523 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11524 if (IS_ELF
&& x86_used_note
&& now_seg
!= absolute_section
)
11526 if ((i
.xstate
& xstate_tmm
) == xstate_tmm
11527 || is_cpu (&i
.tm
, CpuAMX_TILE
))
11528 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_TMM
;
11530 if (is_cpu (&i
.tm
, Cpu8087
)
11531 || is_cpu (&i
.tm
, Cpu287
)
11532 || is_cpu (&i
.tm
, Cpu387
)
11533 || is_cpu (&i
.tm
, Cpu687
)
11534 || is_cpu (&i
.tm
, CpuFISTTP
))
11535 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_X87
;
11537 if ((i
.xstate
& xstate_mmx
)
11538 || i
.tm
.mnem_off
== MN_emms
11539 || i
.tm
.mnem_off
== MN_femms
)
11540 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_MMX
;
11544 if (i
.index_reg
->reg_type
.bitfield
.zmmword
)
11545 i
.xstate
|= xstate_zmm
;
11546 else if (i
.index_reg
->reg_type
.bitfield
.ymmword
)
11547 i
.xstate
|= xstate_ymm
;
11548 else if (i
.index_reg
->reg_type
.bitfield
.xmmword
)
11549 i
.xstate
|= xstate_xmm
;
11552 /* vzeroall / vzeroupper */
11553 if (i
.tm
.base_opcode
== 0x77 && is_cpu (&i
.tm
, CpuAVX
))
11554 i
.xstate
|= xstate_ymm
;
11556 if ((i
.xstate
& xstate_xmm
)
11557 /* ldmxcsr / stmxcsr / vldmxcsr / vstmxcsr */
11558 || (i
.tm
.base_opcode
== 0xae
11559 && (is_cpu (&i
.tm
, CpuSSE
)
11560 || is_cpu (&i
.tm
, CpuAVX
)))
11561 || is_cpu (&i
.tm
, CpuWideKL
)
11562 || is_cpu (&i
.tm
, CpuKL
))
11563 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_XMM
;
11565 if ((i
.xstate
& xstate_ymm
) == xstate_ymm
)
11566 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_YMM
;
11567 if ((i
.xstate
& xstate_zmm
) == xstate_zmm
)
11568 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_ZMM
;
11569 if (i
.mask
.reg
|| (i
.xstate
& xstate_mask
) == xstate_mask
)
11570 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_MASK
;
11571 if (is_cpu (&i
.tm
, CpuFXSR
))
11572 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_FXSR
;
11573 if (is_cpu (&i
.tm
, CpuXsave
))
11574 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_XSAVE
;
11575 if (is_cpu (&i
.tm
, CpuXsaveopt
))
11576 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
;
11577 if (is_cpu (&i
.tm
, CpuXSAVEC
))
11578 x86_feature_2_used
|= GNU_PROPERTY_X86_FEATURE_2_XSAVEC
;
11580 if (x86_feature_2_used
11581 || is_cpu (&i
.tm
, CpuCMOV
)
11582 || is_cpu (&i
.tm
, CpuSYSCALL
)
11583 || i
.tm
.mnem_off
== MN_cmpxchg8b
)
11584 x86_isa_1_used
|= GNU_PROPERTY_X86_ISA_1_BASELINE
;
11585 if (is_cpu (&i
.tm
, CpuSSE3
)
11586 || is_cpu (&i
.tm
, CpuSSSE3
)
11587 || is_cpu (&i
.tm
, CpuSSE4_1
)
11588 || is_cpu (&i
.tm
, CpuSSE4_2
)
11589 || is_cpu (&i
.tm
, CpuCX16
)
11590 || is_cpu (&i
.tm
, CpuPOPCNT
)
11591 /* LAHF-SAHF insns in 64-bit mode. */
11592 || (flag_code
== CODE_64BIT
11593 && (i
.tm
.base_opcode
| 1) == 0x9f
11594 && i
.tm
.opcode_space
== SPACE_BASE
))
11595 x86_isa_1_used
|= GNU_PROPERTY_X86_ISA_1_V2
;
11596 if (is_cpu (&i
.tm
, CpuAVX
)
11597 || is_cpu (&i
.tm
, CpuAVX2
)
11598 /* Any VEX encoded insns execpt for AVX512F, AVX512BW, AVX512DQ,
11599 XOP, FMA4, LPW, TBM, and AMX. */
11600 || (i
.tm
.opcode_modifier
.vex
11601 && !is_cpu (&i
.tm
, CpuAVX512F
)
11602 && !is_cpu (&i
.tm
, CpuAVX512BW
)
11603 && !is_cpu (&i
.tm
, CpuAVX512DQ
)
11604 && !is_cpu (&i
.tm
, CpuXOP
)
11605 && !is_cpu (&i
.tm
, CpuFMA4
)
11606 && !is_cpu (&i
.tm
, CpuLWP
)
11607 && !is_cpu (&i
.tm
, CpuTBM
)
11608 && !(x86_feature_2_used
& GNU_PROPERTY_X86_FEATURE_2_TMM
))
11609 || is_cpu (&i
.tm
, CpuF16C
)
11610 || is_cpu (&i
.tm
, CpuFMA
)
11611 || is_cpu (&i
.tm
, CpuLZCNT
)
11612 || is_cpu (&i
.tm
, CpuMovbe
)
11613 || is_cpu (&i
.tm
, CpuXSAVES
)
11614 || (x86_feature_2_used
11615 & (GNU_PROPERTY_X86_FEATURE_2_XSAVE
11616 | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
11617 | GNU_PROPERTY_X86_FEATURE_2_XSAVEC
)) != 0)
11618 x86_isa_1_used
|= GNU_PROPERTY_X86_ISA_1_V3
;
11619 if (is_cpu (&i
.tm
, CpuAVX512F
)
11620 || is_cpu (&i
.tm
, CpuAVX512BW
)
11621 || is_cpu (&i
.tm
, CpuAVX512DQ
)
11622 || is_cpu (&i
.tm
, CpuAVX512VL
)
11623 /* Any EVEX encoded insns except for AVX512ER, AVX512PF,
11624 AVX512-4FMAPS, and AVX512-4VNNIW. */
11625 || (i
.tm
.opcode_modifier
.evex
11626 && !is_cpu (&i
.tm
, CpuAVX512ER
)
11627 && !is_cpu (&i
.tm
, CpuAVX512PF
)
11628 && !is_cpu (&i
.tm
, CpuAVX512_4FMAPS
)
11629 && !is_cpu (&i
.tm
, CpuAVX512_4VNNIW
)))
11630 x86_isa_1_used
|= GNU_PROPERTY_X86_ISA_1_V4
;
11634 /* Tie dwarf2 debug info to the address at the start of the insn.
11635 We can't do this after the insn has been output as the current
11636 frag may have been closed off. eg. by frag_var. */
11637 dwarf2_emit_insn (0);
11639 insn_start_frag
= frag_now
;
11640 insn_start_off
= frag_now_fix ();
11642 if (add_branch_padding_frag_p (&branch
, &mf_jcc
, last_insn
))
11645 /* Branch can be 8 bytes. Leave some room for prefixes. */
11646 unsigned int max_branch_padding_size
= 14;
11648 /* Align section to boundary. */
11649 record_alignment (now_seg
, align_branch_power
);
11651 /* Make room for padding. */
11652 frag_grow (max_branch_padding_size
);
11654 /* Start of the padding. */
11659 frag_var (rs_machine_dependent
, max_branch_padding_size
, 0,
11660 ENCODE_RELAX_STATE (BRANCH_PADDING
, 0),
11663 fragP
->tc_frag_data
.mf_type
= mf_jcc
;
11664 fragP
->tc_frag_data
.branch_type
= branch
;
11665 fragP
->tc_frag_data
.max_bytes
= max_branch_padding_size
;
11668 if (!cpu_arch_flags
.bitfield
.cpui386
&& (flag_code
!= CODE_16BIT
)
11669 && !pre_386_16bit_warned
)
11671 as_warn (_("use .code16 to ensure correct addressing mode"));
11672 pre_386_16bit_warned
= true;
11675 /* Output jumps. */
11676 if (i
.tm
.opcode_modifier
.jump
== JUMP
)
11678 else if (i
.tm
.opcode_modifier
.jump
== JUMP_BYTE
11679 || i
.tm
.opcode_modifier
.jump
== JUMP_DWORD
)
11681 else if (i
.tm
.opcode_modifier
.jump
== JUMP_INTERSEGMENT
)
11682 output_interseg_jump ();
11685 /* Output normal instructions here. */
11689 enum mf_cmp_kind mf_cmp
;
11692 && (i
.tm
.base_opcode
== 0xaee8
11693 || i
.tm
.base_opcode
== 0xaef0
11694 || i
.tm
.base_opcode
== 0xaef8))
11696 /* Encode lfence, mfence, and sfence as
11697 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
11698 if (flag_code
== CODE_16BIT
)
11699 as_bad (_("Cannot convert `%s' in 16-bit mode"), insn_name (&i
.tm
));
11700 else if (omit_lock_prefix
)
11701 as_bad (_("Cannot convert `%s' with `-momit-lock-prefix=yes' in effect"),
11702 insn_name (&i
.tm
));
11703 else if (now_seg
!= absolute_section
)
11705 offsetT val
= 0x240483f0ULL
;
11708 md_number_to_chars (p
, val
, 5);
11711 abs_section_offset
+= 5;
11715 /* Some processors fail on LOCK prefix. This options makes
11716 assembler ignore LOCK prefix and serves as a workaround. */
11717 if (omit_lock_prefix
)
11719 if (i
.tm
.base_opcode
== LOCK_PREFIX_OPCODE
11720 && i
.tm
.opcode_modifier
.isprefix
)
11722 i
.prefix
[LOCK_PREFIX
] = 0;
11726 /* Skip if this is a branch. */
11728 else if (add_fused_jcc_padding_frag_p (&mf_cmp
, last_insn
))
11730 /* Make room for padding. */
11731 frag_grow (MAX_FUSED_JCC_PADDING_SIZE
);
11736 frag_var (rs_machine_dependent
, MAX_FUSED_JCC_PADDING_SIZE
, 0,
11737 ENCODE_RELAX_STATE (FUSED_JCC_PADDING
, 0),
11740 fragP
->tc_frag_data
.mf_type
= mf_cmp
;
11741 fragP
->tc_frag_data
.branch_type
= align_branch_fused
;
11742 fragP
->tc_frag_data
.max_bytes
= MAX_FUSED_JCC_PADDING_SIZE
;
11744 else if (add_branch_prefix_frag_p (last_insn
))
11746 unsigned int max_prefix_size
= align_branch_prefix_size
;
11748 /* Make room for padding. */
11749 frag_grow (max_prefix_size
);
11754 frag_var (rs_machine_dependent
, max_prefix_size
, 0,
11755 ENCODE_RELAX_STATE (BRANCH_PREFIX
, 0),
11758 fragP
->tc_frag_data
.max_bytes
= max_prefix_size
;
11761 /* Since the VEX/EVEX prefix contains the implicit prefix, we
11762 don't need the explicit prefix. */
11763 if (!is_any_vex_encoding (&i
.tm
))
11765 switch (i
.tm
.opcode_modifier
.opcodeprefix
)
11774 if (!is_cpu (&i
.tm
, CpuPadLock
)
11775 || (i
.prefix
[REP_PREFIX
] != 0xf3))
11779 switch (i
.opcode_length
)
11784 /* Check for pseudo prefixes. */
11785 if (!i
.tm
.opcode_modifier
.isprefix
|| i
.tm
.base_opcode
)
11787 as_bad_where (insn_start_frag
->fr_file
,
11788 insn_start_frag
->fr_line
,
11789 _("pseudo prefix without instruction"));
11799 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
11800 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
11801 R_X86_64_GOTTPOFF relocation so that linker can safely
11802 perform IE->LE optimization. A dummy REX_OPCODE prefix
11803 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
11804 relocation for GDesc -> IE/LE optimization. */
11805 if (x86_elf_abi
== X86_64_X32_ABI
11806 && !is_apx_rex2_encoding ()
11808 && (i
.reloc
[0] == BFD_RELOC_X86_64_GOTTPOFF
11809 || i
.reloc
[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC
)
11810 && i
.prefix
[REX_PREFIX
] == 0)
11811 add_prefix (REX_OPCODE
);
11814 /* The prefix bytes. */
11815 for (j
= ARRAY_SIZE (i
.prefix
), q
= i
.prefix
; j
> 0; j
--, q
++)
11817 frag_opcode_byte (*q
);
11819 if (is_apx_rex2_encoding ())
11821 frag_opcode_byte (i
.vex
.bytes
[0]);
11822 frag_opcode_byte (i
.vex
.bytes
[1]);
11827 for (j
= 0, q
= i
.prefix
; j
< ARRAY_SIZE (i
.prefix
); j
++, q
++)
11833 frag_opcode_byte (*q
);
11836 /* There should be no other prefixes for instructions
11837 with VEX prefix. */
11841 /* For EVEX instructions i.vrex should become 0 after
11842 build_evex_prefix. For VEX instructions upper 16 registers
11843 aren't available, so VREX should be 0. */
11846 /* Now the VEX prefix. */
11847 if (now_seg
!= absolute_section
)
11849 p
= frag_more (i
.vex
.length
);
11850 for (j
= 0; j
< i
.vex
.length
; j
++)
11851 p
[j
] = i
.vex
.bytes
[j
];
11854 abs_section_offset
+= i
.vex
.length
;
11857 /* Now the opcode; be careful about word order here! */
11858 j
= i
.opcode_length
;
11860 switch (i
.tm
.opcode_space
)
11875 if (now_seg
== absolute_section
)
11876 abs_section_offset
+= j
;
11879 FRAG_APPEND_1_CHAR (i
.tm
.base_opcode
);
11885 && i
.tm
.opcode_space
!= SPACE_BASE
)
11888 if (i
.tm
.opcode_space
!= SPACE_0F
)
11889 *p
++ = i
.tm
.opcode_space
== SPACE_0F38
11893 switch (i
.opcode_length
)
11896 /* Put out high byte first: can't use md_number_to_chars! */
11897 *p
++ = (i
.tm
.base_opcode
>> 8) & 0xff;
11898 /* Fall through. */
11900 *p
= i
.tm
.base_opcode
& 0xff;
11909 /* Now the modrm byte and sib byte (if present). */
11910 if (i
.tm
.opcode_modifier
.modrm
)
11912 frag_opcode_byte ((i
.rm
.regmem
<< 0)
11914 | (i
.rm
.mode
<< 6));
11915 /* If i.rm.regmem == ESP (4)
11916 && i.rm.mode != (Register mode)
11918 ==> need second modrm byte. */
11919 if (i
.rm
.regmem
== ESCAPE_TO_TWO_BYTE_ADDRESSING
11921 && !(i
.base_reg
&& i
.base_reg
->reg_type
.bitfield
.word
))
11922 frag_opcode_byte ((i
.sib
.base
<< 0)
11923 | (i
.sib
.index
<< 3)
11924 | (i
.sib
.scale
<< 6));
11927 if (i
.disp_operands
)
11928 output_disp (insn_start_frag
, insn_start_off
);
11930 if (i
.imm_operands
)
11931 output_imm (insn_start_frag
, insn_start_off
);
11934 * frag_now_fix () returning plain abs_section_offset when we're in the
11935 * absolute section, and abs_section_offset not getting updated as data
11936 * gets added to the frag breaks the logic below.
11938 if (now_seg
!= absolute_section
)
11940 j
= encoding_length (insn_start_frag
, insn_start_off
, frag_more (0));
11944 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
11947 as_bad (_("instruction length of %u bytes exceeds the limit of 15"),
11952 /* NB: Don't add prefix with GOTPC relocation since
11953 output_disp() above depends on the fixed encoding
11954 length. Can't add prefix with TLS relocation since
11955 it breaks TLS linker optimization. */
11956 unsigned int max
= i
.has_gotpc_tls_reloc
? 0 : 15 - j
;
11957 /* Prefix count on the current instruction. */
11958 unsigned int count
= i
.vex
.length
;
11960 for (k
= 0; k
< ARRAY_SIZE (i
.prefix
); k
++)
11961 /* REX byte is encoded in VEX/EVEX prefix. */
11962 if (i
.prefix
[k
] && (k
!= REX_PREFIX
|| !i
.vex
.length
))
11965 /* Count prefixes for extended opcode maps. */
11967 switch (i
.tm
.opcode_space
)
11982 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
)
11985 /* Set the maximum prefix size in BRANCH_PREFIX
11987 if (fragP
->tc_frag_data
.max_bytes
> max
)
11988 fragP
->tc_frag_data
.max_bytes
= max
;
11989 if (fragP
->tc_frag_data
.max_bytes
> count
)
11990 fragP
->tc_frag_data
.max_bytes
-= count
;
11992 fragP
->tc_frag_data
.max_bytes
= 0;
11996 /* Remember the maximum prefix size in FUSED_JCC_PADDING
11998 unsigned int max_prefix_size
;
11999 if (align_branch_prefix_size
> max
)
12000 max_prefix_size
= max
;
12002 max_prefix_size
= align_branch_prefix_size
;
12003 if (max_prefix_size
> count
)
12004 fragP
->tc_frag_data
.max_prefix_length
12005 = max_prefix_size
- count
;
12008 /* Use existing segment prefix if possible. Use CS
12009 segment prefix in 64-bit mode. In 32-bit mode, use SS
12010 segment prefix with ESP/EBP base register and use DS
12011 segment prefix without ESP/EBP base register. */
12012 if (i
.prefix
[SEG_PREFIX
])
12013 fragP
->tc_frag_data
.default_prefix
= i
.prefix
[SEG_PREFIX
];
12014 else if (flag_code
== CODE_64BIT
)
12015 fragP
->tc_frag_data
.default_prefix
= CS_PREFIX_OPCODE
;
12016 else if (i
.base_reg
12017 && (i
.base_reg
->reg_num
== 4
12018 || i
.base_reg
->reg_num
== 5))
12019 fragP
->tc_frag_data
.default_prefix
= SS_PREFIX_OPCODE
;
12021 fragP
->tc_frag_data
.default_prefix
= DS_PREFIX_OPCODE
;
12026 /* NB: Don't work with COND_JUMP86 without i386. */
12027 if (align_branch_power
12028 && now_seg
!= absolute_section
12029 && cpu_arch_flags
.bitfield
.cpui386
)
12031 /* Terminate each frag so that we can add prefix and check for
12033 frag_wane (frag_now
);
12040 pi ("" /*line*/, &i
);
12042 #endif /* DEBUG386 */
12045 /* Return the size of the displacement operand N. */
12048 disp_size (unsigned int n
)
12052 if (i
.types
[n
].bitfield
.disp64
)
12054 else if (i
.types
[n
].bitfield
.disp8
)
12056 else if (i
.types
[n
].bitfield
.disp16
)
12061 /* Return the size of the immediate operand N. */
12064 imm_size (unsigned int n
)
12067 if (i
.types
[n
].bitfield
.imm64
)
12069 else if (i
.types
[n
].bitfield
.imm8
|| i
.types
[n
].bitfield
.imm8s
)
12071 else if (i
.types
[n
].bitfield
.imm16
)
12077 output_disp (fragS
*insn_start_frag
, offsetT insn_start_off
)
12082 for (n
= 0; n
< i
.operands
; n
++)
12084 if (operand_type_check (i
.types
[n
], disp
))
12086 int size
= disp_size (n
);
12088 if (now_seg
== absolute_section
)
12089 abs_section_offset
+= size
;
12090 else if (i
.op
[n
].disps
->X_op
== O_constant
)
12092 offsetT val
= i
.op
[n
].disps
->X_add_number
;
12094 val
= offset_in_range (val
>> (size
== 1 ? i
.memshift
: 0),
12096 p
= frag_more (size
);
12097 md_number_to_chars (p
, val
, size
);
12101 enum bfd_reloc_code_real reloc_type
;
12102 bool pcrel
= (i
.flags
[n
] & Operand_PCrel
) != 0;
12103 bool sign
= (flag_code
== CODE_64BIT
&& size
== 4
12104 && (!want_disp32 (&i
.tm
)
12105 || (i
.tm
.opcode_modifier
.jump
&& !i
.jumpabsolute
12106 && !i
.types
[n
].bitfield
.baseindex
)))
12110 /* We can't have 8 bit displacement here. */
12111 gas_assert (!i
.types
[n
].bitfield
.disp8
);
12113 /* The PC relative address is computed relative
12114 to the instruction boundary, so in case immediate
12115 fields follows, we need to adjust the value. */
12116 if (pcrel
&& i
.imm_operands
)
12121 for (n1
= 0; n1
< i
.operands
; n1
++)
12122 if (operand_type_check (i
.types
[n1
], imm
))
12124 /* Only one immediate is allowed for PC
12125 relative address, except with .insn. */
12126 gas_assert (sz
== 0 || dot_insn ());
12127 sz
+= imm_size (n1
);
12129 /* We should find at least one immediate. */
12130 gas_assert (sz
!= 0);
12131 i
.op
[n
].disps
->X_add_number
-= sz
;
12134 p
= frag_more (size
);
12135 reloc_type
= reloc (size
, pcrel
, sign
, i
.reloc
[n
]);
12137 && GOT_symbol
== i
.op
[n
].disps
->X_add_symbol
12138 && (((reloc_type
== BFD_RELOC_32
12139 || reloc_type
== BFD_RELOC_X86_64_32S
12140 || (reloc_type
== BFD_RELOC_64
12142 && (i
.op
[n
].disps
->X_op
== O_symbol
12143 || (i
.op
[n
].disps
->X_op
== O_add
12144 && ((symbol_get_value_expression
12145 (i
.op
[n
].disps
->X_op_symbol
)->X_op
)
12147 || reloc_type
== BFD_RELOC_32_PCREL
))
12151 reloc_type
= BFD_RELOC_386_GOTPC
;
12152 i
.has_gotpc_tls_reloc
= true;
12153 i
.op
[n
].disps
->X_add_number
+=
12154 encoding_length (insn_start_frag
, insn_start_off
, p
);
12156 else if (reloc_type
== BFD_RELOC_64
)
12157 reloc_type
= BFD_RELOC_X86_64_GOTPC64
;
12159 /* Don't do the adjustment for x86-64, as there
12160 the pcrel addressing is relative to the _next_
12161 insn, and that is taken care of in other code. */
12162 reloc_type
= BFD_RELOC_X86_64_GOTPC32
;
12164 else if (align_branch_power
)
12166 switch (reloc_type
)
12168 case BFD_RELOC_386_TLS_GD
:
12169 case BFD_RELOC_386_TLS_LDM
:
12170 case BFD_RELOC_386_TLS_IE
:
12171 case BFD_RELOC_386_TLS_IE_32
:
12172 case BFD_RELOC_386_TLS_GOTIE
:
12173 case BFD_RELOC_386_TLS_GOTDESC
:
12174 case BFD_RELOC_386_TLS_DESC_CALL
:
12175 case BFD_RELOC_X86_64_TLSGD
:
12176 case BFD_RELOC_X86_64_TLSLD
:
12177 case BFD_RELOC_X86_64_GOTTPOFF
:
12178 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF
:
12179 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF
:
12180 case BFD_RELOC_X86_64_GOTPC32_TLSDESC
:
12181 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
:
12182 case BFD_RELOC_X86_64_TLSDESC_CALL
:
12183 i
.has_gotpc_tls_reloc
= true;
12188 fixP
= fix_new_exp (frag_now
, p
- frag_now
->fr_literal
,
12189 size
, i
.op
[n
].disps
, pcrel
,
12192 if (flag_code
== CODE_64BIT
&& size
== 4 && pcrel
12193 && !i
.prefix
[ADDR_PREFIX
])
12194 fixP
->fx_signed
= 1;
12196 if (reloc_type
== BFD_RELOC_X86_64_GOTTPOFF
12197 && i
.tm
.opcode_space
== SPACE_EVEXMAP4
)
12199 /* Only "add %reg1, foo@gottpoff(%rip), %reg2" is
12200 allowed in md_assemble. Set fx_tcbit2 for EVEX
12202 fixP
->fx_tcbit2
= 1;
12206 if (i
.base_reg
&& i
.base_reg
->reg_num
== RegIP
)
12208 if (reloc_type
== BFD_RELOC_X86_64_GOTPC32_TLSDESC
)
12210 /* Set fx_tcbit for REX2 prefix. */
12211 if (is_apx_rex2_encoding ())
12212 fixP
->fx_tcbit
= 1;
12216 /* In 64-bit, i386_validate_fix updates only (%rip)
12218 else if (object_64bit
)
12221 /* Check for "call/jmp *mem", "mov mem, %reg",
12222 "test %reg, mem" and "binop mem, %reg" where binop
12223 is one of adc, add, and, cmp, or, sbb, sub, xor
12224 instructions without data prefix. Always generate
12225 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
12226 if (i
.prefix
[DATA_PREFIX
] == 0
12228 || (i
.rm
.mode
== 0 && i
.rm
.regmem
== 5))
12229 && i
.tm
.opcode_space
== SPACE_BASE
12230 && ((i
.operands
== 1
12231 && i
.tm
.base_opcode
== 0xff
12232 && (i
.rm
.reg
== 2 || i
.rm
.reg
== 4))
12233 || (i
.operands
== 2
12234 && (i
.tm
.base_opcode
== 0x8b
12235 || i
.tm
.base_opcode
== 0x85
12236 || (i
.tm
.base_opcode
& ~0x38) == 0x03))))
12240 if (reloc_type
== BFD_RELOC_X86_64_GOTTPOFF
)
12242 /* Set fx_tcbit for REX2 prefix. */
12243 if (is_apx_rex2_encoding ())
12244 fixP
->fx_tcbit
= 1;
12246 else if (generate_relax_relocations
)
12248 /* Set fx_tcbit3 for REX2 prefix. */
12249 if (is_apx_rex2_encoding ())
12250 fixP
->fx_tcbit3
= 1;
12252 fixP
->fx_tcbit2
= 1;
12254 fixP
->fx_tcbit
= 1;
12257 else if (generate_relax_relocations
12258 || (i
.rm
.mode
== 0 && i
.rm
.regmem
== 5))
12259 fixP
->fx_tcbit2
= 1;
12267 output_imm (fragS
*insn_start_frag
, offsetT insn_start_off
)
12272 for (n
= 0; n
< i
.operands
; n
++)
12274 if (operand_type_check (i
.types
[n
], imm
))
12276 int size
= imm_size (n
);
12278 if (now_seg
== absolute_section
)
12279 abs_section_offset
+= size
;
12280 else if (i
.op
[n
].imms
->X_op
== O_constant
)
12284 val
= offset_in_range (i
.op
[n
].imms
->X_add_number
,
12286 p
= frag_more (size
);
12287 md_number_to_chars (p
, val
, size
);
12291 /* Not absolute_section.
12292 Need a 32-bit fixup (don't support 8bit
12293 non-absolute imms). Try to support other
12295 enum bfd_reloc_code_real reloc_type
;
12298 if (i
.types
[n
].bitfield
.imm32s
12299 && (i
.suffix
== QWORD_MNEM_SUFFIX
12300 || (!i
.suffix
&& i
.tm
.opcode_modifier
.no_lsuf
)
12301 || (i
.prefix
[REX_PREFIX
] & REX_W
)
12307 p
= frag_more (size
);
12308 reloc_type
= reloc (size
, 0, sign
, i
.reloc
[n
]);
12310 /* This is tough to explain. We end up with this one if we
12311 * have operands that look like
12312 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
12313 * obtain the absolute address of the GOT, and it is strongly
12314 * preferable from a performance point of view to avoid using
12315 * a runtime relocation for this. The actual sequence of
12316 * instructions often look something like:
12321 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
12323 * The call and pop essentially return the absolute address
12324 * of the label .L66 and store it in %ebx. The linker itself
12325 * will ultimately change the first operand of the addl so
12326 * that %ebx points to the GOT, but to keep things simple, the
12327 * .o file must have this operand set so that it generates not
12328 * the absolute address of .L66, but the absolute address of
12329 * itself. This allows the linker itself simply treat a GOTPC
12330 * relocation as asking for a pcrel offset to the GOT to be
12331 * added in, and the addend of the relocation is stored in the
12332 * operand field for the instruction itself.
12334 * Our job here is to fix the operand so that it would add
12335 * the correct offset so that %ebx would point to itself. The
12336 * thing that is tricky is that .-.L66 will point to the
12337 * beginning of the instruction, so we need to further modify
12338 * the operand so that it will point to itself. There are
12339 * other cases where you have something like:
12341 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
12343 * and here no correction would be required. Internally in
12344 * the assembler we treat operands of this form as not being
12345 * pcrel since the '.' is explicitly mentioned, and I wonder
12346 * whether it would simplify matters to do it this way. Who
12347 * knows. In earlier versions of the PIC patches, the
12348 * pcrel_adjust field was used to store the correction, but
12349 * since the expression is not pcrel, I felt it would be
12350 * confusing to do it this way. */
12352 if ((reloc_type
== BFD_RELOC_32
12353 || reloc_type
== BFD_RELOC_X86_64_32S
12354 || reloc_type
== BFD_RELOC_64
)
12356 && GOT_symbol
== i
.op
[n
].imms
->X_add_symbol
12357 && (i
.op
[n
].imms
->X_op
== O_symbol
12358 || (i
.op
[n
].imms
->X_op
== O_add
12359 && ((symbol_get_value_expression
12360 (i
.op
[n
].imms
->X_op_symbol
)->X_op
)
12364 reloc_type
= BFD_RELOC_386_GOTPC
;
12365 else if (size
== 4)
12366 reloc_type
= BFD_RELOC_X86_64_GOTPC32
;
12367 else if (size
== 8)
12368 reloc_type
= BFD_RELOC_X86_64_GOTPC64
;
12369 i
.has_gotpc_tls_reloc
= true;
12370 i
.op
[n
].imms
->X_add_number
+=
12371 encoding_length (insn_start_frag
, insn_start_off
, p
);
12373 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
12374 i
.op
[n
].imms
, 0, reloc_type
);
12380 /* x86_cons_fix_new is called via the expression parsing code when a
12381 reloc is needed. We use this hook to get the correct .got reloc. */
12382 static int cons_sign
= -1;
12385 x86_cons_fix_new (fragS
*frag
, unsigned int off
, unsigned int len
,
12386 expressionS
*exp
, bfd_reloc_code_real_type r
)
12388 r
= reloc (len
, 0, cons_sign
, r
);
12391 if (exp
->X_op
== O_secrel
)
12393 exp
->X_op
= O_symbol
;
12394 r
= BFD_RELOC_32_SECREL
;
12396 else if (exp
->X_op
== O_secidx
)
12397 r
= BFD_RELOC_16_SECIDX
;
12400 fix_new_exp (frag
, off
, len
, exp
, 0, r
);
12403 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
12404 purpose of the `.dc.a' internal pseudo-op. */
12407 x86_address_bytes (void)
12409 if ((stdoutput
->arch_info
->mach
& bfd_mach_x64_32
))
12411 return stdoutput
->arch_info
->bits_per_address
/ 8;
12414 #if (!(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
12415 || defined (LEX_AT)) && !defined (TE_PE)
12416 # define lex_got(reloc, adjust, types) NULL
12418 /* Parse operands of the form
12419 <symbol>@GOTOFF+<nnn>
12420 and similar .plt or .got references.
12422 If we find one, set up the correct relocation in RELOC and copy the
12423 input string, minus the `@GOTOFF' into a malloc'd buffer for
12424 parsing by the calling routine. Return this buffer, and if ADJUST
12425 is non-null set it to the length of the string we removed from the
12426 input line. Otherwise return NULL. */
12428 lex_got (enum bfd_reloc_code_real
*rel
,
12430 i386_operand_type
*types
)
12432 /* Some of the relocations depend on the size of what field is to
12433 be relocated. But in our callers i386_immediate and i386_displacement
12434 we don't yet know the operand size (this will be set by insn
12435 matching). Hence we record the word32 relocation here,
12436 and adjust the reloc according to the real size in reloc(). */
12437 static const struct
12441 const enum bfd_reloc_code_real rel
[2];
12442 const i386_operand_type types64
;
12443 bool need_GOT_symbol
;
12448 #define OPERAND_TYPE_IMM32_32S_DISP32 { .bitfield = \
12449 { .imm32 = 1, .imm32s = 1, .disp32 = 1 } }
12450 #define OPERAND_TYPE_IMM32_32S_64_DISP32 { .bitfield = \
12451 { .imm32 = 1, .imm32s = 1, .imm64 = 1, .disp32 = 1 } }
12452 #define OPERAND_TYPE_IMM32_32S_64_DISP32_64 { .bitfield = \
12453 { .imm32 = 1, .imm32s = 1, .imm64 = 1, .disp32 = 1, .disp64 = 1 } }
12454 #define OPERAND_TYPE_IMM64_DISP64 { .bitfield = \
12455 { .imm64 = 1, .disp64 = 1 } }
12458 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12459 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32
,
12460 BFD_RELOC_SIZE32
},
12461 { .bitfield
= { .imm32
= 1, .imm64
= 1 } }, false },
12463 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real
,
12464 BFD_RELOC_X86_64_PLTOFF64
},
12465 { .bitfield
= { .imm64
= 1 } }, true },
12466 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32
,
12467 BFD_RELOC_X86_64_PLT32
},
12468 OPERAND_TYPE_IMM32_32S_DISP32
, false },
12469 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real
,
12470 BFD_RELOC_X86_64_GOTPLT64
},
12471 OPERAND_TYPE_IMM64_DISP64
, true },
12472 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF
,
12473 BFD_RELOC_X86_64_GOTOFF64
},
12474 OPERAND_TYPE_IMM64_DISP64
, true },
12475 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real
,
12476 BFD_RELOC_X86_64_GOTPCREL
},
12477 OPERAND_TYPE_IMM32_32S_DISP32
, true },
12478 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD
,
12479 BFD_RELOC_X86_64_TLSGD
},
12480 OPERAND_TYPE_IMM32_32S_DISP32
, true },
12481 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM
,
12482 _dummy_first_bfd_reloc_code_real
},
12483 OPERAND_TYPE_NONE
, true },
12484 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real
,
12485 BFD_RELOC_X86_64_TLSLD
},
12486 OPERAND_TYPE_IMM32_32S_DISP32
, true },
12487 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32
,
12488 BFD_RELOC_X86_64_GOTTPOFF
},
12489 OPERAND_TYPE_IMM32_32S_DISP32
, true },
12490 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32
,
12491 BFD_RELOC_X86_64_TPOFF32
},
12492 OPERAND_TYPE_IMM32_32S_64_DISP32_64
, true },
12493 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE
,
12494 _dummy_first_bfd_reloc_code_real
},
12495 OPERAND_TYPE_NONE
, true },
12496 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32
,
12497 BFD_RELOC_X86_64_DTPOFF32
},
12498 OPERAND_TYPE_IMM32_32S_64_DISP32_64
, true },
12499 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE
,
12500 _dummy_first_bfd_reloc_code_real
},
12501 OPERAND_TYPE_NONE
, true },
12502 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE
,
12503 _dummy_first_bfd_reloc_code_real
},
12504 OPERAND_TYPE_NONE
, true },
12505 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32
,
12506 BFD_RELOC_X86_64_GOT32
},
12507 OPERAND_TYPE_IMM32_32S_64_DISP32
, true },
12508 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC
,
12509 BFD_RELOC_X86_64_GOTPC32_TLSDESC
},
12510 OPERAND_TYPE_IMM32_32S_DISP32
, true },
12511 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL
,
12512 BFD_RELOC_X86_64_TLSDESC_CALL
},
12513 OPERAND_TYPE_IMM32_32S_DISP32
, true },
12515 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL
,
12516 BFD_RELOC_32_SECREL
},
12517 OPERAND_TYPE_IMM32_32S_64_DISP32_64
, false },
12520 #undef OPERAND_TYPE_IMM32_32S_DISP32
12521 #undef OPERAND_TYPE_IMM32_32S_64_DISP32
12522 #undef OPERAND_TYPE_IMM32_32S_64_DISP32_64
12523 #undef OPERAND_TYPE_IMM64_DISP64
12529 #if defined (OBJ_MAYBE_ELF) && !defined (TE_PE)
12534 for (cp
= input_line_pointer
; *cp
!= '@'; cp
++)
12535 if (is_end_of_line
[(unsigned char) *cp
] || *cp
== ',')
12538 for (j
= 0; j
< ARRAY_SIZE (gotrel
); j
++)
12540 int len
= gotrel
[j
].len
;
12541 if (strncasecmp (cp
+ 1, gotrel
[j
].str
, len
) == 0)
12543 if (gotrel
[j
].rel
[object_64bit
] != 0)
12546 char *tmpbuf
, *past_reloc
;
12548 *rel
= gotrel
[j
].rel
[object_64bit
];
12552 if (flag_code
!= CODE_64BIT
)
12554 types
->bitfield
.imm32
= 1;
12555 types
->bitfield
.disp32
= 1;
12558 *types
= gotrel
[j
].types64
;
12561 if (gotrel
[j
].need_GOT_symbol
&& GOT_symbol
== NULL
)
12562 GOT_symbol
= symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME
);
12564 /* The length of the first part of our input line. */
12565 first
= cp
- input_line_pointer
;
12567 /* The second part goes from after the reloc token until
12568 (and including) an end_of_line char or comma. */
12569 past_reloc
= cp
+ 1 + len
;
12571 while (!is_end_of_line
[(unsigned char) *cp
] && *cp
!= ',')
12573 second
= cp
+ 1 - past_reloc
;
12575 /* Allocate and copy string. The trailing NUL shouldn't
12576 be necessary, but be safe. */
12577 tmpbuf
= XNEWVEC (char, first
+ second
+ 2);
12578 memcpy (tmpbuf
, input_line_pointer
, first
);
12579 if (second
!= 0 && *past_reloc
!= ' ')
12580 /* Replace the relocation token with ' ', so that
12581 errors like foo@GOTOFF1 will be detected. */
12582 tmpbuf
[first
++] = ' ';
12584 /* Increment length by 1 if the relocation token is
12589 memcpy (tmpbuf
+ first
, past_reloc
, second
);
12590 tmpbuf
[first
+ second
] = '\0';
12594 as_bad (_("@%s reloc is not supported with %d-bit output format"),
12595 gotrel
[j
].str
, 1 << (5 + object_64bit
));
12600 /* Might be a symbol version string. Don't as_bad here. */
12605 bfd_reloc_code_real_type
12606 x86_cons (expressionS
*exp
, int size
)
12608 bfd_reloc_code_real_type got_reloc
= NO_RELOC
;
12610 intel_syntax
= -intel_syntax
;
12612 expr_mode
= expr_operator_none
;
12614 #if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
12615 && !defined (LEX_AT)) \
12617 if (size
== 4 || (object_64bit
&& size
== 8))
12619 /* Handle @GOTOFF and the like in an expression. */
12621 char *gotfree_input_line
;
12624 save
= input_line_pointer
;
12625 gotfree_input_line
= lex_got (&got_reloc
, &adjust
, NULL
);
12626 if (gotfree_input_line
)
12627 input_line_pointer
= gotfree_input_line
;
12631 if (gotfree_input_line
)
12633 /* expression () has merrily parsed up to the end of line,
12634 or a comma - in the wrong buffer. Transfer how far
12635 input_line_pointer has moved to the right buffer. */
12636 input_line_pointer
= (save
12637 + (input_line_pointer
- gotfree_input_line
)
12639 free (gotfree_input_line
);
12640 if (exp
->X_op
== O_constant
12641 || exp
->X_op
== O_absent
12642 || exp
->X_op
== O_illegal
12643 || exp
->X_op
== O_register
12644 || exp
->X_op
== O_big
)
12646 char c
= *input_line_pointer
;
12647 *input_line_pointer
= 0;
12648 as_bad (_("missing or invalid expression `%s'"), save
);
12649 *input_line_pointer
= c
;
12651 else if ((got_reloc
== BFD_RELOC_386_PLT32
12652 || got_reloc
== BFD_RELOC_X86_64_PLT32
)
12653 && exp
->X_op
!= O_symbol
)
12655 char c
= *input_line_pointer
;
12656 *input_line_pointer
= 0;
12657 as_bad (_("invalid PLT expression `%s'"), save
);
12658 *input_line_pointer
= c
;
12666 intel_syntax
= -intel_syntax
;
12669 i386_intel_simplify (exp
);
12671 /* If not 64bit, massage value, to account for wraparound when !BFD64. */
12672 if (size
<= 4 && expr_mode
== expr_operator_present
12673 && exp
->X_op
== O_constant
&& !object_64bit
)
12674 exp
->X_add_number
= extend_to_32bit_address (exp
->X_add_number
);
12680 signed_cons (int size
)
12689 s_insn (int dummy ATTRIBUTE_UNUSED
)
12691 char mnemonic
[MAX_MNEM_SIZE
], *line
= input_line_pointer
, *ptr
;
12692 char *saved_ilp
= find_end_of_line (line
, false), saved_char
;
12696 bool vex
= false, xop
= false, evex
= false;
12697 struct last_insn
*last_insn
;
12701 saved_char
= *saved_ilp
;
12704 end
= parse_insn (line
, mnemonic
, true);
12708 *saved_ilp
= saved_char
;
12709 ignore_rest_of_line ();
12713 line
+= end
- line
;
12715 current_templates
.start
= &i
.tm
;
12716 current_templates
.end
= &i
.tm
+ 1;
12717 i
.tm
.mnem_off
= MN__insn
;
12718 i
.tm
.extension_opcode
= None
;
12720 if (startswith (line
, "VEX")
12721 && (line
[3] == '.' || is_space_char (line
[3])))
12726 else if (startswith (line
, "XOP") && ISDIGIT (line
[3]))
12729 unsigned long n
= strtoul (line
+ 3, &e
, 16);
12731 if (e
== line
+ 5 && n
>= 0x08 && n
<= 0x1f
12732 && (*e
== '.' || is_space_char (*e
)))
12735 /* Arrange for build_vex_prefix() to emit 0x8f. */
12736 i
.tm
.opcode_space
= SPACE_XOP08
;
12737 i
.insn_opcode_space
= n
;
12741 else if (startswith (line
, "EVEX")
12742 && (line
[4] == '.' || is_space_char (line
[4])))
12749 ? i
.encoding
== encoding_evex
12751 ? i
.encoding
== encoding_vex
12752 || i
.encoding
== encoding_vex3
12753 : i
.encoding
!= encoding_default
)
12755 as_bad (_("pseudo-prefix conflicts with encoding specifier"));
12759 if (line
> end
&& i
.encoding
== encoding_default
)
12760 i
.encoding
= evex
? encoding_evex
: encoding_vex
;
12762 if (i
.encoding
!= encoding_default
)
12764 /* Only address size and segment override prefixes are permitted with
12765 VEX/XOP/EVEX encodings. */
12766 const unsigned char *p
= i
.prefix
;
12768 for (j
= 0; j
< ARRAY_SIZE (i
.prefix
); ++j
, ++p
)
12779 as_bad (_("illegal prefix used with VEX/XOP/EVEX"));
12785 if (line
> end
&& *line
== '.')
12787 /* Length specifier (VEX.L, XOP.L, EVEX.L'L). */
12795 i
.tm
.opcode_modifier
.evex
= EVEX128
;
12797 i
.tm
.opcode_modifier
.vex
= VEX128
;
12802 i
.tm
.opcode_modifier
.evex
= EVEX256
;
12804 i
.tm
.opcode_modifier
.vex
= VEX256
;
12809 i
.tm
.opcode_modifier
.evex
= EVEX512
;
12814 i
.tm
.opcode_modifier
.evex
= EVEX_L3
;
12818 if (line
[3] == 'G')
12821 i
.tm
.opcode_modifier
.evex
= EVEXLIG
;
12823 i
.tm
.opcode_modifier
.vex
= VEXScalar
; /* LIG */
12829 if (i
.tm
.opcode_modifier
.vex
|| i
.tm
.opcode_modifier
.evex
)
12834 if (line
[2] == '2' && line
[3] == '8')
12837 i
.tm
.opcode_modifier
.evex
= EVEX128
;
12839 i
.tm
.opcode_modifier
.vex
= VEX128
;
12845 if (line
[2] == '5' && line
[3] == '6')
12848 i
.tm
.opcode_modifier
.evex
= EVEX256
;
12850 i
.tm
.opcode_modifier
.vex
= VEX256
;
12856 if (evex
&& line
[2] == '1' && line
[3] == '2')
12858 i
.tm
.opcode_modifier
.evex
= EVEX512
;
12865 if (line
> end
&& *line
== '.')
12867 /* embedded prefix (VEX.pp, XOP.pp, EVEX.pp). */
12871 if (line
[2] == 'P')
12876 if (line
[2] == '6')
12878 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_0X66
;
12883 case 'F': case 'f':
12884 if (line
[2] == '3')
12886 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_0XF3
;
12889 else if (line
[2] == '2')
12891 i
.tm
.opcode_modifier
.opcodeprefix
= PREFIX_0XF2
;
12898 if (line
> end
&& !xop
&& *line
== '.')
12900 /* Encoding space (VEX.mmmmm, EVEX.mmmm). */
12904 if (TOUPPER (line
[2]) != 'F')
12906 if (line
[3] == '.' || is_space_char (line
[3]))
12908 i
.insn_opcode_space
= SPACE_0F
;
12911 else if (line
[3] == '3'
12912 && (line
[4] == '8' || TOUPPER (line
[4]) == 'A')
12913 && (line
[5] == '.' || is_space_char (line
[5])))
12915 i
.insn_opcode_space
= line
[4] == '8' ? SPACE_0F38
: SPACE_0F3A
;
12921 if (ISDIGIT (line
[2]) && line
[2] != '0')
12924 unsigned long n
= strtoul (line
+ 2, &e
, 10);
12926 if (n
<= (evex
? 15 : 31)
12927 && (*e
== '.' || is_space_char (*e
)))
12929 i
.insn_opcode_space
= n
;
12937 if (line
> end
&& *line
== '.' && line
[1] == 'W')
12939 /* VEX.W, XOP.W, EVEX.W */
12943 i
.tm
.opcode_modifier
.vexw
= VEXW0
;
12947 i
.tm
.opcode_modifier
.vexw
= VEXW1
;
12951 if (line
[3] == 'G')
12953 i
.tm
.opcode_modifier
.vexw
= VEXWIG
;
12959 if (i
.tm
.opcode_modifier
.vexw
)
12963 if (line
> end
&& *line
&& !is_space_char (*line
))
12965 /* Improve diagnostic a little. */
12966 if (*line
== '.' && line
[1] && !is_space_char (line
[1]))
12971 /* Before processing the opcode expression, find trailing "+r" or
12972 "/<digit>" specifiers. */
12973 for (ptr
= line
; ; ++ptr
)
12978 ptr
= strpbrk (ptr
, "+/,");
12979 if (ptr
== NULL
|| *ptr
== ',')
12982 if (*ptr
== '+' && ptr
[1] == 'r'
12983 && (ptr
[2] == ',' || (is_space_char (ptr
[2]) && ptr
[3] == ',')))
12987 i
.short_form
= true;
12991 if (*ptr
== '/' && ISDIGIT (ptr
[1])
12992 && (n
= strtoul (ptr
+ 1, &e
, 8)) < 8
12994 && (ptr
[2] == ',' || (is_space_char (ptr
[2]) && ptr
[3] == ',')))
12998 i
.tm
.extension_opcode
= n
;
12999 i
.tm
.opcode_modifier
.modrm
= 1;
13004 input_line_pointer
= line
;
13005 val
= get_absolute_expression ();
13006 line
= input_line_pointer
;
13008 if (i
.short_form
&& (val
& 7))
13009 as_warn ("`+r' assumes low three opcode bits to be clear");
13011 for (j
= 1; j
< sizeof(val
); ++j
)
13012 if (!(val
>> (j
* 8)))
13015 /* Trim off a prefix if present. */
13016 if (j
> 1 && !vex
&& !xop
&& !evex
)
13018 uint8_t byte
= val
>> ((j
- 1) * 8);
13022 case DATA_PREFIX_OPCODE
:
13023 case REPE_PREFIX_OPCODE
:
13024 case REPNE_PREFIX_OPCODE
:
13025 if (!add_prefix (byte
))
13027 val
&= ((uint64_t)1 << (--j
* 8)) - 1;
13032 /* Parse operands, if any, before evaluating encoding space. */
13037 ptr
= parse_operands (line
+ 1, &i386_mnemonics
[MN__insn
]);
13045 as_bad (_("expecting operand after ','; got nothing"));
13049 if (i
.mem_operands
> 1)
13051 as_bad (_("too many memory references for `%s'"),
13052 &i386_mnemonics
[MN__insn
]);
13056 /* No need to distinguish encoding_evex and encoding_evex512. */
13057 if (i
.encoding
== encoding_evex512
)
13058 i
.encoding
= encoding_evex
;
13061 /* Trim off encoding space. */
13062 if (j
> 1 && !i
.insn_opcode_space
&& (val
>> ((j
- 1) * 8)) == 0x0f)
13064 uint8_t byte
= val
>> ((--j
- 1) * 8);
13066 i
.insn_opcode_space
= SPACE_0F
;
13067 switch (byte
& -(j
> 1 && !i
.rex2_encoding
13068 && (i
.encoding
!= encoding_egpr
|| evex
)))
13071 i
.insn_opcode_space
= SPACE_0F38
;
13075 i
.insn_opcode_space
= SPACE_0F3A
;
13079 i
.tm
.opcode_space
= i
.insn_opcode_space
;
13080 val
&= ((uint64_t)1 << (j
* 8)) - 1;
13082 if (!i
.tm
.opcode_space
&& (vex
|| evex
))
13083 /* Arrange for build_vex_prefix() to properly emit 0xC4/0xC5.
13084 Also avoid hitting abort() there or in build_evex_prefix(). */
13085 i
.tm
.opcode_space
= i
.insn_opcode_space
== SPACE_0F
? SPACE_0F
13090 as_bad (_("opcode residual (%#"PRIx64
") too wide"), (uint64_t) val
);
13093 i
.opcode_length
= j
;
13095 /* Handle operands, if any. */
13098 i386_operand_type combined
;
13099 expressionS
*disp_exp
= NULL
;
13102 if (i
.encoding
== encoding_egpr
)
13106 as_bad (_("eGPR use conflicts with encoding specifier"));
13110 i
.encoding
= encoding_evex
;
13112 i
.encoding
= encoding_default
;
13115 /* Are we to emit ModR/M encoding? */
13118 || i
.reg_operands
> (i
.encoding
!= encoding_default
)
13119 || i
.tm
.extension_opcode
!= None
))
13120 i
.tm
.opcode_modifier
.modrm
= 1;
13122 if (!i
.tm
.opcode_modifier
.modrm
13124 > i
.short_form
+ 0U + (i
.encoding
!= encoding_default
)
13125 || i
.mem_operands
))
13127 as_bad (_("too many register/memory operands"));
13131 /* Enforce certain constraints on operands. */
13132 switch (i
.reg_operands
+ i
.mem_operands
13133 + (i
.tm
.extension_opcode
!= None
))
13138 as_bad (_("too few register/memory operands"));
13141 /* Fall through. */
13143 if (i
.tm
.opcode_modifier
.modrm
)
13145 as_bad (_("too few register/memory operands"));
13155 && (i
.op
[0].imms
->X_op
!= O_constant
13156 || !fits_in_imm4 (i
.op
[0].imms
->X_add_number
)))
13158 as_bad (_("constant doesn't fit in %d bits"), evex
? 3 : 4);
13161 /* Fall through. */
13163 if (i
.encoding
!= encoding_default
)
13165 i
.tm
.opcode_modifier
.vexvvvv
= VexVVVV_SRC1
;
13168 /* Fall through. */
13170 as_bad (_("too many register/memory operands"));
13174 /* Bring operands into canonical order (imm, mem, reg). */
13179 for (j
= 1; j
< i
.operands
; ++j
)
13181 if ((!operand_type_check (i
.types
[j
- 1], imm
)
13182 && operand_type_check (i
.types
[j
], imm
))
13183 || (i
.types
[j
- 1].bitfield
.class != ClassNone
13184 && i
.types
[j
].bitfield
.class == ClassNone
))
13186 swap_2_operands (j
- 1, j
);
13193 /* For Intel syntax swap the order of register operands. */
13195 switch (i
.reg_operands
)
13202 swap_2_operands (i
.imm_operands
+ i
.mem_operands
+ 1, i
.operands
- 2);
13203 /* Fall through. */
13206 swap_2_operands (i
.imm_operands
+ i
.mem_operands
, i
.operands
- 1);
13213 /* Enforce constraints when using VSIB. */
13215 && (i
.index_reg
->reg_type
.bitfield
.xmmword
13216 || i
.index_reg
->reg_type
.bitfield
.ymmword
13217 || i
.index_reg
->reg_type
.bitfield
.zmmword
))
13219 if (i
.encoding
== encoding_default
)
13221 as_bad (_("VSIB unavailable with legacy encoding"));
13225 if (i
.encoding
== encoding_evex
13226 && i
.reg_operands
> 1)
13228 /* We could allow two register operands, encoding the 2nd one in
13229 an 8-bit immediate like for 4-register-operand insns, but that
13230 would require ugly fiddling with process_operands() and/or
13231 build_modrm_byte(). */
13232 as_bad (_("too many register operands with VSIB"));
13236 i
.tm
.opcode_modifier
.sib
= 1;
13239 /* Establish operand size encoding. */
13240 operand_type_set (&combined
, 0);
13242 for (j
= i
.imm_operands
; j
< i
.operands
; ++j
)
13244 /* Look for 8-bit operands that use old registers. */
13245 if (i
.encoding
!= encoding_default
13246 && flag_code
== CODE_64BIT
13247 && i
.types
[j
].bitfield
.class == Reg
13248 && i
.types
[j
].bitfield
.byte
13249 && !(i
.op
[j
].regs
->reg_flags
& RegRex64
)
13250 && i
.op
[j
].regs
->reg_num
> 3)
13251 as_bad (_("can't encode register '%s%s' with VEX/XOP/EVEX"),
13252 register_prefix
, i
.op
[j
].regs
->reg_name
);
13254 i
.types
[j
].bitfield
.instance
= InstanceNone
;
13256 if (operand_type_check (i
.types
[j
], disp
))
13258 i
.types
[j
].bitfield
.baseindex
= 1;
13259 disp_exp
= i
.op
[j
].disps
;
13262 if (evex
&& i
.types
[j
].bitfield
.baseindex
)
13264 unsigned int n
= i
.memshift
;
13266 if (i
.types
[j
].bitfield
.byte
)
13268 else if (i
.types
[j
].bitfield
.word
)
13270 else if (i
.types
[j
].bitfield
.dword
)
13272 else if (i
.types
[j
].bitfield
.qword
)
13274 else if (i
.types
[j
].bitfield
.xmmword
)
13276 else if (i
.types
[j
].bitfield
.ymmword
)
13278 else if (i
.types
[j
].bitfield
.zmmword
)
13281 if (i
.memshift
< 32 && n
!= i
.memshift
)
13282 as_warn ("conflicting memory operand size specifiers");
13286 if ((i
.broadcast
.type
|| i
.broadcast
.bytes
)
13287 && j
== i
.broadcast
.operand
)
13290 combined
= operand_type_or (combined
, i
.types
[j
]);
13291 combined
.bitfield
.class = ClassNone
;
13294 switch ((i
.broadcast
.type
? i
.broadcast
.type
: 1)
13295 << (i
.memshift
< 32 ? i
.memshift
: 0))
13297 case 64: combined
.bitfield
.zmmword
= 1; break;
13298 case 32: combined
.bitfield
.ymmword
= 1; break;
13299 case 16: combined
.bitfield
.xmmword
= 1; break;
13300 case 8: combined
.bitfield
.qword
= 1; break;
13301 case 4: combined
.bitfield
.dword
= 1; break;
13304 if (i
.encoding
== encoding_default
)
13306 if (flag_code
== CODE_64BIT
&& combined
.bitfield
.qword
)
13308 else if ((flag_code
== CODE_16BIT
? combined
.bitfield
.dword
13309 : combined
.bitfield
.word
)
13310 && !add_prefix (DATA_PREFIX_OPCODE
))
13313 else if (!i
.tm
.opcode_modifier
.vexw
)
13315 if (flag_code
== CODE_64BIT
)
13317 if (combined
.bitfield
.qword
)
13318 i
.tm
.opcode_modifier
.vexw
= VEXW1
;
13319 else if (combined
.bitfield
.dword
)
13320 i
.tm
.opcode_modifier
.vexw
= VEXW0
;
13323 if (!i
.tm
.opcode_modifier
.vexw
)
13324 i
.tm
.opcode_modifier
.vexw
= VEXWIG
;
13329 if (!i
.tm
.opcode_modifier
.vex
)
13331 if (combined
.bitfield
.ymmword
)
13332 i
.tm
.opcode_modifier
.vex
= VEX256
;
13333 else if (combined
.bitfield
.xmmword
)
13334 i
.tm
.opcode_modifier
.vex
= VEX128
;
13339 if (!i
.tm
.opcode_modifier
.evex
)
13341 /* Do _not_ consider AVX512VL here. */
13342 if (i
.rounding
.type
!= rc_none
|| combined
.bitfield
.zmmword
)
13343 i
.tm
.opcode_modifier
.evex
= EVEX512
;
13344 else if (combined
.bitfield
.ymmword
)
13345 i
.tm
.opcode_modifier
.evex
= EVEX256
;
13346 else if (combined
.bitfield
.xmmword
)
13347 i
.tm
.opcode_modifier
.evex
= EVEX128
;
13350 if (i
.memshift
>= 32)
13352 unsigned int n
= 0;
13354 switch (i
.tm
.opcode_modifier
.evex
)
13356 case EVEX512
: n
= 64; break;
13357 case EVEX256
: n
= 32; break;
13358 case EVEX128
: n
= 16; break;
13361 if (i
.broadcast
.type
)
13362 n
/= i
.broadcast
.type
;
13365 for (i
.memshift
= 0; !(n
& 1); n
>>= 1)
13367 else if (disp_exp
!= NULL
&& disp_exp
->X_op
== O_constant
13368 && disp_exp
->X_add_number
!= 0
13369 && i
.disp_encoding
!= disp_encoding_32bit
)
13371 if (!quiet_warnings
)
13372 as_warn ("cannot determine memory operand size");
13373 i
.disp_encoding
= disp_encoding_32bit
;
13378 if (i
.memshift
>= 32)
13381 i
.encoding
= encoding_error
;
13383 if (i
.disp_operands
&& !optimize_disp (&i
.tm
))
13386 /* Establish size for immediate operands. */
13387 for (j
= 0; j
< i
.imm_operands
; ++j
)
13389 expressionS
*expP
= i
.op
[j
].imms
;
13391 gas_assert (operand_type_check (i
.types
[j
], imm
));
13392 operand_type_set (&i
.types
[j
], 0);
13394 if (i
.imm_bits
[j
] > 32)
13395 i
.types
[j
].bitfield
.imm64
= 1;
13396 else if (i
.imm_bits
[j
] > 16)
13398 if (flag_code
== CODE_64BIT
&& (i
.flags
[j
] & Operand_Signed
))
13399 i
.types
[j
].bitfield
.imm32s
= 1;
13401 i
.types
[j
].bitfield
.imm32
= 1;
13403 else if (i
.imm_bits
[j
] > 8)
13404 i
.types
[j
].bitfield
.imm16
= 1;
13405 else if (i
.imm_bits
[j
] > 0)
13407 if (i
.flags
[j
] & Operand_Signed
)
13408 i
.types
[j
].bitfield
.imm8s
= 1;
13410 i
.types
[j
].bitfield
.imm8
= 1;
13412 else if (expP
->X_op
== O_constant
)
13414 i
.types
[j
] = smallest_imm_type (expP
->X_add_number
);
13415 i
.types
[j
].bitfield
.imm1
= 0;
13416 /* Oddly enough imm_size() checks imm64 first, so the bit needs
13417 zapping since smallest_imm_type() sets it unconditionally. */
13418 if (flag_code
!= CODE_64BIT
)
13420 i
.types
[j
].bitfield
.imm64
= 0;
13421 i
.types
[j
].bitfield
.imm32s
= 0;
13422 i
.types
[j
].bitfield
.imm32
= 1;
13424 else if (i
.types
[j
].bitfield
.imm32
|| i
.types
[j
].bitfield
.imm32s
)
13425 i
.types
[j
].bitfield
.imm64
= 0;
13428 /* Non-constant expressions are sized heuristically. */
13431 case CODE_64BIT
: i
.types
[j
].bitfield
.imm32s
= 1; break;
13432 case CODE_32BIT
: i
.types
[j
].bitfield
.imm32
= 1; break;
13433 case CODE_16BIT
: i
.types
[j
].bitfield
.imm16
= 1; break;
13437 for (j
= 0; j
< i
.operands
; ++j
)
13438 i
.tm
.operand_types
[j
] = i
.types
[j
];
13440 process_operands ();
13443 /* Don't set opcode until after processing operands, to avoid any
13444 potential special casing there. */
13445 i
.tm
.base_opcode
|= val
;
13447 if (i
.encoding
== encoding_error
13448 || (i
.encoding
!= encoding_evex
13449 ? i
.broadcast
.type
|| i
.broadcast
.bytes
13450 || i
.rounding
.type
!= rc_none
13452 : (i
.mem_operands
&& i
.rounding
.type
!= rc_none
)
13453 || ((i
.broadcast
.type
|| i
.broadcast
.bytes
)
13454 && !(i
.flags
[i
.broadcast
.operand
] & Operand_Mem
))))
13456 as_bad (_("conflicting .insn operands"));
13462 if (!i
.tm
.opcode_modifier
.vex
)
13463 i
.tm
.opcode_modifier
.vex
= VEXScalar
; /* LIG */
13465 build_vex_prefix (NULL
);
13466 i
.rex
&= REX_OPCODE
;
13470 if (!i
.tm
.opcode_modifier
.evex
)
13471 i
.tm
.opcode_modifier
.evex
= EVEXLIG
;
13473 build_evex_prefix ();
13474 i
.rex
&= REX_OPCODE
;
13479 last_insn
= &seg_info(now_seg
)->tc_segment_info_data
.last_insn
;
13480 output_insn (last_insn
);
13481 last_insn
->kind
= last_insn_directive
;
13482 last_insn
->name
= ".insn directive";
13483 last_insn
->file
= as_where (&last_insn
->line
);
13485 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
13486 /* PS: SCFI is enabled only for System V AMD64 ABI. The ABI check has been
13487 performed in i386_target_format. */
13488 if (IS_ELF
&& flag_synth_cfi
)
13489 as_bad (_("SCFI: hand-crafting instructions not supported"));
13493 *saved_ilp
= saved_char
;
13494 input_line_pointer
= line
;
13496 demand_empty_rest_of_line ();
13498 /* Make sure dot_insn() won't yield "true" anymore. */
13504 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED
)
13511 if (exp
.X_op
== O_symbol
)
13512 exp
.X_op
= O_secrel
;
13514 emit_expr (&exp
, 4);
13516 while (*input_line_pointer
++ == ',');
13518 input_line_pointer
--;
13519 demand_empty_rest_of_line ();
13523 pe_directive_secidx (int dummy ATTRIBUTE_UNUSED
)
13530 if (exp
.X_op
== O_symbol
)
13531 exp
.X_op
= O_secidx
;
13533 emit_expr (&exp
, 2);
13535 while (*input_line_pointer
++ == ',');
13537 input_line_pointer
--;
13538 demand_empty_rest_of_line ();
13542 /* Handle Rounding Control / SAE specifiers. */
13545 RC_SAE_specifier (const char *pstr
)
13549 for (j
= 0; j
< ARRAY_SIZE (RC_NamesTable
); j
++)
13551 if (!strncmp (pstr
, RC_NamesTable
[j
].name
, RC_NamesTable
[j
].len
))
13553 if (i
.rounding
.type
!= rc_none
)
13555 as_bad (_("duplicated `{%s}'"), RC_NamesTable
[j
].name
);
13559 switch (i
.encoding
)
13561 case encoding_default
:
13562 case encoding_egpr
:
13563 i
.encoding
= encoding_evex512
;
13565 case encoding_evex
:
13566 case encoding_evex512
:
13572 i
.rounding
.type
= RC_NamesTable
[j
].type
;
13574 return (char *)(pstr
+ RC_NamesTable
[j
].len
);
13581 /* Handle Vector operations. */
13584 check_VecOperations (char *op_string
)
13586 const reg_entry
*mask
;
13593 if (*op_string
== '{')
13597 /* Check broadcasts. */
13598 if (startswith (op_string
, "1to"))
13600 unsigned int bcst_type
;
13602 if (i
.broadcast
.type
)
13603 goto duplicated_vec_op
;
13606 if (*op_string
== '8')
13608 else if (*op_string
== '4')
13610 else if (*op_string
== '2')
13612 else if (*op_string
== '1'
13613 && *(op_string
+1) == '6')
13618 else if (*op_string
== '3'
13619 && *(op_string
+1) == '2')
13626 as_bad (_("Unsupported broadcast: `%s'"), saved
);
13631 switch (i
.encoding
)
13633 case encoding_default
:
13634 case encoding_egpr
:
13635 i
.encoding
= encoding_evex
;
13637 case encoding_evex
:
13638 case encoding_evex512
:
13641 goto unknown_vec_op
;
13644 i
.broadcast
.type
= bcst_type
;
13645 i
.broadcast
.operand
= this_operand
;
13647 /* For .insn a data size specifier may be appended. */
13648 if (dot_insn () && *op_string
== ':')
13649 goto dot_insn_modifier
;
13651 /* Check .insn special cases. */
13652 else if (dot_insn () && *op_string
== ':')
13655 switch (op_string
[1])
13660 if (i
.memshift
< 32)
13661 goto duplicated_vec_op
;
13663 n
= strtoul (op_string
+ 2, &end_op
, 0);
13665 for (i
.memshift
= 0; !(n
& 1); n
>>= 1)
13667 if (i
.memshift
< 32 && n
== 1)
13668 op_string
= end_op
;
13671 case 's': case 'u':
13672 /* This isn't really a "vector" operation, but a sign/size
13673 specifier for immediate operands of .insn. Note that AT&T
13674 syntax handles the same in i386_immediate(). */
13678 if (i
.imm_bits
[this_operand
])
13679 goto duplicated_vec_op
;
13681 n
= strtoul (op_string
+ 2, &end_op
, 0);
13682 if (n
&& n
<= (flag_code
== CODE_64BIT
? 64 : 32))
13684 i
.imm_bits
[this_operand
] = n
;
13685 if (op_string
[1] == 's')
13686 i
.flags
[this_operand
] |= Operand_Signed
;
13687 op_string
= end_op
;
13692 /* Check masking operation. */
13693 else if ((mask
= parse_register (op_string
, &end_op
)) != NULL
)
13695 if (mask
== &bad_reg
)
13698 /* k0 can't be used for write mask. */
13699 if (mask
->reg_type
.bitfield
.class != RegMask
|| !mask
->reg_num
)
13701 as_bad (_("`%s%s' can't be used for write mask"),
13702 register_prefix
, mask
->reg_name
);
13709 i
.mask
.operand
= this_operand
;
13711 else if (i
.mask
.reg
->reg_num
)
13712 goto duplicated_vec_op
;
13717 /* Only "{z}" is allowed here. No need to check
13718 zeroing mask explicitly. */
13719 if (i
.mask
.operand
!= (unsigned int) this_operand
)
13721 as_bad (_("invalid write mask `%s'"), saved
);
13726 op_string
= end_op
;
13728 /* Check zeroing-flag for masking operation. */
13729 else if (*op_string
== 'z')
13733 i
.mask
.reg
= reg_k0
;
13734 i
.mask
.zeroing
= 1;
13735 i
.mask
.operand
= this_operand
;
13739 if (i
.mask
.zeroing
)
13742 as_bad (_("duplicated `%s'"), saved
);
13746 i
.mask
.zeroing
= 1;
13748 /* Only "{%k}" is allowed here. No need to check mask
13749 register explicitly. */
13750 if (i
.mask
.operand
!= (unsigned int) this_operand
)
13752 as_bad (_("invalid zeroing-masking `%s'"),
13760 else if (intel_syntax
13761 && (op_string
= RC_SAE_specifier (op_string
)) != NULL
)
13762 i
.rounding
.modifier
= true;
13764 goto unknown_vec_op
;
13766 if (*op_string
!= '}')
13768 as_bad (_("missing `}' in `%s'"), saved
);
13773 /* Strip whitespace since the addition of pseudo prefixes
13774 changed how the scrubber treats '{'. */
13775 if (is_space_char (*op_string
))
13781 /* We don't know this one. */
13782 as_bad (_("unknown vector operation: `%s'"), saved
);
13786 if (i
.mask
.reg
&& i
.mask
.zeroing
&& !i
.mask
.reg
->reg_num
)
13788 as_bad (_("zeroing-masking only allowed with write mask"));
13796 i386_immediate (char *imm_start
)
13798 char *save_input_line_pointer
;
13799 char *gotfree_input_line
;
13802 i386_operand_type types
;
13804 operand_type_set (&types
, ~0);
13806 if (i
.imm_operands
== MAX_IMMEDIATE_OPERANDS
)
13808 as_bad (_("at most %d immediate operands are allowed"),
13809 MAX_IMMEDIATE_OPERANDS
);
13813 exp
= &im_expressions
[i
.imm_operands
++];
13814 i
.op
[this_operand
].imms
= exp
;
13816 if (is_space_char (*imm_start
))
13819 save_input_line_pointer
= input_line_pointer
;
13820 input_line_pointer
= imm_start
;
13822 gotfree_input_line
= lex_got (&i
.reloc
[this_operand
], NULL
, &types
);
13823 if (gotfree_input_line
)
13824 input_line_pointer
= gotfree_input_line
;
13826 expr_mode
= expr_operator_none
;
13827 exp_seg
= expression (exp
);
13829 /* For .insn immediates there may be a size specifier. */
13830 if (dot_insn () && *input_line_pointer
== '{' && input_line_pointer
[1] == ':'
13831 && (input_line_pointer
[2] == 's' || input_line_pointer
[2] == 'u'))
13834 unsigned long n
= strtoul (input_line_pointer
+ 3, &e
, 0);
13836 if (*e
== '}' && n
&& n
<= (flag_code
== CODE_64BIT
? 64 : 32))
13838 i
.imm_bits
[this_operand
] = n
;
13839 if (input_line_pointer
[2] == 's')
13840 i
.flags
[this_operand
] |= Operand_Signed
;
13841 input_line_pointer
= e
+ 1;
13845 SKIP_WHITESPACE ();
13846 if (*input_line_pointer
)
13847 as_bad (_("junk `%s' after expression"), input_line_pointer
);
13849 input_line_pointer
= save_input_line_pointer
;
13850 if (gotfree_input_line
)
13852 free (gotfree_input_line
);
13854 if (exp
->X_op
== O_constant
)
13855 exp
->X_op
= O_illegal
;
13858 if (exp_seg
== reg_section
)
13860 as_bad (_("illegal immediate register operand %s"), imm_start
);
13864 return i386_finalize_immediate (exp_seg
, exp
, types
, imm_start
);
13868 i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED
, expressionS
*exp
,
13869 i386_operand_type types
, const char *imm_start
)
13871 if (exp
->X_op
== O_absent
|| exp
->X_op
== O_illegal
|| exp
->X_op
== O_big
)
13874 as_bad (_("missing or invalid immediate expression `%s'"),
13878 else if (exp
->X_op
== O_constant
)
13880 /* Size it properly later. */
13881 i
.types
[this_operand
].bitfield
.imm64
= 1;
13883 /* If not 64bit, sign/zero extend val, to account for wraparound
13885 if (expr_mode
== expr_operator_present
13886 && flag_code
!= CODE_64BIT
&& !object_64bit
)
13887 exp
->X_add_number
= extend_to_32bit_address (exp
->X_add_number
);
13889 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13890 else if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
13891 && exp_seg
!= absolute_section
13892 && exp_seg
!= text_section
13893 && exp_seg
!= data_section
13894 && exp_seg
!= bss_section
13895 && exp_seg
!= undefined_section
13896 && !bfd_is_com_section (exp_seg
))
13898 as_bad (_("unimplemented segment %s in operand"), exp_seg
->name
);
13904 /* This is an address. The size of the address will be
13905 determined later, depending on destination register,
13906 suffix, or the default for the section. */
13907 i
.types
[this_operand
].bitfield
.imm8
= 1;
13908 i
.types
[this_operand
].bitfield
.imm16
= 1;
13909 i
.types
[this_operand
].bitfield
.imm32
= 1;
13910 i
.types
[this_operand
].bitfield
.imm32s
= 1;
13911 i
.types
[this_operand
].bitfield
.imm64
= 1;
13912 i
.types
[this_operand
] = operand_type_and (i
.types
[this_operand
],
13920 i386_scale (char *scale
)
13923 char *save
= input_line_pointer
;
13925 input_line_pointer
= scale
;
13926 val
= get_absolute_expression ();
13931 i
.log2_scale_factor
= 0;
13934 i
.log2_scale_factor
= 1;
13937 i
.log2_scale_factor
= 2;
13940 i
.log2_scale_factor
= 3;
13944 char sep
= *input_line_pointer
;
13946 *input_line_pointer
= '\0';
13947 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
13949 *input_line_pointer
= sep
;
13950 input_line_pointer
= save
;
13954 if (i
.log2_scale_factor
!= 0 && i
.index_reg
== 0)
13956 as_warn (_("scale factor of %d without an index register"),
13957 1 << i
.log2_scale_factor
);
13958 i
.log2_scale_factor
= 0;
13960 scale
= input_line_pointer
;
13961 input_line_pointer
= save
;
13966 i386_displacement (char *disp_start
, char *disp_end
)
13970 char *save_input_line_pointer
;
13971 char *gotfree_input_line
;
13973 i386_operand_type bigdisp
, types
= anydisp
;
13976 if (i
.disp_operands
== MAX_MEMORY_OPERANDS
)
13978 as_bad (_("at most %d displacement operands are allowed"),
13979 MAX_MEMORY_OPERANDS
);
13983 operand_type_set (&bigdisp
, 0);
13985 || i
.types
[this_operand
].bitfield
.baseindex
13986 || (current_templates
.start
->opcode_modifier
.jump
!= JUMP
13987 && current_templates
.start
->opcode_modifier
.jump
!= JUMP_DWORD
))
13989 i386_addressing_mode ();
13990 override
= (i
.prefix
[ADDR_PREFIX
] != 0);
13991 if (flag_code
== CODE_64BIT
)
13993 bigdisp
.bitfield
.disp32
= 1;
13995 bigdisp
.bitfield
.disp64
= 1;
13997 else if ((flag_code
== CODE_16BIT
) ^ override
)
13998 bigdisp
.bitfield
.disp16
= 1;
14000 bigdisp
.bitfield
.disp32
= 1;
14004 /* For PC-relative branches, the width of the displacement may be
14005 dependent upon data size, but is never dependent upon address size.
14006 Also make sure to not unintentionally match against a non-PC-relative
14007 branch template. */
14008 const insn_template
*t
= current_templates
.start
;
14009 bool has_intel64
= false;
14011 while (++t
< current_templates
.end
)
14013 if (t
->opcode_modifier
.jump
14014 != current_templates
.start
->opcode_modifier
.jump
)
14016 if ((t
->opcode_modifier
.isa64
>= INTEL64
))
14017 has_intel64
= true;
14019 current_templates
.end
= t
;
14021 override
= (i
.prefix
[DATA_PREFIX
] != 0);
14022 if (flag_code
== CODE_64BIT
)
14024 if ((override
|| i
.suffix
== WORD_MNEM_SUFFIX
)
14025 && (!intel64
|| !has_intel64
))
14026 bigdisp
.bitfield
.disp16
= 1;
14028 bigdisp
.bitfield
.disp32
= 1;
14033 override
= (i
.suffix
== (flag_code
!= CODE_16BIT
14035 : LONG_MNEM_SUFFIX
));
14036 bigdisp
.bitfield
.disp32
= 1;
14037 if ((flag_code
== CODE_16BIT
) ^ override
)
14039 bigdisp
.bitfield
.disp32
= 0;
14040 bigdisp
.bitfield
.disp16
= 1;
14044 i
.types
[this_operand
] = operand_type_or (i
.types
[this_operand
],
14047 exp
= &disp_expressions
[i
.disp_operands
];
14048 i
.op
[this_operand
].disps
= exp
;
14050 save_input_line_pointer
= input_line_pointer
;
14051 input_line_pointer
= disp_start
;
14052 END_STRING_AND_SAVE (disp_end
);
14054 #ifndef GCC_ASM_O_HACK
14055 #define GCC_ASM_O_HACK 0
14058 END_STRING_AND_SAVE (disp_end
+ 1);
14059 if (i
.types
[this_operand
].bitfield
.baseIndex
14060 && displacement_string_end
[-1] == '+')
14062 /* This hack is to avoid a warning when using the "o"
14063 constraint within gcc asm statements.
14066 #define _set_tssldt_desc(n,addr,limit,type) \
14067 __asm__ __volatile__ ( \
14068 "movw %w2,%0\n\t" \
14069 "movw %w1,2+%0\n\t" \
14070 "rorl $16,%1\n\t" \
14071 "movb %b1,4+%0\n\t" \
14072 "movb %4,5+%0\n\t" \
14073 "movb $0,6+%0\n\t" \
14074 "movb %h1,7+%0\n\t" \
14076 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
14078 This works great except that the output assembler ends
14079 up looking a bit weird if it turns out that there is
14080 no offset. You end up producing code that looks like:
14093 So here we provide the missing zero. */
14095 *displacement_string_end
= '0';
14098 gotfree_input_line
= lex_got (&i
.reloc
[this_operand
], NULL
, &types
);
14099 if (gotfree_input_line
)
14100 input_line_pointer
= gotfree_input_line
;
14102 expr_mode
= expr_operator_none
;
14103 exp_seg
= expression (exp
);
14105 SKIP_WHITESPACE ();
14106 if (*input_line_pointer
)
14107 as_bad (_("junk `%s' after expression"), input_line_pointer
);
14109 RESTORE_END_STRING (disp_end
+ 1);
14111 input_line_pointer
= save_input_line_pointer
;
14112 if (gotfree_input_line
)
14114 free (gotfree_input_line
);
14116 if (exp
->X_op
== O_constant
|| exp
->X_op
== O_register
)
14117 exp
->X_op
= O_illegal
;
14120 ret
= i386_finalize_displacement (exp_seg
, exp
, types
, disp_start
);
14122 RESTORE_END_STRING (disp_end
);
14128 i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED
, expressionS
*exp
,
14129 i386_operand_type types
, const char *disp_start
)
14133 /* We do this to make sure that the section symbol is in
14134 the symbol table. We will ultimately change the relocation
14135 to be relative to the beginning of the section. */
14136 if (i
.reloc
[this_operand
] == BFD_RELOC_386_GOTOFF
14137 || i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTPCREL
14138 || i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTOFF64
)
14140 if (exp
->X_op
!= O_symbol
)
14143 if (S_IS_LOCAL (exp
->X_add_symbol
)
14144 && S_GET_SEGMENT (exp
->X_add_symbol
) != undefined_section
14145 && S_GET_SEGMENT (exp
->X_add_symbol
) != expr_section
)
14146 section_symbol (S_GET_SEGMENT (exp
->X_add_symbol
));
14147 exp
->X_op
= O_subtract
;
14148 exp
->X_op_symbol
= GOT_symbol
;
14149 if (i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTPCREL
)
14150 i
.reloc
[this_operand
] = BFD_RELOC_32_PCREL
;
14151 else if (i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTOFF64
)
14152 i
.reloc
[this_operand
] = BFD_RELOC_64
;
14154 i
.reloc
[this_operand
] = BFD_RELOC_32
;
14157 else if (exp
->X_op
== O_absent
14158 || exp
->X_op
== O_illegal
14159 || exp
->X_op
== O_big
)
14162 as_bad (_("missing or invalid displacement expression `%s'"),
14167 else if (exp
->X_op
== O_constant
)
14169 /* Sizing gets taken care of by optimize_disp().
14171 If not 64bit, sign/zero extend val, to account for wraparound
14173 if (expr_mode
== expr_operator_present
14174 && flag_code
!= CODE_64BIT
&& !object_64bit
)
14175 exp
->X_add_number
= extend_to_32bit_address (exp
->X_add_number
);
14178 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
14179 else if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
14180 && exp_seg
!= absolute_section
14181 && exp_seg
!= text_section
14182 && exp_seg
!= data_section
14183 && exp_seg
!= bss_section
14184 && exp_seg
!= undefined_section
14185 && !bfd_is_com_section (exp_seg
))
14187 as_bad (_("unimplemented segment %s in operand"), exp_seg
->name
);
14192 else if (current_templates
.start
->opcode_modifier
.jump
== JUMP_BYTE
)
14193 i
.types
[this_operand
].bitfield
.disp8
= 1;
14195 /* Check if this is a displacement only operand. */
14196 if (!i
.types
[this_operand
].bitfield
.baseindex
)
14197 i
.types
[this_operand
] =
14198 operand_type_or (operand_type_and_not (i
.types
[this_operand
], anydisp
),
14199 operand_type_and (i
.types
[this_operand
], types
));
14204 /* Return the active addressing mode, taking address override and
14205 registers forming the address into consideration. Update the
14206 address override prefix if necessary. */
14208 static enum flag_code
14209 i386_addressing_mode (void)
14211 enum flag_code addr_mode
;
14213 if (i
.prefix
[ADDR_PREFIX
])
14214 addr_mode
= flag_code
== CODE_32BIT
? CODE_16BIT
: CODE_32BIT
;
14215 else if (flag_code
== CODE_16BIT
14216 && is_cpu (current_templates
.start
, CpuMPX
)
14217 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
14218 from md_assemble() by "is not a valid base/index expression"
14219 when there is a base and/or index. */
14220 && !i
.types
[this_operand
].bitfield
.baseindex
)
14222 /* MPX insn memory operands with neither base nor index must be forced
14223 to use 32-bit addressing in 16-bit mode. */
14224 addr_mode
= CODE_32BIT
;
14225 i
.prefix
[ADDR_PREFIX
] = ADDR_PREFIX_OPCODE
;
14227 gas_assert (!i
.types
[this_operand
].bitfield
.disp16
);
14228 gas_assert (!i
.types
[this_operand
].bitfield
.disp32
);
14232 addr_mode
= flag_code
;
14234 #if INFER_ADDR_PREFIX
14235 if (i
.mem_operands
== 0)
14237 /* Infer address prefix from the first memory operand. */
14238 const reg_entry
*addr_reg
= i
.base_reg
;
14240 if (addr_reg
== NULL
)
14241 addr_reg
= i
.index_reg
;
14245 if (addr_reg
->reg_type
.bitfield
.dword
)
14246 addr_mode
= CODE_32BIT
;
14247 else if (flag_code
!= CODE_64BIT
14248 && addr_reg
->reg_type
.bitfield
.word
)
14249 addr_mode
= CODE_16BIT
;
14251 if (addr_mode
!= flag_code
)
14253 i
.prefix
[ADDR_PREFIX
] = ADDR_PREFIX_OPCODE
;
14255 /* Change the size of any displacement too. At most one
14256 of Disp16 or Disp32 is set.
14257 FIXME. There doesn't seem to be any real need for
14258 separate Disp16 and Disp32 flags. The same goes for
14259 Imm16 and Imm32. Removing them would probably clean
14260 up the code quite a lot. */
14261 if (flag_code
!= CODE_64BIT
14262 && (i
.types
[this_operand
].bitfield
.disp16
14263 || i
.types
[this_operand
].bitfield
.disp32
))
14265 static const i386_operand_type disp16_32
= {
14266 .bitfield
= { .disp16
= 1, .disp32
= 1 }
14269 i
.types
[this_operand
]
14270 = operand_type_xor (i
.types
[this_operand
], disp16_32
);
14281 /* Make sure the memory operand we've been dealt is valid.
14282 Return 1 on success, 0 on a failure. */
14285 i386_index_check (const char *operand_string
)
14287 const char *kind
= "base/index";
14288 enum flag_code addr_mode
= i386_addressing_mode ();
14289 const insn_template
*t
= current_templates
.end
- 1;
14291 if (t
->opcode_modifier
.isstring
)
14293 /* Memory operands of string insns are special in that they only allow
14294 a single register (rDI, rSI, or rBX) as their memory address. */
14295 const reg_entry
*expected_reg
;
14296 static const char di_si
[][2][4] =
14302 static const char bx
[][4] = { "ebx", "bx", "rbx" };
14304 kind
= "string address";
14306 if (t
->opcode_modifier
.prefixok
== PrefixRep
)
14308 int es_op
= t
->opcode_modifier
.isstring
- IS_STRING_ES_OP0
;
14311 if (!t
->operand_types
[0].bitfield
.baseindex
14312 || ((!i
.mem_operands
!= !intel_syntax
)
14313 && t
->operand_types
[1].bitfield
.baseindex
))
14316 = (const reg_entry
*) str_hash_find (reg_hash
,
14317 di_si
[addr_mode
][op
== es_op
]);
14321 = (const reg_entry
*)str_hash_find (reg_hash
, bx
[addr_mode
]);
14323 if (i
.base_reg
!= expected_reg
14325 || operand_type_check (i
.types
[this_operand
], disp
))
14327 /* The second memory operand must have the same size as
14331 && !((addr_mode
== CODE_64BIT
14332 && i
.base_reg
->reg_type
.bitfield
.qword
)
14333 || (addr_mode
== CODE_32BIT
14334 ? i
.base_reg
->reg_type
.bitfield
.dword
14335 : i
.base_reg
->reg_type
.bitfield
.word
)))
14338 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
14340 intel_syntax
? '[' : '(',
14342 expected_reg
->reg_name
,
14343 intel_syntax
? ']' : ')');
14350 as_bad (_("`%s' is not a valid %s expression"),
14351 operand_string
, kind
);
14356 t
= current_templates
.start
;
14358 if (addr_mode
!= CODE_16BIT
)
14360 /* 32-bit/64-bit checks. */
14361 if (i
.disp_encoding
== disp_encoding_16bit
)
14364 as_bad (_("invalid `%s' prefix"),
14365 addr_mode
== CODE_16BIT
? "{disp32}" : "{disp16}");
14370 && ((addr_mode
== CODE_64BIT
14371 ? !i
.base_reg
->reg_type
.bitfield
.qword
14372 : !i
.base_reg
->reg_type
.bitfield
.dword
)
14373 || (i
.index_reg
&& i
.base_reg
->reg_num
== RegIP
)
14374 || i
.base_reg
->reg_num
== RegIZ
))
14376 && !i
.index_reg
->reg_type
.bitfield
.xmmword
14377 && !i
.index_reg
->reg_type
.bitfield
.ymmword
14378 && !i
.index_reg
->reg_type
.bitfield
.zmmword
14379 && ((addr_mode
== CODE_64BIT
14380 ? !i
.index_reg
->reg_type
.bitfield
.qword
14381 : !i
.index_reg
->reg_type
.bitfield
.dword
)
14382 || !i
.index_reg
->reg_type
.bitfield
.baseindex
)))
14385 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
14386 if (t
->mnem_off
== MN_bndmk
14387 || t
->mnem_off
== MN_bndldx
14388 || t
->mnem_off
== MN_bndstx
14389 || t
->opcode_modifier
.sib
== SIBMEM
)
14391 /* They cannot use RIP-relative addressing. */
14392 if (i
.base_reg
&& i
.base_reg
->reg_num
== RegIP
)
14394 as_bad (_("`%s' cannot be used here"), operand_string
);
14398 /* bndldx and bndstx ignore their scale factor. */
14399 if ((t
->mnem_off
== MN_bndldx
|| t
->mnem_off
== MN_bndstx
)
14400 && i
.log2_scale_factor
)
14401 as_warn (_("register scaling is being ignored here"));
14406 /* 16-bit checks. */
14407 if (i
.disp_encoding
== disp_encoding_32bit
)
14411 && (!i
.base_reg
->reg_type
.bitfield
.word
14412 || !i
.base_reg
->reg_type
.bitfield
.baseindex
))
14414 && (!i
.index_reg
->reg_type
.bitfield
.word
14415 || !i
.index_reg
->reg_type
.bitfield
.baseindex
14417 && i
.base_reg
->reg_num
< 6
14418 && i
.index_reg
->reg_num
>= 6
14419 && i
.log2_scale_factor
== 0))))
14426 /* Handle vector immediates. */
14429 RC_SAE_immediate (const char *imm_start
)
14431 const char *pstr
= imm_start
;
14436 pstr
= RC_SAE_specifier (pstr
+ 1);
14440 if (*pstr
++ != '}')
14442 as_bad (_("Missing '}': '%s'"), imm_start
);
14445 /* RC/SAE immediate string should contain nothing more. */;
14448 as_bad (_("Junk after '}': '%s'"), imm_start
);
14452 /* Internally this doesn't count as an operand. */
14458 static INLINE
bool starts_memory_operand (char c
)
14461 || is_name_beginner (c
)
14462 || strchr ("([\"+-!~", c
);
14465 /* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
14469 i386_att_operand (char *operand_string
)
14471 const reg_entry
*r
;
14473 char *op_string
= operand_string
;
14475 if (is_space_char (*op_string
))
14478 /* We check for an absolute prefix (differentiating,
14479 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
14480 if (*op_string
== ABSOLUTE_PREFIX
14481 && current_templates
.start
->opcode_modifier
.jump
)
14484 if (is_space_char (*op_string
))
14486 i
.jumpabsolute
= true;
14489 /* Check if operand is a register. */
14490 if ((r
= parse_register (op_string
, &end_op
)) != NULL
)
14492 i386_operand_type temp
;
14497 /* Check for a segment override by searching for ':' after a
14498 segment register. */
14499 op_string
= end_op
;
14500 if (is_space_char (*op_string
))
14502 if (*op_string
== ':' && r
->reg_type
.bitfield
.class == SReg
)
14504 i
.seg
[i
.mem_operands
] = r
;
14506 /* Skip the ':' and whitespace. */
14508 if (is_space_char (*op_string
))
14511 /* Handle case of %es:*foo. */
14512 if (!i
.jumpabsolute
&& *op_string
== ABSOLUTE_PREFIX
14513 && current_templates
.start
->opcode_modifier
.jump
)
14516 if (is_space_char (*op_string
))
14518 i
.jumpabsolute
= true;
14521 if (!starts_memory_operand (*op_string
))
14523 as_bad (_("bad memory operand `%s'"), op_string
);
14526 goto do_memory_reference
;
14529 /* Handle vector operations. */
14530 if (*op_string
== '{')
14532 op_string
= check_VecOperations (op_string
);
14533 if (op_string
== NULL
)
14539 as_bad (_("junk `%s' after register"), op_string
);
14543 /* Reject pseudo registers for .insn. */
14544 if (dot_insn () && r
->reg_type
.bitfield
.class == ClassNone
)
14546 as_bad (_("`%s%s' cannot be used here"),
14547 register_prefix
, r
->reg_name
);
14551 temp
= r
->reg_type
;
14552 temp
.bitfield
.baseindex
= 0;
14553 i
.types
[this_operand
] = operand_type_or (i
.types
[this_operand
],
14555 i
.types
[this_operand
].bitfield
.unspecified
= 0;
14556 i
.op
[this_operand
].regs
= r
;
14559 /* A GPR may follow an RC or SAE immediate only if a (vector) register
14560 operand was also present earlier on. */
14561 if (i
.rounding
.type
!= rc_none
&& temp
.bitfield
.class == Reg
14562 && i
.reg_operands
== 1)
14566 for (j
= 0; j
< ARRAY_SIZE (RC_NamesTable
); ++j
)
14567 if (i
.rounding
.type
== RC_NamesTable
[j
].type
)
14569 as_bad (_("`%s': misplaced `{%s}'"),
14570 insn_name (current_templates
.start
), RC_NamesTable
[j
].name
);
14574 else if (*op_string
== REGISTER_PREFIX
)
14576 as_bad (_("bad register name `%s'"), op_string
);
14579 else if (*op_string
== IMMEDIATE_PREFIX
)
14582 if (i
.jumpabsolute
)
14584 as_bad (_("immediate operand illegal with absolute jump"));
14587 if (!i386_immediate (op_string
))
14589 if (i
.rounding
.type
!= rc_none
)
14591 as_bad (_("`%s': RC/SAE operand must follow immediate operands"),
14592 insn_name (current_templates
.start
));
14596 else if (RC_SAE_immediate (operand_string
))
14598 /* If it is a RC or SAE immediate, do the necessary placement check:
14599 Only another immediate or a GPR may precede it. */
14600 if (i
.mem_operands
|| i
.reg_operands
+ i
.imm_operands
> 1
14601 || (i
.reg_operands
== 1
14602 && i
.op
[0].regs
->reg_type
.bitfield
.class != Reg
))
14604 as_bad (_("`%s': misplaced `%s'"),
14605 insn_name (current_templates
.start
), operand_string
);
14609 else if (starts_memory_operand (*op_string
))
14611 /* This is a memory reference of some sort. */
14614 /* Start and end of displacement string expression (if found). */
14615 char *displacement_string_start
;
14616 char *displacement_string_end
;
14618 do_memory_reference
:
14619 /* Check for base index form. We detect the base index form by
14620 looking for an ')' at the end of the operand, searching
14621 for the '(' matching it, and finding a REGISTER_PREFIX or ','
14623 base_string
= op_string
+ strlen (op_string
);
14625 /* Handle vector operations. */
14627 if (is_space_char (*base_string
))
14630 if (*base_string
== '}')
14632 char *vop_start
= NULL
;
14634 while (base_string
-- > op_string
)
14636 if (*base_string
== '"')
14638 if (*base_string
!= '{')
14641 vop_start
= base_string
;
14644 if (is_space_char (*base_string
))
14647 if (*base_string
!= '}')
14655 as_bad (_("unbalanced figure braces"));
14659 if (check_VecOperations (vop_start
) == NULL
)
14663 /* If we only have a displacement, set-up for it to be parsed later. */
14664 displacement_string_start
= op_string
;
14665 displacement_string_end
= base_string
+ 1;
14667 if (*base_string
== ')')
14670 unsigned int parens_not_balanced
= 0;
14671 bool in_quotes
= false;
14673 /* We've already checked that the number of left & right ()'s are
14674 equal, and that there's a matching set of double quotes. */
14675 end_op
= base_string
;
14676 for (temp_string
= op_string
; temp_string
< end_op
; temp_string
++)
14678 if (*temp_string
== '\\' && temp_string
[1] == '"')
14680 else if (*temp_string
== '"')
14681 in_quotes
= !in_quotes
;
14682 else if (!in_quotes
)
14684 if (*temp_string
== '(' && !parens_not_balanced
++)
14685 base_string
= temp_string
;
14686 if (*temp_string
== ')')
14687 --parens_not_balanced
;
14691 temp_string
= base_string
;
14693 /* Skip past '(' and whitespace. */
14694 gas_assert (*base_string
== '(');
14696 if (is_space_char (*base_string
))
14699 if (*base_string
== ','
14700 || ((i
.base_reg
= parse_register (base_string
, &end_op
))
14703 displacement_string_end
= temp_string
;
14705 i
.types
[this_operand
].bitfield
.baseindex
= 1;
14709 if (i
.base_reg
== &bad_reg
)
14711 base_string
= end_op
;
14712 if (is_space_char (*base_string
))
14716 /* There may be an index reg or scale factor here. */
14717 if (*base_string
== ',')
14720 if (is_space_char (*base_string
))
14723 if ((i
.index_reg
= parse_register (base_string
, &end_op
))
14726 if (i
.index_reg
== &bad_reg
)
14728 base_string
= end_op
;
14729 if (is_space_char (*base_string
))
14731 if (*base_string
== ',')
14734 if (is_space_char (*base_string
))
14737 else if (*base_string
!= ')')
14739 as_bad (_("expecting `,' or `)' "
14740 "after index register in `%s'"),
14745 else if (*base_string
== REGISTER_PREFIX
)
14747 end_op
= strchr (base_string
, ',');
14750 as_bad (_("bad register name `%s'"), base_string
);
14754 /* Check for scale factor. */
14755 if (*base_string
!= ')')
14757 char *end_scale
= i386_scale (base_string
);
14762 base_string
= end_scale
;
14763 if (is_space_char (*base_string
))
14765 if (*base_string
!= ')')
14767 as_bad (_("expecting `)' "
14768 "after scale factor in `%s'"),
14773 else if (!i
.index_reg
)
14775 as_bad (_("expecting index register or scale factor "
14776 "after `,'; got '%c'"),
14781 else if (*base_string
!= ')')
14783 as_bad (_("expecting `,' or `)' "
14784 "after base register in `%s'"),
14789 else if (*base_string
== REGISTER_PREFIX
)
14791 end_op
= strchr (base_string
, ',');
14794 as_bad (_("bad register name `%s'"), base_string
);
14799 /* If there's an expression beginning the operand, parse it,
14800 assuming displacement_string_start and
14801 displacement_string_end are meaningful. */
14802 if (displacement_string_start
!= displacement_string_end
)
14804 if (!i386_displacement (displacement_string_start
,
14805 displacement_string_end
))
14809 /* Special case for (%dx) while doing input/output op. */
14811 && i
.base_reg
->reg_type
.bitfield
.instance
== RegD
14812 && i
.base_reg
->reg_type
.bitfield
.word
14813 && i
.index_reg
== 0
14814 && i
.log2_scale_factor
== 0
14815 && i
.seg
[i
.mem_operands
] == 0
14816 && !operand_type_check (i
.types
[this_operand
], disp
))
14818 i
.types
[this_operand
] = i
.base_reg
->reg_type
;
14819 i
.op
[this_operand
].regs
= i
.base_reg
;
14821 i
.input_output_operand
= true;
14825 if (i386_index_check (operand_string
) == 0)
14827 i
.flags
[this_operand
] |= Operand_Mem
;
14832 /* It's not a memory operand; argh! */
14833 as_bad (_("invalid char %s beginning operand %d `%s'"),
14834 output_invalid (*op_string
),
14839 return 1; /* Normal return. */
14842 /* Calculate the maximum variable size (i.e., excluding fr_fix)
14843 that an rs_machine_dependent frag may reach. */
14846 i386_frag_max_var (fragS
*frag
)
14848 /* The only relaxable frags are for jumps.
14849 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
14850 gas_assert (frag
->fr_type
== rs_machine_dependent
);
14851 return TYPE_FROM_RELAX_STATE (frag
->fr_subtype
) == UNCOND_JUMP
? 4 : 5;
14854 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14856 elf_symbol_resolved_in_segment_p (symbolS
*fr_symbol
, offsetT fr_var
)
14858 /* STT_GNU_IFUNC symbol must go through PLT. */
14859 if ((symbol_get_bfdsym (fr_symbol
)->flags
14860 & BSF_GNU_INDIRECT_FUNCTION
) != 0)
14863 if (!S_IS_EXTERNAL (fr_symbol
))
14864 /* Symbol may be weak or local. */
14865 return !S_IS_WEAK (fr_symbol
);
14867 /* Global symbols with non-default visibility can't be preempted. */
14868 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol
)) != STV_DEFAULT
)
14871 if (fr_var
!= NO_RELOC
)
14872 switch ((enum bfd_reloc_code_real
) fr_var
)
14874 case BFD_RELOC_386_PLT32
:
14875 case BFD_RELOC_X86_64_PLT32
:
14876 /* Symbol with PLT relocation may be preempted. */
14882 /* Global symbols with default visibility in a shared library may be
14883 preempted by another definition. */
14888 /* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
14889 Note also work for Skylake and Cascadelake.
14890 ---------------------------------------------------------------------
14891 | JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
14892 | ------ | ----------- | ------- | -------- |
14894 | Jno | N | N | Y |
14895 | Jc/Jb | Y | N | Y |
14896 | Jae/Jnb | Y | N | Y |
14897 | Je/Jz | Y | Y | Y |
14898 | Jne/Jnz | Y | Y | Y |
14899 | Jna/Jbe | Y | N | Y |
14900 | Ja/Jnbe | Y | N | Y |
14902 | Jns | N | N | Y |
14903 | Jp/Jpe | N | N | Y |
14904 | Jnp/Jpo | N | N | Y |
14905 | Jl/Jnge | Y | Y | Y |
14906 | Jge/Jnl | Y | Y | Y |
14907 | Jle/Jng | Y | Y | Y |
14908 | Jg/Jnle | Y | Y | Y |
14909 --------------------------------------------------------------------- */
14911 i386_macro_fusible_p (enum mf_cmp_kind mf_cmp
, enum mf_jcc_kind mf_jcc
)
14913 if (mf_cmp
== mf_cmp_alu_cmp
)
14914 return ((mf_jcc
>= mf_jcc_jc
&& mf_jcc
<= mf_jcc_jna
)
14915 || mf_jcc
== mf_jcc_jl
|| mf_jcc
== mf_jcc_jle
);
14916 if (mf_cmp
== mf_cmp_incdec
)
14917 return (mf_jcc
== mf_jcc_je
|| mf_jcc
== mf_jcc_jl
14918 || mf_jcc
== mf_jcc_jle
);
14919 if (mf_cmp
== mf_cmp_test_and
)
14924 /* Return the next non-empty frag. */
14927 i386_next_non_empty_frag (fragS
*fragP
)
14929 /* There may be a frag with a ".fill 0" when there is no room in
14930 the current frag for frag_grow in output_insn. */
14931 for (fragP
= fragP
->fr_next
;
14933 && fragP
->fr_type
== rs_fill
14934 && fragP
->fr_fix
== 0);
14935 fragP
= fragP
->fr_next
)
14940 /* Return the next jcc frag after BRANCH_PADDING. */
14943 i386_next_fusible_jcc_frag (fragS
*maybe_cmp_fragP
, fragS
*pad_fragP
)
14945 fragS
*branch_fragP
;
14949 if (pad_fragP
->fr_type
== rs_machine_dependent
14950 && (TYPE_FROM_RELAX_STATE (pad_fragP
->fr_subtype
)
14951 == BRANCH_PADDING
))
14953 branch_fragP
= i386_next_non_empty_frag (pad_fragP
);
14954 if (branch_fragP
->fr_type
!= rs_machine_dependent
)
14956 if (TYPE_FROM_RELAX_STATE (branch_fragP
->fr_subtype
) == COND_JUMP
14957 && i386_macro_fusible_p (maybe_cmp_fragP
->tc_frag_data
.mf_type
,
14958 pad_fragP
->tc_frag_data
.mf_type
))
14959 return branch_fragP
;
14965 /* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
14968 i386_classify_machine_dependent_frag (fragS
*fragP
)
14972 fragS
*branch_fragP
;
14974 unsigned int max_prefix_length
;
14976 if (fragP
->tc_frag_data
.classified
)
14979 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
14980 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
14981 for (next_fragP
= fragP
;
14982 next_fragP
!= NULL
;
14983 next_fragP
= next_fragP
->fr_next
)
14985 next_fragP
->tc_frag_data
.classified
= 1;
14986 if (next_fragP
->fr_type
== rs_machine_dependent
)
14987 switch (TYPE_FROM_RELAX_STATE (next_fragP
->fr_subtype
))
14989 case BRANCH_PADDING
:
14990 /* The BRANCH_PADDING frag must be followed by a branch
14992 branch_fragP
= i386_next_non_empty_frag (next_fragP
);
14993 next_fragP
->tc_frag_data
.u
.branch_fragP
= branch_fragP
;
14995 case FUSED_JCC_PADDING
:
14996 /* Check if this is a fused jcc:
14998 CMP like instruction
15002 cmp_fragP
= i386_next_non_empty_frag (next_fragP
);
15003 pad_fragP
= i386_next_non_empty_frag (cmp_fragP
);
15004 branch_fragP
= i386_next_fusible_jcc_frag (next_fragP
, pad_fragP
);
15007 /* The BRANCH_PADDING frag is merged with the
15008 FUSED_JCC_PADDING frag. */
15009 next_fragP
->tc_frag_data
.u
.branch_fragP
= branch_fragP
;
15010 /* CMP like instruction size. */
15011 next_fragP
->tc_frag_data
.cmp_size
= cmp_fragP
->fr_fix
;
15012 frag_wane (pad_fragP
);
15013 /* Skip to branch_fragP. */
15014 next_fragP
= branch_fragP
;
15016 else if (next_fragP
->tc_frag_data
.max_prefix_length
)
15018 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
15020 next_fragP
->fr_subtype
15021 = ENCODE_RELAX_STATE (BRANCH_PREFIX
, 0);
15022 next_fragP
->tc_frag_data
.max_bytes
15023 = next_fragP
->tc_frag_data
.max_prefix_length
;
15024 /* This will be updated in the BRANCH_PREFIX scan. */
15025 next_fragP
->tc_frag_data
.max_prefix_length
= 0;
15028 frag_wane (next_fragP
);
15033 /* Stop if there is no BRANCH_PREFIX. */
15034 if (!align_branch_prefix_size
)
15037 /* Scan for BRANCH_PREFIX. */
15038 for (; fragP
!= NULL
; fragP
= fragP
->fr_next
)
15040 if (fragP
->fr_type
!= rs_machine_dependent
15041 || (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
)
15045 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
15046 COND_JUMP_PREFIX. */
15047 max_prefix_length
= 0;
15048 for (next_fragP
= fragP
;
15049 next_fragP
!= NULL
;
15050 next_fragP
= next_fragP
->fr_next
)
15052 if (next_fragP
->fr_type
== rs_fill
)
15053 /* Skip rs_fill frags. */
15055 else if (next_fragP
->fr_type
!= rs_machine_dependent
)
15056 /* Stop for all other frags. */
15059 /* rs_machine_dependent frags. */
15060 if (TYPE_FROM_RELAX_STATE (next_fragP
->fr_subtype
)
15063 /* Count BRANCH_PREFIX frags. */
15064 if (max_prefix_length
>= MAX_FUSED_JCC_PADDING_SIZE
)
15066 max_prefix_length
= MAX_FUSED_JCC_PADDING_SIZE
;
15067 frag_wane (next_fragP
);
15071 += next_fragP
->tc_frag_data
.max_bytes
;
15073 else if ((TYPE_FROM_RELAX_STATE (next_fragP
->fr_subtype
)
15075 || (TYPE_FROM_RELAX_STATE (next_fragP
->fr_subtype
)
15076 == FUSED_JCC_PADDING
))
15078 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
15079 fragP
->tc_frag_data
.u
.padding_fragP
= next_fragP
;
15083 /* Stop for other rs_machine_dependent frags. */
15087 fragP
->tc_frag_data
.max_prefix_length
= max_prefix_length
;
15089 /* Skip to the next frag. */
15090 fragP
= next_fragP
;
15094 /* Compute padding size for
15097 CMP like instruction
15099 COND_JUMP/UNCOND_JUMP
15104 COND_JUMP/UNCOND_JUMP
15108 i386_branch_padding_size (fragS
*fragP
, offsetT address
)
15110 unsigned int offset
, size
, padding_size
;
15111 fragS
*branch_fragP
= fragP
->tc_frag_data
.u
.branch_fragP
;
15113 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
15115 address
= fragP
->fr_address
;
15116 address
+= fragP
->fr_fix
;
15118 /* CMP like instrunction size. */
15119 size
= fragP
->tc_frag_data
.cmp_size
;
15121 /* The base size of the branch frag. */
15122 size
+= branch_fragP
->fr_fix
;
15124 /* Add opcode and displacement bytes for the rs_machine_dependent
15126 if (branch_fragP
->fr_type
== rs_machine_dependent
)
15127 size
+= md_relax_table
[branch_fragP
->fr_subtype
].rlx_length
;
15129 /* Check if branch is within boundary and doesn't end at the last
15131 offset
= address
& ((1U << align_branch_power
) - 1);
15132 if ((offset
+ size
) >= (1U << align_branch_power
))
15133 /* Padding needed to avoid crossing boundary. */
15134 padding_size
= (1U << align_branch_power
) - offset
;
15136 /* No padding needed. */
15139 /* The return value may be saved in tc_frag_data.length which is
15141 if (!fits_in_unsigned_byte (padding_size
))
15144 return padding_size
;
15147 /* i386_generic_table_relax_frag()
15149 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
15150 grow/shrink padding to align branch frags. Hand others to
15154 i386_generic_table_relax_frag (segT segment
, fragS
*fragP
, long stretch
)
15156 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PADDING
15157 || TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == FUSED_JCC_PADDING
)
15159 long padding_size
= i386_branch_padding_size (fragP
, 0);
15160 long grow
= padding_size
- fragP
->tc_frag_data
.length
;
15162 /* When the BRANCH_PREFIX frag is used, the computed address
15163 must match the actual address and there should be no padding. */
15164 if (fragP
->tc_frag_data
.padding_address
15165 && (fragP
->tc_frag_data
.padding_address
!= fragP
->fr_address
15169 /* Update the padding size. */
15171 fragP
->tc_frag_data
.length
= padding_size
;
15175 else if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PREFIX
)
15177 fragS
*padding_fragP
, *next_fragP
;
15178 long padding_size
, left_size
, last_size
;
15180 padding_fragP
= fragP
->tc_frag_data
.u
.padding_fragP
;
15181 if (!padding_fragP
)
15182 /* Use the padding set by the leading BRANCH_PREFIX frag. */
15183 return (fragP
->tc_frag_data
.length
15184 - fragP
->tc_frag_data
.last_length
);
15186 /* Compute the relative address of the padding frag in the very
15187 first time where the BRANCH_PREFIX frag sizes are zero. */
15188 if (!fragP
->tc_frag_data
.padding_address
)
15189 fragP
->tc_frag_data
.padding_address
15190 = padding_fragP
->fr_address
- (fragP
->fr_address
- stretch
);
15192 /* First update the last length from the previous interation. */
15193 left_size
= fragP
->tc_frag_data
.prefix_length
;
15194 for (next_fragP
= fragP
;
15195 next_fragP
!= padding_fragP
;
15196 next_fragP
= next_fragP
->fr_next
)
15197 if (next_fragP
->fr_type
== rs_machine_dependent
15198 && (TYPE_FROM_RELAX_STATE (next_fragP
->fr_subtype
)
15203 int max
= next_fragP
->tc_frag_data
.max_bytes
;
15207 if (max
> left_size
)
15212 next_fragP
->tc_frag_data
.last_length
= size
;
15216 next_fragP
->tc_frag_data
.last_length
= 0;
15219 /* Check the padding size for the padding frag. */
15220 padding_size
= i386_branch_padding_size
15221 (padding_fragP
, (fragP
->fr_address
15222 + fragP
->tc_frag_data
.padding_address
));
15224 last_size
= fragP
->tc_frag_data
.prefix_length
;
15225 /* Check if there is change from the last interation. */
15226 if (padding_size
== last_size
)
15228 /* Update the expected address of the padding frag. */
15229 padding_fragP
->tc_frag_data
.padding_address
15230 = (fragP
->fr_address
+ padding_size
15231 + fragP
->tc_frag_data
.padding_address
);
15235 if (padding_size
> fragP
->tc_frag_data
.max_prefix_length
)
15237 /* No padding if there is no sufficient room. Clear the
15238 expected address of the padding frag. */
15239 padding_fragP
->tc_frag_data
.padding_address
= 0;
15243 /* Store the expected address of the padding frag. */
15244 padding_fragP
->tc_frag_data
.padding_address
15245 = (fragP
->fr_address
+ padding_size
15246 + fragP
->tc_frag_data
.padding_address
);
15248 fragP
->tc_frag_data
.prefix_length
= padding_size
;
15250 /* Update the length for the current interation. */
15251 left_size
= padding_size
;
15252 for (next_fragP
= fragP
;
15253 next_fragP
!= padding_fragP
;
15254 next_fragP
= next_fragP
->fr_next
)
15255 if (next_fragP
->fr_type
== rs_machine_dependent
15256 && (TYPE_FROM_RELAX_STATE (next_fragP
->fr_subtype
)
15261 int max
= next_fragP
->tc_frag_data
.max_bytes
;
15265 if (max
> left_size
)
15270 next_fragP
->tc_frag_data
.length
= size
;
15274 next_fragP
->tc_frag_data
.length
= 0;
15277 return (fragP
->tc_frag_data
.length
15278 - fragP
->tc_frag_data
.last_length
);
15280 return relax_frag (segment
, fragP
, stretch
);
15283 /* md_estimate_size_before_relax()
15285 Called just before relax() for rs_machine_dependent frags. The x86
15286 assembler uses these frags to handle variable size jump
15289 Any symbol that is now undefined will not become defined.
15290 Return the correct fr_subtype in the frag.
15291 Return the initial "guess for variable size of frag" to caller.
15292 The guess is actually the growth beyond the fixed part. Whatever
15293 we do to grow the fixed or variable part contributes to our
15297 md_estimate_size_before_relax (fragS
*fragP
, segT segment
)
15299 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PADDING
15300 || TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PREFIX
15301 || TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == FUSED_JCC_PADDING
)
15303 i386_classify_machine_dependent_frag (fragP
);
15304 return fragP
->tc_frag_data
.length
;
15307 /* We've already got fragP->fr_subtype right; all we have to do is
15308 check for un-relaxable symbols. On an ELF system, we can't relax
15309 an externally visible symbol, because it may be overridden by a
15311 if (S_GET_SEGMENT (fragP
->fr_symbol
) != segment
15312 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15314 && !elf_symbol_resolved_in_segment_p (fragP
->fr_symbol
,
15317 #if defined (OBJ_COFF) && defined (TE_PE)
15318 || (OUTPUT_FLAVOR
== bfd_target_coff_flavour
15319 && S_IS_WEAK (fragP
->fr_symbol
))
15323 /* Symbol is undefined in this segment, or we need to keep a
15324 reloc so that weak symbols can be overridden. */
15325 int size
= (fragP
->fr_subtype
& CODE16
) ? 2 : 4;
15326 enum bfd_reloc_code_real reloc_type
;
15327 unsigned char *opcode
;
15331 if (fragP
->fr_var
!= NO_RELOC
)
15332 reloc_type
= (enum bfd_reloc_code_real
) fragP
->fr_var
;
15333 else if (size
== 2)
15334 reloc_type
= BFD_RELOC_16_PCREL
;
15335 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15336 else if (fragP
->tc_frag_data
.code
== CODE_64BIT
15337 && fragP
->fr_offset
== 0
15338 && need_plt32_p (fragP
->fr_symbol
))
15339 reloc_type
= BFD_RELOC_X86_64_PLT32
;
15342 reloc_type
= BFD_RELOC_32_PCREL
;
15344 old_fr_fix
= fragP
->fr_fix
;
15345 opcode
= (unsigned char *) fragP
->fr_opcode
;
15347 switch (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
))
15350 /* Make jmp (0xeb) a (d)word displacement jump. */
15352 fragP
->fr_fix
+= size
;
15353 fixP
= fix_new (fragP
, old_fr_fix
, size
,
15355 fragP
->fr_offset
, 1,
15361 && (!no_cond_jump_promotion
|| fragP
->fr_var
!= NO_RELOC
))
15363 /* Negate the condition, and branch past an
15364 unconditional jump. */
15367 /* Insert an unconditional jump. */
15369 /* We added two extra opcode bytes, and have a two byte
15371 fragP
->fr_fix
+= 2 + 2;
15372 fix_new (fragP
, old_fr_fix
+ 2, 2,
15374 fragP
->fr_offset
, 1,
15378 /* Fall through. */
15381 if (no_cond_jump_promotion
&& fragP
->fr_var
== NO_RELOC
)
15383 fragP
->fr_fix
+= 1;
15384 fixP
= fix_new (fragP
, old_fr_fix
, 1,
15386 fragP
->fr_offset
, 1,
15387 BFD_RELOC_8_PCREL
);
15388 fixP
->fx_signed
= 1;
15392 /* This changes the byte-displacement jump 0x7N
15393 to the (d)word-displacement jump 0x0f,0x8N. */
15394 opcode
[1] = opcode
[0] + 0x10;
15395 opcode
[0] = TWO_BYTE_OPCODE_ESCAPE
;
15396 /* We've added an opcode byte. */
15397 fragP
->fr_fix
+= 1 + size
;
15398 fixP
= fix_new (fragP
, old_fr_fix
+ 1, size
,
15400 fragP
->fr_offset
, 1,
15405 BAD_CASE (fragP
->fr_subtype
);
15409 /* All jumps handled here are signed, but don't unconditionally use a
15410 signed limit check for 32 and 16 bit jumps as we want to allow wrap
15411 around at 4G (outside of 64-bit mode) and 64k. */
15412 if (size
== 4 && flag_code
== CODE_64BIT
)
15413 fixP
->fx_signed
= 1;
15416 return fragP
->fr_fix
- old_fr_fix
;
15419 /* Guess size depending on current relax state. Initially the relax
15420 state will correspond to a short jump and we return 1, because
15421 the variable part of the frag (the branch offset) is one byte
15422 long. However, we can relax a section more than once and in that
15423 case we must either set fr_subtype back to the unrelaxed state,
15424 or return the value for the appropriate branch. */
15425 return md_relax_table
[fragP
->fr_subtype
].rlx_length
;
15428 /* Called after relax() is finished.
15430 In: Address of frag.
15431 fr_type == rs_machine_dependent.
15432 fr_subtype is what the address relaxed to.
15434 Out: Any fixSs and constants are set up.
15435 Caller will turn frag into a ".space 0". */
15438 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
, segT sec ATTRIBUTE_UNUSED
,
15441 unsigned char *opcode
;
15442 unsigned char *where_to_put_displacement
= NULL
;
15443 offsetT target_address
;
15444 offsetT opcode_address
;
15445 unsigned int extension
= 0;
15446 offsetT displacement_from_opcode_start
;
15448 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PADDING
15449 || TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == FUSED_JCC_PADDING
15450 || TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PREFIX
)
15452 /* Generate nop padding. */
15453 unsigned int size
= fragP
->tc_frag_data
.length
;
15456 if (size
> fragP
->tc_frag_data
.max_bytes
)
15462 const char *branch
= "branch";
15463 const char *prefix
= "";
15464 fragS
*padding_fragP
;
15465 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
)
15468 padding_fragP
= fragP
->tc_frag_data
.u
.padding_fragP
;
15469 switch (fragP
->tc_frag_data
.default_prefix
)
15474 case CS_PREFIX_OPCODE
:
15477 case DS_PREFIX_OPCODE
:
15480 case ES_PREFIX_OPCODE
:
15483 case FS_PREFIX_OPCODE
:
15486 case GS_PREFIX_OPCODE
:
15489 case SS_PREFIX_OPCODE
:
15494 msg
= _("%s:%u: add %d%s at 0x%llx to align "
15495 "%s within %d-byte boundary\n");
15497 msg
= _("%s:%u: add additional %d%s at 0x%llx to "
15498 "align %s within %d-byte boundary\n");
15502 padding_fragP
= fragP
;
15503 msg
= _("%s:%u: add %d%s-byte nop at 0x%llx to align "
15504 "%s within %d-byte boundary\n");
15508 switch (padding_fragP
->tc_frag_data
.branch_type
)
15510 case align_branch_jcc
:
15513 case align_branch_fused
:
15514 branch
= "fused jcc";
15516 case align_branch_jmp
:
15519 case align_branch_call
:
15522 case align_branch_indirect
:
15523 branch
= "indiret branch";
15525 case align_branch_ret
:
15532 fprintf (stdout
, msg
,
15533 fragP
->fr_file
, fragP
->fr_line
, size
, prefix
,
15534 (long long) fragP
->fr_address
, branch
,
15535 1 << align_branch_power
);
15537 if (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) == BRANCH_PREFIX
)
15538 memset (fragP
->fr_opcode
,
15539 fragP
->tc_frag_data
.default_prefix
, size
);
15541 i386_generate_nops (fragP
, (char *) fragP
->fr_opcode
,
15543 fragP
->fr_fix
+= size
;
15548 opcode
= (unsigned char *) fragP
->fr_opcode
;
15550 /* Address we want to reach in file space. */
15551 target_address
= S_GET_VALUE (fragP
->fr_symbol
) + fragP
->fr_offset
;
15553 /* Address opcode resides at in file space. */
15554 opcode_address
= fragP
->fr_address
+ fragP
->fr_fix
;
15556 /* Displacement from opcode start to fill into instruction. */
15557 displacement_from_opcode_start
= target_address
- opcode_address
;
15559 if ((fragP
->fr_subtype
& BIG
) == 0)
15561 /* Don't have to change opcode. */
15562 extension
= 1; /* 1 opcode + 1 displacement */
15563 where_to_put_displacement
= &opcode
[1];
15567 if (no_cond_jump_promotion
15568 && TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) != UNCOND_JUMP
)
15569 as_warn_where (fragP
->fr_file
, fragP
->fr_line
,
15570 _("long jump required"));
15572 switch (fragP
->fr_subtype
)
15574 case ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG
):
15575 extension
= 4; /* 1 opcode + 4 displacement */
15577 where_to_put_displacement
= &opcode
[1];
15580 case ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG16
):
15581 extension
= 2; /* 1 opcode + 2 displacement */
15583 where_to_put_displacement
= &opcode
[1];
15586 case ENCODE_RELAX_STATE (COND_JUMP
, BIG
):
15587 case ENCODE_RELAX_STATE (COND_JUMP86
, BIG
):
15588 extension
= 5; /* 2 opcode + 4 displacement */
15589 opcode
[1] = opcode
[0] + 0x10;
15590 opcode
[0] = TWO_BYTE_OPCODE_ESCAPE
;
15591 where_to_put_displacement
= &opcode
[2];
15594 case ENCODE_RELAX_STATE (COND_JUMP
, BIG16
):
15595 extension
= 3; /* 2 opcode + 2 displacement */
15596 opcode
[1] = opcode
[0] + 0x10;
15597 opcode
[0] = TWO_BYTE_OPCODE_ESCAPE
;
15598 where_to_put_displacement
= &opcode
[2];
15601 case ENCODE_RELAX_STATE (COND_JUMP86
, BIG16
):
15606 where_to_put_displacement
= &opcode
[3];
15610 BAD_CASE (fragP
->fr_subtype
);
15615 /* If size if less then four we are sure that the operand fits,
15616 but if it's 4, then it could be that the displacement is larger
15618 if (DISP_SIZE_FROM_RELAX_STATE (fragP
->fr_subtype
) == 4
15620 && ((addressT
) (displacement_from_opcode_start
- extension
15621 + ((addressT
) 1 << 31))
15622 > (((addressT
) 2 << 31) - 1)))
15624 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
15625 _("jump target out of range"));
15626 /* Make us emit 0. */
15627 displacement_from_opcode_start
= extension
;
15629 /* Now put displacement after opcode. */
15630 md_number_to_chars ((char *) where_to_put_displacement
,
15631 (valueT
) (displacement_from_opcode_start
- extension
),
15632 DISP_SIZE_FROM_RELAX_STATE (fragP
->fr_subtype
));
15633 fragP
->fr_fix
+= extension
;
15636 /* Apply a fixup (fixP) to segment data, once it has been determined
15637 by our caller that we have all the info we need to fix it up.
15639 Parameter valP is the pointer to the value of the bits.
15641 On the 386, immediates, displacements, and data pointers are all in
15642 the same (little-endian) format, so we don't need to care about which
15643 we are handling. */
15646 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
15648 char *p
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
15649 valueT value
= *valP
;
15651 #if !defined (TE_Mach)
15652 if (fixP
->fx_pcrel
)
15654 switch (fixP
->fx_r_type
)
15660 fixP
->fx_r_type
= BFD_RELOC_64_PCREL
;
15663 case BFD_RELOC_X86_64_32S
:
15664 fixP
->fx_r_type
= BFD_RELOC_32_PCREL
;
15667 fixP
->fx_r_type
= BFD_RELOC_16_PCREL
;
15670 fixP
->fx_r_type
= BFD_RELOC_8_PCREL
;
15675 if (fixP
->fx_addsy
!= NULL
15676 && (fixP
->fx_r_type
== BFD_RELOC_32_PCREL
15677 || fixP
->fx_r_type
== BFD_RELOC_64_PCREL
15678 || fixP
->fx_r_type
== BFD_RELOC_16_PCREL
15679 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
)
15680 && !use_rela_relocations
)
15682 /* This is a hack. There should be a better way to handle this.
15683 This covers for the fact that bfd_install_relocation will
15684 subtract the current location (for partial_inplace, PC relative
15685 relocations); see more below. */
15689 || OUTPUT_FLAVOR
== bfd_target_coff_flavour
15692 value
+= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
15694 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15697 segT sym_seg
= S_GET_SEGMENT (fixP
->fx_addsy
);
15699 if ((sym_seg
== seg
15700 || (symbol_section_p (fixP
->fx_addsy
)
15701 && sym_seg
!= absolute_section
))
15702 && !generic_force_reloc (fixP
))
15704 /* Yes, we add the values in twice. This is because
15705 bfd_install_relocation subtracts them out again. I think
15706 bfd_install_relocation is broken, but I don't dare change
15708 value
+= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
15712 #if defined (OBJ_COFF) && defined (TE_PE)
15713 /* For some reason, the PE format does not store a
15714 section address offset for a PC relative symbol. */
15715 if (S_GET_SEGMENT (fixP
->fx_addsy
) != seg
15716 || S_IS_WEAK (fixP
->fx_addsy
))
15717 value
+= md_pcrel_from (fixP
);
15720 #if defined (OBJ_COFF) && defined (TE_PE)
15721 if (fixP
->fx_addsy
!= NULL
15722 && S_IS_WEAK (fixP
->fx_addsy
)
15723 /* PR 16858: Do not modify weak function references. */
15724 && ! fixP
->fx_pcrel
)
15726 #if !defined (TE_PEP)
15727 /* For x86 PE weak function symbols are neither PC-relative
15728 nor do they set S_IS_FUNCTION. So the only reliable way
15729 to detect them is to check the flags of their containing
15731 if (S_GET_SEGMENT (fixP
->fx_addsy
) != NULL
15732 && S_GET_SEGMENT (fixP
->fx_addsy
)->flags
& SEC_CODE
)
15736 value
-= S_GET_VALUE (fixP
->fx_addsy
);
15740 /* Fix a few things - the dynamic linker expects certain values here,
15741 and we must not disappoint it. */
15742 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15743 if (IS_ELF
&& fixP
->fx_addsy
)
15744 switch (fixP
->fx_r_type
)
15746 case BFD_RELOC_386_PLT32
:
15747 case BFD_RELOC_X86_64_PLT32
:
15748 /* Make the jump instruction point to the address of the operand.
15749 At runtime we merely add the offset to the actual PLT entry.
15750 NB: Subtract the offset size only for jump instructions. */
15751 if (fixP
->fx_pcrel
)
15755 case BFD_RELOC_386_TLS_GD
:
15756 case BFD_RELOC_386_TLS_LDM
:
15757 case BFD_RELOC_386_TLS_IE_32
:
15758 case BFD_RELOC_386_TLS_IE
:
15759 case BFD_RELOC_386_TLS_GOTIE
:
15760 case BFD_RELOC_386_TLS_GOTDESC
:
15761 case BFD_RELOC_X86_64_TLSGD
:
15762 case BFD_RELOC_X86_64_TLSLD
:
15763 case BFD_RELOC_X86_64_GOTTPOFF
:
15764 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF
:
15765 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF
:
15766 case BFD_RELOC_X86_64_GOTPC32_TLSDESC
:
15767 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
:
15768 value
= 0; /* Fully resolved at runtime. No addend. */
15770 case BFD_RELOC_386_TLS_LE
:
15771 case BFD_RELOC_386_TLS_LDO_32
:
15772 case BFD_RELOC_386_TLS_LE_32
:
15773 case BFD_RELOC_X86_64_DTPOFF32
:
15774 case BFD_RELOC_X86_64_DTPOFF64
:
15775 case BFD_RELOC_X86_64_TPOFF32
:
15776 case BFD_RELOC_X86_64_TPOFF64
:
15777 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
15780 case BFD_RELOC_386_TLS_DESC_CALL
:
15781 case BFD_RELOC_X86_64_TLSDESC_CALL
:
15782 value
= 0; /* Fully resolved at runtime. No addend. */
15783 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
15787 case BFD_RELOC_VTABLE_INHERIT
:
15788 case BFD_RELOC_VTABLE_ENTRY
:
15795 #endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
15797 /* If not 64bit, massage value, to account for wraparound when !BFD64. */
15799 value
= extend_to_32bit_address (value
);
15802 #endif /* !defined (TE_Mach) */
15804 /* Are we finished with this relocation now? */
15805 if (fixP
->fx_addsy
== NULL
)
15808 switch (fixP
->fx_r_type
)
15810 case BFD_RELOC_X86_64_32S
:
15811 fixP
->fx_signed
= 1;
15818 #if defined (OBJ_COFF) && defined (TE_PE)
15819 else if (fixP
->fx_addsy
!= NULL
&& S_IS_WEAK (fixP
->fx_addsy
))
15822 /* Remember value for tc_gen_reloc. */
15823 fixP
->fx_addnumber
= value
;
15824 /* Clear out the frag for now. */
15828 else if (use_rela_relocations
)
15830 if (!disallow_64bit_reloc
|| fixP
->fx_r_type
== NO_RELOC
)
15831 fixP
->fx_no_overflow
= 1;
15832 /* Remember value for tc_gen_reloc. */
15833 fixP
->fx_addnumber
= value
;
15837 md_number_to_chars (p
, value
, fixP
->fx_size
);
15841 md_atof (int type
, char *litP
, int *sizeP
)
15843 /* This outputs the LITTLENUMs in REVERSE order;
15844 in accord with the bigendian 386. */
15845 return ieee_md_atof (type
, litP
, sizeP
, false);
15848 static char output_invalid_buf
[sizeof (unsigned char) * 2 + 6];
15851 output_invalid (int c
)
15854 snprintf (output_invalid_buf
, sizeof (output_invalid_buf
),
15857 snprintf (output_invalid_buf
, sizeof (output_invalid_buf
),
15858 "(0x%x)", (unsigned char) c
);
15859 return output_invalid_buf
;
15862 /* Verify that @r can be used in the current context. */
15864 static bool check_register (const reg_entry
*r
)
15866 if (allow_pseudo_reg
)
15869 if (operand_type_all_zero (&r
->reg_type
))
15872 if ((r
->reg_type
.bitfield
.dword
15873 || (r
->reg_type
.bitfield
.class == SReg
&& r
->reg_num
> 3)
15874 || r
->reg_type
.bitfield
.class == RegCR
15875 || r
->reg_type
.bitfield
.class == RegDR
)
15876 && !cpu_arch_flags
.bitfield
.cpui386
)
15879 if (r
->reg_type
.bitfield
.class == RegTR
15880 && (flag_code
== CODE_64BIT
15881 || !cpu_arch_flags
.bitfield
.cpui386
15882 || cpu_arch_isa_flags
.bitfield
.cpui586
15883 || cpu_arch_isa_flags
.bitfield
.cpui686
))
15886 if (r
->reg_type
.bitfield
.class == RegMMX
&& !cpu_arch_flags
.bitfield
.cpummx
)
15889 if (!cpu_arch_flags
.bitfield
.cpuavx512f
)
15891 if (r
->reg_type
.bitfield
.zmmword
15892 || r
->reg_type
.bitfield
.class == RegMask
)
15895 if (!cpu_arch_flags
.bitfield
.cpuavx
)
15897 if (r
->reg_type
.bitfield
.ymmword
)
15900 if (!cpu_arch_flags
.bitfield
.cpusse
&& r
->reg_type
.bitfield
.xmmword
)
15905 if (r
->reg_type
.bitfield
.zmmword
)
15907 if (vector_size
< VSZ512
)
15910 switch (i
.encoding
)
15912 case encoding_default
:
15913 case encoding_egpr
:
15914 i
.encoding
= encoding_evex512
;
15916 case encoding_evex
:
15917 case encoding_evex512
:
15920 i
.encoding
= encoding_error
;
15925 if (vector_size
< VSZ256
&& r
->reg_type
.bitfield
.ymmword
)
15928 if (r
->reg_type
.bitfield
.tmmword
15929 && (!cpu_arch_flags
.bitfield
.cpuamx_tile
15930 || flag_code
!= CODE_64BIT
))
15933 if (r
->reg_type
.bitfield
.class == RegBND
&& !cpu_arch_flags
.bitfield
.cpumpx
)
15936 /* Don't allow fake index register unless allow_index_reg isn't 0. */
15937 if (!allow_index_reg
&& r
->reg_num
== RegIZ
)
15940 /* Upper 16 vector registers are only available with VREX in 64bit
15941 mode, and require EVEX encoding. */
15942 if (r
->reg_flags
& RegVRex
)
15944 if (!cpu_arch_flags
.bitfield
.cpuavx512f
15945 || flag_code
!= CODE_64BIT
)
15948 switch (i
.encoding
)
15950 case encoding_default
:
15951 case encoding_egpr
:
15952 case encoding_evex512
:
15953 i
.encoding
= encoding_evex
;
15955 case encoding_evex
:
15958 i
.encoding
= encoding_error
;
15963 if (r
->reg_flags
& RegRex2
)
15965 if (!cpu_arch_flags
.bitfield
.cpuapx_f
15966 || flag_code
!= CODE_64BIT
)
15969 switch (i
.encoding
)
15971 case encoding_default
:
15972 i
.encoding
= encoding_egpr
;
15974 case encoding_egpr
:
15975 case encoding_evex
:
15976 case encoding_evex512
:
15979 i
.encoding
= encoding_error
;
15984 if (((r
->reg_flags
& (RegRex64
| RegRex
)) || r
->reg_type
.bitfield
.qword
)
15985 && (!cpu_arch_flags
.bitfield
.cpu64
15986 || r
->reg_type
.bitfield
.class != RegCR
15988 && flag_code
!= CODE_64BIT
)
15991 if (r
->reg_type
.bitfield
.class == SReg
&& r
->reg_num
== RegFlat
15998 /* REG_STRING starts *before* REGISTER_PREFIX. */
16000 static const reg_entry
*
16001 parse_real_register (const char *reg_string
, char **end_op
)
16003 const char *s
= reg_string
;
16005 char reg_name_given
[MAX_REG_NAME_SIZE
+ 1];
16006 const reg_entry
*r
;
16008 /* Skip possible REGISTER_PREFIX and possible whitespace. */
16009 if (*s
== REGISTER_PREFIX
)
16012 if (is_space_char (*s
))
16015 p
= reg_name_given
;
16016 while ((*p
++ = register_chars
[(unsigned char) *s
]) != '\0')
16018 if (p
>= reg_name_given
+ MAX_REG_NAME_SIZE
)
16019 return (const reg_entry
*) NULL
;
16023 if (is_part_of_name (*s
))
16024 return (const reg_entry
*) NULL
;
16026 *end_op
= (char *) s
;
16028 r
= (const reg_entry
*) str_hash_find (reg_hash
, reg_name_given
);
16030 /* Handle floating point regs, allowing spaces in the (i) part. */
16033 if (!cpu_arch_flags
.bitfield
.cpu8087
16034 && !cpu_arch_flags
.bitfield
.cpu287
16035 && !cpu_arch_flags
.bitfield
.cpu387
16036 && !allow_pseudo_reg
)
16037 return (const reg_entry
*) NULL
;
16039 if (is_space_char (*s
))
16044 if (is_space_char (*s
))
16046 if (*s
>= '0' && *s
<= '7')
16048 int fpr
= *s
- '0';
16050 if (is_space_char (*s
))
16054 *end_op
= (char *) s
+ 1;
16055 know (r
[fpr
].reg_num
== fpr
);
16059 /* We have "%st(" then garbage. */
16060 return (const reg_entry
*) NULL
;
16064 return r
&& check_register (r
) ? r
: NULL
;
16067 /* REG_STRING starts *before* REGISTER_PREFIX. */
16069 static const reg_entry
*
16070 parse_register (const char *reg_string
, char **end_op
)
16072 const reg_entry
*r
;
16074 if (*reg_string
== REGISTER_PREFIX
|| allow_naked_reg
)
16075 r
= parse_real_register (reg_string
, end_op
);
16080 char *save
= input_line_pointer
;
16081 char *buf
= xstrdup (reg_string
), *name
;
16084 input_line_pointer
= buf
;
16085 get_symbol_name (&name
);
16086 symbolP
= symbol_find (name
);
16087 while (symbolP
&& symbol_equated_p (symbolP
))
16089 const expressionS
*e
= symbol_get_value_expression(symbolP
);
16091 if (e
->X_add_number
)
16093 symbolP
= e
->X_add_symbol
;
16095 if (symbolP
&& S_GET_SEGMENT (symbolP
) == reg_section
)
16097 const expressionS
*e
= symbol_get_value_expression (symbolP
);
16099 if (e
->X_op
== O_register
)
16101 know (e
->X_add_number
>= 0
16102 && (valueT
) e
->X_add_number
< i386_regtab_size
);
16103 r
= i386_regtab
+ e
->X_add_number
;
16104 *end_op
= (char *) reg_string
+ (input_line_pointer
- buf
);
16106 if (r
&& !check_register (r
))
16108 as_bad (_("register '%s%s' cannot be used here"),
16109 register_prefix
, r
->reg_name
);
16113 input_line_pointer
= save
;
16120 i386_parse_name (char *name
, expressionS
*e
, char *nextcharP
)
16122 const reg_entry
*r
= NULL
;
16123 char *end
= input_line_pointer
;
16125 /* We only know the terminating character here. It being double quote could
16126 be the closing one of a quoted symbol name, or an opening one from a
16127 following string (or another quoted symbol name). Since the latter can't
16128 be valid syntax for anything, bailing in either case is good enough. */
16129 if (*nextcharP
== '"')
16133 if (*name
== REGISTER_PREFIX
|| allow_naked_reg
)
16134 r
= parse_real_register (name
, &input_line_pointer
);
16135 if (r
&& end
<= input_line_pointer
)
16137 *nextcharP
= *input_line_pointer
;
16138 *input_line_pointer
= 0;
16139 e
->X_op
= O_register
;
16140 e
->X_add_number
= r
- i386_regtab
;
16143 input_line_pointer
= end
;
16145 return intel_syntax
? i386_intel_parse_name (name
, e
) : 0;
16149 md_operand (expressionS
*e
)
16152 const reg_entry
*r
;
16154 switch (*input_line_pointer
)
16156 case REGISTER_PREFIX
:
16157 r
= parse_real_register (input_line_pointer
, &end
);
16160 e
->X_op
= O_register
;
16161 e
->X_add_number
= r
- i386_regtab
;
16162 input_line_pointer
= end
;
16167 gas_assert (intel_syntax
);
16168 end
= input_line_pointer
++;
16170 if (*input_line_pointer
== ']')
16172 ++input_line_pointer
;
16173 e
->X_op_symbol
= make_expr_symbol (e
);
16174 e
->X_add_symbol
= NULL
;
16175 e
->X_add_number
= 0;
16180 e
->X_op
= O_absent
;
16181 input_line_pointer
= end
;
16188 /* To maintain consistency with !BFD64 builds of gas record, whether any
16189 (binary) operator was involved in an expression. As expressions are
16190 evaluated in only 32 bits when !BFD64, we use this to decide whether to
16191 truncate results. */
16192 bool i386_record_operator (operatorT op
,
16193 const expressionS
*left
,
16194 const expressionS
*right
)
16196 if (op
== O_absent
)
16201 /* Since the expression parser applies unary operators fine to bignum
16202 operands, we don't need to be concerned of respective operands not
16203 fitting in 32 bits. */
16204 if (right
->X_op
== O_constant
&& right
->X_unsigned
16205 && !fits_in_unsigned_long (right
->X_add_number
))
16208 /* This isn't entirely right: The pattern can also result when constant
16209 expressions are folded (e.g. 0xffffffff + 1). */
16210 else if ((left
->X_op
== O_constant
&& left
->X_unsigned
16211 && !fits_in_unsigned_long (left
->X_add_number
))
16212 || (right
->X_op
== O_constant
&& right
->X_unsigned
16213 && !fits_in_unsigned_long (right
->X_add_number
)))
16214 expr_mode
= expr_large_value
;
16216 if (expr_mode
!= expr_large_value
)
16217 expr_mode
= expr_operator_present
;
16223 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16224 const char *md_shortopts
= "kVQ:sqnO::";
16226 const char *md_shortopts
= "qnO::";
16229 #define OPTION_32 (OPTION_MD_BASE + 0)
16230 #define OPTION_64 (OPTION_MD_BASE + 1)
16231 #define OPTION_DIVIDE (OPTION_MD_BASE + 2)
16232 #define OPTION_MARCH (OPTION_MD_BASE + 3)
16233 #define OPTION_MTUNE (OPTION_MD_BASE + 4)
16234 #define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
16235 #define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
16236 #define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
16237 #define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
16238 #define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
16239 #define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
16240 #define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
16241 #define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
16242 #define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
16243 #define OPTION_X32 (OPTION_MD_BASE + 14)
16244 #define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
16245 #define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
16246 #define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
16247 #define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
16248 #define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
16249 #define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
16250 #define OPTION_MSHARED (OPTION_MD_BASE + 21)
16251 #define OPTION_MAMD64 (OPTION_MD_BASE + 22)
16252 #define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
16253 #define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
16254 #define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
16255 #define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
16256 #define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
16257 #define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
16258 #define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
16259 #define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
16260 #define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
16261 #define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
16262 #define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
16263 #define OPTION_MUSE_UNALIGNED_VECTOR_MOVE (OPTION_MD_BASE + 34)
16265 struct option md_longopts
[] =
16267 {"32", no_argument
, NULL
, OPTION_32
},
16268 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
16269 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
16270 {"64", no_argument
, NULL
, OPTION_64
},
16272 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16273 {"x32", no_argument
, NULL
, OPTION_X32
},
16274 {"mshared", no_argument
, NULL
, OPTION_MSHARED
},
16275 {"mx86-used-note", required_argument
, NULL
, OPTION_X86_USED_NOTE
},
16277 {"divide", no_argument
, NULL
, OPTION_DIVIDE
},
16278 {"march", required_argument
, NULL
, OPTION_MARCH
},
16279 {"mtune", required_argument
, NULL
, OPTION_MTUNE
},
16280 {"mmnemonic", required_argument
, NULL
, OPTION_MMNEMONIC
},
16281 {"msyntax", required_argument
, NULL
, OPTION_MSYNTAX
},
16282 {"mindex-reg", no_argument
, NULL
, OPTION_MINDEX_REG
},
16283 {"mnaked-reg", no_argument
, NULL
, OPTION_MNAKED_REG
},
16284 {"msse2avx", no_argument
, NULL
, OPTION_MSSE2AVX
},
16285 {"muse-unaligned-vector-move", no_argument
, NULL
, OPTION_MUSE_UNALIGNED_VECTOR_MOVE
},
16286 {"msse-check", required_argument
, NULL
, OPTION_MSSE_CHECK
},
16287 {"moperand-check", required_argument
, NULL
, OPTION_MOPERAND_CHECK
},
16288 {"mavxscalar", required_argument
, NULL
, OPTION_MAVXSCALAR
},
16289 {"mvexwig", required_argument
, NULL
, OPTION_MVEXWIG
},
16290 {"madd-bnd-prefix", no_argument
, NULL
, OPTION_MADD_BND_PREFIX
},
16291 {"mevexlig", required_argument
, NULL
, OPTION_MEVEXLIG
},
16292 {"mevexwig", required_argument
, NULL
, OPTION_MEVEXWIG
},
16293 # if defined (TE_PE) || defined (TE_PEP)
16294 {"mbig-obj", no_argument
, NULL
, OPTION_MBIG_OBJ
},
16296 {"momit-lock-prefix", required_argument
, NULL
, OPTION_MOMIT_LOCK_PREFIX
},
16297 {"mfence-as-lock-add", required_argument
, NULL
, OPTION_MFENCE_AS_LOCK_ADD
},
16298 {"mrelax-relocations", required_argument
, NULL
, OPTION_MRELAX_RELOCATIONS
},
16299 {"mevexrcig", required_argument
, NULL
, OPTION_MEVEXRCIG
},
16300 {"malign-branch-boundary", required_argument
, NULL
, OPTION_MALIGN_BRANCH_BOUNDARY
},
16301 {"malign-branch-prefix-size", required_argument
, NULL
, OPTION_MALIGN_BRANCH_PREFIX_SIZE
},
16302 {"malign-branch", required_argument
, NULL
, OPTION_MALIGN_BRANCH
},
16303 {"mbranches-within-32B-boundaries", no_argument
, NULL
, OPTION_MBRANCHES_WITH_32B_BOUNDARIES
},
16304 {"mlfence-after-load", required_argument
, NULL
, OPTION_MLFENCE_AFTER_LOAD
},
16305 {"mlfence-before-indirect-branch", required_argument
, NULL
,
16306 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH
},
16307 {"mlfence-before-ret", required_argument
, NULL
, OPTION_MLFENCE_BEFORE_RET
},
16308 {"mamd64", no_argument
, NULL
, OPTION_MAMD64
},
16309 {"mintel64", no_argument
, NULL
, OPTION_MINTEL64
},
16310 {NULL
, no_argument
, NULL
, 0}
16312 size_t md_longopts_size
= sizeof (md_longopts
);
16315 md_parse_option (int c
, const char *arg
)
16318 char *arch
, *next
, *saved
, *type
;
16323 optimize_align_code
= 0;
16327 quiet_warnings
= 1;
16330 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16331 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
16332 should be emitted or not. FIXME: Not implemented. */
16334 if ((arg
[0] != 'y' && arg
[0] != 'n') || arg
[1])
16338 /* -V: SVR4 argument to print version ID. */
16340 print_version_id ();
16343 /* -k: Ignore for FreeBSD compatibility. */
16348 /* -s: On i386 Solaris, this tells the native assembler to use
16349 .stab instead of .stab.excl. We always use .stab anyhow. */
16352 case OPTION_MSHARED
:
16356 case OPTION_X86_USED_NOTE
:
16357 if (strcasecmp (arg
, "yes") == 0)
16359 else if (strcasecmp (arg
, "no") == 0)
16362 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg
);
16367 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
16368 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
16371 const char **list
, **l
;
16373 list
= bfd_target_list ();
16374 for (l
= list
; *l
!= NULL
; l
++)
16375 if (startswith (*l
, "elf64-x86-64")
16376 || strcmp (*l
, "coff-x86-64") == 0
16377 || strcmp (*l
, "pe-x86-64") == 0
16378 || strcmp (*l
, "pei-x86-64") == 0
16379 || strcmp (*l
, "mach-o-x86-64") == 0)
16381 default_arch
= "x86_64";
16385 as_fatal (_("no compiled in support for x86_64"));
16391 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16395 const char **list
, **l
;
16397 list
= bfd_target_list ();
16398 for (l
= list
; *l
!= NULL
; l
++)
16399 if (startswith (*l
, "elf32-x86-64"))
16401 default_arch
= "x86_64:32";
16405 as_fatal (_("no compiled in support for 32bit x86_64"));
16409 as_fatal (_("32bit x86_64 is only supported for ELF"));
16415 const char **list
, **l
;
16417 list
= bfd_target_list ();
16418 for (l
= list
; *l
!= NULL
; l
++)
16419 if (strstr (*l
, "-i386")
16420 || strstr (*l
, "-go32"))
16422 default_arch
= "i386";
16426 as_fatal (_("no compiled in support for ix86"));
16431 case OPTION_DIVIDE
:
16432 #ifdef SVR4_COMMENT_CHARS
16437 n
= XNEWVEC (char, strlen (i386_comment_chars
) + 1);
16439 for (s
= i386_comment_chars
; *s
!= '\0'; s
++)
16443 i386_comment_chars
= n
;
16449 saved
= xstrdup (arg
);
16451 /* Allow -march=+nosse. */
16459 as_fatal (_("invalid -march= option: `%s'"), arg
);
16460 next
= strchr (arch
, '+');
16463 vsz
= strchr (arch
, '/');
16466 for (j
= 0; j
< ARRAY_SIZE (cpu_arch
); j
++)
16468 if (vsz
&& cpu_arch
[j
].vsz
!= vsz_set
)
16471 if (arch
== saved
&& cpu_arch
[j
].type
!= PROCESSOR_NONE
16472 && strcmp (arch
, cpu_arch
[j
].name
) == 0)
16475 if (! cpu_arch
[j
].enable
.bitfield
.cpui386
)
16478 cpu_arch_name
= cpu_arch
[j
].name
;
16479 free (cpu_sub_arch_name
);
16480 cpu_sub_arch_name
= NULL
;
16481 cpu_arch_flags
= cpu_arch
[j
].enable
;
16482 cpu_arch_isa
= cpu_arch
[j
].type
;
16483 cpu_arch_isa_flags
= cpu_arch
[j
].enable
;
16484 if (!cpu_arch_tune_set
)
16485 cpu_arch_tune
= cpu_arch_isa
;
16486 vector_size
= VSZ_DEFAULT
;
16489 else if (cpu_arch
[j
].type
== PROCESSOR_NONE
16490 && strcmp (arch
, cpu_arch
[j
].name
) == 0
16491 && !cpu_flags_all_zero (&cpu_arch
[j
].enable
))
16493 /* ISA extension. */
16496 switch (cpu_arch
[j
].vsz
)
16505 unsigned long val
= strtoul (vsz
, &end
, 0);
16511 case 512: vector_size
= VSZ512
; break;
16512 case 256: vector_size
= VSZ256
; break;
16513 case 128: vector_size
= VSZ128
; break;
16515 as_warn (_("Unrecognized vector size specifier ignored"));
16520 /* Fall through. */
16522 vector_size
= VSZ_DEFAULT
;
16530 if (j
>= ARRAY_SIZE (cpu_arch
) && startswith (arch
, "no"))
16532 /* Disable an ISA extension. */
16533 for (j
= 0; j
< ARRAY_SIZE (cpu_arch
); j
++)
16534 if (cpu_arch
[j
].type
== PROCESSOR_NONE
16535 && strcmp (arch
+ 2, cpu_arch
[j
].name
) == 0)
16538 if (cpu_arch
[j
].vsz
== vsz_set
)
16539 vector_size
= VSZ_DEFAULT
;
16544 if (j
>= ARRAY_SIZE (cpu_arch
))
16545 as_fatal (_("invalid -march= option: `%s'"), arg
);
16549 while (next
!= NULL
);
16555 as_fatal (_("invalid -mtune= option: `%s'"), arg
);
16556 for (j
= 0; j
< ARRAY_SIZE (cpu_arch
); j
++)
16558 if (cpu_arch
[j
].type
!= PROCESSOR_NONE
16559 && strcmp (arg
, cpu_arch
[j
].name
) == 0)
16561 cpu_arch_tune_set
= 1;
16562 cpu_arch_tune
= cpu_arch
[j
].type
;
16566 if (j
>= ARRAY_SIZE (cpu_arch
))
16567 as_fatal (_("invalid -mtune= option: `%s'"), arg
);
16570 case OPTION_MMNEMONIC
:
16571 if (strcasecmp (arg
, "att") == 0)
16572 intel_mnemonic
= 0;
16573 else if (strcasecmp (arg
, "intel") == 0)
16574 intel_mnemonic
= 1;
16576 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg
);
16579 case OPTION_MSYNTAX
:
16580 if (strcasecmp (arg
, "att") == 0)
16581 _set_intel_syntax (0);
16582 else if (strcasecmp (arg
, "intel") == 0)
16583 _set_intel_syntax (1);
16585 as_fatal (_("invalid -msyntax= option: `%s'"), arg
);
16588 case OPTION_MINDEX_REG
:
16589 allow_index_reg
= 1;
16592 case OPTION_MNAKED_REG
:
16593 allow_naked_reg
= 1;
16594 register_prefix
= "";
16597 case OPTION_MSSE2AVX
:
16601 case OPTION_MUSE_UNALIGNED_VECTOR_MOVE
:
16602 use_unaligned_vector_move
= 1;
16605 case OPTION_MSSE_CHECK
:
16606 if (strcasecmp (arg
, "error") == 0)
16607 sse_check
= check_error
;
16608 else if (strcasecmp (arg
, "warning") == 0)
16609 sse_check
= check_warning
;
16610 else if (strcasecmp (arg
, "none") == 0)
16611 sse_check
= check_none
;
16613 as_fatal (_("invalid -msse-check= option: `%s'"), arg
);
16616 case OPTION_MOPERAND_CHECK
:
16617 if (strcasecmp (arg
, "error") == 0)
16618 operand_check
= check_error
;
16619 else if (strcasecmp (arg
, "warning") == 0)
16620 operand_check
= check_warning
;
16621 else if (strcasecmp (arg
, "none") == 0)
16622 operand_check
= check_none
;
16624 as_fatal (_("invalid -moperand-check= option: `%s'"), arg
);
16627 case OPTION_MAVXSCALAR
:
16628 if (strcasecmp (arg
, "128") == 0)
16629 avxscalar
= vex128
;
16630 else if (strcasecmp (arg
, "256") == 0)
16631 avxscalar
= vex256
;
16633 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg
);
16636 case OPTION_MVEXWIG
:
16637 if (strcmp (arg
, "0") == 0)
16639 else if (strcmp (arg
, "1") == 0)
16642 as_fatal (_("invalid -mvexwig= option: `%s'"), arg
);
16645 case OPTION_MADD_BND_PREFIX
:
16646 add_bnd_prefix
= 1;
16649 case OPTION_MEVEXLIG
:
16650 if (strcmp (arg
, "128") == 0)
16651 evexlig
= evexl128
;
16652 else if (strcmp (arg
, "256") == 0)
16653 evexlig
= evexl256
;
16654 else if (strcmp (arg
, "512") == 0)
16655 evexlig
= evexl512
;
16657 as_fatal (_("invalid -mevexlig= option: `%s'"), arg
);
16660 case OPTION_MEVEXRCIG
:
16661 if (strcmp (arg
, "rne") == 0)
16663 else if (strcmp (arg
, "rd") == 0)
16665 else if (strcmp (arg
, "ru") == 0)
16667 else if (strcmp (arg
, "rz") == 0)
16670 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg
);
16673 case OPTION_MEVEXWIG
:
16674 if (strcmp (arg
, "0") == 0)
16676 else if (strcmp (arg
, "1") == 0)
16679 as_fatal (_("invalid -mevexwig= option: `%s'"), arg
);
16682 # if defined (TE_PE) || defined (TE_PEP)
16683 case OPTION_MBIG_OBJ
:
16688 case OPTION_MOMIT_LOCK_PREFIX
:
16689 if (strcasecmp (arg
, "yes") == 0)
16690 omit_lock_prefix
= 1;
16691 else if (strcasecmp (arg
, "no") == 0)
16692 omit_lock_prefix
= 0;
16694 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg
);
16697 case OPTION_MFENCE_AS_LOCK_ADD
:
16698 if (strcasecmp (arg
, "yes") == 0)
16700 else if (strcasecmp (arg
, "no") == 0)
16703 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg
);
16706 case OPTION_MLFENCE_AFTER_LOAD
:
16707 if (strcasecmp (arg
, "yes") == 0)
16708 lfence_after_load
= 1;
16709 else if (strcasecmp (arg
, "no") == 0)
16710 lfence_after_load
= 0;
16712 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg
);
16715 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH
:
16716 if (strcasecmp (arg
, "all") == 0)
16718 lfence_before_indirect_branch
= lfence_branch_all
;
16719 if (lfence_before_ret
== lfence_before_ret_none
)
16720 lfence_before_ret
= lfence_before_ret_shl
;
16722 else if (strcasecmp (arg
, "memory") == 0)
16723 lfence_before_indirect_branch
= lfence_branch_memory
;
16724 else if (strcasecmp (arg
, "register") == 0)
16725 lfence_before_indirect_branch
= lfence_branch_register
;
16726 else if (strcasecmp (arg
, "none") == 0)
16727 lfence_before_indirect_branch
= lfence_branch_none
;
16729 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
16733 case OPTION_MLFENCE_BEFORE_RET
:
16734 if (strcasecmp (arg
, "or") == 0)
16735 lfence_before_ret
= lfence_before_ret_or
;
16736 else if (strcasecmp (arg
, "not") == 0)
16737 lfence_before_ret
= lfence_before_ret_not
;
16738 else if (strcasecmp (arg
, "shl") == 0 || strcasecmp (arg
, "yes") == 0)
16739 lfence_before_ret
= lfence_before_ret_shl
;
16740 else if (strcasecmp (arg
, "none") == 0)
16741 lfence_before_ret
= lfence_before_ret_none
;
16743 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
16747 case OPTION_MRELAX_RELOCATIONS
:
16748 if (strcasecmp (arg
, "yes") == 0)
16749 generate_relax_relocations
= 1;
16750 else if (strcasecmp (arg
, "no") == 0)
16751 generate_relax_relocations
= 0;
16753 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg
);
16756 case OPTION_MALIGN_BRANCH_BOUNDARY
:
16759 long int align
= strtoul (arg
, &end
, 0);
16764 align_branch_power
= 0;
16767 else if (align
>= 16)
16770 for (align_power
= 0;
16772 align
>>= 1, align_power
++)
16774 /* Limit alignment power to 31. */
16775 if (align
== 1 && align_power
< 32)
16777 align_branch_power
= align_power
;
16782 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg
);
16786 case OPTION_MALIGN_BRANCH_PREFIX_SIZE
:
16789 int align
= strtoul (arg
, &end
, 0);
16790 /* Some processors only support 5 prefixes. */
16791 if (*end
== '\0' && align
>= 0 && align
< 6)
16793 align_branch_prefix_size
= align
;
16796 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
16801 case OPTION_MALIGN_BRANCH
:
16803 saved
= xstrdup (arg
);
16807 next
= strchr (type
, '+');
16810 if (strcasecmp (type
, "jcc") == 0)
16811 align_branch
|= align_branch_jcc_bit
;
16812 else if (strcasecmp (type
, "fused") == 0)
16813 align_branch
|= align_branch_fused_bit
;
16814 else if (strcasecmp (type
, "jmp") == 0)
16815 align_branch
|= align_branch_jmp_bit
;
16816 else if (strcasecmp (type
, "call") == 0)
16817 align_branch
|= align_branch_call_bit
;
16818 else if (strcasecmp (type
, "ret") == 0)
16819 align_branch
|= align_branch_ret_bit
;
16820 else if (strcasecmp (type
, "indirect") == 0)
16821 align_branch
|= align_branch_indirect_bit
;
16823 as_fatal (_("invalid -malign-branch= option: `%s'"), arg
);
16826 while (next
!= NULL
);
16830 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES
:
16831 align_branch_power
= 5;
16832 align_branch_prefix_size
= 5;
16833 align_branch
= (align_branch_jcc_bit
16834 | align_branch_fused_bit
16835 | align_branch_jmp_bit
);
16838 case OPTION_MAMD64
:
16842 case OPTION_MINTEL64
:
16850 /* Turn off -Os. */
16851 optimize_for_space
= 0;
16853 else if (*arg
== 's')
16855 optimize_for_space
= 1;
16856 /* Turn on all encoding optimizations. */
16857 optimize
= INT_MAX
;
16861 optimize
= atoi (arg
);
16862 /* Turn off -Os. */
16863 optimize_for_space
= 0;
16873 #define MESSAGE_TEMPLATE \
16877 output_message (FILE *stream
, char *p
, char *message
, char *start
,
16878 int *left_p
, const char *name
, int len
)
16880 int size
= sizeof (MESSAGE_TEMPLATE
);
16881 int left
= *left_p
;
16883 /* Reserve 2 spaces for ", " or ",\0" */
16886 /* Check if there is any room. */
16894 p
= mempcpy (p
, name
, len
);
16898 /* Output the current message now and start a new one. */
16901 fprintf (stream
, "%s\n", message
);
16903 left
= size
- (start
- message
) - len
- 2;
16905 gas_assert (left
>= 0);
16907 p
= mempcpy (p
, name
, len
);
16915 show_arch (FILE *stream
, int ext
, int check
)
16917 static char message
[] = MESSAGE_TEMPLATE
;
16918 char *start
= message
+ 27;
16920 int size
= sizeof (MESSAGE_TEMPLATE
);
16927 left
= size
- (start
- message
);
16931 p
= output_message (stream
, p
, message
, start
, &left
,
16932 STRING_COMMA_LEN ("default"));
16933 p
= output_message (stream
, p
, message
, start
, &left
,
16934 STRING_COMMA_LEN ("push"));
16935 p
= output_message (stream
, p
, message
, start
, &left
,
16936 STRING_COMMA_LEN ("pop"));
16939 for (j
= 0; j
< ARRAY_SIZE (cpu_arch
); j
++)
16941 /* Should it be skipped? */
16942 if (cpu_arch
[j
].skip
)
16945 name
= cpu_arch
[j
].name
;
16946 len
= cpu_arch
[j
].len
;
16947 if (cpu_arch
[j
].type
== PROCESSOR_NONE
)
16949 /* It is an extension. Skip if we aren't asked to show it. */
16950 if (!ext
|| cpu_flags_all_zero (&cpu_arch
[j
].enable
))
16955 /* It is an processor. Skip if we show only extension. */
16958 else if (check
&& ! cpu_arch
[j
].enable
.bitfield
.cpui386
)
16960 /* It is an impossible processor - skip. */
16964 p
= output_message (stream
, p
, message
, start
, &left
, name
, len
);
16967 /* Display disabled extensions. */
16969 for (j
= 0; j
< ARRAY_SIZE (cpu_arch
); j
++)
16973 if (cpu_arch
[j
].type
!= PROCESSOR_NONE
16974 || !cpu_flags_all_zero (&cpu_arch
[j
].enable
))
16976 str
= xasprintf ("no%s", cpu_arch
[j
].name
);
16977 p
= output_message (stream
, p
, message
, start
, &left
, str
,
16983 fprintf (stream
, "%s\n", message
);
16987 md_show_usage (FILE *stream
)
16989 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16990 fprintf (stream
, _("\
16991 -Qy, -Qn ignored\n\
16992 -V print assembler version number\n\
16995 fprintf (stream
, _("\
16996 -n do not optimize code alignment\n\
16997 -O{012s} attempt some code optimizations\n\
16998 -q quieten some warnings\n"));
16999 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17000 fprintf (stream
, _("\
17004 # if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17005 fprintf (stream
, _("\
17006 --32/--64/--x32 generate 32bit/64bit/x32 object\n"));
17007 # elif defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O)
17008 fprintf (stream
, _("\
17009 --32/--64 generate 32bit/64bit object\n"));
17012 #ifdef SVR4_COMMENT_CHARS
17013 fprintf (stream
, _("\
17014 --divide do not treat `/' as a comment character\n"));
17016 fprintf (stream
, _("\
17017 --divide ignored\n"));
17019 fprintf (stream
, _("\
17020 -march=CPU[,+EXTENSION...]\n\
17021 generate code for CPU and EXTENSION, CPU is one of:\n"));
17022 show_arch (stream
, 0, 1);
17023 fprintf (stream
, _("\
17024 EXTENSION is combination of (possibly \"no\"-prefixed):\n"));
17025 show_arch (stream
, 1, 0);
17026 fprintf (stream
, _("\
17027 -mtune=CPU optimize for CPU, CPU is one of:\n"));
17028 show_arch (stream
, 0, 0);
17029 fprintf (stream
, _("\
17030 -msse2avx encode SSE instructions with VEX prefix\n"));
17031 fprintf (stream
, _("\
17032 -muse-unaligned-vector-move\n\
17033 encode aligned vector move as unaligned vector move\n"));
17034 fprintf (stream
, _("\
17035 -msse-check=[none|error|warning] (default: none)\n\
17036 check SSE instructions\n"));
17037 fprintf (stream
, _("\
17038 -moperand-check=[none|error|warning] (default: warning)\n\
17039 check operand combinations for validity\n"));
17040 fprintf (stream
, _("\
17041 -mavxscalar=[128|256] (default: 128)\n\
17042 encode scalar AVX instructions with specific vector\n\
17044 fprintf (stream
, _("\
17045 -mvexwig=[0|1] (default: 0)\n\
17046 encode VEX instructions with specific VEX.W value\n\
17047 for VEX.W bit ignored instructions\n"));
17048 fprintf (stream
, _("\
17049 -mevexlig=[128|256|512] (default: 128)\n\
17050 encode scalar EVEX instructions with specific vector\n\
17052 fprintf (stream
, _("\
17053 -mevexwig=[0|1] (default: 0)\n\
17054 encode EVEX instructions with specific EVEX.W value\n\
17055 for EVEX.W bit ignored instructions\n"));
17056 fprintf (stream
, _("\
17057 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
17058 encode EVEX instructions with specific EVEX.RC value\n\
17059 for SAE-only ignored instructions\n"));
17060 fprintf (stream
, _("\
17061 -mmnemonic=[att|intel] "));
17062 if (SYSV386_COMPAT
)
17063 fprintf (stream
, _("(default: att)\n"));
17065 fprintf (stream
, _("(default: intel)\n"));
17066 fprintf (stream
, _("\
17067 use AT&T/Intel mnemonic (AT&T syntax only)\n"));
17068 fprintf (stream
, _("\
17069 -msyntax=[att|intel] (default: att)\n\
17070 use AT&T/Intel syntax\n"));
17071 fprintf (stream
, _("\
17072 -mindex-reg support pseudo index registers\n"));
17073 fprintf (stream
, _("\
17074 -mnaked-reg don't require `%%' prefix for registers\n"));
17075 fprintf (stream
, _("\
17076 -madd-bnd-prefix add BND prefix for all valid branches\n"));
17077 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17078 fprintf (stream
, _("\
17079 -mshared disable branch optimization for shared code\n"));
17080 fprintf (stream
, _("\
17081 -mx86-used-note=[no|yes] "));
17082 if (DEFAULT_X86_USED_NOTE
)
17083 fprintf (stream
, _("(default: yes)\n"));
17085 fprintf (stream
, _("(default: no)\n"));
17086 fprintf (stream
, _("\
17087 generate x86 used ISA and feature properties\n"));
17089 #if defined (TE_PE) || defined (TE_PEP)
17090 fprintf (stream
, _("\
17091 -mbig-obj generate big object files\n"));
17093 fprintf (stream
, _("\
17094 -momit-lock-prefix=[no|yes] (default: no)\n\
17095 strip all lock prefixes\n"));
17096 fprintf (stream
, _("\
17097 -mfence-as-lock-add=[no|yes] (default: no)\n\
17098 encode lfence, mfence and sfence as\n\
17099 lock addl $0x0, (%%{re}sp)\n"));
17100 fprintf (stream
, _("\
17101 -mrelax-relocations=[no|yes] "));
17102 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS
)
17103 fprintf (stream
, _("(default: yes)\n"));
17105 fprintf (stream
, _("(default: no)\n"));
17106 fprintf (stream
, _("\
17107 generate relax relocations\n"));
17108 fprintf (stream
, _("\
17109 -malign-branch-boundary=NUM (default: 0)\n\
17110 align branches within NUM byte boundary\n"));
17111 fprintf (stream
, _("\
17112 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
17113 TYPE is combination of jcc, fused, jmp, call, ret,\n\
17115 specify types of branches to align\n"));
17116 fprintf (stream
, _("\
17117 -malign-branch-prefix-size=NUM (default: 5)\n\
17118 align branches with NUM prefixes per instruction\n"));
17119 fprintf (stream
, _("\
17120 -mbranches-within-32B-boundaries\n\
17121 align branches within 32 byte boundary\n"));
17122 fprintf (stream
, _("\
17123 -mlfence-after-load=[no|yes] (default: no)\n\
17124 generate lfence after load\n"));
17125 fprintf (stream
, _("\
17126 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
17127 generate lfence before indirect near branch\n"));
17128 fprintf (stream
, _("\
17129 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
17130 generate lfence before ret\n"));
17131 fprintf (stream
, _("\
17132 -mamd64 accept only AMD64 ISA [default]\n"));
17133 fprintf (stream
, _("\
17134 -mintel64 accept only Intel64 ISA\n"));
17137 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
17138 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
17139 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
17141 /* Pick the target format to use. */
17144 i386_target_format (void)
17146 if (startswith (default_arch
, "x86_64"))
17148 update_code_flag (CODE_64BIT
, 1);
17149 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17150 if (default_arch
[6] == '\0')
17151 x86_elf_abi
= X86_64_ABI
;
17153 x86_elf_abi
= X86_64_X32_ABI
;
17156 else if (!strcmp (default_arch
, "i386"))
17157 update_code_flag (CODE_32BIT
, 1);
17158 else if (!strcmp (default_arch
, "iamcu"))
17160 update_code_flag (CODE_32BIT
, 1);
17161 if (cpu_arch_isa
== PROCESSOR_UNKNOWN
)
17163 static const i386_cpu_flags iamcu_flags
= CPU_IAMCU_FLAGS
;
17164 cpu_arch_name
= "iamcu";
17165 free (cpu_sub_arch_name
);
17166 cpu_sub_arch_name
= NULL
;
17167 cpu_arch_flags
= iamcu_flags
;
17168 cpu_arch_isa
= PROCESSOR_IAMCU
;
17169 cpu_arch_isa_flags
= iamcu_flags
;
17170 if (!cpu_arch_tune_set
)
17171 cpu_arch_tune
= PROCESSOR_IAMCU
;
17173 else if (cpu_arch_isa
!= PROCESSOR_IAMCU
)
17174 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
17178 as_fatal (_("unknown architecture"));
17180 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17181 if (IS_ELF
&& flag_synth_cfi
&& x86_elf_abi
!= X86_64_ABI
)
17182 as_fatal (_("SCFI is not supported for this ABI"));
17185 if (cpu_flags_all_zero (&cpu_arch_isa_flags
))
17186 cpu_arch_isa_flags
= cpu_arch
[flag_code
== CODE_64BIT
].enable
;
17188 switch (OUTPUT_FLAVOR
)
17190 #if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
17191 case bfd_target_aout_flavour
:
17192 return AOUT_TARGET_FORMAT
;
17194 #if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
17195 # if defined (TE_PE) || defined (TE_PEP)
17196 case bfd_target_coff_flavour
:
17197 if (flag_code
== CODE_64BIT
)
17200 return use_big_obj
? "pe-bigobj-x86-64" : "pe-x86-64";
17202 return use_big_obj
? "pe-bigobj-i386" : "pe-i386";
17203 # elif defined (TE_GO32)
17204 case bfd_target_coff_flavour
:
17205 return "coff-go32";
17207 case bfd_target_coff_flavour
:
17208 return "coff-i386";
17211 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
17212 case bfd_target_elf_flavour
:
17214 const char *format
;
17216 switch (x86_elf_abi
)
17219 format
= ELF_TARGET_FORMAT
;
17221 tls_get_addr
= "___tls_get_addr";
17225 use_rela_relocations
= 1;
17228 tls_get_addr
= "__tls_get_addr";
17230 format
= ELF_TARGET_FORMAT64
;
17232 case X86_64_X32_ABI
:
17233 use_rela_relocations
= 1;
17236 tls_get_addr
= "__tls_get_addr";
17238 disallow_64bit_reloc
= 1;
17239 format
= ELF_TARGET_FORMAT32
;
17242 if (cpu_arch_isa
== PROCESSOR_IAMCU
)
17244 if (x86_elf_abi
!= I386_ABI
)
17245 as_fatal (_("Intel MCU is 32bit only"));
17246 return ELF_TARGET_IAMCU_FORMAT
;
17252 #if defined (OBJ_MACH_O)
17253 case bfd_target_mach_o_flavour
:
17254 if (flag_code
== CODE_64BIT
)
17256 use_rela_relocations
= 1;
17258 return "mach-o-x86-64";
17261 return "mach-o-i386";
17269 #endif /* OBJ_MAYBE_ more than one */
17272 md_undefined_symbol (char *name
)
17274 if (name
[0] == GLOBAL_OFFSET_TABLE_NAME
[0]
17275 && name
[1] == GLOBAL_OFFSET_TABLE_NAME
[1]
17276 && name
[2] == GLOBAL_OFFSET_TABLE_NAME
[2]
17277 && strcmp (name
, GLOBAL_OFFSET_TABLE_NAME
) == 0)
17281 if (symbol_find (name
))
17282 as_bad (_("GOT already in symbol table"));
17283 GOT_symbol
= symbol_new (name
, undefined_section
,
17284 &zero_address_frag
, 0);
17291 #if defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT)
17292 /* Round up a section size to the appropriate boundary. */
17295 md_section_align (segT segment
, valueT size
)
17297 if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
)
17299 /* For a.out, force the section size to be aligned. If we don't do
17300 this, BFD will align it for us, but it will not write out the
17301 final bytes of the section. This may be a bug in BFD, but it is
17302 easier to fix it here since that is how the other a.out targets
17306 align
= bfd_section_alignment (segment
);
17307 size
= ((size
+ (1 << align
) - 1) & (-((valueT
) 1 << align
)));
17314 /* On the i386, PC-relative offsets are relative to the start of the
17315 next instruction. That is, the address of the offset, plus its
17316 size, since the offset is always the last part of the insn. */
17319 md_pcrel_from (fixS
*fixP
)
17321 return fixP
->fx_size
+ fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
17327 s_bss (int ignore ATTRIBUTE_UNUSED
)
17331 temp
= get_absolute_expression ();
17332 subseg_set (bss_section
, (subsegT
) temp
);
17333 demand_empty_rest_of_line ();
17338 /* Remember constant directive. */
17341 i386_cons_align (int ignore ATTRIBUTE_UNUSED
)
17343 struct last_insn
*last_insn
17344 = &seg_info(now_seg
)->tc_segment_info_data
.last_insn
;
17346 if (bfd_section_flags (now_seg
) & SEC_CODE
)
17348 last_insn
->kind
= last_insn_directive
;
17349 last_insn
->name
= "constant directive";
17350 last_insn
->file
= as_where (&last_insn
->line
);
17355 i386_validate_fix (fixS
*fixp
)
17357 if (fixp
->fx_addsy
&& S_GET_SEGMENT(fixp
->fx_addsy
) == reg_section
)
17359 reloc_howto_type
*howto
;
17361 howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
17362 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17363 _("invalid %s relocation against register"),
17364 howto
? howto
->name
: "<unknown>");
17368 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17369 if (fixp
->fx_r_type
== BFD_RELOC_SIZE32
17370 || fixp
->fx_r_type
== BFD_RELOC_SIZE64
)
17371 return IS_ELF
&& fixp
->fx_addsy
17372 && (!S_IS_DEFINED (fixp
->fx_addsy
)
17373 || S_IS_EXTERNAL (fixp
->fx_addsy
));
17375 /* BFD_RELOC_X86_64_GOTTPOFF:
17376 1. fx_tcbit -> BFD_RELOC_X86_64_CODE_4_GOTTPOFF
17377 2. fx_tcbit2 -> BFD_RELOC_X86_64_CODE_6_GOTTPOFF
17378 BFD_RELOC_X86_64_GOTPC32_TLSDESC:
17379 1. fx_tcbit -> BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
17380 BFD_RELOC_32_PCREL:
17381 1. fx_tcbit -> BFD_RELOC_X86_64_GOTPCRELX
17382 2. fx_tcbit2 -> BFD_RELOC_X86_64_REX_GOTPCRELX
17383 3. fx_tcbit3 -> BFD_RELOC_X86_64_CODE_4_GOTPCRELX
17384 4. else -> BFD_RELOC_X86_64_GOTPCREL
17386 if (fixp
->fx_r_type
== BFD_RELOC_X86_64_GOTTPOFF
)
17388 if (fixp
->fx_tcbit
)
17389 fixp
->fx_r_type
= BFD_RELOC_X86_64_CODE_4_GOTTPOFF
;
17390 else if (fixp
->fx_tcbit2
)
17391 fixp
->fx_r_type
= BFD_RELOC_X86_64_CODE_6_GOTTPOFF
;
17393 else if (fixp
->fx_r_type
== BFD_RELOC_X86_64_GOTPC32_TLSDESC
17395 fixp
->fx_r_type
= BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
;
17398 if (fixp
->fx_subsy
)
17400 if (fixp
->fx_subsy
== GOT_symbol
)
17402 if (fixp
->fx_r_type
== BFD_RELOC_32_PCREL
)
17406 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17407 if (fixp
->fx_tcbit
)
17408 fixp
->fx_r_type
= BFD_RELOC_X86_64_GOTPCRELX
;
17409 else if (fixp
->fx_tcbit2
)
17410 fixp
->fx_r_type
= BFD_RELOC_X86_64_REX_GOTPCRELX
;
17411 else if (fixp
->fx_tcbit3
)
17412 fixp
->fx_r_type
= BFD_RELOC_X86_64_CODE_4_GOTPCRELX
;
17415 fixp
->fx_r_type
= BFD_RELOC_X86_64_GOTPCREL
;
17420 fixp
->fx_r_type
= BFD_RELOC_386_GOTOFF
;
17422 fixp
->fx_r_type
= BFD_RELOC_X86_64_GOTOFF64
;
17424 fixp
->fx_subsy
= 0;
17427 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17430 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
17431 to section. Since PLT32 relocation must be against symbols,
17432 turn such PLT32 relocation into PC32 relocation. */
17434 && (fixp
->fx_r_type
== BFD_RELOC_386_PLT32
17435 || fixp
->fx_r_type
== BFD_RELOC_X86_64_PLT32
)
17436 && symbol_section_p (fixp
->fx_addsy
))
17437 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
17440 if (fixp
->fx_r_type
== BFD_RELOC_386_GOT32
17441 && fixp
->fx_tcbit2
)
17442 fixp
->fx_r_type
= BFD_RELOC_386_GOT32X
;
17451 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
17454 bfd_reloc_code_real_type code
;
17456 switch (fixp
->fx_r_type
)
17458 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17461 case BFD_RELOC_SIZE32
:
17462 case BFD_RELOC_SIZE64
:
17464 && !bfd_is_abs_section (S_GET_SEGMENT (fixp
->fx_addsy
))
17465 && (!fixp
->fx_subsy
17466 || bfd_is_abs_section (S_GET_SEGMENT (fixp
->fx_subsy
))))
17467 sym
= fixp
->fx_addsy
;
17468 else if (fixp
->fx_subsy
17469 && !bfd_is_abs_section (S_GET_SEGMENT (fixp
->fx_subsy
))
17470 && (!fixp
->fx_addsy
17471 || bfd_is_abs_section (S_GET_SEGMENT (fixp
->fx_addsy
))))
17472 sym
= fixp
->fx_subsy
;
17475 if (IS_ELF
&& sym
&& S_IS_DEFINED (sym
) && !S_IS_EXTERNAL (sym
))
17477 /* Resolve size relocation against local symbol to size of
17478 the symbol plus addend. */
17479 valueT value
= S_GET_SIZE (sym
);
17481 if (symbol_get_bfdsym (sym
)->flags
& BSF_SECTION_SYM
)
17482 value
= bfd_section_size (S_GET_SEGMENT (sym
));
17483 if (sym
== fixp
->fx_subsy
)
17486 if (fixp
->fx_addsy
)
17487 value
+= S_GET_VALUE (fixp
->fx_addsy
);
17489 else if (fixp
->fx_subsy
)
17490 value
-= S_GET_VALUE (fixp
->fx_subsy
);
17491 value
+= fixp
->fx_offset
;
17492 if (fixp
->fx_r_type
== BFD_RELOC_SIZE32
17494 && !fits_in_unsigned_long (value
))
17495 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17496 _("symbol size computation overflow"));
17497 fixp
->fx_addsy
= NULL
;
17498 fixp
->fx_subsy
= NULL
;
17499 md_apply_fix (fixp
, (valueT
*) &value
, NULL
);
17502 if (!fixp
->fx_addsy
|| fixp
->fx_subsy
)
17504 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17505 "unsupported expression involving @size");
17509 /* Fall through. */
17511 case BFD_RELOC_X86_64_PLT32
:
17512 case BFD_RELOC_X86_64_GOT32
:
17513 case BFD_RELOC_X86_64_GOTPCREL
:
17514 case BFD_RELOC_X86_64_GOTPCRELX
:
17515 case BFD_RELOC_X86_64_REX_GOTPCRELX
:
17516 case BFD_RELOC_X86_64_CODE_4_GOTPCRELX
:
17517 case BFD_RELOC_386_PLT32
:
17518 case BFD_RELOC_386_GOT32
:
17519 case BFD_RELOC_386_GOT32X
:
17520 case BFD_RELOC_386_GOTOFF
:
17521 case BFD_RELOC_386_GOTPC
:
17522 case BFD_RELOC_386_TLS_GD
:
17523 case BFD_RELOC_386_TLS_LDM
:
17524 case BFD_RELOC_386_TLS_LDO_32
:
17525 case BFD_RELOC_386_TLS_IE_32
:
17526 case BFD_RELOC_386_TLS_IE
:
17527 case BFD_RELOC_386_TLS_GOTIE
:
17528 case BFD_RELOC_386_TLS_LE_32
:
17529 case BFD_RELOC_386_TLS_LE
:
17530 case BFD_RELOC_386_TLS_GOTDESC
:
17531 case BFD_RELOC_386_TLS_DESC_CALL
:
17532 case BFD_RELOC_X86_64_TLSGD
:
17533 case BFD_RELOC_X86_64_TLSLD
:
17534 case BFD_RELOC_X86_64_DTPOFF32
:
17535 case BFD_RELOC_X86_64_DTPOFF64
:
17536 case BFD_RELOC_X86_64_GOTTPOFF
:
17537 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF
:
17538 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF
:
17539 case BFD_RELOC_X86_64_TPOFF32
:
17540 case BFD_RELOC_X86_64_TPOFF64
:
17541 case BFD_RELOC_X86_64_GOTOFF64
:
17542 case BFD_RELOC_X86_64_GOTPC32
:
17543 case BFD_RELOC_X86_64_GOT64
:
17544 case BFD_RELOC_X86_64_GOTPCREL64
:
17545 case BFD_RELOC_X86_64_GOTPC64
:
17546 case BFD_RELOC_X86_64_GOTPLT64
:
17547 case BFD_RELOC_X86_64_PLTOFF64
:
17548 case BFD_RELOC_X86_64_GOTPC32_TLSDESC
:
17549 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
:
17550 case BFD_RELOC_X86_64_TLSDESC_CALL
:
17551 case BFD_RELOC_RVA
:
17552 case BFD_RELOC_VTABLE_ENTRY
:
17553 case BFD_RELOC_VTABLE_INHERIT
:
17555 case BFD_RELOC_32_SECREL
:
17556 case BFD_RELOC_16_SECIDX
:
17558 code
= fixp
->fx_r_type
;
17560 case BFD_RELOC_X86_64_32S
:
17561 if (!fixp
->fx_pcrel
)
17563 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
17564 code
= fixp
->fx_r_type
;
17567 /* Fall through. */
17569 if (fixp
->fx_pcrel
)
17571 switch (fixp
->fx_size
)
17574 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17575 _("can not do %d byte pc-relative relocation"),
17577 code
= BFD_RELOC_32_PCREL
;
17579 case 1: code
= BFD_RELOC_8_PCREL
; break;
17580 case 2: code
= BFD_RELOC_16_PCREL
; break;
17581 case 4: code
= BFD_RELOC_32_PCREL
; break;
17583 case 8: code
= BFD_RELOC_64_PCREL
; break;
17589 switch (fixp
->fx_size
)
17592 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17593 _("can not do %d byte relocation"),
17595 code
= BFD_RELOC_32
;
17597 case 1: code
= BFD_RELOC_8
; break;
17598 case 2: code
= BFD_RELOC_16
; break;
17599 case 4: code
= BFD_RELOC_32
; break;
17601 case 8: code
= BFD_RELOC_64
; break;
17608 if ((code
== BFD_RELOC_32
17609 || code
== BFD_RELOC_32_PCREL
17610 || code
== BFD_RELOC_X86_64_32S
)
17612 && fixp
->fx_addsy
== GOT_symbol
)
17615 code
= BFD_RELOC_386_GOTPC
;
17617 code
= BFD_RELOC_X86_64_GOTPC32
;
17619 if ((code
== BFD_RELOC_64
|| code
== BFD_RELOC_64_PCREL
)
17621 && fixp
->fx_addsy
== GOT_symbol
)
17623 code
= BFD_RELOC_X86_64_GOTPC64
;
17626 rel
= XNEW (arelent
);
17627 rel
->sym_ptr_ptr
= XNEW (asymbol
*);
17628 *rel
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
17630 rel
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
17632 if (!use_rela_relocations
)
17634 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
17635 vtable entry to be used in the relocation's section offset. */
17636 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
17637 rel
->address
= fixp
->fx_offset
;
17638 #if defined (OBJ_COFF) && defined (TE_PE)
17639 else if (fixp
->fx_addsy
&& S_IS_WEAK (fixp
->fx_addsy
))
17640 rel
->addend
= fixp
->fx_addnumber
- (S_GET_VALUE (fixp
->fx_addsy
) * 2);
17645 /* Use the rela in 64bit mode. */
17648 if (disallow_64bit_reloc
)
17651 case BFD_RELOC_X86_64_DTPOFF64
:
17652 case BFD_RELOC_X86_64_TPOFF64
:
17653 case BFD_RELOC_64_PCREL
:
17654 case BFD_RELOC_X86_64_GOTOFF64
:
17655 case BFD_RELOC_X86_64_GOT64
:
17656 case BFD_RELOC_X86_64_GOTPCREL64
:
17657 case BFD_RELOC_X86_64_GOTPC64
:
17658 case BFD_RELOC_X86_64_GOTPLT64
:
17659 case BFD_RELOC_X86_64_PLTOFF64
:
17660 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17661 _("cannot represent relocation type %s in x32 mode"),
17662 bfd_get_reloc_code_name (code
));
17668 if (!fixp
->fx_pcrel
)
17669 rel
->addend
= fixp
->fx_offset
;
17673 case BFD_RELOC_X86_64_PLT32
:
17674 case BFD_RELOC_X86_64_GOT32
:
17675 case BFD_RELOC_X86_64_GOTPCREL
:
17676 case BFD_RELOC_X86_64_GOTPCRELX
:
17677 case BFD_RELOC_X86_64_REX_GOTPCRELX
:
17678 case BFD_RELOC_X86_64_CODE_4_GOTPCRELX
:
17679 case BFD_RELOC_X86_64_TLSGD
:
17680 case BFD_RELOC_X86_64_TLSLD
:
17681 case BFD_RELOC_X86_64_GOTTPOFF
:
17682 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF
:
17683 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF
:
17684 case BFD_RELOC_X86_64_GOTPC32_TLSDESC
:
17685 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
:
17686 case BFD_RELOC_X86_64_TLSDESC_CALL
:
17687 rel
->addend
= fixp
->fx_offset
- fixp
->fx_size
;
17690 rel
->addend
= (section
->vma
17692 + fixp
->fx_addnumber
17693 + md_pcrel_from (fixp
));
17698 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
17699 if (rel
->howto
== NULL
)
17701 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
17702 _("cannot represent relocation type %s"),
17703 bfd_get_reloc_code_name (code
));
17704 /* Set howto to a garbage value so that we can keep going. */
17705 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_32
);
17706 gas_assert (rel
->howto
!= NULL
);
17712 #include "tc-i386-intel.c"
17715 tc_x86_parse_to_dw2regnum (expressionS
*exp
)
17717 int saved_naked_reg
;
17718 char saved_register_dot
;
17720 saved_naked_reg
= allow_naked_reg
;
17721 allow_naked_reg
= 1;
17722 saved_register_dot
= register_chars
['.'];
17723 register_chars
['.'] = '.';
17724 allow_pseudo_reg
= 1;
17725 expression_and_evaluate (exp
);
17726 allow_pseudo_reg
= 0;
17727 register_chars
['.'] = saved_register_dot
;
17728 allow_naked_reg
= saved_naked_reg
;
17730 if (exp
->X_op
== O_register
&& exp
->X_add_number
>= 0)
17732 exp
->X_op
= O_illegal
;
17733 if ((addressT
) exp
->X_add_number
< i386_regtab_size
)
17735 exp
->X_add_number
= i386_regtab
[exp
->X_add_number
]
17736 .dw2_regnum
[object_64bit
];
17737 if (exp
->X_add_number
!= Dw2Inval
)
17738 exp
->X_op
= O_constant
;
17744 tc_x86_frame_initial_instructions (void)
17746 cfi_add_CFA_def_cfa (object_64bit
? REG_SP
: 4, -x86_cie_data_alignment
);
17747 cfi_add_CFA_offset (x86_dwarf2_return_column
, x86_cie_data_alignment
);
17751 x86_dwarf2_addr_size (void)
17753 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
17754 if (x86_elf_abi
== X86_64_X32_ABI
)
17757 return bfd_arch_bits_per_address (stdoutput
) / 8;
17762 tc_pe_dwarf2_emit_offset (symbolS
*symbol
, unsigned int size
)
17766 exp
.X_op
= O_secrel
;
17767 exp
.X_add_symbol
= symbol
;
17768 exp
.X_add_number
= 0;
17769 emit_expr (&exp
, size
);
17773 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17775 i386_elf_section_type (const char *str
, size_t len
)
17777 if (flag_code
== CODE_64BIT
17778 && len
== sizeof ("unwind") - 1
17779 && startswith (str
, "unwind"))
17780 return SHT_X86_64_UNWIND
;
17786 i386_elf_section_change_hook (void)
17788 struct i386_segment_info
*info
= &seg_info(now_seg
)->tc_segment_info_data
;
17789 struct i386_segment_info
*curr
, *prev
;
17791 if (info
->subseg
== now_subseg
)
17794 /* Find the (or make a) list entry to save state into. */
17795 for (prev
= info
; (curr
= prev
->next
) != NULL
; prev
= curr
)
17796 if (curr
->subseg
== info
->subseg
)
17800 curr
= notes_alloc (sizeof (*curr
));
17801 curr
->subseg
= info
->subseg
;
17805 curr
->last_insn
= info
->last_insn
;
17807 /* Find the list entry to load state from. */
17808 for (curr
= info
->next
; curr
; curr
= curr
->next
)
17809 if (curr
->subseg
== now_subseg
)
17812 info
->last_insn
= curr
->last_insn
;
17814 memset (&info
->last_insn
, 0, sizeof (info
->last_insn
));
17815 info
->subseg
= now_subseg
;
17820 i386_solaris_fix_up_eh_frame (segT sec
)
17822 if (flag_code
== CODE_64BIT
)
17823 elf_section_type (sec
) = SHT_X86_64_UNWIND
;
17827 /* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
17830 x86_64_section_letter (int letter
, const char **ptr_msg
)
17832 if (flag_code
== CODE_64BIT
)
17835 return SHF_X86_64_LARGE
;
17837 *ptr_msg
= _("bad .section directive: want a,l,w,x,M,S,G,T in string");
17840 *ptr_msg
= _("bad .section directive: want a,w,x,M,S,G,T in string");
17845 handle_large_common (int small ATTRIBUTE_UNUSED
)
17847 if (flag_code
!= CODE_64BIT
)
17849 s_comm_internal (0, elf_common_parse
);
17850 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
17854 static segT lbss_section
;
17855 asection
*saved_com_section_ptr
= elf_com_section_ptr
;
17856 asection
*saved_bss_section
= bss_section
;
17858 if (lbss_section
== NULL
)
17860 flagword applicable
;
17861 segT seg
= now_seg
;
17862 subsegT subseg
= now_subseg
;
17864 /* The .lbss section is for local .largecomm symbols. */
17865 lbss_section
= subseg_new (".lbss", 0);
17866 applicable
= bfd_applicable_section_flags (stdoutput
);
17867 bfd_set_section_flags (lbss_section
, applicable
& SEC_ALLOC
);
17868 seg_info (lbss_section
)->bss
= 1;
17870 subseg_set (seg
, subseg
);
17873 elf_com_section_ptr
= &_bfd_elf_large_com_section
;
17874 bss_section
= lbss_section
;
17876 s_comm_internal (0, elf_common_parse
);
17878 elf_com_section_ptr
= saved_com_section_ptr
;
17879 bss_section
= saved_bss_section
;
17882 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */