]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-i386.c
x86: allow @size to also (sensibly) apply to sections
[thirdparty/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
250d07de 2 Copyright (C) 1989-2021 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
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
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
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.
15
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
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
41fd2579 35#include <limits.h>
41fd2579 36
c3332e24 37#ifndef INFER_ADDR_PREFIX
eecb386c 38#define INFER_ADDR_PREFIX 1
c3332e24
AM
39#endif
40
29b0f896
AM
41#ifndef DEFAULT_ARCH
42#define DEFAULT_ARCH "i386"
246fcdee 43#endif
252b5132 44
edde18a5
AM
45#ifndef INLINE
46#if __GNUC__ >= 2
47#define INLINE __inline__
48#else
49#define INLINE
50#endif
51#endif
52
6305a203
L
53/* Prefixes will be emitted in the order defined below.
54 WAIT_PREFIX must be the first prefix since FWAIT is really is an
55 instruction, and so must come before any prefixes.
56 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 57 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
58#define WAIT_PREFIX 0
59#define SEG_PREFIX 1
60#define ADDR_PREFIX 2
61#define DATA_PREFIX 3
c32fa91d 62#define REP_PREFIX 4
42164a71 63#define HLE_PREFIX REP_PREFIX
7e8b059b 64#define BND_PREFIX REP_PREFIX
c32fa91d 65#define LOCK_PREFIX 5
4e9ac44a
L
66#define REX_PREFIX 6 /* must come last. */
67#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
68
69/* we define the syntax here (modulo base,index,scale syntax) */
70#define REGISTER_PREFIX '%'
71#define IMMEDIATE_PREFIX '$'
72#define ABSOLUTE_PREFIX '*'
73
74/* these are the instruction mnemonic suffixes in AT&T syntax or
75 memory operand size in Intel syntax. */
76#define WORD_MNEM_SUFFIX 'w'
77#define BYTE_MNEM_SUFFIX 'b'
78#define SHORT_MNEM_SUFFIX 's'
79#define LONG_MNEM_SUFFIX 'l'
80#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
81/* Intel Syntax. Use a non-ascii letter since since it never appears
82 in instructions. */
83#define LONG_DOUBLE_MNEM_SUFFIX '\1'
84
85#define END_OF_INSN '\0'
86
79dec6b7
JB
87/* This matches the C -> StaticRounding alias in the opcode table. */
88#define commutative staticrounding
89
6305a203
L
90/*
91 'templates' is for grouping together 'template' structures for opcodes
92 of the same name. This is only used for storing the insns in the grand
93 ole hash table of insns.
94 The templates themselves start at START and range up to (but not including)
95 END.
96 */
97typedef struct
98{
d3ce72d0
NC
99 const insn_template *start;
100 const insn_template *end;
6305a203
L
101}
102templates;
103
104/* 386 operand encoding bytes: see 386 book for details of this. */
105typedef struct
106{
107 unsigned int regmem; /* codes register or memory operand */
108 unsigned int reg; /* codes register operand (or extended opcode) */
109 unsigned int mode; /* how to interpret regmem & reg */
110}
111modrm_byte;
112
113/* x86-64 extension prefix. */
114typedef int rex_byte;
115
6305a203
L
116/* 386 opcode byte to code indirect addressing. */
117typedef struct
118{
119 unsigned base;
120 unsigned index;
121 unsigned scale;
122}
123sib_byte;
124
6305a203
L
125/* x86 arch names, types and features */
126typedef struct
127{
128 const char *name; /* arch name */
8a2c8fef 129 unsigned int len; /* arch string length */
6305a203
L
130 enum processor_type type; /* arch type */
131 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 132 unsigned int skip; /* show_arch should skip this. */
6305a203
L
133}
134arch_entry;
135
293f5f65
L
136/* Used to turn off indicated flags. */
137typedef struct
138{
139 const char *name; /* arch name */
140 unsigned int len; /* arch string length */
141 i386_cpu_flags flags; /* cpu feature flags */
142}
143noarch_entry;
144
78f12dd3 145static void update_code_flag (int, int);
e3bb37b5
L
146static void set_code_flag (int);
147static void set_16bit_gcc_code_flag (int);
148static void set_intel_syntax (int);
1efbbeb4 149static void set_intel_mnemonic (int);
db51cc60 150static void set_allow_index_reg (int);
7bab8ab5 151static void set_check (int);
e3bb37b5 152static void set_cpu_arch (int);
6482c264 153#ifdef TE_PE
e3bb37b5 154static void pe_directive_secrel (int);
6482c264 155#endif
e3bb37b5
L
156static void signed_cons (int);
157static char *output_invalid (int c);
ee86248c
JB
158static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
159 const char *);
160static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
161 const char *);
a7619375 162static int i386_att_operand (char *);
e3bb37b5 163static int i386_intel_operand (char *, int);
ee86248c
JB
164static int i386_intel_simplify (expressionS *);
165static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
166static const reg_entry *parse_register (char *, char **);
167static char *parse_insn (char *, char *);
168static char *parse_operands (char *, const char *);
169static void swap_operands (void);
783c187b 170static void swap_2_operands (unsigned int, unsigned int);
48bcea9f 171static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
172static void optimize_imm (void);
173static void optimize_disp (void);
83b16ac6 174static const insn_template *match_template (char);
e3bb37b5
L
175static int check_string (void);
176static int process_suffix (void);
177static int check_byte_reg (void);
178static int check_long_reg (void);
179static int check_qword_reg (void);
180static int check_word_reg (void);
181static int finalize_imm (void);
182static int process_operands (void);
5e042380 183static const reg_entry *build_modrm_byte (void);
e3bb37b5
L
184static void output_insn (void);
185static void output_imm (fragS *, offsetT);
186static void output_disp (fragS *, offsetT);
29b0f896 187#ifndef I386COFF
e3bb37b5 188static void s_bss (int);
252b5132 189#endif
17d4e2a2
L
190#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
191static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
192
193/* GNU_PROPERTY_X86_ISA_1_USED. */
194static unsigned int x86_isa_1_used;
195/* GNU_PROPERTY_X86_FEATURE_2_USED. */
196static unsigned int x86_feature_2_used;
197/* Generate x86 used ISA and feature properties. */
198static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 199#endif
252b5132 200
a847613f 201static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 202
8a6fb3f9
JB
203/* parse_register() returns this when a register alias cannot be used. */
204static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
205 { Dw2Inval, Dw2Inval } };
206
34684862 207static const reg_entry *reg_eax;
5e042380
JB
208static const reg_entry *reg_ds;
209static const reg_entry *reg_es;
210static const reg_entry *reg_ss;
6288d05f 211static const reg_entry *reg_st0;
6225c532
JB
212static const reg_entry *reg_k0;
213
c0f3af97
L
214/* VEX prefix. */
215typedef struct
216{
43234a1e
L
217 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
218 unsigned char bytes[4];
c0f3af97
L
219 unsigned int length;
220 /* Destination or source register specifier. */
221 const reg_entry *register_specifier;
222} vex_prefix;
223
252b5132 224/* 'md_assemble ()' gathers together information and puts it into a
47926f60 225 i386_insn. */
252b5132 226
520dc8e8
AM
227union i386_op
228 {
229 expressionS *disps;
230 expressionS *imms;
231 const reg_entry *regs;
232 };
233
a65babc9
L
234enum i386_error
235 {
86e026a4 236 operand_size_mismatch,
a65babc9
L
237 operand_type_mismatch,
238 register_type_mismatch,
239 number_of_operands_mismatch,
240 invalid_instruction_suffix,
241 bad_imm4,
a65babc9
L
242 unsupported_with_intel_mnemonic,
243 unsupported_syntax,
6c30d220 244 unsupported,
260cd341 245 invalid_sib_address,
6c30d220 246 invalid_vsib_address,
7bab8ab5 247 invalid_vector_register_set,
260cd341 248 invalid_tmm_register_set,
43234a1e
L
249 unsupported_vector_index_register,
250 unsupported_broadcast,
43234a1e
L
251 broadcast_needed,
252 unsupported_masking,
253 mask_not_on_destination,
254 no_default_mask,
255 unsupported_rc_sae,
256 rc_sae_operand_not_last_imm,
257 invalid_register_operand,
a65babc9
L
258 };
259
252b5132
RH
260struct _i386_insn
261 {
47926f60 262 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 263 insn_template tm;
252b5132 264
7d5e4556
L
265 /* SUFFIX holds the instruction size suffix for byte, word, dword
266 or qword, if given. */
252b5132
RH
267 char suffix;
268
9a182d04
JB
269 /* OPCODE_LENGTH holds the number of base opcode bytes. */
270 unsigned char opcode_length;
271
47926f60 272 /* OPERANDS gives the number of given operands. */
252b5132
RH
273 unsigned int operands;
274
275 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
276 of given register, displacement, memory operands and immediate
47926f60 277 operands. */
252b5132
RH
278 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
279
280 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 281 use OP[i] for the corresponding operand. */
40fb9820 282 i386_operand_type types[MAX_OPERANDS];
252b5132 283
520dc8e8
AM
284 /* Displacement expression, immediate expression, or register for each
285 operand. */
286 union i386_op op[MAX_OPERANDS];
252b5132 287
3e73aa7c
JH
288 /* Flags for operands. */
289 unsigned int flags[MAX_OPERANDS];
290#define Operand_PCrel 1
c48dadc9 291#define Operand_Mem 2
3e73aa7c 292
252b5132 293 /* Relocation type for operand */
f86103b7 294 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 295
252b5132
RH
296 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
297 the base index byte below. */
298 const reg_entry *base_reg;
299 const reg_entry *index_reg;
300 unsigned int log2_scale_factor;
301
302 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 303 explicit segment overrides are given. */
5e042380 304 const reg_entry *seg[2];
252b5132 305
8325cc63
JB
306 /* Copied first memory operand string, for re-checking. */
307 char *memop1_string;
308
252b5132
RH
309 /* PREFIX holds all the given prefix opcodes (usually null).
310 PREFIXES is the number of prefix opcodes. */
311 unsigned int prefixes;
312 unsigned char prefix[MAX_PREFIXES];
313
50128d0c 314 /* Register is in low 3 bits of opcode. */
5b7c81bd 315 bool short_form;
50128d0c 316
6f2f06be 317 /* The operand to a branch insn indicates an absolute branch. */
5b7c81bd 318 bool jumpabsolute;
6f2f06be 319
921eafea
L
320 /* Extended states. */
321 enum
322 {
323 /* Use MMX state. */
324 xstate_mmx = 1 << 0,
325 /* Use XMM state. */
326 xstate_xmm = 1 << 1,
327 /* Use YMM state. */
328 xstate_ymm = 1 << 2 | xstate_xmm,
329 /* Use ZMM state. */
330 xstate_zmm = 1 << 3 | xstate_ymm,
331 /* Use TMM state. */
32930e4e
L
332 xstate_tmm = 1 << 4,
333 /* Use MASK state. */
334 xstate_mask = 1 << 5
921eafea 335 } xstate;
260cd341 336
e379e5f3 337 /* Has GOTPC or TLS relocation. */
5b7c81bd 338 bool has_gotpc_tls_reloc;
e379e5f3 339
252b5132 340 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 341 addressing modes of this insn are encoded. */
252b5132 342 modrm_byte rm;
3e73aa7c 343 rex_byte rex;
43234a1e 344 rex_byte vrex;
252b5132 345 sib_byte sib;
c0f3af97 346 vex_prefix vex;
b6169b20 347
6225c532
JB
348 /* Masking attributes.
349
350 The struct describes masking, applied to OPERAND in the instruction.
351 REG is a pointer to the corresponding mask register. ZEROING tells
352 whether merging or zeroing mask is used. */
353 struct Mask_Operation
354 {
355 const reg_entry *reg;
356 unsigned int zeroing;
357 /* The operand where this operation is associated. */
358 unsigned int operand;
359 } mask;
43234a1e
L
360
361 /* Rounding control and SAE attributes. */
ca5312a2
JB
362 struct RC_Operation
363 {
364 enum rc_type
365 {
366 rc_none = -1,
367 rne,
368 rd,
369 ru,
370 rz,
371 saeonly
372 } type;
373
374 unsigned int operand;
375 } rounding;
43234a1e 376
5273a3cd
JB
377 /* Broadcasting attributes.
378
379 The struct describes broadcasting, applied to OPERAND. TYPE is
380 expresses the broadcast factor. */
381 struct Broadcast_Operation
382 {
383 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
384 unsigned int type;
385
386 /* Index of broadcasted operand. */
387 unsigned int operand;
388
389 /* Number of bytes to broadcast. */
390 unsigned int bytes;
391 } broadcast;
43234a1e
L
392
393 /* Compressed disp8*N attribute. */
394 unsigned int memshift;
395
86fa6981
L
396 /* Prefer load or store in encoding. */
397 enum
398 {
399 dir_encoding_default = 0,
400 dir_encoding_load,
64c49ab3
JB
401 dir_encoding_store,
402 dir_encoding_swap
86fa6981 403 } dir_encoding;
891edac4 404
41eb8e88 405 /* Prefer 8bit, 16bit, 32bit displacement in encoding. */
a501d77e
L
406 enum
407 {
408 disp_encoding_default = 0,
409 disp_encoding_8bit,
41eb8e88 410 disp_encoding_16bit,
a501d77e
L
411 disp_encoding_32bit
412 } disp_encoding;
f8a5c266 413
6b6b6807 414 /* Prefer the REX byte in encoding. */
5b7c81bd 415 bool rex_encoding;
6b6b6807 416
b6f8c7c4 417 /* Disable instruction size optimization. */
5b7c81bd 418 bool no_optimize;
b6f8c7c4 419
86fa6981
L
420 /* How to encode vector instructions. */
421 enum
422 {
423 vex_encoding_default = 0,
42e04b36 424 vex_encoding_vex,
86fa6981 425 vex_encoding_vex3,
da4977e0
JB
426 vex_encoding_evex,
427 vex_encoding_error
86fa6981
L
428 } vec_encoding;
429
d5de92cf
L
430 /* REP prefix. */
431 const char *rep_prefix;
432
165de32a
L
433 /* HLE prefix. */
434 const char *hle_prefix;
42164a71 435
7e8b059b
L
436 /* Have BND prefix. */
437 const char *bnd_prefix;
438
04ef582a
L
439 /* Have NOTRACK prefix. */
440 const char *notrack_prefix;
441
891edac4 442 /* Error message. */
a65babc9 443 enum i386_error error;
252b5132
RH
444 };
445
446typedef struct _i386_insn i386_insn;
447
43234a1e
L
448/* Link RC type with corresponding string, that'll be looked for in
449 asm. */
450struct RC_name
451{
452 enum rc_type type;
453 const char *name;
454 unsigned int len;
455};
456
457static const struct RC_name RC_NamesTable[] =
458{
459 { rne, STRING_COMMA_LEN ("rn-sae") },
460 { rd, STRING_COMMA_LEN ("rd-sae") },
461 { ru, STRING_COMMA_LEN ("ru-sae") },
462 { rz, STRING_COMMA_LEN ("rz-sae") },
463 { saeonly, STRING_COMMA_LEN ("sae") },
464};
465
252b5132
RH
466/* List of chars besides those in app.c:symbol_chars that can start an
467 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 468const char extra_symbol_chars[] = "*%-([{}"
252b5132 469#ifdef LEX_AT
32137342
NC
470 "@"
471#endif
472#ifdef LEX_QM
473 "?"
252b5132 474#endif
32137342 475 ;
252b5132 476
b3983e5f
JB
477#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
478 && !defined (TE_GNU) \
479 && !defined (TE_LINUX) \
480 && !defined (TE_FreeBSD) \
481 && !defined (TE_DragonFly) \
482 && !defined (TE_NetBSD))
252b5132 483/* This array holds the chars that always start a comment. If the
b3b91714
AM
484 pre-processor is disabled, these aren't very useful. The option
485 --divide will remove '/' from this list. */
486const char *i386_comment_chars = "#/";
487#define SVR4_COMMENT_CHARS 1
252b5132 488#define PREFIX_SEPARATOR '\\'
252b5132 489
b3b91714
AM
490#else
491const char *i386_comment_chars = "#";
492#define PREFIX_SEPARATOR '/'
493#endif
494
252b5132
RH
495/* This array holds the chars that only start a comment at the beginning of
496 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
497 .line and .file directives will appear in the pre-processed output.
498 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 499 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
500 #NO_APP at the beginning of its output.
501 Also note that comments started like this one will always work if
252b5132 502 '/' isn't otherwise defined. */
b3b91714 503const char line_comment_chars[] = "#/";
252b5132 504
63a0b638 505const char line_separator_chars[] = ";";
252b5132 506
ce8a8b2f
AM
507/* Chars that can be used to separate mant from exp in floating point
508 nums. */
252b5132
RH
509const char EXP_CHARS[] = "eE";
510
ce8a8b2f
AM
511/* Chars that mean this number is a floating point constant
512 As in 0f12.456
513 or 0d1.2345e12. */
252b5132
RH
514const char FLT_CHARS[] = "fFdDxX";
515
ce8a8b2f 516/* Tables for lexical analysis. */
252b5132
RH
517static char mnemonic_chars[256];
518static char register_chars[256];
519static char operand_chars[256];
520static char identifier_chars[256];
521static char digit_chars[256];
522
ce8a8b2f 523/* Lexical macros. */
252b5132
RH
524#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
525#define is_operand_char(x) (operand_chars[(unsigned char) x])
526#define is_register_char(x) (register_chars[(unsigned char) x])
527#define is_space_char(x) ((x) == ' ')
528#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
529#define is_digit_char(x) (digit_chars[(unsigned char) x])
530
0234cb7c 531/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
532static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
533
534/* md_assemble() always leaves the strings it's passed unaltered. To
535 effect this we maintain a stack of saved characters that we've smashed
536 with '\0's (indicating end of strings for various sub-fields of the
47926f60 537 assembler instruction). */
252b5132 538static char save_stack[32];
ce8a8b2f 539static char *save_stack_p;
252b5132
RH
540#define END_STRING_AND_SAVE(s) \
541 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
542#define RESTORE_END_STRING(s) \
543 do { *(s) = *--save_stack_p; } while (0)
544
47926f60 545/* The instruction we're assembling. */
252b5132
RH
546static i386_insn i;
547
548/* Possible templates for current insn. */
549static const templates *current_templates;
550
31b2323c
L
551/* Per instruction expressionS buffers: max displacements & immediates. */
552static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
553static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 554
47926f60 555/* Current operand we are working on. */
ee86248c 556static int this_operand = -1;
252b5132 557
3e73aa7c
JH
558/* We support four different modes. FLAG_CODE variable is used to distinguish
559 these. */
560
561enum flag_code {
562 CODE_32BIT,
563 CODE_16BIT,
564 CODE_64BIT };
565
566static enum flag_code flag_code;
4fa24527 567static unsigned int object_64bit;
862be3fb 568static unsigned int disallow_64bit_reloc;
3e73aa7c 569static int use_rela_relocations = 0;
e379e5f3
L
570/* __tls_get_addr/___tls_get_addr symbol for TLS. */
571static const char *tls_get_addr;
3e73aa7c 572
7af8ed2d
NC
573#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
574 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
575 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
576
351f65ca
L
577/* The ELF ABI to use. */
578enum x86_elf_abi
579{
580 I386_ABI,
7f56bc95
L
581 X86_64_ABI,
582 X86_64_X32_ABI
351f65ca
L
583};
584
585static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 586#endif
351f65ca 587
167ad85b
TG
588#if defined (TE_PE) || defined (TE_PEP)
589/* Use big object file format. */
590static int use_big_obj = 0;
591#endif
592
8dcea932
L
593#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
594/* 1 if generating code for a shared library. */
595static int shared = 0;
596#endif
597
47926f60
KH
598/* 1 for intel syntax,
599 0 if att syntax. */
600static int intel_syntax = 0;
252b5132 601
4b5aaf5f
L
602static enum x86_64_isa
603{
604 amd64 = 1, /* AMD64 ISA. */
605 intel64 /* Intel64 ISA. */
606} isa64;
e89c5eaa 607
1efbbeb4
L
608/* 1 for intel mnemonic,
609 0 if att mnemonic. */
610static int intel_mnemonic = !SYSV386_COMPAT;
611
a60de03c
JB
612/* 1 if pseudo registers are permitted. */
613static int allow_pseudo_reg = 0;
614
47926f60
KH
615/* 1 if register prefix % not required. */
616static int allow_naked_reg = 0;
252b5132 617
33eaf5de 618/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
619 instructions supporting it, even if this prefix wasn't specified
620 explicitly. */
621static int add_bnd_prefix = 0;
622
ba104c83 623/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
624static int allow_index_reg = 0;
625
d022bddd
IT
626/* 1 if the assembler should ignore LOCK prefix, even if it was
627 specified explicitly. */
628static int omit_lock_prefix = 0;
629
e4e00185
AS
630/* 1 if the assembler should encode lfence, mfence, and sfence as
631 "lock addl $0, (%{re}sp)". */
632static int avoid_fence = 0;
633
ae531041
L
634/* 1 if lfence should be inserted after every load. */
635static int lfence_after_load = 0;
636
637/* Non-zero if lfence should be inserted before indirect branch. */
638static enum lfence_before_indirect_branch_kind
639 {
640 lfence_branch_none = 0,
641 lfence_branch_register,
642 lfence_branch_memory,
643 lfence_branch_all
644 }
645lfence_before_indirect_branch;
646
647/* Non-zero if lfence should be inserted before ret. */
648static enum lfence_before_ret_kind
649 {
650 lfence_before_ret_none = 0,
651 lfence_before_ret_not,
a09f656b 652 lfence_before_ret_or,
653 lfence_before_ret_shl
ae531041
L
654 }
655lfence_before_ret;
656
657/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
658static struct
659 {
660 segT seg;
661 const char *file;
662 const char *name;
663 unsigned int line;
664 enum last_insn_kind
665 {
666 last_insn_other = 0,
667 last_insn_directive,
668 last_insn_prefix
669 } kind;
670 } last_insn;
671
0cb4071e
L
672/* 1 if the assembler should generate relax relocations. */
673
674static int generate_relax_relocations
675 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
676
7bab8ab5 677static enum check_kind
daf50ae7 678 {
7bab8ab5
JB
679 check_none = 0,
680 check_warning,
681 check_error
daf50ae7 682 }
7bab8ab5 683sse_check, operand_check = check_warning;
daf50ae7 684
e379e5f3
L
685/* Non-zero if branches should be aligned within power of 2 boundary. */
686static int align_branch_power = 0;
687
688/* Types of branches to align. */
689enum align_branch_kind
690 {
691 align_branch_none = 0,
692 align_branch_jcc = 1,
693 align_branch_fused = 2,
694 align_branch_jmp = 3,
695 align_branch_call = 4,
696 align_branch_indirect = 5,
697 align_branch_ret = 6
698 };
699
700/* Type bits of branches to align. */
701enum align_branch_bit
702 {
703 align_branch_jcc_bit = 1 << align_branch_jcc,
704 align_branch_fused_bit = 1 << align_branch_fused,
705 align_branch_jmp_bit = 1 << align_branch_jmp,
706 align_branch_call_bit = 1 << align_branch_call,
707 align_branch_indirect_bit = 1 << align_branch_indirect,
708 align_branch_ret_bit = 1 << align_branch_ret
709 };
710
711static unsigned int align_branch = (align_branch_jcc_bit
712 | align_branch_fused_bit
713 | align_branch_jmp_bit);
714
79d72f45
HL
715/* Types of condition jump used by macro-fusion. */
716enum mf_jcc_kind
717 {
718 mf_jcc_jo = 0, /* base opcode 0x70 */
719 mf_jcc_jc, /* base opcode 0x72 */
720 mf_jcc_je, /* base opcode 0x74 */
721 mf_jcc_jna, /* base opcode 0x76 */
722 mf_jcc_js, /* base opcode 0x78 */
723 mf_jcc_jp, /* base opcode 0x7a */
724 mf_jcc_jl, /* base opcode 0x7c */
725 mf_jcc_jle, /* base opcode 0x7e */
726 };
727
728/* Types of compare flag-modifying insntructions used by macro-fusion. */
729enum mf_cmp_kind
730 {
731 mf_cmp_test_and, /* test/cmp */
732 mf_cmp_alu_cmp, /* add/sub/cmp */
733 mf_cmp_incdec /* inc/dec */
734 };
735
e379e5f3
L
736/* The maximum padding size for fused jcc. CMP like instruction can
737 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
738 prefixes. */
739#define MAX_FUSED_JCC_PADDING_SIZE 20
740
741/* The maximum number of prefixes added for an instruction. */
742static unsigned int align_branch_prefix_size = 5;
743
b6f8c7c4
L
744/* Optimization:
745 1. Clear the REX_W bit with register operand if possible.
746 2. Above plus use 128bit vector instruction to clear the full vector
747 register.
748 */
749static int optimize = 0;
750
751/* Optimization:
752 1. Clear the REX_W bit with register operand if possible.
753 2. Above plus use 128bit vector instruction to clear the full vector
754 register.
755 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
756 "testb $imm7,%r8".
757 */
758static int optimize_for_space = 0;
759
2ca3ace5
L
760/* Register prefix used for error message. */
761static const char *register_prefix = "%";
762
47926f60
KH
763/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
764 leave, push, and pop instructions so that gcc has the same stack
765 frame as in 32 bit mode. */
766static char stackop_size = '\0';
eecb386c 767
12b55ccc
L
768/* Non-zero to optimize code alignment. */
769int optimize_align_code = 1;
770
47926f60
KH
771/* Non-zero to quieten some warnings. */
772static int quiet_warnings = 0;
a38cf1db 773
47926f60
KH
774/* CPU name. */
775static const char *cpu_arch_name = NULL;
6305a203 776static char *cpu_sub_arch_name = NULL;
a38cf1db 777
47926f60 778/* CPU feature flags. */
40fb9820
L
779static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
780
ccc9c027
L
781/* If we have selected a cpu we are generating instructions for. */
782static int cpu_arch_tune_set = 0;
783
9103f4f4 784/* Cpu we are generating instructions for. */
fbf3f584 785enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
786
787/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 788static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 789
ccc9c027 790/* CPU instruction set architecture used. */
fbf3f584 791enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 792
9103f4f4 793/* CPU feature flags of instruction set architecture used. */
fbf3f584 794i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 795
fddf5b5b
AM
796/* If set, conditional jumps are not automatically promoted to handle
797 larger than a byte offset. */
798static unsigned int no_cond_jump_promotion = 0;
799
c0f3af97
L
800/* Encode SSE instructions with VEX prefix. */
801static unsigned int sse2avx;
802
539f890d
L
803/* Encode scalar AVX instructions with specific vector length. */
804static enum
805 {
806 vex128 = 0,
807 vex256
808 } avxscalar;
809
03751133
L
810/* Encode VEX WIG instructions with specific vex.w. */
811static enum
812 {
813 vexw0 = 0,
814 vexw1
815 } vexwig;
816
43234a1e
L
817/* Encode scalar EVEX LIG instructions with specific vector length. */
818static enum
819 {
820 evexl128 = 0,
821 evexl256,
822 evexl512
823 } evexlig;
824
825/* Encode EVEX WIG instructions with specific evex.w. */
826static enum
827 {
828 evexw0 = 0,
829 evexw1
830 } evexwig;
831
d3d3c6db
IT
832/* Value to encode in EVEX RC bits, for SAE-only instructions. */
833static enum rc_type evexrcig = rne;
834
29b0f896 835/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 836static symbolS *GOT_symbol;
29b0f896 837
a4447b93
RH
838/* The dwarf2 return column, adjusted for 32 or 64 bit. */
839unsigned int x86_dwarf2_return_column;
840
841/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
842int x86_cie_data_alignment;
843
252b5132 844/* Interface to relax_segment.
fddf5b5b
AM
845 There are 3 major relax states for 386 jump insns because the
846 different types of jumps add different sizes to frags when we're
e379e5f3
L
847 figuring out what sort of jump to choose to reach a given label.
848
849 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
850 branches which are handled by md_estimate_size_before_relax() and
851 i386_generic_table_relax_frag(). */
252b5132 852
47926f60 853/* Types. */
93c2a809
AM
854#define UNCOND_JUMP 0
855#define COND_JUMP 1
856#define COND_JUMP86 2
e379e5f3
L
857#define BRANCH_PADDING 3
858#define BRANCH_PREFIX 4
859#define FUSED_JCC_PADDING 5
fddf5b5b 860
47926f60 861/* Sizes. */
252b5132
RH
862#define CODE16 1
863#define SMALL 0
29b0f896 864#define SMALL16 (SMALL | CODE16)
252b5132 865#define BIG 2
29b0f896 866#define BIG16 (BIG | CODE16)
252b5132
RH
867
868#ifndef INLINE
869#ifdef __GNUC__
870#define INLINE __inline__
871#else
872#define INLINE
873#endif
874#endif
875
fddf5b5b
AM
876#define ENCODE_RELAX_STATE(type, size) \
877 ((relax_substateT) (((type) << 2) | (size)))
878#define TYPE_FROM_RELAX_STATE(s) \
879 ((s) >> 2)
880#define DISP_SIZE_FROM_RELAX_STATE(s) \
881 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
882
883/* This table is used by relax_frag to promote short jumps to long
884 ones where necessary. SMALL (short) jumps may be promoted to BIG
885 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
886 don't allow a short jump in a 32 bit code segment to be promoted to
887 a 16 bit offset jump because it's slower (requires data size
888 prefix), and doesn't work, unless the destination is in the bottom
889 64k of the code segment (The top 16 bits of eip are zeroed). */
890
891const relax_typeS md_relax_table[] =
892{
24eab124
AM
893 /* The fields are:
894 1) most positive reach of this state,
895 2) most negative reach of this state,
93c2a809 896 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 897 4) which index into the table to try if we can't fit into this one. */
252b5132 898
fddf5b5b 899 /* UNCOND_JUMP states. */
93c2a809
AM
900 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
901 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
902 /* dword jmp adds 4 bytes to frag:
903 0 extra opcode bytes, 4 displacement bytes. */
252b5132 904 {0, 0, 4, 0},
93c2a809
AM
905 /* word jmp adds 2 byte2 to frag:
906 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
907 {0, 0, 2, 0},
908
93c2a809
AM
909 /* COND_JUMP states. */
910 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
911 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
912 /* dword conditionals adds 5 bytes to frag:
913 1 extra opcode byte, 4 displacement bytes. */
914 {0, 0, 5, 0},
fddf5b5b 915 /* word conditionals add 3 bytes to frag:
93c2a809
AM
916 1 extra opcode byte, 2 displacement bytes. */
917 {0, 0, 3, 0},
918
919 /* COND_JUMP86 states. */
920 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
921 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
922 /* dword conditionals adds 5 bytes to frag:
923 1 extra opcode byte, 4 displacement bytes. */
924 {0, 0, 5, 0},
925 /* word conditionals add 4 bytes to frag:
926 1 displacement byte and a 3 byte long branch insn. */
927 {0, 0, 4, 0}
252b5132
RH
928};
929
9103f4f4
L
930static const arch_entry cpu_arch[] =
931{
89507696
JB
932 /* Do not replace the first two entries - i386_target_format()
933 relies on them being there in this order. */
8a2c8fef 934 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 935 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 936 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 937 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 938 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 939 CPU_NONE_FLAGS, 0 },
8a2c8fef 940 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 941 CPU_I186_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 943 CPU_I286_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 945 CPU_I386_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 947 CPU_I486_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 949 CPU_I586_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 951 CPU_I686_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 953 CPU_I586_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 955 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 957 CPU_P2_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 959 CPU_P3_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 961 CPU_P4_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 963 CPU_CORE_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 965 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 966 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 967 CPU_CORE_FLAGS, 1 },
8a2c8fef 968 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 969 CPU_CORE_FLAGS, 0 },
8a2c8fef 970 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 971 CPU_CORE2_FLAGS, 1 },
8a2c8fef 972 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 973 CPU_CORE2_FLAGS, 0 },
8a2c8fef 974 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 975 CPU_COREI7_FLAGS, 0 },
8a2c8fef 976 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 977 CPU_L1OM_FLAGS, 0 },
7a9068fe 978 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 979 CPU_K1OM_FLAGS, 0 },
81486035 980 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 981 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 983 CPU_K6_FLAGS, 0 },
8a2c8fef 984 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 985 CPU_K6_2_FLAGS, 0 },
8a2c8fef 986 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 987 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 988 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 989 CPU_K8_FLAGS, 1 },
8a2c8fef 990 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 991 CPU_K8_FLAGS, 0 },
8a2c8fef 992 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 993 CPU_K8_FLAGS, 0 },
8a2c8fef 994 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 995 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 996 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 997 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 998 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 999 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1000 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1001 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1002 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1003 CPU_BDVER4_FLAGS, 0 },
029f3522 1004 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1005 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1006 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1007 CPU_ZNVER2_FLAGS, 0 },
646cc3e0
GG
1008 { STRING_COMMA_LEN ("znver3"), PROCESSOR_ZNVER,
1009 CPU_ZNVER3_FLAGS, 0 },
7b458c12 1010 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1011 CPU_BTVER1_FLAGS, 0 },
7b458c12 1012 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1013 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1014 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1015 CPU_8087_FLAGS, 0 },
8a2c8fef 1016 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1017 CPU_287_FLAGS, 0 },
8a2c8fef 1018 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1019 CPU_387_FLAGS, 0 },
1848e567
L
1020 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1021 CPU_687_FLAGS, 0 },
d871f3f4
L
1022 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1023 CPU_CMOV_FLAGS, 0 },
1024 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1025 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1026 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_MMX_FLAGS, 0 },
8a2c8fef 1028 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_SSE_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1032 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1033 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1034 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1035 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1036 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1038 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1040 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1042 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1044 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_AVX_FLAGS, 0 },
6c30d220 1046 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1047 CPU_AVX2_FLAGS, 0 },
43234a1e 1048 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_AVX512F_FLAGS, 0 },
43234a1e 1050 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1052 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1054 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1056 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1058 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1060 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1062 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_VMX_FLAGS, 0 },
8729a6f6 1064 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1066 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_SMX_FLAGS, 0 },
8a2c8fef 1068 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1070 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1072 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1074 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1076 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_AES_FLAGS, 0 },
8a2c8fef 1078 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1080 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1082 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1084 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1086 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_F16C_FLAGS, 0 },
6c30d220 1088 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1090 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_FMA_FLAGS, 0 },
8a2c8fef 1092 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1094 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_XOP_FLAGS, 0 },
8a2c8fef 1096 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_LWP_FLAGS, 0 },
8a2c8fef 1098 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_MOVBE_FLAGS, 0 },
60aa667e 1100 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_CX16_FLAGS, 0 },
8a2c8fef 1102 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_EPT_FLAGS, 0 },
6c30d220 1104 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1105 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1106 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1107 CPU_POPCNT_FLAGS, 0 },
42164a71 1108 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_HLE_FLAGS, 0 },
42164a71 1110 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1111 CPU_RTM_FLAGS, 0 },
6c30d220 1112 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1114 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_CLFLUSH_FLAGS, 0 },
22109423 1116 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1117 CPU_NOP_FLAGS, 0 },
8a2c8fef 1118 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1119 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1120 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1121 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1122 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1123 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1124 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1125 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1126 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1127 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1128 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_SVME_FLAGS, 1 },
8a2c8fef 1130 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_SVME_FLAGS, 0 },
8a2c8fef 1132 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1134 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_ABM_FLAGS, 0 },
87973e9f 1136 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1137 CPU_BMI_FLAGS, 0 },
2a2a0f38 1138 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1139 CPU_TBM_FLAGS, 0 },
e2e1fcde 1140 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1141 CPU_ADX_FLAGS, 0 },
e2e1fcde 1142 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1143 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1144 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1145 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1146 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1147 CPU_SMAP_FLAGS, 0 },
7e8b059b 1148 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1149 CPU_MPX_FLAGS, 0 },
a0046408 1150 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1151 CPU_SHA_FLAGS, 0 },
963f3586 1152 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1153 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1154 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1155 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1156 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1157 CPU_SE1_FLAGS, 0 },
c5e7287a 1158 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1159 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1160 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1161 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1162 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1163 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1164 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1165 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1166 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1167 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1168 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1169 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1170 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1171 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1172 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1173 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1174 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1175 CPU_AVX512_BITALG_FLAGS, 0 },
58bf9b6a
L
1176 { STRING_COMMA_LEN (".avx_vnni"), PROCESSOR_UNKNOWN,
1177 CPU_AVX_VNNI_FLAGS, 0 },
029f3522 1178 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1179 CPU_CLZERO_FLAGS, 0 },
9916071f 1180 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1181 CPU_MWAITX_FLAGS, 0 },
8eab4136 1182 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1183 CPU_OSPKE_FLAGS, 0 },
8bc52696 1184 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1185 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1186 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1187 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1188 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1189 CPU_IBT_FLAGS, 0 },
1190 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1191 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1192 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1193 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1194 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1195 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1196 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1197 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1198 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1199 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1200 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1201 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1202 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1203 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1204 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1205 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1206 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1207 CPU_AMX_INT8_FLAGS, 0 },
1208 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1209 CPU_AMX_BF16_FLAGS, 0 },
1210 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1211 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1212 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1213 CPU_MOVDIRI_FLAGS, 0 },
1214 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1215 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1216 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1217 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1218 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1219 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
81d54bb7
CL
1220 { STRING_COMMA_LEN (".tdx"), PROCESSOR_UNKNOWN,
1221 CPU_TDX_FLAGS, 0 },
dd455cf5
L
1222 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1223 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1224 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1225 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1226 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1227 CPU_RDPRU_FLAGS, 0 },
1228 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1229 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1230 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1231 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1232 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1233 CPU_TSXLDTRK_FLAGS, 0 },
c4694f17
TG
1234 { STRING_COMMA_LEN (".kl"), PROCESSOR_UNKNOWN,
1235 CPU_KL_FLAGS, 0 },
1236 { STRING_COMMA_LEN (".widekl"), PROCESSOR_UNKNOWN,
1237 CPU_WIDEKL_FLAGS, 0 },
f64c42a9
LC
1238 { STRING_COMMA_LEN (".uintr"), PROCESSOR_UNKNOWN,
1239 CPU_UINTR_FLAGS, 0 },
c1fa250a
LC
1240 { STRING_COMMA_LEN (".hreset"), PROCESSOR_UNKNOWN,
1241 CPU_HRESET_FLAGS, 0 },
293f5f65
L
1242};
1243
1244static const noarch_entry cpu_noarch[] =
1245{
1246 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1247 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1248 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1249 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1250 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1251 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1252 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1253 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1254 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1255 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1256 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1257 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1258 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1259 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1260 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1261 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1262 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1263 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1264 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1265 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1266 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1267 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1268 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1269 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1270 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1271 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1272 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1273 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1274 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1275 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1276 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1277 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
58bf9b6a 1278 { STRING_COMMA_LEN ("noavx_vnni"), CPU_ANY_AVX_VNNI_FLAGS },
d777820b
IT
1279 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1280 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1281 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1282 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1283 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1284 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1285 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1286 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1287 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1288 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
81d54bb7 1289 { STRING_COMMA_LEN ("notdx"), CPU_ANY_TDX_FLAGS },
dd455cf5 1290 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1291 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1292 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
c4694f17
TG
1293 { STRING_COMMA_LEN ("nokl"), CPU_ANY_KL_FLAGS },
1294 { STRING_COMMA_LEN ("nowidekl"), CPU_ANY_WIDEKL_FLAGS },
f64c42a9 1295 { STRING_COMMA_LEN ("nouintr"), CPU_ANY_UINTR_FLAGS },
c1fa250a 1296 { STRING_COMMA_LEN ("nohreset"), CPU_ANY_HRESET_FLAGS },
e413e4e9
AM
1297};
1298
704209c0 1299#ifdef I386COFF
a6c24e68
NC
1300/* Like s_lcomm_internal in gas/read.c but the alignment string
1301 is allowed to be optional. */
1302
1303static symbolS *
1304pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1305{
1306 addressT align = 0;
1307
1308 SKIP_WHITESPACE ();
1309
7ab9ffdd 1310 if (needs_align
a6c24e68
NC
1311 && *input_line_pointer == ',')
1312 {
1313 align = parse_align (needs_align - 1);
7ab9ffdd 1314
a6c24e68
NC
1315 if (align == (addressT) -1)
1316 return NULL;
1317 }
1318 else
1319 {
1320 if (size >= 8)
1321 align = 3;
1322 else if (size >= 4)
1323 align = 2;
1324 else if (size >= 2)
1325 align = 1;
1326 else
1327 align = 0;
1328 }
1329
1330 bss_alloc (symbolP, size, align);
1331 return symbolP;
1332}
1333
704209c0 1334static void
a6c24e68
NC
1335pe_lcomm (int needs_align)
1336{
1337 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1338}
704209c0 1339#endif
a6c24e68 1340
29b0f896
AM
1341const pseudo_typeS md_pseudo_table[] =
1342{
1343#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1344 {"align", s_align_bytes, 0},
1345#else
1346 {"align", s_align_ptwo, 0},
1347#endif
1348 {"arch", set_cpu_arch, 0},
1349#ifndef I386COFF
1350 {"bss", s_bss, 0},
a6c24e68
NC
1351#else
1352 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1353#endif
1354 {"ffloat", float_cons, 'f'},
1355 {"dfloat", float_cons, 'd'},
1356 {"tfloat", float_cons, 'x'},
1357 {"value", cons, 2},
d182319b 1358 {"slong", signed_cons, 4},
29b0f896
AM
1359 {"noopt", s_ignore, 0},
1360 {"optim", s_ignore, 0},
1361 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1362 {"code16", set_code_flag, CODE_16BIT},
1363 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1364#ifdef BFD64
29b0f896 1365 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1366#endif
29b0f896
AM
1367 {"intel_syntax", set_intel_syntax, 1},
1368 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1369 {"intel_mnemonic", set_intel_mnemonic, 1},
1370 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1371 {"allow_index_reg", set_allow_index_reg, 1},
1372 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1373 {"sse_check", set_check, 0},
1374 {"operand_check", set_check, 1},
3b22753a
L
1375#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1376 {"largecomm", handle_large_common, 0},
07a53e5c 1377#else
68d20676 1378 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1379 {"loc", dwarf2_directive_loc, 0},
1380 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1381#endif
6482c264
NC
1382#ifdef TE_PE
1383 {"secrel32", pe_directive_secrel, 0},
1384#endif
29b0f896
AM
1385 {0, 0, 0}
1386};
1387
1388/* For interface with expression (). */
1389extern char *input_line_pointer;
1390
1391/* Hash table for instruction mnemonic lookup. */
629310ab 1392static htab_t op_hash;
29b0f896
AM
1393
1394/* Hash table for register lookup. */
629310ab 1395static htab_t reg_hash;
29b0f896 1396\f
ce8a8b2f
AM
1397 /* Various efficient no-op patterns for aligning code labels.
1398 Note: Don't try to assemble the instructions in the comments.
1399 0L and 0w are not legal. */
62a02d25
L
1400static const unsigned char f32_1[] =
1401 {0x90}; /* nop */
1402static const unsigned char f32_2[] =
1403 {0x66,0x90}; /* xchg %ax,%ax */
1404static const unsigned char f32_3[] =
1405 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1406static const unsigned char f32_4[] =
1407 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1408static const unsigned char f32_6[] =
1409 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1410static const unsigned char f32_7[] =
1411 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1412static const unsigned char f16_3[] =
3ae729d5 1413 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1414static const unsigned char f16_4[] =
3ae729d5
L
1415 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1416static const unsigned char jump_disp8[] =
1417 {0xeb}; /* jmp disp8 */
1418static const unsigned char jump32_disp32[] =
1419 {0xe9}; /* jmp disp32 */
1420static const unsigned char jump16_disp32[] =
1421 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1422/* 32-bit NOPs patterns. */
1423static const unsigned char *const f32_patt[] = {
3ae729d5 1424 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1425};
1426/* 16-bit NOPs patterns. */
1427static const unsigned char *const f16_patt[] = {
3ae729d5 1428 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1429};
1430/* nopl (%[re]ax) */
1431static const unsigned char alt_3[] =
1432 {0x0f,0x1f,0x00};
1433/* nopl 0(%[re]ax) */
1434static const unsigned char alt_4[] =
1435 {0x0f,0x1f,0x40,0x00};
1436/* nopl 0(%[re]ax,%[re]ax,1) */
1437static const unsigned char alt_5[] =
1438 {0x0f,0x1f,0x44,0x00,0x00};
1439/* nopw 0(%[re]ax,%[re]ax,1) */
1440static const unsigned char alt_6[] =
1441 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1442/* nopl 0L(%[re]ax) */
1443static const unsigned char alt_7[] =
1444 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1445/* nopl 0L(%[re]ax,%[re]ax,1) */
1446static const unsigned char alt_8[] =
1447 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1448/* nopw 0L(%[re]ax,%[re]ax,1) */
1449static const unsigned char alt_9[] =
1450 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1451/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1452static const unsigned char alt_10[] =
1453 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1454/* data16 nopw %cs:0L(%eax,%eax,1) */
1455static const unsigned char alt_11[] =
1456 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1457/* 32-bit and 64-bit NOPs patterns. */
1458static const unsigned char *const alt_patt[] = {
1459 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1460 alt_9, alt_10, alt_11
62a02d25
L
1461};
1462
1463/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1464 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1465
1466static void
1467i386_output_nops (char *where, const unsigned char *const *patt,
1468 int count, int max_single_nop_size)
1469
1470{
3ae729d5
L
1471 /* Place the longer NOP first. */
1472 int last;
1473 int offset;
3076e594
NC
1474 const unsigned char *nops;
1475
1476 if (max_single_nop_size < 1)
1477 {
1478 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1479 max_single_nop_size);
1480 return;
1481 }
1482
1483 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1484
1485 /* Use the smaller one if the requsted one isn't available. */
1486 if (nops == NULL)
62a02d25 1487 {
3ae729d5
L
1488 max_single_nop_size--;
1489 nops = patt[max_single_nop_size - 1];
62a02d25
L
1490 }
1491
3ae729d5
L
1492 last = count % max_single_nop_size;
1493
1494 count -= last;
1495 for (offset = 0; offset < count; offset += max_single_nop_size)
1496 memcpy (where + offset, nops, max_single_nop_size);
1497
1498 if (last)
1499 {
1500 nops = patt[last - 1];
1501 if (nops == NULL)
1502 {
1503 /* Use the smaller one plus one-byte NOP if the needed one
1504 isn't available. */
1505 last--;
1506 nops = patt[last - 1];
1507 memcpy (where + offset, nops, last);
1508 where[offset + last] = *patt[0];
1509 }
1510 else
1511 memcpy (where + offset, nops, last);
1512 }
62a02d25
L
1513}
1514
3ae729d5
L
1515static INLINE int
1516fits_in_imm7 (offsetT num)
1517{
1518 return (num & 0x7f) == num;
1519}
1520
1521static INLINE int
1522fits_in_imm31 (offsetT num)
1523{
1524 return (num & 0x7fffffff) == num;
1525}
62a02d25
L
1526
1527/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1528 single NOP instruction LIMIT. */
1529
1530void
3ae729d5 1531i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1532{
3ae729d5 1533 const unsigned char *const *patt = NULL;
62a02d25 1534 int max_single_nop_size;
3ae729d5
L
1535 /* Maximum number of NOPs before switching to jump over NOPs. */
1536 int max_number_of_nops;
62a02d25 1537
3ae729d5 1538 switch (fragP->fr_type)
62a02d25 1539 {
3ae729d5
L
1540 case rs_fill_nop:
1541 case rs_align_code:
1542 break;
e379e5f3
L
1543 case rs_machine_dependent:
1544 /* Allow NOP padding for jumps and calls. */
1545 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1546 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1547 break;
1548 /* Fall through. */
3ae729d5 1549 default:
62a02d25
L
1550 return;
1551 }
1552
ccc9c027
L
1553 /* We need to decide which NOP sequence to use for 32bit and
1554 64bit. When -mtune= is used:
4eed87de 1555
76bc74dc
L
1556 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1557 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1558 2. For the rest, alt_patt will be used.
1559
1560 When -mtune= isn't used, alt_patt will be used if
22109423 1561 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1562 be used.
ccc9c027
L
1563
1564 When -march= or .arch is used, we can't use anything beyond
1565 cpu_arch_isa_flags. */
1566
1567 if (flag_code == CODE_16BIT)
1568 {
3ae729d5
L
1569 patt = f16_patt;
1570 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1571 /* Limit number of NOPs to 2 in 16-bit mode. */
1572 max_number_of_nops = 2;
252b5132 1573 }
33fef721 1574 else
ccc9c027 1575 {
fbf3f584 1576 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1577 {
1578 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1579 switch (cpu_arch_tune)
1580 {
1581 case PROCESSOR_UNKNOWN:
1582 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1583 optimize with nops. */
1584 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1585 patt = alt_patt;
ccc9c027
L
1586 else
1587 patt = f32_patt;
1588 break;
ccc9c027
L
1589 case PROCESSOR_PENTIUM4:
1590 case PROCESSOR_NOCONA:
ef05d495 1591 case PROCESSOR_CORE:
76bc74dc 1592 case PROCESSOR_CORE2:
bd5295b2 1593 case PROCESSOR_COREI7:
3632d14b 1594 case PROCESSOR_L1OM:
7a9068fe 1595 case PROCESSOR_K1OM:
76bc74dc 1596 case PROCESSOR_GENERIC64:
ccc9c027
L
1597 case PROCESSOR_K6:
1598 case PROCESSOR_ATHLON:
1599 case PROCESSOR_K8:
4eed87de 1600 case PROCESSOR_AMDFAM10:
8aedb9fe 1601 case PROCESSOR_BD:
029f3522 1602 case PROCESSOR_ZNVER:
7b458c12 1603 case PROCESSOR_BT:
80b8656c 1604 patt = alt_patt;
ccc9c027 1605 break;
76bc74dc 1606 case PROCESSOR_I386:
ccc9c027
L
1607 case PROCESSOR_I486:
1608 case PROCESSOR_PENTIUM:
2dde1948 1609 case PROCESSOR_PENTIUMPRO:
81486035 1610 case PROCESSOR_IAMCU:
ccc9c027
L
1611 case PROCESSOR_GENERIC32:
1612 patt = f32_patt;
1613 break;
4eed87de 1614 }
ccc9c027
L
1615 }
1616 else
1617 {
fbf3f584 1618 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1619 {
1620 case PROCESSOR_UNKNOWN:
e6a14101 1621 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1622 PROCESSOR_UNKNOWN. */
1623 abort ();
1624 break;
1625
76bc74dc 1626 case PROCESSOR_I386:
ccc9c027
L
1627 case PROCESSOR_I486:
1628 case PROCESSOR_PENTIUM:
81486035 1629 case PROCESSOR_IAMCU:
ccc9c027
L
1630 case PROCESSOR_K6:
1631 case PROCESSOR_ATHLON:
1632 case PROCESSOR_K8:
4eed87de 1633 case PROCESSOR_AMDFAM10:
8aedb9fe 1634 case PROCESSOR_BD:
029f3522 1635 case PROCESSOR_ZNVER:
7b458c12 1636 case PROCESSOR_BT:
ccc9c027
L
1637 case PROCESSOR_GENERIC32:
1638 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1639 with nops. */
1640 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1641 patt = alt_patt;
ccc9c027
L
1642 else
1643 patt = f32_patt;
1644 break;
76bc74dc
L
1645 case PROCESSOR_PENTIUMPRO:
1646 case PROCESSOR_PENTIUM4:
1647 case PROCESSOR_NOCONA:
1648 case PROCESSOR_CORE:
ef05d495 1649 case PROCESSOR_CORE2:
bd5295b2 1650 case PROCESSOR_COREI7:
3632d14b 1651 case PROCESSOR_L1OM:
7a9068fe 1652 case PROCESSOR_K1OM:
22109423 1653 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1654 patt = alt_patt;
ccc9c027
L
1655 else
1656 patt = f32_patt;
1657 break;
1658 case PROCESSOR_GENERIC64:
80b8656c 1659 patt = alt_patt;
ccc9c027 1660 break;
4eed87de 1661 }
ccc9c027
L
1662 }
1663
76bc74dc
L
1664 if (patt == f32_patt)
1665 {
3ae729d5
L
1666 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1667 /* Limit number of NOPs to 2 for older processors. */
1668 max_number_of_nops = 2;
76bc74dc
L
1669 }
1670 else
1671 {
3ae729d5
L
1672 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1673 /* Limit number of NOPs to 7 for newer processors. */
1674 max_number_of_nops = 7;
1675 }
1676 }
1677
1678 if (limit == 0)
1679 limit = max_single_nop_size;
1680
1681 if (fragP->fr_type == rs_fill_nop)
1682 {
1683 /* Output NOPs for .nop directive. */
1684 if (limit > max_single_nop_size)
1685 {
1686 as_bad_where (fragP->fr_file, fragP->fr_line,
1687 _("invalid single nop size: %d "
1688 "(expect within [0, %d])"),
1689 limit, max_single_nop_size);
1690 return;
1691 }
1692 }
e379e5f3 1693 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1694 fragP->fr_var = count;
1695
1696 if ((count / max_single_nop_size) > max_number_of_nops)
1697 {
1698 /* Generate jump over NOPs. */
1699 offsetT disp = count - 2;
1700 if (fits_in_imm7 (disp))
1701 {
1702 /* Use "jmp disp8" if possible. */
1703 count = disp;
1704 where[0] = jump_disp8[0];
1705 where[1] = count;
1706 where += 2;
1707 }
1708 else
1709 {
1710 unsigned int size_of_jump;
1711
1712 if (flag_code == CODE_16BIT)
1713 {
1714 where[0] = jump16_disp32[0];
1715 where[1] = jump16_disp32[1];
1716 size_of_jump = 2;
1717 }
1718 else
1719 {
1720 where[0] = jump32_disp32[0];
1721 size_of_jump = 1;
1722 }
1723
1724 count -= size_of_jump + 4;
1725 if (!fits_in_imm31 (count))
1726 {
1727 as_bad_where (fragP->fr_file, fragP->fr_line,
1728 _("jump over nop padding out of range"));
1729 return;
1730 }
1731
1732 md_number_to_chars (where + size_of_jump, count, 4);
1733 where += size_of_jump + 4;
76bc74dc 1734 }
ccc9c027 1735 }
3ae729d5
L
1736
1737 /* Generate multiple NOPs. */
1738 i386_output_nops (where, patt, count, limit);
252b5132
RH
1739}
1740
c6fb90c8 1741static INLINE int
0dfbf9d7 1742operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1743{
0dfbf9d7 1744 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1745 {
1746 case 3:
0dfbf9d7 1747 if (x->array[2])
c6fb90c8 1748 return 0;
1a0670f3 1749 /* Fall through. */
c6fb90c8 1750 case 2:
0dfbf9d7 1751 if (x->array[1])
c6fb90c8 1752 return 0;
1a0670f3 1753 /* Fall through. */
c6fb90c8 1754 case 1:
0dfbf9d7 1755 return !x->array[0];
c6fb90c8
L
1756 default:
1757 abort ();
1758 }
40fb9820
L
1759}
1760
c6fb90c8 1761static INLINE void
0dfbf9d7 1762operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1763{
0dfbf9d7 1764 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1765 {
1766 case 3:
0dfbf9d7 1767 x->array[2] = v;
1a0670f3 1768 /* Fall through. */
c6fb90c8 1769 case 2:
0dfbf9d7 1770 x->array[1] = v;
1a0670f3 1771 /* Fall through. */
c6fb90c8 1772 case 1:
0dfbf9d7 1773 x->array[0] = v;
1a0670f3 1774 /* Fall through. */
c6fb90c8
L
1775 break;
1776 default:
1777 abort ();
1778 }
bab6aec1
JB
1779
1780 x->bitfield.class = ClassNone;
75e5731b 1781 x->bitfield.instance = InstanceNone;
c6fb90c8 1782}
40fb9820 1783
c6fb90c8 1784static INLINE int
0dfbf9d7
L
1785operand_type_equal (const union i386_operand_type *x,
1786 const union i386_operand_type *y)
c6fb90c8 1787{
0dfbf9d7 1788 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1789 {
1790 case 3:
0dfbf9d7 1791 if (x->array[2] != y->array[2])
c6fb90c8 1792 return 0;
1a0670f3 1793 /* Fall through. */
c6fb90c8 1794 case 2:
0dfbf9d7 1795 if (x->array[1] != y->array[1])
c6fb90c8 1796 return 0;
1a0670f3 1797 /* Fall through. */
c6fb90c8 1798 case 1:
0dfbf9d7 1799 return x->array[0] == y->array[0];
c6fb90c8
L
1800 break;
1801 default:
1802 abort ();
1803 }
1804}
40fb9820 1805
0dfbf9d7
L
1806static INLINE int
1807cpu_flags_all_zero (const union i386_cpu_flags *x)
1808{
1809 switch (ARRAY_SIZE(x->array))
1810 {
53467f57
IT
1811 case 4:
1812 if (x->array[3])
1813 return 0;
1814 /* Fall through. */
0dfbf9d7
L
1815 case 3:
1816 if (x->array[2])
1817 return 0;
1a0670f3 1818 /* Fall through. */
0dfbf9d7
L
1819 case 2:
1820 if (x->array[1])
1821 return 0;
1a0670f3 1822 /* Fall through. */
0dfbf9d7
L
1823 case 1:
1824 return !x->array[0];
1825 default:
1826 abort ();
1827 }
1828}
1829
0dfbf9d7
L
1830static INLINE int
1831cpu_flags_equal (const union i386_cpu_flags *x,
1832 const union i386_cpu_flags *y)
1833{
1834 switch (ARRAY_SIZE(x->array))
1835 {
53467f57
IT
1836 case 4:
1837 if (x->array[3] != y->array[3])
1838 return 0;
1839 /* Fall through. */
0dfbf9d7
L
1840 case 3:
1841 if (x->array[2] != y->array[2])
1842 return 0;
1a0670f3 1843 /* Fall through. */
0dfbf9d7
L
1844 case 2:
1845 if (x->array[1] != y->array[1])
1846 return 0;
1a0670f3 1847 /* Fall through. */
0dfbf9d7
L
1848 case 1:
1849 return x->array[0] == y->array[0];
1850 break;
1851 default:
1852 abort ();
1853 }
1854}
c6fb90c8
L
1855
1856static INLINE int
1857cpu_flags_check_cpu64 (i386_cpu_flags f)
1858{
1859 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1860 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1861}
1862
c6fb90c8
L
1863static INLINE i386_cpu_flags
1864cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1865{
c6fb90c8
L
1866 switch (ARRAY_SIZE (x.array))
1867 {
53467f57
IT
1868 case 4:
1869 x.array [3] &= y.array [3];
1870 /* Fall through. */
c6fb90c8
L
1871 case 3:
1872 x.array [2] &= y.array [2];
1a0670f3 1873 /* Fall through. */
c6fb90c8
L
1874 case 2:
1875 x.array [1] &= y.array [1];
1a0670f3 1876 /* Fall through. */
c6fb90c8
L
1877 case 1:
1878 x.array [0] &= y.array [0];
1879 break;
1880 default:
1881 abort ();
1882 }
1883 return x;
1884}
40fb9820 1885
c6fb90c8
L
1886static INLINE i386_cpu_flags
1887cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1888{
c6fb90c8 1889 switch (ARRAY_SIZE (x.array))
40fb9820 1890 {
53467f57
IT
1891 case 4:
1892 x.array [3] |= y.array [3];
1893 /* Fall through. */
c6fb90c8
L
1894 case 3:
1895 x.array [2] |= y.array [2];
1a0670f3 1896 /* Fall through. */
c6fb90c8
L
1897 case 2:
1898 x.array [1] |= y.array [1];
1a0670f3 1899 /* Fall through. */
c6fb90c8
L
1900 case 1:
1901 x.array [0] |= y.array [0];
40fb9820
L
1902 break;
1903 default:
1904 abort ();
1905 }
40fb9820
L
1906 return x;
1907}
1908
309d3373
JB
1909static INLINE i386_cpu_flags
1910cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1911{
1912 switch (ARRAY_SIZE (x.array))
1913 {
53467f57
IT
1914 case 4:
1915 x.array [3] &= ~y.array [3];
1916 /* Fall through. */
309d3373
JB
1917 case 3:
1918 x.array [2] &= ~y.array [2];
1a0670f3 1919 /* Fall through. */
309d3373
JB
1920 case 2:
1921 x.array [1] &= ~y.array [1];
1a0670f3 1922 /* Fall through. */
309d3373
JB
1923 case 1:
1924 x.array [0] &= ~y.array [0];
1925 break;
1926 default:
1927 abort ();
1928 }
1929 return x;
1930}
1931
6c0946d0
JB
1932static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1933
c0f3af97
L
1934#define CPU_FLAGS_ARCH_MATCH 0x1
1935#define CPU_FLAGS_64BIT_MATCH 0x2
1936
c0f3af97 1937#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1938 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1939
1940/* Return CPU flags match bits. */
3629bb00 1941
40fb9820 1942static int
d3ce72d0 1943cpu_flags_match (const insn_template *t)
40fb9820 1944{
c0f3af97
L
1945 i386_cpu_flags x = t->cpu_flags;
1946 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1947
1948 x.bitfield.cpu64 = 0;
1949 x.bitfield.cpuno64 = 0;
1950
0dfbf9d7 1951 if (cpu_flags_all_zero (&x))
c0f3af97
L
1952 {
1953 /* This instruction is available on all archs. */
db12e14e 1954 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1955 }
3629bb00
L
1956 else
1957 {
c0f3af97 1958 /* This instruction is available only on some archs. */
3629bb00
L
1959 i386_cpu_flags cpu = cpu_arch_flags;
1960
ab592e75
JB
1961 /* AVX512VL is no standalone feature - match it and then strip it. */
1962 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1963 return match;
1964 x.bitfield.cpuavx512vl = 0;
1965
3629bb00 1966 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1967 if (!cpu_flags_all_zero (&cpu))
1968 {
57392598 1969 if (x.bitfield.cpuavx)
a5ff0eb2 1970 {
929f69fa 1971 /* We need to check a few extra flags with AVX. */
b9d49817 1972 if (cpu.bitfield.cpuavx
40d231b4
JB
1973 && (!t->opcode_modifier.sse2avx
1974 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1975 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1976 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1977 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1978 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1979 }
929f69fa
JB
1980 else if (x.bitfield.cpuavx512f)
1981 {
1982 /* We need to check a few extra flags with AVX512F. */
1983 if (cpu.bitfield.cpuavx512f
1984 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1985 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1986 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1987 match |= CPU_FLAGS_ARCH_MATCH;
1988 }
a5ff0eb2 1989 else
db12e14e 1990 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1991 }
3629bb00 1992 }
c0f3af97 1993 return match;
40fb9820
L
1994}
1995
c6fb90c8
L
1996static INLINE i386_operand_type
1997operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1998{
bab6aec1
JB
1999 if (x.bitfield.class != y.bitfield.class)
2000 x.bitfield.class = ClassNone;
75e5731b
JB
2001 if (x.bitfield.instance != y.bitfield.instance)
2002 x.bitfield.instance = InstanceNone;
bab6aec1 2003
c6fb90c8
L
2004 switch (ARRAY_SIZE (x.array))
2005 {
2006 case 3:
2007 x.array [2] &= y.array [2];
1a0670f3 2008 /* Fall through. */
c6fb90c8
L
2009 case 2:
2010 x.array [1] &= y.array [1];
1a0670f3 2011 /* Fall through. */
c6fb90c8
L
2012 case 1:
2013 x.array [0] &= y.array [0];
2014 break;
2015 default:
2016 abort ();
2017 }
2018 return x;
40fb9820
L
2019}
2020
73053c1f
JB
2021static INLINE i386_operand_type
2022operand_type_and_not (i386_operand_type x, i386_operand_type y)
2023{
bab6aec1 2024 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2025 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2026
73053c1f
JB
2027 switch (ARRAY_SIZE (x.array))
2028 {
2029 case 3:
2030 x.array [2] &= ~y.array [2];
2031 /* Fall through. */
2032 case 2:
2033 x.array [1] &= ~y.array [1];
2034 /* Fall through. */
2035 case 1:
2036 x.array [0] &= ~y.array [0];
2037 break;
2038 default:
2039 abort ();
2040 }
2041 return x;
2042}
2043
c6fb90c8
L
2044static INLINE i386_operand_type
2045operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2046{
bab6aec1
JB
2047 gas_assert (x.bitfield.class == ClassNone ||
2048 y.bitfield.class == ClassNone ||
2049 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2050 gas_assert (x.bitfield.instance == InstanceNone ||
2051 y.bitfield.instance == InstanceNone ||
2052 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2053
c6fb90c8 2054 switch (ARRAY_SIZE (x.array))
40fb9820 2055 {
c6fb90c8
L
2056 case 3:
2057 x.array [2] |= y.array [2];
1a0670f3 2058 /* Fall through. */
c6fb90c8
L
2059 case 2:
2060 x.array [1] |= y.array [1];
1a0670f3 2061 /* Fall through. */
c6fb90c8
L
2062 case 1:
2063 x.array [0] |= y.array [0];
40fb9820
L
2064 break;
2065 default:
2066 abort ();
2067 }
c6fb90c8
L
2068 return x;
2069}
40fb9820 2070
c6fb90c8
L
2071static INLINE i386_operand_type
2072operand_type_xor (i386_operand_type x, i386_operand_type y)
2073{
bab6aec1 2074 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2075 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2076
c6fb90c8
L
2077 switch (ARRAY_SIZE (x.array))
2078 {
2079 case 3:
2080 x.array [2] ^= y.array [2];
1a0670f3 2081 /* Fall through. */
c6fb90c8
L
2082 case 2:
2083 x.array [1] ^= y.array [1];
1a0670f3 2084 /* Fall through. */
c6fb90c8
L
2085 case 1:
2086 x.array [0] ^= y.array [0];
2087 break;
2088 default:
2089 abort ();
2090 }
40fb9820
L
2091 return x;
2092}
2093
40fb9820
L
2094static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2095static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2096static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2097static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2098static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2099static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2100static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2101static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2102static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2103static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2104static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2105static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2106static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2107static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2108static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2109static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2110static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2111
2112enum operand_type
2113{
2114 reg,
40fb9820
L
2115 imm,
2116 disp,
2117 anymem
2118};
2119
c6fb90c8 2120static INLINE int
40fb9820
L
2121operand_type_check (i386_operand_type t, enum operand_type c)
2122{
2123 switch (c)
2124 {
2125 case reg:
bab6aec1 2126 return t.bitfield.class == Reg;
40fb9820 2127
40fb9820
L
2128 case imm:
2129 return (t.bitfield.imm8
2130 || t.bitfield.imm8s
2131 || t.bitfield.imm16
2132 || t.bitfield.imm32
2133 || t.bitfield.imm32s
2134 || t.bitfield.imm64);
2135
2136 case disp:
2137 return (t.bitfield.disp8
2138 || t.bitfield.disp16
2139 || t.bitfield.disp32
2140 || t.bitfield.disp32s
2141 || t.bitfield.disp64);
2142
2143 case anymem:
2144 return (t.bitfield.disp8
2145 || t.bitfield.disp16
2146 || t.bitfield.disp32
2147 || t.bitfield.disp32s
2148 || t.bitfield.disp64
2149 || t.bitfield.baseindex);
2150
2151 default:
2152 abort ();
2153 }
2cfe26b6
AM
2154
2155 return 0;
40fb9820
L
2156}
2157
7a54636a
L
2158/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2159 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2160
2161static INLINE int
7a54636a
L
2162match_operand_size (const insn_template *t, unsigned int wanted,
2163 unsigned int given)
5c07affc 2164{
3ac21baa
JB
2165 return !((i.types[given].bitfield.byte
2166 && !t->operand_types[wanted].bitfield.byte)
2167 || (i.types[given].bitfield.word
2168 && !t->operand_types[wanted].bitfield.word)
2169 || (i.types[given].bitfield.dword
2170 && !t->operand_types[wanted].bitfield.dword)
2171 || (i.types[given].bitfield.qword
2172 && !t->operand_types[wanted].bitfield.qword)
2173 || (i.types[given].bitfield.tbyte
2174 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2175}
2176
dd40ce22
L
2177/* Return 1 if there is no conflict in SIMD register between operand
2178 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2179
2180static INLINE int
dd40ce22
L
2181match_simd_size (const insn_template *t, unsigned int wanted,
2182 unsigned int given)
1b54b8d7 2183{
3ac21baa
JB
2184 return !((i.types[given].bitfield.xmmword
2185 && !t->operand_types[wanted].bitfield.xmmword)
2186 || (i.types[given].bitfield.ymmword
2187 && !t->operand_types[wanted].bitfield.ymmword)
2188 || (i.types[given].bitfield.zmmword
260cd341
LC
2189 && !t->operand_types[wanted].bitfield.zmmword)
2190 || (i.types[given].bitfield.tmmword
2191 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2192}
2193
7a54636a
L
2194/* Return 1 if there is no conflict in any size between operand GIVEN
2195 and opeand WANTED for instruction template T. */
5c07affc
L
2196
2197static INLINE int
dd40ce22
L
2198match_mem_size (const insn_template *t, unsigned int wanted,
2199 unsigned int given)
5c07affc 2200{
7a54636a 2201 return (match_operand_size (t, wanted, given)
3ac21baa 2202 && !((i.types[given].bitfield.unspecified
5273a3cd 2203 && !i.broadcast.type
3ac21baa
JB
2204 && !t->operand_types[wanted].bitfield.unspecified)
2205 || (i.types[given].bitfield.fword
2206 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2207 /* For scalar opcode templates to allow register and memory
2208 operands at the same time, some special casing is needed
d6793fa1
JB
2209 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2210 down-conversion vpmov*. */
3528c362 2211 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2212 && t->operand_types[wanted].bitfield.byte
2213 + t->operand_types[wanted].bitfield.word
2214 + t->operand_types[wanted].bitfield.dword
2215 + t->operand_types[wanted].bitfield.qword
2216 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2217 ? (i.types[given].bitfield.xmmword
2218 || i.types[given].bitfield.ymmword
2219 || i.types[given].bitfield.zmmword)
2220 : !match_simd_size(t, wanted, given))));
5c07affc
L
2221}
2222
3ac21baa
JB
2223/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2224 operands for instruction template T, and it has MATCH_REVERSE set if there
2225 is no size conflict on any operands for the template with operands reversed
2226 (and the template allows for reversing in the first place). */
5c07affc 2227
3ac21baa
JB
2228#define MATCH_STRAIGHT 1
2229#define MATCH_REVERSE 2
2230
2231static INLINE unsigned int
d3ce72d0 2232operand_size_match (const insn_template *t)
5c07affc 2233{
3ac21baa 2234 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2235
0cfa3eb3 2236 /* Don't check non-absolute jump instructions. */
5c07affc 2237 if (t->opcode_modifier.jump
0cfa3eb3 2238 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2239 return match;
2240
2241 /* Check memory and accumulator operand size. */
2242 for (j = 0; j < i.operands; j++)
2243 {
3528c362
JB
2244 if (i.types[j].bitfield.class != Reg
2245 && i.types[j].bitfield.class != RegSIMD
601e8564 2246 && t->opcode_modifier.anysize)
5c07affc
L
2247 continue;
2248
bab6aec1 2249 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2250 && !match_operand_size (t, j, j))
5c07affc
L
2251 {
2252 match = 0;
2253 break;
2254 }
2255
3528c362 2256 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2257 && !match_simd_size (t, j, j))
1b54b8d7
JB
2258 {
2259 match = 0;
2260 break;
2261 }
2262
75e5731b 2263 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2264 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2265 {
2266 match = 0;
2267 break;
2268 }
2269
c48dadc9 2270 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2271 {
2272 match = 0;
2273 break;
2274 }
2275 }
2276
3ac21baa 2277 if (!t->opcode_modifier.d)
891edac4 2278 {
dc1e8a47 2279 mismatch:
3ac21baa
JB
2280 if (!match)
2281 i.error = operand_size_mismatch;
2282 return match;
891edac4 2283 }
5c07affc
L
2284
2285 /* Check reverse. */
f5eb1d70 2286 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2287
f5eb1d70 2288 for (j = 0; j < i.operands; j++)
5c07affc 2289 {
f5eb1d70
JB
2290 unsigned int given = i.operands - j - 1;
2291
bab6aec1 2292 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2293 && !match_operand_size (t, j, given))
891edac4 2294 goto mismatch;
5c07affc 2295
3528c362 2296 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2297 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2298 goto mismatch;
2299
75e5731b 2300 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2301 && (!match_operand_size (t, j, given)
2302 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2303 goto mismatch;
2304
f5eb1d70 2305 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2306 goto mismatch;
5c07affc
L
2307 }
2308
3ac21baa 2309 return match | MATCH_REVERSE;
5c07affc
L
2310}
2311
c6fb90c8 2312static INLINE int
40fb9820
L
2313operand_type_match (i386_operand_type overlap,
2314 i386_operand_type given)
2315{
2316 i386_operand_type temp = overlap;
2317
7d5e4556 2318 temp.bitfield.unspecified = 0;
5c07affc
L
2319 temp.bitfield.byte = 0;
2320 temp.bitfield.word = 0;
2321 temp.bitfield.dword = 0;
2322 temp.bitfield.fword = 0;
2323 temp.bitfield.qword = 0;
2324 temp.bitfield.tbyte = 0;
2325 temp.bitfield.xmmword = 0;
c0f3af97 2326 temp.bitfield.ymmword = 0;
43234a1e 2327 temp.bitfield.zmmword = 0;
260cd341 2328 temp.bitfield.tmmword = 0;
0dfbf9d7 2329 if (operand_type_all_zero (&temp))
891edac4 2330 goto mismatch;
40fb9820 2331
6f2f06be 2332 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2333 return 1;
2334
dc1e8a47 2335 mismatch:
a65babc9 2336 i.error = operand_type_mismatch;
891edac4 2337 return 0;
40fb9820
L
2338}
2339
7d5e4556 2340/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2341 unless the expected operand type register overlap is null.
5de4d9ef 2342 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2343
c6fb90c8 2344static INLINE int
dc821c5f 2345operand_type_register_match (i386_operand_type g0,
40fb9820 2346 i386_operand_type t0,
40fb9820
L
2347 i386_operand_type g1,
2348 i386_operand_type t1)
2349{
bab6aec1 2350 if (g0.bitfield.class != Reg
3528c362 2351 && g0.bitfield.class != RegSIMD
10c17abd
JB
2352 && (!operand_type_check (g0, anymem)
2353 || g0.bitfield.unspecified
5de4d9ef
JB
2354 || (t0.bitfield.class != Reg
2355 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2356 return 1;
2357
bab6aec1 2358 if (g1.bitfield.class != Reg
3528c362 2359 && g1.bitfield.class != RegSIMD
10c17abd
JB
2360 && (!operand_type_check (g1, anymem)
2361 || g1.bitfield.unspecified
5de4d9ef
JB
2362 || (t1.bitfield.class != Reg
2363 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2364 return 1;
2365
dc821c5f
JB
2366 if (g0.bitfield.byte == g1.bitfield.byte
2367 && g0.bitfield.word == g1.bitfield.word
2368 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2369 && g0.bitfield.qword == g1.bitfield.qword
2370 && g0.bitfield.xmmword == g1.bitfield.xmmword
2371 && g0.bitfield.ymmword == g1.bitfield.ymmword
2372 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2373 return 1;
2374
dc821c5f
JB
2375 if (!(t0.bitfield.byte & t1.bitfield.byte)
2376 && !(t0.bitfield.word & t1.bitfield.word)
2377 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2378 && !(t0.bitfield.qword & t1.bitfield.qword)
2379 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2380 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2381 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2382 return 1;
2383
a65babc9 2384 i.error = register_type_mismatch;
891edac4
L
2385
2386 return 0;
40fb9820
L
2387}
2388
4c692bc7
JB
2389static INLINE unsigned int
2390register_number (const reg_entry *r)
2391{
2392 unsigned int nr = r->reg_num;
2393
2394 if (r->reg_flags & RegRex)
2395 nr += 8;
2396
200cbe0f
L
2397 if (r->reg_flags & RegVRex)
2398 nr += 16;
2399
4c692bc7
JB
2400 return nr;
2401}
2402
252b5132 2403static INLINE unsigned int
40fb9820 2404mode_from_disp_size (i386_operand_type t)
252b5132 2405{
b5014f7a 2406 if (t.bitfield.disp8)
40fb9820
L
2407 return 1;
2408 else if (t.bitfield.disp16
2409 || t.bitfield.disp32
2410 || t.bitfield.disp32s)
2411 return 2;
2412 else
2413 return 0;
252b5132
RH
2414}
2415
2416static INLINE int
65879393 2417fits_in_signed_byte (addressT num)
252b5132 2418{
65879393 2419 return num + 0x80 <= 0xff;
47926f60 2420}
252b5132
RH
2421
2422static INLINE int
65879393 2423fits_in_unsigned_byte (addressT num)
252b5132 2424{
65879393 2425 return num <= 0xff;
47926f60 2426}
252b5132
RH
2427
2428static INLINE int
65879393 2429fits_in_unsigned_word (addressT num)
252b5132 2430{
65879393 2431 return num <= 0xffff;
47926f60 2432}
252b5132
RH
2433
2434static INLINE int
65879393 2435fits_in_signed_word (addressT num)
252b5132 2436{
65879393 2437 return num + 0x8000 <= 0xffff;
47926f60 2438}
2a962e6d 2439
3e73aa7c 2440static INLINE int
65879393 2441fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2442{
2443#ifndef BFD64
2444 return 1;
2445#else
65879393 2446 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2447#endif
2448} /* fits_in_signed_long() */
2a962e6d 2449
3e73aa7c 2450static INLINE int
65879393 2451fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2452{
2453#ifndef BFD64
2454 return 1;
2455#else
65879393 2456 return num <= 0xffffffff;
3e73aa7c
JH
2457#endif
2458} /* fits_in_unsigned_long() */
252b5132 2459
43234a1e 2460static INLINE int
b5014f7a 2461fits_in_disp8 (offsetT num)
43234a1e
L
2462{
2463 int shift = i.memshift;
2464 unsigned int mask;
2465
2466 if (shift == -1)
2467 abort ();
2468
2469 mask = (1 << shift) - 1;
2470
2471 /* Return 0 if NUM isn't properly aligned. */
2472 if ((num & mask))
2473 return 0;
2474
2475 /* Check if NUM will fit in 8bit after shift. */
2476 return fits_in_signed_byte (num >> shift);
2477}
2478
a683cc34
SP
2479static INLINE int
2480fits_in_imm4 (offsetT num)
2481{
2482 return (num & 0xf) == num;
2483}
2484
40fb9820 2485static i386_operand_type
e3bb37b5 2486smallest_imm_type (offsetT num)
252b5132 2487{
40fb9820 2488 i386_operand_type t;
7ab9ffdd 2489
0dfbf9d7 2490 operand_type_set (&t, 0);
40fb9820
L
2491 t.bitfield.imm64 = 1;
2492
2493 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2494 {
2495 /* This code is disabled on the 486 because all the Imm1 forms
2496 in the opcode table are slower on the i486. They're the
2497 versions with the implicitly specified single-position
2498 displacement, which has another syntax if you really want to
2499 use that form. */
40fb9820
L
2500 t.bitfield.imm1 = 1;
2501 t.bitfield.imm8 = 1;
2502 t.bitfield.imm8s = 1;
2503 t.bitfield.imm16 = 1;
2504 t.bitfield.imm32 = 1;
2505 t.bitfield.imm32s = 1;
2506 }
2507 else if (fits_in_signed_byte (num))
2508 {
2509 t.bitfield.imm8 = 1;
2510 t.bitfield.imm8s = 1;
2511 t.bitfield.imm16 = 1;
2512 t.bitfield.imm32 = 1;
2513 t.bitfield.imm32s = 1;
2514 }
2515 else if (fits_in_unsigned_byte (num))
2516 {
2517 t.bitfield.imm8 = 1;
2518 t.bitfield.imm16 = 1;
2519 t.bitfield.imm32 = 1;
2520 t.bitfield.imm32s = 1;
2521 }
2522 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2523 {
2524 t.bitfield.imm16 = 1;
2525 t.bitfield.imm32 = 1;
2526 t.bitfield.imm32s = 1;
2527 }
2528 else if (fits_in_signed_long (num))
2529 {
2530 t.bitfield.imm32 = 1;
2531 t.bitfield.imm32s = 1;
2532 }
2533 else if (fits_in_unsigned_long (num))
2534 t.bitfield.imm32 = 1;
2535
2536 return t;
47926f60 2537}
252b5132 2538
847f7ad4 2539static offsetT
e3bb37b5 2540offset_in_range (offsetT val, int size)
847f7ad4 2541{
508866be 2542 addressT mask;
ba2adb93 2543
847f7ad4
AM
2544 switch (size)
2545 {
508866be
L
2546 case 1: mask = ((addressT) 1 << 8) - 1; break;
2547 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2548 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2549#ifdef BFD64
2550 case 8: mask = ((addressT) 2 << 63) - 1; break;
2551#endif
47926f60 2552 default: abort ();
847f7ad4
AM
2553 }
2554
47926f60 2555 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2556 {
2557 char buf1[40], buf2[40];
2558
9a8041fd
JB
2559 bfd_sprintf_vma (stdoutput, buf1, val);
2560 bfd_sprintf_vma (stdoutput, buf2, val & mask);
847f7ad4
AM
2561 as_warn (_("%s shortened to %s"), buf1, buf2);
2562 }
2563 return val & mask;
2564}
2565
c32fa91d
L
2566enum PREFIX_GROUP
2567{
2568 PREFIX_EXIST = 0,
2569 PREFIX_LOCK,
2570 PREFIX_REP,
04ef582a 2571 PREFIX_DS,
c32fa91d
L
2572 PREFIX_OTHER
2573};
2574
2575/* Returns
2576 a. PREFIX_EXIST if attempting to add a prefix where one from the
2577 same class already exists.
2578 b. PREFIX_LOCK if lock prefix is added.
2579 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2580 d. PREFIX_DS if ds prefix is added.
2581 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2582 */
2583
2584static enum PREFIX_GROUP
e3bb37b5 2585add_prefix (unsigned int prefix)
252b5132 2586{
c32fa91d 2587 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2588 unsigned int q;
252b5132 2589
29b0f896
AM
2590 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2591 && flag_code == CODE_64BIT)
b1905489 2592 {
161a04f6 2593 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2594 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2595 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2596 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2597 ret = PREFIX_EXIST;
b1905489
JB
2598 q = REX_PREFIX;
2599 }
3e73aa7c 2600 else
b1905489
JB
2601 {
2602 switch (prefix)
2603 {
2604 default:
2605 abort ();
2606
b1905489 2607 case DS_PREFIX_OPCODE:
04ef582a
L
2608 ret = PREFIX_DS;
2609 /* Fall through. */
2610 case CS_PREFIX_OPCODE:
b1905489
JB
2611 case ES_PREFIX_OPCODE:
2612 case FS_PREFIX_OPCODE:
2613 case GS_PREFIX_OPCODE:
2614 case SS_PREFIX_OPCODE:
2615 q = SEG_PREFIX;
2616 break;
2617
2618 case REPNE_PREFIX_OPCODE:
2619 case REPE_PREFIX_OPCODE:
c32fa91d
L
2620 q = REP_PREFIX;
2621 ret = PREFIX_REP;
2622 break;
2623
b1905489 2624 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2625 q = LOCK_PREFIX;
2626 ret = PREFIX_LOCK;
b1905489
JB
2627 break;
2628
2629 case FWAIT_OPCODE:
2630 q = WAIT_PREFIX;
2631 break;
2632
2633 case ADDR_PREFIX_OPCODE:
2634 q = ADDR_PREFIX;
2635 break;
2636
2637 case DATA_PREFIX_OPCODE:
2638 q = DATA_PREFIX;
2639 break;
2640 }
2641 if (i.prefix[q] != 0)
c32fa91d 2642 ret = PREFIX_EXIST;
b1905489 2643 }
252b5132 2644
b1905489 2645 if (ret)
252b5132 2646 {
b1905489
JB
2647 if (!i.prefix[q])
2648 ++i.prefixes;
2649 i.prefix[q] |= prefix;
252b5132 2650 }
b1905489
JB
2651 else
2652 as_bad (_("same type of prefix used twice"));
252b5132 2653
252b5132
RH
2654 return ret;
2655}
2656
2657static void
78f12dd3 2658update_code_flag (int value, int check)
eecb386c 2659{
78f12dd3
L
2660 PRINTF_LIKE ((*as_error));
2661
1e9cc1c2 2662 flag_code = (enum flag_code) value;
40fb9820
L
2663 if (flag_code == CODE_64BIT)
2664 {
2665 cpu_arch_flags.bitfield.cpu64 = 1;
2666 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2667 }
2668 else
2669 {
2670 cpu_arch_flags.bitfield.cpu64 = 0;
2671 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2672 }
2673 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2674 {
78f12dd3
L
2675 if (check)
2676 as_error = as_fatal;
2677 else
2678 as_error = as_bad;
2679 (*as_error) (_("64bit mode not supported on `%s'."),
2680 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2681 }
40fb9820 2682 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2683 {
78f12dd3
L
2684 if (check)
2685 as_error = as_fatal;
2686 else
2687 as_error = as_bad;
2688 (*as_error) (_("32bit mode not supported on `%s'."),
2689 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2690 }
eecb386c
AM
2691 stackop_size = '\0';
2692}
2693
78f12dd3
L
2694static void
2695set_code_flag (int value)
2696{
2697 update_code_flag (value, 0);
2698}
2699
eecb386c 2700static void
e3bb37b5 2701set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2702{
1e9cc1c2 2703 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2704 if (flag_code != CODE_16BIT)
2705 abort ();
2706 cpu_arch_flags.bitfield.cpu64 = 0;
2707 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2708 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2709}
2710
2711static void
e3bb37b5 2712set_intel_syntax (int syntax_flag)
252b5132
RH
2713{
2714 /* Find out if register prefixing is specified. */
2715 int ask_naked_reg = 0;
2716
2717 SKIP_WHITESPACE ();
29b0f896 2718 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2719 {
d02603dc
NC
2720 char *string;
2721 int e = get_symbol_name (&string);
252b5132 2722
47926f60 2723 if (strcmp (string, "prefix") == 0)
252b5132 2724 ask_naked_reg = 1;
47926f60 2725 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2726 ask_naked_reg = -1;
2727 else
d0b47220 2728 as_bad (_("bad argument to syntax directive."));
d02603dc 2729 (void) restore_line_pointer (e);
252b5132
RH
2730 }
2731 demand_empty_rest_of_line ();
c3332e24 2732
252b5132
RH
2733 intel_syntax = syntax_flag;
2734
2735 if (ask_naked_reg == 0)
f86103b7
AM
2736 allow_naked_reg = (intel_syntax
2737 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2738 else
2739 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2740
ee86248c 2741 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2742
e4a3b5a4 2743 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2744 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2745 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2746}
2747
1efbbeb4
L
2748static void
2749set_intel_mnemonic (int mnemonic_flag)
2750{
e1d4d893 2751 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2752}
2753
db51cc60
L
2754static void
2755set_allow_index_reg (int flag)
2756{
2757 allow_index_reg = flag;
2758}
2759
cb19c032 2760static void
7bab8ab5 2761set_check (int what)
cb19c032 2762{
7bab8ab5
JB
2763 enum check_kind *kind;
2764 const char *str;
2765
2766 if (what)
2767 {
2768 kind = &operand_check;
2769 str = "operand";
2770 }
2771 else
2772 {
2773 kind = &sse_check;
2774 str = "sse";
2775 }
2776
cb19c032
L
2777 SKIP_WHITESPACE ();
2778
2779 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2780 {
d02603dc
NC
2781 char *string;
2782 int e = get_symbol_name (&string);
cb19c032
L
2783
2784 if (strcmp (string, "none") == 0)
7bab8ab5 2785 *kind = check_none;
cb19c032 2786 else if (strcmp (string, "warning") == 0)
7bab8ab5 2787 *kind = check_warning;
cb19c032 2788 else if (strcmp (string, "error") == 0)
7bab8ab5 2789 *kind = check_error;
cb19c032 2790 else
7bab8ab5 2791 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2792 (void) restore_line_pointer (e);
cb19c032
L
2793 }
2794 else
7bab8ab5 2795 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2796
2797 demand_empty_rest_of_line ();
2798}
2799
8a9036a4
L
2800static void
2801check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2802 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2803{
2804#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2805 static const char *arch;
2806
2807 /* Intel LIOM is only supported on ELF. */
2808 if (!IS_ELF)
2809 return;
2810
2811 if (!arch)
2812 {
2813 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2814 use default_arch. */
2815 arch = cpu_arch_name;
2816 if (!arch)
2817 arch = default_arch;
2818 }
2819
81486035
L
2820 /* If we are targeting Intel MCU, we must enable it. */
2821 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2822 || new_flag.bitfield.cpuiamcu)
2823 return;
2824
3632d14b 2825 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2826 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2827 || new_flag.bitfield.cpul1om)
8a9036a4 2828 return;
76ba9986 2829
7a9068fe
L
2830 /* If we are targeting Intel K1OM, we must enable it. */
2831 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2832 || new_flag.bitfield.cpuk1om)
2833 return;
2834
8a9036a4
L
2835 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2836#endif
2837}
2838
e413e4e9 2839static void
e3bb37b5 2840set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2841{
47926f60 2842 SKIP_WHITESPACE ();
e413e4e9 2843
29b0f896 2844 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2845 {
d02603dc
NC
2846 char *string;
2847 int e = get_symbol_name (&string);
91d6fa6a 2848 unsigned int j;
40fb9820 2849 i386_cpu_flags flags;
e413e4e9 2850
91d6fa6a 2851 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2852 {
91d6fa6a 2853 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2854 {
91d6fa6a 2855 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2856
5c6af06e
JB
2857 if (*string != '.')
2858 {
91d6fa6a 2859 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2860 cpu_sub_arch_name = NULL;
91d6fa6a 2861 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2862 if (flag_code == CODE_64BIT)
2863 {
2864 cpu_arch_flags.bitfield.cpu64 = 1;
2865 cpu_arch_flags.bitfield.cpuno64 = 0;
2866 }
2867 else
2868 {
2869 cpu_arch_flags.bitfield.cpu64 = 0;
2870 cpu_arch_flags.bitfield.cpuno64 = 1;
2871 }
91d6fa6a
NC
2872 cpu_arch_isa = cpu_arch[j].type;
2873 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2874 if (!cpu_arch_tune_set)
2875 {
2876 cpu_arch_tune = cpu_arch_isa;
2877 cpu_arch_tune_flags = cpu_arch_isa_flags;
2878 }
5c6af06e
JB
2879 break;
2880 }
40fb9820 2881
293f5f65
L
2882 flags = cpu_flags_or (cpu_arch_flags,
2883 cpu_arch[j].flags);
81486035 2884
5b64d091 2885 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2886 {
6305a203
L
2887 if (cpu_sub_arch_name)
2888 {
2889 char *name = cpu_sub_arch_name;
2890 cpu_sub_arch_name = concat (name,
91d6fa6a 2891 cpu_arch[j].name,
1bf57e9f 2892 (const char *) NULL);
6305a203
L
2893 free (name);
2894 }
2895 else
91d6fa6a 2896 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2897 cpu_arch_flags = flags;
a586129e 2898 cpu_arch_isa_flags = flags;
5c6af06e 2899 }
0089dace
L
2900 else
2901 cpu_arch_isa_flags
2902 = cpu_flags_or (cpu_arch_isa_flags,
2903 cpu_arch[j].flags);
d02603dc 2904 (void) restore_line_pointer (e);
5c6af06e
JB
2905 demand_empty_rest_of_line ();
2906 return;
e413e4e9
AM
2907 }
2908 }
293f5f65
L
2909
2910 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2911 {
33eaf5de 2912 /* Disable an ISA extension. */
293f5f65
L
2913 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2914 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2915 {
2916 flags = cpu_flags_and_not (cpu_arch_flags,
2917 cpu_noarch[j].flags);
2918 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2919 {
2920 if (cpu_sub_arch_name)
2921 {
2922 char *name = cpu_sub_arch_name;
2923 cpu_sub_arch_name = concat (name, string,
2924 (const char *) NULL);
2925 free (name);
2926 }
2927 else
2928 cpu_sub_arch_name = xstrdup (string);
2929 cpu_arch_flags = flags;
2930 cpu_arch_isa_flags = flags;
2931 }
2932 (void) restore_line_pointer (e);
2933 demand_empty_rest_of_line ();
2934 return;
2935 }
2936
2937 j = ARRAY_SIZE (cpu_arch);
2938 }
2939
91d6fa6a 2940 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2941 as_bad (_("no such architecture: `%s'"), string);
2942
2943 *input_line_pointer = e;
2944 }
2945 else
2946 as_bad (_("missing cpu architecture"));
2947
fddf5b5b
AM
2948 no_cond_jump_promotion = 0;
2949 if (*input_line_pointer == ','
29b0f896 2950 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2951 {
d02603dc
NC
2952 char *string;
2953 char e;
2954
2955 ++input_line_pointer;
2956 e = get_symbol_name (&string);
fddf5b5b
AM
2957
2958 if (strcmp (string, "nojumps") == 0)
2959 no_cond_jump_promotion = 1;
2960 else if (strcmp (string, "jumps") == 0)
2961 ;
2962 else
2963 as_bad (_("no such architecture modifier: `%s'"), string);
2964
d02603dc 2965 (void) restore_line_pointer (e);
fddf5b5b
AM
2966 }
2967
e413e4e9
AM
2968 demand_empty_rest_of_line ();
2969}
2970
8a9036a4
L
2971enum bfd_architecture
2972i386_arch (void)
2973{
3632d14b 2974 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2975 {
2976 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2977 || flag_code != CODE_64BIT)
2978 as_fatal (_("Intel L1OM is 64bit ELF only"));
2979 return bfd_arch_l1om;
2980 }
7a9068fe
L
2981 else if (cpu_arch_isa == PROCESSOR_K1OM)
2982 {
2983 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2984 || flag_code != CODE_64BIT)
2985 as_fatal (_("Intel K1OM is 64bit ELF only"));
2986 return bfd_arch_k1om;
2987 }
81486035
L
2988 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2989 {
2990 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2991 || flag_code == CODE_64BIT)
2992 as_fatal (_("Intel MCU is 32bit ELF only"));
2993 return bfd_arch_iamcu;
2994 }
8a9036a4
L
2995 else
2996 return bfd_arch_i386;
2997}
2998
b9d79e03 2999unsigned long
7016a5d5 3000i386_mach (void)
b9d79e03 3001{
d34049e8 3002 if (startswith (default_arch, "x86_64"))
8a9036a4 3003 {
3632d14b 3004 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 3005 {
351f65ca
L
3006 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3007 || default_arch[6] != '\0')
8a9036a4
L
3008 as_fatal (_("Intel L1OM is 64bit ELF only"));
3009 return bfd_mach_l1om;
3010 }
7a9068fe
L
3011 else if (cpu_arch_isa == PROCESSOR_K1OM)
3012 {
3013 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3014 || default_arch[6] != '\0')
3015 as_fatal (_("Intel K1OM is 64bit ELF only"));
3016 return bfd_mach_k1om;
3017 }
351f65ca 3018 else if (default_arch[6] == '\0')
8a9036a4 3019 return bfd_mach_x86_64;
351f65ca
L
3020 else
3021 return bfd_mach_x64_32;
8a9036a4 3022 }
5197d474
L
3023 else if (!strcmp (default_arch, "i386")
3024 || !strcmp (default_arch, "iamcu"))
81486035
L
3025 {
3026 if (cpu_arch_isa == PROCESSOR_IAMCU)
3027 {
3028 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3029 as_fatal (_("Intel MCU is 32bit ELF only"));
3030 return bfd_mach_i386_iamcu;
3031 }
3032 else
3033 return bfd_mach_i386_i386;
3034 }
b9d79e03 3035 else
2b5d6a91 3036 as_fatal (_("unknown architecture"));
b9d79e03 3037}
b9d79e03 3038\f
252b5132 3039void
7016a5d5 3040md_begin (void)
252b5132 3041{
86fa6981
L
3042 /* Support pseudo prefixes like {disp32}. */
3043 lex_type ['{'] = LEX_BEGIN_NAME;
3044
47926f60 3045 /* Initialize op_hash hash table. */
629310ab 3046 op_hash = str_htab_create ();
252b5132
RH
3047
3048 {
d3ce72d0 3049 const insn_template *optab;
29b0f896 3050 templates *core_optab;
252b5132 3051
47926f60
KH
3052 /* Setup for loop. */
3053 optab = i386_optab;
add39d23 3054 core_optab = XNEW (templates);
252b5132
RH
3055 core_optab->start = optab;
3056
3057 while (1)
3058 {
3059 ++optab;
3060 if (optab->name == NULL
3061 || strcmp (optab->name, (optab - 1)->name) != 0)
3062 {
3063 /* different name --> ship out current template list;
47926f60 3064 add to hash table; & begin anew. */
252b5132 3065 core_optab->end = optab;
fe0e921f
AM
3066 if (str_hash_insert (op_hash, (optab - 1)->name, core_optab, 0))
3067 as_fatal (_("duplicate %s"), (optab - 1)->name);
3068
252b5132
RH
3069 if (optab->name == NULL)
3070 break;
add39d23 3071 core_optab = XNEW (templates);
252b5132
RH
3072 core_optab->start = optab;
3073 }
3074 }
3075 }
3076
47926f60 3077 /* Initialize reg_hash hash table. */
629310ab 3078 reg_hash = str_htab_create ();
252b5132 3079 {
29b0f896 3080 const reg_entry *regtab;
c3fe08fa 3081 unsigned int regtab_size = i386_regtab_size;
252b5132 3082
c3fe08fa 3083 for (regtab = i386_regtab; regtab_size--; regtab++)
6225c532 3084 {
6288d05f
JB
3085 switch (regtab->reg_type.bitfield.class)
3086 {
3087 case Reg:
34684862
JB
3088 if (regtab->reg_type.bitfield.dword)
3089 {
3090 if (regtab->reg_type.bitfield.instance == Accum)
3091 reg_eax = regtab;
3092 }
3093 else if (regtab->reg_type.bitfield.tbyte)
6288d05f
JB
3094 {
3095 /* There's no point inserting st(<N>) in the hash table, as
3096 parentheses aren't included in register_chars[] anyway. */
3097 if (regtab->reg_type.bitfield.instance != Accum)
3098 continue;
3099 reg_st0 = regtab;
3100 }
3101 break;
3102
5e042380
JB
3103 case SReg:
3104 switch (regtab->reg_num)
3105 {
3106 case 0: reg_es = regtab; break;
3107 case 2: reg_ss = regtab; break;
3108 case 3: reg_ds = regtab; break;
3109 }
3110 break;
3111
6288d05f
JB
3112 case RegMask:
3113 if (!regtab->reg_num)
3114 reg_k0 = regtab;
3115 break;
3116 }
3117
6225c532
JB
3118 if (str_hash_insert (reg_hash, regtab->reg_name, regtab, 0) != NULL)
3119 as_fatal (_("duplicate %s"), regtab->reg_name);
6225c532 3120 }
252b5132
RH
3121 }
3122
47926f60 3123 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3124 {
29b0f896
AM
3125 int c;
3126 char *p;
252b5132
RH
3127
3128 for (c = 0; c < 256; c++)
3129 {
3882b010 3130 if (ISDIGIT (c))
252b5132
RH
3131 {
3132 digit_chars[c] = c;
3133 mnemonic_chars[c] = c;
3134 register_chars[c] = c;
3135 operand_chars[c] = c;
3136 }
3882b010 3137 else if (ISLOWER (c))
252b5132
RH
3138 {
3139 mnemonic_chars[c] = c;
3140 register_chars[c] = c;
3141 operand_chars[c] = c;
3142 }
3882b010 3143 else if (ISUPPER (c))
252b5132 3144 {
3882b010 3145 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3146 register_chars[c] = mnemonic_chars[c];
3147 operand_chars[c] = c;
3148 }
43234a1e 3149 else if (c == '{' || c == '}')
86fa6981
L
3150 {
3151 mnemonic_chars[c] = c;
3152 operand_chars[c] = c;
3153 }
b3983e5f
JB
3154#ifdef SVR4_COMMENT_CHARS
3155 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3156 operand_chars[c] = c;
3157#endif
252b5132 3158
3882b010 3159 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3160 identifier_chars[c] = c;
3161 else if (c >= 128)
3162 {
3163 identifier_chars[c] = c;
3164 operand_chars[c] = c;
3165 }
3166 }
3167
3168#ifdef LEX_AT
3169 identifier_chars['@'] = '@';
32137342
NC
3170#endif
3171#ifdef LEX_QM
3172 identifier_chars['?'] = '?';
3173 operand_chars['?'] = '?';
252b5132 3174#endif
252b5132 3175 digit_chars['-'] = '-';
c0f3af97 3176 mnemonic_chars['_'] = '_';
791fe849 3177 mnemonic_chars['-'] = '-';
0003779b 3178 mnemonic_chars['.'] = '.';
252b5132
RH
3179 identifier_chars['_'] = '_';
3180 identifier_chars['.'] = '.';
3181
3182 for (p = operand_special_chars; *p != '\0'; p++)
3183 operand_chars[(unsigned char) *p] = *p;
3184 }
3185
a4447b93
RH
3186 if (flag_code == CODE_64BIT)
3187 {
ca19b261
KT
3188#if defined (OBJ_COFF) && defined (TE_PE)
3189 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3190 ? 32 : 16);
3191#else
a4447b93 3192 x86_dwarf2_return_column = 16;
ca19b261 3193#endif
61ff971f 3194 x86_cie_data_alignment = -8;
a4447b93
RH
3195 }
3196 else
3197 {
3198 x86_dwarf2_return_column = 8;
3199 x86_cie_data_alignment = -4;
3200 }
e379e5f3
L
3201
3202 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3203 can be turned into BRANCH_PREFIX frag. */
3204 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3205 abort ();
252b5132
RH
3206}
3207
3208void
e3bb37b5 3209i386_print_statistics (FILE *file)
252b5132 3210{
629310ab
ML
3211 htab_print_statistics (file, "i386 opcode", op_hash);
3212 htab_print_statistics (file, "i386 register", reg_hash);
252b5132
RH
3213}
3214\f
252b5132
RH
3215#ifdef DEBUG386
3216
ce8a8b2f 3217/* Debugging routines for md_assemble. */
d3ce72d0 3218static void pte (insn_template *);
40fb9820 3219static void pt (i386_operand_type);
e3bb37b5
L
3220static void pe (expressionS *);
3221static void ps (symbolS *);
252b5132
RH
3222
3223static void
2c703856 3224pi (const char *line, i386_insn *x)
252b5132 3225{
09137c09 3226 unsigned int j;
252b5132
RH
3227
3228 fprintf (stdout, "%s: template ", line);
3229 pte (&x->tm);
09f131f2
JH
3230 fprintf (stdout, " address: base %s index %s scale %x\n",
3231 x->base_reg ? x->base_reg->reg_name : "none",
3232 x->index_reg ? x->index_reg->reg_name : "none",
3233 x->log2_scale_factor);
3234 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3235 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3236 fprintf (stdout, " sib: base %x index %x scale %x\n",
3237 x->sib.base, x->sib.index, x->sib.scale);
3238 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3239 (x->rex & REX_W) != 0,
3240 (x->rex & REX_R) != 0,
3241 (x->rex & REX_X) != 0,
3242 (x->rex & REX_B) != 0);
09137c09 3243 for (j = 0; j < x->operands; j++)
252b5132 3244 {
09137c09
SP
3245 fprintf (stdout, " #%d: ", j + 1);
3246 pt (x->types[j]);
252b5132 3247 fprintf (stdout, "\n");
bab6aec1 3248 if (x->types[j].bitfield.class == Reg
3528c362
JB
3249 || x->types[j].bitfield.class == RegMMX
3250 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3251 || x->types[j].bitfield.class == RegMask
00cee14f 3252 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3253 || x->types[j].bitfield.class == RegCR
3254 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3255 || x->types[j].bitfield.class == RegTR
3256 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3257 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3258 if (operand_type_check (x->types[j], imm))
3259 pe (x->op[j].imms);
3260 if (operand_type_check (x->types[j], disp))
3261 pe (x->op[j].disps);
252b5132
RH
3262 }
3263}
3264
3265static void
d3ce72d0 3266pte (insn_template *t)
252b5132 3267{
b933fa4b 3268 static const unsigned char opc_pfx[] = { 0, 0x66, 0xf3, 0xf2 };
441f6aca
JB
3269 static const char *const opc_spc[] = {
3270 NULL, "0f", "0f38", "0f3a", NULL, NULL, NULL, NULL,
3271 "XOP08", "XOP09", "XOP0A",
3272 };
09137c09 3273 unsigned int j;
441f6aca 3274
252b5132 3275 fprintf (stdout, " %d operands ", t->operands);
441f6aca
JB
3276 if (opc_pfx[t->opcode_modifier.opcodeprefix])
3277 fprintf (stdout, "pfx %x ", opc_pfx[t->opcode_modifier.opcodeprefix]);
3278 if (opc_spc[t->opcode_modifier.opcodespace])
3279 fprintf (stdout, "space %s ", opc_spc[t->opcode_modifier.opcodespace]);
47926f60 3280 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3281 if (t->extension_opcode != None)
3282 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3283 if (t->opcode_modifier.d)
252b5132 3284 fprintf (stdout, "D");
40fb9820 3285 if (t->opcode_modifier.w)
252b5132
RH
3286 fprintf (stdout, "W");
3287 fprintf (stdout, "\n");
09137c09 3288 for (j = 0; j < t->operands; j++)
252b5132 3289 {
09137c09
SP
3290 fprintf (stdout, " #%d type ", j + 1);
3291 pt (t->operand_types[j]);
252b5132
RH
3292 fprintf (stdout, "\n");
3293 }
3294}
3295
3296static void
e3bb37b5 3297pe (expressionS *e)
252b5132 3298{
24eab124 3299 fprintf (stdout, " operation %d\n", e->X_op);
7b025ee8
JB
3300 fprintf (stdout, " add_number %" BFD_VMA_FMT "d (%" BFD_VMA_FMT "x)\n",
3301 e->X_add_number, e->X_add_number);
252b5132
RH
3302 if (e->X_add_symbol)
3303 {
3304 fprintf (stdout, " add_symbol ");
3305 ps (e->X_add_symbol);
3306 fprintf (stdout, "\n");
3307 }
3308 if (e->X_op_symbol)
3309 {
3310 fprintf (stdout, " op_symbol ");
3311 ps (e->X_op_symbol);
3312 fprintf (stdout, "\n");
3313 }
3314}
3315
3316static void
e3bb37b5 3317ps (symbolS *s)
252b5132
RH
3318{
3319 fprintf (stdout, "%s type %s%s",
3320 S_GET_NAME (s),
3321 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3322 segment_name (S_GET_SEGMENT (s)));
3323}
3324
7b81dfbb 3325static struct type_name
252b5132 3326 {
40fb9820
L
3327 i386_operand_type mask;
3328 const char *name;
252b5132 3329 }
7b81dfbb 3330const type_names[] =
252b5132 3331{
40fb9820
L
3332 { OPERAND_TYPE_REG8, "r8" },
3333 { OPERAND_TYPE_REG16, "r16" },
3334 { OPERAND_TYPE_REG32, "r32" },
3335 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3336 { OPERAND_TYPE_ACC8, "acc8" },
3337 { OPERAND_TYPE_ACC16, "acc16" },
3338 { OPERAND_TYPE_ACC32, "acc32" },
3339 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3340 { OPERAND_TYPE_IMM8, "i8" },
3341 { OPERAND_TYPE_IMM8, "i8s" },
3342 { OPERAND_TYPE_IMM16, "i16" },
3343 { OPERAND_TYPE_IMM32, "i32" },
3344 { OPERAND_TYPE_IMM32S, "i32s" },
3345 { OPERAND_TYPE_IMM64, "i64" },
3346 { OPERAND_TYPE_IMM1, "i1" },
3347 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3348 { OPERAND_TYPE_DISP8, "d8" },
3349 { OPERAND_TYPE_DISP16, "d16" },
3350 { OPERAND_TYPE_DISP32, "d32" },
3351 { OPERAND_TYPE_DISP32S, "d32s" },
3352 { OPERAND_TYPE_DISP64, "d64" },
3353 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3354 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3355 { OPERAND_TYPE_CONTROL, "control reg" },
3356 { OPERAND_TYPE_TEST, "test reg" },
3357 { OPERAND_TYPE_DEBUG, "debug reg" },
3358 { OPERAND_TYPE_FLOATREG, "FReg" },
3359 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3360 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3361 { OPERAND_TYPE_REGMMX, "rMMX" },
3362 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3363 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3364 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3365 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3366 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3367};
3368
3369static void
40fb9820 3370pt (i386_operand_type t)
252b5132 3371{
40fb9820 3372 unsigned int j;
c6fb90c8 3373 i386_operand_type a;
252b5132 3374
40fb9820 3375 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3376 {
3377 a = operand_type_and (t, type_names[j].mask);
2c703856 3378 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3379 fprintf (stdout, "%s, ", type_names[j].name);
3380 }
252b5132
RH
3381 fflush (stdout);
3382}
3383
3384#endif /* DEBUG386 */
3385\f
252b5132 3386static bfd_reloc_code_real_type
3956db08 3387reloc (unsigned int size,
64e74474
AM
3388 int pcrel,
3389 int sign,
3390 bfd_reloc_code_real_type other)
252b5132 3391{
47926f60 3392 if (other != NO_RELOC)
3956db08 3393 {
91d6fa6a 3394 reloc_howto_type *rel;
3956db08
JB
3395
3396 if (size == 8)
3397 switch (other)
3398 {
64e74474
AM
3399 case BFD_RELOC_X86_64_GOT32:
3400 return BFD_RELOC_X86_64_GOT64;
3401 break;
553d1284
L
3402 case BFD_RELOC_X86_64_GOTPLT64:
3403 return BFD_RELOC_X86_64_GOTPLT64;
3404 break;
64e74474
AM
3405 case BFD_RELOC_X86_64_PLTOFF64:
3406 return BFD_RELOC_X86_64_PLTOFF64;
3407 break;
3408 case BFD_RELOC_X86_64_GOTPC32:
3409 other = BFD_RELOC_X86_64_GOTPC64;
3410 break;
3411 case BFD_RELOC_X86_64_GOTPCREL:
3412 other = BFD_RELOC_X86_64_GOTPCREL64;
3413 break;
3414 case BFD_RELOC_X86_64_TPOFF32:
3415 other = BFD_RELOC_X86_64_TPOFF64;
3416 break;
3417 case BFD_RELOC_X86_64_DTPOFF32:
3418 other = BFD_RELOC_X86_64_DTPOFF64;
3419 break;
3420 default:
3421 break;
3956db08 3422 }
e05278af 3423
8ce3d284 3424#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3425 if (other == BFD_RELOC_SIZE32)
3426 {
3427 if (size == 8)
1ab668bf 3428 other = BFD_RELOC_SIZE64;
8fd4256d 3429 if (pcrel)
1ab668bf
AM
3430 {
3431 as_bad (_("there are no pc-relative size relocations"));
3432 return NO_RELOC;
3433 }
8fd4256d 3434 }
8ce3d284 3435#endif
8fd4256d 3436
e05278af 3437 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3438 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3439 sign = -1;
3440
91d6fa6a
NC
3441 rel = bfd_reloc_type_lookup (stdoutput, other);
3442 if (!rel)
3956db08 3443 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3444 else if (size != bfd_get_reloc_size (rel))
3956db08 3445 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3446 bfd_get_reloc_size (rel),
3956db08 3447 size);
91d6fa6a 3448 else if (pcrel && !rel->pc_relative)
3956db08 3449 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3450 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3451 && !sign)
91d6fa6a 3452 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3453 && sign > 0))
3956db08
JB
3454 as_bad (_("relocated field and relocation type differ in signedness"));
3455 else
3456 return other;
3457 return NO_RELOC;
3458 }
252b5132
RH
3459
3460 if (pcrel)
3461 {
3e73aa7c 3462 if (!sign)
3956db08 3463 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3464 switch (size)
3465 {
3466 case 1: return BFD_RELOC_8_PCREL;
3467 case 2: return BFD_RELOC_16_PCREL;
d258b828 3468 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3469 case 8: return BFD_RELOC_64_PCREL;
252b5132 3470 }
3956db08 3471 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3472 }
3473 else
3474 {
3956db08 3475 if (sign > 0)
e5cb08ac 3476 switch (size)
3e73aa7c
JH
3477 {
3478 case 4: return BFD_RELOC_X86_64_32S;
3479 }
3480 else
3481 switch (size)
3482 {
3483 case 1: return BFD_RELOC_8;
3484 case 2: return BFD_RELOC_16;
3485 case 4: return BFD_RELOC_32;
3486 case 8: return BFD_RELOC_64;
3487 }
3956db08
JB
3488 as_bad (_("cannot do %s %u byte relocation"),
3489 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3490 }
3491
0cc9e1d3 3492 return NO_RELOC;
252b5132
RH
3493}
3494
47926f60
KH
3495/* Here we decide which fixups can be adjusted to make them relative to
3496 the beginning of the section instead of the symbol. Basically we need
3497 to make sure that the dynamic relocations are done correctly, so in
3498 some cases we force the original symbol to be used. */
3499
252b5132 3500int
e3bb37b5 3501tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3502{
6d249963 3503#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3504 if (!IS_ELF)
31312f95
AM
3505 return 1;
3506
a161fe53
AM
3507 /* Don't adjust pc-relative references to merge sections in 64-bit
3508 mode. */
3509 if (use_rela_relocations
3510 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3511 && fixP->fx_pcrel)
252b5132 3512 return 0;
31312f95 3513
8d01d9a9
AJ
3514 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3515 and changed later by validate_fix. */
3516 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3517 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3518 return 0;
3519
8fd4256d
L
3520 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3521 for size relocations. */
3522 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3523 || fixP->fx_r_type == BFD_RELOC_SIZE64
3524 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3525 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3526 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3527 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3528 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3529 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3530 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3531 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3532 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3533 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3534 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3535 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3536 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3537 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3538 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3539 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3540 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3541 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3542 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3543 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3544 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3545 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3546 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3547 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3548 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3549 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3550 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3551 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3552 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3553 return 0;
31312f95 3554#endif
252b5132
RH
3555 return 1;
3556}
252b5132 3557
a9aabc23
JB
3558static INLINE bool
3559want_disp32 (const insn_template *t)
3560{
3561 return flag_code != CODE_64BIT
3562 || i.prefix[ADDR_PREFIX]
3563 || (t->base_opcode == 0x8d
3564 && t->opcode_modifier.opcodespace == SPACE_BASE
fe134c65
JB
3565 && (!i.types[1].bitfield.qword
3566 || t->opcode_modifier.size == SIZE32));
a9aabc23
JB
3567}
3568
b4cac588 3569static int
e3bb37b5 3570intel_float_operand (const char *mnemonic)
252b5132 3571{
9306ca4a
JB
3572 /* Note that the value returned is meaningful only for opcodes with (memory)
3573 operands, hence the code here is free to improperly handle opcodes that
3574 have no operands (for better performance and smaller code). */
3575
3576 if (mnemonic[0] != 'f')
3577 return 0; /* non-math */
3578
3579 switch (mnemonic[1])
3580 {
3581 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3582 the fs segment override prefix not currently handled because no
3583 call path can make opcodes without operands get here */
3584 case 'i':
3585 return 2 /* integer op */;
3586 case 'l':
3587 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3588 return 3; /* fldcw/fldenv */
3589 break;
3590 case 'n':
3591 if (mnemonic[2] != 'o' /* fnop */)
3592 return 3; /* non-waiting control op */
3593 break;
3594 case 'r':
3595 if (mnemonic[2] == 's')
3596 return 3; /* frstor/frstpm */
3597 break;
3598 case 's':
3599 if (mnemonic[2] == 'a')
3600 return 3; /* fsave */
3601 if (mnemonic[2] == 't')
3602 {
3603 switch (mnemonic[3])
3604 {
3605 case 'c': /* fstcw */
3606 case 'd': /* fstdw */
3607 case 'e': /* fstenv */
3608 case 's': /* fsts[gw] */
3609 return 3;
3610 }
3611 }
3612 break;
3613 case 'x':
3614 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3615 return 0; /* fxsave/fxrstor are not really math ops */
3616 break;
3617 }
252b5132 3618
9306ca4a 3619 return 1;
252b5132
RH
3620}
3621
9a182d04
JB
3622static INLINE void
3623install_template (const insn_template *t)
3624{
3625 unsigned int l;
3626
3627 i.tm = *t;
3628
3629 /* Note that for pseudo prefixes this produces a length of 1. But for them
3630 the length isn't interesting at all. */
3631 for (l = 1; l < 4; ++l)
3632 if (!(t->base_opcode >> (8 * l)))
3633 break;
3634
3635 i.opcode_length = l;
3636}
3637
c0f3af97
L
3638/* Build the VEX prefix. */
3639
3640static void
d3ce72d0 3641build_vex_prefix (const insn_template *t)
c0f3af97
L
3642{
3643 unsigned int register_specifier;
c0f3af97 3644 unsigned int vector_length;
03751133 3645 unsigned int w;
c0f3af97
L
3646
3647 /* Check register specifier. */
3648 if (i.vex.register_specifier)
43234a1e
L
3649 {
3650 register_specifier =
3651 ~register_number (i.vex.register_specifier) & 0xf;
3652 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3653 }
c0f3af97
L
3654 else
3655 register_specifier = 0xf;
3656
79f0fa25
L
3657 /* Use 2-byte VEX prefix by swapping destination and source operand
3658 if there are more than 1 register operand. */
3659 if (i.reg_operands > 1
3660 && i.vec_encoding != vex_encoding_vex3
86fa6981 3661 && i.dir_encoding == dir_encoding_default
fa99fab2 3662 && i.operands == i.reg_operands
dbbc8b7e 3663 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
441f6aca 3664 && i.tm.opcode_modifier.opcodespace == SPACE_0F
dbbc8b7e 3665 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3666 && i.rex == REX_B)
3667 {
3668 unsigned int xchg = i.operands - 1;
3669 union i386_op temp_op;
3670 i386_operand_type temp_type;
3671
3672 temp_type = i.types[xchg];
3673 i.types[xchg] = i.types[0];
3674 i.types[0] = temp_type;
3675 temp_op = i.op[xchg];
3676 i.op[xchg] = i.op[0];
3677 i.op[0] = temp_op;
3678
9c2799c2 3679 gas_assert (i.rm.mode == 3);
fa99fab2
L
3680
3681 i.rex = REX_R;
3682 xchg = i.rm.regmem;
3683 i.rm.regmem = i.rm.reg;
3684 i.rm.reg = xchg;
3685
dbbc8b7e
JB
3686 if (i.tm.opcode_modifier.d)
3687 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3688 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3689 else /* Use the next insn. */
9a182d04 3690 install_template (&t[1]);
fa99fab2
L
3691 }
3692
79dec6b7
JB
3693 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3694 are no memory operands and at least 3 register ones. */
3695 if (i.reg_operands >= 3
3696 && i.vec_encoding != vex_encoding_vex3
3697 && i.reg_operands == i.operands - i.imm_operands
3698 && i.tm.opcode_modifier.vex
3699 && i.tm.opcode_modifier.commutative
3700 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3701 && i.rex == REX_B
3702 && i.vex.register_specifier
3703 && !(i.vex.register_specifier->reg_flags & RegRex))
3704 {
3705 unsigned int xchg = i.operands - i.reg_operands;
3706 union i386_op temp_op;
3707 i386_operand_type temp_type;
3708
441f6aca 3709 gas_assert (i.tm.opcode_modifier.opcodespace == SPACE_0F);
79dec6b7
JB
3710 gas_assert (!i.tm.opcode_modifier.sae);
3711 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3712 &i.types[i.operands - 3]));
3713 gas_assert (i.rm.mode == 3);
3714
3715 temp_type = i.types[xchg];
3716 i.types[xchg] = i.types[xchg + 1];
3717 i.types[xchg + 1] = temp_type;
3718 temp_op = i.op[xchg];
3719 i.op[xchg] = i.op[xchg + 1];
3720 i.op[xchg + 1] = temp_op;
3721
3722 i.rex = 0;
3723 xchg = i.rm.regmem | 8;
3724 i.rm.regmem = ~register_specifier & 0xf;
3725 gas_assert (!(i.rm.regmem & 8));
3726 i.vex.register_specifier += xchg - i.rm.regmem;
3727 register_specifier = ~xchg & 0xf;
3728 }
3729
539f890d
L
3730 if (i.tm.opcode_modifier.vex == VEXScalar)
3731 vector_length = avxscalar;
10c17abd
JB
3732 else if (i.tm.opcode_modifier.vex == VEX256)
3733 vector_length = 1;
539f890d 3734 else
10c17abd 3735 {
56522fc5 3736 unsigned int op;
10c17abd 3737
c7213af9
L
3738 /* Determine vector length from the last multi-length vector
3739 operand. */
10c17abd 3740 vector_length = 0;
56522fc5 3741 for (op = t->operands; op--;)
10c17abd
JB
3742 if (t->operand_types[op].bitfield.xmmword
3743 && t->operand_types[op].bitfield.ymmword
3744 && i.types[op].bitfield.ymmword)
3745 {
3746 vector_length = 1;
3747 break;
3748 }
3749 }
c0f3af97 3750
03751133
L
3751 /* Check the REX.W bit and VEXW. */
3752 if (i.tm.opcode_modifier.vexw == VEXWIG)
3753 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3754 else if (i.tm.opcode_modifier.vexw)
3755 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3756 else
931d03b7 3757 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3758
c0f3af97 3759 /* Use 2-byte VEX prefix if possible. */
03751133
L
3760 if (w == 0
3761 && i.vec_encoding != vex_encoding_vex3
441f6aca 3762 && i.tm.opcode_modifier.opcodespace == SPACE_0F
c0f3af97
L
3763 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3764 {
3765 /* 2-byte VEX prefix. */
3766 unsigned int r;
3767
3768 i.vex.length = 2;
3769 i.vex.bytes[0] = 0xc5;
3770
3771 /* Check the REX.R bit. */
3772 r = (i.rex & REX_R) ? 0 : 1;
3773 i.vex.bytes[1] = (r << 7
3774 | register_specifier << 3
3775 | vector_length << 2
35648716 3776 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3777 }
3778 else
3779 {
3780 /* 3-byte VEX prefix. */
f88c9eb0 3781 i.vex.length = 3;
f88c9eb0 3782
441f6aca 3783 switch (i.tm.opcode_modifier.opcodespace)
5dd85c99 3784 {
441f6aca
JB
3785 case SPACE_0F:
3786 case SPACE_0F38:
3787 case SPACE_0F3A:
80de6e00 3788 i.vex.bytes[0] = 0xc4;
7f399153 3789 break;
441f6aca
JB
3790 case SPACE_XOP08:
3791 case SPACE_XOP09:
3792 case SPACE_XOP0A:
f88c9eb0 3793 i.vex.bytes[0] = 0x8f;
7f399153
L
3794 break;
3795 default:
3796 abort ();
f88c9eb0 3797 }
c0f3af97 3798
c0f3af97
L
3799 /* The high 3 bits of the second VEX byte are 1's compliment
3800 of RXB bits from REX. */
441f6aca 3801 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
c0f3af97 3802
c0f3af97
L
3803 i.vex.bytes[2] = (w << 7
3804 | register_specifier << 3
3805 | vector_length << 2
35648716 3806 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3807 }
3808}
3809
5b7c81bd 3810static INLINE bool
e771e7c9
JB
3811is_evex_encoding (const insn_template *t)
3812{
7091c612 3813 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3814 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3815 || t->opcode_modifier.sae;
e771e7c9
JB
3816}
3817
5b7c81bd 3818static INLINE bool
7a8655d2
JB
3819is_any_vex_encoding (const insn_template *t)
3820{
7b47a312 3821 return t->opcode_modifier.vex || is_evex_encoding (t);
7a8655d2
JB
3822}
3823
43234a1e
L
3824/* Build the EVEX prefix. */
3825
3826static void
3827build_evex_prefix (void)
3828{
35648716 3829 unsigned int register_specifier, w;
43234a1e
L
3830 rex_byte vrex_used = 0;
3831
3832 /* Check register specifier. */
3833 if (i.vex.register_specifier)
3834 {
3835 gas_assert ((i.vrex & REX_X) == 0);
3836
3837 register_specifier = i.vex.register_specifier->reg_num;
3838 if ((i.vex.register_specifier->reg_flags & RegRex))
3839 register_specifier += 8;
3840 /* The upper 16 registers are encoded in the fourth byte of the
3841 EVEX prefix. */
3842 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3843 i.vex.bytes[3] = 0x8;
3844 register_specifier = ~register_specifier & 0xf;
3845 }
3846 else
3847 {
3848 register_specifier = 0xf;
3849
3850 /* Encode upper 16 vector index register in the fourth byte of
3851 the EVEX prefix. */
3852 if (!(i.vrex & REX_X))
3853 i.vex.bytes[3] = 0x8;
3854 else
3855 vrex_used |= REX_X;
3856 }
3857
43234a1e
L
3858 /* 4 byte EVEX prefix. */
3859 i.vex.length = 4;
3860 i.vex.bytes[0] = 0x62;
3861
43234a1e
L
3862 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3863 bits from REX. */
441f6aca
JB
3864 gas_assert (i.tm.opcode_modifier.opcodespace >= SPACE_0F);
3865 gas_assert (i.tm.opcode_modifier.opcodespace <= SPACE_0F3A);
3866 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
43234a1e
L
3867
3868 /* The fifth bit of the second EVEX byte is 1's compliment of the
3869 REX_R bit in VREX. */
3870 if (!(i.vrex & REX_R))
3871 i.vex.bytes[1] |= 0x10;
3872 else
3873 vrex_used |= REX_R;
3874
3875 if ((i.reg_operands + i.imm_operands) == i.operands)
3876 {
3877 /* When all operands are registers, the REX_X bit in REX is not
3878 used. We reuse it to encode the upper 16 registers, which is
3879 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3880 as 1's compliment. */
3881 if ((i.vrex & REX_B))
3882 {
3883 vrex_used |= REX_B;
3884 i.vex.bytes[1] &= ~0x40;
3885 }
3886 }
3887
3888 /* EVEX instructions shouldn't need the REX prefix. */
3889 i.vrex &= ~vrex_used;
3890 gas_assert (i.vrex == 0);
3891
6865c043
L
3892 /* Check the REX.W bit and VEXW. */
3893 if (i.tm.opcode_modifier.vexw == VEXWIG)
3894 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3895 else if (i.tm.opcode_modifier.vexw)
3896 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3897 else
931d03b7 3898 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e 3899
43234a1e 3900 /* The third byte of the EVEX prefix. */
35648716
JB
3901 i.vex.bytes[2] = ((w << 7)
3902 | (register_specifier << 3)
3903 | 4 /* Encode the U bit. */
3904 | i.tm.opcode_modifier.opcodeprefix);
43234a1e
L
3905
3906 /* The fourth byte of the EVEX prefix. */
3907 /* The zeroing-masking bit. */
6225c532 3908 if (i.mask.reg && i.mask.zeroing)
43234a1e
L
3909 i.vex.bytes[3] |= 0x80;
3910
3911 /* Don't always set the broadcast bit if there is no RC. */
ca5312a2 3912 if (i.rounding.type == rc_none)
43234a1e
L
3913 {
3914 /* Encode the vector length. */
3915 unsigned int vec_length;
3916
e771e7c9
JB
3917 if (!i.tm.opcode_modifier.evex
3918 || i.tm.opcode_modifier.evex == EVEXDYN)
3919 {
56522fc5 3920 unsigned int op;
e771e7c9 3921
c7213af9
L
3922 /* Determine vector length from the last multi-length vector
3923 operand. */
56522fc5 3924 for (op = i.operands; op--;)
e771e7c9
JB
3925 if (i.tm.operand_types[op].bitfield.xmmword
3926 + i.tm.operand_types[op].bitfield.ymmword
3927 + i.tm.operand_types[op].bitfield.zmmword > 1)
3928 {
3929 if (i.types[op].bitfield.zmmword)
c7213af9
L
3930 {
3931 i.tm.opcode_modifier.evex = EVEX512;
3932 break;
3933 }
e771e7c9 3934 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3935 {
3936 i.tm.opcode_modifier.evex = EVEX256;
3937 break;
3938 }
e771e7c9 3939 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3940 {
3941 i.tm.opcode_modifier.evex = EVEX128;
3942 break;
3943 }
5273a3cd 3944 else if (i.broadcast.type && op == i.broadcast.operand)
625cbd7a 3945 {
5273a3cd 3946 switch (i.broadcast.bytes)
625cbd7a
JB
3947 {
3948 case 64:
3949 i.tm.opcode_modifier.evex = EVEX512;
3950 break;
3951 case 32:
3952 i.tm.opcode_modifier.evex = EVEX256;
3953 break;
3954 case 16:
3955 i.tm.opcode_modifier.evex = EVEX128;
3956 break;
3957 default:
c7213af9 3958 abort ();
625cbd7a 3959 }
c7213af9 3960 break;
625cbd7a 3961 }
e771e7c9 3962 }
c7213af9 3963
56522fc5 3964 if (op >= MAX_OPERANDS)
c7213af9 3965 abort ();
e771e7c9
JB
3966 }
3967
43234a1e
L
3968 switch (i.tm.opcode_modifier.evex)
3969 {
3970 case EVEXLIG: /* LL' is ignored */
3971 vec_length = evexlig << 5;
3972 break;
3973 case EVEX128:
3974 vec_length = 0 << 5;
3975 break;
3976 case EVEX256:
3977 vec_length = 1 << 5;
3978 break;
3979 case EVEX512:
3980 vec_length = 2 << 5;
3981 break;
3982 default:
3983 abort ();
3984 break;
3985 }
3986 i.vex.bytes[3] |= vec_length;
3987 /* Encode the broadcast bit. */
5273a3cd 3988 if (i.broadcast.type)
43234a1e
L
3989 i.vex.bytes[3] |= 0x10;
3990 }
ca5312a2
JB
3991 else if (i.rounding.type != saeonly)
3992 i.vex.bytes[3] |= 0x10 | (i.rounding.type << 5);
43234a1e 3993 else
ca5312a2 3994 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e 3995
6225c532
JB
3996 if (i.mask.reg)
3997 i.vex.bytes[3] |= i.mask.reg->reg_num;
43234a1e
L
3998}
3999
65da13b5
L
4000static void
4001process_immext (void)
4002{
4003 expressionS *exp;
4004
c0f3af97 4005 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
4006 which is coded in the same place as an 8-bit immediate field
4007 would be. Here we fake an 8-bit immediate operand from the
4008 opcode suffix stored in tm.extension_opcode.
4009
c1e679ec 4010 AVX instructions also use this encoding, for some of
c0f3af97 4011 3 argument instructions. */
65da13b5 4012
43234a1e 4013 gas_assert (i.imm_operands <= 1
7ab9ffdd 4014 && (i.operands <= 2
7a8655d2 4015 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4016 && i.operands <= 4)));
65da13b5
L
4017
4018 exp = &im_expressions[i.imm_operands++];
4019 i.op[i.operands].imms = exp;
4020 i.types[i.operands] = imm8;
4021 i.operands++;
4022 exp->X_op = O_constant;
4023 exp->X_add_number = i.tm.extension_opcode;
4024 i.tm.extension_opcode = None;
4025}
4026
42164a71
L
4027
4028static int
4029check_hle (void)
4030{
742732c7 4031 switch (i.tm.opcode_modifier.prefixok)
42164a71
L
4032 {
4033 default:
4034 abort ();
742732c7
JB
4035 case PrefixLock:
4036 case PrefixNone:
4037 case PrefixNoTrack:
4038 case PrefixRep:
165de32a
L
4039 as_bad (_("invalid instruction `%s' after `%s'"),
4040 i.tm.name, i.hle_prefix);
42164a71 4041 return 0;
742732c7 4042 case PrefixHLELock:
42164a71
L
4043 if (i.prefix[LOCK_PREFIX])
4044 return 1;
165de32a 4045 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4046 return 0;
742732c7 4047 case PrefixHLEAny:
42164a71 4048 return 1;
742732c7 4049 case PrefixHLERelease:
42164a71
L
4050 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4051 {
4052 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4053 i.tm.name);
4054 return 0;
4055 }
8dc0818e 4056 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4057 {
4058 as_bad (_("memory destination needed for instruction `%s'"
4059 " after `xrelease'"), i.tm.name);
4060 return 0;
4061 }
4062 return 1;
4063 }
4064}
4065
b6f8c7c4
L
4066/* Try the shortest encoding by shortening operand size. */
4067
4068static void
4069optimize_encoding (void)
4070{
a0a1771e 4071 unsigned int j;
b6f8c7c4 4072
fe134c65
JB
4073 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
4074 && i.tm.base_opcode == 0x8d)
4075 {
4076 /* Optimize: -O:
4077 lea symbol, %rN -> mov $symbol, %rN
4078 lea (%rM), %rN -> mov %rM, %rN
4079 lea (,%rM,1), %rN -> mov %rM, %rN
4080
4081 and in 32-bit mode for 16-bit addressing
4082
4083 lea (%rM), %rN -> movzx %rM, %rN
4084
4085 and in 64-bit mode zap 32-bit addressing in favor of using a
4086 32-bit (or less) destination.
4087 */
4088 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4089 {
4090 if (!i.op[1].regs->reg_type.bitfield.word)
4091 i.tm.opcode_modifier.size = SIZE32;
4092 i.prefix[ADDR_PREFIX] = 0;
4093 }
4094
4095 if (!i.index_reg && !i.base_reg)
4096 {
4097 /* Handle:
4098 lea symbol, %rN -> mov $symbol, %rN
4099 */
4100 if (flag_code == CODE_64BIT)
4101 {
4102 /* Don't transform a relocation to a 16-bit one. */
4103 if (i.op[0].disps
4104 && i.op[0].disps->X_op != O_constant
4105 && i.op[1].regs->reg_type.bitfield.word)
4106 return;
4107
4108 if (!i.op[1].regs->reg_type.bitfield.qword
4109 || i.tm.opcode_modifier.size == SIZE32)
4110 {
4111 i.tm.base_opcode = 0xb8;
4112 i.tm.opcode_modifier.modrm = 0;
4113 if (!i.op[1].regs->reg_type.bitfield.word)
4114 i.types[0].bitfield.imm32 = 1;
4115 else
4116 {
4117 i.tm.opcode_modifier.size = SIZE16;
4118 i.types[0].bitfield.imm16 = 1;
4119 }
4120 }
4121 else
4122 {
4123 /* Subject to further optimization below. */
4124 i.tm.base_opcode = 0xc7;
4125 i.tm.extension_opcode = 0;
4126 i.types[0].bitfield.imm32s = 1;
4127 i.types[0].bitfield.baseindex = 0;
4128 }
4129 }
4130 /* Outside of 64-bit mode address and operand sizes have to match if
4131 a relocation is involved, as otherwise we wouldn't (currently) or
4132 even couldn't express the relocation correctly. */
4133 else if (i.op[0].disps
4134 && i.op[0].disps->X_op != O_constant
4135 && ((!i.prefix[ADDR_PREFIX])
4136 != (flag_code == CODE_32BIT
4137 ? i.op[1].regs->reg_type.bitfield.dword
4138 : i.op[1].regs->reg_type.bitfield.word)))
4139 return;
4140 else
4141 {
4142 i.tm.base_opcode = 0xb8;
4143 i.tm.opcode_modifier.modrm = 0;
4144 if (i.op[1].regs->reg_type.bitfield.dword)
4145 i.types[0].bitfield.imm32 = 1;
4146 else
4147 i.types[0].bitfield.imm16 = 1;
4148
4149 if (i.op[0].disps
4150 && i.op[0].disps->X_op == O_constant
4151 && i.op[1].regs->reg_type.bitfield.dword
60cfa10c
L
4152 /* NB: Add () to !i.prefix[ADDR_PREFIX] to silence
4153 GCC 5. */
4154 && (!i.prefix[ADDR_PREFIX]) != (flag_code == CODE_32BIT))
fe134c65
JB
4155 i.op[0].disps->X_add_number &= 0xffff;
4156 }
4157
4158 i.tm.operand_types[0] = i.types[0];
4159 i.imm_operands = 1;
4160 if (!i.op[0].imms)
4161 {
4162 i.op[0].imms = &im_expressions[0];
4163 i.op[0].imms->X_op = O_absent;
4164 }
4165 }
4166 else if (i.op[0].disps
4167 && (i.op[0].disps->X_op != O_constant
4168 || i.op[0].disps->X_add_number))
4169 return;
4170 else
4171 {
4172 /* Handle:
4173 lea (%rM), %rN -> mov %rM, %rN
4174 lea (,%rM,1), %rN -> mov %rM, %rN
4175 lea (%rM), %rN -> movzx %rM, %rN
4176 */
4177 const reg_entry *addr_reg;
4178
4179 if (!i.index_reg && i.base_reg->reg_num != RegIP)
4180 addr_reg = i.base_reg;
4181 else if (!i.base_reg
4182 && i.index_reg->reg_num != RegIZ
4183 && !i.log2_scale_factor)
4184 addr_reg = i.index_reg;
4185 else
4186 return;
4187
4188 if (addr_reg->reg_type.bitfield.word
4189 && i.op[1].regs->reg_type.bitfield.dword)
4190 {
4191 if (flag_code != CODE_32BIT)
4192 return;
4193 i.tm.opcode_modifier.opcodespace = SPACE_0F;
4194 i.tm.base_opcode = 0xb7;
4195 }
4196 else
4197 i.tm.base_opcode = 0x8b;
4198
4199 if (addr_reg->reg_type.bitfield.dword
4200 && i.op[1].regs->reg_type.bitfield.qword)
4201 i.tm.opcode_modifier.size = SIZE32;
4202
4203 i.op[0].regs = addr_reg;
4204 i.reg_operands = 2;
4205 }
4206
4207 i.mem_operands = 0;
4208 i.disp_operands = 0;
4209 i.prefix[ADDR_PREFIX] = 0;
4210 i.prefix[SEG_PREFIX] = 0;
4211 i.seg[0] = NULL;
4212 }
4213
b6f8c7c4 4214 if (optimize_for_space
389d00a5 4215 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
b6f8c7c4
L
4216 && i.reg_operands == 1
4217 && i.imm_operands == 1
4218 && !i.types[1].bitfield.byte
4219 && i.op[0].imms->X_op == O_constant
4220 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4221 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4222 || (i.tm.base_opcode == 0xf6
4223 && i.tm.extension_opcode == 0x0)))
4224 {
4225 /* Optimize: -Os:
4226 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4227 */
4228 unsigned int base_regnum = i.op[1].regs->reg_num;
4229 if (flag_code == CODE_64BIT || base_regnum < 4)
4230 {
4231 i.types[1].bitfield.byte = 1;
4232 /* Ignore the suffix. */
4233 i.suffix = 0;
7697afb6
JB
4234 /* Convert to byte registers. */
4235 if (i.types[1].bitfield.word)
4236 j = 16;
4237 else if (i.types[1].bitfield.dword)
4238 j = 32;
4239 else
4240 j = 48;
4241 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4242 j += 8;
4243 i.op[1].regs -= j;
b6f8c7c4
L
4244 }
4245 }
4246 else if (flag_code == CODE_64BIT
389d00a5 4247 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
d3d50934
L
4248 && ((i.types[1].bitfield.qword
4249 && i.reg_operands == 1
b6f8c7c4
L
4250 && i.imm_operands == 1
4251 && i.op[0].imms->X_op == O_constant
507916b8 4252 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4253 && i.tm.extension_opcode == None
4254 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4255 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4256 && ((i.tm.base_opcode == 0x24
4257 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4258 || (i.tm.base_opcode == 0x80
4259 && i.tm.extension_opcode == 0x4)
4260 || ((i.tm.base_opcode == 0xf6
507916b8 4261 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4262 && i.tm.extension_opcode == 0x0)))
4263 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4264 && i.tm.base_opcode == 0x83
4265 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4266 || (i.types[0].bitfield.qword
4267 && ((i.reg_operands == 2
4268 && i.op[0].regs == i.op[1].regs
72aea328
JB
4269 && (i.tm.base_opcode == 0x30
4270 || i.tm.base_opcode == 0x28))
d3d50934
L
4271 || (i.reg_operands == 1
4272 && i.operands == 1
72aea328 4273 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4274 {
4275 /* Optimize: -O:
4276 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4277 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4278 testq $imm31, %r64 -> testl $imm31, %r32
4279 xorq %r64, %r64 -> xorl %r32, %r32
4280 subq %r64, %r64 -> subl %r32, %r32
4281 movq $imm31, %r64 -> movl $imm31, %r32
4282 movq $imm32, %r64 -> movl $imm32, %r32
4283 */
4284 i.tm.opcode_modifier.norex64 = 1;
507916b8 4285 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4286 {
4287 /* Handle
4288 movq $imm31, %r64 -> movl $imm31, %r32
4289 movq $imm32, %r64 -> movl $imm32, %r32
4290 */
4291 i.tm.operand_types[0].bitfield.imm32 = 1;
4292 i.tm.operand_types[0].bitfield.imm32s = 0;
4293 i.tm.operand_types[0].bitfield.imm64 = 0;
4294 i.types[0].bitfield.imm32 = 1;
4295 i.types[0].bitfield.imm32s = 0;
4296 i.types[0].bitfield.imm64 = 0;
4297 i.types[1].bitfield.dword = 1;
4298 i.types[1].bitfield.qword = 0;
507916b8 4299 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4300 {
4301 /* Handle
4302 movq $imm31, %r64 -> movl $imm31, %r32
4303 */
507916b8 4304 i.tm.base_opcode = 0xb8;
b6f8c7c4 4305 i.tm.extension_opcode = None;
507916b8 4306 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4307 i.tm.opcode_modifier.modrm = 0;
4308 }
4309 }
4310 }
5641ec01
JB
4311 else if (optimize > 1
4312 && !optimize_for_space
389d00a5 4313 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
5641ec01
JB
4314 && i.reg_operands == 2
4315 && i.op[0].regs == i.op[1].regs
4316 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4317 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4318 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4319 {
4320 /* Optimize: -O2:
4321 andb %rN, %rN -> testb %rN, %rN
4322 andw %rN, %rN -> testw %rN, %rN
4323 andq %rN, %rN -> testq %rN, %rN
4324 orb %rN, %rN -> testb %rN, %rN
4325 orw %rN, %rN -> testw %rN, %rN
4326 orq %rN, %rN -> testq %rN, %rN
4327
4328 and outside of 64-bit mode
4329
4330 andl %rN, %rN -> testl %rN, %rN
4331 orl %rN, %rN -> testl %rN, %rN
4332 */
4333 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4334 }
99112332 4335 else if (i.reg_operands == 3
b6f8c7c4
L
4336 && i.op[0].regs == i.op[1].regs
4337 && !i.types[2].bitfield.xmmword
4338 && (i.tm.opcode_modifier.vex
6225c532 4339 || ((!i.mask.reg || i.mask.zeroing)
ca5312a2 4340 && i.rounding.type == rc_none
e771e7c9 4341 && is_evex_encoding (&i.tm)
80c34c38 4342 && (i.vec_encoding != vex_encoding_evex
dd22218c 4343 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4344 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4345 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4346 && i.types[2].bitfield.ymmword))))
b6f8c7c4 4347 && ((i.tm.base_opcode == 0x55
b6f8c7c4 4348 || i.tm.base_opcode == 0x57
35648716
JB
4349 || i.tm.base_opcode == 0xdf
4350 || i.tm.base_opcode == 0xef
4351 || i.tm.base_opcode == 0xf8
4352 || i.tm.base_opcode == 0xf9
4353 || i.tm.base_opcode == 0xfa
4354 || i.tm.base_opcode == 0xfb
1424ad86 4355 || i.tm.base_opcode == 0x42
35648716 4356 || i.tm.base_opcode == 0x47)
b6f8c7c4
L
4357 && i.tm.extension_opcode == None))
4358 {
99112332 4359 /* Optimize: -O1:
8305403a
L
4360 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4361 vpsubq and vpsubw:
b6f8c7c4
L
4362 EVEX VOP %zmmM, %zmmM, %zmmN
4363 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4364 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4365 EVEX VOP %ymmM, %ymmM, %ymmN
4366 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4367 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4368 VEX VOP %ymmM, %ymmM, %ymmN
4369 -> VEX VOP %xmmM, %xmmM, %xmmN
4370 VOP, one of vpandn and vpxor:
4371 VEX VOP %ymmM, %ymmM, %ymmN
4372 -> VEX VOP %xmmM, %xmmM, %xmmN
4373 VOP, one of vpandnd and vpandnq:
4374 EVEX VOP %zmmM, %zmmM, %zmmN
4375 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4376 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4377 EVEX VOP %ymmM, %ymmM, %ymmN
4378 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4379 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4380 VOP, one of vpxord and vpxorq:
4381 EVEX VOP %zmmM, %zmmM, %zmmN
4382 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4383 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4384 EVEX VOP %ymmM, %ymmM, %ymmN
4385 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4386 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4387 VOP, one of kxord and kxorq:
4388 VEX VOP %kM, %kM, %kN
4389 -> VEX kxorw %kM, %kM, %kN
4390 VOP, one of kandnd and kandnq:
4391 VEX VOP %kM, %kM, %kN
4392 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4393 */
e771e7c9 4394 if (is_evex_encoding (&i.tm))
b6f8c7c4 4395 {
7b1d7ca1 4396 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4397 {
4398 i.tm.opcode_modifier.vex = VEX128;
4399 i.tm.opcode_modifier.vexw = VEXW0;
4400 i.tm.opcode_modifier.evex = 0;
4401 }
7b1d7ca1 4402 else if (optimize > 1)
dd22218c
L
4403 i.tm.opcode_modifier.evex = EVEX128;
4404 else
4405 return;
b6f8c7c4 4406 }
f74a6307 4407 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86 4408 {
35648716 4409 i.tm.opcode_modifier.opcodeprefix = PREFIX_NONE;
1424ad86
JB
4410 i.tm.opcode_modifier.vexw = VEXW0;
4411 }
b6f8c7c4
L
4412 else
4413 i.tm.opcode_modifier.vex = VEX128;
4414
4415 if (i.tm.opcode_modifier.vex)
4416 for (j = 0; j < 3; j++)
4417 {
4418 i.types[j].bitfield.xmmword = 1;
4419 i.types[j].bitfield.ymmword = 0;
4420 }
4421 }
392a5972 4422 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4423 && !i.types[0].bitfield.zmmword
392a5972 4424 && !i.types[1].bitfield.zmmword
6225c532 4425 && !i.mask.reg
5273a3cd 4426 && !i.broadcast.type
97ed31ae 4427 && is_evex_encoding (&i.tm)
35648716
JB
4428 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4429 || (i.tm.base_opcode & ~4) == 0xdb
4430 || (i.tm.base_opcode & ~4) == 0xeb)
97ed31ae
L
4431 && i.tm.extension_opcode == None)
4432 {
4433 /* Optimize: -O1:
4434 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4435 vmovdqu32 and vmovdqu64:
4436 EVEX VOP %xmmM, %xmmN
4437 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4438 EVEX VOP %ymmM, %ymmN
4439 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4440 EVEX VOP %xmmM, mem
4441 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4442 EVEX VOP %ymmM, mem
4443 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4444 EVEX VOP mem, %xmmN
4445 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4446 EVEX VOP mem, %ymmN
4447 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4448 VOP, one of vpand, vpandn, vpor, vpxor:
4449 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4450 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4451 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4452 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4453 EVEX VOP{d,q} mem, %xmmM, %xmmN
4454 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4455 EVEX VOP{d,q} mem, %ymmM, %ymmN
4456 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4457 */
a0a1771e 4458 for (j = 0; j < i.operands; j++)
392a5972
L
4459 if (operand_type_check (i.types[j], disp)
4460 && i.op[j].disps->X_op == O_constant)
4461 {
4462 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4463 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4464 bytes, we choose EVEX Disp8 over VEX Disp32. */
4465 int evex_disp8, vex_disp8;
4466 unsigned int memshift = i.memshift;
4467 offsetT n = i.op[j].disps->X_add_number;
4468
4469 evex_disp8 = fits_in_disp8 (n);
4470 i.memshift = 0;
4471 vex_disp8 = fits_in_disp8 (n);
4472 if (evex_disp8 != vex_disp8)
4473 {
4474 i.memshift = memshift;
4475 return;
4476 }
4477
4478 i.types[j].bitfield.disp8 = vex_disp8;
4479 break;
4480 }
35648716
JB
4481 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4482 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2)
4483 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
97ed31ae
L
4484 i.tm.opcode_modifier.vex
4485 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4486 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7 4487 /* VPAND, VPOR, and VPXOR are commutative. */
35648716 4488 if (i.reg_operands == 3 && i.tm.base_opcode != 0xdf)
79dec6b7 4489 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4490 i.tm.opcode_modifier.evex = 0;
4491 i.tm.opcode_modifier.masking = 0;
a0a1771e 4492 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4493 i.tm.opcode_modifier.disp8memshift = 0;
4494 i.memshift = 0;
a0a1771e
JB
4495 if (j < i.operands)
4496 i.types[j].bitfield.disp8
4497 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4498 }
b6f8c7c4
L
4499}
4500
ae531041
L
4501/* Return non-zero for load instruction. */
4502
4503static int
4504load_insn_p (void)
4505{
4506 unsigned int dest;
4507 int any_vex_p = is_any_vex_encoding (&i.tm);
4508 unsigned int base_opcode = i.tm.base_opcode | 1;
4509
4510 if (!any_vex_p)
4511 {
a09f656b 4512 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4513 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4514 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4515 if (i.tm.opcode_modifier.anysize)
ae531041
L
4516 return 0;
4517
389d00a5
JB
4518 /* pop. */
4519 if (strcmp (i.tm.name, "pop") == 0)
4520 return 1;
4521 }
4522
4523 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
4524 {
4525 /* popf, popa. */
4526 if (i.tm.base_opcode == 0x9d
a09f656b 4527 || i.tm.base_opcode == 0x61)
ae531041
L
4528 return 1;
4529
4530 /* movs, cmps, lods, scas. */
4531 if ((i.tm.base_opcode | 0xb) == 0xaf)
4532 return 1;
4533
a09f656b 4534 /* outs, xlatb. */
4535 if (base_opcode == 0x6f
4536 || i.tm.base_opcode == 0xd7)
ae531041 4537 return 1;
a09f656b 4538 /* NB: For AMD-specific insns with implicit memory operands,
4539 they're intentionally not covered. */
ae531041
L
4540 }
4541
4542 /* No memory operand. */
4543 if (!i.mem_operands)
4544 return 0;
4545
4546 if (any_vex_p)
4547 {
4548 /* vldmxcsr. */
4549 if (i.tm.base_opcode == 0xae
4550 && i.tm.opcode_modifier.vex
441f6aca 4551 && i.tm.opcode_modifier.opcodespace == SPACE_0F
35648716 4552 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
ae531041
L
4553 && i.tm.extension_opcode == 2)
4554 return 1;
4555 }
389d00a5 4556 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
ae531041
L
4557 {
4558 /* test, not, neg, mul, imul, div, idiv. */
4559 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4560 && i.tm.extension_opcode != 1)
4561 return 1;
4562
4563 /* inc, dec. */
4564 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4565 return 1;
4566
4567 /* add, or, adc, sbb, and, sub, xor, cmp. */
4568 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4569 return 1;
4570
ae531041
L
4571 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4572 if ((base_opcode == 0xc1
4573 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4574 && i.tm.extension_opcode != 6)
4575 return 1;
4576
ae531041 4577 /* Check for x87 instructions. */
389d00a5 4578 if (base_opcode >= 0xd8 && base_opcode <= 0xdf)
ae531041
L
4579 {
4580 /* Skip fst, fstp, fstenv, fstcw. */
4581 if (i.tm.base_opcode == 0xd9
4582 && (i.tm.extension_opcode == 2
4583 || i.tm.extension_opcode == 3
4584 || i.tm.extension_opcode == 6
4585 || i.tm.extension_opcode == 7))
4586 return 0;
4587
4588 /* Skip fisttp, fist, fistp, fstp. */
4589 if (i.tm.base_opcode == 0xdb
4590 && (i.tm.extension_opcode == 1
4591 || i.tm.extension_opcode == 2
4592 || i.tm.extension_opcode == 3
4593 || i.tm.extension_opcode == 7))
4594 return 0;
4595
4596 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4597 if (i.tm.base_opcode == 0xdd
4598 && (i.tm.extension_opcode == 1
4599 || i.tm.extension_opcode == 2
4600 || i.tm.extension_opcode == 3
4601 || i.tm.extension_opcode == 6
4602 || i.tm.extension_opcode == 7))
4603 return 0;
4604
4605 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4606 if (i.tm.base_opcode == 0xdf
4607 && (i.tm.extension_opcode == 1
4608 || i.tm.extension_opcode == 2
4609 || i.tm.extension_opcode == 3
4610 || i.tm.extension_opcode == 6
4611 || i.tm.extension_opcode == 7))
4612 return 0;
4613
4614 return 1;
4615 }
4616 }
389d00a5
JB
4617 else if (i.tm.opcode_modifier.opcodespace == SPACE_0F)
4618 {
4619 /* bt, bts, btr, btc. */
4620 if (i.tm.base_opcode == 0xba
4621 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4622 return 1;
4623
4624 /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */
4625 if (i.tm.base_opcode == 0xc7
4626 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
4627 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3
4628 || i.tm.extension_opcode == 6))
4629 return 1;
4630
4631 /* fxrstor, ldmxcsr, xrstor. */
4632 if (i.tm.base_opcode == 0xae
4633 && (i.tm.extension_opcode == 1
4634 || i.tm.extension_opcode == 2
4635 || i.tm.extension_opcode == 5))
4636 return 1;
4637
4638 /* lgdt, lidt, lmsw. */
4639 if (i.tm.base_opcode == 0x01
4640 && (i.tm.extension_opcode == 2
4641 || i.tm.extension_opcode == 3
4642 || i.tm.extension_opcode == 6))
4643 return 1;
4644 }
ae531041
L
4645
4646 dest = i.operands - 1;
4647
4648 /* Check fake imm8 operand and 3 source operands. */
4649 if ((i.tm.opcode_modifier.immext
4650 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4651 && i.types[dest].bitfield.imm8)
4652 dest--;
4653
389d00a5
JB
4654 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */
4655 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
ae531041
L
4656 && (base_opcode == 0x1
4657 || base_opcode == 0x9
4658 || base_opcode == 0x11
4659 || base_opcode == 0x19
4660 || base_opcode == 0x21
4661 || base_opcode == 0x29
4662 || base_opcode == 0x31
4663 || base_opcode == 0x39
389d00a5
JB
4664 || (base_opcode | 2) == 0x87))
4665 return 1;
4666
4667 /* xadd. */
4668 if (i.tm.opcode_modifier.opcodespace == SPACE_0F
4669 && base_opcode == 0xc1)
ae531041
L
4670 return 1;
4671
4672 /* Check for load instruction. */
4673 return (i.types[dest].bitfield.class != ClassNone
4674 || i.types[dest].bitfield.instance == Accum);
4675}
4676
4677/* Output lfence, 0xfaee8, after instruction. */
4678
4679static void
4680insert_lfence_after (void)
4681{
4682 if (lfence_after_load && load_insn_p ())
4683 {
a09f656b 4684 /* There are also two REP string instructions that require
4685 special treatment. Specifically, the compare string (CMPS)
4686 and scan string (SCAS) instructions set EFLAGS in a manner
4687 that depends on the data being compared/scanned. When used
4688 with a REP prefix, the number of iterations may therefore
4689 vary depending on this data. If the data is a program secret
4690 chosen by the adversary using an LVI method,
4691 then this data-dependent behavior may leak some aspect
4692 of the secret. */
4693 if (((i.tm.base_opcode | 0x1) == 0xa7
4694 || (i.tm.base_opcode | 0x1) == 0xaf)
4695 && i.prefix[REP_PREFIX])
4696 {
4697 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4698 i.tm.name);
4699 }
ae531041
L
4700 char *p = frag_more (3);
4701 *p++ = 0xf;
4702 *p++ = 0xae;
4703 *p = 0xe8;
4704 }
4705}
4706
4707/* Output lfence, 0xfaee8, before instruction. */
4708
4709static void
4710insert_lfence_before (void)
4711{
4712 char *p;
4713
389d00a5 4714 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
ae531041
L
4715 return;
4716
4717 if (i.tm.base_opcode == 0xff
4718 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4719 {
4720 /* Insert lfence before indirect branch if needed. */
4721
4722 if (lfence_before_indirect_branch == lfence_branch_none)
4723 return;
4724
4725 if (i.operands != 1)
4726 abort ();
4727
4728 if (i.reg_operands == 1)
4729 {
4730 /* Indirect branch via register. Don't insert lfence with
4731 -mlfence-after-load=yes. */
4732 if (lfence_after_load
4733 || lfence_before_indirect_branch == lfence_branch_memory)
4734 return;
4735 }
4736 else if (i.mem_operands == 1
4737 && lfence_before_indirect_branch != lfence_branch_register)
4738 {
4739 as_warn (_("indirect `%s` with memory operand should be avoided"),
4740 i.tm.name);
4741 return;
4742 }
4743 else
4744 return;
4745
4746 if (last_insn.kind != last_insn_other
4747 && last_insn.seg == now_seg)
4748 {
4749 as_warn_where (last_insn.file, last_insn.line,
4750 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4751 last_insn.name, i.tm.name);
4752 return;
4753 }
4754
4755 p = frag_more (3);
4756 *p++ = 0xf;
4757 *p++ = 0xae;
4758 *p = 0xe8;
4759 return;
4760 }
4761
503648e4 4762 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4763 if (lfence_before_ret != lfence_before_ret_none
4764 && (i.tm.base_opcode == 0xc2
503648e4 4765 || i.tm.base_opcode == 0xc3))
ae531041
L
4766 {
4767 if (last_insn.kind != last_insn_other
4768 && last_insn.seg == now_seg)
4769 {
4770 as_warn_where (last_insn.file, last_insn.line,
4771 _("`%s` skips -mlfence-before-ret on `%s`"),
4772 last_insn.name, i.tm.name);
4773 return;
4774 }
a09f656b 4775
a09f656b 4776 /* Near ret ingore operand size override under CPU64. */
503648e4 4777 char prefix = flag_code == CODE_64BIT
4778 ? 0x48
4779 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4780
4781 if (lfence_before_ret == lfence_before_ret_not)
4782 {
4783 /* not: 0xf71424, may add prefix
4784 for operand size override or 64-bit code. */
4785 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4786 if (prefix)
4787 *p++ = prefix;
ae531041
L
4788 *p++ = 0xf7;
4789 *p++ = 0x14;
4790 *p++ = 0x24;
a09f656b 4791 if (prefix)
4792 *p++ = prefix;
ae531041
L
4793 *p++ = 0xf7;
4794 *p++ = 0x14;
4795 *p++ = 0x24;
4796 }
a09f656b 4797 else
4798 {
4799 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4800 if (prefix)
4801 *p++ = prefix;
4802 if (lfence_before_ret == lfence_before_ret_or)
4803 {
4804 /* or: 0x830c2400, may add prefix
4805 for operand size override or 64-bit code. */
4806 *p++ = 0x83;
4807 *p++ = 0x0c;
4808 }
4809 else
4810 {
4811 /* shl: 0xc1242400, may add prefix
4812 for operand size override or 64-bit code. */
4813 *p++ = 0xc1;
4814 *p++ = 0x24;
4815 }
4816
4817 *p++ = 0x24;
4818 *p++ = 0x0;
4819 }
4820
ae531041
L
4821 *p++ = 0xf;
4822 *p++ = 0xae;
4823 *p = 0xe8;
4824 }
4825}
4826
252b5132
RH
4827/* This is the guts of the machine-dependent assembler. LINE points to a
4828 machine dependent instruction. This function is supposed to emit
4829 the frags/bytes it assembles to. */
4830
4831void
65da13b5 4832md_assemble (char *line)
252b5132 4833{
40fb9820 4834 unsigned int j;
83b16ac6 4835 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4836 const insn_template *t;
252b5132 4837
47926f60 4838 /* Initialize globals. */
252b5132 4839 memset (&i, '\0', sizeof (i));
ca5312a2 4840 i.rounding.type = rc_none;
252b5132 4841 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4842 i.reloc[j] = NO_RELOC;
252b5132
RH
4843 memset (disp_expressions, '\0', sizeof (disp_expressions));
4844 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4845 save_stack_p = save_stack;
252b5132
RH
4846
4847 /* First parse an instruction mnemonic & call i386_operand for the operands.
4848 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4849 start of a (possibly prefixed) mnemonic. */
252b5132 4850
29b0f896
AM
4851 line = parse_insn (line, mnemonic);
4852 if (line == NULL)
4853 return;
83b16ac6 4854 mnem_suffix = i.suffix;
252b5132 4855
29b0f896 4856 line = parse_operands (line, mnemonic);
ee86248c 4857 this_operand = -1;
8325cc63
JB
4858 xfree (i.memop1_string);
4859 i.memop1_string = NULL;
29b0f896
AM
4860 if (line == NULL)
4861 return;
252b5132 4862
29b0f896
AM
4863 /* Now we've parsed the mnemonic into a set of templates, and have the
4864 operands at hand. */
4865
b630c145 4866 /* All Intel opcodes have reversed operands except for "bound", "enter",
c0e54661
JB
4867 "invlpg*", "monitor*", "mwait*", "tpause", "umwait", "pvalidate",
4868 "rmpadjust", and "rmpupdate". We also don't reverse intersegment "jmp"
4869 and "call" instructions with 2 immediate operands so that the immediate
4870 segment precedes the offset consistently in Intel and AT&T modes. */
4d456e3d
L
4871 if (intel_syntax
4872 && i.operands > 1
29b0f896 4873 && (strcmp (mnemonic, "bound") != 0)
c0e54661 4874 && (strncmp (mnemonic, "invlpg", 6) != 0)
d34049e8
ML
4875 && !startswith (mnemonic, "monitor")
4876 && !startswith (mnemonic, "mwait")
c0e54661 4877 && (strcmp (mnemonic, "pvalidate") != 0)
d34049e8 4878 && !startswith (mnemonic, "rmp")
b630c145
JB
4879 && (strcmp (mnemonic, "tpause") != 0)
4880 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4881 && !(operand_type_check (i.types[0], imm)
4882 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4883 swap_operands ();
4884
ec56d5c0
JB
4885 /* The order of the immediates should be reversed
4886 for 2 immediates extrq and insertq instructions */
4887 if (i.imm_operands == 2
4888 && (strcmp (mnemonic, "extrq") == 0
4889 || strcmp (mnemonic, "insertq") == 0))
4890 swap_2_operands (0, 1);
4891
29b0f896
AM
4892 if (i.imm_operands)
4893 optimize_imm ();
4894
a9aabc23 4895 if (i.disp_operands && !want_disp32 (current_templates->start))
cce08655
JB
4896 {
4897 for (j = 0; j < i.operands; ++j)
4898 {
4899 const expressionS *exp = i.op[j].disps;
4900
4901 if (!operand_type_check (i.types[j], disp))
4902 continue;
4903
4904 if (exp->X_op != O_constant)
4905 continue;
4906
4907 /* Since displacement is signed extended to 64bit, don't allow
4908 disp32 and turn off disp32s if they are out of range. */
4909 i.types[j].bitfield.disp32 = 0;
4910 if (fits_in_signed_long (exp->X_add_number))
4911 continue;
4912
4913 i.types[j].bitfield.disp32s = 0;
4914 if (i.types[j].bitfield.baseindex)
4915 {
4916 as_bad (_("0x%" BFD_VMA_FMT "x out of range of signed 32bit displacement"),
4917 exp->X_add_number);
4918 return;
4919 }
4920 }
4921 }
4922
b300c311
L
4923 /* Don't optimize displacement for movabs since it only takes 64bit
4924 displacement. */
4925 if (i.disp_operands
a501d77e 4926 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4927 && (flag_code != CODE_64BIT
4928 || strcmp (mnemonic, "movabs") != 0))
4929 optimize_disp ();
29b0f896
AM
4930
4931 /* Next, we find a template that matches the given insn,
4932 making sure the overlap of the given operands types is consistent
4933 with the template operand types. */
252b5132 4934
83b16ac6 4935 if (!(t = match_template (mnem_suffix)))
29b0f896 4936 return;
252b5132 4937
7bab8ab5 4938 if (sse_check != check_none
81f8a913 4939 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4940 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4941 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4942 && (i.tm.cpu_flags.bitfield.cpusse
4943 || i.tm.cpu_flags.bitfield.cpusse2
4944 || i.tm.cpu_flags.bitfield.cpusse3
4945 || i.tm.cpu_flags.bitfield.cpussse3
4946 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4947 || i.tm.cpu_flags.bitfield.cpusse4_2
4948 || i.tm.cpu_flags.bitfield.cpupclmul
4949 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4950 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4951 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4952 {
7bab8ab5 4953 (sse_check == check_warning
daf50ae7
L
4954 ? as_warn
4955 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4956 }
4957
40fb9820 4958 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4959 if (!add_prefix (FWAIT_OPCODE))
4960 return;
252b5132 4961
d5de92cf 4962 /* Check if REP prefix is OK. */
742732c7 4963 if (i.rep_prefix && i.tm.opcode_modifier.prefixok != PrefixRep)
d5de92cf
L
4964 {
4965 as_bad (_("invalid instruction `%s' after `%s'"),
4966 i.tm.name, i.rep_prefix);
4967 return;
4968 }
4969
c1ba0266
L
4970 /* Check for lock without a lockable instruction. Destination operand
4971 must be memory unless it is xchg (0x86). */
c32fa91d 4972 if (i.prefix[LOCK_PREFIX]
742732c7 4973 && (i.tm.opcode_modifier.prefixok < PrefixLock
c1ba0266
L
4974 || i.mem_operands == 0
4975 || (i.tm.base_opcode != 0x86
8dc0818e 4976 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4977 {
4978 as_bad (_("expecting lockable instruction after `lock'"));
4979 return;
4980 }
4981
40d231b4
JB
4982 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4983 if (i.prefix[DATA_PREFIX]
4984 && (is_any_vex_encoding (&i.tm)
4985 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4986 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4987 {
4988 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4989 return;
4990 }
4991
42164a71 4992 /* Check if HLE prefix is OK. */
165de32a 4993 if (i.hle_prefix && !check_hle ())
42164a71
L
4994 return;
4995
7e8b059b
L
4996 /* Check BND prefix. */
4997 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4998 as_bad (_("expecting valid branch instruction after `bnd'"));
4999
04ef582a 5000 /* Check NOTRACK prefix. */
742732c7 5001 if (i.notrack_prefix && i.tm.opcode_modifier.prefixok != PrefixNoTrack)
9fef80d6 5002 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 5003
327e8c42
JB
5004 if (i.tm.cpu_flags.bitfield.cpumpx)
5005 {
5006 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
5007 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
5008 else if (flag_code != CODE_16BIT
5009 ? i.prefix[ADDR_PREFIX]
5010 : i.mem_operands && !i.prefix[ADDR_PREFIX])
5011 as_bad (_("16-bit address isn't allowed in MPX instructions"));
5012 }
7e8b059b
L
5013
5014 /* Insert BND prefix. */
76d3a78a
JB
5015 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
5016 {
5017 if (!i.prefix[BND_PREFIX])
5018 add_prefix (BND_PREFIX_OPCODE);
5019 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
5020 {
5021 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
5022 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
5023 }
5024 }
7e8b059b 5025
29b0f896 5026 /* Check string instruction segment overrides. */
51c8edf6 5027 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 5028 {
51c8edf6 5029 gas_assert (i.mem_operands);
29b0f896 5030 if (!check_string ())
5dd0794d 5031 return;
fc0763e6 5032 i.disp_operands = 0;
29b0f896 5033 }
5dd0794d 5034
b6f8c7c4
L
5035 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
5036 optimize_encoding ();
5037
29b0f896
AM
5038 if (!process_suffix ())
5039 return;
e413e4e9 5040
921eafea 5041 /* Update operand types and check extended states. */
bc0844ae 5042 for (j = 0; j < i.operands; j++)
921eafea
L
5043 {
5044 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
3d70986f 5045 switch (i.tm.operand_types[j].bitfield.class)
921eafea
L
5046 {
5047 default:
5048 break;
5049 case RegMMX:
5050 i.xstate |= xstate_mmx;
5051 break;
5052 case RegMask:
32930e4e 5053 i.xstate |= xstate_mask;
921eafea
L
5054 break;
5055 case RegSIMD:
3d70986f 5056 if (i.tm.operand_types[j].bitfield.tmmword)
921eafea 5057 i.xstate |= xstate_tmm;
3d70986f 5058 else if (i.tm.operand_types[j].bitfield.zmmword)
921eafea 5059 i.xstate |= xstate_zmm;
3d70986f 5060 else if (i.tm.operand_types[j].bitfield.ymmword)
921eafea 5061 i.xstate |= xstate_ymm;
3d70986f 5062 else if (i.tm.operand_types[j].bitfield.xmmword)
921eafea
L
5063 i.xstate |= xstate_xmm;
5064 break;
5065 }
5066 }
bc0844ae 5067
29b0f896
AM
5068 /* Make still unresolved immediate matches conform to size of immediate
5069 given in i.suffix. */
5070 if (!finalize_imm ())
5071 return;
252b5132 5072
40fb9820 5073 if (i.types[0].bitfield.imm1)
29b0f896 5074 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 5075
9afe6eb8
L
5076 /* We only need to check those implicit registers for instructions
5077 with 3 operands or less. */
5078 if (i.operands <= 3)
5079 for (j = 0; j < i.operands; j++)
75e5731b
JB
5080 if (i.types[j].bitfield.instance != InstanceNone
5081 && !i.types[j].bitfield.xmmword)
9afe6eb8 5082 i.reg_operands--;
40fb9820 5083
29b0f896
AM
5084 /* For insns with operands there are more diddles to do to the opcode. */
5085 if (i.operands)
5086 {
5087 if (!process_operands ())
5088 return;
5089 }
8c190ce0 5090 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
5091 {
5092 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
5093 as_warn (_("translating to `%sp'"), i.tm.name);
5094 }
252b5132 5095
7a8655d2 5096 if (is_any_vex_encoding (&i.tm))
9e5e5283 5097 {
c1dc7af5 5098 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 5099 {
c1dc7af5 5100 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
5101 i.tm.name);
5102 return;
5103 }
c0f3af97 5104
0b9404fd
JB
5105 /* Check for explicit REX prefix. */
5106 if (i.prefix[REX_PREFIX] || i.rex_encoding)
5107 {
5108 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
5109 return;
5110 }
5111
9e5e5283
L
5112 if (i.tm.opcode_modifier.vex)
5113 build_vex_prefix (t);
5114 else
5115 build_evex_prefix ();
0b9404fd
JB
5116
5117 /* The individual REX.RXBW bits got consumed. */
5118 i.rex &= REX_OPCODE;
9e5e5283 5119 }
43234a1e 5120
5dd85c99
SP
5121 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
5122 instructions may define INT_OPCODE as well, so avoid this corner
5123 case for those instructions that use MODRM. */
389d00a5
JB
5124 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
5125 && i.tm.base_opcode == INT_OPCODE
a6461c02
SP
5126 && !i.tm.opcode_modifier.modrm
5127 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
5128 {
5129 i.tm.base_opcode = INT3_OPCODE;
5130 i.imm_operands = 0;
5131 }
252b5132 5132
0cfa3eb3
JB
5133 if ((i.tm.opcode_modifier.jump == JUMP
5134 || i.tm.opcode_modifier.jump == JUMP_BYTE
5135 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
5136 && i.op[0].disps->X_op == O_constant)
5137 {
5138 /* Convert "jmp constant" (and "call constant") to a jump (call) to
5139 the absolute address given by the constant. Since ix86 jumps and
5140 calls are pc relative, we need to generate a reloc. */
5141 i.op[0].disps->X_add_symbol = &abs_symbol;
5142 i.op[0].disps->X_op = O_symbol;
5143 }
252b5132 5144
29b0f896
AM
5145 /* For 8 bit registers we need an empty rex prefix. Also if the
5146 instruction already has a prefix, we need to convert old
5147 registers to new ones. */
773f551c 5148
bab6aec1 5149 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 5150 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 5151 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 5152 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
5153 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
5154 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
5155 && i.rex != 0))
5156 {
5157 int x;
726c5dcd 5158
29b0f896
AM
5159 i.rex |= REX_OPCODE;
5160 for (x = 0; x < 2; x++)
5161 {
5162 /* Look for 8 bit operand that uses old registers. */
bab6aec1 5163 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 5164 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 5165 {
3f93af61 5166 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
5167 /* In case it is "hi" register, give up. */
5168 if (i.op[x].regs->reg_num > 3)
a540244d 5169 as_bad (_("can't encode register '%s%s' in an "
4eed87de 5170 "instruction requiring REX prefix."),
a540244d 5171 register_prefix, i.op[x].regs->reg_name);
773f551c 5172
29b0f896
AM
5173 /* Otherwise it is equivalent to the extended register.
5174 Since the encoding doesn't change this is merely
5175 cosmetic cleanup for debug output. */
5176
5177 i.op[x].regs = i.op[x].regs + 8;
773f551c 5178 }
29b0f896
AM
5179 }
5180 }
773f551c 5181
6b6b6807
L
5182 if (i.rex == 0 && i.rex_encoding)
5183 {
5184 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 5185 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
5186 the REX_OPCODE byte. */
5187 int x;
5188 for (x = 0; x < 2; x++)
bab6aec1 5189 if (i.types[x].bitfield.class == Reg
6b6b6807
L
5190 && i.types[x].bitfield.byte
5191 && (i.op[x].regs->reg_flags & RegRex64) == 0
5192 && i.op[x].regs->reg_num > 3)
5193 {
3f93af61 5194 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
5b7c81bd 5195 i.rex_encoding = false;
6b6b6807
L
5196 break;
5197 }
5198
5199 if (i.rex_encoding)
5200 i.rex = REX_OPCODE;
5201 }
5202
7ab9ffdd 5203 if (i.rex != 0)
29b0f896
AM
5204 add_prefix (REX_OPCODE | i.rex);
5205
ae531041
L
5206 insert_lfence_before ();
5207
29b0f896
AM
5208 /* We are ready to output the insn. */
5209 output_insn ();
e379e5f3 5210
ae531041
L
5211 insert_lfence_after ();
5212
e379e5f3
L
5213 last_insn.seg = now_seg;
5214
5215 if (i.tm.opcode_modifier.isprefix)
5216 {
5217 last_insn.kind = last_insn_prefix;
5218 last_insn.name = i.tm.name;
5219 last_insn.file = as_where (&last_insn.line);
5220 }
5221 else
5222 last_insn.kind = last_insn_other;
29b0f896
AM
5223}
5224
5225static char *
e3bb37b5 5226parse_insn (char *line, char *mnemonic)
29b0f896
AM
5227{
5228 char *l = line;
5229 char *token_start = l;
5230 char *mnem_p;
5c6af06e 5231 int supported;
d3ce72d0 5232 const insn_template *t;
b6169b20 5233 char *dot_p = NULL;
29b0f896 5234
29b0f896
AM
5235 while (1)
5236 {
5237 mnem_p = mnemonic;
5238 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5239 {
b6169b20
L
5240 if (*mnem_p == '.')
5241 dot_p = mnem_p;
29b0f896
AM
5242 mnem_p++;
5243 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5244 {
29b0f896
AM
5245 as_bad (_("no such instruction: `%s'"), token_start);
5246 return NULL;
5247 }
5248 l++;
5249 }
5250 if (!is_space_char (*l)
5251 && *l != END_OF_INSN
e44823cf
JB
5252 && (intel_syntax
5253 || (*l != PREFIX_SEPARATOR
5254 && *l != ',')))
29b0f896
AM
5255 {
5256 as_bad (_("invalid character %s in mnemonic"),
5257 output_invalid (*l));
5258 return NULL;
5259 }
5260 if (token_start == l)
5261 {
e44823cf 5262 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5263 as_bad (_("expecting prefix; got nothing"));
5264 else
5265 as_bad (_("expecting mnemonic; got nothing"));
5266 return NULL;
5267 }
45288df1 5268
29b0f896 5269 /* Look up instruction (or prefix) via hash table. */
629310ab 5270 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
47926f60 5271
29b0f896
AM
5272 if (*l != END_OF_INSN
5273 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5274 && current_templates
40fb9820 5275 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5276 {
c6fb90c8 5277 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5278 {
5279 as_bad ((flag_code != CODE_64BIT
5280 ? _("`%s' is only supported in 64-bit mode")
5281 : _("`%s' is not supported in 64-bit mode")),
5282 current_templates->start->name);
5283 return NULL;
5284 }
29b0f896
AM
5285 /* If we are in 16-bit mode, do not allow addr16 or data16.
5286 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5287 if ((current_templates->start->opcode_modifier.size == SIZE16
5288 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5289 && flag_code != CODE_64BIT
673fe0f0 5290 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5291 ^ (flag_code == CODE_16BIT)))
5292 {
5293 as_bad (_("redundant %s prefix"),
5294 current_templates->start->name);
5295 return NULL;
45288df1 5296 }
31184569
JB
5297
5298 if (current_templates->start->base_opcode == PSEUDO_PREFIX)
29b0f896 5299 {
86fa6981 5300 /* Handle pseudo prefixes. */
31184569 5301 switch (current_templates->start->extension_opcode)
86fa6981 5302 {
41eb8e88 5303 case Prefix_Disp8:
86fa6981
L
5304 /* {disp8} */
5305 i.disp_encoding = disp_encoding_8bit;
5306 break;
41eb8e88
L
5307 case Prefix_Disp16:
5308 /* {disp16} */
5309 i.disp_encoding = disp_encoding_16bit;
5310 break;
5311 case Prefix_Disp32:
86fa6981
L
5312 /* {disp32} */
5313 i.disp_encoding = disp_encoding_32bit;
5314 break;
41eb8e88 5315 case Prefix_Load:
86fa6981
L
5316 /* {load} */
5317 i.dir_encoding = dir_encoding_load;
5318 break;
41eb8e88 5319 case Prefix_Store:
86fa6981
L
5320 /* {store} */
5321 i.dir_encoding = dir_encoding_store;
5322 break;
41eb8e88 5323 case Prefix_VEX:
42e04b36
L
5324 /* {vex} */
5325 i.vec_encoding = vex_encoding_vex;
86fa6981 5326 break;
41eb8e88 5327 case Prefix_VEX3:
86fa6981
L
5328 /* {vex3} */
5329 i.vec_encoding = vex_encoding_vex3;
5330 break;
41eb8e88 5331 case Prefix_EVEX:
86fa6981
L
5332 /* {evex} */
5333 i.vec_encoding = vex_encoding_evex;
5334 break;
41eb8e88 5335 case Prefix_REX:
6b6b6807 5336 /* {rex} */
5b7c81bd 5337 i.rex_encoding = true;
6b6b6807 5338 break;
41eb8e88 5339 case Prefix_NoOptimize:
b6f8c7c4 5340 /* {nooptimize} */
5b7c81bd 5341 i.no_optimize = true;
b6f8c7c4 5342 break;
86fa6981
L
5343 default:
5344 abort ();
5345 }
5346 }
5347 else
5348 {
5349 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5350 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5351 {
4e9ac44a
L
5352 case PREFIX_EXIST:
5353 return NULL;
5354 case PREFIX_DS:
d777820b 5355 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5356 i.notrack_prefix = current_templates->start->name;
5357 break;
5358 case PREFIX_REP:
5359 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5360 i.hle_prefix = current_templates->start->name;
5361 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5362 i.bnd_prefix = current_templates->start->name;
5363 else
5364 i.rep_prefix = current_templates->start->name;
5365 break;
5366 default:
5367 break;
86fa6981 5368 }
29b0f896
AM
5369 }
5370 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5371 token_start = ++l;
5372 }
5373 else
5374 break;
5375 }
45288df1 5376
30a55f88 5377 if (!current_templates)
b6169b20 5378 {
07d5e953
JB
5379 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5380 Check if we should swap operand or force 32bit displacement in
f8a5c266 5381 encoding. */
30a55f88 5382 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5383 i.dir_encoding = dir_encoding_swap;
8d63c93e 5384 else if (mnem_p - 3 == dot_p
a501d77e
L
5385 && dot_p[1] == 'd'
5386 && dot_p[2] == '8')
5387 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5388 else if (mnem_p - 4 == dot_p
f8a5c266
L
5389 && dot_p[1] == 'd'
5390 && dot_p[2] == '3'
5391 && dot_p[3] == '2')
a501d77e 5392 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5393 else
5394 goto check_suffix;
5395 mnem_p = dot_p;
5396 *dot_p = '\0';
629310ab 5397 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
b6169b20
L
5398 }
5399
29b0f896
AM
5400 if (!current_templates)
5401 {
dc1e8a47 5402 check_suffix:
1c529385 5403 if (mnem_p > mnemonic)
29b0f896 5404 {
1c529385
LH
5405 /* See if we can get a match by trimming off a suffix. */
5406 switch (mnem_p[-1])
29b0f896 5407 {
1c529385
LH
5408 case WORD_MNEM_SUFFIX:
5409 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5410 i.suffix = SHORT_MNEM_SUFFIX;
5411 else
1c529385
LH
5412 /* Fall through. */
5413 case BYTE_MNEM_SUFFIX:
5414 case QWORD_MNEM_SUFFIX:
5415 i.suffix = mnem_p[-1];
29b0f896 5416 mnem_p[-1] = '\0';
fe0e921f
AM
5417 current_templates
5418 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5419 break;
5420 case SHORT_MNEM_SUFFIX:
5421 case LONG_MNEM_SUFFIX:
5422 if (!intel_syntax)
5423 {
5424 i.suffix = mnem_p[-1];
5425 mnem_p[-1] = '\0';
fe0e921f
AM
5426 current_templates
5427 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5428 }
5429 break;
5430
5431 /* Intel Syntax. */
5432 case 'd':
5433 if (intel_syntax)
5434 {
5435 if (intel_float_operand (mnemonic) == 1)
5436 i.suffix = SHORT_MNEM_SUFFIX;
5437 else
5438 i.suffix = LONG_MNEM_SUFFIX;
5439 mnem_p[-1] = '\0';
fe0e921f
AM
5440 current_templates
5441 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5442 }
5443 break;
29b0f896 5444 }
29b0f896 5445 }
1c529385 5446
29b0f896
AM
5447 if (!current_templates)
5448 {
5449 as_bad (_("no such instruction: `%s'"), token_start);
5450 return NULL;
5451 }
5452 }
252b5132 5453
0cfa3eb3
JB
5454 if (current_templates->start->opcode_modifier.jump == JUMP
5455 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5456 {
5457 /* Check for a branch hint. We allow ",pt" and ",pn" for
5458 predict taken and predict not taken respectively.
5459 I'm not sure that branch hints actually do anything on loop
5460 and jcxz insns (JumpByte) for current Pentium4 chips. They
5461 may work in the future and it doesn't hurt to accept them
5462 now. */
5463 if (l[0] == ',' && l[1] == 'p')
5464 {
5465 if (l[2] == 't')
5466 {
5467 if (!add_prefix (DS_PREFIX_OPCODE))
5468 return NULL;
5469 l += 3;
5470 }
5471 else if (l[2] == 'n')
5472 {
5473 if (!add_prefix (CS_PREFIX_OPCODE))
5474 return NULL;
5475 l += 3;
5476 }
5477 }
5478 }
5479 /* Any other comma loses. */
5480 if (*l == ',')
5481 {
5482 as_bad (_("invalid character %s in mnemonic"),
5483 output_invalid (*l));
5484 return NULL;
5485 }
252b5132 5486
29b0f896 5487 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5488 supported = 0;
5489 for (t = current_templates->start; t < current_templates->end; ++t)
5490 {
c0f3af97
L
5491 supported |= cpu_flags_match (t);
5492 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5493 {
5494 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5495 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5496
548d0ee6
JB
5497 return l;
5498 }
29b0f896 5499 }
3629bb00 5500
548d0ee6
JB
5501 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5502 as_bad (flag_code == CODE_64BIT
5503 ? _("`%s' is not supported in 64-bit mode")
5504 : _("`%s' is only supported in 64-bit mode"),
5505 current_templates->start->name);
5506 else
5507 as_bad (_("`%s' is not supported on `%s%s'"),
5508 current_templates->start->name,
5509 cpu_arch_name ? cpu_arch_name : default_arch,
5510 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5511
548d0ee6 5512 return NULL;
29b0f896 5513}
252b5132 5514
29b0f896 5515static char *
e3bb37b5 5516parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5517{
5518 char *token_start;
3138f287 5519
29b0f896
AM
5520 /* 1 if operand is pending after ','. */
5521 unsigned int expecting_operand = 0;
252b5132 5522
29b0f896
AM
5523 /* Non-zero if operand parens not balanced. */
5524 unsigned int paren_not_balanced;
5525
5526 while (*l != END_OF_INSN)
5527 {
5528 /* Skip optional white space before operand. */
5529 if (is_space_char (*l))
5530 ++l;
d02603dc 5531 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5532 {
5533 as_bad (_("invalid character %s before operand %d"),
5534 output_invalid (*l),
5535 i.operands + 1);
5536 return NULL;
5537 }
d02603dc 5538 token_start = l; /* After white space. */
29b0f896
AM
5539 paren_not_balanced = 0;
5540 while (paren_not_balanced || *l != ',')
5541 {
5542 if (*l == END_OF_INSN)
5543 {
5544 if (paren_not_balanced)
5545 {
5546 if (!intel_syntax)
5547 as_bad (_("unbalanced parenthesis in operand %d."),
5548 i.operands + 1);
5549 else
5550 as_bad (_("unbalanced brackets in operand %d."),
5551 i.operands + 1);
5552 return NULL;
5553 }
5554 else
5555 break; /* we are done */
5556 }
d02603dc 5557 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5558 {
5559 as_bad (_("invalid character %s in operand %d"),
5560 output_invalid (*l),
5561 i.operands + 1);
5562 return NULL;
5563 }
5564 if (!intel_syntax)
5565 {
5566 if (*l == '(')
5567 ++paren_not_balanced;
5568 if (*l == ')')
5569 --paren_not_balanced;
5570 }
5571 else
5572 {
5573 if (*l == '[')
5574 ++paren_not_balanced;
5575 if (*l == ']')
5576 --paren_not_balanced;
5577 }
5578 l++;
5579 }
5580 if (l != token_start)
5581 { /* Yes, we've read in another operand. */
5582 unsigned int operand_ok;
5583 this_operand = i.operands++;
5584 if (i.operands > MAX_OPERANDS)
5585 {
5586 as_bad (_("spurious operands; (%d operands/instruction max)"),
5587 MAX_OPERANDS);
5588 return NULL;
5589 }
9d46ce34 5590 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5591 /* Now parse operand adding info to 'i' as we go along. */
5592 END_STRING_AND_SAVE (l);
5593
1286ab78
L
5594 if (i.mem_operands > 1)
5595 {
5596 as_bad (_("too many memory references for `%s'"),
5597 mnemonic);
5598 return 0;
5599 }
5600
29b0f896
AM
5601 if (intel_syntax)
5602 operand_ok =
5603 i386_intel_operand (token_start,
5604 intel_float_operand (mnemonic));
5605 else
a7619375 5606 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5607
5608 RESTORE_END_STRING (l);
5609 if (!operand_ok)
5610 return NULL;
5611 }
5612 else
5613 {
5614 if (expecting_operand)
5615 {
5616 expecting_operand_after_comma:
5617 as_bad (_("expecting operand after ','; got nothing"));
5618 return NULL;
5619 }
5620 if (*l == ',')
5621 {
5622 as_bad (_("expecting operand before ','; got nothing"));
5623 return NULL;
5624 }
5625 }
7f3f1ea2 5626
29b0f896
AM
5627 /* Now *l must be either ',' or END_OF_INSN. */
5628 if (*l == ',')
5629 {
5630 if (*++l == END_OF_INSN)
5631 {
5632 /* Just skip it, if it's \n complain. */
5633 goto expecting_operand_after_comma;
5634 }
5635 expecting_operand = 1;
5636 }
5637 }
5638 return l;
5639}
7f3f1ea2 5640
050dfa73 5641static void
783c187b 5642swap_2_operands (unsigned int xchg1, unsigned int xchg2)
050dfa73
MM
5643{
5644 union i386_op temp_op;
40fb9820 5645 i386_operand_type temp_type;
c48dadc9 5646 unsigned int temp_flags;
050dfa73 5647 enum bfd_reloc_code_real temp_reloc;
4eed87de 5648
050dfa73
MM
5649 temp_type = i.types[xchg2];
5650 i.types[xchg2] = i.types[xchg1];
5651 i.types[xchg1] = temp_type;
c48dadc9
JB
5652
5653 temp_flags = i.flags[xchg2];
5654 i.flags[xchg2] = i.flags[xchg1];
5655 i.flags[xchg1] = temp_flags;
5656
050dfa73
MM
5657 temp_op = i.op[xchg2];
5658 i.op[xchg2] = i.op[xchg1];
5659 i.op[xchg1] = temp_op;
c48dadc9 5660
050dfa73
MM
5661 temp_reloc = i.reloc[xchg2];
5662 i.reloc[xchg2] = i.reloc[xchg1];
5663 i.reloc[xchg1] = temp_reloc;
43234a1e 5664
6225c532 5665 if (i.mask.reg)
43234a1e 5666 {
6225c532
JB
5667 if (i.mask.operand == xchg1)
5668 i.mask.operand = xchg2;
5669 else if (i.mask.operand == xchg2)
5670 i.mask.operand = xchg1;
43234a1e 5671 }
5273a3cd 5672 if (i.broadcast.type)
43234a1e 5673 {
5273a3cd
JB
5674 if (i.broadcast.operand == xchg1)
5675 i.broadcast.operand = xchg2;
5676 else if (i.broadcast.operand == xchg2)
5677 i.broadcast.operand = xchg1;
43234a1e 5678 }
ca5312a2 5679 if (i.rounding.type != rc_none)
43234a1e 5680 {
ca5312a2
JB
5681 if (i.rounding.operand == xchg1)
5682 i.rounding.operand = xchg2;
5683 else if (i.rounding.operand == xchg2)
5684 i.rounding.operand = xchg1;
43234a1e 5685 }
050dfa73
MM
5686}
5687
29b0f896 5688static void
e3bb37b5 5689swap_operands (void)
29b0f896 5690{
b7c61d9a 5691 switch (i.operands)
050dfa73 5692 {
c0f3af97 5693 case 5:
b7c61d9a 5694 case 4:
4d456e3d 5695 swap_2_operands (1, i.operands - 2);
1a0670f3 5696 /* Fall through. */
b7c61d9a
L
5697 case 3:
5698 case 2:
4d456e3d 5699 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5700 break;
5701 default:
5702 abort ();
29b0f896 5703 }
29b0f896
AM
5704
5705 if (i.mem_operands == 2)
5706 {
5e042380 5707 const reg_entry *temp_seg;
29b0f896
AM
5708 temp_seg = i.seg[0];
5709 i.seg[0] = i.seg[1];
5710 i.seg[1] = temp_seg;
5711 }
5712}
252b5132 5713
29b0f896
AM
5714/* Try to ensure constant immediates are represented in the smallest
5715 opcode possible. */
5716static void
e3bb37b5 5717optimize_imm (void)
29b0f896
AM
5718{
5719 char guess_suffix = 0;
5720 int op;
252b5132 5721
29b0f896
AM
5722 if (i.suffix)
5723 guess_suffix = i.suffix;
5724 else if (i.reg_operands)
5725 {
5726 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5727 We can't do this properly yet, i.e. excluding special register
5728 instances, but the following works for instructions with
5729 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5730 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5731 if (i.types[op].bitfield.class != Reg)
5732 continue;
5733 else if (i.types[op].bitfield.byte)
7ab9ffdd 5734 {
40fb9820
L
5735 guess_suffix = BYTE_MNEM_SUFFIX;
5736 break;
5737 }
bab6aec1 5738 else if (i.types[op].bitfield.word)
252b5132 5739 {
40fb9820
L
5740 guess_suffix = WORD_MNEM_SUFFIX;
5741 break;
5742 }
bab6aec1 5743 else if (i.types[op].bitfield.dword)
40fb9820
L
5744 {
5745 guess_suffix = LONG_MNEM_SUFFIX;
5746 break;
5747 }
bab6aec1 5748 else if (i.types[op].bitfield.qword)
40fb9820
L
5749 {
5750 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5751 break;
252b5132 5752 }
29b0f896
AM
5753 }
5754 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5755 guess_suffix = WORD_MNEM_SUFFIX;
5756
5757 for (op = i.operands; --op >= 0;)
40fb9820 5758 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5759 {
5760 switch (i.op[op].imms->X_op)
252b5132 5761 {
29b0f896
AM
5762 case O_constant:
5763 /* If a suffix is given, this operand may be shortened. */
5764 switch (guess_suffix)
252b5132 5765 {
29b0f896 5766 case LONG_MNEM_SUFFIX:
40fb9820
L
5767 i.types[op].bitfield.imm32 = 1;
5768 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5769 break;
5770 case WORD_MNEM_SUFFIX:
40fb9820
L
5771 i.types[op].bitfield.imm16 = 1;
5772 i.types[op].bitfield.imm32 = 1;
5773 i.types[op].bitfield.imm32s = 1;
5774 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5775 break;
5776 case BYTE_MNEM_SUFFIX:
40fb9820
L
5777 i.types[op].bitfield.imm8 = 1;
5778 i.types[op].bitfield.imm8s = 1;
5779 i.types[op].bitfield.imm16 = 1;
5780 i.types[op].bitfield.imm32 = 1;
5781 i.types[op].bitfield.imm32s = 1;
5782 i.types[op].bitfield.imm64 = 1;
29b0f896 5783 break;
252b5132 5784 }
252b5132 5785
29b0f896
AM
5786 /* If this operand is at most 16 bits, convert it
5787 to a signed 16 bit number before trying to see
5788 whether it will fit in an even smaller size.
5789 This allows a 16-bit operand such as $0xffe0 to
5790 be recognised as within Imm8S range. */
40fb9820 5791 if ((i.types[op].bitfield.imm16)
29b0f896 5792 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5793 {
29b0f896
AM
5794 i.op[op].imms->X_add_number =
5795 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5796 }
a28def75
L
5797#ifdef BFD64
5798 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5799 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5800 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5801 == 0))
5802 {
5803 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5804 ^ ((offsetT) 1 << 31))
5805 - ((offsetT) 1 << 31));
5806 }
a28def75 5807#endif
40fb9820 5808 i.types[op]
c6fb90c8
L
5809 = operand_type_or (i.types[op],
5810 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5811
29b0f896
AM
5812 /* We must avoid matching of Imm32 templates when 64bit
5813 only immediate is available. */
5814 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5815 i.types[op].bitfield.imm32 = 0;
29b0f896 5816 break;
252b5132 5817
29b0f896
AM
5818 case O_absent:
5819 case O_register:
5820 abort ();
5821
5822 /* Symbols and expressions. */
5823 default:
9cd96992
JB
5824 /* Convert symbolic operand to proper sizes for matching, but don't
5825 prevent matching a set of insns that only supports sizes other
5826 than those matching the insn suffix. */
5827 {
40fb9820 5828 i386_operand_type mask, allowed;
d3ce72d0 5829 const insn_template *t;
9cd96992 5830
0dfbf9d7
L
5831 operand_type_set (&mask, 0);
5832 operand_type_set (&allowed, 0);
40fb9820 5833
4eed87de
AM
5834 for (t = current_templates->start;
5835 t < current_templates->end;
5836 ++t)
bab6aec1
JB
5837 {
5838 allowed = operand_type_or (allowed, t->operand_types[op]);
5839 allowed = operand_type_and (allowed, anyimm);
5840 }
9cd96992
JB
5841 switch (guess_suffix)
5842 {
5843 case QWORD_MNEM_SUFFIX:
40fb9820
L
5844 mask.bitfield.imm64 = 1;
5845 mask.bitfield.imm32s = 1;
9cd96992
JB
5846 break;
5847 case LONG_MNEM_SUFFIX:
40fb9820 5848 mask.bitfield.imm32 = 1;
9cd96992
JB
5849 break;
5850 case WORD_MNEM_SUFFIX:
40fb9820 5851 mask.bitfield.imm16 = 1;
9cd96992
JB
5852 break;
5853 case BYTE_MNEM_SUFFIX:
40fb9820 5854 mask.bitfield.imm8 = 1;
9cd96992
JB
5855 break;
5856 default:
9cd96992
JB
5857 break;
5858 }
c6fb90c8 5859 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5860 if (!operand_type_all_zero (&allowed))
c6fb90c8 5861 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5862 }
29b0f896 5863 break;
252b5132 5864 }
29b0f896
AM
5865 }
5866}
47926f60 5867
29b0f896
AM
5868/* Try to use the smallest displacement type too. */
5869static void
e3bb37b5 5870optimize_disp (void)
29b0f896
AM
5871{
5872 int op;
3e73aa7c 5873
29b0f896 5874 for (op = i.operands; --op >= 0;)
40fb9820 5875 if (operand_type_check (i.types[op], disp))
252b5132 5876 {
b300c311 5877 if (i.op[op].disps->X_op == O_constant)
252b5132 5878 {
91d6fa6a 5879 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5880
40fb9820 5881 if (i.types[op].bitfield.disp16
91d6fa6a 5882 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5883 {
5884 /* If this operand is at most 16 bits, convert
5885 to a signed 16 bit number and don't use 64bit
5886 displacement. */
91d6fa6a 5887 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5888 i.types[op].bitfield.disp64 = 0;
b300c311 5889 }
91d6fa6a 5890 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5891 {
40fb9820
L
5892 i.types[op].bitfield.disp8 = 0;
5893 i.types[op].bitfield.disp16 = 0;
5894 i.types[op].bitfield.disp32 = 0;
5895 i.types[op].bitfield.disp32s = 0;
5896 i.types[op].bitfield.disp64 = 0;
b300c311
L
5897 i.op[op].disps = 0;
5898 i.disp_operands--;
5899 }
28a167a4 5900#ifdef BFD64
b300c311
L
5901 else if (flag_code == CODE_64BIT)
5902 {
a9aabc23 5903 if (want_disp32 (current_templates->start)
28a167a4
JB
5904 && fits_in_unsigned_long (op_disp))
5905 i.types[op].bitfield.disp32 = 1;
5906
5907 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
5908 if (i.types[op].bitfield.disp32
5909 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
5910 {
5911 /* If this operand is at most 32 bits, convert
5912 to a signed 32 bit number and don't use 64bit
5913 displacement. */
5914 op_disp &= (((offsetT) 2 << 31) - 1);
5915 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
5916 i.types[op].bitfield.disp64 = 0;
5917 }
5918
91d6fa6a 5919 if (fits_in_signed_long (op_disp))
28a9d8f5 5920 {
40fb9820
L
5921 i.types[op].bitfield.disp64 = 0;
5922 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5923 }
b300c311 5924 }
28a167a4 5925#endif
40fb9820
L
5926 if ((i.types[op].bitfield.disp32
5927 || i.types[op].bitfield.disp32s
5928 || i.types[op].bitfield.disp16)
b5014f7a 5929 && fits_in_disp8 (op_disp))
40fb9820 5930 i.types[op].bitfield.disp8 = 1;
252b5132 5931 }
67a4f2b7
AO
5932 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5933 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5934 {
5935 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5936 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5937 i.types[op].bitfield.disp8 = 0;
5938 i.types[op].bitfield.disp16 = 0;
5939 i.types[op].bitfield.disp32 = 0;
5940 i.types[op].bitfield.disp32s = 0;
5941 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5942 }
5943 else
b300c311 5944 /* We only support 64bit displacement on constants. */
40fb9820 5945 i.types[op].bitfield.disp64 = 0;
252b5132 5946 }
29b0f896
AM
5947}
5948
4a1b91ea
L
5949/* Return 1 if there is a match in broadcast bytes between operand
5950 GIVEN and instruction template T. */
5951
5952static INLINE int
5953match_broadcast_size (const insn_template *t, unsigned int given)
5954{
5955 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5956 && i.types[given].bitfield.byte)
5957 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5958 && i.types[given].bitfield.word)
5959 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5960 && i.types[given].bitfield.dword)
5961 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5962 && i.types[given].bitfield.qword));
5963}
5964
6c30d220
L
5965/* Check if operands are valid for the instruction. */
5966
5967static int
5968check_VecOperands (const insn_template *t)
5969{
43234a1e 5970 unsigned int op;
e2195274 5971 i386_cpu_flags cpu;
e2195274
JB
5972
5973 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5974 any one operand are implicity requiring AVX512VL support if the actual
5975 operand size is YMMword or XMMword. Since this function runs after
5976 template matching, there's no need to check for YMMword/XMMword in
5977 the template. */
5978 cpu = cpu_flags_and (t->cpu_flags, avx512);
5979 if (!cpu_flags_all_zero (&cpu)
5980 && !t->cpu_flags.bitfield.cpuavx512vl
5981 && !cpu_arch_flags.bitfield.cpuavx512vl)
5982 {
5983 for (op = 0; op < t->operands; ++op)
5984 {
5985 if (t->operand_types[op].bitfield.zmmword
5986 && (i.types[op].bitfield.ymmword
5987 || i.types[op].bitfield.xmmword))
5988 {
5989 i.error = unsupported;
5990 return 1;
5991 }
5992 }
5993 }
43234a1e 5994
6c30d220 5995 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 5996 if (!t->opcode_modifier.sib
6c30d220 5997 && i.index_reg
1b54b8d7
JB
5998 && (i.index_reg->reg_type.bitfield.xmmword
5999 || i.index_reg->reg_type.bitfield.ymmword
6000 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
6001 {
6002 i.error = unsupported_vector_index_register;
6003 return 1;
6004 }
6005
ad8ecc81
MZ
6006 /* Check if default mask is allowed. */
6007 if (t->opcode_modifier.nodefmask
6225c532 6008 && (!i.mask.reg || i.mask.reg->reg_num == 0))
ad8ecc81
MZ
6009 {
6010 i.error = no_default_mask;
6011 return 1;
6012 }
6013
7bab8ab5
JB
6014 /* For VSIB byte, we need a vector register for index, and all vector
6015 registers must be distinct. */
260cd341 6016 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
6017 {
6018 if (!i.index_reg
63112cd6 6019 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 6020 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 6021 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 6022 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 6023 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 6024 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
6025 {
6026 i.error = invalid_vsib_address;
6027 return 1;
6028 }
6029
6225c532
JB
6030 gas_assert (i.reg_operands == 2 || i.mask.reg);
6031 if (i.reg_operands == 2 && !i.mask.reg)
43234a1e 6032 {
3528c362 6033 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
6034 gas_assert (i.types[0].bitfield.xmmword
6035 || i.types[0].bitfield.ymmword);
3528c362 6036 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
6037 gas_assert (i.types[2].bitfield.xmmword
6038 || i.types[2].bitfield.ymmword);
43234a1e
L
6039 if (operand_check == check_none)
6040 return 0;
6041 if (register_number (i.op[0].regs)
6042 != register_number (i.index_reg)
6043 && register_number (i.op[2].regs)
6044 != register_number (i.index_reg)
6045 && register_number (i.op[0].regs)
6046 != register_number (i.op[2].regs))
6047 return 0;
6048 if (operand_check == check_error)
6049 {
6050 i.error = invalid_vector_register_set;
6051 return 1;
6052 }
6053 as_warn (_("mask, index, and destination registers should be distinct"));
6054 }
6225c532 6055 else if (i.reg_operands == 1 && i.mask.reg)
8444f82a 6056 {
3528c362 6057 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
6058 && (i.types[1].bitfield.xmmword
6059 || i.types[1].bitfield.ymmword
6060 || i.types[1].bitfield.zmmword)
8444f82a
MZ
6061 && (register_number (i.op[1].regs)
6062 == register_number (i.index_reg)))
6063 {
6064 if (operand_check == check_error)
6065 {
6066 i.error = invalid_vector_register_set;
6067 return 1;
6068 }
6069 if (operand_check != check_none)
6070 as_warn (_("index and destination registers should be distinct"));
6071 }
6072 }
43234a1e 6073 }
7bab8ab5 6074
260cd341
LC
6075 /* For AMX instructions with three tmmword operands, all tmmword operand must be
6076 distinct */
6077 if (t->operand_types[0].bitfield.tmmword
6078 && i.reg_operands == 3)
6079 {
6080 if (register_number (i.op[0].regs)
6081 == register_number (i.op[1].regs)
6082 || register_number (i.op[0].regs)
6083 == register_number (i.op[2].regs)
6084 || register_number (i.op[1].regs)
6085 == register_number (i.op[2].regs))
6086 {
6087 i.error = invalid_tmm_register_set;
6088 return 1;
6089 }
6090 }
6091
43234a1e
L
6092 /* Check if broadcast is supported by the instruction and is applied
6093 to the memory operand. */
5273a3cd 6094 if (i.broadcast.type)
43234a1e 6095 {
8e6e0792 6096 i386_operand_type type, overlap;
43234a1e
L
6097
6098 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 6099 and its broadcast bytes match the memory operand. */
5273a3cd 6100 op = i.broadcast.operand;
8e6e0792 6101 if (!t->opcode_modifier.broadcast
c48dadc9 6102 || !(i.flags[op] & Operand_Mem)
c39e5b26 6103 || (!i.types[op].bitfield.unspecified
4a1b91ea 6104 && !match_broadcast_size (t, op)))
43234a1e
L
6105 {
6106 bad_broadcast:
6107 i.error = unsupported_broadcast;
6108 return 1;
6109 }
8e6e0792 6110
5273a3cd
JB
6111 i.broadcast.bytes = ((1 << (t->opcode_modifier.broadcast - 1))
6112 * i.broadcast.type);
8e6e0792 6113 operand_type_set (&type, 0);
5273a3cd 6114 switch (i.broadcast.bytes)
8e6e0792 6115 {
4a1b91ea
L
6116 case 2:
6117 type.bitfield.word = 1;
6118 break;
6119 case 4:
6120 type.bitfield.dword = 1;
6121 break;
8e6e0792
JB
6122 case 8:
6123 type.bitfield.qword = 1;
6124 break;
6125 case 16:
6126 type.bitfield.xmmword = 1;
6127 break;
6128 case 32:
6129 type.bitfield.ymmword = 1;
6130 break;
6131 case 64:
6132 type.bitfield.zmmword = 1;
6133 break;
6134 default:
6135 goto bad_broadcast;
6136 }
6137
6138 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
6139 if (t->operand_types[op].bitfield.class == RegSIMD
6140 && t->operand_types[op].bitfield.byte
6141 + t->operand_types[op].bitfield.word
6142 + t->operand_types[op].bitfield.dword
6143 + t->operand_types[op].bitfield.qword > 1)
6144 {
6145 overlap.bitfield.xmmword = 0;
6146 overlap.bitfield.ymmword = 0;
6147 overlap.bitfield.zmmword = 0;
6148 }
8e6e0792
JB
6149 if (operand_type_all_zero (&overlap))
6150 goto bad_broadcast;
6151
6152 if (t->opcode_modifier.checkregsize)
6153 {
6154 unsigned int j;
6155
e2195274 6156 type.bitfield.baseindex = 1;
8e6e0792
JB
6157 for (j = 0; j < i.operands; ++j)
6158 {
6159 if (j != op
6160 && !operand_type_register_match(i.types[j],
6161 t->operand_types[j],
6162 type,
6163 t->operand_types[op]))
6164 goto bad_broadcast;
6165 }
6166 }
43234a1e
L
6167 }
6168 /* If broadcast is supported in this instruction, we need to check if
6169 operand of one-element size isn't specified without broadcast. */
6170 else if (t->opcode_modifier.broadcast && i.mem_operands)
6171 {
6172 /* Find memory operand. */
6173 for (op = 0; op < i.operands; op++)
8dc0818e 6174 if (i.flags[op] & Operand_Mem)
43234a1e
L
6175 break;
6176 gas_assert (op < i.operands);
6177 /* Check size of the memory operand. */
4a1b91ea 6178 if (match_broadcast_size (t, op))
43234a1e
L
6179 {
6180 i.error = broadcast_needed;
6181 return 1;
6182 }
6183 }
c39e5b26
JB
6184 else
6185 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
6186
6187 /* Check if requested masking is supported. */
6225c532 6188 if (i.mask.reg)
43234a1e 6189 {
ae2387fe
JB
6190 switch (t->opcode_modifier.masking)
6191 {
6192 case BOTH_MASKING:
6193 break;
6194 case MERGING_MASKING:
6225c532 6195 if (i.mask.zeroing)
ae2387fe
JB
6196 {
6197 case 0:
6198 i.error = unsupported_masking;
6199 return 1;
6200 }
6201 break;
6202 case DYNAMIC_MASKING:
6203 /* Memory destinations allow only merging masking. */
6225c532 6204 if (i.mask.zeroing && i.mem_operands)
ae2387fe
JB
6205 {
6206 /* Find memory operand. */
6207 for (op = 0; op < i.operands; op++)
c48dadc9 6208 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6209 break;
6210 gas_assert (op < i.operands);
6211 if (op == i.operands - 1)
6212 {
6213 i.error = unsupported_masking;
6214 return 1;
6215 }
6216 }
6217 break;
6218 default:
6219 abort ();
6220 }
43234a1e
L
6221 }
6222
6223 /* Check if masking is applied to dest operand. */
6225c532 6224 if (i.mask.reg && (i.mask.operand != i.operands - 1))
43234a1e
L
6225 {
6226 i.error = mask_not_on_destination;
6227 return 1;
6228 }
6229
43234a1e 6230 /* Check RC/SAE. */
ca5312a2 6231 if (i.rounding.type != rc_none)
43234a1e 6232 {
a80195f1 6233 if (!t->opcode_modifier.sae
ca5312a2 6234 || (i.rounding.type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6235 {
6236 i.error = unsupported_rc_sae;
6237 return 1;
6238 }
6239 /* If the instruction has several immediate operands and one of
6240 them is rounding, the rounding operand should be the last
6241 immediate operand. */
6242 if (i.imm_operands > 1
ca5312a2 6243 && i.rounding.operand != i.imm_operands - 1)
7bab8ab5 6244 {
43234a1e 6245 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6246 return 1;
6247 }
6c30d220
L
6248 }
6249
da4977e0
JB
6250 /* Check the special Imm4 cases; must be the first operand. */
6251 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6252 {
6253 if (i.op[0].imms->X_op != O_constant
6254 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6255 {
6256 i.error = bad_imm4;
6257 return 1;
6258 }
6259
6260 /* Turn off Imm<N> so that update_imm won't complain. */
6261 operand_type_set (&i.types[0], 0);
6262 }
6263
43234a1e 6264 /* Check vector Disp8 operand. */
b5014f7a
JB
6265 if (t->opcode_modifier.disp8memshift
6266 && i.disp_encoding != disp_encoding_32bit)
43234a1e 6267 {
5273a3cd 6268 if (i.broadcast.type)
4a1b91ea 6269 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6270 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6271 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6272 else
6273 {
6274 const i386_operand_type *type = NULL;
6275
6276 i.memshift = 0;
6277 for (op = 0; op < i.operands; op++)
8dc0818e 6278 if (i.flags[op] & Operand_Mem)
7091c612 6279 {
4174bfff
JB
6280 if (t->opcode_modifier.evex == EVEXLIG)
6281 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6282 else if (t->operand_types[op].bitfield.xmmword
6283 + t->operand_types[op].bitfield.ymmword
6284 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6285 type = &t->operand_types[op];
6286 else if (!i.types[op].bitfield.unspecified)
6287 type = &i.types[op];
6288 }
3528c362 6289 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6290 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6291 {
6292 if (i.types[op].bitfield.zmmword)
6293 i.memshift = 6;
6294 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6295 i.memshift = 5;
6296 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6297 i.memshift = 4;
6298 }
6299
6300 if (type)
6301 {
6302 if (type->bitfield.zmmword)
6303 i.memshift = 6;
6304 else if (type->bitfield.ymmword)
6305 i.memshift = 5;
6306 else if (type->bitfield.xmmword)
6307 i.memshift = 4;
6308 }
6309
6310 /* For the check in fits_in_disp8(). */
6311 if (i.memshift == 0)
6312 i.memshift = -1;
6313 }
43234a1e
L
6314
6315 for (op = 0; op < i.operands; op++)
6316 if (operand_type_check (i.types[op], disp)
6317 && i.op[op].disps->X_op == O_constant)
6318 {
b5014f7a 6319 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6320 {
b5014f7a
JB
6321 i.types[op].bitfield.disp8 = 1;
6322 return 0;
43234a1e 6323 }
b5014f7a 6324 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6325 }
6326 }
b5014f7a
JB
6327
6328 i.memshift = 0;
43234a1e 6329
6c30d220
L
6330 return 0;
6331}
6332
da4977e0 6333/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6334
6335static int
da4977e0 6336VEX_check_encoding (const insn_template *t)
a683cc34 6337{
da4977e0
JB
6338 if (i.vec_encoding == vex_encoding_error)
6339 {
6340 i.error = unsupported;
6341 return 1;
6342 }
6343
86fa6981 6344 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6345 {
86fa6981 6346 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6347 if (!is_evex_encoding (t))
86fa6981
L
6348 {
6349 i.error = unsupported;
6350 return 1;
6351 }
6352 return 0;
43234a1e
L
6353 }
6354
a683cc34 6355 if (!t->opcode_modifier.vex)
86fa6981
L
6356 {
6357 /* This instruction template doesn't have VEX prefix. */
6358 if (i.vec_encoding != vex_encoding_default)
6359 {
6360 i.error = unsupported;
6361 return 1;
6362 }
6363 return 0;
6364 }
a683cc34 6365
a683cc34
SP
6366 return 0;
6367}
6368
d3ce72d0 6369static const insn_template *
83b16ac6 6370match_template (char mnem_suffix)
29b0f896
AM
6371{
6372 /* Points to template once we've found it. */
d3ce72d0 6373 const insn_template *t;
40fb9820 6374 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6375 i386_operand_type overlap4;
29b0f896 6376 unsigned int found_reverse_match;
dc2be329 6377 i386_opcode_modifier suffix_check;
40fb9820 6378 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6379 int addr_prefix_disp;
45a4bb20 6380 unsigned int j, size_match, check_register;
5614d22c 6381 enum i386_error specific_error = 0;
29b0f896 6382
c0f3af97
L
6383#if MAX_OPERANDS != 5
6384# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6385#endif
6386
29b0f896 6387 found_reverse_match = 0;
539e75ad 6388 addr_prefix_disp = -1;
40fb9820 6389
dc2be329 6390 /* Prepare for mnemonic suffix check. */
40fb9820 6391 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6392 switch (mnem_suffix)
6393 {
6394 case BYTE_MNEM_SUFFIX:
6395 suffix_check.no_bsuf = 1;
6396 break;
6397 case WORD_MNEM_SUFFIX:
6398 suffix_check.no_wsuf = 1;
6399 break;
6400 case SHORT_MNEM_SUFFIX:
6401 suffix_check.no_ssuf = 1;
6402 break;
6403 case LONG_MNEM_SUFFIX:
6404 suffix_check.no_lsuf = 1;
6405 break;
6406 case QWORD_MNEM_SUFFIX:
6407 suffix_check.no_qsuf = 1;
6408 break;
6409 default:
6410 /* NB: In Intel syntax, normally we can check for memory operand
6411 size when there is no mnemonic suffix. But jmp and call have
6412 2 different encodings with Dword memory operand size, one with
6413 No_ldSuf and the other without. i.suffix is set to
6414 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6415 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6416 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6417 }
6418
01559ecc
L
6419 /* Must have right number of operands. */
6420 i.error = number_of_operands_mismatch;
6421
45aa61fe 6422 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6423 {
539e75ad 6424 addr_prefix_disp = -1;
dbbc8b7e 6425 found_reverse_match = 0;
539e75ad 6426
29b0f896
AM
6427 if (i.operands != t->operands)
6428 continue;
6429
50aecf8c 6430 /* Check processor support. */
a65babc9 6431 i.error = unsupported;
45a4bb20 6432 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6433 continue;
6434
57392598
CL
6435 /* Check Pseudo Prefix. */
6436 i.error = unsupported;
6437 if (t->opcode_modifier.pseudovexprefix
6438 && !(i.vec_encoding == vex_encoding_vex
6439 || i.vec_encoding == vex_encoding_vex3))
6440 continue;
6441
e1d4d893 6442 /* Check AT&T mnemonic. */
a65babc9 6443 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6444 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6445 continue;
6446
4b5aaf5f 6447 /* Check AT&T/Intel syntax. */
a65babc9 6448 i.error = unsupported_syntax;
5c07affc 6449 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6450 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6451 continue;
6452
4b5aaf5f
L
6453 /* Check Intel64/AMD64 ISA. */
6454 switch (isa64)
6455 {
6456 default:
6457 /* Default: Don't accept Intel64. */
6458 if (t->opcode_modifier.isa64 == INTEL64)
6459 continue;
6460 break;
6461 case amd64:
6462 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6463 if (t->opcode_modifier.isa64 >= INTEL64)
6464 continue;
6465 break;
6466 case intel64:
6467 /* -mintel64: Don't accept AMD64. */
5990e377 6468 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6469 continue;
6470 break;
6471 }
6472
dc2be329 6473 /* Check the suffix. */
a65babc9 6474 i.error = invalid_instruction_suffix;
dc2be329
L
6475 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6476 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6477 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6478 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6479 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6480 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6481 continue;
29b0f896 6482
3ac21baa
JB
6483 size_match = operand_size_match (t);
6484 if (!size_match)
7d5e4556 6485 continue;
539e75ad 6486
6f2f06be
JB
6487 /* This is intentionally not
6488
0cfa3eb3 6489 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6490
6491 as the case of a missing * on the operand is accepted (perhaps with
6492 a warning, issued further down). */
0cfa3eb3 6493 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6494 {
6495 i.error = operand_type_mismatch;
6496 continue;
6497 }
6498
5c07affc
L
6499 for (j = 0; j < MAX_OPERANDS; j++)
6500 operand_types[j] = t->operand_types[j];
6501
e365e234
JB
6502 /* In general, don't allow
6503 - 64-bit operands outside of 64-bit mode,
6504 - 32-bit operands on pre-386. */
4873e243 6505 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6506 if (((i.suffix == QWORD_MNEM_SUFFIX
6507 && flag_code != CODE_64BIT
389d00a5
JB
6508 && !(t->opcode_modifier.opcodespace == SPACE_0F
6509 && t->base_opcode == 0xc7
5e74b495 6510 && t->opcode_modifier.opcodeprefix == PREFIX_NONE
8b65b895 6511 && t->extension_opcode == 1) /* cmpxchg8b */)
e365e234
JB
6512 || (i.suffix == LONG_MNEM_SUFFIX
6513 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6514 && (intel_syntax
3cd7f3e3 6515 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6516 && !intel_float_operand (t->name))
6517 : intel_float_operand (t->name) != 2)
4873e243
JB
6518 && (t->operands == i.imm_operands
6519 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6520 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6521 && operand_types[i.imm_operands].bitfield.class != RegMask)
6522 || (operand_types[j].bitfield.class != RegMMX
6523 && operand_types[j].bitfield.class != RegSIMD
6524 && operand_types[j].bitfield.class != RegMask))
63112cd6 6525 && !t->opcode_modifier.sib)
192dc9c6
JB
6526 continue;
6527
29b0f896 6528 /* Do not verify operands when there are none. */
e365e234 6529 if (!t->operands)
da4977e0
JB
6530 {
6531 if (VEX_check_encoding (t))
6532 {
6533 specific_error = i.error;
6534 continue;
6535 }
6536
6537 /* We've found a match; break out of loop. */
6538 break;
6539 }
252b5132 6540
48bcea9f
JB
6541 if (!t->opcode_modifier.jump
6542 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6543 {
6544 /* There should be only one Disp operand. */
6545 for (j = 0; j < MAX_OPERANDS; j++)
6546 if (operand_type_check (operand_types[j], disp))
539e75ad 6547 break;
48bcea9f
JB
6548 if (j < MAX_OPERANDS)
6549 {
5b7c81bd 6550 bool override = (i.prefix[ADDR_PREFIX] != 0);
48bcea9f
JB
6551
6552 addr_prefix_disp = j;
6553
6554 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6555 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6556 switch (flag_code)
40fb9820 6557 {
48bcea9f
JB
6558 case CODE_16BIT:
6559 override = !override;
6560 /* Fall through. */
6561 case CODE_32BIT:
6562 if (operand_types[j].bitfield.disp32
6563 && operand_types[j].bitfield.disp16)
40fb9820 6564 {
48bcea9f
JB
6565 operand_types[j].bitfield.disp16 = override;
6566 operand_types[j].bitfield.disp32 = !override;
40fb9820 6567 }
48bcea9f
JB
6568 operand_types[j].bitfield.disp32s = 0;
6569 operand_types[j].bitfield.disp64 = 0;
6570 break;
6571
6572 case CODE_64BIT:
6573 if (operand_types[j].bitfield.disp32s
6574 || operand_types[j].bitfield.disp64)
40fb9820 6575 {
48bcea9f
JB
6576 operand_types[j].bitfield.disp64 &= !override;
6577 operand_types[j].bitfield.disp32s &= !override;
6578 operand_types[j].bitfield.disp32 = override;
40fb9820 6579 }
48bcea9f
JB
6580 operand_types[j].bitfield.disp16 = 0;
6581 break;
40fb9820 6582 }
539e75ad 6583 }
48bcea9f 6584 }
539e75ad 6585
02a86693 6586 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
35648716
JB
6587 if (i.reloc[0] == BFD_RELOC_386_GOT32
6588 && t->base_opcode == 0xa0
6589 && t->opcode_modifier.opcodespace == SPACE_BASE)
02a86693
L
6590 continue;
6591
56ffb741 6592 /* We check register size if needed. */
e2195274
JB
6593 if (t->opcode_modifier.checkregsize)
6594 {
6595 check_register = (1 << t->operands) - 1;
5273a3cd
JB
6596 if (i.broadcast.type)
6597 check_register &= ~(1 << i.broadcast.operand);
e2195274
JB
6598 }
6599 else
6600 check_register = 0;
6601
c6fb90c8 6602 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6603 switch (t->operands)
6604 {
6605 case 1:
40fb9820 6606 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6607 continue;
6608 break;
6609 case 2:
33eaf5de 6610 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6611 only in 32bit mode and we can use opcode 0x90. In 64bit
6612 mode, we can't use 0x90 for xchg %eax, %eax since it should
6613 zero-extend %eax to %rax. */
6614 if (flag_code == CODE_64BIT
6615 && t->base_opcode == 0x90
35648716 6616 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b
JB
6617 && i.types[0].bitfield.instance == Accum
6618 && i.types[0].bitfield.dword
6619 && i.types[1].bitfield.instance == Accum
6620 && i.types[1].bitfield.dword)
8b38ad71 6621 continue;
1212781b
JB
6622 /* xrelease mov %eax, <disp> is another special case. It must not
6623 match the accumulator-only encoding of mov. */
6624 if (flag_code != CODE_64BIT
6625 && i.hle_prefix
6626 && t->base_opcode == 0xa0
35648716 6627 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b 6628 && i.types[0].bitfield.instance == Accum
8dc0818e 6629 && (i.flags[1] & Operand_Mem))
1212781b 6630 continue;
f5eb1d70
JB
6631 /* Fall through. */
6632
6633 case 3:
3ac21baa
JB
6634 if (!(size_match & MATCH_STRAIGHT))
6635 goto check_reverse;
64c49ab3
JB
6636 /* Reverse direction of operands if swapping is possible in the first
6637 place (operands need to be symmetric) and
6638 - the load form is requested, and the template is a store form,
6639 - the store form is requested, and the template is a load form,
6640 - the non-default (swapped) form is requested. */
6641 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6642 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6643 && !operand_type_all_zero (&overlap1))
6644 switch (i.dir_encoding)
6645 {
6646 case dir_encoding_load:
6647 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6648 || t->opcode_modifier.regmem)
64c49ab3
JB
6649 goto check_reverse;
6650 break;
6651
6652 case dir_encoding_store:
6653 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6654 && !t->opcode_modifier.regmem)
64c49ab3
JB
6655 goto check_reverse;
6656 break;
6657
6658 case dir_encoding_swap:
6659 goto check_reverse;
6660
6661 case dir_encoding_default:
6662 break;
6663 }
86fa6981 6664 /* If we want store form, we skip the current load. */
64c49ab3
JB
6665 if ((i.dir_encoding == dir_encoding_store
6666 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6667 && i.mem_operands == 0
6668 && t->opcode_modifier.load)
fa99fab2 6669 continue;
1a0670f3 6670 /* Fall through. */
f48ff2ae 6671 case 4:
c0f3af97 6672 case 5:
c6fb90c8 6673 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6674 if (!operand_type_match (overlap0, i.types[0])
6675 || !operand_type_match (overlap1, i.types[1])
e2195274 6676 || ((check_register & 3) == 3
dc821c5f 6677 && !operand_type_register_match (i.types[0],
40fb9820 6678 operand_types[0],
dc821c5f 6679 i.types[1],
40fb9820 6680 operand_types[1])))
29b0f896
AM
6681 {
6682 /* Check if other direction is valid ... */
38e314eb 6683 if (!t->opcode_modifier.d)
29b0f896
AM
6684 continue;
6685
dc1e8a47 6686 check_reverse:
3ac21baa
JB
6687 if (!(size_match & MATCH_REVERSE))
6688 continue;
29b0f896 6689 /* Try reversing direction of operands. */
f5eb1d70
JB
6690 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6691 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6692 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6693 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6694 || (check_register
dc821c5f 6695 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6696 operand_types[i.operands - 1],
6697 i.types[i.operands - 1],
45664ddb 6698 operand_types[0])))
29b0f896
AM
6699 {
6700 /* Does not match either direction. */
6701 continue;
6702 }
38e314eb 6703 /* found_reverse_match holds which of D or FloatR
29b0f896 6704 we've found. */
38e314eb
JB
6705 if (!t->opcode_modifier.d)
6706 found_reverse_match = 0;
6707 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6708 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6709 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6710 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6711 || operand_types[0].bitfield.class == RegMMX
6712 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6713 || is_any_vex_encoding(t))
6714 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6715 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6716 else
38e314eb 6717 found_reverse_match = Opcode_D;
40fb9820 6718 if (t->opcode_modifier.floatr)
8a2ed489 6719 found_reverse_match |= Opcode_FloatR;
29b0f896 6720 }
f48ff2ae 6721 else
29b0f896 6722 {
f48ff2ae 6723 /* Found a forward 2 operand match here. */
d1cbb4db
L
6724 switch (t->operands)
6725 {
c0f3af97
L
6726 case 5:
6727 overlap4 = operand_type_and (i.types[4],
6728 operand_types[4]);
1a0670f3 6729 /* Fall through. */
d1cbb4db 6730 case 4:
c6fb90c8
L
6731 overlap3 = operand_type_and (i.types[3],
6732 operand_types[3]);
1a0670f3 6733 /* Fall through. */
d1cbb4db 6734 case 3:
c6fb90c8
L
6735 overlap2 = operand_type_and (i.types[2],
6736 operand_types[2]);
d1cbb4db
L
6737 break;
6738 }
29b0f896 6739
f48ff2ae
L
6740 switch (t->operands)
6741 {
c0f3af97
L
6742 case 5:
6743 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6744 || !operand_type_register_match (i.types[3],
c0f3af97 6745 operand_types[3],
c0f3af97
L
6746 i.types[4],
6747 operand_types[4]))
6748 continue;
1a0670f3 6749 /* Fall through. */
f48ff2ae 6750 case 4:
40fb9820 6751 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6752 || ((check_register & 0xa) == 0xa
6753 && !operand_type_register_match (i.types[1],
f7768225
JB
6754 operand_types[1],
6755 i.types[3],
e2195274
JB
6756 operand_types[3]))
6757 || ((check_register & 0xc) == 0xc
6758 && !operand_type_register_match (i.types[2],
6759 operand_types[2],
6760 i.types[3],
6761 operand_types[3])))
f48ff2ae 6762 continue;
1a0670f3 6763 /* Fall through. */
f48ff2ae
L
6764 case 3:
6765 /* Here we make use of the fact that there are no
23e42951 6766 reverse match 3 operand instructions. */
40fb9820 6767 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6768 || ((check_register & 5) == 5
6769 && !operand_type_register_match (i.types[0],
23e42951
JB
6770 operand_types[0],
6771 i.types[2],
e2195274
JB
6772 operand_types[2]))
6773 || ((check_register & 6) == 6
6774 && !operand_type_register_match (i.types[1],
6775 operand_types[1],
6776 i.types[2],
6777 operand_types[2])))
f48ff2ae
L
6778 continue;
6779 break;
6780 }
29b0f896 6781 }
f48ff2ae 6782 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6783 slip through to break. */
6784 }
c0f3af97 6785
da4977e0
JB
6786 /* Check if vector operands are valid. */
6787 if (check_VecOperands (t))
6788 {
6789 specific_error = i.error;
6790 continue;
6791 }
6792
6793 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6794 if (VEX_check_encoding (t))
5614d22c
JB
6795 {
6796 specific_error = i.error;
6797 continue;
6798 }
a683cc34 6799
29b0f896
AM
6800 /* We've found a match; break out of loop. */
6801 break;
6802 }
6803
6804 if (t == current_templates->end)
6805 {
6806 /* We found no match. */
a65babc9 6807 const char *err_msg;
5614d22c 6808 switch (specific_error ? specific_error : i.error)
a65babc9
L
6809 {
6810 default:
6811 abort ();
86e026a4 6812 case operand_size_mismatch:
a65babc9
L
6813 err_msg = _("operand size mismatch");
6814 break;
6815 case operand_type_mismatch:
6816 err_msg = _("operand type mismatch");
6817 break;
6818 case register_type_mismatch:
6819 err_msg = _("register type mismatch");
6820 break;
6821 case number_of_operands_mismatch:
6822 err_msg = _("number of operands mismatch");
6823 break;
6824 case invalid_instruction_suffix:
6825 err_msg = _("invalid instruction suffix");
6826 break;
6827 case bad_imm4:
4a2608e3 6828 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6829 break;
a65babc9
L
6830 case unsupported_with_intel_mnemonic:
6831 err_msg = _("unsupported with Intel mnemonic");
6832 break;
6833 case unsupported_syntax:
6834 err_msg = _("unsupported syntax");
6835 break;
6836 case unsupported:
35262a23 6837 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6838 current_templates->start->name);
6839 return NULL;
260cd341
LC
6840 case invalid_sib_address:
6841 err_msg = _("invalid SIB address");
6842 break;
6c30d220
L
6843 case invalid_vsib_address:
6844 err_msg = _("invalid VSIB address");
6845 break;
7bab8ab5
JB
6846 case invalid_vector_register_set:
6847 err_msg = _("mask, index, and destination registers must be distinct");
6848 break;
260cd341
LC
6849 case invalid_tmm_register_set:
6850 err_msg = _("all tmm registers must be distinct");
6851 break;
6c30d220
L
6852 case unsupported_vector_index_register:
6853 err_msg = _("unsupported vector index register");
6854 break;
43234a1e
L
6855 case unsupported_broadcast:
6856 err_msg = _("unsupported broadcast");
6857 break;
43234a1e
L
6858 case broadcast_needed:
6859 err_msg = _("broadcast is needed for operand of such type");
6860 break;
6861 case unsupported_masking:
6862 err_msg = _("unsupported masking");
6863 break;
6864 case mask_not_on_destination:
6865 err_msg = _("mask not on destination operand");
6866 break;
6867 case no_default_mask:
6868 err_msg = _("default mask isn't allowed");
6869 break;
6870 case unsupported_rc_sae:
6871 err_msg = _("unsupported static rounding/sae");
6872 break;
6873 case rc_sae_operand_not_last_imm:
6874 if (intel_syntax)
6875 err_msg = _("RC/SAE operand must precede immediate operands");
6876 else
6877 err_msg = _("RC/SAE operand must follow immediate operands");
6878 break;
6879 case invalid_register_operand:
6880 err_msg = _("invalid register operand");
6881 break;
a65babc9
L
6882 }
6883 as_bad (_("%s for `%s'"), err_msg,
891edac4 6884 current_templates->start->name);
fa99fab2 6885 return NULL;
29b0f896 6886 }
252b5132 6887
29b0f896
AM
6888 if (!quiet_warnings)
6889 {
6890 if (!intel_syntax
0cfa3eb3 6891 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6892 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6893
40fb9820 6894 if (t->opcode_modifier.isprefix
3cd7f3e3 6895 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6896 {
6897 /* Warn them that a data or address size prefix doesn't
6898 affect assembly of the next line of code. */
6899 as_warn (_("stand-alone `%s' prefix"), t->name);
6900 }
6901 }
6902
6903 /* Copy the template we found. */
9a182d04 6904 install_template (t);
539e75ad
L
6905
6906 if (addr_prefix_disp != -1)
6907 i.tm.operand_types[addr_prefix_disp]
6908 = operand_types[addr_prefix_disp];
6909
29b0f896
AM
6910 if (found_reverse_match)
6911 {
dfd69174
JB
6912 /* If we found a reverse match we must alter the opcode direction
6913 bit and clear/flip the regmem modifier one. found_reverse_match
6914 holds bits to change (different for int & float insns). */
29b0f896
AM
6915
6916 i.tm.base_opcode ^= found_reverse_match;
6917
f5eb1d70
JB
6918 i.tm.operand_types[0] = operand_types[i.operands - 1];
6919 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6920
6921 /* Certain SIMD insns have their load forms specified in the opcode
6922 table, and hence we need to _set_ RegMem instead of clearing it.
6923 We need to avoid setting the bit though on insns like KMOVW. */
6924 i.tm.opcode_modifier.regmem
6925 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6926 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6927 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6928 }
6929
fa99fab2 6930 return t;
29b0f896
AM
6931}
6932
6933static int
e3bb37b5 6934check_string (void)
29b0f896 6935{
51c8edf6
JB
6936 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6937 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6938
5e042380 6939 if (i.seg[op] != NULL && i.seg[op] != reg_es)
29b0f896 6940 {
51c8edf6
JB
6941 as_bad (_("`%s' operand %u must use `%ses' segment"),
6942 i.tm.name,
6943 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6944 register_prefix);
6945 return 0;
29b0f896 6946 }
51c8edf6
JB
6947
6948 /* There's only ever one segment override allowed per instruction.
6949 This instruction possibly has a legal segment override on the
6950 second operand, so copy the segment to where non-string
6951 instructions store it, allowing common code. */
6952 i.seg[op] = i.seg[1];
6953
29b0f896
AM
6954 return 1;
6955}
6956
6957static int
543613e9 6958process_suffix (void)
29b0f896 6959{
5b7c81bd 6960 bool is_crc32 = false, is_movx = false;
8b65b895 6961
29b0f896
AM
6962 /* If matched instruction specifies an explicit instruction mnemonic
6963 suffix, use it. */
673fe0f0 6964 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6965 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6966 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6967 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6968 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6969 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6970 else if (i.reg_operands
c8f8eebc
JB
6971 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6972 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6973 {
65fca059 6974 unsigned int numop = i.operands;
389d00a5
JB
6975
6976 /* MOVSX/MOVZX */
6977 is_movx = (i.tm.opcode_modifier.opcodespace == SPACE_0F
6978 && (i.tm.base_opcode | 8) == 0xbe)
6979 || (i.tm.opcode_modifier.opcodespace == SPACE_BASE
6980 && i.tm.base_opcode == 0x63
6981 && i.tm.cpu_flags.bitfield.cpu64);
6982
8b65b895 6983 /* CRC32 */
389d00a5
JB
6984 is_crc32 = (i.tm.base_opcode == 0xf0
6985 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895 6986 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2);
65fca059
JB
6987
6988 /* movsx/movzx want only their source operand considered here, for the
6989 ambiguity checking below. The suffix will be replaced afterwards
6990 to represent the destination (register). */
389d00a5 6991 if (is_movx && (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63))
65fca059
JB
6992 --i.operands;
6993
643bb870 6994 /* crc32 needs REX.W set regardless of suffix / source operand size. */
8b65b895 6995 if (is_crc32 && i.tm.operand_types[1].bitfield.qword)
643bb870
JB
6996 i.rex |= REX_W;
6997
29b0f896 6998 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6999 based on GPR operands. */
29b0f896
AM
7000 if (!i.suffix)
7001 {
7002 /* We take i.suffix from the last register operand specified,
7003 Destination register type is more significant than source
381d071f
L
7004 register type. crc32 in SSE4.2 prefers source register
7005 type. */
8b65b895 7006 unsigned int op = is_crc32 ? 1 : i.operands;
20592a94 7007
1a035124
JB
7008 while (op--)
7009 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
7010 || i.tm.operand_types[op].bitfield.instance == Accum)
7011 {
7012 if (i.types[op].bitfield.class != Reg)
7013 continue;
7014 if (i.types[op].bitfield.byte)
7015 i.suffix = BYTE_MNEM_SUFFIX;
7016 else if (i.types[op].bitfield.word)
7017 i.suffix = WORD_MNEM_SUFFIX;
7018 else if (i.types[op].bitfield.dword)
7019 i.suffix = LONG_MNEM_SUFFIX;
7020 else if (i.types[op].bitfield.qword)
7021 i.suffix = QWORD_MNEM_SUFFIX;
7022 else
7023 continue;
7024 break;
7025 }
65fca059
JB
7026
7027 /* As an exception, movsx/movzx silently default to a byte source
7028 in AT&T mode. */
389d00a5 7029 if (is_movx && i.tm.opcode_modifier.w && !i.suffix && !intel_syntax)
65fca059 7030 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
7031 }
7032 else if (i.suffix == BYTE_MNEM_SUFFIX)
7033 {
2eb952a4 7034 if (intel_syntax
3cd7f3e3 7035 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
7036 && i.tm.opcode_modifier.no_bsuf)
7037 i.suffix = 0;
7038 else if (!check_byte_reg ())
29b0f896
AM
7039 return 0;
7040 }
7041 else if (i.suffix == LONG_MNEM_SUFFIX)
7042 {
2eb952a4 7043 if (intel_syntax
3cd7f3e3 7044 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
7045 && i.tm.opcode_modifier.no_lsuf
7046 && !i.tm.opcode_modifier.todword
7047 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
7048 i.suffix = 0;
7049 else if (!check_long_reg ())
29b0f896
AM
7050 return 0;
7051 }
7052 else if (i.suffix == QWORD_MNEM_SUFFIX)
7053 {
955e1e6a 7054 if (intel_syntax
3cd7f3e3 7055 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
7056 && i.tm.opcode_modifier.no_qsuf
7057 && !i.tm.opcode_modifier.todword
7058 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
7059 i.suffix = 0;
7060 else if (!check_qword_reg ())
29b0f896
AM
7061 return 0;
7062 }
7063 else if (i.suffix == WORD_MNEM_SUFFIX)
7064 {
2eb952a4 7065 if (intel_syntax
3cd7f3e3 7066 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
7067 && i.tm.opcode_modifier.no_wsuf)
7068 i.suffix = 0;
7069 else if (!check_word_reg ())
29b0f896
AM
7070 return 0;
7071 }
3cd7f3e3
L
7072 else if (intel_syntax
7073 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
7074 /* Do nothing if the instruction is going to ignore the prefix. */
7075 ;
7076 else
7077 abort ();
65fca059
JB
7078
7079 /* Undo the movsx/movzx change done above. */
7080 i.operands = numop;
29b0f896 7081 }
3cd7f3e3
L
7082 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
7083 && !i.suffix)
29b0f896 7084 {
13e600d0
JB
7085 i.suffix = stackop_size;
7086 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
7087 {
7088 /* stackop_size is set to LONG_MNEM_SUFFIX for the
7089 .code16gcc directive to support 16-bit mode with
7090 32-bit address. For IRET without a suffix, generate
7091 16-bit IRET (opcode 0xcf) to return from an interrupt
7092 handler. */
13e600d0
JB
7093 if (i.tm.base_opcode == 0xcf)
7094 {
7095 i.suffix = WORD_MNEM_SUFFIX;
7096 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
7097 }
7098 /* Warn about changed behavior for segment register push/pop. */
7099 else if ((i.tm.base_opcode | 1) == 0x07)
7100 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
7101 i.tm.name);
06f74c5c 7102 }
29b0f896 7103 }
c006a730 7104 else if (!i.suffix
0cfa3eb3
JB
7105 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
7106 || i.tm.opcode_modifier.jump == JUMP_BYTE
7107 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
389d00a5
JB
7108 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
7109 && i.tm.base_opcode == 0x01 /* [ls][gi]dt */
64e74474 7110 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
7111 {
7112 switch (flag_code)
7113 {
7114 case CODE_64BIT:
40fb9820 7115 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 7116 {
828c2a25
JB
7117 if (i.tm.opcode_modifier.jump == JUMP_BYTE
7118 || i.tm.opcode_modifier.no_lsuf)
7119 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
7120 break;
7121 }
1a0670f3 7122 /* Fall through. */
9306ca4a 7123 case CODE_32BIT:
40fb9820 7124 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
7125 i.suffix = LONG_MNEM_SUFFIX;
7126 break;
7127 case CODE_16BIT:
40fb9820 7128 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
7129 i.suffix = WORD_MNEM_SUFFIX;
7130 break;
7131 }
7132 }
252b5132 7133
c006a730 7134 if (!i.suffix
3cd7f3e3 7135 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
7136 /* Also cover lret/retf/iret in 64-bit mode. */
7137 || (flag_code == CODE_64BIT
7138 && !i.tm.opcode_modifier.no_lsuf
7139 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 7140 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
7141 /* Explicit sizing prefixes are assumed to disambiguate insns. */
7142 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
7143 /* Accept FLDENV et al without suffix. */
7144 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 7145 {
6c0946d0 7146 unsigned int suffixes, evex = 0;
c006a730
JB
7147
7148 suffixes = !i.tm.opcode_modifier.no_bsuf;
7149 if (!i.tm.opcode_modifier.no_wsuf)
7150 suffixes |= 1 << 1;
7151 if (!i.tm.opcode_modifier.no_lsuf)
7152 suffixes |= 1 << 2;
7153 if (!i.tm.opcode_modifier.no_ldsuf)
7154 suffixes |= 1 << 3;
7155 if (!i.tm.opcode_modifier.no_ssuf)
7156 suffixes |= 1 << 4;
7157 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
7158 suffixes |= 1 << 5;
7159
6c0946d0
JB
7160 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
7161 also suitable for AT&T syntax mode, it was requested that this be
7162 restricted to just Intel syntax. */
5273a3cd 7163 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast.type)
6c0946d0 7164 {
b9915cbc 7165 unsigned int op;
6c0946d0 7166
b9915cbc 7167 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 7168 {
b9915cbc
JB
7169 if (is_evex_encoding (&i.tm)
7170 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 7171 {
b9915cbc
JB
7172 if (i.tm.operand_types[op].bitfield.ymmword)
7173 i.tm.operand_types[op].bitfield.xmmword = 0;
7174 if (i.tm.operand_types[op].bitfield.zmmword)
7175 i.tm.operand_types[op].bitfield.ymmword = 0;
7176 if (!i.tm.opcode_modifier.evex
7177 || i.tm.opcode_modifier.evex == EVEXDYN)
7178 i.tm.opcode_modifier.evex = EVEX512;
7179 }
6c0946d0 7180
b9915cbc
JB
7181 if (i.tm.operand_types[op].bitfield.xmmword
7182 + i.tm.operand_types[op].bitfield.ymmword
7183 + i.tm.operand_types[op].bitfield.zmmword < 2)
7184 continue;
6c0946d0 7185
b9915cbc
JB
7186 /* Any properly sized operand disambiguates the insn. */
7187 if (i.types[op].bitfield.xmmword
7188 || i.types[op].bitfield.ymmword
7189 || i.types[op].bitfield.zmmword)
7190 {
7191 suffixes &= ~(7 << 6);
7192 evex = 0;
7193 break;
7194 }
6c0946d0 7195
b9915cbc
JB
7196 if ((i.flags[op] & Operand_Mem)
7197 && i.tm.operand_types[op].bitfield.unspecified)
7198 {
7199 if (i.tm.operand_types[op].bitfield.xmmword)
7200 suffixes |= 1 << 6;
7201 if (i.tm.operand_types[op].bitfield.ymmword)
7202 suffixes |= 1 << 7;
7203 if (i.tm.operand_types[op].bitfield.zmmword)
7204 suffixes |= 1 << 8;
7205 if (is_evex_encoding (&i.tm))
7206 evex = EVEX512;
6c0946d0
JB
7207 }
7208 }
7209 }
7210
7211 /* Are multiple suffixes / operand sizes allowed? */
c006a730 7212 if (suffixes & (suffixes - 1))
9306ca4a 7213 {
873494c8 7214 if (intel_syntax
3cd7f3e3 7215 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 7216 || operand_check == check_error))
9306ca4a 7217 {
c006a730 7218 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
7219 return 0;
7220 }
c006a730 7221 if (operand_check == check_error)
9306ca4a 7222 {
c006a730
JB
7223 as_bad (_("no instruction mnemonic suffix given and "
7224 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
7225 return 0;
7226 }
c006a730 7227 if (operand_check == check_warning)
873494c8
JB
7228 as_warn (_("%s; using default for `%s'"),
7229 intel_syntax
7230 ? _("ambiguous operand size")
7231 : _("no instruction mnemonic suffix given and "
7232 "no register operands"),
7233 i.tm.name);
c006a730
JB
7234
7235 if (i.tm.opcode_modifier.floatmf)
7236 i.suffix = SHORT_MNEM_SUFFIX;
389d00a5 7237 else if (is_movx)
65fca059 7238 /* handled below */;
6c0946d0
JB
7239 else if (evex)
7240 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7241 else if (flag_code == CODE_16BIT)
7242 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7243 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7244 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7245 else
7246 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7247 }
29b0f896 7248 }
252b5132 7249
389d00a5 7250 if (is_movx)
65fca059
JB
7251 {
7252 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7253 In AT&T syntax, if there is no suffix (warned about above), the default
7254 will be byte extension. */
7255 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7256 i.tm.base_opcode |= 1;
7257
7258 /* For further processing, the suffix should represent the destination
7259 (register). This is already the case when one was used with
7260 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7261 no suffix to begin with. */
7262 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7263 {
7264 if (i.types[1].bitfield.word)
7265 i.suffix = WORD_MNEM_SUFFIX;
7266 else if (i.types[1].bitfield.qword)
7267 i.suffix = QWORD_MNEM_SUFFIX;
7268 else
7269 i.suffix = LONG_MNEM_SUFFIX;
7270
7271 i.tm.opcode_modifier.w = 0;
7272 }
7273 }
7274
50128d0c
JB
7275 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7276 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7277 != (i.tm.operand_types[1].bitfield.class == Reg);
7278
d2224064
JB
7279 /* Change the opcode based on the operand size given by i.suffix. */
7280 switch (i.suffix)
29b0f896 7281 {
d2224064
JB
7282 /* Size floating point instruction. */
7283 case LONG_MNEM_SUFFIX:
7284 if (i.tm.opcode_modifier.floatmf)
7285 {
7286 i.tm.base_opcode ^= 4;
7287 break;
7288 }
7289 /* fall through */
7290 case WORD_MNEM_SUFFIX:
7291 case QWORD_MNEM_SUFFIX:
29b0f896 7292 /* It's not a byte, select word/dword operation. */
40fb9820 7293 if (i.tm.opcode_modifier.w)
29b0f896 7294 {
50128d0c 7295 if (i.short_form)
29b0f896
AM
7296 i.tm.base_opcode |= 8;
7297 else
7298 i.tm.base_opcode |= 1;
7299 }
d2224064
JB
7300 /* fall through */
7301 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7302 /* Now select between word & dword operations via the operand
7303 size prefix, except for instructions that will ignore this
7304 prefix anyway. */
c8f8eebc 7305 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7306 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7307 && !i.tm.opcode_modifier.floatmf
7308 && !is_any_vex_encoding (&i.tm)
7309 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7310 || (flag_code == CODE_64BIT
7311 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7312 {
7313 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7314
0cfa3eb3 7315 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7316 prefix = ADDR_PREFIX_OPCODE;
252b5132 7317
29b0f896
AM
7318 if (!add_prefix (prefix))
7319 return 0;
24eab124 7320 }
252b5132 7321
29b0f896
AM
7322 /* Set mode64 for an operand. */
7323 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7324 && flag_code == CODE_64BIT
d2224064 7325 && !i.tm.opcode_modifier.norex64
4ed21b58 7326 && !i.tm.opcode_modifier.vexw
46e883c5 7327 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7328 need rex64. */
7329 && ! (i.operands == 2
7330 && i.tm.base_opcode == 0x90
7331 && i.tm.extension_opcode == None
75e5731b
JB
7332 && i.types[0].bitfield.instance == Accum
7333 && i.types[0].bitfield.qword
7334 && i.types[1].bitfield.instance == Accum
7335 && i.types[1].bitfield.qword))
d2224064 7336 i.rex |= REX_W;
3e73aa7c 7337
d2224064 7338 break;
8bbb3ad8
JB
7339
7340 case 0:
f9a6a8f0 7341 /* Select word/dword/qword operation with explicit data sizing prefix
8bbb3ad8
JB
7342 when there are no suitable register operands. */
7343 if (i.tm.opcode_modifier.w
7344 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7345 && (!i.reg_operands
7346 || (i.reg_operands == 1
7347 /* ShiftCount */
7348 && (i.tm.operand_types[0].bitfield.instance == RegC
7349 /* InOutPortReg */
7350 || i.tm.operand_types[0].bitfield.instance == RegD
7351 || i.tm.operand_types[1].bitfield.instance == RegD
7352 /* CRC32 */
8b65b895 7353 || is_crc32))))
8bbb3ad8
JB
7354 i.tm.base_opcode |= 1;
7355 break;
29b0f896 7356 }
7ecd2f8b 7357
c8f8eebc 7358 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7359 {
c8f8eebc
JB
7360 gas_assert (!i.suffix);
7361 gas_assert (i.reg_operands);
c0a30a9f 7362
c8f8eebc
JB
7363 if (i.tm.operand_types[0].bitfield.instance == Accum
7364 || i.operands == 1)
7365 {
7366 /* The address size override prefix changes the size of the
7367 first operand. */
7368 if (flag_code == CODE_64BIT
7369 && i.op[0].regs->reg_type.bitfield.word)
7370 {
7371 as_bad (_("16-bit addressing unavailable for `%s'"),
7372 i.tm.name);
7373 return 0;
7374 }
7375
7376 if ((flag_code == CODE_32BIT
7377 ? i.op[0].regs->reg_type.bitfield.word
7378 : i.op[0].regs->reg_type.bitfield.dword)
7379 && !add_prefix (ADDR_PREFIX_OPCODE))
7380 return 0;
7381 }
c0a30a9f
L
7382 else
7383 {
c8f8eebc
JB
7384 /* Check invalid register operand when the address size override
7385 prefix changes the size of register operands. */
7386 unsigned int op;
7387 enum { need_word, need_dword, need_qword } need;
7388
27f13469 7389 /* Check the register operand for the address size prefix if
b3a3496f 7390 the memory operand has no real registers, like symbol, DISP
829f3fe1 7391 or bogus (x32-only) symbol(%rip) when symbol(%eip) is meant. */
27f13469
L
7392 if (i.mem_operands == 1
7393 && i.reg_operands == 1
7394 && i.operands == 2
27f13469 7395 && i.types[1].bitfield.class == Reg
b3a3496f
L
7396 && (flag_code == CODE_32BIT
7397 ? i.op[1].regs->reg_type.bitfield.word
7398 : i.op[1].regs->reg_type.bitfield.dword)
7399 && ((i.base_reg == NULL && i.index_reg == NULL)
829f3fe1
JB
7400#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7401 || (x86_elf_abi == X86_64_X32_ABI
7402 && i.base_reg
b3a3496f
L
7403 && i.base_reg->reg_num == RegIP
7404 && i.base_reg->reg_type.bitfield.qword))
829f3fe1
JB
7405#else
7406 || 0)
7407#endif
27f13469
L
7408 && !add_prefix (ADDR_PREFIX_OPCODE))
7409 return 0;
7410
c8f8eebc
JB
7411 if (flag_code == CODE_32BIT)
7412 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7413 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7414 need = need_dword;
7415 else
7416 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7417
c8f8eebc
JB
7418 for (op = 0; op < i.operands; op++)
7419 {
7420 if (i.types[op].bitfield.class != Reg)
7421 continue;
7422
7423 switch (need)
7424 {
7425 case need_word:
7426 if (i.op[op].regs->reg_type.bitfield.word)
7427 continue;
7428 break;
7429 case need_dword:
7430 if (i.op[op].regs->reg_type.bitfield.dword)
7431 continue;
7432 break;
7433 case need_qword:
7434 if (i.op[op].regs->reg_type.bitfield.qword)
7435 continue;
7436 break;
7437 }
7438
7439 as_bad (_("invalid register operand size for `%s'"),
7440 i.tm.name);
7441 return 0;
7442 }
7443 }
c0a30a9f
L
7444 }
7445
29b0f896
AM
7446 return 1;
7447}
3e73aa7c 7448
29b0f896 7449static int
543613e9 7450check_byte_reg (void)
29b0f896
AM
7451{
7452 int op;
543613e9 7453
29b0f896
AM
7454 for (op = i.operands; --op >= 0;)
7455 {
dc821c5f 7456 /* Skip non-register operands. */
bab6aec1 7457 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7458 continue;
7459
29b0f896
AM
7460 /* If this is an eight bit register, it's OK. If it's the 16 or
7461 32 bit version of an eight bit register, we will just use the
7462 low portion, and that's OK too. */
dc821c5f 7463 if (i.types[op].bitfield.byte)
29b0f896
AM
7464 continue;
7465
5a819eb9 7466 /* I/O port address operands are OK too. */
75e5731b
JB
7467 if (i.tm.operand_types[op].bitfield.instance == RegD
7468 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7469 continue;
7470
9706160a 7471 /* crc32 only wants its source operand checked here. */
389d00a5
JB
7472 if (i.tm.base_opcode == 0xf0
7473 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895
L
7474 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2
7475 && op != 0)
9344ff29
L
7476 continue;
7477
29b0f896 7478 /* Any other register is bad. */
73c76375
JB
7479 as_bad (_("`%s%s' not allowed with `%s%c'"),
7480 register_prefix, i.op[op].regs->reg_name,
7481 i.tm.name, i.suffix);
7482 return 0;
29b0f896
AM
7483 }
7484 return 1;
7485}
7486
7487static int
e3bb37b5 7488check_long_reg (void)
29b0f896
AM
7489{
7490 int op;
7491
7492 for (op = i.operands; --op >= 0;)
dc821c5f 7493 /* Skip non-register operands. */
bab6aec1 7494 if (i.types[op].bitfield.class != Reg)
dc821c5f 7495 continue;
29b0f896
AM
7496 /* Reject eight bit registers, except where the template requires
7497 them. (eg. movzb) */
dc821c5f 7498 else if (i.types[op].bitfield.byte
bab6aec1 7499 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7500 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7501 && (i.tm.operand_types[op].bitfield.word
7502 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7503 {
a540244d
L
7504 as_bad (_("`%s%s' not allowed with `%s%c'"),
7505 register_prefix,
29b0f896
AM
7506 i.op[op].regs->reg_name,
7507 i.tm.name,
7508 i.suffix);
7509 return 0;
7510 }
be4c5e58
L
7511 /* Error if the e prefix on a general reg is missing. */
7512 else if (i.types[op].bitfield.word
bab6aec1 7513 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7514 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7515 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7516 {
be4c5e58
L
7517 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7518 register_prefix, i.op[op].regs->reg_name,
7519 i.suffix);
7520 return 0;
252b5132 7521 }
e4630f71 7522 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7523 else if (i.types[op].bitfield.qword
bab6aec1 7524 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7525 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7526 && i.tm.operand_types[op].bitfield.dword)
252b5132 7527 {
34828aad 7528 if (intel_syntax
65fca059 7529 && i.tm.opcode_modifier.toqword
3528c362 7530 && i.types[0].bitfield.class != RegSIMD)
34828aad 7531 {
ca61edf2 7532 /* Convert to QWORD. We want REX byte. */
34828aad
L
7533 i.suffix = QWORD_MNEM_SUFFIX;
7534 }
7535 else
7536 {
2b5d6a91 7537 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7538 register_prefix, i.op[op].regs->reg_name,
7539 i.suffix);
7540 return 0;
7541 }
29b0f896
AM
7542 }
7543 return 1;
7544}
252b5132 7545
29b0f896 7546static int
e3bb37b5 7547check_qword_reg (void)
29b0f896
AM
7548{
7549 int op;
252b5132 7550
29b0f896 7551 for (op = i.operands; --op >= 0; )
dc821c5f 7552 /* Skip non-register operands. */
bab6aec1 7553 if (i.types[op].bitfield.class != Reg)
dc821c5f 7554 continue;
29b0f896
AM
7555 /* Reject eight bit registers, except where the template requires
7556 them. (eg. movzb) */
dc821c5f 7557 else if (i.types[op].bitfield.byte
bab6aec1 7558 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7559 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7560 && (i.tm.operand_types[op].bitfield.word
7561 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7562 {
a540244d
L
7563 as_bad (_("`%s%s' not allowed with `%s%c'"),
7564 register_prefix,
29b0f896
AM
7565 i.op[op].regs->reg_name,
7566 i.tm.name,
7567 i.suffix);
7568 return 0;
7569 }
e4630f71 7570 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7571 else if ((i.types[op].bitfield.word
7572 || i.types[op].bitfield.dword)
bab6aec1 7573 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7574 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7575 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7576 {
7577 /* Prohibit these changes in the 64bit mode, since the
7578 lowering is more complicated. */
34828aad 7579 if (intel_syntax
ca61edf2 7580 && i.tm.opcode_modifier.todword
3528c362 7581 && i.types[0].bitfield.class != RegSIMD)
34828aad 7582 {
ca61edf2 7583 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7584 i.suffix = LONG_MNEM_SUFFIX;
7585 }
7586 else
7587 {
2b5d6a91 7588 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7589 register_prefix, i.op[op].regs->reg_name,
7590 i.suffix);
7591 return 0;
7592 }
252b5132 7593 }
29b0f896
AM
7594 return 1;
7595}
252b5132 7596
29b0f896 7597static int
e3bb37b5 7598check_word_reg (void)
29b0f896
AM
7599{
7600 int op;
7601 for (op = i.operands; --op >= 0;)
dc821c5f 7602 /* Skip non-register operands. */
bab6aec1 7603 if (i.types[op].bitfield.class != Reg)
dc821c5f 7604 continue;
29b0f896
AM
7605 /* Reject eight bit registers, except where the template requires
7606 them. (eg. movzb) */
dc821c5f 7607 else if (i.types[op].bitfield.byte
bab6aec1 7608 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7609 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7610 && (i.tm.operand_types[op].bitfield.word
7611 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7612 {
a540244d
L
7613 as_bad (_("`%s%s' not allowed with `%s%c'"),
7614 register_prefix,
29b0f896
AM
7615 i.op[op].regs->reg_name,
7616 i.tm.name,
7617 i.suffix);
7618 return 0;
7619 }
9706160a
JB
7620 /* Error if the e or r prefix on a general reg is present. */
7621 else if ((i.types[op].bitfield.dword
dc821c5f 7622 || i.types[op].bitfield.qword)
bab6aec1 7623 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7624 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7625 && i.tm.operand_types[op].bitfield.word)
252b5132 7626 {
9706160a
JB
7627 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7628 register_prefix, i.op[op].regs->reg_name,
7629 i.suffix);
7630 return 0;
29b0f896
AM
7631 }
7632 return 1;
7633}
252b5132 7634
29b0f896 7635static int
40fb9820 7636update_imm (unsigned int j)
29b0f896 7637{
bc0844ae 7638 i386_operand_type overlap = i.types[j];
40fb9820
L
7639 if ((overlap.bitfield.imm8
7640 || overlap.bitfield.imm8s
7641 || overlap.bitfield.imm16
7642 || overlap.bitfield.imm32
7643 || overlap.bitfield.imm32s
7644 || overlap.bitfield.imm64)
0dfbf9d7
L
7645 && !operand_type_equal (&overlap, &imm8)
7646 && !operand_type_equal (&overlap, &imm8s)
7647 && !operand_type_equal (&overlap, &imm16)
7648 && !operand_type_equal (&overlap, &imm32)
7649 && !operand_type_equal (&overlap, &imm32s)
7650 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7651 {
7652 if (i.suffix)
7653 {
40fb9820
L
7654 i386_operand_type temp;
7655
0dfbf9d7 7656 operand_type_set (&temp, 0);
7ab9ffdd 7657 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7658 {
7659 temp.bitfield.imm8 = overlap.bitfield.imm8;
7660 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7661 }
7662 else if (i.suffix == WORD_MNEM_SUFFIX)
7663 temp.bitfield.imm16 = overlap.bitfield.imm16;
7664 else if (i.suffix == QWORD_MNEM_SUFFIX)
7665 {
7666 temp.bitfield.imm64 = overlap.bitfield.imm64;
7667 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7668 }
7669 else
7670 temp.bitfield.imm32 = overlap.bitfield.imm32;
7671 overlap = temp;
29b0f896 7672 }
0dfbf9d7
L
7673 else if (operand_type_equal (&overlap, &imm16_32_32s)
7674 || operand_type_equal (&overlap, &imm16_32)
7675 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7676 {
40fb9820 7677 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7678 overlap = imm16;
40fb9820 7679 else
65da13b5 7680 overlap = imm32s;
29b0f896 7681 }
8bbb3ad8
JB
7682 else if (i.prefix[REX_PREFIX] & REX_W)
7683 overlap = operand_type_and (overlap, imm32s);
7684 else if (i.prefix[DATA_PREFIX])
7685 overlap = operand_type_and (overlap,
7686 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7687 if (!operand_type_equal (&overlap, &imm8)
7688 && !operand_type_equal (&overlap, &imm8s)
7689 && !operand_type_equal (&overlap, &imm16)
7690 && !operand_type_equal (&overlap, &imm32)
7691 && !operand_type_equal (&overlap, &imm32s)
7692 && !operand_type_equal (&overlap, &imm64))
29b0f896 7693 {
4eed87de
AM
7694 as_bad (_("no instruction mnemonic suffix given; "
7695 "can't determine immediate size"));
29b0f896
AM
7696 return 0;
7697 }
7698 }
40fb9820 7699 i.types[j] = overlap;
29b0f896 7700
40fb9820
L
7701 return 1;
7702}
7703
7704static int
7705finalize_imm (void)
7706{
bc0844ae 7707 unsigned int j, n;
29b0f896 7708
bc0844ae
L
7709 /* Update the first 2 immediate operands. */
7710 n = i.operands > 2 ? 2 : i.operands;
7711 if (n)
7712 {
7713 for (j = 0; j < n; j++)
7714 if (update_imm (j) == 0)
7715 return 0;
40fb9820 7716
bc0844ae
L
7717 /* The 3rd operand can't be immediate operand. */
7718 gas_assert (operand_type_check (i.types[2], imm) == 0);
7719 }
29b0f896
AM
7720
7721 return 1;
7722}
7723
7724static int
e3bb37b5 7725process_operands (void)
29b0f896
AM
7726{
7727 /* Default segment register this instruction will use for memory
7728 accesses. 0 means unknown. This is only for optimizing out
7729 unnecessary segment overrides. */
5e042380 7730 const reg_entry *default_seg = NULL;
29b0f896 7731
a5aeccd9
JB
7732 if (i.tm.opcode_modifier.sse2avx)
7733 {
7734 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7735 need converting. */
7736 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7737 i.prefix[REX_PREFIX] = 0;
7738 i.rex_encoding = 0;
7739 }
c423d21a
JB
7740 /* ImmExt should be processed after SSE2AVX. */
7741 else if (i.tm.opcode_modifier.immext)
7742 process_immext ();
a5aeccd9 7743
2426c15f 7744 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7745 {
91d6fa6a
NC
7746 unsigned int dupl = i.operands;
7747 unsigned int dest = dupl - 1;
9fcfb3d7
L
7748 unsigned int j;
7749
c0f3af97 7750 /* The destination must be an xmm register. */
9c2799c2 7751 gas_assert (i.reg_operands
91d6fa6a 7752 && MAX_OPERANDS > dupl
7ab9ffdd 7753 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7754
75e5731b 7755 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7756 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7757 {
8cd7925b 7758 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7759 {
7760 /* Keep xmm0 for instructions with VEX prefix and 3
7761 sources. */
75e5731b 7762 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7763 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7764 goto duplicate;
7765 }
e2ec9d29 7766 else
c0f3af97
L
7767 {
7768 /* We remove the first xmm0 and keep the number of
7769 operands unchanged, which in fact duplicates the
7770 destination. */
7771 for (j = 1; j < i.operands; j++)
7772 {
7773 i.op[j - 1] = i.op[j];
7774 i.types[j - 1] = i.types[j];
7775 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7776 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7777 }
7778 }
7779 }
7780 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7781 {
91d6fa6a 7782 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7783 && (i.tm.opcode_modifier.vexsources
7784 == VEX3SOURCES));
c0f3af97
L
7785
7786 /* Add the implicit xmm0 for instructions with VEX prefix
7787 and 3 sources. */
7788 for (j = i.operands; j > 0; j--)
7789 {
7790 i.op[j] = i.op[j - 1];
7791 i.types[j] = i.types[j - 1];
7792 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7793 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7794 }
7795 i.op[0].regs
629310ab 7796 = (const reg_entry *) str_hash_find (reg_hash, "xmm0");
7ab9ffdd 7797 i.types[0] = regxmm;
c0f3af97
L
7798 i.tm.operand_types[0] = regxmm;
7799
7800 i.operands += 2;
7801 i.reg_operands += 2;
7802 i.tm.operands += 2;
7803
91d6fa6a 7804 dupl++;
c0f3af97 7805 dest++;
91d6fa6a
NC
7806 i.op[dupl] = i.op[dest];
7807 i.types[dupl] = i.types[dest];
7808 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7809 i.flags[dupl] = i.flags[dest];
e2ec9d29 7810 }
c0f3af97
L
7811 else
7812 {
dc1e8a47 7813 duplicate:
c0f3af97
L
7814 i.operands++;
7815 i.reg_operands++;
7816 i.tm.operands++;
7817
91d6fa6a
NC
7818 i.op[dupl] = i.op[dest];
7819 i.types[dupl] = i.types[dest];
7820 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7821 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7822 }
7823
7824 if (i.tm.opcode_modifier.immext)
7825 process_immext ();
7826 }
75e5731b 7827 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7828 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7829 {
7830 unsigned int j;
7831
9fcfb3d7
L
7832 for (j = 1; j < i.operands; j++)
7833 {
7834 i.op[j - 1] = i.op[j];
7835 i.types[j - 1] = i.types[j];
7836
7837 /* We need to adjust fields in i.tm since they are used by
7838 build_modrm_byte. */
7839 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7840
7841 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7842 }
7843
e2ec9d29
L
7844 i.operands--;
7845 i.reg_operands--;
e2ec9d29
L
7846 i.tm.operands--;
7847 }
920d2ddc
IT
7848 else if (i.tm.opcode_modifier.implicitquadgroup)
7849 {
a477a8c4
JB
7850 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7851
920d2ddc 7852 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7853 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7854 regnum = register_number (i.op[1].regs);
7855 first_reg_in_group = regnum & ~3;
7856 last_reg_in_group = first_reg_in_group + 3;
7857 if (regnum != first_reg_in_group)
7858 as_warn (_("source register `%s%s' implicitly denotes"
7859 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7860 register_prefix, i.op[1].regs->reg_name,
7861 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7862 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7863 i.tm.name);
7864 }
e2ec9d29
L
7865 else if (i.tm.opcode_modifier.regkludge)
7866 {
7867 /* The imul $imm, %reg instruction is converted into
7868 imul $imm, %reg, %reg, and the clr %reg instruction
7869 is converted into xor %reg, %reg. */
7870
7871 unsigned int first_reg_op;
7872
7873 if (operand_type_check (i.types[0], reg))
7874 first_reg_op = 0;
7875 else
7876 first_reg_op = 1;
7877 /* Pretend we saw the extra register operand. */
9c2799c2 7878 gas_assert (i.reg_operands == 1
7ab9ffdd 7879 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7880 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7881 i.types[first_reg_op + 1] = i.types[first_reg_op];
7882 i.operands++;
7883 i.reg_operands++;
29b0f896
AM
7884 }
7885
85b80b0f 7886 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7887 {
7888 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7889 must be put into the modrm byte). Now, we make the modrm and
7890 index base bytes based on all the info we've collected. */
29b0f896
AM
7891
7892 default_seg = build_modrm_byte ();
7893 }
00cee14f 7894 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7895 {
7896 if (flag_code != CODE_64BIT
7897 ? i.tm.base_opcode == POP_SEG_SHORT
7898 && i.op[0].regs->reg_num == 1
389d00a5 7899 : (i.tm.base_opcode | 1) == (POP_SEG386_SHORT & 0xff)
85b80b0f
JB
7900 && i.op[0].regs->reg_num < 4)
7901 {
7902 as_bad (_("you can't `%s %s%s'"),
7903 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7904 return 0;
7905 }
389d00a5
JB
7906 if (i.op[0].regs->reg_num > 3
7907 && i.tm.opcode_modifier.opcodespace == SPACE_BASE )
85b80b0f 7908 {
389d00a5
JB
7909 i.tm.base_opcode ^= (POP_SEG_SHORT ^ POP_SEG386_SHORT) & 0xff;
7910 i.tm.opcode_modifier.opcodespace = SPACE_0F;
85b80b0f
JB
7911 }
7912 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7913 }
389d00a5
JB
7914 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
7915 && (i.tm.base_opcode & ~3) == MOV_AX_DISP32)
29b0f896 7916 {
5e042380 7917 default_seg = reg_ds;
29b0f896 7918 }
40fb9820 7919 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7920 {
7921 /* For the string instructions that allow a segment override
7922 on one of their operands, the default segment is ds. */
5e042380 7923 default_seg = reg_ds;
29b0f896 7924 }
50128d0c 7925 else if (i.short_form)
85b80b0f
JB
7926 {
7927 /* The register or float register operand is in operand
7928 0 or 1. */
bab6aec1 7929 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7930
7931 /* Register goes in low 3 bits of opcode. */
7932 i.tm.base_opcode |= i.op[op].regs->reg_num;
7933 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7934 i.rex |= REX_B;
7935 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7936 {
7937 /* Warn about some common errors, but press on regardless.
7938 The first case can be generated by gcc (<= 2.8.1). */
7939 if (i.operands == 2)
7940 {
7941 /* Reversed arguments on faddp, fsubp, etc. */
7942 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7943 register_prefix, i.op[!intel_syntax].regs->reg_name,
7944 register_prefix, i.op[intel_syntax].regs->reg_name);
7945 }
7946 else
7947 {
7948 /* Extraneous `l' suffix on fp insn. */
7949 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7950 register_prefix, i.op[0].regs->reg_name);
7951 }
7952 }
7953 }
29b0f896 7954
514a8bb0 7955 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0 7956 && i.tm.base_opcode == 0x8d /* lea */
35648716 7957 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
514a8bb0 7958 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7959 {
7960 if (!quiet_warnings)
7961 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7962 if (optimize)
7963 {
7964 i.seg[0] = NULL;
7965 i.prefix[SEG_PREFIX] = 0;
7966 }
7967 }
52271982
AM
7968
7969 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7970 is neither the default nor the one already recorded from a prefix,
7971 use an opcode prefix to select it. If we never figured out what
7972 the default segment is, then default_seg will be zero at this
7973 point, and the specified segment prefix will always be used. */
7974 if (i.seg[0]
7975 && i.seg[0] != default_seg
5e042380 7976 && i386_seg_prefixes[i.seg[0]->reg_num] != i.prefix[SEG_PREFIX])
29b0f896 7977 {
5e042380 7978 if (!add_prefix (i386_seg_prefixes[i.seg[0]->reg_num]))
29b0f896
AM
7979 return 0;
7980 }
7981 return 1;
7982}
7983
a5aeccd9 7984static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
5b7c81bd 7985 bool do_sse2avx)
a5aeccd9
JB
7986{
7987 if (r->reg_flags & RegRex)
7988 {
7989 if (i.rex & rex_bit)
7990 as_bad (_("same type of prefix used twice"));
7991 i.rex |= rex_bit;
7992 }
7993 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7994 {
7995 gas_assert (i.vex.register_specifier == r);
7996 i.vex.register_specifier += 8;
7997 }
7998
7999 if (r->reg_flags & RegVRex)
8000 i.vrex |= rex_bit;
8001}
8002
5e042380 8003static const reg_entry *
e3bb37b5 8004build_modrm_byte (void)
29b0f896 8005{
5e042380 8006 const reg_entry *default_seg = NULL;
c0f3af97 8007 unsigned int source, dest;
8cd7925b 8008 int vex_3_sources;
c0f3af97 8009
8cd7925b 8010 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
8011 if (vex_3_sources)
8012 {
91d6fa6a 8013 unsigned int nds, reg_slot;
4c2c6516 8014 expressionS *exp;
c0f3af97 8015
6b8d3588 8016 dest = i.operands - 1;
c0f3af97 8017 nds = dest - 1;
922d8de8 8018
a683cc34 8019 /* There are 2 kinds of instructions:
bed3d976 8020 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 8021 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 8022 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 8023 ZMM register.
bed3d976 8024 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 8025 plus 1 memory operand, with VexXDS. */
922d8de8 8026 gas_assert ((i.reg_operands == 4
bed3d976
JB
8027 || (i.reg_operands == 3 && i.mem_operands == 1))
8028 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 8029 && i.tm.opcode_modifier.vexw
3528c362 8030 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 8031
48db9223
JB
8032 /* If VexW1 is set, the first non-immediate operand is the source and
8033 the second non-immediate one is encoded in the immediate operand. */
8034 if (i.tm.opcode_modifier.vexw == VEXW1)
8035 {
8036 source = i.imm_operands;
8037 reg_slot = i.imm_operands + 1;
8038 }
8039 else
8040 {
8041 source = i.imm_operands + 1;
8042 reg_slot = i.imm_operands;
8043 }
8044
a683cc34 8045 if (i.imm_operands == 0)
bed3d976
JB
8046 {
8047 /* When there is no immediate operand, generate an 8bit
8048 immediate operand to encode the first operand. */
8049 exp = &im_expressions[i.imm_operands++];
8050 i.op[i.operands].imms = exp;
8051 i.types[i.operands] = imm8;
8052 i.operands++;
8053
3528c362 8054 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
8055 exp->X_op = O_constant;
8056 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
8057 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
8058 }
922d8de8 8059 else
bed3d976 8060 {
9d3bf266
JB
8061 gas_assert (i.imm_operands == 1);
8062 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
8063 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 8064
9d3bf266
JB
8065 /* Turn on Imm8 again so that output_imm will generate it. */
8066 i.types[0].bitfield.imm8 = 1;
bed3d976 8067
3528c362 8068 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 8069 i.op[0].imms->X_add_number
bed3d976 8070 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 8071 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 8072 }
a683cc34 8073
3528c362 8074 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 8075 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
8076 }
8077 else
8078 source = dest = 0;
29b0f896
AM
8079
8080 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
8081 implicit registers do not count. If there are 3 register
8082 operands, it must be a instruction with VexNDS. For a
8083 instruction with VexNDD, the destination register is encoded
8084 in VEX prefix. If there are 4 register operands, it must be
8085 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
8086 if (i.mem_operands == 0
8087 && ((i.reg_operands == 2
2426c15f 8088 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 8089 || (i.reg_operands == 3
2426c15f 8090 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 8091 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 8092 {
cab737b9
L
8093 switch (i.operands)
8094 {
8095 case 2:
8096 source = 0;
8097 break;
8098 case 3:
c81128dc
L
8099 /* When there are 3 operands, one of them may be immediate,
8100 which may be the first or the last operand. Otherwise,
c0f3af97
L
8101 the first operand must be shift count register (cl) or it
8102 is an instruction with VexNDS. */
9c2799c2 8103 gas_assert (i.imm_operands == 1
7ab9ffdd 8104 || (i.imm_operands == 0
2426c15f 8105 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
8106 || (i.types[0].bitfield.instance == RegC
8107 && i.types[0].bitfield.byte))));
40fb9820 8108 if (operand_type_check (i.types[0], imm)
75e5731b
JB
8109 || (i.types[0].bitfield.instance == RegC
8110 && i.types[0].bitfield.byte))
40fb9820
L
8111 source = 1;
8112 else
8113 source = 0;
cab737b9
L
8114 break;
8115 case 4:
368d64cc
L
8116 /* When there are 4 operands, the first two must be 8bit
8117 immediate operands. The source operand will be the 3rd
c0f3af97
L
8118 one.
8119
8120 For instructions with VexNDS, if the first operand
8121 an imm8, the source operand is the 2nd one. If the last
8122 operand is imm8, the source operand is the first one. */
9c2799c2 8123 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
8124 && i.types[0].bitfield.imm8
8125 && i.types[1].bitfield.imm8)
2426c15f 8126 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
8127 && i.imm_operands == 1
8128 && (i.types[0].bitfield.imm8
43234a1e 8129 || i.types[i.operands - 1].bitfield.imm8
ca5312a2 8130 || i.rounding.type != rc_none)));
9f2670f2
L
8131 if (i.imm_operands == 2)
8132 source = 2;
8133 else
c0f3af97
L
8134 {
8135 if (i.types[0].bitfield.imm8)
8136 source = 1;
8137 else
8138 source = 0;
8139 }
c0f3af97
L
8140 break;
8141 case 5:
e771e7c9 8142 if (is_evex_encoding (&i.tm))
43234a1e
L
8143 {
8144 /* For EVEX instructions, when there are 5 operands, the
8145 first one must be immediate operand. If the second one
8146 is immediate operand, the source operand is the 3th
8147 one. If the last one is immediate operand, the source
8148 operand is the 2nd one. */
8149 gas_assert (i.imm_operands == 2
8150 && i.tm.opcode_modifier.sae
8151 && operand_type_check (i.types[0], imm));
8152 if (operand_type_check (i.types[1], imm))
8153 source = 2;
8154 else if (operand_type_check (i.types[4], imm))
8155 source = 1;
8156 else
8157 abort ();
8158 }
cab737b9
L
8159 break;
8160 default:
8161 abort ();
8162 }
8163
c0f3af97
L
8164 if (!vex_3_sources)
8165 {
8166 dest = source + 1;
8167
43234a1e
L
8168 /* RC/SAE operand could be between DEST and SRC. That happens
8169 when one operand is GPR and the other one is XMM/YMM/ZMM
8170 register. */
ca5312a2 8171 if (i.rounding.type != rc_none && i.rounding.operand == dest)
43234a1e
L
8172 dest++;
8173
2426c15f 8174 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 8175 {
43234a1e 8176 /* For instructions with VexNDS, the register-only source
c5d0745b 8177 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 8178 register. It is encoded in VEX prefix. */
f12dc422
L
8179
8180 i386_operand_type op;
8181 unsigned int vvvv;
8182
c2ecccb3
L
8183 /* Swap two source operands if needed. */
8184 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
8185 {
8186 vvvv = source;
8187 source = dest;
8188 }
8189 else
8190 vvvv = dest;
8191
8192 op = i.tm.operand_types[vvvv];
c0f3af97 8193 if ((dest + 1) >= i.operands
bab6aec1 8194 || ((op.bitfield.class != Reg
dc821c5f 8195 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 8196 && op.bitfield.class != RegSIMD
43234a1e 8197 && !operand_type_equal (&op, &regmask)))
c0f3af97 8198 abort ();
f12dc422 8199 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
8200 dest++;
8201 }
8202 }
29b0f896
AM
8203
8204 i.rm.mode = 3;
dfd69174
JB
8205 /* One of the register operands will be encoded in the i.rm.reg
8206 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
8207 fields. If no form of this instruction supports a memory
8208 destination operand, then we assume the source operand may
8209 sometimes be a memory operand and so we need to store the
8210 destination in the i.rm.reg field. */
dfd69174 8211 if (!i.tm.opcode_modifier.regmem
40fb9820 8212 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
8213 {
8214 i.rm.reg = i.op[dest].regs->reg_num;
8215 i.rm.regmem = i.op[source].regs->reg_num;
a5aeccd9 8216 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
5b7c81bd 8217 set_rex_vrex (i.op[source].regs, REX_B, false);
29b0f896
AM
8218 }
8219 else
8220 {
8221 i.rm.reg = i.op[source].regs->reg_num;
8222 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9 8223 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
5b7c81bd 8224 set_rex_vrex (i.op[source].regs, REX_R, false);
29b0f896 8225 }
e0c7f900 8226 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 8227 {
4a5c67ed 8228 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 8229 abort ();
e0c7f900 8230 i.rex &= ~REX_R;
c4a530c5
JB
8231 add_prefix (LOCK_PREFIX_OPCODE);
8232 }
29b0f896
AM
8233 }
8234 else
8235 { /* If it's not 2 reg operands... */
c0f3af97
L
8236 unsigned int mem;
8237
29b0f896
AM
8238 if (i.mem_operands)
8239 {
8240 unsigned int fake_zero_displacement = 0;
99018f42 8241 unsigned int op;
4eed87de 8242
7ab9ffdd 8243 for (op = 0; op < i.operands; op++)
8dc0818e 8244 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8245 break;
7ab9ffdd 8246 gas_assert (op < i.operands);
29b0f896 8247
63112cd6 8248 if (i.tm.opcode_modifier.sib)
6c30d220 8249 {
260cd341
LC
8250 /* The index register of VSIB shouldn't be RegIZ. */
8251 if (i.tm.opcode_modifier.sib != SIBMEM
8252 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8253 abort ();
8254
8255 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8256 if (!i.base_reg)
8257 {
8258 i.sib.base = NO_BASE_REGISTER;
8259 i.sib.scale = i.log2_scale_factor;
8260 i.types[op].bitfield.disp8 = 0;
8261 i.types[op].bitfield.disp16 = 0;
8262 i.types[op].bitfield.disp64 = 0;
a9aabc23 8263 if (want_disp32 (&i.tm))
6c30d220
L
8264 {
8265 /* Must be 32 bit */
8266 i.types[op].bitfield.disp32 = 1;
8267 i.types[op].bitfield.disp32s = 0;
8268 }
8269 else
8270 {
8271 i.types[op].bitfield.disp32 = 0;
8272 i.types[op].bitfield.disp32s = 1;
8273 }
8274 }
260cd341
LC
8275
8276 /* Since the mandatory SIB always has index register, so
8277 the code logic remains unchanged. The non-mandatory SIB
8278 without index register is allowed and will be handled
8279 later. */
8280 if (i.index_reg)
8281 {
8282 if (i.index_reg->reg_num == RegIZ)
8283 i.sib.index = NO_INDEX_REGISTER;
8284 else
8285 i.sib.index = i.index_reg->reg_num;
5b7c81bd 8286 set_rex_vrex (i.index_reg, REX_X, false);
260cd341 8287 }
6c30d220
L
8288 }
8289
5e042380 8290 default_seg = reg_ds;
29b0f896
AM
8291
8292 if (i.base_reg == 0)
8293 {
8294 i.rm.mode = 0;
8295 if (!i.disp_operands)
9bb129e8 8296 fake_zero_displacement = 1;
29b0f896
AM
8297 if (i.index_reg == 0)
8298 {
73053c1f
JB
8299 i386_operand_type newdisp;
8300
260cd341
LC
8301 /* Both check for VSIB and mandatory non-vector SIB. */
8302 gas_assert (!i.tm.opcode_modifier.sib
8303 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8304 /* Operand is just <disp> */
20f0a1fc 8305 if (flag_code == CODE_64BIT)
29b0f896
AM
8306 {
8307 /* 64bit mode overwrites the 32bit absolute
8308 addressing by RIP relative addressing and
8309 absolute addressing is encoded by one of the
8310 redundant SIB forms. */
8311 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8312 i.sib.base = NO_BASE_REGISTER;
8313 i.sib.index = NO_INDEX_REGISTER;
a9aabc23 8314 newdisp = (want_disp32(&i.tm) ? disp32 : disp32s);
20f0a1fc 8315 }
fc225355
L
8316 else if ((flag_code == CODE_16BIT)
8317 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8318 {
8319 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8320 newdisp = disp16;
20f0a1fc
NC
8321 }
8322 else
8323 {
8324 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8325 newdisp = disp32;
29b0f896 8326 }
73053c1f
JB
8327 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8328 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8329 }
63112cd6 8330 else if (!i.tm.opcode_modifier.sib)
29b0f896 8331 {
6c30d220 8332 /* !i.base_reg && i.index_reg */
e968fc9b 8333 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8334 i.sib.index = NO_INDEX_REGISTER;
8335 else
8336 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8337 i.sib.base = NO_BASE_REGISTER;
8338 i.sib.scale = i.log2_scale_factor;
8339 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8340 i.types[op].bitfield.disp8 = 0;
8341 i.types[op].bitfield.disp16 = 0;
8342 i.types[op].bitfield.disp64 = 0;
a9aabc23 8343 if (want_disp32 (&i.tm))
40fb9820
L
8344 {
8345 /* Must be 32 bit */
8346 i.types[op].bitfield.disp32 = 1;
8347 i.types[op].bitfield.disp32s = 0;
8348 }
29b0f896 8349 else
40fb9820
L
8350 {
8351 i.types[op].bitfield.disp32 = 0;
8352 i.types[op].bitfield.disp32s = 1;
8353 }
29b0f896 8354 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8355 i.rex |= REX_X;
29b0f896
AM
8356 }
8357 }
8358 /* RIP addressing for 64bit mode. */
e968fc9b 8359 else if (i.base_reg->reg_num == RegIP)
29b0f896 8360 {
63112cd6 8361 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8362 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8363 i.types[op].bitfield.disp8 = 0;
8364 i.types[op].bitfield.disp16 = 0;
8365 i.types[op].bitfield.disp32 = 0;
8366 i.types[op].bitfield.disp32s = 1;
8367 i.types[op].bitfield.disp64 = 0;
71903a11 8368 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8369 if (! i.disp_operands)
8370 fake_zero_displacement = 1;
29b0f896 8371 }
dc821c5f 8372 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8373 {
63112cd6 8374 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8375 switch (i.base_reg->reg_num)
8376 {
8377 case 3: /* (%bx) */
8378 if (i.index_reg == 0)
8379 i.rm.regmem = 7;
8380 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8381 i.rm.regmem = i.index_reg->reg_num - 6;
8382 break;
8383 case 5: /* (%bp) */
5e042380 8384 default_seg = reg_ss;
29b0f896
AM
8385 if (i.index_reg == 0)
8386 {
8387 i.rm.regmem = 6;
40fb9820 8388 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8389 {
8390 /* fake (%bp) into 0(%bp) */
41eb8e88 8391 if (i.disp_encoding == disp_encoding_16bit)
1a02d6b0
L
8392 i.types[op].bitfield.disp16 = 1;
8393 else
8394 i.types[op].bitfield.disp8 = 1;
252b5132 8395 fake_zero_displacement = 1;
29b0f896
AM
8396 }
8397 }
8398 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8399 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8400 break;
8401 default: /* (%si) -> 4 or (%di) -> 5 */
8402 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8403 }
41eb8e88
L
8404 if (!fake_zero_displacement
8405 && !i.disp_operands
8406 && i.disp_encoding)
8407 {
8408 fake_zero_displacement = 1;
8409 if (i.disp_encoding == disp_encoding_8bit)
8410 i.types[op].bitfield.disp8 = 1;
8411 else
8412 i.types[op].bitfield.disp16 = 1;
8413 }
29b0f896
AM
8414 i.rm.mode = mode_from_disp_size (i.types[op]);
8415 }
8416 else /* i.base_reg and 32/64 bit mode */
8417 {
a9aabc23 8418 if (operand_type_check (i.types[op], disp))
40fb9820 8419 {
73053c1f
JB
8420 i.types[op].bitfield.disp16 = 0;
8421 i.types[op].bitfield.disp64 = 0;
a9aabc23 8422 if (!want_disp32 (&i.tm))
73053c1f
JB
8423 {
8424 i.types[op].bitfield.disp32 = 0;
8425 i.types[op].bitfield.disp32s = 1;
8426 }
40fb9820 8427 else
73053c1f
JB
8428 {
8429 i.types[op].bitfield.disp32 = 1;
8430 i.types[op].bitfield.disp32s = 0;
8431 }
40fb9820 8432 }
20f0a1fc 8433
63112cd6 8434 if (!i.tm.opcode_modifier.sib)
6c30d220 8435 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8436 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8437 i.rex |= REX_B;
29b0f896
AM
8438 i.sib.base = i.base_reg->reg_num;
8439 /* x86-64 ignores REX prefix bit here to avoid decoder
8440 complications. */
848930b2
JB
8441 if (!(i.base_reg->reg_flags & RegRex)
8442 && (i.base_reg->reg_num == EBP_REG_NUM
8443 || i.base_reg->reg_num == ESP_REG_NUM))
5e042380 8444 default_seg = reg_ss;
848930b2 8445 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8446 {
848930b2 8447 fake_zero_displacement = 1;
1a02d6b0
L
8448 if (i.disp_encoding == disp_encoding_32bit)
8449 i.types[op].bitfield.disp32 = 1;
8450 else
8451 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8452 }
8453 i.sib.scale = i.log2_scale_factor;
8454 if (i.index_reg == 0)
8455 {
260cd341
LC
8456 /* Only check for VSIB. */
8457 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8458 && i.tm.opcode_modifier.sib != VECSIB256
8459 && i.tm.opcode_modifier.sib != VECSIB512);
8460
29b0f896
AM
8461 /* <disp>(%esp) becomes two byte modrm with no index
8462 register. We've already stored the code for esp
8463 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8464 Any base register besides %esp will not use the
8465 extra modrm byte. */
8466 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8467 }
63112cd6 8468 else if (!i.tm.opcode_modifier.sib)
29b0f896 8469 {
e968fc9b 8470 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8471 i.sib.index = NO_INDEX_REGISTER;
8472 else
8473 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8474 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8475 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8476 i.rex |= REX_X;
29b0f896 8477 }
67a4f2b7
AO
8478
8479 if (i.disp_operands
8480 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8481 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8482 i.rm.mode = 0;
8483 else
a501d77e
L
8484 {
8485 if (!fake_zero_displacement
8486 && !i.disp_operands
8487 && i.disp_encoding)
8488 {
8489 fake_zero_displacement = 1;
8490 if (i.disp_encoding == disp_encoding_8bit)
8491 i.types[op].bitfield.disp8 = 1;
8492 else
8493 i.types[op].bitfield.disp32 = 1;
8494 }
8495 i.rm.mode = mode_from_disp_size (i.types[op]);
8496 }
29b0f896 8497 }
252b5132 8498
29b0f896
AM
8499 if (fake_zero_displacement)
8500 {
8501 /* Fakes a zero displacement assuming that i.types[op]
8502 holds the correct displacement size. */
8503 expressionS *exp;
8504
9c2799c2 8505 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8506 exp = &disp_expressions[i.disp_operands++];
8507 i.op[op].disps = exp;
8508 exp->X_op = O_constant;
8509 exp->X_add_number = 0;
8510 exp->X_add_symbol = (symbolS *) 0;
8511 exp->X_op_symbol = (symbolS *) 0;
8512 }
c0f3af97
L
8513
8514 mem = op;
29b0f896 8515 }
c0f3af97
L
8516 else
8517 mem = ~0;
252b5132 8518
8c43a48b 8519 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8520 {
8521 if (operand_type_check (i.types[0], imm))
8522 i.vex.register_specifier = NULL;
8523 else
8524 {
8525 /* VEX.vvvv encodes one of the sources when the first
8526 operand is not an immediate. */
1ef99a7b 8527 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8528 i.vex.register_specifier = i.op[0].regs;
8529 else
8530 i.vex.register_specifier = i.op[1].regs;
8531 }
8532
8533 /* Destination is a XMM register encoded in the ModRM.reg
8534 and VEX.R bit. */
8535 i.rm.reg = i.op[2].regs->reg_num;
8536 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8537 i.rex |= REX_R;
8538
8539 /* ModRM.rm and VEX.B encodes the other source. */
8540 if (!i.mem_operands)
8541 {
8542 i.rm.mode = 3;
8543
1ef99a7b 8544 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8545 i.rm.regmem = i.op[1].regs->reg_num;
8546 else
8547 i.rm.regmem = i.op[0].regs->reg_num;
8548
8549 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8550 i.rex |= REX_B;
8551 }
8552 }
2426c15f 8553 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8554 {
8555 i.vex.register_specifier = i.op[2].regs;
8556 if (!i.mem_operands)
8557 {
8558 i.rm.mode = 3;
8559 i.rm.regmem = i.op[1].regs->reg_num;
8560 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8561 i.rex |= REX_B;
8562 }
8563 }
29b0f896
AM
8564 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8565 (if any) based on i.tm.extension_opcode. Again, we must be
8566 careful to make sure that segment/control/debug/test/MMX
8567 registers are coded into the i.rm.reg field. */
f88c9eb0 8568 else if (i.reg_operands)
29b0f896 8569 {
99018f42 8570 unsigned int op;
7ab9ffdd
L
8571 unsigned int vex_reg = ~0;
8572
8573 for (op = 0; op < i.operands; op++)
921eafea
L
8574 if (i.types[op].bitfield.class == Reg
8575 || i.types[op].bitfield.class == RegBND
8576 || i.types[op].bitfield.class == RegMask
8577 || i.types[op].bitfield.class == SReg
8578 || i.types[op].bitfield.class == RegCR
8579 || i.types[op].bitfield.class == RegDR
8580 || i.types[op].bitfield.class == RegTR
8581 || i.types[op].bitfield.class == RegSIMD
8582 || i.types[op].bitfield.class == RegMMX)
8583 break;
c0209578 8584
7ab9ffdd
L
8585 if (vex_3_sources)
8586 op = dest;
2426c15f 8587 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8588 {
8589 /* For instructions with VexNDS, the register-only
8590 source operand is encoded in VEX prefix. */
8591 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8592
7ab9ffdd 8593 if (op > mem)
c0f3af97 8594 {
7ab9ffdd
L
8595 vex_reg = op++;
8596 gas_assert (op < i.operands);
c0f3af97
L
8597 }
8598 else
c0f3af97 8599 {
f12dc422
L
8600 /* Check register-only source operand when two source
8601 operands are swapped. */
8602 if (!i.tm.operand_types[op].bitfield.baseindex
8603 && i.tm.operand_types[op + 1].bitfield.baseindex)
8604 {
8605 vex_reg = op;
8606 op += 2;
8607 gas_assert (mem == (vex_reg + 1)
8608 && op < i.operands);
8609 }
8610 else
8611 {
8612 vex_reg = op + 1;
8613 gas_assert (vex_reg < i.operands);
8614 }
c0f3af97 8615 }
7ab9ffdd 8616 }
2426c15f 8617 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8618 {
f12dc422 8619 /* For instructions with VexNDD, the register destination
7ab9ffdd 8620 is encoded in VEX prefix. */
f12dc422
L
8621 if (i.mem_operands == 0)
8622 {
8623 /* There is no memory operand. */
8624 gas_assert ((op + 2) == i.operands);
8625 vex_reg = op + 1;
8626 }
8627 else
8d63c93e 8628 {
ed438a93
JB
8629 /* There are only 2 non-immediate operands. */
8630 gas_assert (op < i.imm_operands + 2
8631 && i.operands == i.imm_operands + 2);
8632 vex_reg = i.imm_operands + 1;
f12dc422 8633 }
7ab9ffdd
L
8634 }
8635 else
8636 gas_assert (op < i.operands);
99018f42 8637
7ab9ffdd
L
8638 if (vex_reg != (unsigned int) ~0)
8639 {
f12dc422 8640 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8641
bab6aec1 8642 if ((type->bitfield.class != Reg
dc821c5f 8643 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8644 && type->bitfield.class != RegSIMD
43234a1e 8645 && !operand_type_equal (type, &regmask))
7ab9ffdd 8646 abort ();
f88c9eb0 8647
7ab9ffdd
L
8648 i.vex.register_specifier = i.op[vex_reg].regs;
8649 }
8650
1b9f0c97
L
8651 /* Don't set OP operand twice. */
8652 if (vex_reg != op)
7ab9ffdd 8653 {
1b9f0c97
L
8654 /* If there is an extension opcode to put here, the
8655 register number must be put into the regmem field. */
8656 if (i.tm.extension_opcode != None)
8657 {
8658 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8659 set_rex_vrex (i.op[op].regs, REX_B,
8660 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8661 }
8662 else
8663 {
8664 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8665 set_rex_vrex (i.op[op].regs, REX_R,
8666 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8667 }
7ab9ffdd 8668 }
252b5132 8669
29b0f896
AM
8670 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8671 must set it to 3 to indicate this is a register operand
8672 in the regmem field. */
8673 if (!i.mem_operands)
8674 i.rm.mode = 3;
8675 }
252b5132 8676
29b0f896 8677 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8678 if (i.tm.extension_opcode != None)
29b0f896
AM
8679 i.rm.reg = i.tm.extension_opcode;
8680 }
8681 return default_seg;
8682}
252b5132 8683
48ef937e
JB
8684static INLINE void
8685frag_opcode_byte (unsigned char byte)
8686{
8687 if (now_seg != absolute_section)
8688 FRAG_APPEND_1_CHAR (byte);
8689 else
8690 ++abs_section_offset;
8691}
8692
376cd056
JB
8693static unsigned int
8694flip_code16 (unsigned int code16)
8695{
8696 gas_assert (i.tm.operands == 1);
8697
8698 return !(i.prefix[REX_PREFIX] & REX_W)
8699 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8700 || i.tm.operand_types[0].bitfield.disp32s
8701 : i.tm.operand_types[0].bitfield.disp16)
8702 ? CODE16 : 0;
8703}
8704
29b0f896 8705static void
e3bb37b5 8706output_branch (void)
29b0f896
AM
8707{
8708 char *p;
f8a5c266 8709 int size;
29b0f896
AM
8710 int code16;
8711 int prefix;
8712 relax_substateT subtype;
8713 symbolS *sym;
8714 offsetT off;
8715
48ef937e
JB
8716 if (now_seg == absolute_section)
8717 {
8718 as_bad (_("relaxable branches not supported in absolute section"));
8719 return;
8720 }
8721
f8a5c266 8722 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8723 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8724
8725 prefix = 0;
8726 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8727 {
29b0f896
AM
8728 prefix = 1;
8729 i.prefixes -= 1;
376cd056 8730 code16 ^= flip_code16(code16);
252b5132 8731 }
29b0f896
AM
8732 /* Pentium4 branch hints. */
8733 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8734 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8735 {
29b0f896
AM
8736 prefix++;
8737 i.prefixes--;
8738 }
8739 if (i.prefix[REX_PREFIX] != 0)
8740 {
8741 prefix++;
8742 i.prefixes--;
2f66722d
AM
8743 }
8744
7e8b059b
L
8745 /* BND prefixed jump. */
8746 if (i.prefix[BND_PREFIX] != 0)
8747 {
6cb0a70e
JB
8748 prefix++;
8749 i.prefixes--;
7e8b059b
L
8750 }
8751
f2810fe0
JB
8752 if (i.prefixes != 0)
8753 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8754
8755 /* It's always a symbol; End frag & setup for relax.
8756 Make sure there is enough room in this frag for the largest
8757 instruction we may generate in md_convert_frag. This is 2
8758 bytes for the opcode and room for the prefix and largest
8759 displacement. */
8760 frag_grow (prefix + 2 + 4);
8761 /* Prefix and 1 opcode byte go in fr_fix. */
8762 p = frag_more (prefix + 1);
8763 if (i.prefix[DATA_PREFIX] != 0)
8764 *p++ = DATA_PREFIX_OPCODE;
8765 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8766 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8767 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8768 if (i.prefix[BND_PREFIX] != 0)
8769 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8770 if (i.prefix[REX_PREFIX] != 0)
8771 *p++ = i.prefix[REX_PREFIX];
8772 *p = i.tm.base_opcode;
8773
8774 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8775 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8776 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8777 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8778 else
f8a5c266 8779 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8780 subtype |= code16;
3e73aa7c 8781
29b0f896
AM
8782 sym = i.op[0].disps->X_add_symbol;
8783 off = i.op[0].disps->X_add_number;
3e73aa7c 8784
29b0f896
AM
8785 if (i.op[0].disps->X_op != O_constant
8786 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8787 {
29b0f896
AM
8788 /* Handle complex expressions. */
8789 sym = make_expr_symbol (i.op[0].disps);
8790 off = 0;
8791 }
3e73aa7c 8792
29b0f896
AM
8793 /* 1 possible extra opcode + 4 byte displacement go in var part.
8794 Pass reloc in fr_var. */
d258b828 8795 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8796}
3e73aa7c 8797
bd7ab16b
L
8798#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8799/* Return TRUE iff PLT32 relocation should be used for branching to
8800 symbol S. */
8801
5b7c81bd 8802static bool
bd7ab16b
L
8803need_plt32_p (symbolS *s)
8804{
8805 /* PLT32 relocation is ELF only. */
8806 if (!IS_ELF)
5b7c81bd 8807 return false;
bd7ab16b 8808
a5def729
RO
8809#ifdef TE_SOLARIS
8810 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8811 krtld support it. */
5b7c81bd 8812 return false;
a5def729
RO
8813#endif
8814
bd7ab16b
L
8815 /* Since there is no need to prepare for PLT branch on x86-64, we
8816 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8817 be used as a marker for 32-bit PC-relative branches. */
8818 if (!object_64bit)
5b7c81bd 8819 return false;
bd7ab16b 8820
44365e88 8821 if (s == NULL)
5b7c81bd 8822 return false;
44365e88 8823
bd7ab16b
L
8824 /* Weak or undefined symbol need PLT32 relocation. */
8825 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
5b7c81bd 8826 return true;
bd7ab16b
L
8827
8828 /* Non-global symbol doesn't need PLT32 relocation. */
8829 if (! S_IS_EXTERNAL (s))
5b7c81bd 8830 return false;
bd7ab16b
L
8831
8832 /* Other global symbols need PLT32 relocation. NB: Symbol with
8833 non-default visibilities are treated as normal global symbol
8834 so that PLT32 relocation can be used as a marker for 32-bit
8835 PC-relative branches. It is useful for linker relaxation. */
5b7c81bd 8836 return true;
bd7ab16b
L
8837}
8838#endif
8839
29b0f896 8840static void
e3bb37b5 8841output_jump (void)
29b0f896
AM
8842{
8843 char *p;
8844 int size;
3e02c1cc 8845 fixS *fixP;
bd7ab16b 8846 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8847
0cfa3eb3 8848 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8849 {
8850 /* This is a loop or jecxz type instruction. */
8851 size = 1;
8852 if (i.prefix[ADDR_PREFIX] != 0)
8853 {
48ef937e 8854 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
8855 i.prefixes -= 1;
8856 }
8857 /* Pentium4 branch hints. */
8858 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8859 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8860 {
48ef937e 8861 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 8862 i.prefixes--;
3e73aa7c
JH
8863 }
8864 }
29b0f896
AM
8865 else
8866 {
8867 int code16;
3e73aa7c 8868
29b0f896
AM
8869 code16 = 0;
8870 if (flag_code == CODE_16BIT)
8871 code16 = CODE16;
3e73aa7c 8872
29b0f896
AM
8873 if (i.prefix[DATA_PREFIX] != 0)
8874 {
48ef937e 8875 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 8876 i.prefixes -= 1;
376cd056 8877 code16 ^= flip_code16(code16);
29b0f896 8878 }
252b5132 8879
29b0f896
AM
8880 size = 4;
8881 if (code16)
8882 size = 2;
8883 }
9fcc94b6 8884
6cb0a70e
JB
8885 /* BND prefixed jump. */
8886 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8887 {
48ef937e 8888 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
8889 i.prefixes -= 1;
8890 }
252b5132 8891
6cb0a70e 8892 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8893 {
48ef937e 8894 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
8895 i.prefixes -= 1;
8896 }
8897
f2810fe0
JB
8898 if (i.prefixes != 0)
8899 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8900
48ef937e
JB
8901 if (now_seg == absolute_section)
8902 {
9a182d04 8903 abs_section_offset += i.opcode_length + size;
48ef937e
JB
8904 return;
8905 }
8906
9a182d04
JB
8907 p = frag_more (i.opcode_length + size);
8908 switch (i.opcode_length)
42164a71
L
8909 {
8910 case 2:
8911 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8912 /* Fall through. */
42164a71
L
8913 case 1:
8914 *p++ = i.tm.base_opcode;
8915 break;
8916 default:
8917 abort ();
8918 }
e0890092 8919
bd7ab16b
L
8920#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8921 if (size == 4
8922 && jump_reloc == NO_RELOC
8923 && need_plt32_p (i.op[0].disps->X_add_symbol))
8924 jump_reloc = BFD_RELOC_X86_64_PLT32;
8925#endif
8926
8927 jump_reloc = reloc (size, 1, 1, jump_reloc);
8928
3e02c1cc 8929 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8930 i.op[0].disps, 1, jump_reloc);
3e02c1cc 8931
eb19308f
JB
8932 /* All jumps handled here are signed, but don't unconditionally use a
8933 signed limit check for 32 and 16 bit jumps as we want to allow wrap
8934 around at 4G (outside of 64-bit mode) and 64k (except for XBEGIN)
8935 respectively. */
8936 switch (size)
8937 {
8938 case 1:
8939 fixP->fx_signed = 1;
8940 break;
8941
8942 case 2:
8943 if (i.tm.base_opcode == 0xc7f8)
8944 fixP->fx_signed = 1;
8945 break;
8946
8947 case 4:
8948 if (flag_code == CODE_64BIT)
8949 fixP->fx_signed = 1;
8950 break;
8951 }
29b0f896 8952}
e0890092 8953
29b0f896 8954static void
e3bb37b5 8955output_interseg_jump (void)
29b0f896
AM
8956{
8957 char *p;
8958 int size;
8959 int prefix;
8960 int code16;
252b5132 8961
29b0f896
AM
8962 code16 = 0;
8963 if (flag_code == CODE_16BIT)
8964 code16 = CODE16;
a217f122 8965
29b0f896
AM
8966 prefix = 0;
8967 if (i.prefix[DATA_PREFIX] != 0)
8968 {
8969 prefix = 1;
8970 i.prefixes -= 1;
8971 code16 ^= CODE16;
8972 }
6cb0a70e
JB
8973
8974 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8975
29b0f896
AM
8976 size = 4;
8977 if (code16)
8978 size = 2;
252b5132 8979
f2810fe0
JB
8980 if (i.prefixes != 0)
8981 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8982
48ef937e
JB
8983 if (now_seg == absolute_section)
8984 {
8985 abs_section_offset += prefix + 1 + 2 + size;
8986 return;
8987 }
8988
29b0f896
AM
8989 /* 1 opcode; 2 segment; offset */
8990 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8991
29b0f896
AM
8992 if (i.prefix[DATA_PREFIX] != 0)
8993 *p++ = DATA_PREFIX_OPCODE;
252b5132 8994
29b0f896
AM
8995 if (i.prefix[REX_PREFIX] != 0)
8996 *p++ = i.prefix[REX_PREFIX];
252b5132 8997
29b0f896
AM
8998 *p++ = i.tm.base_opcode;
8999 if (i.op[1].imms->X_op == O_constant)
9000 {
9001 offsetT n = i.op[1].imms->X_add_number;
252b5132 9002
29b0f896
AM
9003 if (size == 2
9004 && !fits_in_unsigned_word (n)
9005 && !fits_in_signed_word (n))
9006 {
9007 as_bad (_("16-bit jump out of range"));
9008 return;
9009 }
9010 md_number_to_chars (p, n, size);
9011 }
9012 else
9013 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 9014 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
6d96a594
C
9015
9016 p += size;
9017 if (i.op[0].imms->X_op == O_constant)
9018 md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2);
9019 else
9020 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
9021 i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0]));
29b0f896 9022}
a217f122 9023
b4a3a7b4
L
9024#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9025void
9026x86_cleanup (void)
9027{
9028 char *p;
9029 asection *seg = now_seg;
9030 subsegT subseg = now_subseg;
9031 asection *sec;
9032 unsigned int alignment, align_size_1;
9033 unsigned int isa_1_descsz, feature_2_descsz, descsz;
9034 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
9035 unsigned int padding;
9036
9037 if (!IS_ELF || !x86_used_note)
9038 return;
9039
b4a3a7b4
L
9040 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
9041
9042 /* The .note.gnu.property section layout:
9043
9044 Field Length Contents
9045 ---- ---- ----
9046 n_namsz 4 4
9047 n_descsz 4 The note descriptor size
9048 n_type 4 NT_GNU_PROPERTY_TYPE_0
9049 n_name 4 "GNU"
9050 n_desc n_descsz The program property array
9051 .... .... ....
9052 */
9053
9054 /* Create the .note.gnu.property section. */
9055 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 9056 bfd_set_section_flags (sec,
b4a3a7b4
L
9057 (SEC_ALLOC
9058 | SEC_LOAD
9059 | SEC_DATA
9060 | SEC_HAS_CONTENTS
9061 | SEC_READONLY));
9062
9063 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
9064 {
9065 align_size_1 = 7;
9066 alignment = 3;
9067 }
9068 else
9069 {
9070 align_size_1 = 3;
9071 alignment = 2;
9072 }
9073
fd361982 9074 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
9075 elf_section_type (sec) = SHT_NOTE;
9076
9077 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
9078 + 4-byte data */
9079 isa_1_descsz_raw = 4 + 4 + 4;
9080 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
9081 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
9082
9083 feature_2_descsz_raw = isa_1_descsz;
9084 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
9085 + 4-byte data */
9086 feature_2_descsz_raw += 4 + 4 + 4;
9087 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
9088 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
9089 & ~align_size_1);
9090
9091 descsz = feature_2_descsz;
9092 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
9093 p = frag_more (4 + 4 + 4 + 4 + descsz);
9094
9095 /* Write n_namsz. */
9096 md_number_to_chars (p, (valueT) 4, 4);
9097
9098 /* Write n_descsz. */
9099 md_number_to_chars (p + 4, (valueT) descsz, 4);
9100
9101 /* Write n_type. */
9102 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
9103
9104 /* Write n_name. */
9105 memcpy (p + 4 * 3, "GNU", 4);
9106
9107 /* Write 4-byte type. */
9108 md_number_to_chars (p + 4 * 4,
9109 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
9110
9111 /* Write 4-byte data size. */
9112 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
9113
9114 /* Write 4-byte data. */
9115 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
9116
9117 /* Zero out paddings. */
9118 padding = isa_1_descsz - isa_1_descsz_raw;
9119 if (padding)
9120 memset (p + 4 * 7, 0, padding);
9121
9122 /* Write 4-byte type. */
9123 md_number_to_chars (p + isa_1_descsz + 4 * 4,
9124 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
9125
9126 /* Write 4-byte data size. */
9127 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
9128
9129 /* Write 4-byte data. */
9130 md_number_to_chars (p + isa_1_descsz + 4 * 6,
9131 (valueT) x86_feature_2_used, 4);
9132
9133 /* Zero out paddings. */
9134 padding = feature_2_descsz - feature_2_descsz_raw;
9135 if (padding)
9136 memset (p + isa_1_descsz + 4 * 7, 0, padding);
9137
9138 /* We probably can't restore the current segment, for there likely
9139 isn't one yet... */
9140 if (seg && subseg)
9141 subseg_set (seg, subseg);
9142}
9143#endif
9144
9c33702b
JB
9145static unsigned int
9146encoding_length (const fragS *start_frag, offsetT start_off,
9147 const char *frag_now_ptr)
9148{
9149 unsigned int len = 0;
9150
9151 if (start_frag != frag_now)
9152 {
9153 const fragS *fr = start_frag;
9154
9155 do {
9156 len += fr->fr_fix;
9157 fr = fr->fr_next;
9158 } while (fr && fr != frag_now);
9159 }
9160
9161 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
9162}
9163
e379e5f3 9164/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
9165 be macro-fused with conditional jumps.
9166 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
9167 or is one of the following format:
9168
9169 cmp m, imm
9170 add m, imm
9171 sub m, imm
9172 test m, imm
9173 and m, imm
9174 inc m
9175 dec m
9176
9177 it is unfusible. */
e379e5f3
L
9178
9179static int
79d72f45 9180maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9181{
9182 /* No RIP address. */
9183 if (i.base_reg && i.base_reg->reg_num == RegIP)
9184 return 0;
9185
389d00a5
JB
9186 /* No opcodes outside of base encoding space. */
9187 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
9188 return 0;
9189
79d72f45
HL
9190 /* add, sub without add/sub m, imm. */
9191 if (i.tm.base_opcode <= 5
e379e5f3
L
9192 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
9193 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 9194 && (i.tm.extension_opcode == 0x5
e379e5f3 9195 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
9196 {
9197 *mf_cmp_p = mf_cmp_alu_cmp;
9198 return !(i.mem_operands && i.imm_operands);
9199 }
e379e5f3 9200
79d72f45
HL
9201 /* and without and m, imm. */
9202 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
9203 || ((i.tm.base_opcode | 3) == 0x83
9204 && i.tm.extension_opcode == 0x4))
9205 {
9206 *mf_cmp_p = mf_cmp_test_and;
9207 return !(i.mem_operands && i.imm_operands);
9208 }
9209
9210 /* test without test m imm. */
e379e5f3
L
9211 if ((i.tm.base_opcode | 1) == 0x85
9212 || (i.tm.base_opcode | 1) == 0xa9
9213 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
9214 && i.tm.extension_opcode == 0))
9215 {
9216 *mf_cmp_p = mf_cmp_test_and;
9217 return !(i.mem_operands && i.imm_operands);
9218 }
9219
9220 /* cmp without cmp m, imm. */
9221 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
9222 || ((i.tm.base_opcode | 3) == 0x83
9223 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
9224 {
9225 *mf_cmp_p = mf_cmp_alu_cmp;
9226 return !(i.mem_operands && i.imm_operands);
9227 }
e379e5f3 9228
79d72f45 9229 /* inc, dec without inc/dec m. */
e379e5f3
L
9230 if ((i.tm.cpu_flags.bitfield.cpuno64
9231 && (i.tm.base_opcode | 0xf) == 0x4f)
9232 || ((i.tm.base_opcode | 1) == 0xff
9233 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
9234 {
9235 *mf_cmp_p = mf_cmp_incdec;
9236 return !i.mem_operands;
9237 }
e379e5f3
L
9238
9239 return 0;
9240}
9241
9242/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
9243
9244static int
79d72f45 9245add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9246{
9247 /* NB: Don't work with COND_JUMP86 without i386. */
9248 if (!align_branch_power
9249 || now_seg == absolute_section
9250 || !cpu_arch_flags.bitfield.cpui386
9251 || !(align_branch & align_branch_fused_bit))
9252 return 0;
9253
79d72f45 9254 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
9255 {
9256 if (last_insn.kind == last_insn_other
9257 || last_insn.seg != now_seg)
9258 return 1;
9259 if (flag_debug)
9260 as_warn_where (last_insn.file, last_insn.line,
9261 _("`%s` skips -malign-branch-boundary on `%s`"),
9262 last_insn.name, i.tm.name);
9263 }
9264
9265 return 0;
9266}
9267
9268/* Return 1 if a BRANCH_PREFIX frag should be generated. */
9269
9270static int
9271add_branch_prefix_frag_p (void)
9272{
9273 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
9274 to PadLock instructions since they include prefixes in opcode. */
9275 if (!align_branch_power
9276 || !align_branch_prefix_size
9277 || now_seg == absolute_section
9278 || i.tm.cpu_flags.bitfield.cpupadlock
9279 || !cpu_arch_flags.bitfield.cpui386)
9280 return 0;
9281
9282 /* Don't add prefix if it is a prefix or there is no operand in case
9283 that segment prefix is special. */
9284 if (!i.operands || i.tm.opcode_modifier.isprefix)
9285 return 0;
9286
9287 if (last_insn.kind == last_insn_other
9288 || last_insn.seg != now_seg)
9289 return 1;
9290
9291 if (flag_debug)
9292 as_warn_where (last_insn.file, last_insn.line,
9293 _("`%s` skips -malign-branch-boundary on `%s`"),
9294 last_insn.name, i.tm.name);
9295
9296 return 0;
9297}
9298
9299/* Return 1 if a BRANCH_PADDING frag should be generated. */
9300
9301static int
79d72f45
HL
9302add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9303 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9304{
9305 int add_padding;
9306
9307 /* NB: Don't work with COND_JUMP86 without i386. */
9308 if (!align_branch_power
9309 || now_seg == absolute_section
389d00a5
JB
9310 || !cpu_arch_flags.bitfield.cpui386
9311 || i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
9312 return 0;
9313
9314 add_padding = 0;
9315
9316 /* Check for jcc and direct jmp. */
9317 if (i.tm.opcode_modifier.jump == JUMP)
9318 {
9319 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9320 {
9321 *branch_p = align_branch_jmp;
9322 add_padding = align_branch & align_branch_jmp_bit;
9323 }
9324 else
9325 {
79d72f45
HL
9326 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9327 igore the lowest bit. */
9328 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9329 *branch_p = align_branch_jcc;
9330 if ((align_branch & align_branch_jcc_bit))
9331 add_padding = 1;
9332 }
9333 }
e379e5f3
L
9334 else if ((i.tm.base_opcode | 1) == 0xc3)
9335 {
9336 /* Near ret. */
9337 *branch_p = align_branch_ret;
9338 if ((align_branch & align_branch_ret_bit))
9339 add_padding = 1;
9340 }
9341 else
9342 {
9343 /* Check for indirect jmp, direct and indirect calls. */
9344 if (i.tm.base_opcode == 0xe8)
9345 {
9346 /* Direct call. */
9347 *branch_p = align_branch_call;
9348 if ((align_branch & align_branch_call_bit))
9349 add_padding = 1;
9350 }
9351 else if (i.tm.base_opcode == 0xff
9352 && (i.tm.extension_opcode == 2
9353 || i.tm.extension_opcode == 4))
9354 {
9355 /* Indirect call and jmp. */
9356 *branch_p = align_branch_indirect;
9357 if ((align_branch & align_branch_indirect_bit))
9358 add_padding = 1;
9359 }
9360
9361 if (add_padding
9362 && i.disp_operands
9363 && tls_get_addr
9364 && (i.op[0].disps->X_op == O_symbol
9365 || (i.op[0].disps->X_op == O_subtract
9366 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9367 {
9368 symbolS *s = i.op[0].disps->X_add_symbol;
9369 /* No padding to call to global or undefined tls_get_addr. */
9370 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9371 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9372 return 0;
9373 }
9374 }
9375
9376 if (add_padding
9377 && last_insn.kind != last_insn_other
9378 && last_insn.seg == now_seg)
9379 {
9380 if (flag_debug)
9381 as_warn_where (last_insn.file, last_insn.line,
9382 _("`%s` skips -malign-branch-boundary on `%s`"),
9383 last_insn.name, i.tm.name);
9384 return 0;
9385 }
9386
9387 return add_padding;
9388}
9389
29b0f896 9390static void
e3bb37b5 9391output_insn (void)
29b0f896 9392{
2bbd9c25
JJ
9393 fragS *insn_start_frag;
9394 offsetT insn_start_off;
e379e5f3
L
9395 fragS *fragP = NULL;
9396 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9397 /* The initializer is arbitrary just to avoid uninitialized error.
9398 it's actually either assigned in add_branch_padding_frag_p
9399 or never be used. */
9400 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9401
b4a3a7b4 9402#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 9403 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4 9404 {
32930e4e
L
9405 if ((i.xstate & xstate_tmm) == xstate_tmm
9406 || i.tm.cpu_flags.bitfield.cpuamx_tile)
9407 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
9408
b4a3a7b4
L
9409 if (i.tm.cpu_flags.bitfield.cpu8087
9410 || i.tm.cpu_flags.bitfield.cpu287
9411 || i.tm.cpu_flags.bitfield.cpu387
9412 || i.tm.cpu_flags.bitfield.cpu687
9413 || i.tm.cpu_flags.bitfield.cpufisttp)
9414 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
014d61ea 9415
921eafea 9416 if ((i.xstate & xstate_mmx)
389d00a5
JB
9417 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9418 && !is_any_vex_encoding (&i.tm)
9419 && (i.tm.base_opcode == 0x77 /* emms */
9420 || i.tm.base_opcode == 0x0e /* femms */)))
b4a3a7b4 9421 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
014d61ea 9422
32930e4e
L
9423 if (i.index_reg)
9424 {
9425 if (i.index_reg->reg_type.bitfield.zmmword)
9426 i.xstate |= xstate_zmm;
9427 else if (i.index_reg->reg_type.bitfield.ymmword)
9428 i.xstate |= xstate_ymm;
9429 else if (i.index_reg->reg_type.bitfield.xmmword)
9430 i.xstate |= xstate_xmm;
9431 }
014d61ea
JB
9432
9433 /* vzeroall / vzeroupper */
9434 if (i.tm.base_opcode == 0x77 && i.tm.cpu_flags.bitfield.cpuavx)
9435 i.xstate |= xstate_ymm;
9436
c4694f17 9437 if ((i.xstate & xstate_xmm)
389d00a5
JB
9438 /* ldmxcsr / stmxcsr / vldmxcsr / vstmxcsr */
9439 || (i.tm.base_opcode == 0xae
9440 && (i.tm.cpu_flags.bitfield.cpusse
9441 || i.tm.cpu_flags.bitfield.cpuavx))
c4694f17
TG
9442 || i.tm.cpu_flags.bitfield.cpuwidekl
9443 || i.tm.cpu_flags.bitfield.cpukl)
b4a3a7b4 9444 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
014d61ea 9445
921eafea 9446 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 9447 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 9448 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4 9449 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
6225c532 9450 if (i.mask.reg || (i.xstate & xstate_mask) == xstate_mask)
32930e4e 9451 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK;
b4a3a7b4
L
9452 if (i.tm.cpu_flags.bitfield.cpufxsr)
9453 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9454 if (i.tm.cpu_flags.bitfield.cpuxsave)
9455 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9456 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9457 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9458 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9459 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
b0ab0693
L
9460
9461 if (x86_feature_2_used
9462 || i.tm.cpu_flags.bitfield.cpucmov
9463 || i.tm.cpu_flags.bitfield.cpusyscall
389d00a5
JB
9464 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9465 && i.tm.base_opcode == 0xc7
70e95837 9466 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
b0ab0693
L
9467 && i.tm.extension_opcode == 1) /* cmpxchg8b */)
9468 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_BASELINE;
9469 if (i.tm.cpu_flags.bitfield.cpusse3
9470 || i.tm.cpu_flags.bitfield.cpussse3
9471 || i.tm.cpu_flags.bitfield.cpusse4_1
9472 || i.tm.cpu_flags.bitfield.cpusse4_2
9473 || i.tm.cpu_flags.bitfield.cpucx16
9474 || i.tm.cpu_flags.bitfield.cpupopcnt
9475 /* LAHF-SAHF insns in 64-bit mode. */
9476 || (flag_code == CODE_64BIT
35648716
JB
9477 && (i.tm.base_opcode | 1) == 0x9f
9478 && i.tm.opcode_modifier.opcodespace == SPACE_BASE))
b0ab0693
L
9479 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2;
9480 if (i.tm.cpu_flags.bitfield.cpuavx
9481 || i.tm.cpu_flags.bitfield.cpuavx2
9482 /* Any VEX encoded insns execpt for CpuAVX512F, CpuAVX512BW,
9483 CpuAVX512DQ, LPW, TBM and AMX. */
9484 || (i.tm.opcode_modifier.vex
9485 && !i.tm.cpu_flags.bitfield.cpuavx512f
9486 && !i.tm.cpu_flags.bitfield.cpuavx512bw
9487 && !i.tm.cpu_flags.bitfield.cpuavx512dq
9488 && !i.tm.cpu_flags.bitfield.cpulwp
9489 && !i.tm.cpu_flags.bitfield.cputbm
9490 && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM))
9491 || i.tm.cpu_flags.bitfield.cpuf16c
9492 || i.tm.cpu_flags.bitfield.cpufma
9493 || i.tm.cpu_flags.bitfield.cpulzcnt
9494 || i.tm.cpu_flags.bitfield.cpumovbe
9495 || i.tm.cpu_flags.bitfield.cpuxsaves
9496 || (x86_feature_2_used
9497 & (GNU_PROPERTY_X86_FEATURE_2_XSAVE
9498 | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
9499 | GNU_PROPERTY_X86_FEATURE_2_XSAVEC)) != 0)
9500 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V3;
9501 if (i.tm.cpu_flags.bitfield.cpuavx512f
9502 || i.tm.cpu_flags.bitfield.cpuavx512bw
9503 || i.tm.cpu_flags.bitfield.cpuavx512dq
9504 || i.tm.cpu_flags.bitfield.cpuavx512vl
9505 /* Any EVEX encoded insns except for AVX512ER, AVX512PF and
9506 VNNIW. */
9507 || (i.tm.opcode_modifier.evex
9508 && !i.tm.cpu_flags.bitfield.cpuavx512er
9509 && !i.tm.cpu_flags.bitfield.cpuavx512pf
9510 && !i.tm.cpu_flags.bitfield.cpuavx512_4vnniw))
9511 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V4;
b4a3a7b4
L
9512 }
9513#endif
9514
29b0f896
AM
9515 /* Tie dwarf2 debug info to the address at the start of the insn.
9516 We can't do this after the insn has been output as the current
9517 frag may have been closed off. eg. by frag_var. */
9518 dwarf2_emit_insn (0);
9519
2bbd9c25
JJ
9520 insn_start_frag = frag_now;
9521 insn_start_off = frag_now_fix ();
9522
79d72f45 9523 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9524 {
9525 char *p;
9526 /* Branch can be 8 bytes. Leave some room for prefixes. */
9527 unsigned int max_branch_padding_size = 14;
9528
9529 /* Align section to boundary. */
9530 record_alignment (now_seg, align_branch_power);
9531
9532 /* Make room for padding. */
9533 frag_grow (max_branch_padding_size);
9534
9535 /* Start of the padding. */
9536 p = frag_more (0);
9537
9538 fragP = frag_now;
9539
9540 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9541 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9542 NULL, 0, p);
9543
79d72f45 9544 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9545 fragP->tc_frag_data.branch_type = branch;
9546 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9547 }
9548
29b0f896 9549 /* Output jumps. */
0cfa3eb3 9550 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9551 output_branch ();
0cfa3eb3
JB
9552 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9553 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9554 output_jump ();
0cfa3eb3 9555 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9556 output_interseg_jump ();
9557 else
9558 {
9559 /* Output normal instructions here. */
9560 char *p;
9561 unsigned char *q;
47465058 9562 unsigned int j;
79d72f45 9563 enum mf_cmp_kind mf_cmp;
4dffcebc 9564
e4e00185 9565 if (avoid_fence
389d00a5
JB
9566 && (i.tm.base_opcode == 0xaee8
9567 || i.tm.base_opcode == 0xaef0
9568 || i.tm.base_opcode == 0xaef8))
48ef937e
JB
9569 {
9570 /* Encode lfence, mfence, and sfence as
9571 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9572 if (now_seg != absolute_section)
9573 {
9574 offsetT val = 0x240483f0ULL;
9575
9576 p = frag_more (5);
9577 md_number_to_chars (p, val, 5);
9578 }
9579 else
9580 abs_section_offset += 5;
9581 return;
9582 }
e4e00185 9583
d022bddd
IT
9584 /* Some processors fail on LOCK prefix. This options makes
9585 assembler ignore LOCK prefix and serves as a workaround. */
9586 if (omit_lock_prefix)
9587 {
35648716
JB
9588 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE
9589 && i.tm.opcode_modifier.isprefix)
d022bddd
IT
9590 return;
9591 i.prefix[LOCK_PREFIX] = 0;
9592 }
9593
e379e5f3
L
9594 if (branch)
9595 /* Skip if this is a branch. */
9596 ;
79d72f45 9597 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9598 {
9599 /* Make room for padding. */
9600 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9601 p = frag_more (0);
9602
9603 fragP = frag_now;
9604
9605 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9606 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9607 NULL, 0, p);
9608
79d72f45 9609 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9610 fragP->tc_frag_data.branch_type = align_branch_fused;
9611 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9612 }
9613 else if (add_branch_prefix_frag_p ())
9614 {
9615 unsigned int max_prefix_size = align_branch_prefix_size;
9616
9617 /* Make room for padding. */
9618 frag_grow (max_prefix_size);
9619 p = frag_more (0);
9620
9621 fragP = frag_now;
9622
9623 frag_var (rs_machine_dependent, max_prefix_size, 0,
9624 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9625 NULL, 0, p);
9626
9627 fragP->tc_frag_data.max_bytes = max_prefix_size;
9628 }
9629
43234a1e
L
9630 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9631 don't need the explicit prefix. */
9632 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9633 {
7b47a312 9634 switch (i.tm.opcode_modifier.opcodeprefix)
bc4bd9ab 9635 {
7b47a312
L
9636 case PREFIX_0X66:
9637 add_prefix (0x66);
9638 break;
9639 case PREFIX_0XF2:
9640 add_prefix (0xf2);
9641 break;
9642 case PREFIX_0XF3:
8b65b895
L
9643 if (!i.tm.cpu_flags.bitfield.cpupadlock
9644 || (i.prefix[REP_PREFIX] != 0xf3))
9645 add_prefix (0xf3);
c0f3af97 9646 break;
7b47a312 9647 case PREFIX_NONE:
9a182d04 9648 switch (i.opcode_length)
c0f3af97 9649 {
7b47a312 9650 case 2:
7b47a312 9651 break;
9a182d04 9652 case 1:
7b47a312 9653 /* Check for pseudo prefixes. */
9a182d04
JB
9654 if (!i.tm.opcode_modifier.isprefix || i.tm.base_opcode)
9655 break;
7b47a312
L
9656 as_bad_where (insn_start_frag->fr_file,
9657 insn_start_frag->fr_line,
9658 _("pseudo prefix without instruction"));
9659 return;
9660 default:
9661 abort ();
4dffcebc 9662 }
c0f3af97 9663 break;
c0f3af97
L
9664 default:
9665 abort ();
bc4bd9ab 9666 }
c0f3af97 9667
6d19a37a 9668#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9669 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9670 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9671 perform IE->LE optimization. A dummy REX_OPCODE prefix
9672 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9673 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9674 if (x86_elf_abi == X86_64_X32_ABI
9675 && i.operands == 2
14470f07
L
9676 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9677 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9678 && i.prefix[REX_PREFIX] == 0)
9679 add_prefix (REX_OPCODE);
6d19a37a 9680#endif
cf61b747 9681
c0f3af97
L
9682 /* The prefix bytes. */
9683 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9684 if (*q)
48ef937e 9685 frag_opcode_byte (*q);
0f10071e 9686 }
ae5c1c7b 9687 else
c0f3af97
L
9688 {
9689 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9690 if (*q)
9691 switch (j)
9692 {
c0f3af97
L
9693 case SEG_PREFIX:
9694 case ADDR_PREFIX:
48ef937e 9695 frag_opcode_byte (*q);
c0f3af97
L
9696 break;
9697 default:
9698 /* There should be no other prefixes for instructions
9699 with VEX prefix. */
9700 abort ();
9701 }
9702
43234a1e
L
9703 /* For EVEX instructions i.vrex should become 0 after
9704 build_evex_prefix. For VEX instructions upper 16 registers
9705 aren't available, so VREX should be 0. */
9706 if (i.vrex)
9707 abort ();
c0f3af97 9708 /* Now the VEX prefix. */
48ef937e
JB
9709 if (now_seg != absolute_section)
9710 {
9711 p = frag_more (i.vex.length);
9712 for (j = 0; j < i.vex.length; j++)
9713 p[j] = i.vex.bytes[j];
9714 }
9715 else
9716 abs_section_offset += i.vex.length;
c0f3af97 9717 }
252b5132 9718
29b0f896 9719 /* Now the opcode; be careful about word order here! */
389d00a5
JB
9720 j = i.opcode_length;
9721 if (!i.vex.length)
9722 switch (i.tm.opcode_modifier.opcodespace)
9723 {
9724 case SPACE_BASE:
9725 break;
9726 case SPACE_0F:
9727 ++j;
9728 break;
9729 case SPACE_0F38:
9730 case SPACE_0F3A:
9731 j += 2;
9732 break;
9733 default:
9734 abort ();
9735 }
9736
48ef937e 9737 if (now_seg == absolute_section)
389d00a5
JB
9738 abs_section_offset += j;
9739 else if (j == 1)
29b0f896
AM
9740 {
9741 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9742 }
9743 else
9744 {
389d00a5
JB
9745 p = frag_more (j);
9746 if (!i.vex.length
9747 && i.tm.opcode_modifier.opcodespace != SPACE_BASE)
9748 {
9749 *p++ = 0x0f;
9750 if (i.tm.opcode_modifier.opcodespace != SPACE_0F)
9751 *p++ = i.tm.opcode_modifier.opcodespace == SPACE_0F38
9752 ? 0x38 : 0x3a;
9753 }
9754
9a182d04 9755 switch (i.opcode_length)
331d2d0d 9756 {
4dffcebc 9757 case 2:
389d00a5
JB
9758 /* Put out high byte first: can't use md_number_to_chars! */
9759 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9760 /* Fall through. */
9761 case 1:
9762 *p = i.tm.base_opcode & 0xff;
4dffcebc
L
9763 break;
9764 default:
9765 abort ();
9766 break;
331d2d0d 9767 }
0f10071e 9768
29b0f896 9769 }
3e73aa7c 9770
29b0f896 9771 /* Now the modrm byte and sib byte (if present). */
40fb9820 9772 if (i.tm.opcode_modifier.modrm)
29b0f896 9773 {
48ef937e
JB
9774 frag_opcode_byte ((i.rm.regmem << 0)
9775 | (i.rm.reg << 3)
9776 | (i.rm.mode << 6));
29b0f896
AM
9777 /* If i.rm.regmem == ESP (4)
9778 && i.rm.mode != (Register mode)
9779 && not 16 bit
9780 ==> need second modrm byte. */
9781 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9782 && i.rm.mode != 3
dc821c5f 9783 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
9784 frag_opcode_byte ((i.sib.base << 0)
9785 | (i.sib.index << 3)
9786 | (i.sib.scale << 6));
29b0f896 9787 }
3e73aa7c 9788
29b0f896 9789 if (i.disp_operands)
2bbd9c25 9790 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9791
29b0f896 9792 if (i.imm_operands)
2bbd9c25 9793 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9794
9795 /*
9796 * frag_now_fix () returning plain abs_section_offset when we're in the
9797 * absolute section, and abs_section_offset not getting updated as data
9798 * gets added to the frag breaks the logic below.
9799 */
9800 if (now_seg != absolute_section)
9801 {
9802 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9803 if (j > 15)
9804 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9805 j);
e379e5f3
L
9806 else if (fragP)
9807 {
9808 /* NB: Don't add prefix with GOTPC relocation since
9809 output_disp() above depends on the fixed encoding
9810 length. Can't add prefix with TLS relocation since
9811 it breaks TLS linker optimization. */
9812 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9813 /* Prefix count on the current instruction. */
9814 unsigned int count = i.vex.length;
9815 unsigned int k;
9816 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9817 /* REX byte is encoded in VEX/EVEX prefix. */
9818 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9819 count++;
9820
9821 /* Count prefixes for extended opcode maps. */
9822 if (!i.vex.length)
389d00a5 9823 switch (i.tm.opcode_modifier.opcodespace)
e379e5f3 9824 {
389d00a5 9825 case SPACE_BASE:
e379e5f3 9826 break;
389d00a5
JB
9827 case SPACE_0F:
9828 count++;
e379e5f3 9829 break;
389d00a5
JB
9830 case SPACE_0F38:
9831 case SPACE_0F3A:
9832 count += 2;
e379e5f3
L
9833 break;
9834 default:
9835 abort ();
9836 }
9837
9838 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9839 == BRANCH_PREFIX)
9840 {
9841 /* Set the maximum prefix size in BRANCH_PREFIX
9842 frag. */
9843 if (fragP->tc_frag_data.max_bytes > max)
9844 fragP->tc_frag_data.max_bytes = max;
9845 if (fragP->tc_frag_data.max_bytes > count)
9846 fragP->tc_frag_data.max_bytes -= count;
9847 else
9848 fragP->tc_frag_data.max_bytes = 0;
9849 }
9850 else
9851 {
9852 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9853 frag. */
9854 unsigned int max_prefix_size;
9855 if (align_branch_prefix_size > max)
9856 max_prefix_size = max;
9857 else
9858 max_prefix_size = align_branch_prefix_size;
9859 if (max_prefix_size > count)
9860 fragP->tc_frag_data.max_prefix_length
9861 = max_prefix_size - count;
9862 }
9863
9864 /* Use existing segment prefix if possible. Use CS
9865 segment prefix in 64-bit mode. In 32-bit mode, use SS
9866 segment prefix with ESP/EBP base register and use DS
9867 segment prefix without ESP/EBP base register. */
9868 if (i.prefix[SEG_PREFIX])
9869 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9870 else if (flag_code == CODE_64BIT)
9871 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9872 else if (i.base_reg
9873 && (i.base_reg->reg_num == 4
9874 || i.base_reg->reg_num == 5))
9875 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9876 else
9877 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9878 }
9c33702b 9879 }
29b0f896 9880 }
252b5132 9881
e379e5f3
L
9882 /* NB: Don't work with COND_JUMP86 without i386. */
9883 if (align_branch_power
9884 && now_seg != absolute_section
9885 && cpu_arch_flags.bitfield.cpui386)
9886 {
9887 /* Terminate each frag so that we can add prefix and check for
9888 fused jcc. */
9889 frag_wane (frag_now);
9890 frag_new (0);
9891 }
9892
29b0f896
AM
9893#ifdef DEBUG386
9894 if (flag_debug)
9895 {
7b81dfbb 9896 pi ("" /*line*/, &i);
29b0f896
AM
9897 }
9898#endif /* DEBUG386 */
9899}
252b5132 9900
e205caa7
L
9901/* Return the size of the displacement operand N. */
9902
9903static int
9904disp_size (unsigned int n)
9905{
9906 int size = 4;
43234a1e 9907
b5014f7a 9908 if (i.types[n].bitfield.disp64)
40fb9820
L
9909 size = 8;
9910 else if (i.types[n].bitfield.disp8)
9911 size = 1;
9912 else if (i.types[n].bitfield.disp16)
9913 size = 2;
e205caa7
L
9914 return size;
9915}
9916
9917/* Return the size of the immediate operand N. */
9918
9919static int
9920imm_size (unsigned int n)
9921{
9922 int size = 4;
40fb9820
L
9923 if (i.types[n].bitfield.imm64)
9924 size = 8;
9925 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9926 size = 1;
9927 else if (i.types[n].bitfield.imm16)
9928 size = 2;
e205caa7
L
9929 return size;
9930}
9931
29b0f896 9932static void
64e74474 9933output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9934{
9935 char *p;
9936 unsigned int n;
252b5132 9937
29b0f896
AM
9938 for (n = 0; n < i.operands; n++)
9939 {
b5014f7a 9940 if (operand_type_check (i.types[n], disp))
29b0f896 9941 {
48ef937e
JB
9942 int size = disp_size (n);
9943
9944 if (now_seg == absolute_section)
9945 abs_section_offset += size;
9946 else if (i.op[n].disps->X_op == O_constant)
29b0f896 9947 {
43234a1e 9948 offsetT val = i.op[n].disps->X_add_number;
252b5132 9949
629cfaf1
JB
9950 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9951 size);
29b0f896
AM
9952 p = frag_more (size);
9953 md_number_to_chars (p, val, size);
9954 }
9955 else
9956 {
f86103b7 9957 enum bfd_reloc_code_real reloc_type;
40fb9820 9958 int sign = i.types[n].bitfield.disp32s;
29b0f896 9959 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9960 fixS *fixP;
29b0f896 9961
e205caa7 9962 /* We can't have 8 bit displacement here. */
9c2799c2 9963 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9964
29b0f896
AM
9965 /* The PC relative address is computed relative
9966 to the instruction boundary, so in case immediate
9967 fields follows, we need to adjust the value. */
9968 if (pcrel && i.imm_operands)
9969 {
29b0f896 9970 unsigned int n1;
e205caa7 9971 int sz = 0;
252b5132 9972
29b0f896 9973 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9974 if (operand_type_check (i.types[n1], imm))
252b5132 9975 {
e205caa7
L
9976 /* Only one immediate is allowed for PC
9977 relative address. */
9c2799c2 9978 gas_assert (sz == 0);
e205caa7
L
9979 sz = imm_size (n1);
9980 i.op[n].disps->X_add_number -= sz;
252b5132 9981 }
29b0f896 9982 /* We should find the immediate. */
9c2799c2 9983 gas_assert (sz != 0);
29b0f896 9984 }
520dc8e8 9985
29b0f896 9986 p = frag_more (size);
d258b828 9987 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9988 if (GOT_symbol
2bbd9c25 9989 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9990 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9991 || reloc_type == BFD_RELOC_X86_64_32S
9992 || (reloc_type == BFD_RELOC_64
9993 && object_64bit))
d6ab8113
JB
9994 && (i.op[n].disps->X_op == O_symbol
9995 || (i.op[n].disps->X_op == O_add
9996 && ((symbol_get_value_expression
9997 (i.op[n].disps->X_op_symbol)->X_op)
9998 == O_subtract))))
9999 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 10000 {
4fa24527 10001 if (!object_64bit)
7b81dfbb
AJ
10002 {
10003 reloc_type = BFD_RELOC_386_GOTPC;
5b7c81bd 10004 i.has_gotpc_tls_reloc = true;
d583596c
JB
10005 i.op[n].imms->X_add_number +=
10006 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
10007 }
10008 else if (reloc_type == BFD_RELOC_64)
10009 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 10010 else
7b81dfbb
AJ
10011 /* Don't do the adjustment for x86-64, as there
10012 the pcrel addressing is relative to the _next_
10013 insn, and that is taken care of in other code. */
d6ab8113 10014 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 10015 }
e379e5f3
L
10016 else if (align_branch_power)
10017 {
10018 switch (reloc_type)
10019 {
10020 case BFD_RELOC_386_TLS_GD:
10021 case BFD_RELOC_386_TLS_LDM:
10022 case BFD_RELOC_386_TLS_IE:
10023 case BFD_RELOC_386_TLS_IE_32:
10024 case BFD_RELOC_386_TLS_GOTIE:
10025 case BFD_RELOC_386_TLS_GOTDESC:
10026 case BFD_RELOC_386_TLS_DESC_CALL:
10027 case BFD_RELOC_X86_64_TLSGD:
10028 case BFD_RELOC_X86_64_TLSLD:
10029 case BFD_RELOC_X86_64_GOTTPOFF:
10030 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
10031 case BFD_RELOC_X86_64_TLSDESC_CALL:
5b7c81bd 10032 i.has_gotpc_tls_reloc = true;
e379e5f3
L
10033 default:
10034 break;
10035 }
10036 }
02a86693
L
10037 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
10038 size, i.op[n].disps, pcrel,
10039 reloc_type);
eb19308f
JB
10040
10041 if (flag_code == CODE_64BIT && size == 4 && pcrel
10042 && !i.prefix[ADDR_PREFIX])
10043 fixP->fx_signed = 1;
10044
02a86693
L
10045 /* Check for "call/jmp *mem", "mov mem, %reg",
10046 "test %reg, mem" and "binop mem, %reg" where binop
10047 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
10048 instructions without data prefix. Always generate
10049 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
10050 if (i.prefix[DATA_PREFIX] == 0
10051 && (generate_relax_relocations
10052 || (!object_64bit
10053 && i.rm.mode == 0
10054 && i.rm.regmem == 5))
0cb4071e
L
10055 && (i.rm.mode == 2
10056 || (i.rm.mode == 0 && i.rm.regmem == 5))
389d00a5 10057 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
02a86693
L
10058 && ((i.operands == 1
10059 && i.tm.base_opcode == 0xff
10060 && (i.rm.reg == 2 || i.rm.reg == 4))
10061 || (i.operands == 2
10062 && (i.tm.base_opcode == 0x8b
10063 || i.tm.base_opcode == 0x85
2ae4c703 10064 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
10065 {
10066 if (object_64bit)
10067 {
10068 fixP->fx_tcbit = i.rex != 0;
10069 if (i.base_reg
e968fc9b 10070 && (i.base_reg->reg_num == RegIP))
02a86693
L
10071 fixP->fx_tcbit2 = 1;
10072 }
10073 else
10074 fixP->fx_tcbit2 = 1;
10075 }
29b0f896
AM
10076 }
10077 }
10078 }
10079}
252b5132 10080
29b0f896 10081static void
64e74474 10082output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
10083{
10084 char *p;
10085 unsigned int n;
252b5132 10086
29b0f896
AM
10087 for (n = 0; n < i.operands; n++)
10088 {
43234a1e 10089 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
ca5312a2 10090 if (i.rounding.type != rc_none && n == i.rounding.operand)
43234a1e
L
10091 continue;
10092
40fb9820 10093 if (operand_type_check (i.types[n], imm))
29b0f896 10094 {
48ef937e
JB
10095 int size = imm_size (n);
10096
10097 if (now_seg == absolute_section)
10098 abs_section_offset += size;
10099 else if (i.op[n].imms->X_op == O_constant)
29b0f896 10100 {
29b0f896 10101 offsetT val;
b4cac588 10102
29b0f896
AM
10103 val = offset_in_range (i.op[n].imms->X_add_number,
10104 size);
10105 p = frag_more (size);
10106 md_number_to_chars (p, val, size);
10107 }
10108 else
10109 {
10110 /* Not absolute_section.
10111 Need a 32-bit fixup (don't support 8bit
10112 non-absolute imms). Try to support other
10113 sizes ... */
f86103b7 10114 enum bfd_reloc_code_real reloc_type;
e205caa7 10115 int sign;
29b0f896 10116
40fb9820 10117 if (i.types[n].bitfield.imm32s
a7d61044 10118 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 10119 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 10120 sign = 1;
e205caa7
L
10121 else
10122 sign = 0;
520dc8e8 10123
29b0f896 10124 p = frag_more (size);
d258b828 10125 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 10126
2bbd9c25
JJ
10127 /* This is tough to explain. We end up with this one if we
10128 * have operands that look like
10129 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
10130 * obtain the absolute address of the GOT, and it is strongly
10131 * preferable from a performance point of view to avoid using
10132 * a runtime relocation for this. The actual sequence of
10133 * instructions often look something like:
10134 *
10135 * call .L66
10136 * .L66:
10137 * popl %ebx
10138 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
10139 *
10140 * The call and pop essentially return the absolute address
10141 * of the label .L66 and store it in %ebx. The linker itself
10142 * will ultimately change the first operand of the addl so
10143 * that %ebx points to the GOT, but to keep things simple, the
10144 * .o file must have this operand set so that it generates not
10145 * the absolute address of .L66, but the absolute address of
10146 * itself. This allows the linker itself simply treat a GOTPC
10147 * relocation as asking for a pcrel offset to the GOT to be
10148 * added in, and the addend of the relocation is stored in the
10149 * operand field for the instruction itself.
10150 *
10151 * Our job here is to fix the operand so that it would add
10152 * the correct offset so that %ebx would point to itself. The
10153 * thing that is tricky is that .-.L66 will point to the
10154 * beginning of the instruction, so we need to further modify
10155 * the operand so that it will point to itself. There are
10156 * other cases where you have something like:
10157 *
10158 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
10159 *
10160 * and here no correction would be required. Internally in
10161 * the assembler we treat operands of this form as not being
10162 * pcrel since the '.' is explicitly mentioned, and I wonder
10163 * whether it would simplify matters to do it this way. Who
10164 * knows. In earlier versions of the PIC patches, the
10165 * pcrel_adjust field was used to store the correction, but
10166 * since the expression is not pcrel, I felt it would be
10167 * confusing to do it this way. */
10168
d6ab8113 10169 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
10170 || reloc_type == BFD_RELOC_X86_64_32S
10171 || reloc_type == BFD_RELOC_64)
29b0f896
AM
10172 && GOT_symbol
10173 && GOT_symbol == i.op[n].imms->X_add_symbol
10174 && (i.op[n].imms->X_op == O_symbol
10175 || (i.op[n].imms->X_op == O_add
10176 && ((symbol_get_value_expression
10177 (i.op[n].imms->X_op_symbol)->X_op)
10178 == O_subtract))))
10179 {
4fa24527 10180 if (!object_64bit)
d6ab8113 10181 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 10182 else if (size == 4)
d6ab8113 10183 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
10184 else if (size == 8)
10185 reloc_type = BFD_RELOC_X86_64_GOTPC64;
5b7c81bd 10186 i.has_gotpc_tls_reloc = true;
d583596c
JB
10187 i.op[n].imms->X_add_number +=
10188 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 10189 }
29b0f896
AM
10190 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
10191 i.op[n].imms, 0, reloc_type);
10192 }
10193 }
10194 }
252b5132
RH
10195}
10196\f
d182319b
JB
10197/* x86_cons_fix_new is called via the expression parsing code when a
10198 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
10199static int cons_sign = -1;
10200
10201void
e3bb37b5 10202x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 10203 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 10204{
d258b828 10205 r = reloc (len, 0, cons_sign, r);
d182319b
JB
10206
10207#ifdef TE_PE
10208 if (exp->X_op == O_secrel)
10209 {
10210 exp->X_op = O_symbol;
10211 r = BFD_RELOC_32_SECREL;
10212 }
10213#endif
10214
10215 fix_new_exp (frag, off, len, exp, 0, r);
10216}
10217
357d1bd8
L
10218/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
10219 purpose of the `.dc.a' internal pseudo-op. */
10220
10221int
10222x86_address_bytes (void)
10223{
10224 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
10225 return 4;
10226 return stdoutput->arch_info->bits_per_address / 8;
10227}
10228
d382c579
TG
10229#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
10230 || defined (LEX_AT)
d258b828 10231# define lex_got(reloc, adjust, types) NULL
718ddfc0 10232#else
f3c180ae
AM
10233/* Parse operands of the form
10234 <symbol>@GOTOFF+<nnn>
10235 and similar .plt or .got references.
10236
10237 If we find one, set up the correct relocation in RELOC and copy the
10238 input string, minus the `@GOTOFF' into a malloc'd buffer for
10239 parsing by the calling routine. Return this buffer, and if ADJUST
10240 is non-null set it to the length of the string we removed from the
10241 input line. Otherwise return NULL. */
10242static char *
91d6fa6a 10243lex_got (enum bfd_reloc_code_real *rel,
64e74474 10244 int *adjust,
d258b828 10245 i386_operand_type *types)
f3c180ae 10246{
7b81dfbb
AJ
10247 /* Some of the relocations depend on the size of what field is to
10248 be relocated. But in our callers i386_immediate and i386_displacement
10249 we don't yet know the operand size (this will be set by insn
10250 matching). Hence we record the word32 relocation here,
10251 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
10252 static const struct {
10253 const char *str;
cff8d58a 10254 int len;
4fa24527 10255 const enum bfd_reloc_code_real rel[2];
40fb9820 10256 const i386_operand_type types64;
5b7c81bd 10257 bool need_GOT_symbol;
f3c180ae 10258 } gotrel[] = {
8ce3d284 10259#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
10260 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
10261 BFD_RELOC_SIZE32 },
5b7c81bd 10262 OPERAND_TYPE_IMM32_64, false },
8ce3d284 10263#endif
cff8d58a
L
10264 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
10265 BFD_RELOC_X86_64_PLTOFF64 },
5b7c81bd 10266 OPERAND_TYPE_IMM64, true },
cff8d58a
L
10267 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
10268 BFD_RELOC_X86_64_PLT32 },
5b7c81bd 10269 OPERAND_TYPE_IMM32_32S_DISP32, false },
cff8d58a
L
10270 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
10271 BFD_RELOC_X86_64_GOTPLT64 },
5b7c81bd 10272 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
10273 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
10274 BFD_RELOC_X86_64_GOTOFF64 },
5b7c81bd 10275 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
10276 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
10277 BFD_RELOC_X86_64_GOTPCREL },
5b7c81bd 10278 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10279 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
10280 BFD_RELOC_X86_64_TLSGD },
5b7c81bd 10281 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10282 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
10283 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10284 OPERAND_TYPE_NONE, true },
cff8d58a
L
10285 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
10286 BFD_RELOC_X86_64_TLSLD },
5b7c81bd 10287 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10288 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
10289 BFD_RELOC_X86_64_GOTTPOFF },
5b7c81bd 10290 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10291 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
10292 BFD_RELOC_X86_64_TPOFF32 },
5b7c81bd 10293 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
10294 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
10295 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10296 OPERAND_TYPE_NONE, true },
cff8d58a
L
10297 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
10298 BFD_RELOC_X86_64_DTPOFF32 },
5b7c81bd 10299 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
10300 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
10301 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10302 OPERAND_TYPE_NONE, true },
cff8d58a
L
10303 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
10304 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10305 OPERAND_TYPE_NONE, true },
cff8d58a
L
10306 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
10307 BFD_RELOC_X86_64_GOT32 },
5b7c81bd 10308 OPERAND_TYPE_IMM32_32S_64_DISP32, true },
cff8d58a
L
10309 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
10310 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
5b7c81bd 10311 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10312 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
10313 BFD_RELOC_X86_64_TLSDESC_CALL },
5b7c81bd 10314 OPERAND_TYPE_IMM32_32S_DISP32, true },
f3c180ae
AM
10315 };
10316 char *cp;
10317 unsigned int j;
10318
d382c579 10319#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
10320 if (!IS_ELF)
10321 return NULL;
d382c579 10322#endif
718ddfc0 10323
f3c180ae 10324 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 10325 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
10326 return NULL;
10327
47465058 10328 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 10329 {
cff8d58a 10330 int len = gotrel[j].len;
28f81592 10331 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 10332 {
4fa24527 10333 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 10334 {
28f81592
AM
10335 int first, second;
10336 char *tmpbuf, *past_reloc;
f3c180ae 10337
91d6fa6a 10338 *rel = gotrel[j].rel[object_64bit];
f3c180ae 10339
3956db08
JB
10340 if (types)
10341 {
10342 if (flag_code != CODE_64BIT)
40fb9820
L
10343 {
10344 types->bitfield.imm32 = 1;
10345 types->bitfield.disp32 = 1;
10346 }
3956db08
JB
10347 else
10348 *types = gotrel[j].types64;
10349 }
10350
844bf810 10351 if (gotrel[j].need_GOT_symbol && GOT_symbol == NULL)
f3c180ae
AM
10352 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10353
28f81592 10354 /* The length of the first part of our input line. */
f3c180ae 10355 first = cp - input_line_pointer;
28f81592
AM
10356
10357 /* The second part goes from after the reloc token until
67c11a9b 10358 (and including) an end_of_line char or comma. */
28f81592 10359 past_reloc = cp + 1 + len;
67c11a9b
AM
10360 cp = past_reloc;
10361 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10362 ++cp;
10363 second = cp + 1 - past_reloc;
28f81592
AM
10364
10365 /* Allocate and copy string. The trailing NUL shouldn't
10366 be necessary, but be safe. */
add39d23 10367 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10368 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10369 if (second != 0 && *past_reloc != ' ')
10370 /* Replace the relocation token with ' ', so that
10371 errors like foo@GOTOFF1 will be detected. */
10372 tmpbuf[first++] = ' ';
af89796a
L
10373 else
10374 /* Increment length by 1 if the relocation token is
10375 removed. */
10376 len++;
10377 if (adjust)
10378 *adjust = len;
0787a12d
AM
10379 memcpy (tmpbuf + first, past_reloc, second);
10380 tmpbuf[first + second] = '\0';
f3c180ae
AM
10381 return tmpbuf;
10382 }
10383
4fa24527
JB
10384 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10385 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10386 return NULL;
10387 }
10388 }
10389
10390 /* Might be a symbol version string. Don't as_bad here. */
10391 return NULL;
10392}
4e4f7c87 10393#endif
f3c180ae 10394
a988325c
NC
10395#ifdef TE_PE
10396#ifdef lex_got
10397#undef lex_got
10398#endif
10399/* Parse operands of the form
10400 <symbol>@SECREL32+<nnn>
10401
10402 If we find one, set up the correct relocation in RELOC and copy the
10403 input string, minus the `@SECREL32' into a malloc'd buffer for
10404 parsing by the calling routine. Return this buffer, and if ADJUST
10405 is non-null set it to the length of the string we removed from the
34bca508
L
10406 input line. Otherwise return NULL.
10407
a988325c
NC
10408 This function is copied from the ELF version above adjusted for PE targets. */
10409
10410static char *
10411lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10412 int *adjust ATTRIBUTE_UNUSED,
d258b828 10413 i386_operand_type *types)
a988325c
NC
10414{
10415 static const struct
10416 {
10417 const char *str;
10418 int len;
10419 const enum bfd_reloc_code_real rel[2];
10420 const i386_operand_type types64;
10421 }
10422 gotrel[] =
10423 {
10424 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10425 BFD_RELOC_32_SECREL },
10426 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10427 };
10428
10429 char *cp;
10430 unsigned j;
10431
10432 for (cp = input_line_pointer; *cp != '@'; cp++)
10433 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10434 return NULL;
10435
10436 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10437 {
10438 int len = gotrel[j].len;
10439
10440 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10441 {
10442 if (gotrel[j].rel[object_64bit] != 0)
10443 {
10444 int first, second;
10445 char *tmpbuf, *past_reloc;
10446
10447 *rel = gotrel[j].rel[object_64bit];
10448 if (adjust)
10449 *adjust = len;
10450
10451 if (types)
10452 {
10453 if (flag_code != CODE_64BIT)
10454 {
10455 types->bitfield.imm32 = 1;
10456 types->bitfield.disp32 = 1;
10457 }
10458 else
10459 *types = gotrel[j].types64;
10460 }
10461
10462 /* The length of the first part of our input line. */
10463 first = cp - input_line_pointer;
10464
10465 /* The second part goes from after the reloc token until
10466 (and including) an end_of_line char or comma. */
10467 past_reloc = cp + 1 + len;
10468 cp = past_reloc;
10469 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10470 ++cp;
10471 second = cp + 1 - past_reloc;
10472
10473 /* Allocate and copy string. The trailing NUL shouldn't
10474 be necessary, but be safe. */
add39d23 10475 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10476 memcpy (tmpbuf, input_line_pointer, first);
10477 if (second != 0 && *past_reloc != ' ')
10478 /* Replace the relocation token with ' ', so that
10479 errors like foo@SECLREL321 will be detected. */
10480 tmpbuf[first++] = ' ';
10481 memcpy (tmpbuf + first, past_reloc, second);
10482 tmpbuf[first + second] = '\0';
10483 return tmpbuf;
10484 }
10485
10486 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10487 gotrel[j].str, 1 << (5 + object_64bit));
10488 return NULL;
10489 }
10490 }
10491
10492 /* Might be a symbol version string. Don't as_bad here. */
10493 return NULL;
10494}
10495
10496#endif /* TE_PE */
10497
62ebcb5c 10498bfd_reloc_code_real_type
e3bb37b5 10499x86_cons (expressionS *exp, int size)
f3c180ae 10500{
62ebcb5c
AM
10501 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10502
ee86248c
JB
10503 intel_syntax = -intel_syntax;
10504
3c7b9c2c 10505 exp->X_md = 0;
4fa24527 10506 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10507 {
10508 /* Handle @GOTOFF and the like in an expression. */
10509 char *save;
10510 char *gotfree_input_line;
4a57f2cf 10511 int adjust = 0;
f3c180ae
AM
10512
10513 save = input_line_pointer;
d258b828 10514 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10515 if (gotfree_input_line)
10516 input_line_pointer = gotfree_input_line;
10517
10518 expression (exp);
10519
10520 if (gotfree_input_line)
10521 {
10522 /* expression () has merrily parsed up to the end of line,
10523 or a comma - in the wrong buffer. Transfer how far
10524 input_line_pointer has moved to the right buffer. */
10525 input_line_pointer = (save
10526 + (input_line_pointer - gotfree_input_line)
10527 + adjust);
10528 free (gotfree_input_line);
3992d3b7
AM
10529 if (exp->X_op == O_constant
10530 || exp->X_op == O_absent
10531 || exp->X_op == O_illegal
0398aac5 10532 || exp->X_op == O_register
3992d3b7
AM
10533 || exp->X_op == O_big)
10534 {
10535 char c = *input_line_pointer;
10536 *input_line_pointer = 0;
10537 as_bad (_("missing or invalid expression `%s'"), save);
10538 *input_line_pointer = c;
10539 }
b9519cfe
L
10540 else if ((got_reloc == BFD_RELOC_386_PLT32
10541 || got_reloc == BFD_RELOC_X86_64_PLT32)
10542 && exp->X_op != O_symbol)
10543 {
10544 char c = *input_line_pointer;
10545 *input_line_pointer = 0;
10546 as_bad (_("invalid PLT expression `%s'"), save);
10547 *input_line_pointer = c;
10548 }
f3c180ae
AM
10549 }
10550 }
10551 else
10552 expression (exp);
ee86248c
JB
10553
10554 intel_syntax = -intel_syntax;
10555
10556 if (intel_syntax)
10557 i386_intel_simplify (exp);
62ebcb5c
AM
10558
10559 return got_reloc;
f3c180ae 10560}
f3c180ae 10561
9f32dd5b
L
10562static void
10563signed_cons (int size)
6482c264 10564{
d182319b
JB
10565 if (flag_code == CODE_64BIT)
10566 cons_sign = 1;
10567 cons (size);
10568 cons_sign = -1;
6482c264
NC
10569}
10570
d182319b 10571#ifdef TE_PE
6482c264 10572static void
7016a5d5 10573pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10574{
10575 expressionS exp;
10576
10577 do
10578 {
10579 expression (&exp);
10580 if (exp.X_op == O_symbol)
10581 exp.X_op = O_secrel;
10582
10583 emit_expr (&exp, 4);
10584 }
10585 while (*input_line_pointer++ == ',');
10586
10587 input_line_pointer--;
10588 demand_empty_rest_of_line ();
10589}
6482c264
NC
10590#endif
10591
43234a1e
L
10592/* Handle Vector operations. */
10593
10594static char *
10595check_VecOperations (char *op_string, char *op_end)
10596{
10597 const reg_entry *mask;
10598 const char *saved;
10599 char *end_op;
10600
10601 while (*op_string
10602 && (op_end == NULL || op_string < op_end))
10603 {
10604 saved = op_string;
10605 if (*op_string == '{')
10606 {
10607 op_string++;
10608
10609 /* Check broadcasts. */
d34049e8 10610 if (startswith (op_string, "1to"))
43234a1e 10611 {
5273a3cd 10612 unsigned int bcst_type;
43234a1e 10613
5273a3cd 10614 if (i.broadcast.type)
43234a1e
L
10615 goto duplicated_vec_op;
10616
10617 op_string += 3;
10618 if (*op_string == '8')
8e6e0792 10619 bcst_type = 8;
b28d1bda 10620 else if (*op_string == '4')
8e6e0792 10621 bcst_type = 4;
b28d1bda 10622 else if (*op_string == '2')
8e6e0792 10623 bcst_type = 2;
43234a1e
L
10624 else if (*op_string == '1'
10625 && *(op_string+1) == '6')
10626 {
8e6e0792 10627 bcst_type = 16;
43234a1e
L
10628 op_string++;
10629 }
10630 else
10631 {
10632 as_bad (_("Unsupported broadcast: `%s'"), saved);
10633 return NULL;
10634 }
10635 op_string++;
10636
5273a3cd
JB
10637 i.broadcast.type = bcst_type;
10638 i.broadcast.operand = this_operand;
43234a1e
L
10639 }
10640 /* Check masking operation. */
10641 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10642 {
8a6fb3f9
JB
10643 if (mask == &bad_reg)
10644 return NULL;
10645
43234a1e 10646 /* k0 can't be used for write mask. */
f74a6307 10647 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10648 {
6d2cd6b2
JB
10649 as_bad (_("`%s%s' can't be used for write mask"),
10650 register_prefix, mask->reg_name);
43234a1e
L
10651 return NULL;
10652 }
10653
6225c532 10654 if (!i.mask.reg)
43234a1e 10655 {
6225c532
JB
10656 i.mask.reg = mask;
10657 i.mask.operand = this_operand;
43234a1e 10658 }
6225c532
JB
10659 else if (i.mask.reg->reg_num)
10660 goto duplicated_vec_op;
43234a1e
L
10661 else
10662 {
6225c532 10663 i.mask.reg = mask;
43234a1e
L
10664
10665 /* Only "{z}" is allowed here. No need to check
10666 zeroing mask explicitly. */
6225c532 10667 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
10668 {
10669 as_bad (_("invalid write mask `%s'"), saved);
10670 return NULL;
10671 }
10672 }
10673
10674 op_string = end_op;
10675 }
10676 /* Check zeroing-flag for masking operation. */
10677 else if (*op_string == 'z')
10678 {
6225c532 10679 if (!i.mask.reg)
43234a1e 10680 {
6225c532
JB
10681 i.mask.reg = reg_k0;
10682 i.mask.zeroing = 1;
10683 i.mask.operand = this_operand;
43234a1e
L
10684 }
10685 else
10686 {
6225c532 10687 if (i.mask.zeroing)
43234a1e
L
10688 {
10689 duplicated_vec_op:
10690 as_bad (_("duplicated `%s'"), saved);
10691 return NULL;
10692 }
10693
6225c532 10694 i.mask.zeroing = 1;
43234a1e
L
10695
10696 /* Only "{%k}" is allowed here. No need to check mask
10697 register explicitly. */
6225c532 10698 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
10699 {
10700 as_bad (_("invalid zeroing-masking `%s'"),
10701 saved);
10702 return NULL;
10703 }
10704 }
10705
10706 op_string++;
10707 }
10708 else
10709 goto unknown_vec_op;
10710
10711 if (*op_string != '}')
10712 {
10713 as_bad (_("missing `}' in `%s'"), saved);
10714 return NULL;
10715 }
10716 op_string++;
0ba3a731
L
10717
10718 /* Strip whitespace since the addition of pseudo prefixes
10719 changed how the scrubber treats '{'. */
10720 if (is_space_char (*op_string))
10721 ++op_string;
10722
43234a1e
L
10723 continue;
10724 }
10725 unknown_vec_op:
10726 /* We don't know this one. */
10727 as_bad (_("unknown vector operation: `%s'"), saved);
10728 return NULL;
10729 }
10730
6225c532 10731 if (i.mask.reg && i.mask.zeroing && !i.mask.reg->reg_num)
6d2cd6b2
JB
10732 {
10733 as_bad (_("zeroing-masking only allowed with write mask"));
10734 return NULL;
10735 }
10736
43234a1e
L
10737 return op_string;
10738}
10739
252b5132 10740static int
70e41ade 10741i386_immediate (char *imm_start)
252b5132
RH
10742{
10743 char *save_input_line_pointer;
f3c180ae 10744 char *gotfree_input_line;
252b5132 10745 segT exp_seg = 0;
47926f60 10746 expressionS *exp;
40fb9820
L
10747 i386_operand_type types;
10748
0dfbf9d7 10749 operand_type_set (&types, ~0);
252b5132
RH
10750
10751 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10752 {
31b2323c
L
10753 as_bad (_("at most %d immediate operands are allowed"),
10754 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10755 return 0;
10756 }
10757
10758 exp = &im_expressions[i.imm_operands++];
520dc8e8 10759 i.op[this_operand].imms = exp;
252b5132
RH
10760
10761 if (is_space_char (*imm_start))
10762 ++imm_start;
10763
10764 save_input_line_pointer = input_line_pointer;
10765 input_line_pointer = imm_start;
10766
d258b828 10767 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10768 if (gotfree_input_line)
10769 input_line_pointer = gotfree_input_line;
252b5132
RH
10770
10771 exp_seg = expression (exp);
10772
83183c0c 10773 SKIP_WHITESPACE ();
43234a1e
L
10774
10775 /* Handle vector operations. */
10776 if (*input_line_pointer == '{')
10777 {
10778 input_line_pointer = check_VecOperations (input_line_pointer,
10779 NULL);
10780 if (input_line_pointer == NULL)
10781 return 0;
10782 }
10783
252b5132 10784 if (*input_line_pointer)
f3c180ae 10785 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10786
10787 input_line_pointer = save_input_line_pointer;
f3c180ae 10788 if (gotfree_input_line)
ee86248c
JB
10789 {
10790 free (gotfree_input_line);
10791
10792 if (exp->X_op == O_constant || exp->X_op == O_register)
10793 exp->X_op = O_illegal;
10794 }
10795
10796 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10797}
252b5132 10798
ee86248c
JB
10799static int
10800i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10801 i386_operand_type types, const char *imm_start)
10802{
10803 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10804 {
313c53d1
L
10805 if (imm_start)
10806 as_bad (_("missing or invalid immediate expression `%s'"),
10807 imm_start);
3992d3b7 10808 return 0;
252b5132 10809 }
3e73aa7c 10810 else if (exp->X_op == O_constant)
252b5132 10811 {
47926f60 10812 /* Size it properly later. */
40fb9820 10813 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10814 /* If not 64bit, sign extend val. */
10815 if (flag_code != CODE_64BIT
4eed87de
AM
10816 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10817 exp->X_add_number
10818 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10819 }
4c63da97 10820#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10821 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10822 && exp_seg != absolute_section
47926f60 10823 && exp_seg != text_section
24eab124
AM
10824 && exp_seg != data_section
10825 && exp_seg != bss_section
10826 && exp_seg != undefined_section
f86103b7 10827 && !bfd_is_com_section (exp_seg))
252b5132 10828 {
d0b47220 10829 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10830 return 0;
10831 }
10832#endif
a841bdf5 10833 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10834 {
313c53d1
L
10835 if (imm_start)
10836 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10837 return 0;
10838 }
252b5132
RH
10839 else
10840 {
10841 /* This is an address. The size of the address will be
24eab124 10842 determined later, depending on destination register,
3e73aa7c 10843 suffix, or the default for the section. */
40fb9820
L
10844 i.types[this_operand].bitfield.imm8 = 1;
10845 i.types[this_operand].bitfield.imm16 = 1;
10846 i.types[this_operand].bitfield.imm32 = 1;
10847 i.types[this_operand].bitfield.imm32s = 1;
10848 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10849 i.types[this_operand] = operand_type_and (i.types[this_operand],
10850 types);
252b5132
RH
10851 }
10852
10853 return 1;
10854}
10855
551c1ca1 10856static char *
e3bb37b5 10857i386_scale (char *scale)
252b5132 10858{
551c1ca1
AM
10859 offsetT val;
10860 char *save = input_line_pointer;
252b5132 10861
551c1ca1
AM
10862 input_line_pointer = scale;
10863 val = get_absolute_expression ();
10864
10865 switch (val)
252b5132 10866 {
551c1ca1 10867 case 1:
252b5132
RH
10868 i.log2_scale_factor = 0;
10869 break;
551c1ca1 10870 case 2:
252b5132
RH
10871 i.log2_scale_factor = 1;
10872 break;
551c1ca1 10873 case 4:
252b5132
RH
10874 i.log2_scale_factor = 2;
10875 break;
551c1ca1 10876 case 8:
252b5132
RH
10877 i.log2_scale_factor = 3;
10878 break;
10879 default:
a724f0f4
JB
10880 {
10881 char sep = *input_line_pointer;
10882
10883 *input_line_pointer = '\0';
10884 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10885 scale);
10886 *input_line_pointer = sep;
10887 input_line_pointer = save;
10888 return NULL;
10889 }
252b5132 10890 }
29b0f896 10891 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10892 {
10893 as_warn (_("scale factor of %d without an index register"),
24eab124 10894 1 << i.log2_scale_factor);
252b5132 10895 i.log2_scale_factor = 0;
252b5132 10896 }
551c1ca1
AM
10897 scale = input_line_pointer;
10898 input_line_pointer = save;
10899 return scale;
252b5132
RH
10900}
10901
252b5132 10902static int
e3bb37b5 10903i386_displacement (char *disp_start, char *disp_end)
252b5132 10904{
29b0f896 10905 expressionS *exp;
252b5132
RH
10906 segT exp_seg = 0;
10907 char *save_input_line_pointer;
f3c180ae 10908 char *gotfree_input_line;
40fb9820
L
10909 int override;
10910 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10911 int ret;
252b5132 10912
31b2323c
L
10913 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10914 {
10915 as_bad (_("at most %d displacement operands are allowed"),
10916 MAX_MEMORY_OPERANDS);
10917 return 0;
10918 }
10919
0dfbf9d7 10920 operand_type_set (&bigdisp, 0);
6f2f06be 10921 if (i.jumpabsolute
48bcea9f 10922 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10923 || (current_templates->start->opcode_modifier.jump != JUMP
10924 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10925 {
48bcea9f 10926 i386_addressing_mode ();
e05278af 10927 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10928 if (flag_code == CODE_64BIT)
10929 {
10930 if (!override)
10931 {
10932 bigdisp.bitfield.disp32s = 1;
10933 bigdisp.bitfield.disp64 = 1;
10934 }
48bcea9f
JB
10935 else
10936 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10937 }
10938 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10939 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10940 else
10941 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10942 }
10943 else
10944 {
376cd056
JB
10945 /* For PC-relative branches, the width of the displacement may be
10946 dependent upon data size, but is never dependent upon address size.
10947 Also make sure to not unintentionally match against a non-PC-relative
10948 branch template. */
10949 static templates aux_templates;
10950 const insn_template *t = current_templates->start;
5b7c81bd 10951 bool has_intel64 = false;
376cd056
JB
10952
10953 aux_templates.start = t;
10954 while (++t < current_templates->end)
10955 {
10956 if (t->opcode_modifier.jump
10957 != current_templates->start->opcode_modifier.jump)
10958 break;
4b5aaf5f 10959 if ((t->opcode_modifier.isa64 >= INTEL64))
5b7c81bd 10960 has_intel64 = true;
376cd056
JB
10961 }
10962 if (t < current_templates->end)
10963 {
10964 aux_templates.end = t;
10965 current_templates = &aux_templates;
10966 }
10967
e05278af 10968 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10969 if (flag_code == CODE_64BIT)
10970 {
376cd056
JB
10971 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10972 && (!intel64 || !has_intel64))
40fb9820
L
10973 bigdisp.bitfield.disp16 = 1;
10974 else
48bcea9f 10975 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10976 }
10977 else
e05278af
JB
10978 {
10979 if (!override)
10980 override = (i.suffix == (flag_code != CODE_16BIT
10981 ? WORD_MNEM_SUFFIX
10982 : LONG_MNEM_SUFFIX));
40fb9820
L
10983 bigdisp.bitfield.disp32 = 1;
10984 if ((flag_code == CODE_16BIT) ^ override)
10985 {
10986 bigdisp.bitfield.disp32 = 0;
10987 bigdisp.bitfield.disp16 = 1;
10988 }
e05278af 10989 }
e05278af 10990 }
c6fb90c8
L
10991 i.types[this_operand] = operand_type_or (i.types[this_operand],
10992 bigdisp);
252b5132
RH
10993
10994 exp = &disp_expressions[i.disp_operands];
520dc8e8 10995 i.op[this_operand].disps = exp;
252b5132
RH
10996 i.disp_operands++;
10997 save_input_line_pointer = input_line_pointer;
10998 input_line_pointer = disp_start;
10999 END_STRING_AND_SAVE (disp_end);
11000
11001#ifndef GCC_ASM_O_HACK
11002#define GCC_ASM_O_HACK 0
11003#endif
11004#if GCC_ASM_O_HACK
11005 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 11006 if (i.types[this_operand].bitfield.baseIndex
24eab124 11007 && displacement_string_end[-1] == '+')
252b5132
RH
11008 {
11009 /* This hack is to avoid a warning when using the "o"
24eab124
AM
11010 constraint within gcc asm statements.
11011 For instance:
11012
11013 #define _set_tssldt_desc(n,addr,limit,type) \
11014 __asm__ __volatile__ ( \
11015 "movw %w2,%0\n\t" \
11016 "movw %w1,2+%0\n\t" \
11017 "rorl $16,%1\n\t" \
11018 "movb %b1,4+%0\n\t" \
11019 "movb %4,5+%0\n\t" \
11020 "movb $0,6+%0\n\t" \
11021 "movb %h1,7+%0\n\t" \
11022 "rorl $16,%1" \
11023 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
11024
11025 This works great except that the output assembler ends
11026 up looking a bit weird if it turns out that there is
11027 no offset. You end up producing code that looks like:
11028
11029 #APP
11030 movw $235,(%eax)
11031 movw %dx,2+(%eax)
11032 rorl $16,%edx
11033 movb %dl,4+(%eax)
11034 movb $137,5+(%eax)
11035 movb $0,6+(%eax)
11036 movb %dh,7+(%eax)
11037 rorl $16,%edx
11038 #NO_APP
11039
47926f60 11040 So here we provide the missing zero. */
24eab124
AM
11041
11042 *displacement_string_end = '0';
252b5132
RH
11043 }
11044#endif
d258b828 11045 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
11046 if (gotfree_input_line)
11047 input_line_pointer = gotfree_input_line;
252b5132 11048
24eab124 11049 exp_seg = expression (exp);
252b5132 11050
636c26b0
AM
11051 SKIP_WHITESPACE ();
11052 if (*input_line_pointer)
11053 as_bad (_("junk `%s' after expression"), input_line_pointer);
11054#if GCC_ASM_O_HACK
11055 RESTORE_END_STRING (disp_end + 1);
11056#endif
636c26b0 11057 input_line_pointer = save_input_line_pointer;
636c26b0 11058 if (gotfree_input_line)
ee86248c
JB
11059 {
11060 free (gotfree_input_line);
11061
11062 if (exp->X_op == O_constant || exp->X_op == O_register)
11063 exp->X_op = O_illegal;
11064 }
11065
11066 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
11067
11068 RESTORE_END_STRING (disp_end);
11069
11070 return ret;
11071}
11072
11073static int
11074i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
11075 i386_operand_type types, const char *disp_start)
11076{
11077 i386_operand_type bigdisp;
11078 int ret = 1;
636c26b0 11079
24eab124
AM
11080 /* We do this to make sure that the section symbol is in
11081 the symbol table. We will ultimately change the relocation
47926f60 11082 to be relative to the beginning of the section. */
1ae12ab7 11083 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
11084 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
11085 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 11086 {
636c26b0 11087 if (exp->X_op != O_symbol)
3992d3b7 11088 goto inv_disp;
636c26b0 11089
e5cb08ac 11090 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
11091 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
11092 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 11093 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
11094 exp->X_op = O_subtract;
11095 exp->X_op_symbol = GOT_symbol;
1ae12ab7 11096 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 11097 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
11098 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
11099 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 11100 else
29b0f896 11101 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 11102 }
252b5132 11103
3992d3b7
AM
11104 else if (exp->X_op == O_absent
11105 || exp->X_op == O_illegal
ee86248c 11106 || exp->X_op == O_big)
2daf4fd8 11107 {
3992d3b7
AM
11108 inv_disp:
11109 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 11110 disp_start);
3992d3b7 11111 ret = 0;
2daf4fd8
AM
11112 }
11113
4c63da97 11114#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
11115 else if (exp->X_op != O_constant
11116 && OUTPUT_FLAVOR == bfd_target_aout_flavour
11117 && exp_seg != absolute_section
11118 && exp_seg != text_section
11119 && exp_seg != data_section
11120 && exp_seg != bss_section
11121 && exp_seg != undefined_section
11122 && !bfd_is_com_section (exp_seg))
24eab124 11123 {
d0b47220 11124 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 11125 ret = 0;
24eab124 11126 }
252b5132 11127#endif
3956db08 11128
48bcea9f
JB
11129 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
11130 /* Constants get taken care of by optimize_disp(). */
11131 && exp->X_op != O_constant)
11132 i.types[this_operand].bitfield.disp8 = 1;
11133
40fb9820
L
11134 /* Check if this is a displacement only operand. */
11135 bigdisp = i.types[this_operand];
11136 bigdisp.bitfield.disp8 = 0;
11137 bigdisp.bitfield.disp16 = 0;
11138 bigdisp.bitfield.disp32 = 0;
11139 bigdisp.bitfield.disp32s = 0;
11140 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 11141 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
11142 i.types[this_operand] = operand_type_and (i.types[this_operand],
11143 types);
3956db08 11144
3992d3b7 11145 return ret;
252b5132
RH
11146}
11147
2abc2bec
JB
11148/* Return the active addressing mode, taking address override and
11149 registers forming the address into consideration. Update the
11150 address override prefix if necessary. */
47926f60 11151
2abc2bec
JB
11152static enum flag_code
11153i386_addressing_mode (void)
252b5132 11154{
be05d201
L
11155 enum flag_code addr_mode;
11156
11157 if (i.prefix[ADDR_PREFIX])
11158 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
11159 else if (flag_code == CODE_16BIT
11160 && current_templates->start->cpu_flags.bitfield.cpumpx
11161 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
11162 from md_assemble() by "is not a valid base/index expression"
11163 when there is a base and/or index. */
11164 && !i.types[this_operand].bitfield.baseindex)
11165 {
11166 /* MPX insn memory operands with neither base nor index must be forced
11167 to use 32-bit addressing in 16-bit mode. */
11168 addr_mode = CODE_32BIT;
11169 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
11170 ++i.prefixes;
11171 gas_assert (!i.types[this_operand].bitfield.disp16);
11172 gas_assert (!i.types[this_operand].bitfield.disp32);
11173 }
be05d201
L
11174 else
11175 {
11176 addr_mode = flag_code;
11177
24eab124 11178#if INFER_ADDR_PREFIX
be05d201
L
11179 if (i.mem_operands == 0)
11180 {
11181 /* Infer address prefix from the first memory operand. */
11182 const reg_entry *addr_reg = i.base_reg;
11183
11184 if (addr_reg == NULL)
11185 addr_reg = i.index_reg;
eecb386c 11186
be05d201
L
11187 if (addr_reg)
11188 {
e968fc9b 11189 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
11190 addr_mode = CODE_32BIT;
11191 else if (flag_code != CODE_64BIT
dc821c5f 11192 && addr_reg->reg_type.bitfield.word)
be05d201
L
11193 addr_mode = CODE_16BIT;
11194
11195 if (addr_mode != flag_code)
11196 {
11197 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
11198 i.prefixes += 1;
11199 /* Change the size of any displacement too. At most one
11200 of Disp16 or Disp32 is set.
11201 FIXME. There doesn't seem to be any real need for
11202 separate Disp16 and Disp32 flags. The same goes for
11203 Imm16 and Imm32. Removing them would probably clean
11204 up the code quite a lot. */
11205 if (flag_code != CODE_64BIT
11206 && (i.types[this_operand].bitfield.disp16
11207 || i.types[this_operand].bitfield.disp32))
11208 i.types[this_operand]
11209 = operand_type_xor (i.types[this_operand], disp16_32);
11210 }
11211 }
11212 }
24eab124 11213#endif
be05d201
L
11214 }
11215
2abc2bec
JB
11216 return addr_mode;
11217}
11218
11219/* Make sure the memory operand we've been dealt is valid.
11220 Return 1 on success, 0 on a failure. */
11221
11222static int
11223i386_index_check (const char *operand_string)
11224{
11225 const char *kind = "base/index";
11226 enum flag_code addr_mode = i386_addressing_mode ();
a152332d 11227 const insn_template *t = current_templates->start;
2abc2bec 11228
a152332d
JB
11229 if (t->opcode_modifier.isstring
11230 && !t->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
11231 && (current_templates->end[-1].opcode_modifier.isstring
11232 || i.mem_operands))
11233 {
11234 /* Memory operands of string insns are special in that they only allow
11235 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
11236 const reg_entry *expected_reg;
11237 static const char *di_si[][2] =
11238 {
11239 { "esi", "edi" },
11240 { "si", "di" },
11241 { "rsi", "rdi" }
11242 };
11243 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
11244
11245 kind = "string address";
11246
a152332d 11247 if (t->opcode_modifier.prefixok == PrefixRep)
fc0763e6 11248 {
51c8edf6
JB
11249 int es_op = current_templates->end[-1].opcode_modifier.isstring
11250 - IS_STRING_ES_OP0;
11251 int op = 0;
fc0763e6 11252
51c8edf6 11253 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
11254 || ((!i.mem_operands != !intel_syntax)
11255 && current_templates->end[-1].operand_types[1]
11256 .bitfield.baseindex))
51c8edf6 11257 op = 1;
fe0e921f
AM
11258 expected_reg
11259 = (const reg_entry *) str_hash_find (reg_hash,
11260 di_si[addr_mode][op == es_op]);
fc0763e6
JB
11261 }
11262 else
fe0e921f
AM
11263 expected_reg
11264 = (const reg_entry *)str_hash_find (reg_hash, bx[addr_mode]);
fc0763e6 11265
be05d201
L
11266 if (i.base_reg != expected_reg
11267 || i.index_reg
fc0763e6 11268 || operand_type_check (i.types[this_operand], disp))
fc0763e6 11269 {
be05d201
L
11270 /* The second memory operand must have the same size as
11271 the first one. */
11272 if (i.mem_operands
11273 && i.base_reg
11274 && !((addr_mode == CODE_64BIT
dc821c5f 11275 && i.base_reg->reg_type.bitfield.qword)
be05d201 11276 || (addr_mode == CODE_32BIT
dc821c5f
JB
11277 ? i.base_reg->reg_type.bitfield.dword
11278 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
11279 goto bad_address;
11280
fc0763e6
JB
11281 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
11282 operand_string,
11283 intel_syntax ? '[' : '(',
11284 register_prefix,
be05d201 11285 expected_reg->reg_name,
fc0763e6 11286 intel_syntax ? ']' : ')');
be05d201 11287 return 1;
fc0763e6 11288 }
be05d201
L
11289 else
11290 return 1;
11291
dc1e8a47 11292 bad_address:
be05d201
L
11293 as_bad (_("`%s' is not a valid %s expression"),
11294 operand_string, kind);
11295 return 0;
3e73aa7c
JH
11296 }
11297 else
11298 {
be05d201
L
11299 if (addr_mode != CODE_16BIT)
11300 {
11301 /* 32-bit/64-bit checks. */
41eb8e88
L
11302 if (i.disp_encoding == disp_encoding_16bit)
11303 {
11304 bad_disp:
11305 as_bad (_("invalid `%s' prefix"),
11306 addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}");
11307 return 0;
11308 }
11309
be05d201 11310 if ((i.base_reg
e968fc9b
JB
11311 && ((addr_mode == CODE_64BIT
11312 ? !i.base_reg->reg_type.bitfield.qword
11313 : !i.base_reg->reg_type.bitfield.dword)
11314 || (i.index_reg && i.base_reg->reg_num == RegIP)
11315 || i.base_reg->reg_num == RegIZ))
be05d201 11316 || (i.index_reg
1b54b8d7
JB
11317 && !i.index_reg->reg_type.bitfield.xmmword
11318 && !i.index_reg->reg_type.bitfield.ymmword
11319 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 11320 && ((addr_mode == CODE_64BIT
e968fc9b
JB
11321 ? !i.index_reg->reg_type.bitfield.qword
11322 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
11323 || !i.index_reg->reg_type.bitfield.baseindex)))
11324 goto bad_address;
8178be5b 11325
260cd341 11326 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
a152332d 11327 if ((t->opcode_modifier.opcodeprefix == PREFIX_0XF3
389d00a5
JB
11328 && t->opcode_modifier.opcodespace == SPACE_0F
11329 && t->base_opcode == 0x1b)
a152332d 11330 || (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11331 && t->opcode_modifier.opcodespace == SPACE_0F
11332 && (t->base_opcode & ~1) == 0x1a)
a152332d 11333 || t->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11334 {
11335 /* They cannot use RIP-relative addressing. */
e968fc9b 11336 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11337 {
11338 as_bad (_("`%s' cannot be used here"), operand_string);
11339 return 0;
11340 }
11341
11342 /* bndldx and bndstx ignore their scale factor. */
a152332d 11343 if (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11344 && t->opcode_modifier.opcodespace == SPACE_0F
11345 && (t->base_opcode & ~1) == 0x1a
8178be5b
JB
11346 && i.log2_scale_factor)
11347 as_warn (_("register scaling is being ignored here"));
11348 }
be05d201
L
11349 }
11350 else
3e73aa7c 11351 {
be05d201 11352 /* 16-bit checks. */
41eb8e88
L
11353 if (i.disp_encoding == disp_encoding_32bit)
11354 goto bad_disp;
11355
3e73aa7c 11356 if ((i.base_reg
dc821c5f 11357 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11358 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11359 || (i.index_reg
dc821c5f 11360 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11361 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11362 || !(i.base_reg
11363 && i.base_reg->reg_num < 6
11364 && i.index_reg->reg_num >= 6
11365 && i.log2_scale_factor == 0))))
be05d201 11366 goto bad_address;
3e73aa7c
JH
11367 }
11368 }
be05d201 11369 return 1;
24eab124 11370}
252b5132 11371
43234a1e
L
11372/* Handle vector immediates. */
11373
11374static int
11375RC_SAE_immediate (const char *imm_start)
11376{
11377 unsigned int match_found, j;
11378 const char *pstr = imm_start;
11379 expressionS *exp;
11380
11381 if (*pstr != '{')
11382 return 0;
11383
11384 pstr++;
11385 match_found = 0;
11386 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11387 {
11388 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11389 {
ca5312a2 11390 if (i.rounding.type != rc_none)
43234a1e
L
11391 {
11392 as_bad (_("duplicated `%s'"), imm_start);
11393 return 0;
11394 }
ca5312a2
JB
11395
11396 i.rounding.type = RC_NamesTable[j].type;
11397 i.rounding.operand = this_operand;
11398
43234a1e
L
11399 pstr += RC_NamesTable[j].len;
11400 match_found = 1;
11401 break;
11402 }
11403 }
11404 if (!match_found)
11405 return 0;
11406
11407 if (*pstr++ != '}')
11408 {
11409 as_bad (_("Missing '}': '%s'"), imm_start);
11410 return 0;
11411 }
11412 /* RC/SAE immediate string should contain nothing more. */;
11413 if (*pstr != 0)
11414 {
11415 as_bad (_("Junk after '}': '%s'"), imm_start);
11416 return 0;
11417 }
11418
11419 exp = &im_expressions[i.imm_operands++];
11420 i.op[this_operand].imms = exp;
11421
11422 exp->X_op = O_constant;
11423 exp->X_add_number = 0;
11424 exp->X_add_symbol = (symbolS *) 0;
11425 exp->X_op_symbol = (symbolS *) 0;
11426
11427 i.types[this_operand].bitfield.imm8 = 1;
11428 return 1;
11429}
11430
8325cc63
JB
11431/* Only string instructions can have a second memory operand, so
11432 reduce current_templates to just those if it contains any. */
11433static int
11434maybe_adjust_templates (void)
11435{
11436 const insn_template *t;
11437
11438 gas_assert (i.mem_operands == 1);
11439
11440 for (t = current_templates->start; t < current_templates->end; ++t)
11441 if (t->opcode_modifier.isstring)
11442 break;
11443
11444 if (t < current_templates->end)
11445 {
11446 static templates aux_templates;
5b7c81bd 11447 bool recheck;
8325cc63
JB
11448
11449 aux_templates.start = t;
11450 for (; t < current_templates->end; ++t)
11451 if (!t->opcode_modifier.isstring)
11452 break;
11453 aux_templates.end = t;
11454
11455 /* Determine whether to re-check the first memory operand. */
11456 recheck = (aux_templates.start != current_templates->start
11457 || t != current_templates->end);
11458
11459 current_templates = &aux_templates;
11460
11461 if (recheck)
11462 {
11463 i.mem_operands = 0;
11464 if (i.memop1_string != NULL
11465 && i386_index_check (i.memop1_string) == 0)
11466 return 0;
11467 i.mem_operands = 1;
11468 }
11469 }
11470
11471 return 1;
11472}
11473
fc0763e6 11474/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11475 on error. */
252b5132 11476
252b5132 11477static int
a7619375 11478i386_att_operand (char *operand_string)
252b5132 11479{
af6bdddf
AM
11480 const reg_entry *r;
11481 char *end_op;
24eab124 11482 char *op_string = operand_string;
252b5132 11483
24eab124 11484 if (is_space_char (*op_string))
252b5132
RH
11485 ++op_string;
11486
24eab124 11487 /* We check for an absolute prefix (differentiating,
47926f60 11488 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11489 if (*op_string == ABSOLUTE_PREFIX)
11490 {
11491 ++op_string;
11492 if (is_space_char (*op_string))
11493 ++op_string;
5b7c81bd 11494 i.jumpabsolute = true;
24eab124 11495 }
252b5132 11496
47926f60 11497 /* Check if operand is a register. */
4d1bb795 11498 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11499 {
40fb9820
L
11500 i386_operand_type temp;
11501
8a6fb3f9
JB
11502 if (r == &bad_reg)
11503 return 0;
11504
24eab124
AM
11505 /* Check for a segment override by searching for ':' after a
11506 segment register. */
11507 op_string = end_op;
11508 if (is_space_char (*op_string))
11509 ++op_string;
00cee14f 11510 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124 11511 {
5e042380 11512 i.seg[i.mem_operands] = r;
252b5132 11513
24eab124 11514 /* Skip the ':' and whitespace. */
252b5132
RH
11515 ++op_string;
11516 if (is_space_char (*op_string))
24eab124 11517 ++op_string;
252b5132 11518
24eab124
AM
11519 if (!is_digit_char (*op_string)
11520 && !is_identifier_char (*op_string)
11521 && *op_string != '('
11522 && *op_string != ABSOLUTE_PREFIX)
11523 {
11524 as_bad (_("bad memory operand `%s'"), op_string);
11525 return 0;
11526 }
47926f60 11527 /* Handle case of %es:*foo. */
24eab124
AM
11528 if (*op_string == ABSOLUTE_PREFIX)
11529 {
11530 ++op_string;
11531 if (is_space_char (*op_string))
11532 ++op_string;
5b7c81bd 11533 i.jumpabsolute = true;
24eab124
AM
11534 }
11535 goto do_memory_reference;
11536 }
43234a1e
L
11537
11538 /* Handle vector operations. */
11539 if (*op_string == '{')
11540 {
11541 op_string = check_VecOperations (op_string, NULL);
11542 if (op_string == NULL)
11543 return 0;
11544 }
11545
24eab124
AM
11546 if (*op_string)
11547 {
d0b47220 11548 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11549 return 0;
11550 }
40fb9820
L
11551 temp = r->reg_type;
11552 temp.bitfield.baseindex = 0;
c6fb90c8
L
11553 i.types[this_operand] = operand_type_or (i.types[this_operand],
11554 temp);
7d5e4556 11555 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11556 i.op[this_operand].regs = r;
24eab124
AM
11557 i.reg_operands++;
11558 }
af6bdddf
AM
11559 else if (*op_string == REGISTER_PREFIX)
11560 {
11561 as_bad (_("bad register name `%s'"), op_string);
11562 return 0;
11563 }
24eab124 11564 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11565 {
24eab124 11566 ++op_string;
6f2f06be 11567 if (i.jumpabsolute)
24eab124 11568 {
d0b47220 11569 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11570 return 0;
11571 }
11572 if (!i386_immediate (op_string))
11573 return 0;
11574 }
43234a1e
L
11575 else if (RC_SAE_immediate (operand_string))
11576 {
11577 /* If it is a RC or SAE immediate, do nothing. */
11578 ;
11579 }
24eab124
AM
11580 else if (is_digit_char (*op_string)
11581 || is_identifier_char (*op_string)
d02603dc 11582 || *op_string == '"'
e5cb08ac 11583 || *op_string == '(')
24eab124 11584 {
47926f60 11585 /* This is a memory reference of some sort. */
af6bdddf 11586 char *base_string;
252b5132 11587
47926f60 11588 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11589 char *displacement_string_start;
11590 char *displacement_string_end;
43234a1e 11591 char *vop_start;
252b5132 11592
24eab124 11593 do_memory_reference:
8325cc63
JB
11594 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11595 return 0;
24eab124 11596 if ((i.mem_operands == 1
40fb9820 11597 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11598 || i.mem_operands == 2)
11599 {
11600 as_bad (_("too many memory references for `%s'"),
11601 current_templates->start->name);
11602 return 0;
11603 }
252b5132 11604
24eab124
AM
11605 /* Check for base index form. We detect the base index form by
11606 looking for an ')' at the end of the operand, searching
11607 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11608 after the '('. */
af6bdddf 11609 base_string = op_string + strlen (op_string);
c3332e24 11610
43234a1e
L
11611 /* Handle vector operations. */
11612 vop_start = strchr (op_string, '{');
11613 if (vop_start && vop_start < base_string)
11614 {
11615 if (check_VecOperations (vop_start, base_string) == NULL)
11616 return 0;
11617 base_string = vop_start;
11618 }
11619
af6bdddf
AM
11620 --base_string;
11621 if (is_space_char (*base_string))
11622 --base_string;
252b5132 11623
47926f60 11624 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11625 displacement_string_start = op_string;
11626 displacement_string_end = base_string + 1;
252b5132 11627
24eab124
AM
11628 if (*base_string == ')')
11629 {
af6bdddf 11630 char *temp_string;
24eab124
AM
11631 unsigned int parens_balanced = 1;
11632 /* We've already checked that the number of left & right ()'s are
47926f60 11633 equal, so this loop will not be infinite. */
24eab124
AM
11634 do
11635 {
11636 base_string--;
11637 if (*base_string == ')')
11638 parens_balanced++;
11639 if (*base_string == '(')
11640 parens_balanced--;
11641 }
11642 while (parens_balanced);
c3332e24 11643
af6bdddf 11644 temp_string = base_string;
c3332e24 11645
24eab124 11646 /* Skip past '(' and whitespace. */
252b5132
RH
11647 ++base_string;
11648 if (is_space_char (*base_string))
24eab124 11649 ++base_string;
252b5132 11650
af6bdddf 11651 if (*base_string == ','
4eed87de
AM
11652 || ((i.base_reg = parse_register (base_string, &end_op))
11653 != NULL))
252b5132 11654 {
af6bdddf 11655 displacement_string_end = temp_string;
252b5132 11656
40fb9820 11657 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11658
af6bdddf 11659 if (i.base_reg)
24eab124 11660 {
8a6fb3f9
JB
11661 if (i.base_reg == &bad_reg)
11662 return 0;
24eab124
AM
11663 base_string = end_op;
11664 if (is_space_char (*base_string))
11665 ++base_string;
af6bdddf
AM
11666 }
11667
11668 /* There may be an index reg or scale factor here. */
11669 if (*base_string == ',')
11670 {
11671 ++base_string;
11672 if (is_space_char (*base_string))
11673 ++base_string;
11674
4eed87de
AM
11675 if ((i.index_reg = parse_register (base_string, &end_op))
11676 != NULL)
24eab124 11677 {
8a6fb3f9
JB
11678 if (i.index_reg == &bad_reg)
11679 return 0;
af6bdddf 11680 base_string = end_op;
24eab124
AM
11681 if (is_space_char (*base_string))
11682 ++base_string;
af6bdddf
AM
11683 if (*base_string == ',')
11684 {
11685 ++base_string;
11686 if (is_space_char (*base_string))
11687 ++base_string;
11688 }
e5cb08ac 11689 else if (*base_string != ')')
af6bdddf 11690 {
4eed87de
AM
11691 as_bad (_("expecting `,' or `)' "
11692 "after index register in `%s'"),
af6bdddf
AM
11693 operand_string);
11694 return 0;
11695 }
24eab124 11696 }
af6bdddf 11697 else if (*base_string == REGISTER_PREFIX)
24eab124 11698 {
f76bf5e0
L
11699 end_op = strchr (base_string, ',');
11700 if (end_op)
11701 *end_op = '\0';
af6bdddf 11702 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11703 return 0;
11704 }
252b5132 11705
47926f60 11706 /* Check for scale factor. */
551c1ca1 11707 if (*base_string != ')')
af6bdddf 11708 {
551c1ca1
AM
11709 char *end_scale = i386_scale (base_string);
11710
11711 if (!end_scale)
af6bdddf 11712 return 0;
24eab124 11713
551c1ca1 11714 base_string = end_scale;
af6bdddf
AM
11715 if (is_space_char (*base_string))
11716 ++base_string;
11717 if (*base_string != ')')
11718 {
4eed87de
AM
11719 as_bad (_("expecting `)' "
11720 "after scale factor in `%s'"),
af6bdddf
AM
11721 operand_string);
11722 return 0;
11723 }
11724 }
11725 else if (!i.index_reg)
24eab124 11726 {
4eed87de
AM
11727 as_bad (_("expecting index register or scale factor "
11728 "after `,'; got '%c'"),
af6bdddf 11729 *base_string);
24eab124
AM
11730 return 0;
11731 }
11732 }
af6bdddf 11733 else if (*base_string != ')')
24eab124 11734 {
4eed87de
AM
11735 as_bad (_("expecting `,' or `)' "
11736 "after base register in `%s'"),
af6bdddf 11737 operand_string);
24eab124
AM
11738 return 0;
11739 }
c3332e24 11740 }
af6bdddf 11741 else if (*base_string == REGISTER_PREFIX)
c3332e24 11742 {
f76bf5e0
L
11743 end_op = strchr (base_string, ',');
11744 if (end_op)
11745 *end_op = '\0';
af6bdddf 11746 as_bad (_("bad register name `%s'"), base_string);
24eab124 11747 return 0;
c3332e24 11748 }
24eab124
AM
11749 }
11750
11751 /* If there's an expression beginning the operand, parse it,
11752 assuming displacement_string_start and
11753 displacement_string_end are meaningful. */
11754 if (displacement_string_start != displacement_string_end)
11755 {
11756 if (!i386_displacement (displacement_string_start,
11757 displacement_string_end))
11758 return 0;
11759 }
11760
11761 /* Special case for (%dx) while doing input/output op. */
11762 if (i.base_reg
75e5731b
JB
11763 && i.base_reg->reg_type.bitfield.instance == RegD
11764 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11765 && i.index_reg == 0
11766 && i.log2_scale_factor == 0
11767 && i.seg[i.mem_operands] == 0
40fb9820 11768 && !operand_type_check (i.types[this_operand], disp))
24eab124 11769 {
2fb5be8d 11770 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11771 return 1;
11772 }
11773
eecb386c
AM
11774 if (i386_index_check (operand_string) == 0)
11775 return 0;
c48dadc9 11776 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11777 if (i.mem_operands == 0)
11778 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11779 i.mem_operands++;
11780 }
11781 else
ce8a8b2f
AM
11782 {
11783 /* It's not a memory operand; argh! */
24eab124
AM
11784 as_bad (_("invalid char %s beginning operand %d `%s'"),
11785 output_invalid (*op_string),
11786 this_operand + 1,
11787 op_string);
11788 return 0;
11789 }
47926f60 11790 return 1; /* Normal return. */
252b5132
RH
11791}
11792\f
fa94de6b
RM
11793/* Calculate the maximum variable size (i.e., excluding fr_fix)
11794 that an rs_machine_dependent frag may reach. */
11795
11796unsigned int
11797i386_frag_max_var (fragS *frag)
11798{
11799 /* The only relaxable frags are for jumps.
11800 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11801 gas_assert (frag->fr_type == rs_machine_dependent);
11802 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11803}
11804
b084df0b
L
11805#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11806static int
8dcea932 11807elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11808{
11809 /* STT_GNU_IFUNC symbol must go through PLT. */
11810 if ((symbol_get_bfdsym (fr_symbol)->flags
11811 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11812 return 0;
11813
11814 if (!S_IS_EXTERNAL (fr_symbol))
11815 /* Symbol may be weak or local. */
11816 return !S_IS_WEAK (fr_symbol);
11817
8dcea932
L
11818 /* Global symbols with non-default visibility can't be preempted. */
11819 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11820 return 1;
11821
11822 if (fr_var != NO_RELOC)
11823 switch ((enum bfd_reloc_code_real) fr_var)
11824 {
11825 case BFD_RELOC_386_PLT32:
11826 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11827 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11828 return 0;
11829 default:
11830 abort ();
11831 }
11832
b084df0b
L
11833 /* Global symbols with default visibility in a shared library may be
11834 preempted by another definition. */
8dcea932 11835 return !shared;
b084df0b
L
11836}
11837#endif
11838
79d72f45
HL
11839/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11840 Note also work for Skylake and Cascadelake.
11841---------------------------------------------------------------------
11842| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11843| ------ | ----------- | ------- | -------- |
11844| Jo | N | N | Y |
11845| Jno | N | N | Y |
11846| Jc/Jb | Y | N | Y |
11847| Jae/Jnb | Y | N | Y |
11848| Je/Jz | Y | Y | Y |
11849| Jne/Jnz | Y | Y | Y |
11850| Jna/Jbe | Y | N | Y |
11851| Ja/Jnbe | Y | N | Y |
11852| Js | N | N | Y |
11853| Jns | N | N | Y |
11854| Jp/Jpe | N | N | Y |
11855| Jnp/Jpo | N | N | Y |
11856| Jl/Jnge | Y | Y | Y |
11857| Jge/Jnl | Y | Y | Y |
11858| Jle/Jng | Y | Y | Y |
11859| Jg/Jnle | Y | Y | Y |
11860--------------------------------------------------------------------- */
11861static int
11862i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11863{
11864 if (mf_cmp == mf_cmp_alu_cmp)
11865 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11866 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11867 if (mf_cmp == mf_cmp_incdec)
11868 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11869 || mf_jcc == mf_jcc_jle);
11870 if (mf_cmp == mf_cmp_test_and)
11871 return 1;
11872 return 0;
11873}
11874
e379e5f3
L
11875/* Return the next non-empty frag. */
11876
11877static fragS *
11878i386_next_non_empty_frag (fragS *fragP)
11879{
11880 /* There may be a frag with a ".fill 0" when there is no room in
11881 the current frag for frag_grow in output_insn. */
11882 for (fragP = fragP->fr_next;
11883 (fragP != NULL
11884 && fragP->fr_type == rs_fill
11885 && fragP->fr_fix == 0);
11886 fragP = fragP->fr_next)
11887 ;
11888 return fragP;
11889}
11890
11891/* Return the next jcc frag after BRANCH_PADDING. */
11892
11893static fragS *
79d72f45 11894i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11895{
79d72f45
HL
11896 fragS *branch_fragP;
11897 if (!pad_fragP)
e379e5f3
L
11898 return NULL;
11899
79d72f45
HL
11900 if (pad_fragP->fr_type == rs_machine_dependent
11901 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11902 == BRANCH_PADDING))
11903 {
79d72f45
HL
11904 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11905 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11906 return NULL;
79d72f45
HL
11907 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11908 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11909 pad_fragP->tc_frag_data.mf_type))
11910 return branch_fragP;
e379e5f3
L
11911 }
11912
11913 return NULL;
11914}
11915
11916/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11917
11918static void
11919i386_classify_machine_dependent_frag (fragS *fragP)
11920{
11921 fragS *cmp_fragP;
11922 fragS *pad_fragP;
11923 fragS *branch_fragP;
11924 fragS *next_fragP;
11925 unsigned int max_prefix_length;
11926
11927 if (fragP->tc_frag_data.classified)
11928 return;
11929
11930 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11931 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11932 for (next_fragP = fragP;
11933 next_fragP != NULL;
11934 next_fragP = next_fragP->fr_next)
11935 {
11936 next_fragP->tc_frag_data.classified = 1;
11937 if (next_fragP->fr_type == rs_machine_dependent)
11938 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11939 {
11940 case BRANCH_PADDING:
11941 /* The BRANCH_PADDING frag must be followed by a branch
11942 frag. */
11943 branch_fragP = i386_next_non_empty_frag (next_fragP);
11944 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11945 break;
11946 case FUSED_JCC_PADDING:
11947 /* Check if this is a fused jcc:
11948 FUSED_JCC_PADDING
11949 CMP like instruction
11950 BRANCH_PADDING
11951 COND_JUMP
11952 */
11953 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11954 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11955 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11956 if (branch_fragP)
11957 {
11958 /* The BRANCH_PADDING frag is merged with the
11959 FUSED_JCC_PADDING frag. */
11960 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11961 /* CMP like instruction size. */
11962 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11963 frag_wane (pad_fragP);
11964 /* Skip to branch_fragP. */
11965 next_fragP = branch_fragP;
11966 }
11967 else if (next_fragP->tc_frag_data.max_prefix_length)
11968 {
11969 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11970 a fused jcc. */
11971 next_fragP->fr_subtype
11972 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11973 next_fragP->tc_frag_data.max_bytes
11974 = next_fragP->tc_frag_data.max_prefix_length;
11975 /* This will be updated in the BRANCH_PREFIX scan. */
11976 next_fragP->tc_frag_data.max_prefix_length = 0;
11977 }
11978 else
11979 frag_wane (next_fragP);
11980 break;
11981 }
11982 }
11983
11984 /* Stop if there is no BRANCH_PREFIX. */
11985 if (!align_branch_prefix_size)
11986 return;
11987
11988 /* Scan for BRANCH_PREFIX. */
11989 for (; fragP != NULL; fragP = fragP->fr_next)
11990 {
11991 if (fragP->fr_type != rs_machine_dependent
11992 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11993 != BRANCH_PREFIX))
11994 continue;
11995
11996 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11997 COND_JUMP_PREFIX. */
11998 max_prefix_length = 0;
11999 for (next_fragP = fragP;
12000 next_fragP != NULL;
12001 next_fragP = next_fragP->fr_next)
12002 {
12003 if (next_fragP->fr_type == rs_fill)
12004 /* Skip rs_fill frags. */
12005 continue;
12006 else if (next_fragP->fr_type != rs_machine_dependent)
12007 /* Stop for all other frags. */
12008 break;
12009
12010 /* rs_machine_dependent frags. */
12011 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12012 == BRANCH_PREFIX)
12013 {
12014 /* Count BRANCH_PREFIX frags. */
12015 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
12016 {
12017 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
12018 frag_wane (next_fragP);
12019 }
12020 else
12021 max_prefix_length
12022 += next_fragP->tc_frag_data.max_bytes;
12023 }
12024 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12025 == BRANCH_PADDING)
12026 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12027 == FUSED_JCC_PADDING))
12028 {
12029 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
12030 fragP->tc_frag_data.u.padding_fragP = next_fragP;
12031 break;
12032 }
12033 else
12034 /* Stop for other rs_machine_dependent frags. */
12035 break;
12036 }
12037
12038 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
12039
12040 /* Skip to the next frag. */
12041 fragP = next_fragP;
12042 }
12043}
12044
12045/* Compute padding size for
12046
12047 FUSED_JCC_PADDING
12048 CMP like instruction
12049 BRANCH_PADDING
12050 COND_JUMP/UNCOND_JUMP
12051
12052 or
12053
12054 BRANCH_PADDING
12055 COND_JUMP/UNCOND_JUMP
12056 */
12057
12058static int
12059i386_branch_padding_size (fragS *fragP, offsetT address)
12060{
12061 unsigned int offset, size, padding_size;
12062 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
12063
12064 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
12065 if (!address)
12066 address = fragP->fr_address;
12067 address += fragP->fr_fix;
12068
12069 /* CMP like instrunction size. */
12070 size = fragP->tc_frag_data.cmp_size;
12071
12072 /* The base size of the branch frag. */
12073 size += branch_fragP->fr_fix;
12074
12075 /* Add opcode and displacement bytes for the rs_machine_dependent
12076 branch frag. */
12077 if (branch_fragP->fr_type == rs_machine_dependent)
12078 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
12079
12080 /* Check if branch is within boundary and doesn't end at the last
12081 byte. */
12082 offset = address & ((1U << align_branch_power) - 1);
12083 if ((offset + size) >= (1U << align_branch_power))
12084 /* Padding needed to avoid crossing boundary. */
12085 padding_size = (1U << align_branch_power) - offset;
12086 else
12087 /* No padding needed. */
12088 padding_size = 0;
12089
12090 /* The return value may be saved in tc_frag_data.length which is
12091 unsigned byte. */
12092 if (!fits_in_unsigned_byte (padding_size))
12093 abort ();
12094
12095 return padding_size;
12096}
12097
12098/* i386_generic_table_relax_frag()
12099
12100 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
12101 grow/shrink padding to align branch frags. Hand others to
12102 relax_frag(). */
12103
12104long
12105i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
12106{
12107 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12108 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12109 {
12110 long padding_size = i386_branch_padding_size (fragP, 0);
12111 long grow = padding_size - fragP->tc_frag_data.length;
12112
12113 /* When the BRANCH_PREFIX frag is used, the computed address
12114 must match the actual address and there should be no padding. */
12115 if (fragP->tc_frag_data.padding_address
12116 && (fragP->tc_frag_data.padding_address != fragP->fr_address
12117 || padding_size))
12118 abort ();
12119
12120 /* Update the padding size. */
12121 if (grow)
12122 fragP->tc_frag_data.length = padding_size;
12123
12124 return grow;
12125 }
12126 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12127 {
12128 fragS *padding_fragP, *next_fragP;
12129 long padding_size, left_size, last_size;
12130
12131 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12132 if (!padding_fragP)
12133 /* Use the padding set by the leading BRANCH_PREFIX frag. */
12134 return (fragP->tc_frag_data.length
12135 - fragP->tc_frag_data.last_length);
12136
12137 /* Compute the relative address of the padding frag in the very
12138 first time where the BRANCH_PREFIX frag sizes are zero. */
12139 if (!fragP->tc_frag_data.padding_address)
12140 fragP->tc_frag_data.padding_address
12141 = padding_fragP->fr_address - (fragP->fr_address - stretch);
12142
12143 /* First update the last length from the previous interation. */
12144 left_size = fragP->tc_frag_data.prefix_length;
12145 for (next_fragP = fragP;
12146 next_fragP != padding_fragP;
12147 next_fragP = next_fragP->fr_next)
12148 if (next_fragP->fr_type == rs_machine_dependent
12149 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12150 == BRANCH_PREFIX))
12151 {
12152 if (left_size)
12153 {
12154 int max = next_fragP->tc_frag_data.max_bytes;
12155 if (max)
12156 {
12157 int size;
12158 if (max > left_size)
12159 size = left_size;
12160 else
12161 size = max;
12162 left_size -= size;
12163 next_fragP->tc_frag_data.last_length = size;
12164 }
12165 }
12166 else
12167 next_fragP->tc_frag_data.last_length = 0;
12168 }
12169
12170 /* Check the padding size for the padding frag. */
12171 padding_size = i386_branch_padding_size
12172 (padding_fragP, (fragP->fr_address
12173 + fragP->tc_frag_data.padding_address));
12174
12175 last_size = fragP->tc_frag_data.prefix_length;
12176 /* Check if there is change from the last interation. */
12177 if (padding_size == last_size)
12178 {
12179 /* Update the expected address of the padding frag. */
12180 padding_fragP->tc_frag_data.padding_address
12181 = (fragP->fr_address + padding_size
12182 + fragP->tc_frag_data.padding_address);
12183 return 0;
12184 }
12185
12186 if (padding_size > fragP->tc_frag_data.max_prefix_length)
12187 {
12188 /* No padding if there is no sufficient room. Clear the
12189 expected address of the padding frag. */
12190 padding_fragP->tc_frag_data.padding_address = 0;
12191 padding_size = 0;
12192 }
12193 else
12194 /* Store the expected address of the padding frag. */
12195 padding_fragP->tc_frag_data.padding_address
12196 = (fragP->fr_address + padding_size
12197 + fragP->tc_frag_data.padding_address);
12198
12199 fragP->tc_frag_data.prefix_length = padding_size;
12200
12201 /* Update the length for the current interation. */
12202 left_size = padding_size;
12203 for (next_fragP = fragP;
12204 next_fragP != padding_fragP;
12205 next_fragP = next_fragP->fr_next)
12206 if (next_fragP->fr_type == rs_machine_dependent
12207 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12208 == BRANCH_PREFIX))
12209 {
12210 if (left_size)
12211 {
12212 int max = next_fragP->tc_frag_data.max_bytes;
12213 if (max)
12214 {
12215 int size;
12216 if (max > left_size)
12217 size = left_size;
12218 else
12219 size = max;
12220 left_size -= size;
12221 next_fragP->tc_frag_data.length = size;
12222 }
12223 }
12224 else
12225 next_fragP->tc_frag_data.length = 0;
12226 }
12227
12228 return (fragP->tc_frag_data.length
12229 - fragP->tc_frag_data.last_length);
12230 }
12231 return relax_frag (segment, fragP, stretch);
12232}
12233
ee7fcc42
AM
12234/* md_estimate_size_before_relax()
12235
12236 Called just before relax() for rs_machine_dependent frags. The x86
12237 assembler uses these frags to handle variable size jump
12238 instructions.
12239
12240 Any symbol that is now undefined will not become defined.
12241 Return the correct fr_subtype in the frag.
12242 Return the initial "guess for variable size of frag" to caller.
12243 The guess is actually the growth beyond the fixed part. Whatever
12244 we do to grow the fixed or variable part contributes to our
12245 returned value. */
12246
252b5132 12247int
7016a5d5 12248md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 12249{
e379e5f3
L
12250 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12251 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
12252 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12253 {
12254 i386_classify_machine_dependent_frag (fragP);
12255 return fragP->tc_frag_data.length;
12256 }
12257
252b5132 12258 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
12259 check for un-relaxable symbols. On an ELF system, we can't relax
12260 an externally visible symbol, because it may be overridden by a
12261 shared library. */
12262 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 12263#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12264 || (IS_ELF
8dcea932
L
12265 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
12266 fragP->fr_var))
fbeb56a4
DK
12267#endif
12268#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 12269 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 12270 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
12271#endif
12272 )
252b5132 12273 {
b98ef147
AM
12274 /* Symbol is undefined in this segment, or we need to keep a
12275 reloc so that weak symbols can be overridden. */
12276 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 12277 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
12278 unsigned char *opcode;
12279 int old_fr_fix;
eb19308f 12280 fixS *fixP = NULL;
f6af82bd 12281
ee7fcc42 12282 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 12283 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 12284 else if (size == 2)
f6af82bd 12285 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
12286#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12287 else if (need_plt32_p (fragP->fr_symbol))
12288 reloc_type = BFD_RELOC_X86_64_PLT32;
12289#endif
f6af82bd
AM
12290 else
12291 reloc_type = BFD_RELOC_32_PCREL;
252b5132 12292
ee7fcc42
AM
12293 old_fr_fix = fragP->fr_fix;
12294 opcode = (unsigned char *) fragP->fr_opcode;
12295
fddf5b5b 12296 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 12297 {
fddf5b5b
AM
12298 case UNCOND_JUMP:
12299 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 12300 opcode[0] = 0xe9;
252b5132 12301 fragP->fr_fix += size;
eb19308f
JB
12302 fixP = fix_new (fragP, old_fr_fix, size,
12303 fragP->fr_symbol,
12304 fragP->fr_offset, 1,
12305 reloc_type);
252b5132
RH
12306 break;
12307
fddf5b5b 12308 case COND_JUMP86:
412167cb
AM
12309 if (size == 2
12310 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
12311 {
12312 /* Negate the condition, and branch past an
12313 unconditional jump. */
12314 opcode[0] ^= 1;
12315 opcode[1] = 3;
12316 /* Insert an unconditional jump. */
12317 opcode[2] = 0xe9;
12318 /* We added two extra opcode bytes, and have a two byte
12319 offset. */
12320 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12321 fix_new (fragP, old_fr_fix + 2, 2,
12322 fragP->fr_symbol,
12323 fragP->fr_offset, 1,
12324 reloc_type);
fddf5b5b
AM
12325 break;
12326 }
12327 /* Fall through. */
12328
12329 case COND_JUMP:
412167cb
AM
12330 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12331 {
12332 fragP->fr_fix += 1;
3e02c1cc
AM
12333 fixP = fix_new (fragP, old_fr_fix, 1,
12334 fragP->fr_symbol,
12335 fragP->fr_offset, 1,
12336 BFD_RELOC_8_PCREL);
12337 fixP->fx_signed = 1;
412167cb
AM
12338 break;
12339 }
93c2a809 12340
24eab124 12341 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12342 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12343 opcode[1] = opcode[0] + 0x10;
f6af82bd 12344 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12345 /* We've added an opcode byte. */
12346 fragP->fr_fix += 1 + size;
eb19308f
JB
12347 fixP = fix_new (fragP, old_fr_fix + 1, size,
12348 fragP->fr_symbol,
12349 fragP->fr_offset, 1,
12350 reloc_type);
252b5132 12351 break;
fddf5b5b
AM
12352
12353 default:
12354 BAD_CASE (fragP->fr_subtype);
12355 break;
252b5132 12356 }
eb19308f
JB
12357
12358 /* All jumps handled here are signed, but don't unconditionally use a
12359 signed limit check for 32 and 16 bit jumps as we want to allow wrap
12360 around at 4G (outside of 64-bit mode) and 64k. */
12361 if (size == 4 && flag_code == CODE_64BIT)
12362 fixP->fx_signed = 1;
12363
252b5132 12364 frag_wane (fragP);
ee7fcc42 12365 return fragP->fr_fix - old_fr_fix;
252b5132 12366 }
93c2a809 12367
93c2a809
AM
12368 /* Guess size depending on current relax state. Initially the relax
12369 state will correspond to a short jump and we return 1, because
12370 the variable part of the frag (the branch offset) is one byte
12371 long. However, we can relax a section more than once and in that
12372 case we must either set fr_subtype back to the unrelaxed state,
12373 or return the value for the appropriate branch. */
12374 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12375}
12376
47926f60
KH
12377/* Called after relax() is finished.
12378
12379 In: Address of frag.
12380 fr_type == rs_machine_dependent.
12381 fr_subtype is what the address relaxed to.
12382
12383 Out: Any fixSs and constants are set up.
12384 Caller will turn frag into a ".space 0". */
12385
252b5132 12386void
7016a5d5
TG
12387md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12388 fragS *fragP)
252b5132 12389{
29b0f896 12390 unsigned char *opcode;
252b5132 12391 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12392 offsetT target_address;
12393 offsetT opcode_address;
252b5132 12394 unsigned int extension = 0;
847f7ad4 12395 offsetT displacement_from_opcode_start;
252b5132 12396
e379e5f3
L
12397 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12398 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12399 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12400 {
12401 /* Generate nop padding. */
12402 unsigned int size = fragP->tc_frag_data.length;
12403 if (size)
12404 {
12405 if (size > fragP->tc_frag_data.max_bytes)
12406 abort ();
12407
12408 if (flag_debug)
12409 {
12410 const char *msg;
12411 const char *branch = "branch";
12412 const char *prefix = "";
12413 fragS *padding_fragP;
12414 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12415 == BRANCH_PREFIX)
12416 {
12417 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12418 switch (fragP->tc_frag_data.default_prefix)
12419 {
12420 default:
12421 abort ();
12422 break;
12423 case CS_PREFIX_OPCODE:
12424 prefix = " cs";
12425 break;
12426 case DS_PREFIX_OPCODE:
12427 prefix = " ds";
12428 break;
12429 case ES_PREFIX_OPCODE:
12430 prefix = " es";
12431 break;
12432 case FS_PREFIX_OPCODE:
12433 prefix = " fs";
12434 break;
12435 case GS_PREFIX_OPCODE:
12436 prefix = " gs";
12437 break;
12438 case SS_PREFIX_OPCODE:
12439 prefix = " ss";
12440 break;
12441 }
12442 if (padding_fragP)
12443 msg = _("%s:%u: add %d%s at 0x%llx to align "
12444 "%s within %d-byte boundary\n");
12445 else
12446 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12447 "align %s within %d-byte boundary\n");
12448 }
12449 else
12450 {
12451 padding_fragP = fragP;
12452 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12453 "%s within %d-byte boundary\n");
12454 }
12455
12456 if (padding_fragP)
12457 switch (padding_fragP->tc_frag_data.branch_type)
12458 {
12459 case align_branch_jcc:
12460 branch = "jcc";
12461 break;
12462 case align_branch_fused:
12463 branch = "fused jcc";
12464 break;
12465 case align_branch_jmp:
12466 branch = "jmp";
12467 break;
12468 case align_branch_call:
12469 branch = "call";
12470 break;
12471 case align_branch_indirect:
12472 branch = "indiret branch";
12473 break;
12474 case align_branch_ret:
12475 branch = "ret";
12476 break;
12477 default:
12478 break;
12479 }
12480
12481 fprintf (stdout, msg,
12482 fragP->fr_file, fragP->fr_line, size, prefix,
12483 (long long) fragP->fr_address, branch,
12484 1 << align_branch_power);
12485 }
12486 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12487 memset (fragP->fr_opcode,
12488 fragP->tc_frag_data.default_prefix, size);
12489 else
12490 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12491 size, 0);
12492 fragP->fr_fix += size;
12493 }
12494 return;
12495 }
12496
252b5132
RH
12497 opcode = (unsigned char *) fragP->fr_opcode;
12498
47926f60 12499 /* Address we want to reach in file space. */
252b5132 12500 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12501
47926f60 12502 /* Address opcode resides at in file space. */
252b5132
RH
12503 opcode_address = fragP->fr_address + fragP->fr_fix;
12504
47926f60 12505 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12506 displacement_from_opcode_start = target_address - opcode_address;
12507
fddf5b5b 12508 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12509 {
47926f60
KH
12510 /* Don't have to change opcode. */
12511 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12512 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12513 }
12514 else
12515 {
12516 if (no_cond_jump_promotion
12517 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12518 as_warn_where (fragP->fr_file, fragP->fr_line,
12519 _("long jump required"));
252b5132 12520
fddf5b5b
AM
12521 switch (fragP->fr_subtype)
12522 {
12523 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12524 extension = 4; /* 1 opcode + 4 displacement */
12525 opcode[0] = 0xe9;
12526 where_to_put_displacement = &opcode[1];
12527 break;
252b5132 12528
fddf5b5b
AM
12529 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12530 extension = 2; /* 1 opcode + 2 displacement */
12531 opcode[0] = 0xe9;
12532 where_to_put_displacement = &opcode[1];
12533 break;
252b5132 12534
fddf5b5b
AM
12535 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12536 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12537 extension = 5; /* 2 opcode + 4 displacement */
12538 opcode[1] = opcode[0] + 0x10;
12539 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12540 where_to_put_displacement = &opcode[2];
12541 break;
252b5132 12542
fddf5b5b
AM
12543 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12544 extension = 3; /* 2 opcode + 2 displacement */
12545 opcode[1] = opcode[0] + 0x10;
12546 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12547 where_to_put_displacement = &opcode[2];
12548 break;
252b5132 12549
fddf5b5b
AM
12550 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12551 extension = 4;
12552 opcode[0] ^= 1;
12553 opcode[1] = 3;
12554 opcode[2] = 0xe9;
12555 where_to_put_displacement = &opcode[3];
12556 break;
12557
12558 default:
12559 BAD_CASE (fragP->fr_subtype);
12560 break;
12561 }
252b5132 12562 }
fddf5b5b 12563
7b81dfbb
AJ
12564 /* If size if less then four we are sure that the operand fits,
12565 but if it's 4, then it could be that the displacement is larger
12566 then -/+ 2GB. */
12567 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12568 && object_64bit
12569 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12570 + ((addressT) 1 << 31))
12571 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12572 {
12573 as_bad_where (fragP->fr_file, fragP->fr_line,
12574 _("jump target out of range"));
12575 /* Make us emit 0. */
12576 displacement_from_opcode_start = extension;
12577 }
47926f60 12578 /* Now put displacement after opcode. */
252b5132
RH
12579 md_number_to_chars ((char *) where_to_put_displacement,
12580 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12581 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12582 fragP->fr_fix += extension;
12583}
12584\f
7016a5d5 12585/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12586 by our caller that we have all the info we need to fix it up.
12587
7016a5d5
TG
12588 Parameter valP is the pointer to the value of the bits.
12589
252b5132
RH
12590 On the 386, immediates, displacements, and data pointers are all in
12591 the same (little-endian) format, so we don't need to care about which
12592 we are handling. */
12593
94f592af 12594void
7016a5d5 12595md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12596{
94f592af 12597 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12598 valueT value = *valP;
252b5132 12599
f86103b7 12600#if !defined (TE_Mach)
93382f6d
AM
12601 if (fixP->fx_pcrel)
12602 {
12603 switch (fixP->fx_r_type)
12604 {
5865bb77
ILT
12605 default:
12606 break;
12607
d6ab8113
JB
12608 case BFD_RELOC_64:
12609 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12610 break;
93382f6d 12611 case BFD_RELOC_32:
ae8887b5 12612 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12613 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12614 break;
12615 case BFD_RELOC_16:
12616 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12617 break;
12618 case BFD_RELOC_8:
12619 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12620 break;
12621 }
12622 }
252b5132 12623
a161fe53 12624 if (fixP->fx_addsy != NULL
31312f95 12625 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12626 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12627 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12628 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12629 && !use_rela_relocations)
252b5132 12630 {
31312f95
AM
12631 /* This is a hack. There should be a better way to handle this.
12632 This covers for the fact that bfd_install_relocation will
12633 subtract the current location (for partial_inplace, PC relative
12634 relocations); see more below. */
252b5132 12635#ifndef OBJ_AOUT
718ddfc0 12636 if (IS_ELF
252b5132
RH
12637#ifdef TE_PE
12638 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12639#endif
12640 )
12641 value += fixP->fx_where + fixP->fx_frag->fr_address;
12642#endif
12643#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12644 if (IS_ELF)
252b5132 12645 {
6539b54b 12646 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12647
6539b54b 12648 if ((sym_seg == seg
2f66722d 12649 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12650 && sym_seg != absolute_section))
af65af87 12651 && !generic_force_reloc (fixP))
2f66722d
AM
12652 {
12653 /* Yes, we add the values in twice. This is because
6539b54b
AM
12654 bfd_install_relocation subtracts them out again. I think
12655 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12656 it. FIXME. */
12657 value += fixP->fx_where + fixP->fx_frag->fr_address;
12658 }
252b5132
RH
12659 }
12660#endif
12661#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12662 /* For some reason, the PE format does not store a
12663 section address offset for a PC relative symbol. */
12664 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12665 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12666 value += md_pcrel_from (fixP);
12667#endif
12668 }
fbeb56a4 12669#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12670 if (fixP->fx_addsy != NULL
12671 && S_IS_WEAK (fixP->fx_addsy)
12672 /* PR 16858: Do not modify weak function references. */
12673 && ! fixP->fx_pcrel)
fbeb56a4 12674 {
296a8689
NC
12675#if !defined (TE_PEP)
12676 /* For x86 PE weak function symbols are neither PC-relative
12677 nor do they set S_IS_FUNCTION. So the only reliable way
12678 to detect them is to check the flags of their containing
12679 section. */
12680 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12681 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12682 ;
12683 else
12684#endif
fbeb56a4
DK
12685 value -= S_GET_VALUE (fixP->fx_addsy);
12686 }
12687#endif
252b5132
RH
12688
12689 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12690 and we must not disappoint it. */
252b5132 12691#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12692 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12693 switch (fixP->fx_r_type)
12694 {
12695 case BFD_RELOC_386_PLT32:
3e73aa7c 12696 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12697 /* Make the jump instruction point to the address of the operand.
12698 At runtime we merely add the offset to the actual PLT entry.
12699 NB: Subtract the offset size only for jump instructions. */
12700 if (fixP->fx_pcrel)
12701 value = -4;
47926f60 12702 break;
31312f95 12703
13ae64f3
JJ
12704 case BFD_RELOC_386_TLS_GD:
12705 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12706 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12707 case BFD_RELOC_386_TLS_IE:
12708 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12709 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12710 case BFD_RELOC_X86_64_TLSGD:
12711 case BFD_RELOC_X86_64_TLSLD:
12712 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12713 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12714 value = 0; /* Fully resolved at runtime. No addend. */
12715 /* Fallthrough */
12716 case BFD_RELOC_386_TLS_LE:
12717 case BFD_RELOC_386_TLS_LDO_32:
12718 case BFD_RELOC_386_TLS_LE_32:
12719 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12720 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12721 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12722 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12723 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12724 break;
12725
67a4f2b7
AO
12726 case BFD_RELOC_386_TLS_DESC_CALL:
12727 case BFD_RELOC_X86_64_TLSDESC_CALL:
12728 value = 0; /* Fully resolved at runtime. No addend. */
12729 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12730 fixP->fx_done = 0;
12731 return;
12732
47926f60
KH
12733 case BFD_RELOC_VTABLE_INHERIT:
12734 case BFD_RELOC_VTABLE_ENTRY:
12735 fixP->fx_done = 0;
94f592af 12736 return;
47926f60
KH
12737
12738 default:
12739 break;
12740 }
12741#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12742 *valP = value;
f86103b7 12743#endif /* !defined (TE_Mach) */
3e73aa7c 12744
3e73aa7c 12745 /* Are we finished with this relocation now? */
c6682705 12746 if (fixP->fx_addsy == NULL)
b8188555
JB
12747 {
12748 fixP->fx_done = 1;
12749 switch (fixP->fx_r_type)
12750 {
12751 case BFD_RELOC_X86_64_32S:
12752 fixP->fx_signed = 1;
12753 break;
12754
12755 default:
12756 break;
12757 }
12758 }
fbeb56a4
DK
12759#if defined (OBJ_COFF) && defined (TE_PE)
12760 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12761 {
12762 fixP->fx_done = 0;
12763 /* Remember value for tc_gen_reloc. */
12764 fixP->fx_addnumber = value;
12765 /* Clear out the frag for now. */
12766 value = 0;
12767 }
12768#endif
3e73aa7c
JH
12769 else if (use_rela_relocations)
12770 {
12771 fixP->fx_no_overflow = 1;
062cd5e7
AS
12772 /* Remember value for tc_gen_reloc. */
12773 fixP->fx_addnumber = value;
3e73aa7c
JH
12774 value = 0;
12775 }
f86103b7 12776
94f592af 12777 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12778}
252b5132 12779\f
6d4af3c2 12780const char *
499ac353 12781md_atof (int type, char *litP, int *sizeP)
252b5132 12782{
499ac353
NC
12783 /* This outputs the LITTLENUMs in REVERSE order;
12784 in accord with the bigendian 386. */
5b7c81bd 12785 return ieee_md_atof (type, litP, sizeP, false);
252b5132
RH
12786}
12787\f
2d545b82 12788static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12789
252b5132 12790static char *
e3bb37b5 12791output_invalid (int c)
252b5132 12792{
3882b010 12793 if (ISPRINT (c))
f9f21a03
L
12794 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12795 "'%c'", c);
252b5132 12796 else
f9f21a03 12797 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12798 "(0x%x)", (unsigned char) c);
252b5132
RH
12799 return output_invalid_buf;
12800}
12801
8a6fb3f9
JB
12802/* Verify that @r can be used in the current context. */
12803
5b7c81bd 12804static bool check_register (const reg_entry *r)
8a6fb3f9
JB
12805{
12806 if (allow_pseudo_reg)
5b7c81bd 12807 return true;
8a6fb3f9
JB
12808
12809 if (operand_type_all_zero (&r->reg_type))
5b7c81bd 12810 return false;
8a6fb3f9
JB
12811
12812 if ((r->reg_type.bitfield.dword
12813 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12814 || r->reg_type.bitfield.class == RegCR
22e00a3f 12815 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9 12816 && !cpu_arch_flags.bitfield.cpui386)
5b7c81bd 12817 return false;
8a6fb3f9 12818
22e00a3f
JB
12819 if (r->reg_type.bitfield.class == RegTR
12820 && (flag_code == CODE_64BIT
12821 || !cpu_arch_flags.bitfield.cpui386
12822 || cpu_arch_isa_flags.bitfield.cpui586
12823 || cpu_arch_isa_flags.bitfield.cpui686))
5b7c81bd 12824 return false;
22e00a3f 12825
8a6fb3f9 12826 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
5b7c81bd 12827 return false;
8a6fb3f9
JB
12828
12829 if (!cpu_arch_flags.bitfield.cpuavx512f)
12830 {
12831 if (r->reg_type.bitfield.zmmword
12832 || r->reg_type.bitfield.class == RegMask)
5b7c81bd 12833 return false;
8a6fb3f9
JB
12834
12835 if (!cpu_arch_flags.bitfield.cpuavx)
12836 {
12837 if (r->reg_type.bitfield.ymmword)
5b7c81bd 12838 return false;
8a6fb3f9
JB
12839
12840 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
5b7c81bd 12841 return false;
8a6fb3f9
JB
12842 }
12843 }
12844
260cd341
LC
12845 if (r->reg_type.bitfield.tmmword
12846 && (!cpu_arch_flags.bitfield.cpuamx_tile
12847 || flag_code != CODE_64BIT))
5b7c81bd 12848 return false;
260cd341 12849
8a6fb3f9 12850 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
5b7c81bd 12851 return false;
8a6fb3f9
JB
12852
12853 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12854 if (!allow_index_reg && r->reg_num == RegIZ)
5b7c81bd 12855 return false;
8a6fb3f9
JB
12856
12857 /* Upper 16 vector registers are only available with VREX in 64bit
12858 mode, and require EVEX encoding. */
12859 if (r->reg_flags & RegVRex)
12860 {
12861 if (!cpu_arch_flags.bitfield.cpuavx512f
12862 || flag_code != CODE_64BIT)
5b7c81bd 12863 return false;
8a6fb3f9 12864
da4977e0
JB
12865 if (i.vec_encoding == vex_encoding_default)
12866 i.vec_encoding = vex_encoding_evex;
12867 else if (i.vec_encoding != vex_encoding_evex)
12868 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12869 }
12870
12871 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12872 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12873 && flag_code != CODE_64BIT)
5b7c81bd 12874 return false;
8a6fb3f9
JB
12875
12876 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12877 && !intel_syntax)
5b7c81bd 12878 return false;
8a6fb3f9 12879
5b7c81bd 12880 return true;
8a6fb3f9
JB
12881}
12882
af6bdddf 12883/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12884
12885static const reg_entry *
4d1bb795 12886parse_real_register (char *reg_string, char **end_op)
252b5132 12887{
af6bdddf
AM
12888 char *s = reg_string;
12889 char *p;
252b5132
RH
12890 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12891 const reg_entry *r;
12892
12893 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12894 if (*s == REGISTER_PREFIX)
12895 ++s;
12896
12897 if (is_space_char (*s))
12898 ++s;
12899
12900 p = reg_name_given;
af6bdddf 12901 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12902 {
12903 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12904 return (const reg_entry *) NULL;
12905 s++;
252b5132
RH
12906 }
12907
6588847e
DN
12908 /* For naked regs, make sure that we are not dealing with an identifier.
12909 This prevents confusing an identifier like `eax_var' with register
12910 `eax'. */
12911 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12912 return (const reg_entry *) NULL;
12913
af6bdddf 12914 *end_op = s;
252b5132 12915
629310ab 12916 r = (const reg_entry *) str_hash_find (reg_hash, reg_name_given);
252b5132 12917
5f47d35b 12918 /* Handle floating point regs, allowing spaces in the (i) part. */
6288d05f 12919 if (r == reg_st0)
5f47d35b 12920 {
0e0eea78
JB
12921 if (!cpu_arch_flags.bitfield.cpu8087
12922 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12923 && !cpu_arch_flags.bitfield.cpu387
12924 && !allow_pseudo_reg)
0e0eea78
JB
12925 return (const reg_entry *) NULL;
12926
5f47d35b
AM
12927 if (is_space_char (*s))
12928 ++s;
12929 if (*s == '(')
12930 {
af6bdddf 12931 ++s;
5f47d35b
AM
12932 if (is_space_char (*s))
12933 ++s;
12934 if (*s >= '0' && *s <= '7')
12935 {
db557034 12936 int fpr = *s - '0';
af6bdddf 12937 ++s;
5f47d35b
AM
12938 if (is_space_char (*s))
12939 ++s;
12940 if (*s == ')')
12941 {
12942 *end_op = s + 1;
6288d05f 12943 know (r[fpr].reg_num == fpr);
db557034 12944 return r + fpr;
5f47d35b 12945 }
5f47d35b 12946 }
47926f60 12947 /* We have "%st(" then garbage. */
5f47d35b
AM
12948 return (const reg_entry *) NULL;
12949 }
12950 }
12951
8a6fb3f9 12952 return r && check_register (r) ? r : NULL;
252b5132 12953}
4d1bb795
JB
12954
12955/* REG_STRING starts *before* REGISTER_PREFIX. */
12956
12957static const reg_entry *
12958parse_register (char *reg_string, char **end_op)
12959{
12960 const reg_entry *r;
12961
12962 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12963 r = parse_real_register (reg_string, end_op);
12964 else
12965 r = NULL;
12966 if (!r)
12967 {
12968 char *save = input_line_pointer;
12969 char c;
12970 symbolS *symbolP;
12971
12972 input_line_pointer = reg_string;
d02603dc 12973 c = get_symbol_name (&reg_string);
4d1bb795
JB
12974 symbolP = symbol_find (reg_string);
12975 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12976 {
12977 const expressionS *e = symbol_get_value_expression (symbolP);
12978
0398aac5 12979 know (e->X_op == O_register);
4eed87de 12980 know (e->X_add_number >= 0
c3fe08fa 12981 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12982 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12983 if (!check_register (r))
12984 {
12985 as_bad (_("register '%s%s' cannot be used here"),
12986 register_prefix, r->reg_name);
12987 r = &bad_reg;
12988 }
4d1bb795
JB
12989 *end_op = input_line_pointer;
12990 }
12991 *input_line_pointer = c;
12992 input_line_pointer = save;
12993 }
12994 return r;
12995}
12996
12997int
12998i386_parse_name (char *name, expressionS *e, char *nextcharP)
12999{
13000 const reg_entry *r;
13001 char *end = input_line_pointer;
13002
13003 *end = *nextcharP;
13004 r = parse_register (name, &input_line_pointer);
13005 if (r && end <= input_line_pointer)
13006 {
13007 *nextcharP = *input_line_pointer;
13008 *input_line_pointer = 0;
8a6fb3f9
JB
13009 if (r != &bad_reg)
13010 {
13011 e->X_op = O_register;
13012 e->X_add_number = r - i386_regtab;
13013 }
13014 else
13015 e->X_op = O_illegal;
4d1bb795
JB
13016 return 1;
13017 }
13018 input_line_pointer = end;
13019 *end = 0;
ee86248c 13020 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
13021}
13022
13023void
13024md_operand (expressionS *e)
13025{
ee86248c
JB
13026 char *end;
13027 const reg_entry *r;
4d1bb795 13028
ee86248c
JB
13029 switch (*input_line_pointer)
13030 {
13031 case REGISTER_PREFIX:
13032 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
13033 if (r)
13034 {
13035 e->X_op = O_register;
13036 e->X_add_number = r - i386_regtab;
13037 input_line_pointer = end;
13038 }
ee86248c
JB
13039 break;
13040
13041 case '[':
9c2799c2 13042 gas_assert (intel_syntax);
ee86248c
JB
13043 end = input_line_pointer++;
13044 expression (e);
13045 if (*input_line_pointer == ']')
13046 {
13047 ++input_line_pointer;
13048 e->X_op_symbol = make_expr_symbol (e);
13049 e->X_add_symbol = NULL;
13050 e->X_add_number = 0;
13051 e->X_op = O_index;
13052 }
13053 else
13054 {
13055 e->X_op = O_absent;
13056 input_line_pointer = end;
13057 }
13058 break;
4d1bb795
JB
13059 }
13060}
13061
252b5132 13062\f
4cc782b5 13063#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 13064const char *md_shortopts = "kVQ:sqnO::";
252b5132 13065#else
b6f8c7c4 13066const char *md_shortopts = "qnO::";
252b5132 13067#endif
6e0b89ee 13068
3e73aa7c 13069#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
13070#define OPTION_64 (OPTION_MD_BASE + 1)
13071#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
13072#define OPTION_MARCH (OPTION_MD_BASE + 3)
13073#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
13074#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
13075#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
13076#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
13077#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 13078#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 13079#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 13080#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
13081#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
13082#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
13083#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 13084#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
13085#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
13086#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 13087#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 13088#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 13089#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 13090#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
13091#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
13092#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 13093#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 13094#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 13095#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
13096#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
13097#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
13098#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 13099#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
13100#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
13101#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
13102#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 13103
99ad8390
NC
13104struct option md_longopts[] =
13105{
3e73aa7c 13106 {"32", no_argument, NULL, OPTION_32},
321098a5 13107#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 13108 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 13109 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
13110#endif
13111#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 13112 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 13113 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 13114 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 13115#endif
b3b91714 13116 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
13117 {"march", required_argument, NULL, OPTION_MARCH},
13118 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
13119 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
13120 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
13121 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
13122 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 13123 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 13124 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 13125 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 13126 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 13127 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 13128 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
13129 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
13130 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
13131# if defined (TE_PE) || defined (TE_PEP)
13132 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
13133#endif
d1982f93 13134 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 13135 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 13136 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 13137 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
13138 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
13139 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
13140 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 13141 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
13142 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
13143 {"mlfence-before-indirect-branch", required_argument, NULL,
13144 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
13145 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
13146 {"mamd64", no_argument, NULL, OPTION_MAMD64},
13147 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
13148 {NULL, no_argument, NULL, 0}
13149};
13150size_t md_longopts_size = sizeof (md_longopts);
13151
13152int
17b9d67d 13153md_parse_option (int c, const char *arg)
252b5132 13154{
91d6fa6a 13155 unsigned int j;
e379e5f3 13156 char *arch, *next, *saved, *type;
9103f4f4 13157
252b5132
RH
13158 switch (c)
13159 {
12b55ccc
L
13160 case 'n':
13161 optimize_align_code = 0;
13162 break;
13163
a38cf1db
AM
13164 case 'q':
13165 quiet_warnings = 1;
252b5132
RH
13166 break;
13167
13168#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
13169 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
13170 should be emitted or not. FIXME: Not implemented. */
13171 case 'Q':
d4693039
JB
13172 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
13173 return 0;
252b5132
RH
13174 break;
13175
13176 /* -V: SVR4 argument to print version ID. */
13177 case 'V':
13178 print_version_id ();
13179 break;
13180
a38cf1db
AM
13181 /* -k: Ignore for FreeBSD compatibility. */
13182 case 'k':
252b5132 13183 break;
4cc782b5
ILT
13184
13185 case 's':
13186 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 13187 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 13188 break;
8dcea932
L
13189
13190 case OPTION_MSHARED:
13191 shared = 1;
13192 break;
b4a3a7b4
L
13193
13194 case OPTION_X86_USED_NOTE:
13195 if (strcasecmp (arg, "yes") == 0)
13196 x86_used_note = 1;
13197 else if (strcasecmp (arg, "no") == 0)
13198 x86_used_note = 0;
13199 else
13200 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
13201 break;
13202
13203
99ad8390 13204#endif
321098a5 13205#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 13206 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
13207 case OPTION_64:
13208 {
13209 const char **list, **l;
13210
3e73aa7c
JH
13211 list = bfd_target_list ();
13212 for (l = list; *l != NULL; l++)
08dedd66 13213 if (startswith (*l, "elf64-x86-64")
99ad8390
NC
13214 || strcmp (*l, "coff-x86-64") == 0
13215 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
13216 || strcmp (*l, "pei-x86-64") == 0
13217 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
13218 {
13219 default_arch = "x86_64";
13220 break;
13221 }
3e73aa7c 13222 if (*l == NULL)
2b5d6a91 13223 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
13224 free (list);
13225 }
13226 break;
13227#endif
252b5132 13228
351f65ca 13229#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 13230 case OPTION_X32:
351f65ca
L
13231 if (IS_ELF)
13232 {
13233 const char **list, **l;
13234
13235 list = bfd_target_list ();
13236 for (l = list; *l != NULL; l++)
08dedd66 13237 if (startswith (*l, "elf32-x86-64"))
351f65ca
L
13238 {
13239 default_arch = "x86_64:32";
13240 break;
13241 }
13242 if (*l == NULL)
2b5d6a91 13243 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
13244 free (list);
13245 }
13246 else
13247 as_fatal (_("32bit x86_64 is only supported for ELF"));
13248 break;
13249#endif
13250
6e0b89ee
AM
13251 case OPTION_32:
13252 default_arch = "i386";
13253 break;
13254
b3b91714
AM
13255 case OPTION_DIVIDE:
13256#ifdef SVR4_COMMENT_CHARS
13257 {
13258 char *n, *t;
13259 const char *s;
13260
add39d23 13261 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
13262 t = n;
13263 for (s = i386_comment_chars; *s != '\0'; s++)
13264 if (*s != '/')
13265 *t++ = *s;
13266 *t = '\0';
13267 i386_comment_chars = n;
13268 }
13269#endif
13270 break;
13271
9103f4f4 13272 case OPTION_MARCH:
293f5f65
L
13273 saved = xstrdup (arg);
13274 arch = saved;
13275 /* Allow -march=+nosse. */
13276 if (*arch == '+')
13277 arch++;
6305a203 13278 do
9103f4f4 13279 {
6305a203 13280 if (*arch == '.')
2b5d6a91 13281 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13282 next = strchr (arch, '+');
13283 if (next)
13284 *next++ = '\0';
91d6fa6a 13285 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13286 {
91d6fa6a 13287 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 13288 {
6305a203 13289 /* Processor. */
1ded5609
JB
13290 if (! cpu_arch[j].flags.bitfield.cpui386)
13291 continue;
13292
91d6fa6a 13293 cpu_arch_name = cpu_arch[j].name;
6305a203 13294 cpu_sub_arch_name = NULL;
91d6fa6a
NC
13295 cpu_arch_flags = cpu_arch[j].flags;
13296 cpu_arch_isa = cpu_arch[j].type;
13297 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
13298 if (!cpu_arch_tune_set)
13299 {
13300 cpu_arch_tune = cpu_arch_isa;
13301 cpu_arch_tune_flags = cpu_arch_isa_flags;
13302 }
13303 break;
13304 }
91d6fa6a
NC
13305 else if (*cpu_arch [j].name == '.'
13306 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 13307 {
33eaf5de 13308 /* ISA extension. */
6305a203 13309 i386_cpu_flags flags;
309d3373 13310
293f5f65
L
13311 flags = cpu_flags_or (cpu_arch_flags,
13312 cpu_arch[j].flags);
81486035 13313
5b64d091 13314 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
13315 {
13316 if (cpu_sub_arch_name)
13317 {
13318 char *name = cpu_sub_arch_name;
13319 cpu_sub_arch_name = concat (name,
91d6fa6a 13320 cpu_arch[j].name,
1bf57e9f 13321 (const char *) NULL);
6305a203
L
13322 free (name);
13323 }
13324 else
91d6fa6a 13325 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 13326 cpu_arch_flags = flags;
a586129e 13327 cpu_arch_isa_flags = flags;
6305a203 13328 }
0089dace
L
13329 else
13330 cpu_arch_isa_flags
13331 = cpu_flags_or (cpu_arch_isa_flags,
13332 cpu_arch[j].flags);
6305a203 13333 break;
ccc9c027 13334 }
9103f4f4 13335 }
6305a203 13336
293f5f65
L
13337 if (j >= ARRAY_SIZE (cpu_arch))
13338 {
33eaf5de 13339 /* Disable an ISA extension. */
293f5f65
L
13340 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13341 if (strcmp (arch, cpu_noarch [j].name) == 0)
13342 {
13343 i386_cpu_flags flags;
13344
13345 flags = cpu_flags_and_not (cpu_arch_flags,
13346 cpu_noarch[j].flags);
13347 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13348 {
13349 if (cpu_sub_arch_name)
13350 {
13351 char *name = cpu_sub_arch_name;
13352 cpu_sub_arch_name = concat (arch,
13353 (const char *) NULL);
13354 free (name);
13355 }
13356 else
13357 cpu_sub_arch_name = xstrdup (arch);
13358 cpu_arch_flags = flags;
13359 cpu_arch_isa_flags = flags;
13360 }
13361 break;
13362 }
13363
13364 if (j >= ARRAY_SIZE (cpu_noarch))
13365 j = ARRAY_SIZE (cpu_arch);
13366 }
13367
91d6fa6a 13368 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13369 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13370
13371 arch = next;
9103f4f4 13372 }
293f5f65
L
13373 while (next != NULL);
13374 free (saved);
9103f4f4
L
13375 break;
13376
13377 case OPTION_MTUNE:
13378 if (*arg == '.')
2b5d6a91 13379 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13380 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13381 {
91d6fa6a 13382 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13383 {
ccc9c027 13384 cpu_arch_tune_set = 1;
91d6fa6a
NC
13385 cpu_arch_tune = cpu_arch [j].type;
13386 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13387 break;
13388 }
13389 }
91d6fa6a 13390 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13391 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13392 break;
13393
1efbbeb4
L
13394 case OPTION_MMNEMONIC:
13395 if (strcasecmp (arg, "att") == 0)
13396 intel_mnemonic = 0;
13397 else if (strcasecmp (arg, "intel") == 0)
13398 intel_mnemonic = 1;
13399 else
2b5d6a91 13400 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13401 break;
13402
13403 case OPTION_MSYNTAX:
13404 if (strcasecmp (arg, "att") == 0)
13405 intel_syntax = 0;
13406 else if (strcasecmp (arg, "intel") == 0)
13407 intel_syntax = 1;
13408 else
2b5d6a91 13409 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13410 break;
13411
13412 case OPTION_MINDEX_REG:
13413 allow_index_reg = 1;
13414 break;
13415
13416 case OPTION_MNAKED_REG:
13417 allow_naked_reg = 1;
13418 break;
13419
c0f3af97
L
13420 case OPTION_MSSE2AVX:
13421 sse2avx = 1;
13422 break;
13423
daf50ae7
L
13424 case OPTION_MSSE_CHECK:
13425 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13426 sse_check = check_error;
daf50ae7 13427 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13428 sse_check = check_warning;
daf50ae7 13429 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13430 sse_check = check_none;
daf50ae7 13431 else
2b5d6a91 13432 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13433 break;
13434
7bab8ab5
JB
13435 case OPTION_MOPERAND_CHECK:
13436 if (strcasecmp (arg, "error") == 0)
13437 operand_check = check_error;
13438 else if (strcasecmp (arg, "warning") == 0)
13439 operand_check = check_warning;
13440 else if (strcasecmp (arg, "none") == 0)
13441 operand_check = check_none;
13442 else
13443 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13444 break;
13445
539f890d
L
13446 case OPTION_MAVXSCALAR:
13447 if (strcasecmp (arg, "128") == 0)
13448 avxscalar = vex128;
13449 else if (strcasecmp (arg, "256") == 0)
13450 avxscalar = vex256;
13451 else
2b5d6a91 13452 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13453 break;
13454
03751133
L
13455 case OPTION_MVEXWIG:
13456 if (strcmp (arg, "0") == 0)
40c9c8de 13457 vexwig = vexw0;
03751133 13458 else if (strcmp (arg, "1") == 0)
40c9c8de 13459 vexwig = vexw1;
03751133
L
13460 else
13461 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13462 break;
13463
7e8b059b
L
13464 case OPTION_MADD_BND_PREFIX:
13465 add_bnd_prefix = 1;
13466 break;
13467
43234a1e
L
13468 case OPTION_MEVEXLIG:
13469 if (strcmp (arg, "128") == 0)
13470 evexlig = evexl128;
13471 else if (strcmp (arg, "256") == 0)
13472 evexlig = evexl256;
13473 else if (strcmp (arg, "512") == 0)
13474 evexlig = evexl512;
13475 else
13476 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13477 break;
13478
d3d3c6db
IT
13479 case OPTION_MEVEXRCIG:
13480 if (strcmp (arg, "rne") == 0)
13481 evexrcig = rne;
13482 else if (strcmp (arg, "rd") == 0)
13483 evexrcig = rd;
13484 else if (strcmp (arg, "ru") == 0)
13485 evexrcig = ru;
13486 else if (strcmp (arg, "rz") == 0)
13487 evexrcig = rz;
13488 else
13489 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13490 break;
13491
43234a1e
L
13492 case OPTION_MEVEXWIG:
13493 if (strcmp (arg, "0") == 0)
13494 evexwig = evexw0;
13495 else if (strcmp (arg, "1") == 0)
13496 evexwig = evexw1;
13497 else
13498 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13499 break;
13500
167ad85b
TG
13501# if defined (TE_PE) || defined (TE_PEP)
13502 case OPTION_MBIG_OBJ:
13503 use_big_obj = 1;
13504 break;
13505#endif
13506
d1982f93 13507 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13508 if (strcasecmp (arg, "yes") == 0)
13509 omit_lock_prefix = 1;
13510 else if (strcasecmp (arg, "no") == 0)
13511 omit_lock_prefix = 0;
13512 else
13513 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13514 break;
13515
e4e00185
AS
13516 case OPTION_MFENCE_AS_LOCK_ADD:
13517 if (strcasecmp (arg, "yes") == 0)
13518 avoid_fence = 1;
13519 else if (strcasecmp (arg, "no") == 0)
13520 avoid_fence = 0;
13521 else
13522 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13523 break;
13524
ae531041
L
13525 case OPTION_MLFENCE_AFTER_LOAD:
13526 if (strcasecmp (arg, "yes") == 0)
13527 lfence_after_load = 1;
13528 else if (strcasecmp (arg, "no") == 0)
13529 lfence_after_load = 0;
13530 else
13531 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13532 break;
13533
13534 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13535 if (strcasecmp (arg, "all") == 0)
a09f656b 13536 {
13537 lfence_before_indirect_branch = lfence_branch_all;
13538 if (lfence_before_ret == lfence_before_ret_none)
13539 lfence_before_ret = lfence_before_ret_shl;
13540 }
ae531041
L
13541 else if (strcasecmp (arg, "memory") == 0)
13542 lfence_before_indirect_branch = lfence_branch_memory;
13543 else if (strcasecmp (arg, "register") == 0)
13544 lfence_before_indirect_branch = lfence_branch_register;
13545 else if (strcasecmp (arg, "none") == 0)
13546 lfence_before_indirect_branch = lfence_branch_none;
13547 else
13548 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13549 arg);
13550 break;
13551
13552 case OPTION_MLFENCE_BEFORE_RET:
13553 if (strcasecmp (arg, "or") == 0)
13554 lfence_before_ret = lfence_before_ret_or;
13555 else if (strcasecmp (arg, "not") == 0)
13556 lfence_before_ret = lfence_before_ret_not;
a09f656b 13557 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13558 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13559 else if (strcasecmp (arg, "none") == 0)
13560 lfence_before_ret = lfence_before_ret_none;
13561 else
13562 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13563 arg);
13564 break;
13565
0cb4071e
L
13566 case OPTION_MRELAX_RELOCATIONS:
13567 if (strcasecmp (arg, "yes") == 0)
13568 generate_relax_relocations = 1;
13569 else if (strcasecmp (arg, "no") == 0)
13570 generate_relax_relocations = 0;
13571 else
13572 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13573 break;
13574
e379e5f3
L
13575 case OPTION_MALIGN_BRANCH_BOUNDARY:
13576 {
13577 char *end;
13578 long int align = strtoul (arg, &end, 0);
13579 if (*end == '\0')
13580 {
13581 if (align == 0)
13582 {
13583 align_branch_power = 0;
13584 break;
13585 }
13586 else if (align >= 16)
13587 {
13588 int align_power;
13589 for (align_power = 0;
13590 (align & 1) == 0;
13591 align >>= 1, align_power++)
13592 continue;
13593 /* Limit alignment power to 31. */
13594 if (align == 1 && align_power < 32)
13595 {
13596 align_branch_power = align_power;
13597 break;
13598 }
13599 }
13600 }
13601 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13602 }
13603 break;
13604
13605 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13606 {
13607 char *end;
13608 int align = strtoul (arg, &end, 0);
13609 /* Some processors only support 5 prefixes. */
13610 if (*end == '\0' && align >= 0 && align < 6)
13611 {
13612 align_branch_prefix_size = align;
13613 break;
13614 }
13615 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13616 arg);
13617 }
13618 break;
13619
13620 case OPTION_MALIGN_BRANCH:
13621 align_branch = 0;
13622 saved = xstrdup (arg);
13623 type = saved;
13624 do
13625 {
13626 next = strchr (type, '+');
13627 if (next)
13628 *next++ = '\0';
13629 if (strcasecmp (type, "jcc") == 0)
13630 align_branch |= align_branch_jcc_bit;
13631 else if (strcasecmp (type, "fused") == 0)
13632 align_branch |= align_branch_fused_bit;
13633 else if (strcasecmp (type, "jmp") == 0)
13634 align_branch |= align_branch_jmp_bit;
13635 else if (strcasecmp (type, "call") == 0)
13636 align_branch |= align_branch_call_bit;
13637 else if (strcasecmp (type, "ret") == 0)
13638 align_branch |= align_branch_ret_bit;
13639 else if (strcasecmp (type, "indirect") == 0)
13640 align_branch |= align_branch_indirect_bit;
13641 else
13642 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13643 type = next;
13644 }
13645 while (next != NULL);
13646 free (saved);
13647 break;
13648
76cf450b
L
13649 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13650 align_branch_power = 5;
13651 align_branch_prefix_size = 5;
13652 align_branch = (align_branch_jcc_bit
13653 | align_branch_fused_bit
13654 | align_branch_jmp_bit);
13655 break;
13656
5db04b09 13657 case OPTION_MAMD64:
4b5aaf5f 13658 isa64 = amd64;
5db04b09
L
13659 break;
13660
13661 case OPTION_MINTEL64:
4b5aaf5f 13662 isa64 = intel64;
5db04b09
L
13663 break;
13664
b6f8c7c4
L
13665 case 'O':
13666 if (arg == NULL)
13667 {
13668 optimize = 1;
13669 /* Turn off -Os. */
13670 optimize_for_space = 0;
13671 }
13672 else if (*arg == 's')
13673 {
13674 optimize_for_space = 1;
13675 /* Turn on all encoding optimizations. */
41fd2579 13676 optimize = INT_MAX;
b6f8c7c4
L
13677 }
13678 else
13679 {
13680 optimize = atoi (arg);
13681 /* Turn off -Os. */
13682 optimize_for_space = 0;
13683 }
13684 break;
13685
252b5132
RH
13686 default:
13687 return 0;
13688 }
13689 return 1;
13690}
13691
8a2c8fef
L
13692#define MESSAGE_TEMPLATE \
13693" "
13694
293f5f65
L
13695static char *
13696output_message (FILE *stream, char *p, char *message, char *start,
13697 int *left_p, const char *name, int len)
13698{
13699 int size = sizeof (MESSAGE_TEMPLATE);
13700 int left = *left_p;
13701
13702 /* Reserve 2 spaces for ", " or ",\0" */
13703 left -= len + 2;
13704
13705 /* Check if there is any room. */
13706 if (left >= 0)
13707 {
13708 if (p != start)
13709 {
13710 *p++ = ',';
13711 *p++ = ' ';
13712 }
13713 p = mempcpy (p, name, len);
13714 }
13715 else
13716 {
13717 /* Output the current message now and start a new one. */
13718 *p++ = ',';
13719 *p = '\0';
13720 fprintf (stream, "%s\n", message);
13721 p = start;
13722 left = size - (start - message) - len - 2;
13723
13724 gas_assert (left >= 0);
13725
13726 p = mempcpy (p, name, len);
13727 }
13728
13729 *left_p = left;
13730 return p;
13731}
13732
8a2c8fef 13733static void
1ded5609 13734show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13735{
13736 static char message[] = MESSAGE_TEMPLATE;
13737 char *start = message + 27;
13738 char *p;
13739 int size = sizeof (MESSAGE_TEMPLATE);
13740 int left;
13741 const char *name;
13742 int len;
13743 unsigned int j;
13744
13745 p = start;
13746 left = size - (start - message);
13747 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13748 {
13749 /* Should it be skipped? */
13750 if (cpu_arch [j].skip)
13751 continue;
13752
13753 name = cpu_arch [j].name;
13754 len = cpu_arch [j].len;
13755 if (*name == '.')
13756 {
13757 /* It is an extension. Skip if we aren't asked to show it. */
13758 if (ext)
13759 {
13760 name++;
13761 len--;
13762 }
13763 else
13764 continue;
13765 }
13766 else if (ext)
13767 {
13768 /* It is an processor. Skip if we show only extension. */
13769 continue;
13770 }
1ded5609
JB
13771 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13772 {
13773 /* It is an impossible processor - skip. */
13774 continue;
13775 }
8a2c8fef 13776
293f5f65 13777 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13778 }
13779
293f5f65
L
13780 /* Display disabled extensions. */
13781 if (ext)
13782 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13783 {
13784 name = cpu_noarch [j].name;
13785 len = cpu_noarch [j].len;
13786 p = output_message (stream, p, message, start, &left, name,
13787 len);
13788 }
13789
8a2c8fef
L
13790 *p = '\0';
13791 fprintf (stream, "%s\n", message);
13792}
13793
252b5132 13794void
8a2c8fef 13795md_show_usage (FILE *stream)
252b5132 13796{
4cc782b5
ILT
13797#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13798 fprintf (stream, _("\
d4693039 13799 -Qy, -Qn ignored\n\
a38cf1db 13800 -V print assembler version number\n\
b3b91714
AM
13801 -k ignored\n"));
13802#endif
13803 fprintf (stream, _("\
12b55ccc 13804 -n Do not optimize code alignment\n\
b3b91714
AM
13805 -q quieten some warnings\n"));
13806#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13807 fprintf (stream, _("\
a38cf1db 13808 -s ignored\n"));
b3b91714 13809#endif
d7f449c0
L
13810#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13811 || defined (TE_PE) || defined (TE_PEP))
751d281c 13812 fprintf (stream, _("\
570561f7 13813 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13814#endif
b3b91714
AM
13815#ifdef SVR4_COMMENT_CHARS
13816 fprintf (stream, _("\
13817 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13818#else
13819 fprintf (stream, _("\
b3b91714 13820 --divide ignored\n"));
4cc782b5 13821#endif
9103f4f4 13822 fprintf (stream, _("\
6305a203 13823 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13824 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13825 show_arch (stream, 0, 1);
8a2c8fef
L
13826 fprintf (stream, _("\
13827 EXTENSION is combination of:\n"));
1ded5609 13828 show_arch (stream, 1, 0);
6305a203 13829 fprintf (stream, _("\
8a2c8fef 13830 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13831 show_arch (stream, 0, 0);
ba104c83 13832 fprintf (stream, _("\
c0f3af97
L
13833 -msse2avx encode SSE instructions with VEX prefix\n"));
13834 fprintf (stream, _("\
7c5c05ef 13835 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13836 check SSE instructions\n"));
13837 fprintf (stream, _("\
7c5c05ef 13838 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13839 check operand combinations for validity\n"));
13840 fprintf (stream, _("\
7c5c05ef
L
13841 -mavxscalar=[128|256] (default: 128)\n\
13842 encode scalar AVX instructions with specific vector\n\
539f890d
L
13843 length\n"));
13844 fprintf (stream, _("\
03751133
L
13845 -mvexwig=[0|1] (default: 0)\n\
13846 encode VEX instructions with specific VEX.W value\n\
13847 for VEX.W bit ignored instructions\n"));
13848 fprintf (stream, _("\
7c5c05ef
L
13849 -mevexlig=[128|256|512] (default: 128)\n\
13850 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13851 length\n"));
13852 fprintf (stream, _("\
7c5c05ef
L
13853 -mevexwig=[0|1] (default: 0)\n\
13854 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13855 for EVEX.W bit ignored instructions\n"));
13856 fprintf (stream, _("\
7c5c05ef 13857 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13858 encode EVEX instructions with specific EVEX.RC value\n\
13859 for SAE-only ignored instructions\n"));
13860 fprintf (stream, _("\
7c5c05ef
L
13861 -mmnemonic=[att|intel] "));
13862 if (SYSV386_COMPAT)
13863 fprintf (stream, _("(default: att)\n"));
13864 else
13865 fprintf (stream, _("(default: intel)\n"));
13866 fprintf (stream, _("\
13867 use AT&T/Intel mnemonic\n"));
ba104c83 13868 fprintf (stream, _("\
7c5c05ef
L
13869 -msyntax=[att|intel] (default: att)\n\
13870 use AT&T/Intel syntax\n"));
ba104c83
L
13871 fprintf (stream, _("\
13872 -mindex-reg support pseudo index registers\n"));
13873 fprintf (stream, _("\
13874 -mnaked-reg don't require `%%' prefix for registers\n"));
13875 fprintf (stream, _("\
7e8b059b 13876 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13877#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13878 fprintf (stream, _("\
13879 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13880 fprintf (stream, _("\
13881 -mx86-used-note=[no|yes] "));
13882 if (DEFAULT_X86_USED_NOTE)
13883 fprintf (stream, _("(default: yes)\n"));
13884 else
13885 fprintf (stream, _("(default: no)\n"));
13886 fprintf (stream, _("\
13887 generate x86 used ISA and feature properties\n"));
13888#endif
13889#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13890 fprintf (stream, _("\
13891 -mbig-obj generate big object files\n"));
13892#endif
d022bddd 13893 fprintf (stream, _("\
7c5c05ef 13894 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13895 strip all lock prefixes\n"));
5db04b09 13896 fprintf (stream, _("\
7c5c05ef 13897 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13898 encode lfence, mfence and sfence as\n\
13899 lock addl $0x0, (%%{re}sp)\n"));
13900 fprintf (stream, _("\
7c5c05ef
L
13901 -mrelax-relocations=[no|yes] "));
13902 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13903 fprintf (stream, _("(default: yes)\n"));
13904 else
13905 fprintf (stream, _("(default: no)\n"));
13906 fprintf (stream, _("\
0cb4071e
L
13907 generate relax relocations\n"));
13908 fprintf (stream, _("\
e379e5f3
L
13909 -malign-branch-boundary=NUM (default: 0)\n\
13910 align branches within NUM byte boundary\n"));
13911 fprintf (stream, _("\
13912 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13913 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13914 indirect\n\
13915 specify types of branches to align\n"));
13916 fprintf (stream, _("\
13917 -malign-branch-prefix-size=NUM (default: 5)\n\
13918 align branches with NUM prefixes per instruction\n"));
13919 fprintf (stream, _("\
76cf450b
L
13920 -mbranches-within-32B-boundaries\n\
13921 align branches within 32 byte boundary\n"));
13922 fprintf (stream, _("\
ae531041
L
13923 -mlfence-after-load=[no|yes] (default: no)\n\
13924 generate lfence after load\n"));
13925 fprintf (stream, _("\
13926 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13927 generate lfence before indirect near branch\n"));
13928 fprintf (stream, _("\
a09f656b 13929 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13930 generate lfence before ret\n"));
13931 fprintf (stream, _("\
7c5c05ef 13932 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13933 fprintf (stream, _("\
13934 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13935}
13936
3e73aa7c 13937#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13938 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13939 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13940
13941/* Pick the target format to use. */
13942
47926f60 13943const char *
e3bb37b5 13944i386_target_format (void)
252b5132 13945{
d34049e8 13946 if (startswith (default_arch, "x86_64"))
351f65ca
L
13947 {
13948 update_code_flag (CODE_64BIT, 1);
13949 if (default_arch[6] == '\0')
7f56bc95 13950 x86_elf_abi = X86_64_ABI;
351f65ca 13951 else
7f56bc95 13952 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13953 }
3e73aa7c 13954 else if (!strcmp (default_arch, "i386"))
78f12dd3 13955 update_code_flag (CODE_32BIT, 1);
5197d474
L
13956 else if (!strcmp (default_arch, "iamcu"))
13957 {
13958 update_code_flag (CODE_32BIT, 1);
13959 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13960 {
13961 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13962 cpu_arch_name = "iamcu";
13963 cpu_sub_arch_name = NULL;
13964 cpu_arch_flags = iamcu_flags;
13965 cpu_arch_isa = PROCESSOR_IAMCU;
13966 cpu_arch_isa_flags = iamcu_flags;
13967 if (!cpu_arch_tune_set)
13968 {
13969 cpu_arch_tune = cpu_arch_isa;
13970 cpu_arch_tune_flags = cpu_arch_isa_flags;
13971 }
13972 }
8d471ec1 13973 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13974 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13975 cpu_arch_name);
13976 }
3e73aa7c 13977 else
2b5d6a91 13978 as_fatal (_("unknown architecture"));
89507696
JB
13979
13980 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13981 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13982 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13983 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13984
252b5132
RH
13985 switch (OUTPUT_FLAVOR)
13986 {
9384f2ff 13987#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13988 case bfd_target_aout_flavour:
47926f60 13989 return AOUT_TARGET_FORMAT;
4c63da97 13990#endif
9384f2ff
AM
13991#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13992# if defined (TE_PE) || defined (TE_PEP)
13993 case bfd_target_coff_flavour:
167ad85b 13994 if (flag_code == CODE_64BIT)
eb19308f
JB
13995 {
13996 object_64bit = 1;
13997 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13998 }
13999 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 14000# elif defined (TE_GO32)
0561d57c
JK
14001 case bfd_target_coff_flavour:
14002 return "coff-go32";
9384f2ff 14003# else
252b5132
RH
14004 case bfd_target_coff_flavour:
14005 return "coff-i386";
9384f2ff 14006# endif
4c63da97 14007#endif
3e73aa7c 14008#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 14009 case bfd_target_elf_flavour:
3e73aa7c 14010 {
351f65ca
L
14011 const char *format;
14012
14013 switch (x86_elf_abi)
4fa24527 14014 {
351f65ca
L
14015 default:
14016 format = ELF_TARGET_FORMAT;
e379e5f3
L
14017#ifndef TE_SOLARIS
14018 tls_get_addr = "___tls_get_addr";
14019#endif
351f65ca 14020 break;
7f56bc95 14021 case X86_64_ABI:
351f65ca 14022 use_rela_relocations = 1;
4fa24527 14023 object_64bit = 1;
e379e5f3
L
14024#ifndef TE_SOLARIS
14025 tls_get_addr = "__tls_get_addr";
14026#endif
351f65ca
L
14027 format = ELF_TARGET_FORMAT64;
14028 break;
7f56bc95 14029 case X86_64_X32_ABI:
4fa24527 14030 use_rela_relocations = 1;
351f65ca 14031 object_64bit = 1;
e379e5f3
L
14032#ifndef TE_SOLARIS
14033 tls_get_addr = "__tls_get_addr";
14034#endif
862be3fb 14035 disallow_64bit_reloc = 1;
351f65ca
L
14036 format = ELF_TARGET_FORMAT32;
14037 break;
4fa24527 14038 }
3632d14b 14039 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 14040 {
7f56bc95 14041 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
14042 as_fatal (_("Intel L1OM is 64bit only"));
14043 return ELF_TARGET_L1OM_FORMAT;
14044 }
b49f93f6 14045 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
14046 {
14047 if (x86_elf_abi != X86_64_ABI)
14048 as_fatal (_("Intel K1OM is 64bit only"));
14049 return ELF_TARGET_K1OM_FORMAT;
14050 }
81486035
L
14051 else if (cpu_arch_isa == PROCESSOR_IAMCU)
14052 {
14053 if (x86_elf_abi != I386_ABI)
14054 as_fatal (_("Intel MCU is 32bit only"));
14055 return ELF_TARGET_IAMCU_FORMAT;
14056 }
8a9036a4 14057 else
351f65ca 14058 return format;
3e73aa7c 14059 }
e57f8c65
TG
14060#endif
14061#if defined (OBJ_MACH_O)
14062 case bfd_target_mach_o_flavour:
d382c579
TG
14063 if (flag_code == CODE_64BIT)
14064 {
14065 use_rela_relocations = 1;
14066 object_64bit = 1;
14067 return "mach-o-x86-64";
14068 }
14069 else
14070 return "mach-o-i386";
4c63da97 14071#endif
252b5132
RH
14072 default:
14073 abort ();
14074 return NULL;
14075 }
14076}
14077
47926f60 14078#endif /* OBJ_MAYBE_ more than one */
252b5132 14079\f
252b5132 14080symbolS *
7016a5d5 14081md_undefined_symbol (char *name)
252b5132 14082{
18dc2407
ILT
14083 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
14084 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
14085 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
14086 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
14087 {
14088 if (!GOT_symbol)
14089 {
14090 if (symbol_find (name))
14091 as_bad (_("GOT already in symbol table"));
14092 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 14093 &zero_address_frag, 0);
24eab124
AM
14094 };
14095 return GOT_symbol;
14096 }
252b5132
RH
14097 return 0;
14098}
14099
14100/* Round up a section size to the appropriate boundary. */
47926f60 14101
252b5132 14102valueT
7016a5d5 14103md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 14104{
4c63da97
AM
14105#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
14106 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
14107 {
14108 /* For a.out, force the section size to be aligned. If we don't do
14109 this, BFD will align it for us, but it will not write out the
14110 final bytes of the section. This may be a bug in BFD, but it is
14111 easier to fix it here since that is how the other a.out targets
14112 work. */
14113 int align;
14114
fd361982 14115 align = bfd_section_alignment (segment);
8d3842cd 14116 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 14117 }
252b5132
RH
14118#endif
14119
14120 return size;
14121}
14122
14123/* On the i386, PC-relative offsets are relative to the start of the
14124 next instruction. That is, the address of the offset, plus its
14125 size, since the offset is always the last part of the insn. */
14126
14127long
e3bb37b5 14128md_pcrel_from (fixS *fixP)
252b5132
RH
14129{
14130 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
14131}
14132
14133#ifndef I386COFF
14134
14135static void
e3bb37b5 14136s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 14137{
29b0f896 14138 int temp;
252b5132 14139
8a75718c
JB
14140#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14141 if (IS_ELF)
14142 obj_elf_section_change_hook ();
14143#endif
252b5132
RH
14144 temp = get_absolute_expression ();
14145 subseg_set (bss_section, (subsegT) temp);
14146 demand_empty_rest_of_line ();
14147}
14148
14149#endif
14150
e379e5f3
L
14151/* Remember constant directive. */
14152
14153void
14154i386_cons_align (int ignore ATTRIBUTE_UNUSED)
14155{
14156 if (last_insn.kind != last_insn_directive
14157 && (bfd_section_flags (now_seg) & SEC_CODE))
14158 {
14159 last_insn.seg = now_seg;
14160 last_insn.kind = last_insn_directive;
14161 last_insn.name = "constant directive";
14162 last_insn.file = as_where (&last_insn.line);
ae531041
L
14163 if (lfence_before_ret != lfence_before_ret_none)
14164 {
14165 if (lfence_before_indirect_branch != lfence_branch_none)
14166 as_warn (_("constant directive skips -mlfence-before-ret "
14167 "and -mlfence-before-indirect-branch"));
14168 else
14169 as_warn (_("constant directive skips -mlfence-before-ret"));
14170 }
14171 else if (lfence_before_indirect_branch != lfence_branch_none)
14172 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
14173 }
14174}
14175
252b5132 14176void
e3bb37b5 14177i386_validate_fix (fixS *fixp)
252b5132 14178{
02a86693 14179 if (fixp->fx_subsy)
252b5132 14180 {
02a86693 14181 if (fixp->fx_subsy == GOT_symbol)
23df1078 14182 {
02a86693
L
14183 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
14184 {
14185 if (!object_64bit)
14186 abort ();
14187#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14188 if (fixp->fx_tcbit2)
56ceb5b5
L
14189 fixp->fx_r_type = (fixp->fx_tcbit
14190 ? BFD_RELOC_X86_64_REX_GOTPCRELX
14191 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
14192 else
14193#endif
14194 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
14195 }
d6ab8113 14196 else
02a86693
L
14197 {
14198 if (!object_64bit)
14199 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
14200 else
14201 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
14202 }
14203 fixp->fx_subsy = 0;
23df1078 14204 }
252b5132 14205 }
02a86693 14206#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 14207 else
02a86693 14208 {
2585b7a5
L
14209 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
14210 to section. Since PLT32 relocation must be against symbols,
14211 turn such PLT32 relocation into PC32 relocation. */
14212 if (fixp->fx_addsy
14213 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
14214 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
14215 && symbol_section_p (fixp->fx_addsy))
14216 fixp->fx_r_type = BFD_RELOC_32_PCREL;
14217 if (!object_64bit)
14218 {
14219 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
14220 && fixp->fx_tcbit2)
14221 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
14222 }
02a86693
L
14223 }
14224#endif
252b5132
RH
14225}
14226
252b5132 14227arelent *
7016a5d5 14228tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14229{
14230 arelent *rel;
14231 bfd_reloc_code_real_type code;
14232
14233 switch (fixp->fx_r_type)
14234 {
8ce3d284 14235#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
14236 case BFD_RELOC_SIZE32:
14237 case BFD_RELOC_SIZE64:
8fb88245
JB
14238 if (IS_ELF
14239 && S_IS_DEFINED (fixp->fx_addsy)
8fd4256d
L
14240 && !S_IS_EXTERNAL (fixp->fx_addsy))
14241 {
14242 /* Resolve size relocation against local symbol to size of
14243 the symbol plus addend. */
44f87162
JB
14244 valueT value = S_GET_SIZE (fixp->fx_addsy);
14245
14246 if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_SECTION_SYM)
14247 value = bfd_section_size (S_GET_SEGMENT (fixp->fx_addsy));
14248 value += fixp->fx_offset;
8fd4256d 14249 if (fixp->fx_r_type == BFD_RELOC_SIZE32
d965814f 14250 && object_64bit
8fd4256d
L
14251 && !fits_in_unsigned_long (value))
14252 as_bad_where (fixp->fx_file, fixp->fx_line,
14253 _("symbol size computation overflow"));
14254 fixp->fx_addsy = NULL;
14255 fixp->fx_subsy = NULL;
14256 md_apply_fix (fixp, (valueT *) &value, NULL);
14257 return NULL;
14258 }
8ce3d284 14259#endif
1a0670f3 14260 /* Fall through. */
8fd4256d 14261
3e73aa7c
JH
14262 case BFD_RELOC_X86_64_PLT32:
14263 case BFD_RELOC_X86_64_GOT32:
14264 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14265 case BFD_RELOC_X86_64_GOTPCRELX:
14266 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
14267 case BFD_RELOC_386_PLT32:
14268 case BFD_RELOC_386_GOT32:
02a86693 14269 case BFD_RELOC_386_GOT32X:
252b5132
RH
14270 case BFD_RELOC_386_GOTOFF:
14271 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
14272 case BFD_RELOC_386_TLS_GD:
14273 case BFD_RELOC_386_TLS_LDM:
14274 case BFD_RELOC_386_TLS_LDO_32:
14275 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
14276 case BFD_RELOC_386_TLS_IE:
14277 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
14278 case BFD_RELOC_386_TLS_LE_32:
14279 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
14280 case BFD_RELOC_386_TLS_GOTDESC:
14281 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
14282 case BFD_RELOC_X86_64_TLSGD:
14283 case BFD_RELOC_X86_64_TLSLD:
14284 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 14285 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
14286 case BFD_RELOC_X86_64_GOTTPOFF:
14287 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
14288 case BFD_RELOC_X86_64_TPOFF64:
14289 case BFD_RELOC_X86_64_GOTOFF64:
14290 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
14291 case BFD_RELOC_X86_64_GOT64:
14292 case BFD_RELOC_X86_64_GOTPCREL64:
14293 case BFD_RELOC_X86_64_GOTPC64:
14294 case BFD_RELOC_X86_64_GOTPLT64:
14295 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
14296 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14297 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
14298 case BFD_RELOC_RVA:
14299 case BFD_RELOC_VTABLE_ENTRY:
14300 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
14301#ifdef TE_PE
14302 case BFD_RELOC_32_SECREL:
14303#endif
252b5132
RH
14304 code = fixp->fx_r_type;
14305 break;
dbbaec26
L
14306 case BFD_RELOC_X86_64_32S:
14307 if (!fixp->fx_pcrel)
14308 {
14309 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
14310 code = fixp->fx_r_type;
14311 break;
14312 }
1a0670f3 14313 /* Fall through. */
252b5132 14314 default:
93382f6d 14315 if (fixp->fx_pcrel)
252b5132 14316 {
93382f6d
AM
14317 switch (fixp->fx_size)
14318 {
14319 default:
b091f402
AM
14320 as_bad_where (fixp->fx_file, fixp->fx_line,
14321 _("can not do %d byte pc-relative relocation"),
14322 fixp->fx_size);
93382f6d
AM
14323 code = BFD_RELOC_32_PCREL;
14324 break;
14325 case 1: code = BFD_RELOC_8_PCREL; break;
14326 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 14327 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
14328#ifdef BFD64
14329 case 8: code = BFD_RELOC_64_PCREL; break;
14330#endif
93382f6d
AM
14331 }
14332 }
14333 else
14334 {
14335 switch (fixp->fx_size)
14336 {
14337 default:
b091f402
AM
14338 as_bad_where (fixp->fx_file, fixp->fx_line,
14339 _("can not do %d byte relocation"),
14340 fixp->fx_size);
93382f6d
AM
14341 code = BFD_RELOC_32;
14342 break;
14343 case 1: code = BFD_RELOC_8; break;
14344 case 2: code = BFD_RELOC_16; break;
14345 case 4: code = BFD_RELOC_32; break;
937149dd 14346#ifdef BFD64
3e73aa7c 14347 case 8: code = BFD_RELOC_64; break;
937149dd 14348#endif
93382f6d 14349 }
252b5132
RH
14350 }
14351 break;
14352 }
252b5132 14353
d182319b
JB
14354 if ((code == BFD_RELOC_32
14355 || code == BFD_RELOC_32_PCREL
14356 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14357 && GOT_symbol
14358 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14359 {
4fa24527 14360 if (!object_64bit)
d6ab8113
JB
14361 code = BFD_RELOC_386_GOTPC;
14362 else
14363 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14364 }
7b81dfbb
AJ
14365 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14366 && GOT_symbol
14367 && fixp->fx_addsy == GOT_symbol)
14368 {
14369 code = BFD_RELOC_X86_64_GOTPC64;
14370 }
252b5132 14371
add39d23
TS
14372 rel = XNEW (arelent);
14373 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14374 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14375
14376 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14377
3e73aa7c
JH
14378 if (!use_rela_relocations)
14379 {
14380 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14381 vtable entry to be used in the relocation's section offset. */
14382 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14383 rel->address = fixp->fx_offset;
fbeb56a4
DK
14384#if defined (OBJ_COFF) && defined (TE_PE)
14385 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14386 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14387 else
14388#endif
c6682705 14389 rel->addend = 0;
3e73aa7c
JH
14390 }
14391 /* Use the rela in 64bit mode. */
252b5132 14392 else
3e73aa7c 14393 {
862be3fb
L
14394 if (disallow_64bit_reloc)
14395 switch (code)
14396 {
862be3fb
L
14397 case BFD_RELOC_X86_64_DTPOFF64:
14398 case BFD_RELOC_X86_64_TPOFF64:
14399 case BFD_RELOC_64_PCREL:
14400 case BFD_RELOC_X86_64_GOTOFF64:
14401 case BFD_RELOC_X86_64_GOT64:
14402 case BFD_RELOC_X86_64_GOTPCREL64:
14403 case BFD_RELOC_X86_64_GOTPC64:
14404 case BFD_RELOC_X86_64_GOTPLT64:
14405 case BFD_RELOC_X86_64_PLTOFF64:
14406 as_bad_where (fixp->fx_file, fixp->fx_line,
14407 _("cannot represent relocation type %s in x32 mode"),
14408 bfd_get_reloc_code_name (code));
14409 break;
14410 default:
14411 break;
14412 }
14413
062cd5e7
AS
14414 if (!fixp->fx_pcrel)
14415 rel->addend = fixp->fx_offset;
14416 else
14417 switch (code)
14418 {
14419 case BFD_RELOC_X86_64_PLT32:
14420 case BFD_RELOC_X86_64_GOT32:
14421 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14422 case BFD_RELOC_X86_64_GOTPCRELX:
14423 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14424 case BFD_RELOC_X86_64_TLSGD:
14425 case BFD_RELOC_X86_64_TLSLD:
14426 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14427 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14428 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14429 rel->addend = fixp->fx_offset - fixp->fx_size;
14430 break;
14431 default:
14432 rel->addend = (section->vma
14433 - fixp->fx_size
14434 + fixp->fx_addnumber
14435 + md_pcrel_from (fixp));
14436 break;
14437 }
3e73aa7c
JH
14438 }
14439
252b5132
RH
14440 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14441 if (rel->howto == NULL)
14442 {
14443 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14444 _("cannot represent relocation type %s"),
252b5132
RH
14445 bfd_get_reloc_code_name (code));
14446 /* Set howto to a garbage value so that we can keep going. */
14447 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14448 gas_assert (rel->howto != NULL);
252b5132
RH
14449 }
14450
14451 return rel;
14452}
14453
ee86248c 14454#include "tc-i386-intel.c"
54cfded0 14455
a60de03c
JB
14456void
14457tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14458{
a60de03c
JB
14459 int saved_naked_reg;
14460 char saved_register_dot;
54cfded0 14461
a60de03c
JB
14462 saved_naked_reg = allow_naked_reg;
14463 allow_naked_reg = 1;
14464 saved_register_dot = register_chars['.'];
14465 register_chars['.'] = '.';
14466 allow_pseudo_reg = 1;
14467 expression_and_evaluate (exp);
14468 allow_pseudo_reg = 0;
14469 register_chars['.'] = saved_register_dot;
14470 allow_naked_reg = saved_naked_reg;
14471
e96d56a1 14472 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14473 {
a60de03c
JB
14474 if ((addressT) exp->X_add_number < i386_regtab_size)
14475 {
14476 exp->X_op = O_constant;
14477 exp->X_add_number = i386_regtab[exp->X_add_number]
14478 .dw2_regnum[flag_code >> 1];
14479 }
14480 else
14481 exp->X_op = O_illegal;
54cfded0 14482 }
54cfded0
AM
14483}
14484
14485void
14486tc_x86_frame_initial_instructions (void)
14487{
a60de03c
JB
14488 static unsigned int sp_regno[2];
14489
14490 if (!sp_regno[flag_code >> 1])
14491 {
14492 char *saved_input = input_line_pointer;
14493 char sp[][4] = {"esp", "rsp"};
14494 expressionS exp;
a4447b93 14495
a60de03c
JB
14496 input_line_pointer = sp[flag_code >> 1];
14497 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14498 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14499 sp_regno[flag_code >> 1] = exp.X_add_number;
14500 input_line_pointer = saved_input;
14501 }
a4447b93 14502
61ff971f
L
14503 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14504 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14505}
d2b2c203 14506
d7921315
L
14507int
14508x86_dwarf2_addr_size (void)
14509{
14510#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14511 if (x86_elf_abi == X86_64_X32_ABI)
14512 return 4;
14513#endif
14514 return bfd_arch_bits_per_address (stdoutput) / 8;
14515}
14516
d2b2c203
DJ
14517int
14518i386_elf_section_type (const char *str, size_t len)
14519{
14520 if (flag_code == CODE_64BIT
14521 && len == sizeof ("unwind") - 1
d34049e8 14522 && startswith (str, "unwind"))
d2b2c203
DJ
14523 return SHT_X86_64_UNWIND;
14524
14525 return -1;
14526}
bb41ade5 14527
ad5fec3b
EB
14528#ifdef TE_SOLARIS
14529void
14530i386_solaris_fix_up_eh_frame (segT sec)
14531{
14532 if (flag_code == CODE_64BIT)
14533 elf_section_type (sec) = SHT_X86_64_UNWIND;
14534}
14535#endif
14536
bb41ade5
AM
14537#ifdef TE_PE
14538void
14539tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14540{
91d6fa6a 14541 expressionS exp;
bb41ade5 14542
91d6fa6a
NC
14543 exp.X_op = O_secrel;
14544 exp.X_add_symbol = symbol;
14545 exp.X_add_number = 0;
14546 emit_expr (&exp, size);
bb41ade5
AM
14547}
14548#endif
3b22753a
L
14549
14550#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14551/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14552
01e1a5bc 14553bfd_vma
6d4af3c2 14554x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14555{
14556 if (flag_code == CODE_64BIT)
14557 {
14558 if (letter == 'l')
14559 return SHF_X86_64_LARGE;
14560
8f3bae45 14561 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14562 }
3b22753a 14563 else
8f3bae45 14564 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14565 return -1;
14566}
14567
01e1a5bc 14568bfd_vma
3b22753a
L
14569x86_64_section_word (char *str, size_t len)
14570{
08dedd66 14571 if (len == 5 && flag_code == CODE_64BIT && startswith (str, "large"))
3b22753a
L
14572 return SHF_X86_64_LARGE;
14573
14574 return -1;
14575}
14576
14577static void
14578handle_large_common (int small ATTRIBUTE_UNUSED)
14579{
14580 if (flag_code != CODE_64BIT)
14581 {
14582 s_comm_internal (0, elf_common_parse);
14583 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14584 }
14585 else
14586 {
14587 static segT lbss_section;
14588 asection *saved_com_section_ptr = elf_com_section_ptr;
14589 asection *saved_bss_section = bss_section;
14590
14591 if (lbss_section == NULL)
14592 {
14593 flagword applicable;
14594 segT seg = now_seg;
14595 subsegT subseg = now_subseg;
14596
14597 /* The .lbss section is for local .largecomm symbols. */
14598 lbss_section = subseg_new (".lbss", 0);
14599 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14600 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14601 seg_info (lbss_section)->bss = 1;
14602
14603 subseg_set (seg, subseg);
14604 }
14605
14606 elf_com_section_ptr = &_bfd_elf_large_com_section;
14607 bss_section = lbss_section;
14608
14609 s_comm_internal (0, elf_common_parse);
14610
14611 elf_com_section_ptr = saved_com_section_ptr;
14612 bss_section = saved_bss_section;
14613 }
14614}
14615#endif /* OBJ_ELF || OBJ_MAYBE_ELF */