gas/i386/property-5.d: Correct test name
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
b3adc24a 2 Copyright (C) 1989-2020 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"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
c3332e24 47#ifndef INFER_ADDR_PREFIX
eecb386c 48#define INFER_ADDR_PREFIX 1
c3332e24
AM
49#endif
50
29b0f896
AM
51#ifndef DEFAULT_ARCH
52#define DEFAULT_ARCH "i386"
246fcdee 53#endif
252b5132 54
edde18a5
AM
55#ifndef INLINE
56#if __GNUC__ >= 2
57#define INLINE __inline__
58#else
59#define INLINE
60#endif
61#endif
62
6305a203
L
63/* Prefixes will be emitted in the order defined below.
64 WAIT_PREFIX must be the first prefix since FWAIT is really is an
65 instruction, and so must come before any prefixes.
66 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 67 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
68#define WAIT_PREFIX 0
69#define SEG_PREFIX 1
70#define ADDR_PREFIX 2
71#define DATA_PREFIX 3
c32fa91d 72#define REP_PREFIX 4
42164a71 73#define HLE_PREFIX REP_PREFIX
7e8b059b 74#define BND_PREFIX REP_PREFIX
c32fa91d 75#define LOCK_PREFIX 5
4e9ac44a
L
76#define REX_PREFIX 6 /* must come last. */
77#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
78
79/* we define the syntax here (modulo base,index,scale syntax) */
80#define REGISTER_PREFIX '%'
81#define IMMEDIATE_PREFIX '$'
82#define ABSOLUTE_PREFIX '*'
83
84/* these are the instruction mnemonic suffixes in AT&T syntax or
85 memory operand size in Intel syntax. */
86#define WORD_MNEM_SUFFIX 'w'
87#define BYTE_MNEM_SUFFIX 'b'
88#define SHORT_MNEM_SUFFIX 's'
89#define LONG_MNEM_SUFFIX 'l'
90#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
91/* Intel Syntax. Use a non-ascii letter since since it never appears
92 in instructions. */
93#define LONG_DOUBLE_MNEM_SUFFIX '\1'
94
95#define END_OF_INSN '\0'
96
79dec6b7
JB
97/* This matches the C -> StaticRounding alias in the opcode table. */
98#define commutative staticrounding
99
6305a203
L
100/*
101 'templates' is for grouping together 'template' structures for opcodes
102 of the same name. This is only used for storing the insns in the grand
103 ole hash table of insns.
104 The templates themselves start at START and range up to (but not including)
105 END.
106 */
107typedef struct
108{
d3ce72d0
NC
109 const insn_template *start;
110 const insn_template *end;
6305a203
L
111}
112templates;
113
114/* 386 operand encoding bytes: see 386 book for details of this. */
115typedef struct
116{
117 unsigned int regmem; /* codes register or memory operand */
118 unsigned int reg; /* codes register operand (or extended opcode) */
119 unsigned int mode; /* how to interpret regmem & reg */
120}
121modrm_byte;
122
123/* x86-64 extension prefix. */
124typedef int rex_byte;
125
6305a203
L
126/* 386 opcode byte to code indirect addressing. */
127typedef struct
128{
129 unsigned base;
130 unsigned index;
131 unsigned scale;
132}
133sib_byte;
134
6305a203
L
135/* x86 arch names, types and features */
136typedef struct
137{
138 const char *name; /* arch name */
8a2c8fef 139 unsigned int len; /* arch string length */
6305a203
L
140 enum processor_type type; /* arch type */
141 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 142 unsigned int skip; /* show_arch should skip this. */
6305a203
L
143}
144arch_entry;
145
293f5f65
L
146/* Used to turn off indicated flags. */
147typedef struct
148{
149 const char *name; /* arch name */
150 unsigned int len; /* arch string length */
151 i386_cpu_flags flags; /* cpu feature flags */
152}
153noarch_entry;
154
78f12dd3 155static void update_code_flag (int, int);
e3bb37b5
L
156static void set_code_flag (int);
157static void set_16bit_gcc_code_flag (int);
158static void set_intel_syntax (int);
1efbbeb4 159static void set_intel_mnemonic (int);
db51cc60 160static void set_allow_index_reg (int);
7bab8ab5 161static void set_check (int);
e3bb37b5 162static void set_cpu_arch (int);
6482c264 163#ifdef TE_PE
e3bb37b5 164static void pe_directive_secrel (int);
6482c264 165#endif
e3bb37b5
L
166static void signed_cons (int);
167static char *output_invalid (int c);
ee86248c
JB
168static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
169 const char *);
170static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
171 const char *);
a7619375 172static int i386_att_operand (char *);
e3bb37b5 173static int i386_intel_operand (char *, int);
ee86248c
JB
174static int i386_intel_simplify (expressionS *);
175static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
176static const reg_entry *parse_register (char *, char **);
177static char *parse_insn (char *, char *);
178static char *parse_operands (char *, const char *);
179static void swap_operands (void);
4d456e3d 180static void swap_2_operands (int, int);
48bcea9f 181static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
8a6fb3f9
JB
213/* parse_register() returns this when a register alias cannot be used. */
214static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
215 { Dw2Inval, Dw2Inval } };
216
43234a1e
L
217/* This struct describes rounding control and SAE in the instruction. */
218struct RC_Operation
219{
220 enum rc_type
221 {
222 rne = 0,
223 rd,
224 ru,
225 rz,
226 saeonly
227 } type;
228 int operand;
229};
230
231static struct RC_Operation rc_op;
232
233/* The struct describes masking, applied to OPERAND in the instruction.
234 MASK is a pointer to the corresponding mask register. ZEROING tells
235 whether merging or zeroing mask is used. */
236struct Mask_Operation
237{
238 const reg_entry *mask;
239 unsigned int zeroing;
240 /* The operand where this operation is associated. */
241 int operand;
242};
243
244static struct Mask_Operation mask_op;
245
246/* The struct describes broadcasting, applied to OPERAND. FACTOR is
247 broadcast factor. */
248struct Broadcast_Operation
249{
8e6e0792 250 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
251 int type;
252
253 /* Index of broadcasted operand. */
254 int operand;
4a1b91ea
L
255
256 /* Number of bytes to broadcast. */
257 int bytes;
43234a1e
L
258};
259
260static struct Broadcast_Operation broadcast_op;
261
c0f3af97
L
262/* VEX prefix. */
263typedef struct
264{
43234a1e
L
265 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
266 unsigned char bytes[4];
c0f3af97
L
267 unsigned int length;
268 /* Destination or source register specifier. */
269 const reg_entry *register_specifier;
270} vex_prefix;
271
252b5132 272/* 'md_assemble ()' gathers together information and puts it into a
47926f60 273 i386_insn. */
252b5132 274
520dc8e8
AM
275union i386_op
276 {
277 expressionS *disps;
278 expressionS *imms;
279 const reg_entry *regs;
280 };
281
a65babc9
L
282enum i386_error
283 {
86e026a4 284 operand_size_mismatch,
a65babc9
L
285 operand_type_mismatch,
286 register_type_mismatch,
287 number_of_operands_mismatch,
288 invalid_instruction_suffix,
289 bad_imm4,
a65babc9
L
290 unsupported_with_intel_mnemonic,
291 unsupported_syntax,
6c30d220 292 unsupported,
260cd341 293 invalid_sib_address,
6c30d220 294 invalid_vsib_address,
7bab8ab5 295 invalid_vector_register_set,
260cd341 296 invalid_tmm_register_set,
43234a1e
L
297 unsupported_vector_index_register,
298 unsupported_broadcast,
43234a1e
L
299 broadcast_needed,
300 unsupported_masking,
301 mask_not_on_destination,
302 no_default_mask,
303 unsupported_rc_sae,
304 rc_sae_operand_not_last_imm,
305 invalid_register_operand,
a65babc9
L
306 };
307
252b5132
RH
308struct _i386_insn
309 {
47926f60 310 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 311 insn_template tm;
252b5132 312
7d5e4556
L
313 /* SUFFIX holds the instruction size suffix for byte, word, dword
314 or qword, if given. */
252b5132
RH
315 char suffix;
316
47926f60 317 /* OPERANDS gives the number of given operands. */
252b5132
RH
318 unsigned int operands;
319
320 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
321 of given register, displacement, memory operands and immediate
47926f60 322 operands. */
252b5132
RH
323 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
324
325 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 326 use OP[i] for the corresponding operand. */
40fb9820 327 i386_operand_type types[MAX_OPERANDS];
252b5132 328
520dc8e8
AM
329 /* Displacement expression, immediate expression, or register for each
330 operand. */
331 union i386_op op[MAX_OPERANDS];
252b5132 332
3e73aa7c
JH
333 /* Flags for operands. */
334 unsigned int flags[MAX_OPERANDS];
335#define Operand_PCrel 1
c48dadc9 336#define Operand_Mem 2
3e73aa7c 337
252b5132 338 /* Relocation type for operand */
f86103b7 339 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 340
252b5132
RH
341 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
342 the base index byte below. */
343 const reg_entry *base_reg;
344 const reg_entry *index_reg;
345 unsigned int log2_scale_factor;
346
347 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 348 explicit segment overrides are given. */
ce8a8b2f 349 const seg_entry *seg[2];
252b5132 350
8325cc63
JB
351 /* Copied first memory operand string, for re-checking. */
352 char *memop1_string;
353
252b5132
RH
354 /* PREFIX holds all the given prefix opcodes (usually null).
355 PREFIXES is the number of prefix opcodes. */
356 unsigned int prefixes;
357 unsigned char prefix[MAX_PREFIXES];
358
50128d0c
JB
359 /* Register is in low 3 bits of opcode. */
360 bfd_boolean short_form;
361
6f2f06be
JB
362 /* The operand to a branch insn indicates an absolute branch. */
363 bfd_boolean jumpabsolute;
364
b4a3a7b4
L
365 /* Has MMX register operands. */
366 bfd_boolean has_regmmx;
367
368 /* Has XMM register operands. */
369 bfd_boolean has_regxmm;
370
371 /* Has YMM register operands. */
372 bfd_boolean has_regymm;
373
374 /* Has ZMM register operands. */
375 bfd_boolean has_regzmm;
376
260cd341
LC
377 /* Has TMM register operands. */
378 bfd_boolean has_regtmm;
379
e379e5f3
L
380 /* Has GOTPC or TLS relocation. */
381 bfd_boolean has_gotpc_tls_reloc;
382
252b5132 383 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 384 addressing modes of this insn are encoded. */
252b5132 385 modrm_byte rm;
3e73aa7c 386 rex_byte rex;
43234a1e 387 rex_byte vrex;
252b5132 388 sib_byte sib;
c0f3af97 389 vex_prefix vex;
b6169b20 390
43234a1e
L
391 /* Masking attributes. */
392 struct Mask_Operation *mask;
393
394 /* Rounding control and SAE attributes. */
395 struct RC_Operation *rounding;
396
397 /* Broadcasting attributes. */
398 struct Broadcast_Operation *broadcast;
399
400 /* Compressed disp8*N attribute. */
401 unsigned int memshift;
402
86fa6981
L
403 /* Prefer load or store in encoding. */
404 enum
405 {
406 dir_encoding_default = 0,
407 dir_encoding_load,
64c49ab3
JB
408 dir_encoding_store,
409 dir_encoding_swap
86fa6981 410 } dir_encoding;
891edac4 411
a501d77e
L
412 /* Prefer 8bit or 32bit displacement in encoding. */
413 enum
414 {
415 disp_encoding_default = 0,
416 disp_encoding_8bit,
417 disp_encoding_32bit
418 } disp_encoding;
f8a5c266 419
6b6b6807
L
420 /* Prefer the REX byte in encoding. */
421 bfd_boolean rex_encoding;
422
b6f8c7c4
L
423 /* Disable instruction size optimization. */
424 bfd_boolean no_optimize;
425
86fa6981
L
426 /* How to encode vector instructions. */
427 enum
428 {
429 vex_encoding_default = 0,
42e04b36 430 vex_encoding_vex,
86fa6981 431 vex_encoding_vex3,
da4977e0
JB
432 vex_encoding_evex,
433 vex_encoding_error
86fa6981
L
434 } vec_encoding;
435
d5de92cf
L
436 /* REP prefix. */
437 const char *rep_prefix;
438
165de32a
L
439 /* HLE prefix. */
440 const char *hle_prefix;
42164a71 441
7e8b059b
L
442 /* Have BND prefix. */
443 const char *bnd_prefix;
444
04ef582a
L
445 /* Have NOTRACK prefix. */
446 const char *notrack_prefix;
447
891edac4 448 /* Error message. */
a65babc9 449 enum i386_error error;
252b5132
RH
450 };
451
452typedef struct _i386_insn i386_insn;
453
43234a1e
L
454/* Link RC type with corresponding string, that'll be looked for in
455 asm. */
456struct RC_name
457{
458 enum rc_type type;
459 const char *name;
460 unsigned int len;
461};
462
463static const struct RC_name RC_NamesTable[] =
464{
465 { rne, STRING_COMMA_LEN ("rn-sae") },
466 { rd, STRING_COMMA_LEN ("rd-sae") },
467 { ru, STRING_COMMA_LEN ("ru-sae") },
468 { rz, STRING_COMMA_LEN ("rz-sae") },
469 { saeonly, STRING_COMMA_LEN ("sae") },
470};
471
252b5132
RH
472/* List of chars besides those in app.c:symbol_chars that can start an
473 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 474const char extra_symbol_chars[] = "*%-([{}"
252b5132 475#ifdef LEX_AT
32137342
NC
476 "@"
477#endif
478#ifdef LEX_QM
479 "?"
252b5132 480#endif
32137342 481 ;
252b5132 482
29b0f896
AM
483#if (defined (TE_I386AIX) \
484 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 485 && !defined (TE_GNU) \
29b0f896
AM
486 && !defined (TE_LINUX) \
487 && !defined (TE_FreeBSD) \
5b806d27 488 && !defined (TE_DragonFly) \
29b0f896 489 && !defined (TE_NetBSD)))
252b5132 490/* This array holds the chars that always start a comment. If the
b3b91714
AM
491 pre-processor is disabled, these aren't very useful. The option
492 --divide will remove '/' from this list. */
493const char *i386_comment_chars = "#/";
494#define SVR4_COMMENT_CHARS 1
252b5132 495#define PREFIX_SEPARATOR '\\'
252b5132 496
b3b91714
AM
497#else
498const char *i386_comment_chars = "#";
499#define PREFIX_SEPARATOR '/'
500#endif
501
252b5132
RH
502/* This array holds the chars that only start a comment at the beginning of
503 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
504 .line and .file directives will appear in the pre-processed output.
505 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 506 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
507 #NO_APP at the beginning of its output.
508 Also note that comments started like this one will always work if
252b5132 509 '/' isn't otherwise defined. */
b3b91714 510const char line_comment_chars[] = "#/";
252b5132 511
63a0b638 512const char line_separator_chars[] = ";";
252b5132 513
ce8a8b2f
AM
514/* Chars that can be used to separate mant from exp in floating point
515 nums. */
252b5132
RH
516const char EXP_CHARS[] = "eE";
517
ce8a8b2f
AM
518/* Chars that mean this number is a floating point constant
519 As in 0f12.456
520 or 0d1.2345e12. */
252b5132
RH
521const char FLT_CHARS[] = "fFdDxX";
522
ce8a8b2f 523/* Tables for lexical analysis. */
252b5132
RH
524static char mnemonic_chars[256];
525static char register_chars[256];
526static char operand_chars[256];
527static char identifier_chars[256];
528static char digit_chars[256];
529
ce8a8b2f 530/* Lexical macros. */
252b5132
RH
531#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
532#define is_operand_char(x) (operand_chars[(unsigned char) x])
533#define is_register_char(x) (register_chars[(unsigned char) x])
534#define is_space_char(x) ((x) == ' ')
535#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
536#define is_digit_char(x) (digit_chars[(unsigned char) x])
537
0234cb7c 538/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
539static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
540
541/* md_assemble() always leaves the strings it's passed unaltered. To
542 effect this we maintain a stack of saved characters that we've smashed
543 with '\0's (indicating end of strings for various sub-fields of the
47926f60 544 assembler instruction). */
252b5132 545static char save_stack[32];
ce8a8b2f 546static char *save_stack_p;
252b5132
RH
547#define END_STRING_AND_SAVE(s) \
548 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
549#define RESTORE_END_STRING(s) \
550 do { *(s) = *--save_stack_p; } while (0)
551
47926f60 552/* The instruction we're assembling. */
252b5132
RH
553static i386_insn i;
554
555/* Possible templates for current insn. */
556static const templates *current_templates;
557
31b2323c
L
558/* Per instruction expressionS buffers: max displacements & immediates. */
559static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
560static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 561
47926f60 562/* Current operand we are working on. */
ee86248c 563static int this_operand = -1;
252b5132 564
3e73aa7c
JH
565/* We support four different modes. FLAG_CODE variable is used to distinguish
566 these. */
567
568enum flag_code {
569 CODE_32BIT,
570 CODE_16BIT,
571 CODE_64BIT };
572
573static enum flag_code flag_code;
4fa24527 574static unsigned int object_64bit;
862be3fb 575static unsigned int disallow_64bit_reloc;
3e73aa7c 576static int use_rela_relocations = 0;
e379e5f3
L
577/* __tls_get_addr/___tls_get_addr symbol for TLS. */
578static const char *tls_get_addr;
3e73aa7c 579
7af8ed2d
NC
580#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
581 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
582 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
583
351f65ca
L
584/* The ELF ABI to use. */
585enum x86_elf_abi
586{
587 I386_ABI,
7f56bc95
L
588 X86_64_ABI,
589 X86_64_X32_ABI
351f65ca
L
590};
591
592static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 593#endif
351f65ca 594
167ad85b
TG
595#if defined (TE_PE) || defined (TE_PEP)
596/* Use big object file format. */
597static int use_big_obj = 0;
598#endif
599
8dcea932
L
600#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
601/* 1 if generating code for a shared library. */
602static int shared = 0;
603#endif
604
47926f60
KH
605/* 1 for intel syntax,
606 0 if att syntax. */
607static int intel_syntax = 0;
252b5132 608
4b5aaf5f
L
609static enum x86_64_isa
610{
611 amd64 = 1, /* AMD64 ISA. */
612 intel64 /* Intel64 ISA. */
613} isa64;
e89c5eaa 614
1efbbeb4
L
615/* 1 for intel mnemonic,
616 0 if att mnemonic. */
617static int intel_mnemonic = !SYSV386_COMPAT;
618
a60de03c
JB
619/* 1 if pseudo registers are permitted. */
620static int allow_pseudo_reg = 0;
621
47926f60
KH
622/* 1 if register prefix % not required. */
623static int allow_naked_reg = 0;
252b5132 624
33eaf5de 625/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
626 instructions supporting it, even if this prefix wasn't specified
627 explicitly. */
628static int add_bnd_prefix = 0;
629
ba104c83 630/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
631static int allow_index_reg = 0;
632
d022bddd
IT
633/* 1 if the assembler should ignore LOCK prefix, even if it was
634 specified explicitly. */
635static int omit_lock_prefix = 0;
636
e4e00185
AS
637/* 1 if the assembler should encode lfence, mfence, and sfence as
638 "lock addl $0, (%{re}sp)". */
639static int avoid_fence = 0;
640
ae531041
L
641/* 1 if lfence should be inserted after every load. */
642static int lfence_after_load = 0;
643
644/* Non-zero if lfence should be inserted before indirect branch. */
645static enum lfence_before_indirect_branch_kind
646 {
647 lfence_branch_none = 0,
648 lfence_branch_register,
649 lfence_branch_memory,
650 lfence_branch_all
651 }
652lfence_before_indirect_branch;
653
654/* Non-zero if lfence should be inserted before ret. */
655static enum lfence_before_ret_kind
656 {
657 lfence_before_ret_none = 0,
658 lfence_before_ret_not,
a09f656b 659 lfence_before_ret_or,
660 lfence_before_ret_shl
ae531041
L
661 }
662lfence_before_ret;
663
664/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
665static struct
666 {
667 segT seg;
668 const char *file;
669 const char *name;
670 unsigned int line;
671 enum last_insn_kind
672 {
673 last_insn_other = 0,
674 last_insn_directive,
675 last_insn_prefix
676 } kind;
677 } last_insn;
678
0cb4071e
L
679/* 1 if the assembler should generate relax relocations. */
680
681static int generate_relax_relocations
682 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
683
7bab8ab5 684static enum check_kind
daf50ae7 685 {
7bab8ab5
JB
686 check_none = 0,
687 check_warning,
688 check_error
daf50ae7 689 }
7bab8ab5 690sse_check, operand_check = check_warning;
daf50ae7 691
e379e5f3
L
692/* Non-zero if branches should be aligned within power of 2 boundary. */
693static int align_branch_power = 0;
694
695/* Types of branches to align. */
696enum align_branch_kind
697 {
698 align_branch_none = 0,
699 align_branch_jcc = 1,
700 align_branch_fused = 2,
701 align_branch_jmp = 3,
702 align_branch_call = 4,
703 align_branch_indirect = 5,
704 align_branch_ret = 6
705 };
706
707/* Type bits of branches to align. */
708enum align_branch_bit
709 {
710 align_branch_jcc_bit = 1 << align_branch_jcc,
711 align_branch_fused_bit = 1 << align_branch_fused,
712 align_branch_jmp_bit = 1 << align_branch_jmp,
713 align_branch_call_bit = 1 << align_branch_call,
714 align_branch_indirect_bit = 1 << align_branch_indirect,
715 align_branch_ret_bit = 1 << align_branch_ret
716 };
717
718static unsigned int align_branch = (align_branch_jcc_bit
719 | align_branch_fused_bit
720 | align_branch_jmp_bit);
721
79d72f45
HL
722/* Types of condition jump used by macro-fusion. */
723enum mf_jcc_kind
724 {
725 mf_jcc_jo = 0, /* base opcode 0x70 */
726 mf_jcc_jc, /* base opcode 0x72 */
727 mf_jcc_je, /* base opcode 0x74 */
728 mf_jcc_jna, /* base opcode 0x76 */
729 mf_jcc_js, /* base opcode 0x78 */
730 mf_jcc_jp, /* base opcode 0x7a */
731 mf_jcc_jl, /* base opcode 0x7c */
732 mf_jcc_jle, /* base opcode 0x7e */
733 };
734
735/* Types of compare flag-modifying insntructions used by macro-fusion. */
736enum mf_cmp_kind
737 {
738 mf_cmp_test_and, /* test/cmp */
739 mf_cmp_alu_cmp, /* add/sub/cmp */
740 mf_cmp_incdec /* inc/dec */
741 };
742
e379e5f3
L
743/* The maximum padding size for fused jcc. CMP like instruction can
744 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
745 prefixes. */
746#define MAX_FUSED_JCC_PADDING_SIZE 20
747
748/* The maximum number of prefixes added for an instruction. */
749static unsigned int align_branch_prefix_size = 5;
750
b6f8c7c4
L
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 */
756static int optimize = 0;
757
758/* Optimization:
759 1. Clear the REX_W bit with register operand if possible.
760 2. Above plus use 128bit vector instruction to clear the full vector
761 register.
762 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
763 "testb $imm7,%r8".
764 */
765static int optimize_for_space = 0;
766
2ca3ace5
L
767/* Register prefix used for error message. */
768static const char *register_prefix = "%";
769
47926f60
KH
770/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
771 leave, push, and pop instructions so that gcc has the same stack
772 frame as in 32 bit mode. */
773static char stackop_size = '\0';
eecb386c 774
12b55ccc
L
775/* Non-zero to optimize code alignment. */
776int optimize_align_code = 1;
777
47926f60
KH
778/* Non-zero to quieten some warnings. */
779static int quiet_warnings = 0;
a38cf1db 780
47926f60
KH
781/* CPU name. */
782static const char *cpu_arch_name = NULL;
6305a203 783static char *cpu_sub_arch_name = NULL;
a38cf1db 784
47926f60 785/* CPU feature flags. */
40fb9820
L
786static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
787
ccc9c027
L
788/* If we have selected a cpu we are generating instructions for. */
789static int cpu_arch_tune_set = 0;
790
9103f4f4 791/* Cpu we are generating instructions for. */
fbf3f584 792enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
793
794/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 795static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 796
ccc9c027 797/* CPU instruction set architecture used. */
fbf3f584 798enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 799
9103f4f4 800/* CPU feature flags of instruction set architecture used. */
fbf3f584 801i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 802
fddf5b5b
AM
803/* If set, conditional jumps are not automatically promoted to handle
804 larger than a byte offset. */
805static unsigned int no_cond_jump_promotion = 0;
806
c0f3af97
L
807/* Encode SSE instructions with VEX prefix. */
808static unsigned int sse2avx;
809
539f890d
L
810/* Encode scalar AVX instructions with specific vector length. */
811static enum
812 {
813 vex128 = 0,
814 vex256
815 } avxscalar;
816
03751133
L
817/* Encode VEX WIG instructions with specific vex.w. */
818static enum
819 {
820 vexw0 = 0,
821 vexw1
822 } vexwig;
823
43234a1e
L
824/* Encode scalar EVEX LIG instructions with specific vector length. */
825static enum
826 {
827 evexl128 = 0,
828 evexl256,
829 evexl512
830 } evexlig;
831
832/* Encode EVEX WIG instructions with specific evex.w. */
833static enum
834 {
835 evexw0 = 0,
836 evexw1
837 } evexwig;
838
d3d3c6db
IT
839/* Value to encode in EVEX RC bits, for SAE-only instructions. */
840static enum rc_type evexrcig = rne;
841
29b0f896 842/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 843static symbolS *GOT_symbol;
29b0f896 844
a4447b93
RH
845/* The dwarf2 return column, adjusted for 32 or 64 bit. */
846unsigned int x86_dwarf2_return_column;
847
848/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
849int x86_cie_data_alignment;
850
252b5132 851/* Interface to relax_segment.
fddf5b5b
AM
852 There are 3 major relax states for 386 jump insns because the
853 different types of jumps add different sizes to frags when we're
e379e5f3
L
854 figuring out what sort of jump to choose to reach a given label.
855
856 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
857 branches which are handled by md_estimate_size_before_relax() and
858 i386_generic_table_relax_frag(). */
252b5132 859
47926f60 860/* Types. */
93c2a809
AM
861#define UNCOND_JUMP 0
862#define COND_JUMP 1
863#define COND_JUMP86 2
e379e5f3
L
864#define BRANCH_PADDING 3
865#define BRANCH_PREFIX 4
866#define FUSED_JCC_PADDING 5
fddf5b5b 867
47926f60 868/* Sizes. */
252b5132
RH
869#define CODE16 1
870#define SMALL 0
29b0f896 871#define SMALL16 (SMALL | CODE16)
252b5132 872#define BIG 2
29b0f896 873#define BIG16 (BIG | CODE16)
252b5132
RH
874
875#ifndef INLINE
876#ifdef __GNUC__
877#define INLINE __inline__
878#else
879#define INLINE
880#endif
881#endif
882
fddf5b5b
AM
883#define ENCODE_RELAX_STATE(type, size) \
884 ((relax_substateT) (((type) << 2) | (size)))
885#define TYPE_FROM_RELAX_STATE(s) \
886 ((s) >> 2)
887#define DISP_SIZE_FROM_RELAX_STATE(s) \
888 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
889
890/* This table is used by relax_frag to promote short jumps to long
891 ones where necessary. SMALL (short) jumps may be promoted to BIG
892 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
893 don't allow a short jump in a 32 bit code segment to be promoted to
894 a 16 bit offset jump because it's slower (requires data size
895 prefix), and doesn't work, unless the destination is in the bottom
896 64k of the code segment (The top 16 bits of eip are zeroed). */
897
898const relax_typeS md_relax_table[] =
899{
24eab124
AM
900 /* The fields are:
901 1) most positive reach of this state,
902 2) most negative reach of this state,
93c2a809 903 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 904 4) which index into the table to try if we can't fit into this one. */
252b5132 905
fddf5b5b 906 /* UNCOND_JUMP states. */
93c2a809
AM
907 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
908 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
909 /* dword jmp adds 4 bytes to frag:
910 0 extra opcode bytes, 4 displacement bytes. */
252b5132 911 {0, 0, 4, 0},
93c2a809
AM
912 /* word jmp adds 2 byte2 to frag:
913 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
914 {0, 0, 2, 0},
915
93c2a809
AM
916 /* COND_JUMP states. */
917 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
918 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
919 /* dword conditionals adds 5 bytes to frag:
920 1 extra opcode byte, 4 displacement bytes. */
921 {0, 0, 5, 0},
fddf5b5b 922 /* word conditionals add 3 bytes to frag:
93c2a809
AM
923 1 extra opcode byte, 2 displacement bytes. */
924 {0, 0, 3, 0},
925
926 /* COND_JUMP86 states. */
927 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
928 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
929 /* dword conditionals adds 5 bytes to frag:
930 1 extra opcode byte, 4 displacement bytes. */
931 {0, 0, 5, 0},
932 /* word conditionals add 4 bytes to frag:
933 1 displacement byte and a 3 byte long branch insn. */
934 {0, 0, 4, 0}
252b5132
RH
935};
936
9103f4f4
L
937static const arch_entry cpu_arch[] =
938{
89507696
JB
939 /* Do not replace the first two entries - i386_target_format()
940 relies on them being there in this order. */
8a2c8fef 941 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 942 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 943 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 944 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 945 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 946 CPU_NONE_FLAGS, 0 },
8a2c8fef 947 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 948 CPU_I186_FLAGS, 0 },
8a2c8fef 949 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 950 CPU_I286_FLAGS, 0 },
8a2c8fef 951 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 952 CPU_I386_FLAGS, 0 },
8a2c8fef 953 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 954 CPU_I486_FLAGS, 0 },
8a2c8fef 955 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 956 CPU_I586_FLAGS, 0 },
8a2c8fef 957 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 958 CPU_I686_FLAGS, 0 },
8a2c8fef 959 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 960 CPU_I586_FLAGS, 0 },
8a2c8fef 961 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 962 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 963 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 964 CPU_P2_FLAGS, 0 },
8a2c8fef 965 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 966 CPU_P3_FLAGS, 0 },
8a2c8fef 967 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 968 CPU_P4_FLAGS, 0 },
8a2c8fef 969 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 970 CPU_CORE_FLAGS, 0 },
8a2c8fef 971 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 972 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 973 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 974 CPU_CORE_FLAGS, 1 },
8a2c8fef 975 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 976 CPU_CORE_FLAGS, 0 },
8a2c8fef 977 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 978 CPU_CORE2_FLAGS, 1 },
8a2c8fef 979 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 980 CPU_CORE2_FLAGS, 0 },
8a2c8fef 981 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 982 CPU_COREI7_FLAGS, 0 },
8a2c8fef 983 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 984 CPU_L1OM_FLAGS, 0 },
7a9068fe 985 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 986 CPU_K1OM_FLAGS, 0 },
81486035 987 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 988 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 989 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 990 CPU_K6_FLAGS, 0 },
8a2c8fef 991 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 992 CPU_K6_2_FLAGS, 0 },
8a2c8fef 993 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 994 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 995 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 996 CPU_K8_FLAGS, 1 },
8a2c8fef 997 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 998 CPU_K8_FLAGS, 0 },
8a2c8fef 999 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 1000 CPU_K8_FLAGS, 0 },
8a2c8fef 1001 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 1002 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 1003 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 1004 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 1005 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 1006 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1007 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1008 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1009 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1010 CPU_BDVER4_FLAGS, 0 },
029f3522 1011 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1012 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1013 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1014 CPU_ZNVER2_FLAGS, 0 },
7b458c12 1015 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1016 CPU_BTVER1_FLAGS, 0 },
7b458c12 1017 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1018 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1019 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1020 CPU_8087_FLAGS, 0 },
8a2c8fef 1021 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1022 CPU_287_FLAGS, 0 },
8a2c8fef 1023 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1024 CPU_387_FLAGS, 0 },
1848e567
L
1025 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1026 CPU_687_FLAGS, 0 },
d871f3f4
L
1027 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1028 CPU_CMOV_FLAGS, 0 },
1029 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1030 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1031 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1032 CPU_MMX_FLAGS, 0 },
8a2c8fef 1033 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1034 CPU_SSE_FLAGS, 0 },
8a2c8fef 1035 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1036 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1037 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1038 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1039 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1040 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1041 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1042 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1043 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1044 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1045 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1046 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1047 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1048 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1049 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1050 CPU_AVX_FLAGS, 0 },
6c30d220 1051 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1052 CPU_AVX2_FLAGS, 0 },
43234a1e 1053 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1054 CPU_AVX512F_FLAGS, 0 },
43234a1e 1055 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1056 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1057 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1058 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1059 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1060 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1061 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1062 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1063 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1064 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1065 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1066 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1067 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1068 CPU_VMX_FLAGS, 0 },
8729a6f6 1069 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1070 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1071 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1072 CPU_SMX_FLAGS, 0 },
8a2c8fef 1073 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1074 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1075 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1076 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1077 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1078 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1079 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1080 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1081 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1082 CPU_AES_FLAGS, 0 },
8a2c8fef 1083 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1084 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1085 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1086 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1087 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1088 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1089 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1090 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1091 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1092 CPU_F16C_FLAGS, 0 },
6c30d220 1093 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1094 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1095 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1096 CPU_FMA_FLAGS, 0 },
8a2c8fef 1097 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1098 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1099 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1100 CPU_XOP_FLAGS, 0 },
8a2c8fef 1101 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1102 CPU_LWP_FLAGS, 0 },
8a2c8fef 1103 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1104 CPU_MOVBE_FLAGS, 0 },
60aa667e 1105 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1106 CPU_CX16_FLAGS, 0 },
8a2c8fef 1107 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1108 CPU_EPT_FLAGS, 0 },
6c30d220 1109 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1110 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1111 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1112 CPU_POPCNT_FLAGS, 0 },
42164a71 1113 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1114 CPU_HLE_FLAGS, 0 },
42164a71 1115 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1116 CPU_RTM_FLAGS, 0 },
6c30d220 1117 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1118 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1119 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1120 CPU_CLFLUSH_FLAGS, 0 },
22109423 1121 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1122 CPU_NOP_FLAGS, 0 },
8a2c8fef 1123 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1124 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1125 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1126 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1127 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1128 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1129 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1130 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1131 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1132 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1133 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1134 CPU_SVME_FLAGS, 1 },
8a2c8fef 1135 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1136 CPU_SVME_FLAGS, 0 },
8a2c8fef 1137 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1138 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1139 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1140 CPU_ABM_FLAGS, 0 },
87973e9f 1141 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1142 CPU_BMI_FLAGS, 0 },
2a2a0f38 1143 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1144 CPU_TBM_FLAGS, 0 },
e2e1fcde 1145 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1146 CPU_ADX_FLAGS, 0 },
e2e1fcde 1147 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1148 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1149 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1150 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1151 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1152 CPU_SMAP_FLAGS, 0 },
7e8b059b 1153 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1154 CPU_MPX_FLAGS, 0 },
a0046408 1155 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1156 CPU_SHA_FLAGS, 0 },
963f3586 1157 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1158 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1159 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1160 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1161 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1162 CPU_SE1_FLAGS, 0 },
c5e7287a 1163 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1164 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1165 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1166 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1167 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1168 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1169 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1170 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1171 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1172 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1173 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1174 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1175 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1176 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1177 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1178 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1179 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1180 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1181 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1182 CPU_CLZERO_FLAGS, 0 },
9916071f 1183 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1184 CPU_MWAITX_FLAGS, 0 },
8eab4136 1185 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1186 CPU_OSPKE_FLAGS, 0 },
8bc52696 1187 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1188 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1189 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1190 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1191 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1192 CPU_IBT_FLAGS, 0 },
1193 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1194 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1195 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1196 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1197 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1198 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1199 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1200 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1201 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1202 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1203 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1204 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1205 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1206 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1207 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1208 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1209 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1210 CPU_AMX_INT8_FLAGS, 0 },
1211 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1212 CPU_AMX_BF16_FLAGS, 0 },
1213 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1214 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1215 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1216 CPU_MOVDIRI_FLAGS, 0 },
1217 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1218 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1219 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1220 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1221 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1222 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1223 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1224 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1225 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1226 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1227 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1228 CPU_RDPRU_FLAGS, 0 },
1229 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1230 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1231 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1232 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1233 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1234 CPU_TSXLDTRK_FLAGS, 0 },
293f5f65
L
1235};
1236
1237static const noarch_entry cpu_noarch[] =
1238{
1239 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1240 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1241 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1242 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1243 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1244 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1245 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1246 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1247 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1248 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1249 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1250 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1251 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1252 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1253 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1254 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1255 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1256 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1257 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1258 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1259 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1260 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1261 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1262 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1263 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1264 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1265 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1266 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1267 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1268 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1269 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1270 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1271 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1272 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1273 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1274 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1275 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1276 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1277 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1278 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1279 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1280 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
dd455cf5 1281 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1282 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1283 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
e413e4e9
AM
1284};
1285
704209c0 1286#ifdef I386COFF
a6c24e68
NC
1287/* Like s_lcomm_internal in gas/read.c but the alignment string
1288 is allowed to be optional. */
1289
1290static symbolS *
1291pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1292{
1293 addressT align = 0;
1294
1295 SKIP_WHITESPACE ();
1296
7ab9ffdd 1297 if (needs_align
a6c24e68
NC
1298 && *input_line_pointer == ',')
1299 {
1300 align = parse_align (needs_align - 1);
7ab9ffdd 1301
a6c24e68
NC
1302 if (align == (addressT) -1)
1303 return NULL;
1304 }
1305 else
1306 {
1307 if (size >= 8)
1308 align = 3;
1309 else if (size >= 4)
1310 align = 2;
1311 else if (size >= 2)
1312 align = 1;
1313 else
1314 align = 0;
1315 }
1316
1317 bss_alloc (symbolP, size, align);
1318 return symbolP;
1319}
1320
704209c0 1321static void
a6c24e68
NC
1322pe_lcomm (int needs_align)
1323{
1324 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1325}
704209c0 1326#endif
a6c24e68 1327
29b0f896
AM
1328const pseudo_typeS md_pseudo_table[] =
1329{
1330#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1331 {"align", s_align_bytes, 0},
1332#else
1333 {"align", s_align_ptwo, 0},
1334#endif
1335 {"arch", set_cpu_arch, 0},
1336#ifndef I386COFF
1337 {"bss", s_bss, 0},
a6c24e68
NC
1338#else
1339 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1340#endif
1341 {"ffloat", float_cons, 'f'},
1342 {"dfloat", float_cons, 'd'},
1343 {"tfloat", float_cons, 'x'},
1344 {"value", cons, 2},
d182319b 1345 {"slong", signed_cons, 4},
29b0f896
AM
1346 {"noopt", s_ignore, 0},
1347 {"optim", s_ignore, 0},
1348 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1349 {"code16", set_code_flag, CODE_16BIT},
1350 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1351#ifdef BFD64
29b0f896 1352 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1353#endif
29b0f896
AM
1354 {"intel_syntax", set_intel_syntax, 1},
1355 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1356 {"intel_mnemonic", set_intel_mnemonic, 1},
1357 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1358 {"allow_index_reg", set_allow_index_reg, 1},
1359 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1360 {"sse_check", set_check, 0},
1361 {"operand_check", set_check, 1},
3b22753a
L
1362#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1363 {"largecomm", handle_large_common, 0},
07a53e5c 1364#else
68d20676 1365 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1366 {"loc", dwarf2_directive_loc, 0},
1367 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1368#endif
6482c264
NC
1369#ifdef TE_PE
1370 {"secrel32", pe_directive_secrel, 0},
1371#endif
29b0f896
AM
1372 {0, 0, 0}
1373};
1374
1375/* For interface with expression (). */
1376extern char *input_line_pointer;
1377
1378/* Hash table for instruction mnemonic lookup. */
1379static struct hash_control *op_hash;
1380
1381/* Hash table for register lookup. */
1382static struct hash_control *reg_hash;
1383\f
ce8a8b2f
AM
1384 /* Various efficient no-op patterns for aligning code labels.
1385 Note: Don't try to assemble the instructions in the comments.
1386 0L and 0w are not legal. */
62a02d25
L
1387static const unsigned char f32_1[] =
1388 {0x90}; /* nop */
1389static const unsigned char f32_2[] =
1390 {0x66,0x90}; /* xchg %ax,%ax */
1391static const unsigned char f32_3[] =
1392 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1393static const unsigned char f32_4[] =
1394 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1395static const unsigned char f32_6[] =
1396 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1397static const unsigned char f32_7[] =
1398 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1399static const unsigned char f16_3[] =
3ae729d5 1400 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1401static const unsigned char f16_4[] =
3ae729d5
L
1402 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1403static const unsigned char jump_disp8[] =
1404 {0xeb}; /* jmp disp8 */
1405static const unsigned char jump32_disp32[] =
1406 {0xe9}; /* jmp disp32 */
1407static const unsigned char jump16_disp32[] =
1408 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1409/* 32-bit NOPs patterns. */
1410static const unsigned char *const f32_patt[] = {
3ae729d5 1411 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1412};
1413/* 16-bit NOPs patterns. */
1414static const unsigned char *const f16_patt[] = {
3ae729d5 1415 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1416};
1417/* nopl (%[re]ax) */
1418static const unsigned char alt_3[] =
1419 {0x0f,0x1f,0x00};
1420/* nopl 0(%[re]ax) */
1421static const unsigned char alt_4[] =
1422 {0x0f,0x1f,0x40,0x00};
1423/* nopl 0(%[re]ax,%[re]ax,1) */
1424static const unsigned char alt_5[] =
1425 {0x0f,0x1f,0x44,0x00,0x00};
1426/* nopw 0(%[re]ax,%[re]ax,1) */
1427static const unsigned char alt_6[] =
1428 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1429/* nopl 0L(%[re]ax) */
1430static const unsigned char alt_7[] =
1431 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1432/* nopl 0L(%[re]ax,%[re]ax,1) */
1433static const unsigned char alt_8[] =
1434 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1435/* nopw 0L(%[re]ax,%[re]ax,1) */
1436static const unsigned char alt_9[] =
1437 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1438/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1439static const unsigned char alt_10[] =
1440 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1441/* data16 nopw %cs:0L(%eax,%eax,1) */
1442static const unsigned char alt_11[] =
1443 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1444/* 32-bit and 64-bit NOPs patterns. */
1445static const unsigned char *const alt_patt[] = {
1446 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1447 alt_9, alt_10, alt_11
62a02d25
L
1448};
1449
1450/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1451 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1452
1453static void
1454i386_output_nops (char *where, const unsigned char *const *patt,
1455 int count, int max_single_nop_size)
1456
1457{
3ae729d5
L
1458 /* Place the longer NOP first. */
1459 int last;
1460 int offset;
3076e594
NC
1461 const unsigned char *nops;
1462
1463 if (max_single_nop_size < 1)
1464 {
1465 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1466 max_single_nop_size);
1467 return;
1468 }
1469
1470 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1471
1472 /* Use the smaller one if the requsted one isn't available. */
1473 if (nops == NULL)
62a02d25 1474 {
3ae729d5
L
1475 max_single_nop_size--;
1476 nops = patt[max_single_nop_size - 1];
62a02d25
L
1477 }
1478
3ae729d5
L
1479 last = count % max_single_nop_size;
1480
1481 count -= last;
1482 for (offset = 0; offset < count; offset += max_single_nop_size)
1483 memcpy (where + offset, nops, max_single_nop_size);
1484
1485 if (last)
1486 {
1487 nops = patt[last - 1];
1488 if (nops == NULL)
1489 {
1490 /* Use the smaller one plus one-byte NOP if the needed one
1491 isn't available. */
1492 last--;
1493 nops = patt[last - 1];
1494 memcpy (where + offset, nops, last);
1495 where[offset + last] = *patt[0];
1496 }
1497 else
1498 memcpy (where + offset, nops, last);
1499 }
62a02d25
L
1500}
1501
3ae729d5
L
1502static INLINE int
1503fits_in_imm7 (offsetT num)
1504{
1505 return (num & 0x7f) == num;
1506}
1507
1508static INLINE int
1509fits_in_imm31 (offsetT num)
1510{
1511 return (num & 0x7fffffff) == num;
1512}
62a02d25
L
1513
1514/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1515 single NOP instruction LIMIT. */
1516
1517void
3ae729d5 1518i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1519{
3ae729d5 1520 const unsigned char *const *patt = NULL;
62a02d25 1521 int max_single_nop_size;
3ae729d5
L
1522 /* Maximum number of NOPs before switching to jump over NOPs. */
1523 int max_number_of_nops;
62a02d25 1524
3ae729d5 1525 switch (fragP->fr_type)
62a02d25 1526 {
3ae729d5
L
1527 case rs_fill_nop:
1528 case rs_align_code:
1529 break;
e379e5f3
L
1530 case rs_machine_dependent:
1531 /* Allow NOP padding for jumps and calls. */
1532 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1533 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1534 break;
1535 /* Fall through. */
3ae729d5 1536 default:
62a02d25
L
1537 return;
1538 }
1539
ccc9c027
L
1540 /* We need to decide which NOP sequence to use for 32bit and
1541 64bit. When -mtune= is used:
4eed87de 1542
76bc74dc
L
1543 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1544 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1545 2. For the rest, alt_patt will be used.
1546
1547 When -mtune= isn't used, alt_patt will be used if
22109423 1548 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1549 be used.
ccc9c027
L
1550
1551 When -march= or .arch is used, we can't use anything beyond
1552 cpu_arch_isa_flags. */
1553
1554 if (flag_code == CODE_16BIT)
1555 {
3ae729d5
L
1556 patt = f16_patt;
1557 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1558 /* Limit number of NOPs to 2 in 16-bit mode. */
1559 max_number_of_nops = 2;
252b5132 1560 }
33fef721 1561 else
ccc9c027 1562 {
fbf3f584 1563 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1564 {
1565 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1566 switch (cpu_arch_tune)
1567 {
1568 case PROCESSOR_UNKNOWN:
1569 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1570 optimize with nops. */
1571 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1572 patt = alt_patt;
ccc9c027
L
1573 else
1574 patt = f32_patt;
1575 break;
ccc9c027
L
1576 case PROCESSOR_PENTIUM4:
1577 case PROCESSOR_NOCONA:
ef05d495 1578 case PROCESSOR_CORE:
76bc74dc 1579 case PROCESSOR_CORE2:
bd5295b2 1580 case PROCESSOR_COREI7:
3632d14b 1581 case PROCESSOR_L1OM:
7a9068fe 1582 case PROCESSOR_K1OM:
76bc74dc 1583 case PROCESSOR_GENERIC64:
ccc9c027
L
1584 case PROCESSOR_K6:
1585 case PROCESSOR_ATHLON:
1586 case PROCESSOR_K8:
4eed87de 1587 case PROCESSOR_AMDFAM10:
8aedb9fe 1588 case PROCESSOR_BD:
029f3522 1589 case PROCESSOR_ZNVER:
7b458c12 1590 case PROCESSOR_BT:
80b8656c 1591 patt = alt_patt;
ccc9c027 1592 break;
76bc74dc 1593 case PROCESSOR_I386:
ccc9c027
L
1594 case PROCESSOR_I486:
1595 case PROCESSOR_PENTIUM:
2dde1948 1596 case PROCESSOR_PENTIUMPRO:
81486035 1597 case PROCESSOR_IAMCU:
ccc9c027
L
1598 case PROCESSOR_GENERIC32:
1599 patt = f32_patt;
1600 break;
4eed87de 1601 }
ccc9c027
L
1602 }
1603 else
1604 {
fbf3f584 1605 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1606 {
1607 case PROCESSOR_UNKNOWN:
e6a14101 1608 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1609 PROCESSOR_UNKNOWN. */
1610 abort ();
1611 break;
1612
76bc74dc 1613 case PROCESSOR_I386:
ccc9c027
L
1614 case PROCESSOR_I486:
1615 case PROCESSOR_PENTIUM:
81486035 1616 case PROCESSOR_IAMCU:
ccc9c027
L
1617 case PROCESSOR_K6:
1618 case PROCESSOR_ATHLON:
1619 case PROCESSOR_K8:
4eed87de 1620 case PROCESSOR_AMDFAM10:
8aedb9fe 1621 case PROCESSOR_BD:
029f3522 1622 case PROCESSOR_ZNVER:
7b458c12 1623 case PROCESSOR_BT:
ccc9c027
L
1624 case PROCESSOR_GENERIC32:
1625 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1626 with nops. */
1627 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1628 patt = alt_patt;
ccc9c027
L
1629 else
1630 patt = f32_patt;
1631 break;
76bc74dc
L
1632 case PROCESSOR_PENTIUMPRO:
1633 case PROCESSOR_PENTIUM4:
1634 case PROCESSOR_NOCONA:
1635 case PROCESSOR_CORE:
ef05d495 1636 case PROCESSOR_CORE2:
bd5295b2 1637 case PROCESSOR_COREI7:
3632d14b 1638 case PROCESSOR_L1OM:
7a9068fe 1639 case PROCESSOR_K1OM:
22109423 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;
1645 case PROCESSOR_GENERIC64:
80b8656c 1646 patt = alt_patt;
ccc9c027 1647 break;
4eed87de 1648 }
ccc9c027
L
1649 }
1650
76bc74dc
L
1651 if (patt == f32_patt)
1652 {
3ae729d5
L
1653 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1654 /* Limit number of NOPs to 2 for older processors. */
1655 max_number_of_nops = 2;
76bc74dc
L
1656 }
1657 else
1658 {
3ae729d5
L
1659 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1660 /* Limit number of NOPs to 7 for newer processors. */
1661 max_number_of_nops = 7;
1662 }
1663 }
1664
1665 if (limit == 0)
1666 limit = max_single_nop_size;
1667
1668 if (fragP->fr_type == rs_fill_nop)
1669 {
1670 /* Output NOPs for .nop directive. */
1671 if (limit > max_single_nop_size)
1672 {
1673 as_bad_where (fragP->fr_file, fragP->fr_line,
1674 _("invalid single nop size: %d "
1675 "(expect within [0, %d])"),
1676 limit, max_single_nop_size);
1677 return;
1678 }
1679 }
e379e5f3 1680 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1681 fragP->fr_var = count;
1682
1683 if ((count / max_single_nop_size) > max_number_of_nops)
1684 {
1685 /* Generate jump over NOPs. */
1686 offsetT disp = count - 2;
1687 if (fits_in_imm7 (disp))
1688 {
1689 /* Use "jmp disp8" if possible. */
1690 count = disp;
1691 where[0] = jump_disp8[0];
1692 where[1] = count;
1693 where += 2;
1694 }
1695 else
1696 {
1697 unsigned int size_of_jump;
1698
1699 if (flag_code == CODE_16BIT)
1700 {
1701 where[0] = jump16_disp32[0];
1702 where[1] = jump16_disp32[1];
1703 size_of_jump = 2;
1704 }
1705 else
1706 {
1707 where[0] = jump32_disp32[0];
1708 size_of_jump = 1;
1709 }
1710
1711 count -= size_of_jump + 4;
1712 if (!fits_in_imm31 (count))
1713 {
1714 as_bad_where (fragP->fr_file, fragP->fr_line,
1715 _("jump over nop padding out of range"));
1716 return;
1717 }
1718
1719 md_number_to_chars (where + size_of_jump, count, 4);
1720 where += size_of_jump + 4;
76bc74dc 1721 }
ccc9c027 1722 }
3ae729d5
L
1723
1724 /* Generate multiple NOPs. */
1725 i386_output_nops (where, patt, count, limit);
252b5132
RH
1726}
1727
c6fb90c8 1728static INLINE int
0dfbf9d7 1729operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1730{
0dfbf9d7 1731 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1732 {
1733 case 3:
0dfbf9d7 1734 if (x->array[2])
c6fb90c8 1735 return 0;
1a0670f3 1736 /* Fall through. */
c6fb90c8 1737 case 2:
0dfbf9d7 1738 if (x->array[1])
c6fb90c8 1739 return 0;
1a0670f3 1740 /* Fall through. */
c6fb90c8 1741 case 1:
0dfbf9d7 1742 return !x->array[0];
c6fb90c8
L
1743 default:
1744 abort ();
1745 }
40fb9820
L
1746}
1747
c6fb90c8 1748static INLINE void
0dfbf9d7 1749operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1750{
0dfbf9d7 1751 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1752 {
1753 case 3:
0dfbf9d7 1754 x->array[2] = v;
1a0670f3 1755 /* Fall through. */
c6fb90c8 1756 case 2:
0dfbf9d7 1757 x->array[1] = v;
1a0670f3 1758 /* Fall through. */
c6fb90c8 1759 case 1:
0dfbf9d7 1760 x->array[0] = v;
1a0670f3 1761 /* Fall through. */
c6fb90c8
L
1762 break;
1763 default:
1764 abort ();
1765 }
bab6aec1
JB
1766
1767 x->bitfield.class = ClassNone;
75e5731b 1768 x->bitfield.instance = InstanceNone;
c6fb90c8 1769}
40fb9820 1770
c6fb90c8 1771static INLINE int
0dfbf9d7
L
1772operand_type_equal (const union i386_operand_type *x,
1773 const union i386_operand_type *y)
c6fb90c8 1774{
0dfbf9d7 1775 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1776 {
1777 case 3:
0dfbf9d7 1778 if (x->array[2] != y->array[2])
c6fb90c8 1779 return 0;
1a0670f3 1780 /* Fall through. */
c6fb90c8 1781 case 2:
0dfbf9d7 1782 if (x->array[1] != y->array[1])
c6fb90c8 1783 return 0;
1a0670f3 1784 /* Fall through. */
c6fb90c8 1785 case 1:
0dfbf9d7 1786 return x->array[0] == y->array[0];
c6fb90c8
L
1787 break;
1788 default:
1789 abort ();
1790 }
1791}
40fb9820 1792
0dfbf9d7
L
1793static INLINE int
1794cpu_flags_all_zero (const union i386_cpu_flags *x)
1795{
1796 switch (ARRAY_SIZE(x->array))
1797 {
53467f57
IT
1798 case 4:
1799 if (x->array[3])
1800 return 0;
1801 /* Fall through. */
0dfbf9d7
L
1802 case 3:
1803 if (x->array[2])
1804 return 0;
1a0670f3 1805 /* Fall through. */
0dfbf9d7
L
1806 case 2:
1807 if (x->array[1])
1808 return 0;
1a0670f3 1809 /* Fall through. */
0dfbf9d7
L
1810 case 1:
1811 return !x->array[0];
1812 default:
1813 abort ();
1814 }
1815}
1816
0dfbf9d7
L
1817static INLINE int
1818cpu_flags_equal (const union i386_cpu_flags *x,
1819 const union i386_cpu_flags *y)
1820{
1821 switch (ARRAY_SIZE(x->array))
1822 {
53467f57
IT
1823 case 4:
1824 if (x->array[3] != y->array[3])
1825 return 0;
1826 /* Fall through. */
0dfbf9d7
L
1827 case 3:
1828 if (x->array[2] != y->array[2])
1829 return 0;
1a0670f3 1830 /* Fall through. */
0dfbf9d7
L
1831 case 2:
1832 if (x->array[1] != y->array[1])
1833 return 0;
1a0670f3 1834 /* Fall through. */
0dfbf9d7
L
1835 case 1:
1836 return x->array[0] == y->array[0];
1837 break;
1838 default:
1839 abort ();
1840 }
1841}
c6fb90c8
L
1842
1843static INLINE int
1844cpu_flags_check_cpu64 (i386_cpu_flags f)
1845{
1846 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1847 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1848}
1849
c6fb90c8
L
1850static INLINE i386_cpu_flags
1851cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1852{
c6fb90c8
L
1853 switch (ARRAY_SIZE (x.array))
1854 {
53467f57
IT
1855 case 4:
1856 x.array [3] &= y.array [3];
1857 /* Fall through. */
c6fb90c8
L
1858 case 3:
1859 x.array [2] &= y.array [2];
1a0670f3 1860 /* Fall through. */
c6fb90c8
L
1861 case 2:
1862 x.array [1] &= y.array [1];
1a0670f3 1863 /* Fall through. */
c6fb90c8
L
1864 case 1:
1865 x.array [0] &= y.array [0];
1866 break;
1867 default:
1868 abort ();
1869 }
1870 return x;
1871}
40fb9820 1872
c6fb90c8
L
1873static INLINE i386_cpu_flags
1874cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1875{
c6fb90c8 1876 switch (ARRAY_SIZE (x.array))
40fb9820 1877 {
53467f57
IT
1878 case 4:
1879 x.array [3] |= y.array [3];
1880 /* Fall through. */
c6fb90c8
L
1881 case 3:
1882 x.array [2] |= y.array [2];
1a0670f3 1883 /* Fall through. */
c6fb90c8
L
1884 case 2:
1885 x.array [1] |= y.array [1];
1a0670f3 1886 /* Fall through. */
c6fb90c8
L
1887 case 1:
1888 x.array [0] |= y.array [0];
40fb9820
L
1889 break;
1890 default:
1891 abort ();
1892 }
40fb9820
L
1893 return x;
1894}
1895
309d3373
JB
1896static INLINE i386_cpu_flags
1897cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1898{
1899 switch (ARRAY_SIZE (x.array))
1900 {
53467f57
IT
1901 case 4:
1902 x.array [3] &= ~y.array [3];
1903 /* Fall through. */
309d3373
JB
1904 case 3:
1905 x.array [2] &= ~y.array [2];
1a0670f3 1906 /* Fall through. */
309d3373
JB
1907 case 2:
1908 x.array [1] &= ~y.array [1];
1a0670f3 1909 /* Fall through. */
309d3373
JB
1910 case 1:
1911 x.array [0] &= ~y.array [0];
1912 break;
1913 default:
1914 abort ();
1915 }
1916 return x;
1917}
1918
6c0946d0
JB
1919static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1920
c0f3af97
L
1921#define CPU_FLAGS_ARCH_MATCH 0x1
1922#define CPU_FLAGS_64BIT_MATCH 0x2
1923
c0f3af97 1924#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1925 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1926
1927/* Return CPU flags match bits. */
3629bb00 1928
40fb9820 1929static int
d3ce72d0 1930cpu_flags_match (const insn_template *t)
40fb9820 1931{
c0f3af97
L
1932 i386_cpu_flags x = t->cpu_flags;
1933 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1934
1935 x.bitfield.cpu64 = 0;
1936 x.bitfield.cpuno64 = 0;
1937
0dfbf9d7 1938 if (cpu_flags_all_zero (&x))
c0f3af97
L
1939 {
1940 /* This instruction is available on all archs. */
db12e14e 1941 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1942 }
3629bb00
L
1943 else
1944 {
c0f3af97 1945 /* This instruction is available only on some archs. */
3629bb00
L
1946 i386_cpu_flags cpu = cpu_arch_flags;
1947
ab592e75
JB
1948 /* AVX512VL is no standalone feature - match it and then strip it. */
1949 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1950 return match;
1951 x.bitfield.cpuavx512vl = 0;
1952
3629bb00 1953 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1954 if (!cpu_flags_all_zero (&cpu))
1955 {
a5ff0eb2
L
1956 if (x.bitfield.cpuavx)
1957 {
929f69fa 1958 /* We need to check a few extra flags with AVX. */
b9d49817 1959 if (cpu.bitfield.cpuavx
40d231b4
JB
1960 && (!t->opcode_modifier.sse2avx
1961 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1962 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1963 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1964 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1965 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1966 }
929f69fa
JB
1967 else if (x.bitfield.cpuavx512f)
1968 {
1969 /* We need to check a few extra flags with AVX512F. */
1970 if (cpu.bitfield.cpuavx512f
1971 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1972 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1973 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1974 match |= CPU_FLAGS_ARCH_MATCH;
1975 }
a5ff0eb2 1976 else
db12e14e 1977 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1978 }
3629bb00 1979 }
c0f3af97 1980 return match;
40fb9820
L
1981}
1982
c6fb90c8
L
1983static INLINE i386_operand_type
1984operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1985{
bab6aec1
JB
1986 if (x.bitfield.class != y.bitfield.class)
1987 x.bitfield.class = ClassNone;
75e5731b
JB
1988 if (x.bitfield.instance != y.bitfield.instance)
1989 x.bitfield.instance = InstanceNone;
bab6aec1 1990
c6fb90c8
L
1991 switch (ARRAY_SIZE (x.array))
1992 {
1993 case 3:
1994 x.array [2] &= y.array [2];
1a0670f3 1995 /* Fall through. */
c6fb90c8
L
1996 case 2:
1997 x.array [1] &= y.array [1];
1a0670f3 1998 /* Fall through. */
c6fb90c8
L
1999 case 1:
2000 x.array [0] &= y.array [0];
2001 break;
2002 default:
2003 abort ();
2004 }
2005 return x;
40fb9820
L
2006}
2007
73053c1f
JB
2008static INLINE i386_operand_type
2009operand_type_and_not (i386_operand_type x, i386_operand_type y)
2010{
bab6aec1 2011 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2012 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2013
73053c1f
JB
2014 switch (ARRAY_SIZE (x.array))
2015 {
2016 case 3:
2017 x.array [2] &= ~y.array [2];
2018 /* Fall through. */
2019 case 2:
2020 x.array [1] &= ~y.array [1];
2021 /* Fall through. */
2022 case 1:
2023 x.array [0] &= ~y.array [0];
2024 break;
2025 default:
2026 abort ();
2027 }
2028 return x;
2029}
2030
c6fb90c8
L
2031static INLINE i386_operand_type
2032operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2033{
bab6aec1
JB
2034 gas_assert (x.bitfield.class == ClassNone ||
2035 y.bitfield.class == ClassNone ||
2036 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2037 gas_assert (x.bitfield.instance == InstanceNone ||
2038 y.bitfield.instance == InstanceNone ||
2039 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2040
c6fb90c8 2041 switch (ARRAY_SIZE (x.array))
40fb9820 2042 {
c6fb90c8
L
2043 case 3:
2044 x.array [2] |= y.array [2];
1a0670f3 2045 /* Fall through. */
c6fb90c8
L
2046 case 2:
2047 x.array [1] |= y.array [1];
1a0670f3 2048 /* Fall through. */
c6fb90c8
L
2049 case 1:
2050 x.array [0] |= y.array [0];
40fb9820
L
2051 break;
2052 default:
2053 abort ();
2054 }
c6fb90c8
L
2055 return x;
2056}
40fb9820 2057
c6fb90c8
L
2058static INLINE i386_operand_type
2059operand_type_xor (i386_operand_type x, i386_operand_type y)
2060{
bab6aec1 2061 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2062 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2063
c6fb90c8
L
2064 switch (ARRAY_SIZE (x.array))
2065 {
2066 case 3:
2067 x.array [2] ^= y.array [2];
1a0670f3 2068 /* Fall through. */
c6fb90c8
L
2069 case 2:
2070 x.array [1] ^= y.array [1];
1a0670f3 2071 /* Fall through. */
c6fb90c8
L
2072 case 1:
2073 x.array [0] ^= y.array [0];
2074 break;
2075 default:
2076 abort ();
2077 }
40fb9820
L
2078 return x;
2079}
2080
40fb9820
L
2081static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2082static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2083static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2084static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2085static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2086static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2087static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2088static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2089static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2090static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2091static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2092static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2093static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2094static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2095static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2096static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2097static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2098
2099enum operand_type
2100{
2101 reg,
40fb9820
L
2102 imm,
2103 disp,
2104 anymem
2105};
2106
c6fb90c8 2107static INLINE int
40fb9820
L
2108operand_type_check (i386_operand_type t, enum operand_type c)
2109{
2110 switch (c)
2111 {
2112 case reg:
bab6aec1 2113 return t.bitfield.class == Reg;
40fb9820 2114
40fb9820
L
2115 case imm:
2116 return (t.bitfield.imm8
2117 || t.bitfield.imm8s
2118 || t.bitfield.imm16
2119 || t.bitfield.imm32
2120 || t.bitfield.imm32s
2121 || t.bitfield.imm64);
2122
2123 case disp:
2124 return (t.bitfield.disp8
2125 || t.bitfield.disp16
2126 || t.bitfield.disp32
2127 || t.bitfield.disp32s
2128 || t.bitfield.disp64);
2129
2130 case anymem:
2131 return (t.bitfield.disp8
2132 || t.bitfield.disp16
2133 || t.bitfield.disp32
2134 || t.bitfield.disp32s
2135 || t.bitfield.disp64
2136 || t.bitfield.baseindex);
2137
2138 default:
2139 abort ();
2140 }
2cfe26b6
AM
2141
2142 return 0;
40fb9820
L
2143}
2144
7a54636a
L
2145/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2146 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2147
2148static INLINE int
7a54636a
L
2149match_operand_size (const insn_template *t, unsigned int wanted,
2150 unsigned int given)
5c07affc 2151{
3ac21baa
JB
2152 return !((i.types[given].bitfield.byte
2153 && !t->operand_types[wanted].bitfield.byte)
2154 || (i.types[given].bitfield.word
2155 && !t->operand_types[wanted].bitfield.word)
2156 || (i.types[given].bitfield.dword
2157 && !t->operand_types[wanted].bitfield.dword)
2158 || (i.types[given].bitfield.qword
2159 && !t->operand_types[wanted].bitfield.qword)
2160 || (i.types[given].bitfield.tbyte
2161 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2162}
2163
dd40ce22
L
2164/* Return 1 if there is no conflict in SIMD register between operand
2165 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2166
2167static INLINE int
dd40ce22
L
2168match_simd_size (const insn_template *t, unsigned int wanted,
2169 unsigned int given)
1b54b8d7 2170{
3ac21baa
JB
2171 return !((i.types[given].bitfield.xmmword
2172 && !t->operand_types[wanted].bitfield.xmmword)
2173 || (i.types[given].bitfield.ymmword
2174 && !t->operand_types[wanted].bitfield.ymmword)
2175 || (i.types[given].bitfield.zmmword
260cd341
LC
2176 && !t->operand_types[wanted].bitfield.zmmword)
2177 || (i.types[given].bitfield.tmmword
2178 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2179}
2180
7a54636a
L
2181/* Return 1 if there is no conflict in any size between operand GIVEN
2182 and opeand WANTED for instruction template T. */
5c07affc
L
2183
2184static INLINE int
dd40ce22
L
2185match_mem_size (const insn_template *t, unsigned int wanted,
2186 unsigned int given)
5c07affc 2187{
7a54636a 2188 return (match_operand_size (t, wanted, given)
3ac21baa 2189 && !((i.types[given].bitfield.unspecified
af508cb9 2190 && !i.broadcast
3ac21baa
JB
2191 && !t->operand_types[wanted].bitfield.unspecified)
2192 || (i.types[given].bitfield.fword
2193 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2194 /* For scalar opcode templates to allow register and memory
2195 operands at the same time, some special casing is needed
d6793fa1
JB
2196 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2197 down-conversion vpmov*. */
3528c362 2198 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2199 && t->operand_types[wanted].bitfield.byte
2200 + t->operand_types[wanted].bitfield.word
2201 + t->operand_types[wanted].bitfield.dword
2202 + t->operand_types[wanted].bitfield.qword
2203 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2204 ? (i.types[given].bitfield.xmmword
2205 || i.types[given].bitfield.ymmword
2206 || i.types[given].bitfield.zmmword)
2207 : !match_simd_size(t, wanted, given))));
5c07affc
L
2208}
2209
3ac21baa
JB
2210/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2211 operands for instruction template T, and it has MATCH_REVERSE set if there
2212 is no size conflict on any operands for the template with operands reversed
2213 (and the template allows for reversing in the first place). */
5c07affc 2214
3ac21baa
JB
2215#define MATCH_STRAIGHT 1
2216#define MATCH_REVERSE 2
2217
2218static INLINE unsigned int
d3ce72d0 2219operand_size_match (const insn_template *t)
5c07affc 2220{
3ac21baa 2221 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2222
0cfa3eb3 2223 /* Don't check non-absolute jump instructions. */
5c07affc 2224 if (t->opcode_modifier.jump
0cfa3eb3 2225 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2226 return match;
2227
2228 /* Check memory and accumulator operand size. */
2229 for (j = 0; j < i.operands; j++)
2230 {
3528c362
JB
2231 if (i.types[j].bitfield.class != Reg
2232 && i.types[j].bitfield.class != RegSIMD
601e8564 2233 && t->opcode_modifier.anysize)
5c07affc
L
2234 continue;
2235
bab6aec1 2236 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2237 && !match_operand_size (t, j, j))
5c07affc
L
2238 {
2239 match = 0;
2240 break;
2241 }
2242
3528c362 2243 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2244 && !match_simd_size (t, j, j))
1b54b8d7
JB
2245 {
2246 match = 0;
2247 break;
2248 }
2249
75e5731b 2250 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2251 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2252 {
2253 match = 0;
2254 break;
2255 }
2256
c48dadc9 2257 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2258 {
2259 match = 0;
2260 break;
2261 }
2262 }
2263
3ac21baa 2264 if (!t->opcode_modifier.d)
891edac4 2265 {
dc1e8a47 2266 mismatch:
3ac21baa
JB
2267 if (!match)
2268 i.error = operand_size_mismatch;
2269 return match;
891edac4 2270 }
5c07affc
L
2271
2272 /* Check reverse. */
f5eb1d70 2273 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2274
f5eb1d70 2275 for (j = 0; j < i.operands; j++)
5c07affc 2276 {
f5eb1d70
JB
2277 unsigned int given = i.operands - j - 1;
2278
bab6aec1 2279 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2280 && !match_operand_size (t, j, given))
891edac4 2281 goto mismatch;
5c07affc 2282
3528c362 2283 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2284 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2285 goto mismatch;
2286
75e5731b 2287 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2288 && (!match_operand_size (t, j, given)
2289 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2290 goto mismatch;
2291
f5eb1d70 2292 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2293 goto mismatch;
5c07affc
L
2294 }
2295
3ac21baa 2296 return match | MATCH_REVERSE;
5c07affc
L
2297}
2298
c6fb90c8 2299static INLINE int
40fb9820
L
2300operand_type_match (i386_operand_type overlap,
2301 i386_operand_type given)
2302{
2303 i386_operand_type temp = overlap;
2304
7d5e4556 2305 temp.bitfield.unspecified = 0;
5c07affc
L
2306 temp.bitfield.byte = 0;
2307 temp.bitfield.word = 0;
2308 temp.bitfield.dword = 0;
2309 temp.bitfield.fword = 0;
2310 temp.bitfield.qword = 0;
2311 temp.bitfield.tbyte = 0;
2312 temp.bitfield.xmmword = 0;
c0f3af97 2313 temp.bitfield.ymmword = 0;
43234a1e 2314 temp.bitfield.zmmword = 0;
260cd341 2315 temp.bitfield.tmmword = 0;
0dfbf9d7 2316 if (operand_type_all_zero (&temp))
891edac4 2317 goto mismatch;
40fb9820 2318
6f2f06be 2319 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2320 return 1;
2321
dc1e8a47 2322 mismatch:
a65babc9 2323 i.error = operand_type_mismatch;
891edac4 2324 return 0;
40fb9820
L
2325}
2326
7d5e4556 2327/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2328 unless the expected operand type register overlap is null.
5de4d9ef 2329 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2330
c6fb90c8 2331static INLINE int
dc821c5f 2332operand_type_register_match (i386_operand_type g0,
40fb9820 2333 i386_operand_type t0,
40fb9820
L
2334 i386_operand_type g1,
2335 i386_operand_type t1)
2336{
bab6aec1 2337 if (g0.bitfield.class != Reg
3528c362 2338 && g0.bitfield.class != RegSIMD
10c17abd
JB
2339 && (!operand_type_check (g0, anymem)
2340 || g0.bitfield.unspecified
5de4d9ef
JB
2341 || (t0.bitfield.class != Reg
2342 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2343 return 1;
2344
bab6aec1 2345 if (g1.bitfield.class != Reg
3528c362 2346 && g1.bitfield.class != RegSIMD
10c17abd
JB
2347 && (!operand_type_check (g1, anymem)
2348 || g1.bitfield.unspecified
5de4d9ef
JB
2349 || (t1.bitfield.class != Reg
2350 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2351 return 1;
2352
dc821c5f
JB
2353 if (g0.bitfield.byte == g1.bitfield.byte
2354 && g0.bitfield.word == g1.bitfield.word
2355 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2356 && g0.bitfield.qword == g1.bitfield.qword
2357 && g0.bitfield.xmmword == g1.bitfield.xmmword
2358 && g0.bitfield.ymmword == g1.bitfield.ymmword
2359 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2360 return 1;
2361
dc821c5f
JB
2362 if (!(t0.bitfield.byte & t1.bitfield.byte)
2363 && !(t0.bitfield.word & t1.bitfield.word)
2364 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2365 && !(t0.bitfield.qword & t1.bitfield.qword)
2366 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2367 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2368 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2369 return 1;
2370
a65babc9 2371 i.error = register_type_mismatch;
891edac4
L
2372
2373 return 0;
40fb9820
L
2374}
2375
4c692bc7
JB
2376static INLINE unsigned int
2377register_number (const reg_entry *r)
2378{
2379 unsigned int nr = r->reg_num;
2380
2381 if (r->reg_flags & RegRex)
2382 nr += 8;
2383
200cbe0f
L
2384 if (r->reg_flags & RegVRex)
2385 nr += 16;
2386
4c692bc7
JB
2387 return nr;
2388}
2389
252b5132 2390static INLINE unsigned int
40fb9820 2391mode_from_disp_size (i386_operand_type t)
252b5132 2392{
b5014f7a 2393 if (t.bitfield.disp8)
40fb9820
L
2394 return 1;
2395 else if (t.bitfield.disp16
2396 || t.bitfield.disp32
2397 || t.bitfield.disp32s)
2398 return 2;
2399 else
2400 return 0;
252b5132
RH
2401}
2402
2403static INLINE int
65879393 2404fits_in_signed_byte (addressT num)
252b5132 2405{
65879393 2406 return num + 0x80 <= 0xff;
47926f60 2407}
252b5132
RH
2408
2409static INLINE int
65879393 2410fits_in_unsigned_byte (addressT num)
252b5132 2411{
65879393 2412 return num <= 0xff;
47926f60 2413}
252b5132
RH
2414
2415static INLINE int
65879393 2416fits_in_unsigned_word (addressT num)
252b5132 2417{
65879393 2418 return num <= 0xffff;
47926f60 2419}
252b5132
RH
2420
2421static INLINE int
65879393 2422fits_in_signed_word (addressT num)
252b5132 2423{
65879393 2424 return num + 0x8000 <= 0xffff;
47926f60 2425}
2a962e6d 2426
3e73aa7c 2427static INLINE int
65879393 2428fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2429{
2430#ifndef BFD64
2431 return 1;
2432#else
65879393 2433 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2434#endif
2435} /* fits_in_signed_long() */
2a962e6d 2436
3e73aa7c 2437static INLINE int
65879393 2438fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2439{
2440#ifndef BFD64
2441 return 1;
2442#else
65879393 2443 return num <= 0xffffffff;
3e73aa7c
JH
2444#endif
2445} /* fits_in_unsigned_long() */
252b5132 2446
43234a1e 2447static INLINE int
b5014f7a 2448fits_in_disp8 (offsetT num)
43234a1e
L
2449{
2450 int shift = i.memshift;
2451 unsigned int mask;
2452
2453 if (shift == -1)
2454 abort ();
2455
2456 mask = (1 << shift) - 1;
2457
2458 /* Return 0 if NUM isn't properly aligned. */
2459 if ((num & mask))
2460 return 0;
2461
2462 /* Check if NUM will fit in 8bit after shift. */
2463 return fits_in_signed_byte (num >> shift);
2464}
2465
a683cc34
SP
2466static INLINE int
2467fits_in_imm4 (offsetT num)
2468{
2469 return (num & 0xf) == num;
2470}
2471
40fb9820 2472static i386_operand_type
e3bb37b5 2473smallest_imm_type (offsetT num)
252b5132 2474{
40fb9820 2475 i386_operand_type t;
7ab9ffdd 2476
0dfbf9d7 2477 operand_type_set (&t, 0);
40fb9820
L
2478 t.bitfield.imm64 = 1;
2479
2480 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2481 {
2482 /* This code is disabled on the 486 because all the Imm1 forms
2483 in the opcode table are slower on the i486. They're the
2484 versions with the implicitly specified single-position
2485 displacement, which has another syntax if you really want to
2486 use that form. */
40fb9820
L
2487 t.bitfield.imm1 = 1;
2488 t.bitfield.imm8 = 1;
2489 t.bitfield.imm8s = 1;
2490 t.bitfield.imm16 = 1;
2491 t.bitfield.imm32 = 1;
2492 t.bitfield.imm32s = 1;
2493 }
2494 else if (fits_in_signed_byte (num))
2495 {
2496 t.bitfield.imm8 = 1;
2497 t.bitfield.imm8s = 1;
2498 t.bitfield.imm16 = 1;
2499 t.bitfield.imm32 = 1;
2500 t.bitfield.imm32s = 1;
2501 }
2502 else if (fits_in_unsigned_byte (num))
2503 {
2504 t.bitfield.imm8 = 1;
2505 t.bitfield.imm16 = 1;
2506 t.bitfield.imm32 = 1;
2507 t.bitfield.imm32s = 1;
2508 }
2509 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2510 {
2511 t.bitfield.imm16 = 1;
2512 t.bitfield.imm32 = 1;
2513 t.bitfield.imm32s = 1;
2514 }
2515 else if (fits_in_signed_long (num))
2516 {
2517 t.bitfield.imm32 = 1;
2518 t.bitfield.imm32s = 1;
2519 }
2520 else if (fits_in_unsigned_long (num))
2521 t.bitfield.imm32 = 1;
2522
2523 return t;
47926f60 2524}
252b5132 2525
847f7ad4 2526static offsetT
e3bb37b5 2527offset_in_range (offsetT val, int size)
847f7ad4 2528{
508866be 2529 addressT mask;
ba2adb93 2530
847f7ad4
AM
2531 switch (size)
2532 {
508866be
L
2533 case 1: mask = ((addressT) 1 << 8) - 1; break;
2534 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2535 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2536#ifdef BFD64
2537 case 8: mask = ((addressT) 2 << 63) - 1; break;
2538#endif
47926f60 2539 default: abort ();
847f7ad4
AM
2540 }
2541
9de868bf
L
2542#ifdef BFD64
2543 /* If BFD64, sign extend val for 32bit address mode. */
2544 if (flag_code != CODE_64BIT
2545 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2546 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2547 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2548#endif
ba2adb93 2549
47926f60 2550 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2551 {
2552 char buf1[40], buf2[40];
2553
2554 sprint_value (buf1, val);
2555 sprint_value (buf2, val & mask);
2556 as_warn (_("%s shortened to %s"), buf1, buf2);
2557 }
2558 return val & mask;
2559}
2560
c32fa91d
L
2561enum PREFIX_GROUP
2562{
2563 PREFIX_EXIST = 0,
2564 PREFIX_LOCK,
2565 PREFIX_REP,
04ef582a 2566 PREFIX_DS,
c32fa91d
L
2567 PREFIX_OTHER
2568};
2569
2570/* Returns
2571 a. PREFIX_EXIST if attempting to add a prefix where one from the
2572 same class already exists.
2573 b. PREFIX_LOCK if lock prefix is added.
2574 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2575 d. PREFIX_DS if ds prefix is added.
2576 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2577 */
2578
2579static enum PREFIX_GROUP
e3bb37b5 2580add_prefix (unsigned int prefix)
252b5132 2581{
c32fa91d 2582 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2583 unsigned int q;
252b5132 2584
29b0f896
AM
2585 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2586 && flag_code == CODE_64BIT)
b1905489 2587 {
161a04f6 2588 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2589 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2590 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2591 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2592 ret = PREFIX_EXIST;
b1905489
JB
2593 q = REX_PREFIX;
2594 }
3e73aa7c 2595 else
b1905489
JB
2596 {
2597 switch (prefix)
2598 {
2599 default:
2600 abort ();
2601
b1905489 2602 case DS_PREFIX_OPCODE:
04ef582a
L
2603 ret = PREFIX_DS;
2604 /* Fall through. */
2605 case CS_PREFIX_OPCODE:
b1905489
JB
2606 case ES_PREFIX_OPCODE:
2607 case FS_PREFIX_OPCODE:
2608 case GS_PREFIX_OPCODE:
2609 case SS_PREFIX_OPCODE:
2610 q = SEG_PREFIX;
2611 break;
2612
2613 case REPNE_PREFIX_OPCODE:
2614 case REPE_PREFIX_OPCODE:
c32fa91d
L
2615 q = REP_PREFIX;
2616 ret = PREFIX_REP;
2617 break;
2618
b1905489 2619 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2620 q = LOCK_PREFIX;
2621 ret = PREFIX_LOCK;
b1905489
JB
2622 break;
2623
2624 case FWAIT_OPCODE:
2625 q = WAIT_PREFIX;
2626 break;
2627
2628 case ADDR_PREFIX_OPCODE:
2629 q = ADDR_PREFIX;
2630 break;
2631
2632 case DATA_PREFIX_OPCODE:
2633 q = DATA_PREFIX;
2634 break;
2635 }
2636 if (i.prefix[q] != 0)
c32fa91d 2637 ret = PREFIX_EXIST;
b1905489 2638 }
252b5132 2639
b1905489 2640 if (ret)
252b5132 2641 {
b1905489
JB
2642 if (!i.prefix[q])
2643 ++i.prefixes;
2644 i.prefix[q] |= prefix;
252b5132 2645 }
b1905489
JB
2646 else
2647 as_bad (_("same type of prefix used twice"));
252b5132 2648
252b5132
RH
2649 return ret;
2650}
2651
2652static void
78f12dd3 2653update_code_flag (int value, int check)
eecb386c 2654{
78f12dd3
L
2655 PRINTF_LIKE ((*as_error));
2656
1e9cc1c2 2657 flag_code = (enum flag_code) value;
40fb9820
L
2658 if (flag_code == CODE_64BIT)
2659 {
2660 cpu_arch_flags.bitfield.cpu64 = 1;
2661 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2662 }
2663 else
2664 {
2665 cpu_arch_flags.bitfield.cpu64 = 0;
2666 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2667 }
2668 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2669 {
78f12dd3
L
2670 if (check)
2671 as_error = as_fatal;
2672 else
2673 as_error = as_bad;
2674 (*as_error) (_("64bit mode not supported on `%s'."),
2675 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2676 }
40fb9820 2677 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2678 {
78f12dd3
L
2679 if (check)
2680 as_error = as_fatal;
2681 else
2682 as_error = as_bad;
2683 (*as_error) (_("32bit mode not supported on `%s'."),
2684 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2685 }
eecb386c
AM
2686 stackop_size = '\0';
2687}
2688
78f12dd3
L
2689static void
2690set_code_flag (int value)
2691{
2692 update_code_flag (value, 0);
2693}
2694
eecb386c 2695static void
e3bb37b5 2696set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2697{
1e9cc1c2 2698 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2699 if (flag_code != CODE_16BIT)
2700 abort ();
2701 cpu_arch_flags.bitfield.cpu64 = 0;
2702 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2703 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2704}
2705
2706static void
e3bb37b5 2707set_intel_syntax (int syntax_flag)
252b5132
RH
2708{
2709 /* Find out if register prefixing is specified. */
2710 int ask_naked_reg = 0;
2711
2712 SKIP_WHITESPACE ();
29b0f896 2713 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2714 {
d02603dc
NC
2715 char *string;
2716 int e = get_symbol_name (&string);
252b5132 2717
47926f60 2718 if (strcmp (string, "prefix") == 0)
252b5132 2719 ask_naked_reg = 1;
47926f60 2720 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2721 ask_naked_reg = -1;
2722 else
d0b47220 2723 as_bad (_("bad argument to syntax directive."));
d02603dc 2724 (void) restore_line_pointer (e);
252b5132
RH
2725 }
2726 demand_empty_rest_of_line ();
c3332e24 2727
252b5132
RH
2728 intel_syntax = syntax_flag;
2729
2730 if (ask_naked_reg == 0)
f86103b7
AM
2731 allow_naked_reg = (intel_syntax
2732 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2733 else
2734 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2735
ee86248c 2736 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2737
e4a3b5a4 2738 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2739 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2740 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2741}
2742
1efbbeb4
L
2743static void
2744set_intel_mnemonic (int mnemonic_flag)
2745{
e1d4d893 2746 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2747}
2748
db51cc60
L
2749static void
2750set_allow_index_reg (int flag)
2751{
2752 allow_index_reg = flag;
2753}
2754
cb19c032 2755static void
7bab8ab5 2756set_check (int what)
cb19c032 2757{
7bab8ab5
JB
2758 enum check_kind *kind;
2759 const char *str;
2760
2761 if (what)
2762 {
2763 kind = &operand_check;
2764 str = "operand";
2765 }
2766 else
2767 {
2768 kind = &sse_check;
2769 str = "sse";
2770 }
2771
cb19c032
L
2772 SKIP_WHITESPACE ();
2773
2774 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2775 {
d02603dc
NC
2776 char *string;
2777 int e = get_symbol_name (&string);
cb19c032
L
2778
2779 if (strcmp (string, "none") == 0)
7bab8ab5 2780 *kind = check_none;
cb19c032 2781 else if (strcmp (string, "warning") == 0)
7bab8ab5 2782 *kind = check_warning;
cb19c032 2783 else if (strcmp (string, "error") == 0)
7bab8ab5 2784 *kind = check_error;
cb19c032 2785 else
7bab8ab5 2786 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2787 (void) restore_line_pointer (e);
cb19c032
L
2788 }
2789 else
7bab8ab5 2790 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2791
2792 demand_empty_rest_of_line ();
2793}
2794
8a9036a4
L
2795static void
2796check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2797 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2798{
2799#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2800 static const char *arch;
2801
2802 /* Intel LIOM is only supported on ELF. */
2803 if (!IS_ELF)
2804 return;
2805
2806 if (!arch)
2807 {
2808 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2809 use default_arch. */
2810 arch = cpu_arch_name;
2811 if (!arch)
2812 arch = default_arch;
2813 }
2814
81486035
L
2815 /* If we are targeting Intel MCU, we must enable it. */
2816 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2817 || new_flag.bitfield.cpuiamcu)
2818 return;
2819
3632d14b 2820 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2821 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2822 || new_flag.bitfield.cpul1om)
8a9036a4 2823 return;
76ba9986 2824
7a9068fe
L
2825 /* If we are targeting Intel K1OM, we must enable it. */
2826 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2827 || new_flag.bitfield.cpuk1om)
2828 return;
2829
8a9036a4
L
2830 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2831#endif
2832}
2833
e413e4e9 2834static void
e3bb37b5 2835set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2836{
47926f60 2837 SKIP_WHITESPACE ();
e413e4e9 2838
29b0f896 2839 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2840 {
d02603dc
NC
2841 char *string;
2842 int e = get_symbol_name (&string);
91d6fa6a 2843 unsigned int j;
40fb9820 2844 i386_cpu_flags flags;
e413e4e9 2845
91d6fa6a 2846 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2847 {
91d6fa6a 2848 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2849 {
91d6fa6a 2850 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2851
5c6af06e
JB
2852 if (*string != '.')
2853 {
91d6fa6a 2854 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2855 cpu_sub_arch_name = NULL;
91d6fa6a 2856 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2857 if (flag_code == CODE_64BIT)
2858 {
2859 cpu_arch_flags.bitfield.cpu64 = 1;
2860 cpu_arch_flags.bitfield.cpuno64 = 0;
2861 }
2862 else
2863 {
2864 cpu_arch_flags.bitfield.cpu64 = 0;
2865 cpu_arch_flags.bitfield.cpuno64 = 1;
2866 }
91d6fa6a
NC
2867 cpu_arch_isa = cpu_arch[j].type;
2868 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2869 if (!cpu_arch_tune_set)
2870 {
2871 cpu_arch_tune = cpu_arch_isa;
2872 cpu_arch_tune_flags = cpu_arch_isa_flags;
2873 }
5c6af06e
JB
2874 break;
2875 }
40fb9820 2876
293f5f65
L
2877 flags = cpu_flags_or (cpu_arch_flags,
2878 cpu_arch[j].flags);
81486035 2879
5b64d091 2880 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2881 {
6305a203
L
2882 if (cpu_sub_arch_name)
2883 {
2884 char *name = cpu_sub_arch_name;
2885 cpu_sub_arch_name = concat (name,
91d6fa6a 2886 cpu_arch[j].name,
1bf57e9f 2887 (const char *) NULL);
6305a203
L
2888 free (name);
2889 }
2890 else
91d6fa6a 2891 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2892 cpu_arch_flags = flags;
a586129e 2893 cpu_arch_isa_flags = flags;
5c6af06e 2894 }
0089dace
L
2895 else
2896 cpu_arch_isa_flags
2897 = cpu_flags_or (cpu_arch_isa_flags,
2898 cpu_arch[j].flags);
d02603dc 2899 (void) restore_line_pointer (e);
5c6af06e
JB
2900 demand_empty_rest_of_line ();
2901 return;
e413e4e9
AM
2902 }
2903 }
293f5f65
L
2904
2905 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2906 {
33eaf5de 2907 /* Disable an ISA extension. */
293f5f65
L
2908 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2909 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2910 {
2911 flags = cpu_flags_and_not (cpu_arch_flags,
2912 cpu_noarch[j].flags);
2913 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2914 {
2915 if (cpu_sub_arch_name)
2916 {
2917 char *name = cpu_sub_arch_name;
2918 cpu_sub_arch_name = concat (name, string,
2919 (const char *) NULL);
2920 free (name);
2921 }
2922 else
2923 cpu_sub_arch_name = xstrdup (string);
2924 cpu_arch_flags = flags;
2925 cpu_arch_isa_flags = flags;
2926 }
2927 (void) restore_line_pointer (e);
2928 demand_empty_rest_of_line ();
2929 return;
2930 }
2931
2932 j = ARRAY_SIZE (cpu_arch);
2933 }
2934
91d6fa6a 2935 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2936 as_bad (_("no such architecture: `%s'"), string);
2937
2938 *input_line_pointer = e;
2939 }
2940 else
2941 as_bad (_("missing cpu architecture"));
2942
fddf5b5b
AM
2943 no_cond_jump_promotion = 0;
2944 if (*input_line_pointer == ','
29b0f896 2945 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2946 {
d02603dc
NC
2947 char *string;
2948 char e;
2949
2950 ++input_line_pointer;
2951 e = get_symbol_name (&string);
fddf5b5b
AM
2952
2953 if (strcmp (string, "nojumps") == 0)
2954 no_cond_jump_promotion = 1;
2955 else if (strcmp (string, "jumps") == 0)
2956 ;
2957 else
2958 as_bad (_("no such architecture modifier: `%s'"), string);
2959
d02603dc 2960 (void) restore_line_pointer (e);
fddf5b5b
AM
2961 }
2962
e413e4e9
AM
2963 demand_empty_rest_of_line ();
2964}
2965
8a9036a4
L
2966enum bfd_architecture
2967i386_arch (void)
2968{
3632d14b 2969 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2970 {
2971 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2972 || flag_code != CODE_64BIT)
2973 as_fatal (_("Intel L1OM is 64bit ELF only"));
2974 return bfd_arch_l1om;
2975 }
7a9068fe
L
2976 else if (cpu_arch_isa == PROCESSOR_K1OM)
2977 {
2978 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2979 || flag_code != CODE_64BIT)
2980 as_fatal (_("Intel K1OM is 64bit ELF only"));
2981 return bfd_arch_k1om;
2982 }
81486035
L
2983 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2984 {
2985 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2986 || flag_code == CODE_64BIT)
2987 as_fatal (_("Intel MCU is 32bit ELF only"));
2988 return bfd_arch_iamcu;
2989 }
8a9036a4
L
2990 else
2991 return bfd_arch_i386;
2992}
2993
b9d79e03 2994unsigned long
7016a5d5 2995i386_mach (void)
b9d79e03 2996{
351f65ca 2997 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2998 {
3632d14b 2999 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 3000 {
351f65ca
L
3001 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3002 || default_arch[6] != '\0')
8a9036a4
L
3003 as_fatal (_("Intel L1OM is 64bit ELF only"));
3004 return bfd_mach_l1om;
3005 }
7a9068fe
L
3006 else if (cpu_arch_isa == PROCESSOR_K1OM)
3007 {
3008 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3009 || default_arch[6] != '\0')
3010 as_fatal (_("Intel K1OM is 64bit ELF only"));
3011 return bfd_mach_k1om;
3012 }
351f65ca 3013 else if (default_arch[6] == '\0')
8a9036a4 3014 return bfd_mach_x86_64;
351f65ca
L
3015 else
3016 return bfd_mach_x64_32;
8a9036a4 3017 }
5197d474
L
3018 else if (!strcmp (default_arch, "i386")
3019 || !strcmp (default_arch, "iamcu"))
81486035
L
3020 {
3021 if (cpu_arch_isa == PROCESSOR_IAMCU)
3022 {
3023 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3024 as_fatal (_("Intel MCU is 32bit ELF only"));
3025 return bfd_mach_i386_iamcu;
3026 }
3027 else
3028 return bfd_mach_i386_i386;
3029 }
b9d79e03 3030 else
2b5d6a91 3031 as_fatal (_("unknown architecture"));
b9d79e03 3032}
b9d79e03 3033\f
252b5132 3034void
7016a5d5 3035md_begin (void)
252b5132
RH
3036{
3037 const char *hash_err;
3038
86fa6981
L
3039 /* Support pseudo prefixes like {disp32}. */
3040 lex_type ['{'] = LEX_BEGIN_NAME;
3041
47926f60 3042 /* Initialize op_hash hash table. */
252b5132
RH
3043 op_hash = hash_new ();
3044
3045 {
d3ce72d0 3046 const insn_template *optab;
29b0f896 3047 templates *core_optab;
252b5132 3048
47926f60
KH
3049 /* Setup for loop. */
3050 optab = i386_optab;
add39d23 3051 core_optab = XNEW (templates);
252b5132
RH
3052 core_optab->start = optab;
3053
3054 while (1)
3055 {
3056 ++optab;
3057 if (optab->name == NULL
3058 || strcmp (optab->name, (optab - 1)->name) != 0)
3059 {
3060 /* different name --> ship out current template list;
47926f60 3061 add to hash table; & begin anew. */
252b5132
RH
3062 core_optab->end = optab;
3063 hash_err = hash_insert (op_hash,
3064 (optab - 1)->name,
5a49b8ac 3065 (void *) core_optab);
252b5132
RH
3066 if (hash_err)
3067 {
b37df7c4 3068 as_fatal (_("can't hash %s: %s"),
252b5132
RH
3069 (optab - 1)->name,
3070 hash_err);
3071 }
3072 if (optab->name == NULL)
3073 break;
add39d23 3074 core_optab = XNEW (templates);
252b5132
RH
3075 core_optab->start = optab;
3076 }
3077 }
3078 }
3079
47926f60 3080 /* Initialize reg_hash hash table. */
252b5132
RH
3081 reg_hash = hash_new ();
3082 {
29b0f896 3083 const reg_entry *regtab;
c3fe08fa 3084 unsigned int regtab_size = i386_regtab_size;
252b5132 3085
c3fe08fa 3086 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 3087 {
5a49b8ac 3088 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 3089 if (hash_err)
b37df7c4 3090 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
3091 regtab->reg_name,
3092 hash_err);
252b5132
RH
3093 }
3094 }
3095
47926f60 3096 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3097 {
29b0f896
AM
3098 int c;
3099 char *p;
252b5132
RH
3100
3101 for (c = 0; c < 256; c++)
3102 {
3882b010 3103 if (ISDIGIT (c))
252b5132
RH
3104 {
3105 digit_chars[c] = c;
3106 mnemonic_chars[c] = c;
3107 register_chars[c] = c;
3108 operand_chars[c] = c;
3109 }
3882b010 3110 else if (ISLOWER (c))
252b5132
RH
3111 {
3112 mnemonic_chars[c] = c;
3113 register_chars[c] = c;
3114 operand_chars[c] = c;
3115 }
3882b010 3116 else if (ISUPPER (c))
252b5132 3117 {
3882b010 3118 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3119 register_chars[c] = mnemonic_chars[c];
3120 operand_chars[c] = c;
3121 }
43234a1e 3122 else if (c == '{' || c == '}')
86fa6981
L
3123 {
3124 mnemonic_chars[c] = c;
3125 operand_chars[c] = c;
3126 }
252b5132 3127
3882b010 3128 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3129 identifier_chars[c] = c;
3130 else if (c >= 128)
3131 {
3132 identifier_chars[c] = c;
3133 operand_chars[c] = c;
3134 }
3135 }
3136
3137#ifdef LEX_AT
3138 identifier_chars['@'] = '@';
32137342
NC
3139#endif
3140#ifdef LEX_QM
3141 identifier_chars['?'] = '?';
3142 operand_chars['?'] = '?';
252b5132 3143#endif
252b5132 3144 digit_chars['-'] = '-';
c0f3af97 3145 mnemonic_chars['_'] = '_';
791fe849 3146 mnemonic_chars['-'] = '-';
0003779b 3147 mnemonic_chars['.'] = '.';
252b5132
RH
3148 identifier_chars['_'] = '_';
3149 identifier_chars['.'] = '.';
3150
3151 for (p = operand_special_chars; *p != '\0'; p++)
3152 operand_chars[(unsigned char) *p] = *p;
3153 }
3154
a4447b93
RH
3155 if (flag_code == CODE_64BIT)
3156 {
ca19b261
KT
3157#if defined (OBJ_COFF) && defined (TE_PE)
3158 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3159 ? 32 : 16);
3160#else
a4447b93 3161 x86_dwarf2_return_column = 16;
ca19b261 3162#endif
61ff971f 3163 x86_cie_data_alignment = -8;
a4447b93
RH
3164 }
3165 else
3166 {
3167 x86_dwarf2_return_column = 8;
3168 x86_cie_data_alignment = -4;
3169 }
e379e5f3
L
3170
3171 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3172 can be turned into BRANCH_PREFIX frag. */
3173 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3174 abort ();
252b5132
RH
3175}
3176
3177void
e3bb37b5 3178i386_print_statistics (FILE *file)
252b5132
RH
3179{
3180 hash_print_statistics (file, "i386 opcode", op_hash);
3181 hash_print_statistics (file, "i386 register", reg_hash);
3182}
3183\f
252b5132
RH
3184#ifdef DEBUG386
3185
ce8a8b2f 3186/* Debugging routines for md_assemble. */
d3ce72d0 3187static void pte (insn_template *);
40fb9820 3188static void pt (i386_operand_type);
e3bb37b5
L
3189static void pe (expressionS *);
3190static void ps (symbolS *);
252b5132
RH
3191
3192static void
2c703856 3193pi (const char *line, i386_insn *x)
252b5132 3194{
09137c09 3195 unsigned int j;
252b5132
RH
3196
3197 fprintf (stdout, "%s: template ", line);
3198 pte (&x->tm);
09f131f2
JH
3199 fprintf (stdout, " address: base %s index %s scale %x\n",
3200 x->base_reg ? x->base_reg->reg_name : "none",
3201 x->index_reg ? x->index_reg->reg_name : "none",
3202 x->log2_scale_factor);
3203 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3204 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3205 fprintf (stdout, " sib: base %x index %x scale %x\n",
3206 x->sib.base, x->sib.index, x->sib.scale);
3207 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3208 (x->rex & REX_W) != 0,
3209 (x->rex & REX_R) != 0,
3210 (x->rex & REX_X) != 0,
3211 (x->rex & REX_B) != 0);
09137c09 3212 for (j = 0; j < x->operands; j++)
252b5132 3213 {
09137c09
SP
3214 fprintf (stdout, " #%d: ", j + 1);
3215 pt (x->types[j]);
252b5132 3216 fprintf (stdout, "\n");
bab6aec1 3217 if (x->types[j].bitfield.class == Reg
3528c362
JB
3218 || x->types[j].bitfield.class == RegMMX
3219 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3220 || x->types[j].bitfield.class == RegMask
00cee14f 3221 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3222 || x->types[j].bitfield.class == RegCR
3223 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3224 || x->types[j].bitfield.class == RegTR
3225 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3226 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3227 if (operand_type_check (x->types[j], imm))
3228 pe (x->op[j].imms);
3229 if (operand_type_check (x->types[j], disp))
3230 pe (x->op[j].disps);
252b5132
RH
3231 }
3232}
3233
3234static void
d3ce72d0 3235pte (insn_template *t)
252b5132 3236{
09137c09 3237 unsigned int j;
252b5132 3238 fprintf (stdout, " %d operands ", t->operands);
47926f60 3239 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3240 if (t->extension_opcode != None)
3241 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3242 if (t->opcode_modifier.d)
252b5132 3243 fprintf (stdout, "D");
40fb9820 3244 if (t->opcode_modifier.w)
252b5132
RH
3245 fprintf (stdout, "W");
3246 fprintf (stdout, "\n");
09137c09 3247 for (j = 0; j < t->operands; j++)
252b5132 3248 {
09137c09
SP
3249 fprintf (stdout, " #%d type ", j + 1);
3250 pt (t->operand_types[j]);
252b5132
RH
3251 fprintf (stdout, "\n");
3252 }
3253}
3254
3255static void
e3bb37b5 3256pe (expressionS *e)
252b5132 3257{
24eab124 3258 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3259 fprintf (stdout, " add_number %ld (%lx)\n",
3260 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3261 if (e->X_add_symbol)
3262 {
3263 fprintf (stdout, " add_symbol ");
3264 ps (e->X_add_symbol);
3265 fprintf (stdout, "\n");
3266 }
3267 if (e->X_op_symbol)
3268 {
3269 fprintf (stdout, " op_symbol ");
3270 ps (e->X_op_symbol);
3271 fprintf (stdout, "\n");
3272 }
3273}
3274
3275static void
e3bb37b5 3276ps (symbolS *s)
252b5132
RH
3277{
3278 fprintf (stdout, "%s type %s%s",
3279 S_GET_NAME (s),
3280 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3281 segment_name (S_GET_SEGMENT (s)));
3282}
3283
7b81dfbb 3284static struct type_name
252b5132 3285 {
40fb9820
L
3286 i386_operand_type mask;
3287 const char *name;
252b5132 3288 }
7b81dfbb 3289const type_names[] =
252b5132 3290{
40fb9820
L
3291 { OPERAND_TYPE_REG8, "r8" },
3292 { OPERAND_TYPE_REG16, "r16" },
3293 { OPERAND_TYPE_REG32, "r32" },
3294 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3295 { OPERAND_TYPE_ACC8, "acc8" },
3296 { OPERAND_TYPE_ACC16, "acc16" },
3297 { OPERAND_TYPE_ACC32, "acc32" },
3298 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3299 { OPERAND_TYPE_IMM8, "i8" },
3300 { OPERAND_TYPE_IMM8, "i8s" },
3301 { OPERAND_TYPE_IMM16, "i16" },
3302 { OPERAND_TYPE_IMM32, "i32" },
3303 { OPERAND_TYPE_IMM32S, "i32s" },
3304 { OPERAND_TYPE_IMM64, "i64" },
3305 { OPERAND_TYPE_IMM1, "i1" },
3306 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3307 { OPERAND_TYPE_DISP8, "d8" },
3308 { OPERAND_TYPE_DISP16, "d16" },
3309 { OPERAND_TYPE_DISP32, "d32" },
3310 { OPERAND_TYPE_DISP32S, "d32s" },
3311 { OPERAND_TYPE_DISP64, "d64" },
3312 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3313 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3314 { OPERAND_TYPE_CONTROL, "control reg" },
3315 { OPERAND_TYPE_TEST, "test reg" },
3316 { OPERAND_TYPE_DEBUG, "debug reg" },
3317 { OPERAND_TYPE_FLOATREG, "FReg" },
3318 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3319 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3320 { OPERAND_TYPE_REGMMX, "rMMX" },
3321 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3322 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3323 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3324 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3325 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3326};
3327
3328static void
40fb9820 3329pt (i386_operand_type t)
252b5132 3330{
40fb9820 3331 unsigned int j;
c6fb90c8 3332 i386_operand_type a;
252b5132 3333
40fb9820 3334 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3335 {
3336 a = operand_type_and (t, type_names[j].mask);
2c703856 3337 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3338 fprintf (stdout, "%s, ", type_names[j].name);
3339 }
252b5132
RH
3340 fflush (stdout);
3341}
3342
3343#endif /* DEBUG386 */
3344\f
252b5132 3345static bfd_reloc_code_real_type
3956db08 3346reloc (unsigned int size,
64e74474
AM
3347 int pcrel,
3348 int sign,
3349 bfd_reloc_code_real_type other)
252b5132 3350{
47926f60 3351 if (other != NO_RELOC)
3956db08 3352 {
91d6fa6a 3353 reloc_howto_type *rel;
3956db08
JB
3354
3355 if (size == 8)
3356 switch (other)
3357 {
64e74474
AM
3358 case BFD_RELOC_X86_64_GOT32:
3359 return BFD_RELOC_X86_64_GOT64;
3360 break;
553d1284
L
3361 case BFD_RELOC_X86_64_GOTPLT64:
3362 return BFD_RELOC_X86_64_GOTPLT64;
3363 break;
64e74474
AM
3364 case BFD_RELOC_X86_64_PLTOFF64:
3365 return BFD_RELOC_X86_64_PLTOFF64;
3366 break;
3367 case BFD_RELOC_X86_64_GOTPC32:
3368 other = BFD_RELOC_X86_64_GOTPC64;
3369 break;
3370 case BFD_RELOC_X86_64_GOTPCREL:
3371 other = BFD_RELOC_X86_64_GOTPCREL64;
3372 break;
3373 case BFD_RELOC_X86_64_TPOFF32:
3374 other = BFD_RELOC_X86_64_TPOFF64;
3375 break;
3376 case BFD_RELOC_X86_64_DTPOFF32:
3377 other = BFD_RELOC_X86_64_DTPOFF64;
3378 break;
3379 default:
3380 break;
3956db08 3381 }
e05278af 3382
8ce3d284 3383#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3384 if (other == BFD_RELOC_SIZE32)
3385 {
3386 if (size == 8)
1ab668bf 3387 other = BFD_RELOC_SIZE64;
8fd4256d 3388 if (pcrel)
1ab668bf
AM
3389 {
3390 as_bad (_("there are no pc-relative size relocations"));
3391 return NO_RELOC;
3392 }
8fd4256d 3393 }
8ce3d284 3394#endif
8fd4256d 3395
e05278af 3396 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3397 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3398 sign = -1;
3399
91d6fa6a
NC
3400 rel = bfd_reloc_type_lookup (stdoutput, other);
3401 if (!rel)
3956db08 3402 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3403 else if (size != bfd_get_reloc_size (rel))
3956db08 3404 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3405 bfd_get_reloc_size (rel),
3956db08 3406 size);
91d6fa6a 3407 else if (pcrel && !rel->pc_relative)
3956db08 3408 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3409 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3410 && !sign)
91d6fa6a 3411 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3412 && sign > 0))
3956db08
JB
3413 as_bad (_("relocated field and relocation type differ in signedness"));
3414 else
3415 return other;
3416 return NO_RELOC;
3417 }
252b5132
RH
3418
3419 if (pcrel)
3420 {
3e73aa7c 3421 if (!sign)
3956db08 3422 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3423 switch (size)
3424 {
3425 case 1: return BFD_RELOC_8_PCREL;
3426 case 2: return BFD_RELOC_16_PCREL;
d258b828 3427 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3428 case 8: return BFD_RELOC_64_PCREL;
252b5132 3429 }
3956db08 3430 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3431 }
3432 else
3433 {
3956db08 3434 if (sign > 0)
e5cb08ac 3435 switch (size)
3e73aa7c
JH
3436 {
3437 case 4: return BFD_RELOC_X86_64_32S;
3438 }
3439 else
3440 switch (size)
3441 {
3442 case 1: return BFD_RELOC_8;
3443 case 2: return BFD_RELOC_16;
3444 case 4: return BFD_RELOC_32;
3445 case 8: return BFD_RELOC_64;
3446 }
3956db08
JB
3447 as_bad (_("cannot do %s %u byte relocation"),
3448 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3449 }
3450
0cc9e1d3 3451 return NO_RELOC;
252b5132
RH
3452}
3453
47926f60
KH
3454/* Here we decide which fixups can be adjusted to make them relative to
3455 the beginning of the section instead of the symbol. Basically we need
3456 to make sure that the dynamic relocations are done correctly, so in
3457 some cases we force the original symbol to be used. */
3458
252b5132 3459int
e3bb37b5 3460tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3461{
6d249963 3462#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3463 if (!IS_ELF)
31312f95
AM
3464 return 1;
3465
a161fe53
AM
3466 /* Don't adjust pc-relative references to merge sections in 64-bit
3467 mode. */
3468 if (use_rela_relocations
3469 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3470 && fixP->fx_pcrel)
252b5132 3471 return 0;
31312f95 3472
8d01d9a9
AJ
3473 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3474 and changed later by validate_fix. */
3475 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3476 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3477 return 0;
3478
8fd4256d
L
3479 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3480 for size relocations. */
3481 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3482 || fixP->fx_r_type == BFD_RELOC_SIZE64
3483 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3484 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3485 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3486 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3487 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3488 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3489 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3490 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3491 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3492 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3493 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3494 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3495 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3496 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3497 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3498 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3499 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3500 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3501 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3502 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3503 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3504 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3505 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3506 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3507 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3508 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3509 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3510 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3511 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3512 return 0;
31312f95 3513#endif
252b5132
RH
3514 return 1;
3515}
252b5132 3516
b4cac588 3517static int
e3bb37b5 3518intel_float_operand (const char *mnemonic)
252b5132 3519{
9306ca4a
JB
3520 /* Note that the value returned is meaningful only for opcodes with (memory)
3521 operands, hence the code here is free to improperly handle opcodes that
3522 have no operands (for better performance and smaller code). */
3523
3524 if (mnemonic[0] != 'f')
3525 return 0; /* non-math */
3526
3527 switch (mnemonic[1])
3528 {
3529 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3530 the fs segment override prefix not currently handled because no
3531 call path can make opcodes without operands get here */
3532 case 'i':
3533 return 2 /* integer op */;
3534 case 'l':
3535 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3536 return 3; /* fldcw/fldenv */
3537 break;
3538 case 'n':
3539 if (mnemonic[2] != 'o' /* fnop */)
3540 return 3; /* non-waiting control op */
3541 break;
3542 case 'r':
3543 if (mnemonic[2] == 's')
3544 return 3; /* frstor/frstpm */
3545 break;
3546 case 's':
3547 if (mnemonic[2] == 'a')
3548 return 3; /* fsave */
3549 if (mnemonic[2] == 't')
3550 {
3551 switch (mnemonic[3])
3552 {
3553 case 'c': /* fstcw */
3554 case 'd': /* fstdw */
3555 case 'e': /* fstenv */
3556 case 's': /* fsts[gw] */
3557 return 3;
3558 }
3559 }
3560 break;
3561 case 'x':
3562 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3563 return 0; /* fxsave/fxrstor are not really math ops */
3564 break;
3565 }
252b5132 3566
9306ca4a 3567 return 1;
252b5132
RH
3568}
3569
c0f3af97
L
3570/* Build the VEX prefix. */
3571
3572static void
d3ce72d0 3573build_vex_prefix (const insn_template *t)
c0f3af97
L
3574{
3575 unsigned int register_specifier;
3576 unsigned int implied_prefix;
3577 unsigned int vector_length;
03751133 3578 unsigned int w;
c0f3af97
L
3579
3580 /* Check register specifier. */
3581 if (i.vex.register_specifier)
43234a1e
L
3582 {
3583 register_specifier =
3584 ~register_number (i.vex.register_specifier) & 0xf;
3585 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3586 }
c0f3af97
L
3587 else
3588 register_specifier = 0xf;
3589
79f0fa25
L
3590 /* Use 2-byte VEX prefix by swapping destination and source operand
3591 if there are more than 1 register operand. */
3592 if (i.reg_operands > 1
3593 && i.vec_encoding != vex_encoding_vex3
86fa6981 3594 && i.dir_encoding == dir_encoding_default
fa99fab2 3595 && i.operands == i.reg_operands
dbbc8b7e 3596 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3597 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3598 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3599 && i.rex == REX_B)
3600 {
3601 unsigned int xchg = i.operands - 1;
3602 union i386_op temp_op;
3603 i386_operand_type temp_type;
3604
3605 temp_type = i.types[xchg];
3606 i.types[xchg] = i.types[0];
3607 i.types[0] = temp_type;
3608 temp_op = i.op[xchg];
3609 i.op[xchg] = i.op[0];
3610 i.op[0] = temp_op;
3611
9c2799c2 3612 gas_assert (i.rm.mode == 3);
fa99fab2
L
3613
3614 i.rex = REX_R;
3615 xchg = i.rm.regmem;
3616 i.rm.regmem = i.rm.reg;
3617 i.rm.reg = xchg;
3618
dbbc8b7e
JB
3619 if (i.tm.opcode_modifier.d)
3620 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3621 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3622 else /* Use the next insn. */
3623 i.tm = t[1];
fa99fab2
L
3624 }
3625
79dec6b7
JB
3626 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3627 are no memory operands and at least 3 register ones. */
3628 if (i.reg_operands >= 3
3629 && i.vec_encoding != vex_encoding_vex3
3630 && i.reg_operands == i.operands - i.imm_operands
3631 && i.tm.opcode_modifier.vex
3632 && i.tm.opcode_modifier.commutative
3633 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3634 && i.rex == REX_B
3635 && i.vex.register_specifier
3636 && !(i.vex.register_specifier->reg_flags & RegRex))
3637 {
3638 unsigned int xchg = i.operands - i.reg_operands;
3639 union i386_op temp_op;
3640 i386_operand_type temp_type;
3641
3642 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3643 gas_assert (!i.tm.opcode_modifier.sae);
3644 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3645 &i.types[i.operands - 3]));
3646 gas_assert (i.rm.mode == 3);
3647
3648 temp_type = i.types[xchg];
3649 i.types[xchg] = i.types[xchg + 1];
3650 i.types[xchg + 1] = temp_type;
3651 temp_op = i.op[xchg];
3652 i.op[xchg] = i.op[xchg + 1];
3653 i.op[xchg + 1] = temp_op;
3654
3655 i.rex = 0;
3656 xchg = i.rm.regmem | 8;
3657 i.rm.regmem = ~register_specifier & 0xf;
3658 gas_assert (!(i.rm.regmem & 8));
3659 i.vex.register_specifier += xchg - i.rm.regmem;
3660 register_specifier = ~xchg & 0xf;
3661 }
3662
539f890d
L
3663 if (i.tm.opcode_modifier.vex == VEXScalar)
3664 vector_length = avxscalar;
10c17abd
JB
3665 else if (i.tm.opcode_modifier.vex == VEX256)
3666 vector_length = 1;
539f890d 3667 else
10c17abd 3668 {
56522fc5 3669 unsigned int op;
10c17abd 3670
c7213af9
L
3671 /* Determine vector length from the last multi-length vector
3672 operand. */
10c17abd 3673 vector_length = 0;
56522fc5 3674 for (op = t->operands; op--;)
10c17abd
JB
3675 if (t->operand_types[op].bitfield.xmmword
3676 && t->operand_types[op].bitfield.ymmword
3677 && i.types[op].bitfield.ymmword)
3678 {
3679 vector_length = 1;
3680 break;
3681 }
3682 }
c0f3af97 3683
8c190ce0 3684 switch ((i.tm.base_opcode >> (i.tm.opcode_length << 3)) & 0xff)
c0f3af97
L
3685 {
3686 case 0:
3687 implied_prefix = 0;
3688 break;
3689 case DATA_PREFIX_OPCODE:
3690 implied_prefix = 1;
3691 break;
3692 case REPE_PREFIX_OPCODE:
3693 implied_prefix = 2;
3694 break;
3695 case REPNE_PREFIX_OPCODE:
3696 implied_prefix = 3;
3697 break;
3698 default:
3699 abort ();
3700 }
3701
03751133
L
3702 /* Check the REX.W bit and VEXW. */
3703 if (i.tm.opcode_modifier.vexw == VEXWIG)
3704 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3705 else if (i.tm.opcode_modifier.vexw)
3706 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3707 else
931d03b7 3708 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3709
c0f3af97 3710 /* Use 2-byte VEX prefix if possible. */
03751133
L
3711 if (w == 0
3712 && i.vec_encoding != vex_encoding_vex3
86fa6981 3713 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3714 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3715 {
3716 /* 2-byte VEX prefix. */
3717 unsigned int r;
3718
3719 i.vex.length = 2;
3720 i.vex.bytes[0] = 0xc5;
3721
3722 /* Check the REX.R bit. */
3723 r = (i.rex & REX_R) ? 0 : 1;
3724 i.vex.bytes[1] = (r << 7
3725 | register_specifier << 3
3726 | vector_length << 2
3727 | implied_prefix);
3728 }
3729 else
3730 {
3731 /* 3-byte VEX prefix. */
03751133 3732 unsigned int m;
c0f3af97 3733
f88c9eb0 3734 i.vex.length = 3;
f88c9eb0 3735
7f399153 3736 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3737 {
7f399153
L
3738 case VEX0F:
3739 m = 0x1;
80de6e00 3740 i.vex.bytes[0] = 0xc4;
7f399153
L
3741 break;
3742 case VEX0F38:
3743 m = 0x2;
80de6e00 3744 i.vex.bytes[0] = 0xc4;
7f399153
L
3745 break;
3746 case VEX0F3A:
3747 m = 0x3;
80de6e00 3748 i.vex.bytes[0] = 0xc4;
7f399153
L
3749 break;
3750 case XOP08:
5dd85c99
SP
3751 m = 0x8;
3752 i.vex.bytes[0] = 0x8f;
7f399153
L
3753 break;
3754 case XOP09:
f88c9eb0
SP
3755 m = 0x9;
3756 i.vex.bytes[0] = 0x8f;
7f399153
L
3757 break;
3758 case XOP0A:
f88c9eb0
SP
3759 m = 0xa;
3760 i.vex.bytes[0] = 0x8f;
7f399153
L
3761 break;
3762 default:
3763 abort ();
f88c9eb0 3764 }
c0f3af97 3765
c0f3af97
L
3766 /* The high 3 bits of the second VEX byte are 1's compliment
3767 of RXB bits from REX. */
3768 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3769
c0f3af97
L
3770 i.vex.bytes[2] = (w << 7
3771 | register_specifier << 3
3772 | vector_length << 2
3773 | implied_prefix);
3774 }
3775}
3776
e771e7c9
JB
3777static INLINE bfd_boolean
3778is_evex_encoding (const insn_template *t)
3779{
7091c612 3780 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3781 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3782 || t->opcode_modifier.sae;
e771e7c9
JB
3783}
3784
7a8655d2
JB
3785static INLINE bfd_boolean
3786is_any_vex_encoding (const insn_template *t)
3787{
3788 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3789 || is_evex_encoding (t);
3790}
3791
43234a1e
L
3792/* Build the EVEX prefix. */
3793
3794static void
3795build_evex_prefix (void)
3796{
3797 unsigned int register_specifier;
3798 unsigned int implied_prefix;
3799 unsigned int m, w;
3800 rex_byte vrex_used = 0;
3801
3802 /* Check register specifier. */
3803 if (i.vex.register_specifier)
3804 {
3805 gas_assert ((i.vrex & REX_X) == 0);
3806
3807 register_specifier = i.vex.register_specifier->reg_num;
3808 if ((i.vex.register_specifier->reg_flags & RegRex))
3809 register_specifier += 8;
3810 /* The upper 16 registers are encoded in the fourth byte of the
3811 EVEX prefix. */
3812 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3813 i.vex.bytes[3] = 0x8;
3814 register_specifier = ~register_specifier & 0xf;
3815 }
3816 else
3817 {
3818 register_specifier = 0xf;
3819
3820 /* Encode upper 16 vector index register in the fourth byte of
3821 the EVEX prefix. */
3822 if (!(i.vrex & REX_X))
3823 i.vex.bytes[3] = 0x8;
3824 else
3825 vrex_used |= REX_X;
3826 }
3827
3828 switch ((i.tm.base_opcode >> 8) & 0xff)
3829 {
3830 case 0:
3831 implied_prefix = 0;
3832 break;
3833 case DATA_PREFIX_OPCODE:
3834 implied_prefix = 1;
3835 break;
3836 case REPE_PREFIX_OPCODE:
3837 implied_prefix = 2;
3838 break;
3839 case REPNE_PREFIX_OPCODE:
3840 implied_prefix = 3;
3841 break;
3842 default:
3843 abort ();
3844 }
3845
3846 /* 4 byte EVEX prefix. */
3847 i.vex.length = 4;
3848 i.vex.bytes[0] = 0x62;
3849
3850 /* mmmm bits. */
3851 switch (i.tm.opcode_modifier.vexopcode)
3852 {
3853 case VEX0F:
3854 m = 1;
3855 break;
3856 case VEX0F38:
3857 m = 2;
3858 break;
3859 case VEX0F3A:
3860 m = 3;
3861 break;
3862 default:
3863 abort ();
3864 break;
3865 }
3866
3867 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3868 bits from REX. */
3869 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3870
3871 /* The fifth bit of the second EVEX byte is 1's compliment of the
3872 REX_R bit in VREX. */
3873 if (!(i.vrex & REX_R))
3874 i.vex.bytes[1] |= 0x10;
3875 else
3876 vrex_used |= REX_R;
3877
3878 if ((i.reg_operands + i.imm_operands) == i.operands)
3879 {
3880 /* When all operands are registers, the REX_X bit in REX is not
3881 used. We reuse it to encode the upper 16 registers, which is
3882 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3883 as 1's compliment. */
3884 if ((i.vrex & REX_B))
3885 {
3886 vrex_used |= REX_B;
3887 i.vex.bytes[1] &= ~0x40;
3888 }
3889 }
3890
3891 /* EVEX instructions shouldn't need the REX prefix. */
3892 i.vrex &= ~vrex_used;
3893 gas_assert (i.vrex == 0);
3894
6865c043
L
3895 /* Check the REX.W bit and VEXW. */
3896 if (i.tm.opcode_modifier.vexw == VEXWIG)
3897 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3898 else if (i.tm.opcode_modifier.vexw)
3899 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3900 else
931d03b7 3901 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3902
3903 /* Encode the U bit. */
3904 implied_prefix |= 0x4;
3905
3906 /* The third byte of the EVEX prefix. */
3907 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3908
3909 /* The fourth byte of the EVEX prefix. */
3910 /* The zeroing-masking bit. */
3911 if (i.mask && i.mask->zeroing)
3912 i.vex.bytes[3] |= 0x80;
3913
3914 /* Don't always set the broadcast bit if there is no RC. */
3915 if (!i.rounding)
3916 {
3917 /* Encode the vector length. */
3918 unsigned int vec_length;
3919
e771e7c9
JB
3920 if (!i.tm.opcode_modifier.evex
3921 || i.tm.opcode_modifier.evex == EVEXDYN)
3922 {
56522fc5 3923 unsigned int op;
e771e7c9 3924
c7213af9
L
3925 /* Determine vector length from the last multi-length vector
3926 operand. */
56522fc5 3927 for (op = i.operands; op--;)
e771e7c9
JB
3928 if (i.tm.operand_types[op].bitfield.xmmword
3929 + i.tm.operand_types[op].bitfield.ymmword
3930 + i.tm.operand_types[op].bitfield.zmmword > 1)
3931 {
3932 if (i.types[op].bitfield.zmmword)
c7213af9
L
3933 {
3934 i.tm.opcode_modifier.evex = EVEX512;
3935 break;
3936 }
e771e7c9 3937 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3938 {
3939 i.tm.opcode_modifier.evex = EVEX256;
3940 break;
3941 }
e771e7c9 3942 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3943 {
3944 i.tm.opcode_modifier.evex = EVEX128;
3945 break;
3946 }
625cbd7a
JB
3947 else if (i.broadcast && (int) op == i.broadcast->operand)
3948 {
4a1b91ea 3949 switch (i.broadcast->bytes)
625cbd7a
JB
3950 {
3951 case 64:
3952 i.tm.opcode_modifier.evex = EVEX512;
3953 break;
3954 case 32:
3955 i.tm.opcode_modifier.evex = EVEX256;
3956 break;
3957 case 16:
3958 i.tm.opcode_modifier.evex = EVEX128;
3959 break;
3960 default:
c7213af9 3961 abort ();
625cbd7a 3962 }
c7213af9 3963 break;
625cbd7a 3964 }
e771e7c9 3965 }
c7213af9 3966
56522fc5 3967 if (op >= MAX_OPERANDS)
c7213af9 3968 abort ();
e771e7c9
JB
3969 }
3970
43234a1e
L
3971 switch (i.tm.opcode_modifier.evex)
3972 {
3973 case EVEXLIG: /* LL' is ignored */
3974 vec_length = evexlig << 5;
3975 break;
3976 case EVEX128:
3977 vec_length = 0 << 5;
3978 break;
3979 case EVEX256:
3980 vec_length = 1 << 5;
3981 break;
3982 case EVEX512:
3983 vec_length = 2 << 5;
3984 break;
3985 default:
3986 abort ();
3987 break;
3988 }
3989 i.vex.bytes[3] |= vec_length;
3990 /* Encode the broadcast bit. */
3991 if (i.broadcast)
3992 i.vex.bytes[3] |= 0x10;
3993 }
3994 else
3995 {
3996 if (i.rounding->type != saeonly)
3997 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3998 else
d3d3c6db 3999 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
4000 }
4001
4002 if (i.mask && i.mask->mask)
4003 i.vex.bytes[3] |= i.mask->mask->reg_num;
4004}
4005
65da13b5
L
4006static void
4007process_immext (void)
4008{
4009 expressionS *exp;
4010
c0f3af97 4011 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
4012 which is coded in the same place as an 8-bit immediate field
4013 would be. Here we fake an 8-bit immediate operand from the
4014 opcode suffix stored in tm.extension_opcode.
4015
c1e679ec 4016 AVX instructions also use this encoding, for some of
c0f3af97 4017 3 argument instructions. */
65da13b5 4018
43234a1e 4019 gas_assert (i.imm_operands <= 1
7ab9ffdd 4020 && (i.operands <= 2
7a8655d2 4021 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4022 && i.operands <= 4)));
65da13b5
L
4023
4024 exp = &im_expressions[i.imm_operands++];
4025 i.op[i.operands].imms = exp;
4026 i.types[i.operands] = imm8;
4027 i.operands++;
4028 exp->X_op = O_constant;
4029 exp->X_add_number = i.tm.extension_opcode;
4030 i.tm.extension_opcode = None;
4031}
4032
42164a71
L
4033
4034static int
4035check_hle (void)
4036{
4037 switch (i.tm.opcode_modifier.hleprefixok)
4038 {
4039 default:
4040 abort ();
82c2def5 4041 case HLEPrefixNone:
165de32a
L
4042 as_bad (_("invalid instruction `%s' after `%s'"),
4043 i.tm.name, i.hle_prefix);
42164a71 4044 return 0;
82c2def5 4045 case HLEPrefixLock:
42164a71
L
4046 if (i.prefix[LOCK_PREFIX])
4047 return 1;
165de32a 4048 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4049 return 0;
82c2def5 4050 case HLEPrefixAny:
42164a71 4051 return 1;
82c2def5 4052 case HLEPrefixRelease:
42164a71
L
4053 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4054 {
4055 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4056 i.tm.name);
4057 return 0;
4058 }
8dc0818e 4059 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4060 {
4061 as_bad (_("memory destination needed for instruction `%s'"
4062 " after `xrelease'"), i.tm.name);
4063 return 0;
4064 }
4065 return 1;
4066 }
4067}
4068
b6f8c7c4
L
4069/* Try the shortest encoding by shortening operand size. */
4070
4071static void
4072optimize_encoding (void)
4073{
a0a1771e 4074 unsigned int j;
b6f8c7c4
L
4075
4076 if (optimize_for_space
72aea328 4077 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
4078 && i.reg_operands == 1
4079 && i.imm_operands == 1
4080 && !i.types[1].bitfield.byte
4081 && i.op[0].imms->X_op == O_constant
4082 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4083 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4084 || (i.tm.base_opcode == 0xf6
4085 && i.tm.extension_opcode == 0x0)))
4086 {
4087 /* Optimize: -Os:
4088 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4089 */
4090 unsigned int base_regnum = i.op[1].regs->reg_num;
4091 if (flag_code == CODE_64BIT || base_regnum < 4)
4092 {
4093 i.types[1].bitfield.byte = 1;
4094 /* Ignore the suffix. */
4095 i.suffix = 0;
7697afb6
JB
4096 /* Convert to byte registers. */
4097 if (i.types[1].bitfield.word)
4098 j = 16;
4099 else if (i.types[1].bitfield.dword)
4100 j = 32;
4101 else
4102 j = 48;
4103 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4104 j += 8;
4105 i.op[1].regs -= j;
b6f8c7c4
L
4106 }
4107 }
4108 else if (flag_code == CODE_64BIT
72aea328 4109 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4110 && ((i.types[1].bitfield.qword
4111 && i.reg_operands == 1
b6f8c7c4
L
4112 && i.imm_operands == 1
4113 && i.op[0].imms->X_op == O_constant
507916b8 4114 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4115 && i.tm.extension_opcode == None
4116 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4117 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4118 && ((i.tm.base_opcode == 0x24
4119 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4120 || (i.tm.base_opcode == 0x80
4121 && i.tm.extension_opcode == 0x4)
4122 || ((i.tm.base_opcode == 0xf6
507916b8 4123 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4124 && i.tm.extension_opcode == 0x0)))
4125 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4126 && i.tm.base_opcode == 0x83
4127 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4128 || (i.types[0].bitfield.qword
4129 && ((i.reg_operands == 2
4130 && i.op[0].regs == i.op[1].regs
72aea328
JB
4131 && (i.tm.base_opcode == 0x30
4132 || i.tm.base_opcode == 0x28))
d3d50934
L
4133 || (i.reg_operands == 1
4134 && i.operands == 1
72aea328 4135 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4136 {
4137 /* Optimize: -O:
4138 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4139 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4140 testq $imm31, %r64 -> testl $imm31, %r32
4141 xorq %r64, %r64 -> xorl %r32, %r32
4142 subq %r64, %r64 -> subl %r32, %r32
4143 movq $imm31, %r64 -> movl $imm31, %r32
4144 movq $imm32, %r64 -> movl $imm32, %r32
4145 */
4146 i.tm.opcode_modifier.norex64 = 1;
507916b8 4147 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4148 {
4149 /* Handle
4150 movq $imm31, %r64 -> movl $imm31, %r32
4151 movq $imm32, %r64 -> movl $imm32, %r32
4152 */
4153 i.tm.operand_types[0].bitfield.imm32 = 1;
4154 i.tm.operand_types[0].bitfield.imm32s = 0;
4155 i.tm.operand_types[0].bitfield.imm64 = 0;
4156 i.types[0].bitfield.imm32 = 1;
4157 i.types[0].bitfield.imm32s = 0;
4158 i.types[0].bitfield.imm64 = 0;
4159 i.types[1].bitfield.dword = 1;
4160 i.types[1].bitfield.qword = 0;
507916b8 4161 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4162 {
4163 /* Handle
4164 movq $imm31, %r64 -> movl $imm31, %r32
4165 */
507916b8 4166 i.tm.base_opcode = 0xb8;
b6f8c7c4 4167 i.tm.extension_opcode = None;
507916b8 4168 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4169 i.tm.opcode_modifier.modrm = 0;
4170 }
4171 }
4172 }
5641ec01
JB
4173 else if (optimize > 1
4174 && !optimize_for_space
72aea328 4175 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4176 && i.reg_operands == 2
4177 && i.op[0].regs == i.op[1].regs
4178 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4179 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4180 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4181 {
4182 /* Optimize: -O2:
4183 andb %rN, %rN -> testb %rN, %rN
4184 andw %rN, %rN -> testw %rN, %rN
4185 andq %rN, %rN -> testq %rN, %rN
4186 orb %rN, %rN -> testb %rN, %rN
4187 orw %rN, %rN -> testw %rN, %rN
4188 orq %rN, %rN -> testq %rN, %rN
4189
4190 and outside of 64-bit mode
4191
4192 andl %rN, %rN -> testl %rN, %rN
4193 orl %rN, %rN -> testl %rN, %rN
4194 */
4195 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4196 }
99112332 4197 else if (i.reg_operands == 3
b6f8c7c4
L
4198 && i.op[0].regs == i.op[1].regs
4199 && !i.types[2].bitfield.xmmword
4200 && (i.tm.opcode_modifier.vex
7a69eac3 4201 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4202 && !i.rounding
e771e7c9 4203 && is_evex_encoding (&i.tm)
80c34c38 4204 && (i.vec_encoding != vex_encoding_evex
dd22218c 4205 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4206 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4207 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4208 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4209 && ((i.tm.base_opcode == 0x55
4210 || i.tm.base_opcode == 0x6655
4211 || i.tm.base_opcode == 0x66df
4212 || i.tm.base_opcode == 0x57
4213 || i.tm.base_opcode == 0x6657
8305403a
L
4214 || i.tm.base_opcode == 0x66ef
4215 || i.tm.base_opcode == 0x66f8
4216 || i.tm.base_opcode == 0x66f9
4217 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4218 || i.tm.base_opcode == 0x66fb
4219 || i.tm.base_opcode == 0x42
4220 || i.tm.base_opcode == 0x6642
4221 || i.tm.base_opcode == 0x47
4222 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4223 && i.tm.extension_opcode == None))
4224 {
99112332 4225 /* Optimize: -O1:
8305403a
L
4226 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4227 vpsubq and vpsubw:
b6f8c7c4
L
4228 EVEX VOP %zmmM, %zmmM, %zmmN
4229 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4230 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4231 EVEX VOP %ymmM, %ymmM, %ymmN
4232 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4233 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4234 VEX VOP %ymmM, %ymmM, %ymmN
4235 -> VEX VOP %xmmM, %xmmM, %xmmN
4236 VOP, one of vpandn and vpxor:
4237 VEX VOP %ymmM, %ymmM, %ymmN
4238 -> VEX VOP %xmmM, %xmmM, %xmmN
4239 VOP, one of vpandnd and vpandnq:
4240 EVEX VOP %zmmM, %zmmM, %zmmN
4241 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4242 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4243 EVEX VOP %ymmM, %ymmM, %ymmN
4244 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4245 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4246 VOP, one of vpxord and vpxorq:
4247 EVEX VOP %zmmM, %zmmM, %zmmN
4248 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4249 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4250 EVEX VOP %ymmM, %ymmM, %ymmN
4251 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4252 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4253 VOP, one of kxord and kxorq:
4254 VEX VOP %kM, %kM, %kN
4255 -> VEX kxorw %kM, %kM, %kN
4256 VOP, one of kandnd and kandnq:
4257 VEX VOP %kM, %kM, %kN
4258 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4259 */
e771e7c9 4260 if (is_evex_encoding (&i.tm))
b6f8c7c4 4261 {
7b1d7ca1 4262 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4263 {
4264 i.tm.opcode_modifier.vex = VEX128;
4265 i.tm.opcode_modifier.vexw = VEXW0;
4266 i.tm.opcode_modifier.evex = 0;
4267 }
7b1d7ca1 4268 else if (optimize > 1)
dd22218c
L
4269 i.tm.opcode_modifier.evex = EVEX128;
4270 else
4271 return;
b6f8c7c4 4272 }
f74a6307 4273 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4274 {
4275 i.tm.base_opcode &= 0xff;
4276 i.tm.opcode_modifier.vexw = VEXW0;
4277 }
b6f8c7c4
L
4278 else
4279 i.tm.opcode_modifier.vex = VEX128;
4280
4281 if (i.tm.opcode_modifier.vex)
4282 for (j = 0; j < 3; j++)
4283 {
4284 i.types[j].bitfield.xmmword = 1;
4285 i.types[j].bitfield.ymmword = 0;
4286 }
4287 }
392a5972 4288 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4289 && !i.types[0].bitfield.zmmword
392a5972 4290 && !i.types[1].bitfield.zmmword
97ed31ae 4291 && !i.mask
a0a1771e 4292 && !i.broadcast
97ed31ae 4293 && is_evex_encoding (&i.tm)
392a5972
L
4294 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4295 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4296 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4297 || (i.tm.base_opcode & ~4) == 0x66db
4298 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4299 && i.tm.extension_opcode == None)
4300 {
4301 /* Optimize: -O1:
4302 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4303 vmovdqu32 and vmovdqu64:
4304 EVEX VOP %xmmM, %xmmN
4305 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4306 EVEX VOP %ymmM, %ymmN
4307 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4308 EVEX VOP %xmmM, mem
4309 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4310 EVEX VOP %ymmM, mem
4311 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4312 EVEX VOP mem, %xmmN
4313 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4314 EVEX VOP mem, %ymmN
4315 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4316 VOP, one of vpand, vpandn, vpor, vpxor:
4317 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4318 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4319 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4320 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4321 EVEX VOP{d,q} mem, %xmmM, %xmmN
4322 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4323 EVEX VOP{d,q} mem, %ymmM, %ymmN
4324 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4325 */
a0a1771e 4326 for (j = 0; j < i.operands; j++)
392a5972
L
4327 if (operand_type_check (i.types[j], disp)
4328 && i.op[j].disps->X_op == O_constant)
4329 {
4330 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4331 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4332 bytes, we choose EVEX Disp8 over VEX Disp32. */
4333 int evex_disp8, vex_disp8;
4334 unsigned int memshift = i.memshift;
4335 offsetT n = i.op[j].disps->X_add_number;
4336
4337 evex_disp8 = fits_in_disp8 (n);
4338 i.memshift = 0;
4339 vex_disp8 = fits_in_disp8 (n);
4340 if (evex_disp8 != vex_disp8)
4341 {
4342 i.memshift = memshift;
4343 return;
4344 }
4345
4346 i.types[j].bitfield.disp8 = vex_disp8;
4347 break;
4348 }
4349 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4350 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4351 i.tm.opcode_modifier.vex
4352 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4353 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4354 /* VPAND, VPOR, and VPXOR are commutative. */
4355 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4356 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4357 i.tm.opcode_modifier.evex = 0;
4358 i.tm.opcode_modifier.masking = 0;
a0a1771e 4359 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4360 i.tm.opcode_modifier.disp8memshift = 0;
4361 i.memshift = 0;
a0a1771e
JB
4362 if (j < i.operands)
4363 i.types[j].bitfield.disp8
4364 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4365 }
b6f8c7c4
L
4366}
4367
ae531041
L
4368/* Return non-zero for load instruction. */
4369
4370static int
4371load_insn_p (void)
4372{
4373 unsigned int dest;
4374 int any_vex_p = is_any_vex_encoding (&i.tm);
4375 unsigned int base_opcode = i.tm.base_opcode | 1;
4376
4377 if (!any_vex_p)
4378 {
a09f656b 4379 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4380 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4381 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4382 if (i.tm.opcode_modifier.anysize)
ae531041
L
4383 return 0;
4384
a09f656b 4385 /* pop, popf, popa. */
4386 if (strcmp (i.tm.name, "pop") == 0
4387 || i.tm.base_opcode == 0x9d
4388 || i.tm.base_opcode == 0x61)
ae531041
L
4389 return 1;
4390
4391 /* movs, cmps, lods, scas. */
4392 if ((i.tm.base_opcode | 0xb) == 0xaf)
4393 return 1;
4394
a09f656b 4395 /* outs, xlatb. */
4396 if (base_opcode == 0x6f
4397 || i.tm.base_opcode == 0xd7)
ae531041 4398 return 1;
a09f656b 4399 /* NB: For AMD-specific insns with implicit memory operands,
4400 they're intentionally not covered. */
ae531041
L
4401 }
4402
4403 /* No memory operand. */
4404 if (!i.mem_operands)
4405 return 0;
4406
4407 if (any_vex_p)
4408 {
4409 /* vldmxcsr. */
4410 if (i.tm.base_opcode == 0xae
4411 && i.tm.opcode_modifier.vex
4412 && i.tm.opcode_modifier.vexopcode == VEX0F
4413 && i.tm.extension_opcode == 2)
4414 return 1;
4415 }
4416 else
4417 {
4418 /* test, not, neg, mul, imul, div, idiv. */
4419 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4420 && i.tm.extension_opcode != 1)
4421 return 1;
4422
4423 /* inc, dec. */
4424 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4425 return 1;
4426
4427 /* add, or, adc, sbb, and, sub, xor, cmp. */
4428 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4429 return 1;
4430
4431 /* bt, bts, btr, btc. */
4432 if (i.tm.base_opcode == 0xfba
4433 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4434 return 1;
4435
4436 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4437 if ((base_opcode == 0xc1
4438 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4439 && i.tm.extension_opcode != 6)
4440 return 1;
4441
4442 /* cmpxchg8b, cmpxchg16b, xrstors. */
4443 if (i.tm.base_opcode == 0xfc7
4444 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3))
4445 return 1;
4446
4447 /* fxrstor, ldmxcsr, xrstor. */
4448 if (i.tm.base_opcode == 0xfae
4449 && (i.tm.extension_opcode == 1
4450 || i.tm.extension_opcode == 2
4451 || i.tm.extension_opcode == 5))
4452 return 1;
4453
4454 /* lgdt, lidt, lmsw. */
4455 if (i.tm.base_opcode == 0xf01
4456 && (i.tm.extension_opcode == 2
4457 || i.tm.extension_opcode == 3
4458 || i.tm.extension_opcode == 6))
4459 return 1;
4460
4461 /* vmptrld */
4462 if (i.tm.base_opcode == 0xfc7
4463 && i.tm.extension_opcode == 6)
4464 return 1;
4465
4466 /* Check for x87 instructions. */
4467 if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf)
4468 {
4469 /* Skip fst, fstp, fstenv, fstcw. */
4470 if (i.tm.base_opcode == 0xd9
4471 && (i.tm.extension_opcode == 2
4472 || i.tm.extension_opcode == 3
4473 || i.tm.extension_opcode == 6
4474 || i.tm.extension_opcode == 7))
4475 return 0;
4476
4477 /* Skip fisttp, fist, fistp, fstp. */
4478 if (i.tm.base_opcode == 0xdb
4479 && (i.tm.extension_opcode == 1
4480 || i.tm.extension_opcode == 2
4481 || i.tm.extension_opcode == 3
4482 || i.tm.extension_opcode == 7))
4483 return 0;
4484
4485 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4486 if (i.tm.base_opcode == 0xdd
4487 && (i.tm.extension_opcode == 1
4488 || i.tm.extension_opcode == 2
4489 || i.tm.extension_opcode == 3
4490 || i.tm.extension_opcode == 6
4491 || i.tm.extension_opcode == 7))
4492 return 0;
4493
4494 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4495 if (i.tm.base_opcode == 0xdf
4496 && (i.tm.extension_opcode == 1
4497 || i.tm.extension_opcode == 2
4498 || i.tm.extension_opcode == 3
4499 || i.tm.extension_opcode == 6
4500 || i.tm.extension_opcode == 7))
4501 return 0;
4502
4503 return 1;
4504 }
4505 }
4506
4507 dest = i.operands - 1;
4508
4509 /* Check fake imm8 operand and 3 source operands. */
4510 if ((i.tm.opcode_modifier.immext
4511 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4512 && i.types[dest].bitfield.imm8)
4513 dest--;
4514
4515 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */
4516 if (!any_vex_p
4517 && (base_opcode == 0x1
4518 || base_opcode == 0x9
4519 || base_opcode == 0x11
4520 || base_opcode == 0x19
4521 || base_opcode == 0x21
4522 || base_opcode == 0x29
4523 || base_opcode == 0x31
4524 || base_opcode == 0x39
4525 || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87)
4526 || base_opcode == 0xfc1))
4527 return 1;
4528
4529 /* Check for load instruction. */
4530 return (i.types[dest].bitfield.class != ClassNone
4531 || i.types[dest].bitfield.instance == Accum);
4532}
4533
4534/* Output lfence, 0xfaee8, after instruction. */
4535
4536static void
4537insert_lfence_after (void)
4538{
4539 if (lfence_after_load && load_insn_p ())
4540 {
a09f656b 4541 /* There are also two REP string instructions that require
4542 special treatment. Specifically, the compare string (CMPS)
4543 and scan string (SCAS) instructions set EFLAGS in a manner
4544 that depends on the data being compared/scanned. When used
4545 with a REP prefix, the number of iterations may therefore
4546 vary depending on this data. If the data is a program secret
4547 chosen by the adversary using an LVI method,
4548 then this data-dependent behavior may leak some aspect
4549 of the secret. */
4550 if (((i.tm.base_opcode | 0x1) == 0xa7
4551 || (i.tm.base_opcode | 0x1) == 0xaf)
4552 && i.prefix[REP_PREFIX])
4553 {
4554 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4555 i.tm.name);
4556 }
ae531041
L
4557 char *p = frag_more (3);
4558 *p++ = 0xf;
4559 *p++ = 0xae;
4560 *p = 0xe8;
4561 }
4562}
4563
4564/* Output lfence, 0xfaee8, before instruction. */
4565
4566static void
4567insert_lfence_before (void)
4568{
4569 char *p;
4570
4571 if (is_any_vex_encoding (&i.tm))
4572 return;
4573
4574 if (i.tm.base_opcode == 0xff
4575 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4576 {
4577 /* Insert lfence before indirect branch if needed. */
4578
4579 if (lfence_before_indirect_branch == lfence_branch_none)
4580 return;
4581
4582 if (i.operands != 1)
4583 abort ();
4584
4585 if (i.reg_operands == 1)
4586 {
4587 /* Indirect branch via register. Don't insert lfence with
4588 -mlfence-after-load=yes. */
4589 if (lfence_after_load
4590 || lfence_before_indirect_branch == lfence_branch_memory)
4591 return;
4592 }
4593 else if (i.mem_operands == 1
4594 && lfence_before_indirect_branch != lfence_branch_register)
4595 {
4596 as_warn (_("indirect `%s` with memory operand should be avoided"),
4597 i.tm.name);
4598 return;
4599 }
4600 else
4601 return;
4602
4603 if (last_insn.kind != last_insn_other
4604 && last_insn.seg == now_seg)
4605 {
4606 as_warn_where (last_insn.file, last_insn.line,
4607 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4608 last_insn.name, i.tm.name);
4609 return;
4610 }
4611
4612 p = frag_more (3);
4613 *p++ = 0xf;
4614 *p++ = 0xae;
4615 *p = 0xe8;
4616 return;
4617 }
4618
503648e4 4619 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4620 if (lfence_before_ret != lfence_before_ret_none
4621 && (i.tm.base_opcode == 0xc2
503648e4 4622 || i.tm.base_opcode == 0xc3))
ae531041
L
4623 {
4624 if (last_insn.kind != last_insn_other
4625 && last_insn.seg == now_seg)
4626 {
4627 as_warn_where (last_insn.file, last_insn.line,
4628 _("`%s` skips -mlfence-before-ret on `%s`"),
4629 last_insn.name, i.tm.name);
4630 return;
4631 }
a09f656b 4632
a09f656b 4633 /* Near ret ingore operand size override under CPU64. */
503648e4 4634 char prefix = flag_code == CODE_64BIT
4635 ? 0x48
4636 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4637
4638 if (lfence_before_ret == lfence_before_ret_not)
4639 {
4640 /* not: 0xf71424, may add prefix
4641 for operand size override or 64-bit code. */
4642 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4643 if (prefix)
4644 *p++ = prefix;
ae531041
L
4645 *p++ = 0xf7;
4646 *p++ = 0x14;
4647 *p++ = 0x24;
a09f656b 4648 if (prefix)
4649 *p++ = prefix;
ae531041
L
4650 *p++ = 0xf7;
4651 *p++ = 0x14;
4652 *p++ = 0x24;
4653 }
a09f656b 4654 else
4655 {
4656 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4657 if (prefix)
4658 *p++ = prefix;
4659 if (lfence_before_ret == lfence_before_ret_or)
4660 {
4661 /* or: 0x830c2400, may add prefix
4662 for operand size override or 64-bit code. */
4663 *p++ = 0x83;
4664 *p++ = 0x0c;
4665 }
4666 else
4667 {
4668 /* shl: 0xc1242400, may add prefix
4669 for operand size override or 64-bit code. */
4670 *p++ = 0xc1;
4671 *p++ = 0x24;
4672 }
4673
4674 *p++ = 0x24;
4675 *p++ = 0x0;
4676 }
4677
ae531041
L
4678 *p++ = 0xf;
4679 *p++ = 0xae;
4680 *p = 0xe8;
4681 }
4682}
4683
252b5132
RH
4684/* This is the guts of the machine-dependent assembler. LINE points to a
4685 machine dependent instruction. This function is supposed to emit
4686 the frags/bytes it assembles to. */
4687
4688void
65da13b5 4689md_assemble (char *line)
252b5132 4690{
40fb9820 4691 unsigned int j;
83b16ac6 4692 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4693 const insn_template *t;
252b5132 4694
47926f60 4695 /* Initialize globals. */
252b5132
RH
4696 memset (&i, '\0', sizeof (i));
4697 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4698 i.reloc[j] = NO_RELOC;
252b5132
RH
4699 memset (disp_expressions, '\0', sizeof (disp_expressions));
4700 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4701 save_stack_p = save_stack;
252b5132
RH
4702
4703 /* First parse an instruction mnemonic & call i386_operand for the operands.
4704 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4705 start of a (possibly prefixed) mnemonic. */
252b5132 4706
29b0f896
AM
4707 line = parse_insn (line, mnemonic);
4708 if (line == NULL)
4709 return;
83b16ac6 4710 mnem_suffix = i.suffix;
252b5132 4711
29b0f896 4712 line = parse_operands (line, mnemonic);
ee86248c 4713 this_operand = -1;
8325cc63
JB
4714 xfree (i.memop1_string);
4715 i.memop1_string = NULL;
29b0f896
AM
4716 if (line == NULL)
4717 return;
252b5132 4718
29b0f896
AM
4719 /* Now we've parsed the mnemonic into a set of templates, and have the
4720 operands at hand. */
4721
b630c145
JB
4722 /* All Intel opcodes have reversed operands except for "bound", "enter",
4723 "monitor*", "mwait*", "tpause", and "umwait". We also don't reverse
4724 intersegment "jmp" and "call" instructions with 2 immediate operands so
4725 that the immediate segment precedes the offset, as it does when in AT&T
4726 mode. */
4d456e3d
L
4727 if (intel_syntax
4728 && i.operands > 1
29b0f896 4729 && (strcmp (mnemonic, "bound") != 0)
30123838 4730 && (strcmp (mnemonic, "invlpga") != 0)
eedb0f2c
JB
4731 && (strncmp (mnemonic, "monitor", 7) != 0)
4732 && (strncmp (mnemonic, "mwait", 5) != 0)
b630c145
JB
4733 && (strcmp (mnemonic, "tpause") != 0)
4734 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4735 && !(operand_type_check (i.types[0], imm)
4736 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4737 swap_operands ();
4738
ec56d5c0
JB
4739 /* The order of the immediates should be reversed
4740 for 2 immediates extrq and insertq instructions */
4741 if (i.imm_operands == 2
4742 && (strcmp (mnemonic, "extrq") == 0
4743 || strcmp (mnemonic, "insertq") == 0))
4744 swap_2_operands (0, 1);
4745
29b0f896
AM
4746 if (i.imm_operands)
4747 optimize_imm ();
4748
b300c311
L
4749 /* Don't optimize displacement for movabs since it only takes 64bit
4750 displacement. */
4751 if (i.disp_operands
a501d77e 4752 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4753 && (flag_code != CODE_64BIT
4754 || strcmp (mnemonic, "movabs") != 0))
4755 optimize_disp ();
29b0f896
AM
4756
4757 /* Next, we find a template that matches the given insn,
4758 making sure the overlap of the given operands types is consistent
4759 with the template operand types. */
252b5132 4760
83b16ac6 4761 if (!(t = match_template (mnem_suffix)))
29b0f896 4762 return;
252b5132 4763
7bab8ab5 4764 if (sse_check != check_none
81f8a913 4765 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4766 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4767 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4768 && (i.tm.cpu_flags.bitfield.cpusse
4769 || i.tm.cpu_flags.bitfield.cpusse2
4770 || i.tm.cpu_flags.bitfield.cpusse3
4771 || i.tm.cpu_flags.bitfield.cpussse3
4772 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4773 || i.tm.cpu_flags.bitfield.cpusse4_2
4774 || i.tm.cpu_flags.bitfield.cpupclmul
4775 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4776 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4777 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4778 {
7bab8ab5 4779 (sse_check == check_warning
daf50ae7
L
4780 ? as_warn
4781 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4782 }
4783
40fb9820 4784 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4785 if (!add_prefix (FWAIT_OPCODE))
4786 return;
252b5132 4787
d5de92cf
L
4788 /* Check if REP prefix is OK. */
4789 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4790 {
4791 as_bad (_("invalid instruction `%s' after `%s'"),
4792 i.tm.name, i.rep_prefix);
4793 return;
4794 }
4795
c1ba0266
L
4796 /* Check for lock without a lockable instruction. Destination operand
4797 must be memory unless it is xchg (0x86). */
c32fa91d
L
4798 if (i.prefix[LOCK_PREFIX]
4799 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4800 || i.mem_operands == 0
4801 || (i.tm.base_opcode != 0x86
8dc0818e 4802 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4803 {
4804 as_bad (_("expecting lockable instruction after `lock'"));
4805 return;
4806 }
4807
40d231b4
JB
4808 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4809 if (i.prefix[DATA_PREFIX]
4810 && (is_any_vex_encoding (&i.tm)
4811 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4812 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4813 {
4814 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4815 return;
4816 }
4817
42164a71 4818 /* Check if HLE prefix is OK. */
165de32a 4819 if (i.hle_prefix && !check_hle ())
42164a71
L
4820 return;
4821
7e8b059b
L
4822 /* Check BND prefix. */
4823 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4824 as_bad (_("expecting valid branch instruction after `bnd'"));
4825
04ef582a 4826 /* Check NOTRACK prefix. */
9fef80d6
L
4827 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4828 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4829
327e8c42
JB
4830 if (i.tm.cpu_flags.bitfield.cpumpx)
4831 {
4832 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4833 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4834 else if (flag_code != CODE_16BIT
4835 ? i.prefix[ADDR_PREFIX]
4836 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4837 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4838 }
7e8b059b
L
4839
4840 /* Insert BND prefix. */
76d3a78a
JB
4841 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4842 {
4843 if (!i.prefix[BND_PREFIX])
4844 add_prefix (BND_PREFIX_OPCODE);
4845 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4846 {
4847 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4848 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4849 }
4850 }
7e8b059b 4851
29b0f896 4852 /* Check string instruction segment overrides. */
51c8edf6 4853 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4854 {
51c8edf6 4855 gas_assert (i.mem_operands);
29b0f896 4856 if (!check_string ())
5dd0794d 4857 return;
fc0763e6 4858 i.disp_operands = 0;
29b0f896 4859 }
5dd0794d 4860
b6f8c7c4
L
4861 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4862 optimize_encoding ();
4863
29b0f896
AM
4864 if (!process_suffix ())
4865 return;
e413e4e9 4866
bc0844ae
L
4867 /* Update operand types. */
4868 for (j = 0; j < i.operands; j++)
4869 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4870
29b0f896
AM
4871 /* Make still unresolved immediate matches conform to size of immediate
4872 given in i.suffix. */
4873 if (!finalize_imm ())
4874 return;
252b5132 4875
40fb9820 4876 if (i.types[0].bitfield.imm1)
29b0f896 4877 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4878
9afe6eb8
L
4879 /* We only need to check those implicit registers for instructions
4880 with 3 operands or less. */
4881 if (i.operands <= 3)
4882 for (j = 0; j < i.operands; j++)
75e5731b
JB
4883 if (i.types[j].bitfield.instance != InstanceNone
4884 && !i.types[j].bitfield.xmmword)
9afe6eb8 4885 i.reg_operands--;
40fb9820 4886
29b0f896
AM
4887 /* For insns with operands there are more diddles to do to the opcode. */
4888 if (i.operands)
4889 {
4890 if (!process_operands ())
4891 return;
4892 }
8c190ce0 4893 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4894 {
4895 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4896 as_warn (_("translating to `%sp'"), i.tm.name);
4897 }
252b5132 4898
7a8655d2 4899 if (is_any_vex_encoding (&i.tm))
9e5e5283 4900 {
c1dc7af5 4901 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4902 {
c1dc7af5 4903 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4904 i.tm.name);
4905 return;
4906 }
c0f3af97 4907
0b9404fd
JB
4908 /* Check for explicit REX prefix. */
4909 if (i.prefix[REX_PREFIX] || i.rex_encoding)
4910 {
4911 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
4912 return;
4913 }
4914
9e5e5283
L
4915 if (i.tm.opcode_modifier.vex)
4916 build_vex_prefix (t);
4917 else
4918 build_evex_prefix ();
0b9404fd
JB
4919
4920 /* The individual REX.RXBW bits got consumed. */
4921 i.rex &= REX_OPCODE;
9e5e5283 4922 }
43234a1e 4923
5dd85c99
SP
4924 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4925 instructions may define INT_OPCODE as well, so avoid this corner
4926 case for those instructions that use MODRM. */
4927 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4928 && !i.tm.opcode_modifier.modrm
4929 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4930 {
4931 i.tm.base_opcode = INT3_OPCODE;
4932 i.imm_operands = 0;
4933 }
252b5132 4934
0cfa3eb3
JB
4935 if ((i.tm.opcode_modifier.jump == JUMP
4936 || i.tm.opcode_modifier.jump == JUMP_BYTE
4937 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4938 && i.op[0].disps->X_op == O_constant)
4939 {
4940 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4941 the absolute address given by the constant. Since ix86 jumps and
4942 calls are pc relative, we need to generate a reloc. */
4943 i.op[0].disps->X_add_symbol = &abs_symbol;
4944 i.op[0].disps->X_op = O_symbol;
4945 }
252b5132 4946
29b0f896
AM
4947 /* For 8 bit registers we need an empty rex prefix. Also if the
4948 instruction already has a prefix, we need to convert old
4949 registers to new ones. */
773f551c 4950
bab6aec1 4951 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4952 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4953 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4954 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4955 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4956 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4957 && i.rex != 0))
4958 {
4959 int x;
726c5dcd 4960
29b0f896
AM
4961 i.rex |= REX_OPCODE;
4962 for (x = 0; x < 2; x++)
4963 {
4964 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4965 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4966 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4967 {
3f93af61 4968 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4969 /* In case it is "hi" register, give up. */
4970 if (i.op[x].regs->reg_num > 3)
a540244d 4971 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4972 "instruction requiring REX prefix."),
a540244d 4973 register_prefix, i.op[x].regs->reg_name);
773f551c 4974
29b0f896
AM
4975 /* Otherwise it is equivalent to the extended register.
4976 Since the encoding doesn't change this is merely
4977 cosmetic cleanup for debug output. */
4978
4979 i.op[x].regs = i.op[x].regs + 8;
773f551c 4980 }
29b0f896
AM
4981 }
4982 }
773f551c 4983
6b6b6807
L
4984 if (i.rex == 0 && i.rex_encoding)
4985 {
4986 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4987 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4988 the REX_OPCODE byte. */
4989 int x;
4990 for (x = 0; x < 2; x++)
bab6aec1 4991 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4992 && i.types[x].bitfield.byte
4993 && (i.op[x].regs->reg_flags & RegRex64) == 0
4994 && i.op[x].regs->reg_num > 3)
4995 {
3f93af61 4996 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4997 i.rex_encoding = FALSE;
4998 break;
4999 }
5000
5001 if (i.rex_encoding)
5002 i.rex = REX_OPCODE;
5003 }
5004
7ab9ffdd 5005 if (i.rex != 0)
29b0f896
AM
5006 add_prefix (REX_OPCODE | i.rex);
5007
ae531041
L
5008 insert_lfence_before ();
5009
29b0f896
AM
5010 /* We are ready to output the insn. */
5011 output_insn ();
e379e5f3 5012
ae531041
L
5013 insert_lfence_after ();
5014
e379e5f3
L
5015 last_insn.seg = now_seg;
5016
5017 if (i.tm.opcode_modifier.isprefix)
5018 {
5019 last_insn.kind = last_insn_prefix;
5020 last_insn.name = i.tm.name;
5021 last_insn.file = as_where (&last_insn.line);
5022 }
5023 else
5024 last_insn.kind = last_insn_other;
29b0f896
AM
5025}
5026
5027static char *
e3bb37b5 5028parse_insn (char *line, char *mnemonic)
29b0f896
AM
5029{
5030 char *l = line;
5031 char *token_start = l;
5032 char *mnem_p;
5c6af06e 5033 int supported;
d3ce72d0 5034 const insn_template *t;
b6169b20 5035 char *dot_p = NULL;
29b0f896 5036
29b0f896
AM
5037 while (1)
5038 {
5039 mnem_p = mnemonic;
5040 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5041 {
b6169b20
L
5042 if (*mnem_p == '.')
5043 dot_p = mnem_p;
29b0f896
AM
5044 mnem_p++;
5045 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5046 {
29b0f896
AM
5047 as_bad (_("no such instruction: `%s'"), token_start);
5048 return NULL;
5049 }
5050 l++;
5051 }
5052 if (!is_space_char (*l)
5053 && *l != END_OF_INSN
e44823cf
JB
5054 && (intel_syntax
5055 || (*l != PREFIX_SEPARATOR
5056 && *l != ',')))
29b0f896
AM
5057 {
5058 as_bad (_("invalid character %s in mnemonic"),
5059 output_invalid (*l));
5060 return NULL;
5061 }
5062 if (token_start == l)
5063 {
e44823cf 5064 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5065 as_bad (_("expecting prefix; got nothing"));
5066 else
5067 as_bad (_("expecting mnemonic; got nothing"));
5068 return NULL;
5069 }
45288df1 5070
29b0f896 5071 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 5072 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 5073
29b0f896
AM
5074 if (*l != END_OF_INSN
5075 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5076 && current_templates
40fb9820 5077 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5078 {
c6fb90c8 5079 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5080 {
5081 as_bad ((flag_code != CODE_64BIT
5082 ? _("`%s' is only supported in 64-bit mode")
5083 : _("`%s' is not supported in 64-bit mode")),
5084 current_templates->start->name);
5085 return NULL;
5086 }
29b0f896
AM
5087 /* If we are in 16-bit mode, do not allow addr16 or data16.
5088 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5089 if ((current_templates->start->opcode_modifier.size == SIZE16
5090 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5091 && flag_code != CODE_64BIT
673fe0f0 5092 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5093 ^ (flag_code == CODE_16BIT)))
5094 {
5095 as_bad (_("redundant %s prefix"),
5096 current_templates->start->name);
5097 return NULL;
45288df1 5098 }
86fa6981 5099 if (current_templates->start->opcode_length == 0)
29b0f896 5100 {
86fa6981
L
5101 /* Handle pseudo prefixes. */
5102 switch (current_templates->start->base_opcode)
5103 {
5104 case 0x0:
5105 /* {disp8} */
5106 i.disp_encoding = disp_encoding_8bit;
5107 break;
5108 case 0x1:
5109 /* {disp32} */
5110 i.disp_encoding = disp_encoding_32bit;
5111 break;
5112 case 0x2:
5113 /* {load} */
5114 i.dir_encoding = dir_encoding_load;
5115 break;
5116 case 0x3:
5117 /* {store} */
5118 i.dir_encoding = dir_encoding_store;
5119 break;
5120 case 0x4:
42e04b36
L
5121 /* {vex} */
5122 i.vec_encoding = vex_encoding_vex;
86fa6981
L
5123 break;
5124 case 0x5:
5125 /* {vex3} */
5126 i.vec_encoding = vex_encoding_vex3;
5127 break;
5128 case 0x6:
5129 /* {evex} */
5130 i.vec_encoding = vex_encoding_evex;
5131 break;
6b6b6807
L
5132 case 0x7:
5133 /* {rex} */
5134 i.rex_encoding = TRUE;
5135 break;
b6f8c7c4
L
5136 case 0x8:
5137 /* {nooptimize} */
5138 i.no_optimize = TRUE;
5139 break;
86fa6981
L
5140 default:
5141 abort ();
5142 }
5143 }
5144 else
5145 {
5146 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5147 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5148 {
4e9ac44a
L
5149 case PREFIX_EXIST:
5150 return NULL;
5151 case PREFIX_DS:
d777820b 5152 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5153 i.notrack_prefix = current_templates->start->name;
5154 break;
5155 case PREFIX_REP:
5156 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5157 i.hle_prefix = current_templates->start->name;
5158 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5159 i.bnd_prefix = current_templates->start->name;
5160 else
5161 i.rep_prefix = current_templates->start->name;
5162 break;
5163 default:
5164 break;
86fa6981 5165 }
29b0f896
AM
5166 }
5167 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5168 token_start = ++l;
5169 }
5170 else
5171 break;
5172 }
45288df1 5173
30a55f88 5174 if (!current_templates)
b6169b20 5175 {
07d5e953
JB
5176 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5177 Check if we should swap operand or force 32bit displacement in
f8a5c266 5178 encoding. */
30a55f88 5179 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5180 i.dir_encoding = dir_encoding_swap;
8d63c93e 5181 else if (mnem_p - 3 == dot_p
a501d77e
L
5182 && dot_p[1] == 'd'
5183 && dot_p[2] == '8')
5184 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5185 else if (mnem_p - 4 == dot_p
f8a5c266
L
5186 && dot_p[1] == 'd'
5187 && dot_p[2] == '3'
5188 && dot_p[3] == '2')
a501d77e 5189 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5190 else
5191 goto check_suffix;
5192 mnem_p = dot_p;
5193 *dot_p = '\0';
d3ce72d0 5194 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
5195 }
5196
29b0f896
AM
5197 if (!current_templates)
5198 {
dc1e8a47 5199 check_suffix:
1c529385 5200 if (mnem_p > mnemonic)
29b0f896 5201 {
1c529385
LH
5202 /* See if we can get a match by trimming off a suffix. */
5203 switch (mnem_p[-1])
29b0f896 5204 {
1c529385
LH
5205 case WORD_MNEM_SUFFIX:
5206 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5207 i.suffix = SHORT_MNEM_SUFFIX;
5208 else
1c529385
LH
5209 /* Fall through. */
5210 case BYTE_MNEM_SUFFIX:
5211 case QWORD_MNEM_SUFFIX:
5212 i.suffix = mnem_p[-1];
29b0f896 5213 mnem_p[-1] = '\0';
d3ce72d0 5214 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
5215 mnemonic);
5216 break;
5217 case SHORT_MNEM_SUFFIX:
5218 case LONG_MNEM_SUFFIX:
5219 if (!intel_syntax)
5220 {
5221 i.suffix = mnem_p[-1];
5222 mnem_p[-1] = '\0';
5223 current_templates = (const templates *) hash_find (op_hash,
5224 mnemonic);
5225 }
5226 break;
5227
5228 /* Intel Syntax. */
5229 case 'd':
5230 if (intel_syntax)
5231 {
5232 if (intel_float_operand (mnemonic) == 1)
5233 i.suffix = SHORT_MNEM_SUFFIX;
5234 else
5235 i.suffix = LONG_MNEM_SUFFIX;
5236 mnem_p[-1] = '\0';
5237 current_templates = (const templates *) hash_find (op_hash,
5238 mnemonic);
5239 }
5240 break;
29b0f896 5241 }
29b0f896 5242 }
1c529385 5243
29b0f896
AM
5244 if (!current_templates)
5245 {
5246 as_bad (_("no such instruction: `%s'"), token_start);
5247 return NULL;
5248 }
5249 }
252b5132 5250
0cfa3eb3
JB
5251 if (current_templates->start->opcode_modifier.jump == JUMP
5252 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5253 {
5254 /* Check for a branch hint. We allow ",pt" and ",pn" for
5255 predict taken and predict not taken respectively.
5256 I'm not sure that branch hints actually do anything on loop
5257 and jcxz insns (JumpByte) for current Pentium4 chips. They
5258 may work in the future and it doesn't hurt to accept them
5259 now. */
5260 if (l[0] == ',' && l[1] == 'p')
5261 {
5262 if (l[2] == 't')
5263 {
5264 if (!add_prefix (DS_PREFIX_OPCODE))
5265 return NULL;
5266 l += 3;
5267 }
5268 else if (l[2] == 'n')
5269 {
5270 if (!add_prefix (CS_PREFIX_OPCODE))
5271 return NULL;
5272 l += 3;
5273 }
5274 }
5275 }
5276 /* Any other comma loses. */
5277 if (*l == ',')
5278 {
5279 as_bad (_("invalid character %s in mnemonic"),
5280 output_invalid (*l));
5281 return NULL;
5282 }
252b5132 5283
29b0f896 5284 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5285 supported = 0;
5286 for (t = current_templates->start; t < current_templates->end; ++t)
5287 {
c0f3af97
L
5288 supported |= cpu_flags_match (t);
5289 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5290 {
5291 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5292 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5293
548d0ee6
JB
5294 return l;
5295 }
29b0f896 5296 }
3629bb00 5297
548d0ee6
JB
5298 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5299 as_bad (flag_code == CODE_64BIT
5300 ? _("`%s' is not supported in 64-bit mode")
5301 : _("`%s' is only supported in 64-bit mode"),
5302 current_templates->start->name);
5303 else
5304 as_bad (_("`%s' is not supported on `%s%s'"),
5305 current_templates->start->name,
5306 cpu_arch_name ? cpu_arch_name : default_arch,
5307 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5308
548d0ee6 5309 return NULL;
29b0f896 5310}
252b5132 5311
29b0f896 5312static char *
e3bb37b5 5313parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5314{
5315 char *token_start;
3138f287 5316
29b0f896
AM
5317 /* 1 if operand is pending after ','. */
5318 unsigned int expecting_operand = 0;
252b5132 5319
29b0f896
AM
5320 /* Non-zero if operand parens not balanced. */
5321 unsigned int paren_not_balanced;
5322
5323 while (*l != END_OF_INSN)
5324 {
5325 /* Skip optional white space before operand. */
5326 if (is_space_char (*l))
5327 ++l;
d02603dc 5328 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5329 {
5330 as_bad (_("invalid character %s before operand %d"),
5331 output_invalid (*l),
5332 i.operands + 1);
5333 return NULL;
5334 }
d02603dc 5335 token_start = l; /* After white space. */
29b0f896
AM
5336 paren_not_balanced = 0;
5337 while (paren_not_balanced || *l != ',')
5338 {
5339 if (*l == END_OF_INSN)
5340 {
5341 if (paren_not_balanced)
5342 {
5343 if (!intel_syntax)
5344 as_bad (_("unbalanced parenthesis in operand %d."),
5345 i.operands + 1);
5346 else
5347 as_bad (_("unbalanced brackets in operand %d."),
5348 i.operands + 1);
5349 return NULL;
5350 }
5351 else
5352 break; /* we are done */
5353 }
d02603dc 5354 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5355 {
5356 as_bad (_("invalid character %s in operand %d"),
5357 output_invalid (*l),
5358 i.operands + 1);
5359 return NULL;
5360 }
5361 if (!intel_syntax)
5362 {
5363 if (*l == '(')
5364 ++paren_not_balanced;
5365 if (*l == ')')
5366 --paren_not_balanced;
5367 }
5368 else
5369 {
5370 if (*l == '[')
5371 ++paren_not_balanced;
5372 if (*l == ']')
5373 --paren_not_balanced;
5374 }
5375 l++;
5376 }
5377 if (l != token_start)
5378 { /* Yes, we've read in another operand. */
5379 unsigned int operand_ok;
5380 this_operand = i.operands++;
5381 if (i.operands > MAX_OPERANDS)
5382 {
5383 as_bad (_("spurious operands; (%d operands/instruction max)"),
5384 MAX_OPERANDS);
5385 return NULL;
5386 }
9d46ce34 5387 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5388 /* Now parse operand adding info to 'i' as we go along. */
5389 END_STRING_AND_SAVE (l);
5390
1286ab78
L
5391 if (i.mem_operands > 1)
5392 {
5393 as_bad (_("too many memory references for `%s'"),
5394 mnemonic);
5395 return 0;
5396 }
5397
29b0f896
AM
5398 if (intel_syntax)
5399 operand_ok =
5400 i386_intel_operand (token_start,
5401 intel_float_operand (mnemonic));
5402 else
a7619375 5403 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5404
5405 RESTORE_END_STRING (l);
5406 if (!operand_ok)
5407 return NULL;
5408 }
5409 else
5410 {
5411 if (expecting_operand)
5412 {
5413 expecting_operand_after_comma:
5414 as_bad (_("expecting operand after ','; got nothing"));
5415 return NULL;
5416 }
5417 if (*l == ',')
5418 {
5419 as_bad (_("expecting operand before ','; got nothing"));
5420 return NULL;
5421 }
5422 }
7f3f1ea2 5423
29b0f896
AM
5424 /* Now *l must be either ',' or END_OF_INSN. */
5425 if (*l == ',')
5426 {
5427 if (*++l == END_OF_INSN)
5428 {
5429 /* Just skip it, if it's \n complain. */
5430 goto expecting_operand_after_comma;
5431 }
5432 expecting_operand = 1;
5433 }
5434 }
5435 return l;
5436}
7f3f1ea2 5437
050dfa73 5438static void
4d456e3d 5439swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5440{
5441 union i386_op temp_op;
40fb9820 5442 i386_operand_type temp_type;
c48dadc9 5443 unsigned int temp_flags;
050dfa73 5444 enum bfd_reloc_code_real temp_reloc;
4eed87de 5445
050dfa73
MM
5446 temp_type = i.types[xchg2];
5447 i.types[xchg2] = i.types[xchg1];
5448 i.types[xchg1] = temp_type;
c48dadc9
JB
5449
5450 temp_flags = i.flags[xchg2];
5451 i.flags[xchg2] = i.flags[xchg1];
5452 i.flags[xchg1] = temp_flags;
5453
050dfa73
MM
5454 temp_op = i.op[xchg2];
5455 i.op[xchg2] = i.op[xchg1];
5456 i.op[xchg1] = temp_op;
c48dadc9 5457
050dfa73
MM
5458 temp_reloc = i.reloc[xchg2];
5459 i.reloc[xchg2] = i.reloc[xchg1];
5460 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5461
5462 if (i.mask)
5463 {
5464 if (i.mask->operand == xchg1)
5465 i.mask->operand = xchg2;
5466 else if (i.mask->operand == xchg2)
5467 i.mask->operand = xchg1;
5468 }
5469 if (i.broadcast)
5470 {
5471 if (i.broadcast->operand == xchg1)
5472 i.broadcast->operand = xchg2;
5473 else if (i.broadcast->operand == xchg2)
5474 i.broadcast->operand = xchg1;
5475 }
5476 if (i.rounding)
5477 {
5478 if (i.rounding->operand == xchg1)
5479 i.rounding->operand = xchg2;
5480 else if (i.rounding->operand == xchg2)
5481 i.rounding->operand = xchg1;
5482 }
050dfa73
MM
5483}
5484
29b0f896 5485static void
e3bb37b5 5486swap_operands (void)
29b0f896 5487{
b7c61d9a 5488 switch (i.operands)
050dfa73 5489 {
c0f3af97 5490 case 5:
b7c61d9a 5491 case 4:
4d456e3d 5492 swap_2_operands (1, i.operands - 2);
1a0670f3 5493 /* Fall through. */
b7c61d9a
L
5494 case 3:
5495 case 2:
4d456e3d 5496 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5497 break;
5498 default:
5499 abort ();
29b0f896 5500 }
29b0f896
AM
5501
5502 if (i.mem_operands == 2)
5503 {
5504 const seg_entry *temp_seg;
5505 temp_seg = i.seg[0];
5506 i.seg[0] = i.seg[1];
5507 i.seg[1] = temp_seg;
5508 }
5509}
252b5132 5510
29b0f896
AM
5511/* Try to ensure constant immediates are represented in the smallest
5512 opcode possible. */
5513static void
e3bb37b5 5514optimize_imm (void)
29b0f896
AM
5515{
5516 char guess_suffix = 0;
5517 int op;
252b5132 5518
29b0f896
AM
5519 if (i.suffix)
5520 guess_suffix = i.suffix;
5521 else if (i.reg_operands)
5522 {
5523 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5524 We can't do this properly yet, i.e. excluding special register
5525 instances, but the following works for instructions with
5526 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5527 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5528 if (i.types[op].bitfield.class != Reg)
5529 continue;
5530 else if (i.types[op].bitfield.byte)
7ab9ffdd 5531 {
40fb9820
L
5532 guess_suffix = BYTE_MNEM_SUFFIX;
5533 break;
5534 }
bab6aec1 5535 else if (i.types[op].bitfield.word)
252b5132 5536 {
40fb9820
L
5537 guess_suffix = WORD_MNEM_SUFFIX;
5538 break;
5539 }
bab6aec1 5540 else if (i.types[op].bitfield.dword)
40fb9820
L
5541 {
5542 guess_suffix = LONG_MNEM_SUFFIX;
5543 break;
5544 }
bab6aec1 5545 else if (i.types[op].bitfield.qword)
40fb9820
L
5546 {
5547 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5548 break;
252b5132 5549 }
29b0f896
AM
5550 }
5551 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5552 guess_suffix = WORD_MNEM_SUFFIX;
5553
5554 for (op = i.operands; --op >= 0;)
40fb9820 5555 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5556 {
5557 switch (i.op[op].imms->X_op)
252b5132 5558 {
29b0f896
AM
5559 case O_constant:
5560 /* If a suffix is given, this operand may be shortened. */
5561 switch (guess_suffix)
252b5132 5562 {
29b0f896 5563 case LONG_MNEM_SUFFIX:
40fb9820
L
5564 i.types[op].bitfield.imm32 = 1;
5565 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5566 break;
5567 case WORD_MNEM_SUFFIX:
40fb9820
L
5568 i.types[op].bitfield.imm16 = 1;
5569 i.types[op].bitfield.imm32 = 1;
5570 i.types[op].bitfield.imm32s = 1;
5571 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5572 break;
5573 case BYTE_MNEM_SUFFIX:
40fb9820
L
5574 i.types[op].bitfield.imm8 = 1;
5575 i.types[op].bitfield.imm8s = 1;
5576 i.types[op].bitfield.imm16 = 1;
5577 i.types[op].bitfield.imm32 = 1;
5578 i.types[op].bitfield.imm32s = 1;
5579 i.types[op].bitfield.imm64 = 1;
29b0f896 5580 break;
252b5132 5581 }
252b5132 5582
29b0f896
AM
5583 /* If this operand is at most 16 bits, convert it
5584 to a signed 16 bit number before trying to see
5585 whether it will fit in an even smaller size.
5586 This allows a 16-bit operand such as $0xffe0 to
5587 be recognised as within Imm8S range. */
40fb9820 5588 if ((i.types[op].bitfield.imm16)
29b0f896 5589 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5590 {
29b0f896
AM
5591 i.op[op].imms->X_add_number =
5592 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5593 }
a28def75
L
5594#ifdef BFD64
5595 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5596 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5597 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5598 == 0))
5599 {
5600 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5601 ^ ((offsetT) 1 << 31))
5602 - ((offsetT) 1 << 31));
5603 }
a28def75 5604#endif
40fb9820 5605 i.types[op]
c6fb90c8
L
5606 = operand_type_or (i.types[op],
5607 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5608
29b0f896
AM
5609 /* We must avoid matching of Imm32 templates when 64bit
5610 only immediate is available. */
5611 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5612 i.types[op].bitfield.imm32 = 0;
29b0f896 5613 break;
252b5132 5614
29b0f896
AM
5615 case O_absent:
5616 case O_register:
5617 abort ();
5618
5619 /* Symbols and expressions. */
5620 default:
9cd96992
JB
5621 /* Convert symbolic operand to proper sizes for matching, but don't
5622 prevent matching a set of insns that only supports sizes other
5623 than those matching the insn suffix. */
5624 {
40fb9820 5625 i386_operand_type mask, allowed;
d3ce72d0 5626 const insn_template *t;
9cd96992 5627
0dfbf9d7
L
5628 operand_type_set (&mask, 0);
5629 operand_type_set (&allowed, 0);
40fb9820 5630
4eed87de
AM
5631 for (t = current_templates->start;
5632 t < current_templates->end;
5633 ++t)
bab6aec1
JB
5634 {
5635 allowed = operand_type_or (allowed, t->operand_types[op]);
5636 allowed = operand_type_and (allowed, anyimm);
5637 }
9cd96992
JB
5638 switch (guess_suffix)
5639 {
5640 case QWORD_MNEM_SUFFIX:
40fb9820
L
5641 mask.bitfield.imm64 = 1;
5642 mask.bitfield.imm32s = 1;
9cd96992
JB
5643 break;
5644 case LONG_MNEM_SUFFIX:
40fb9820 5645 mask.bitfield.imm32 = 1;
9cd96992
JB
5646 break;
5647 case WORD_MNEM_SUFFIX:
40fb9820 5648 mask.bitfield.imm16 = 1;
9cd96992
JB
5649 break;
5650 case BYTE_MNEM_SUFFIX:
40fb9820 5651 mask.bitfield.imm8 = 1;
9cd96992
JB
5652 break;
5653 default:
9cd96992
JB
5654 break;
5655 }
c6fb90c8 5656 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5657 if (!operand_type_all_zero (&allowed))
c6fb90c8 5658 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5659 }
29b0f896 5660 break;
252b5132 5661 }
29b0f896
AM
5662 }
5663}
47926f60 5664
29b0f896
AM
5665/* Try to use the smallest displacement type too. */
5666static void
e3bb37b5 5667optimize_disp (void)
29b0f896
AM
5668{
5669 int op;
3e73aa7c 5670
29b0f896 5671 for (op = i.operands; --op >= 0;)
40fb9820 5672 if (operand_type_check (i.types[op], disp))
252b5132 5673 {
b300c311 5674 if (i.op[op].disps->X_op == O_constant)
252b5132 5675 {
91d6fa6a 5676 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5677
40fb9820 5678 if (i.types[op].bitfield.disp16
91d6fa6a 5679 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5680 {
5681 /* If this operand is at most 16 bits, convert
5682 to a signed 16 bit number and don't use 64bit
5683 displacement. */
91d6fa6a 5684 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5685 i.types[op].bitfield.disp64 = 0;
b300c311 5686 }
a28def75
L
5687#ifdef BFD64
5688 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5689 if (i.types[op].bitfield.disp32
91d6fa6a 5690 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5691 {
5692 /* If this operand is at most 32 bits, convert
5693 to a signed 32 bit number and don't use 64bit
5694 displacement. */
91d6fa6a
NC
5695 op_disp &= (((offsetT) 2 << 31) - 1);
5696 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5697 i.types[op].bitfield.disp64 = 0;
b300c311 5698 }
a28def75 5699#endif
91d6fa6a 5700 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5701 {
40fb9820
L
5702 i.types[op].bitfield.disp8 = 0;
5703 i.types[op].bitfield.disp16 = 0;
5704 i.types[op].bitfield.disp32 = 0;
5705 i.types[op].bitfield.disp32s = 0;
5706 i.types[op].bitfield.disp64 = 0;
b300c311
L
5707 i.op[op].disps = 0;
5708 i.disp_operands--;
5709 }
5710 else if (flag_code == CODE_64BIT)
5711 {
91d6fa6a 5712 if (fits_in_signed_long (op_disp))
28a9d8f5 5713 {
40fb9820
L
5714 i.types[op].bitfield.disp64 = 0;
5715 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5716 }
0e1147d9 5717 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5718 && fits_in_unsigned_long (op_disp))
40fb9820 5719 i.types[op].bitfield.disp32 = 1;
b300c311 5720 }
40fb9820
L
5721 if ((i.types[op].bitfield.disp32
5722 || i.types[op].bitfield.disp32s
5723 || i.types[op].bitfield.disp16)
b5014f7a 5724 && fits_in_disp8 (op_disp))
40fb9820 5725 i.types[op].bitfield.disp8 = 1;
252b5132 5726 }
67a4f2b7
AO
5727 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5728 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5729 {
5730 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5731 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5732 i.types[op].bitfield.disp8 = 0;
5733 i.types[op].bitfield.disp16 = 0;
5734 i.types[op].bitfield.disp32 = 0;
5735 i.types[op].bitfield.disp32s = 0;
5736 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5737 }
5738 else
b300c311 5739 /* We only support 64bit displacement on constants. */
40fb9820 5740 i.types[op].bitfield.disp64 = 0;
252b5132 5741 }
29b0f896
AM
5742}
5743
4a1b91ea
L
5744/* Return 1 if there is a match in broadcast bytes between operand
5745 GIVEN and instruction template T. */
5746
5747static INLINE int
5748match_broadcast_size (const insn_template *t, unsigned int given)
5749{
5750 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5751 && i.types[given].bitfield.byte)
5752 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5753 && i.types[given].bitfield.word)
5754 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5755 && i.types[given].bitfield.dword)
5756 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5757 && i.types[given].bitfield.qword));
5758}
5759
6c30d220
L
5760/* Check if operands are valid for the instruction. */
5761
5762static int
5763check_VecOperands (const insn_template *t)
5764{
43234a1e 5765 unsigned int op;
e2195274 5766 i386_cpu_flags cpu;
e2195274
JB
5767
5768 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5769 any one operand are implicity requiring AVX512VL support if the actual
5770 operand size is YMMword or XMMword. Since this function runs after
5771 template matching, there's no need to check for YMMword/XMMword in
5772 the template. */
5773 cpu = cpu_flags_and (t->cpu_flags, avx512);
5774 if (!cpu_flags_all_zero (&cpu)
5775 && !t->cpu_flags.bitfield.cpuavx512vl
5776 && !cpu_arch_flags.bitfield.cpuavx512vl)
5777 {
5778 for (op = 0; op < t->operands; ++op)
5779 {
5780 if (t->operand_types[op].bitfield.zmmword
5781 && (i.types[op].bitfield.ymmword
5782 || i.types[op].bitfield.xmmword))
5783 {
5784 i.error = unsupported;
5785 return 1;
5786 }
5787 }
5788 }
43234a1e 5789
6c30d220 5790 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 5791 if (!t->opcode_modifier.sib
6c30d220 5792 && i.index_reg
1b54b8d7
JB
5793 && (i.index_reg->reg_type.bitfield.xmmword
5794 || i.index_reg->reg_type.bitfield.ymmword
5795 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5796 {
5797 i.error = unsupported_vector_index_register;
5798 return 1;
5799 }
5800
ad8ecc81
MZ
5801 /* Check if default mask is allowed. */
5802 if (t->opcode_modifier.nodefmask
5803 && (!i.mask || i.mask->mask->reg_num == 0))
5804 {
5805 i.error = no_default_mask;
5806 return 1;
5807 }
5808
7bab8ab5
JB
5809 /* For VSIB byte, we need a vector register for index, and all vector
5810 registers must be distinct. */
260cd341 5811 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
5812 {
5813 if (!i.index_reg
63112cd6 5814 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 5815 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 5816 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 5817 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 5818 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 5819 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5820 {
5821 i.error = invalid_vsib_address;
5822 return 1;
5823 }
5824
43234a1e
L
5825 gas_assert (i.reg_operands == 2 || i.mask);
5826 if (i.reg_operands == 2 && !i.mask)
5827 {
3528c362 5828 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5829 gas_assert (i.types[0].bitfield.xmmword
5830 || i.types[0].bitfield.ymmword);
3528c362 5831 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5832 gas_assert (i.types[2].bitfield.xmmword
5833 || i.types[2].bitfield.ymmword);
43234a1e
L
5834 if (operand_check == check_none)
5835 return 0;
5836 if (register_number (i.op[0].regs)
5837 != register_number (i.index_reg)
5838 && register_number (i.op[2].regs)
5839 != register_number (i.index_reg)
5840 && register_number (i.op[0].regs)
5841 != register_number (i.op[2].regs))
5842 return 0;
5843 if (operand_check == check_error)
5844 {
5845 i.error = invalid_vector_register_set;
5846 return 1;
5847 }
5848 as_warn (_("mask, index, and destination registers should be distinct"));
5849 }
8444f82a
MZ
5850 else if (i.reg_operands == 1 && i.mask)
5851 {
3528c362 5852 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5853 && (i.types[1].bitfield.xmmword
5854 || i.types[1].bitfield.ymmword
5855 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5856 && (register_number (i.op[1].regs)
5857 == register_number (i.index_reg)))
5858 {
5859 if (operand_check == check_error)
5860 {
5861 i.error = invalid_vector_register_set;
5862 return 1;
5863 }
5864 if (operand_check != check_none)
5865 as_warn (_("index and destination registers should be distinct"));
5866 }
5867 }
43234a1e 5868 }
7bab8ab5 5869
260cd341
LC
5870 /* For AMX instructions with three tmmword operands, all tmmword operand must be
5871 distinct */
5872 if (t->operand_types[0].bitfield.tmmword
5873 && i.reg_operands == 3)
5874 {
5875 if (register_number (i.op[0].regs)
5876 == register_number (i.op[1].regs)
5877 || register_number (i.op[0].regs)
5878 == register_number (i.op[2].regs)
5879 || register_number (i.op[1].regs)
5880 == register_number (i.op[2].regs))
5881 {
5882 i.error = invalid_tmm_register_set;
5883 return 1;
5884 }
5885 }
5886
43234a1e
L
5887 /* Check if broadcast is supported by the instruction and is applied
5888 to the memory operand. */
5889 if (i.broadcast)
5890 {
8e6e0792 5891 i386_operand_type type, overlap;
43234a1e
L
5892
5893 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5894 and its broadcast bytes match the memory operand. */
32546502 5895 op = i.broadcast->operand;
8e6e0792 5896 if (!t->opcode_modifier.broadcast
c48dadc9 5897 || !(i.flags[op] & Operand_Mem)
c39e5b26 5898 || (!i.types[op].bitfield.unspecified
4a1b91ea 5899 && !match_broadcast_size (t, op)))
43234a1e
L
5900 {
5901 bad_broadcast:
5902 i.error = unsupported_broadcast;
5903 return 1;
5904 }
8e6e0792 5905
4a1b91ea
L
5906 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5907 * i.broadcast->type);
8e6e0792 5908 operand_type_set (&type, 0);
4a1b91ea 5909 switch (i.broadcast->bytes)
8e6e0792 5910 {
4a1b91ea
L
5911 case 2:
5912 type.bitfield.word = 1;
5913 break;
5914 case 4:
5915 type.bitfield.dword = 1;
5916 break;
8e6e0792
JB
5917 case 8:
5918 type.bitfield.qword = 1;
5919 break;
5920 case 16:
5921 type.bitfield.xmmword = 1;
5922 break;
5923 case 32:
5924 type.bitfield.ymmword = 1;
5925 break;
5926 case 64:
5927 type.bitfield.zmmword = 1;
5928 break;
5929 default:
5930 goto bad_broadcast;
5931 }
5932
5933 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5934 if (t->operand_types[op].bitfield.class == RegSIMD
5935 && t->operand_types[op].bitfield.byte
5936 + t->operand_types[op].bitfield.word
5937 + t->operand_types[op].bitfield.dword
5938 + t->operand_types[op].bitfield.qword > 1)
5939 {
5940 overlap.bitfield.xmmword = 0;
5941 overlap.bitfield.ymmword = 0;
5942 overlap.bitfield.zmmword = 0;
5943 }
8e6e0792
JB
5944 if (operand_type_all_zero (&overlap))
5945 goto bad_broadcast;
5946
5947 if (t->opcode_modifier.checkregsize)
5948 {
5949 unsigned int j;
5950
e2195274 5951 type.bitfield.baseindex = 1;
8e6e0792
JB
5952 for (j = 0; j < i.operands; ++j)
5953 {
5954 if (j != op
5955 && !operand_type_register_match(i.types[j],
5956 t->operand_types[j],
5957 type,
5958 t->operand_types[op]))
5959 goto bad_broadcast;
5960 }
5961 }
43234a1e
L
5962 }
5963 /* If broadcast is supported in this instruction, we need to check if
5964 operand of one-element size isn't specified without broadcast. */
5965 else if (t->opcode_modifier.broadcast && i.mem_operands)
5966 {
5967 /* Find memory operand. */
5968 for (op = 0; op < i.operands; op++)
8dc0818e 5969 if (i.flags[op] & Operand_Mem)
43234a1e
L
5970 break;
5971 gas_assert (op < i.operands);
5972 /* Check size of the memory operand. */
4a1b91ea 5973 if (match_broadcast_size (t, op))
43234a1e
L
5974 {
5975 i.error = broadcast_needed;
5976 return 1;
5977 }
5978 }
c39e5b26
JB
5979 else
5980 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5981
5982 /* Check if requested masking is supported. */
ae2387fe 5983 if (i.mask)
43234a1e 5984 {
ae2387fe
JB
5985 switch (t->opcode_modifier.masking)
5986 {
5987 case BOTH_MASKING:
5988 break;
5989 case MERGING_MASKING:
5990 if (i.mask->zeroing)
5991 {
5992 case 0:
5993 i.error = unsupported_masking;
5994 return 1;
5995 }
5996 break;
5997 case DYNAMIC_MASKING:
5998 /* Memory destinations allow only merging masking. */
5999 if (i.mask->zeroing && i.mem_operands)
6000 {
6001 /* Find memory operand. */
6002 for (op = 0; op < i.operands; op++)
c48dadc9 6003 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6004 break;
6005 gas_assert (op < i.operands);
6006 if (op == i.operands - 1)
6007 {
6008 i.error = unsupported_masking;
6009 return 1;
6010 }
6011 }
6012 break;
6013 default:
6014 abort ();
6015 }
43234a1e
L
6016 }
6017
6018 /* Check if masking is applied to dest operand. */
6019 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
6020 {
6021 i.error = mask_not_on_destination;
6022 return 1;
6023 }
6024
43234a1e
L
6025 /* Check RC/SAE. */
6026 if (i.rounding)
6027 {
a80195f1
JB
6028 if (!t->opcode_modifier.sae
6029 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6030 {
6031 i.error = unsupported_rc_sae;
6032 return 1;
6033 }
6034 /* If the instruction has several immediate operands and one of
6035 them is rounding, the rounding operand should be the last
6036 immediate operand. */
6037 if (i.imm_operands > 1
6038 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 6039 {
43234a1e 6040 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6041 return 1;
6042 }
6c30d220
L
6043 }
6044
da4977e0
JB
6045 /* Check the special Imm4 cases; must be the first operand. */
6046 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6047 {
6048 if (i.op[0].imms->X_op != O_constant
6049 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6050 {
6051 i.error = bad_imm4;
6052 return 1;
6053 }
6054
6055 /* Turn off Imm<N> so that update_imm won't complain. */
6056 operand_type_set (&i.types[0], 0);
6057 }
6058
43234a1e 6059 /* Check vector Disp8 operand. */
b5014f7a
JB
6060 if (t->opcode_modifier.disp8memshift
6061 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6062 {
6063 if (i.broadcast)
4a1b91ea 6064 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6065 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6066 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6067 else
6068 {
6069 const i386_operand_type *type = NULL;
6070
6071 i.memshift = 0;
6072 for (op = 0; op < i.operands; op++)
8dc0818e 6073 if (i.flags[op] & Operand_Mem)
7091c612 6074 {
4174bfff
JB
6075 if (t->opcode_modifier.evex == EVEXLIG)
6076 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6077 else if (t->operand_types[op].bitfield.xmmword
6078 + t->operand_types[op].bitfield.ymmword
6079 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6080 type = &t->operand_types[op];
6081 else if (!i.types[op].bitfield.unspecified)
6082 type = &i.types[op];
6083 }
3528c362 6084 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6085 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6086 {
6087 if (i.types[op].bitfield.zmmword)
6088 i.memshift = 6;
6089 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6090 i.memshift = 5;
6091 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6092 i.memshift = 4;
6093 }
6094
6095 if (type)
6096 {
6097 if (type->bitfield.zmmword)
6098 i.memshift = 6;
6099 else if (type->bitfield.ymmword)
6100 i.memshift = 5;
6101 else if (type->bitfield.xmmword)
6102 i.memshift = 4;
6103 }
6104
6105 /* For the check in fits_in_disp8(). */
6106 if (i.memshift == 0)
6107 i.memshift = -1;
6108 }
43234a1e
L
6109
6110 for (op = 0; op < i.operands; op++)
6111 if (operand_type_check (i.types[op], disp)
6112 && i.op[op].disps->X_op == O_constant)
6113 {
b5014f7a 6114 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6115 {
b5014f7a
JB
6116 i.types[op].bitfield.disp8 = 1;
6117 return 0;
43234a1e 6118 }
b5014f7a 6119 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6120 }
6121 }
b5014f7a
JB
6122
6123 i.memshift = 0;
43234a1e 6124
6c30d220
L
6125 return 0;
6126}
6127
da4977e0 6128/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6129
6130static int
da4977e0 6131VEX_check_encoding (const insn_template *t)
a683cc34 6132{
da4977e0
JB
6133 if (i.vec_encoding == vex_encoding_error)
6134 {
6135 i.error = unsupported;
6136 return 1;
6137 }
6138
86fa6981 6139 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6140 {
86fa6981 6141 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6142 if (!is_evex_encoding (t))
86fa6981
L
6143 {
6144 i.error = unsupported;
6145 return 1;
6146 }
6147 return 0;
43234a1e
L
6148 }
6149
a683cc34 6150 if (!t->opcode_modifier.vex)
86fa6981
L
6151 {
6152 /* This instruction template doesn't have VEX prefix. */
6153 if (i.vec_encoding != vex_encoding_default)
6154 {
6155 i.error = unsupported;
6156 return 1;
6157 }
6158 return 0;
6159 }
a683cc34 6160
a683cc34
SP
6161 return 0;
6162}
6163
d3ce72d0 6164static const insn_template *
83b16ac6 6165match_template (char mnem_suffix)
29b0f896
AM
6166{
6167 /* Points to template once we've found it. */
d3ce72d0 6168 const insn_template *t;
40fb9820 6169 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6170 i386_operand_type overlap4;
29b0f896 6171 unsigned int found_reverse_match;
dc2be329 6172 i386_opcode_modifier suffix_check;
40fb9820 6173 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6174 int addr_prefix_disp;
45a4bb20 6175 unsigned int j, size_match, check_register;
5614d22c 6176 enum i386_error specific_error = 0;
29b0f896 6177
c0f3af97
L
6178#if MAX_OPERANDS != 5
6179# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6180#endif
6181
29b0f896 6182 found_reverse_match = 0;
539e75ad 6183 addr_prefix_disp = -1;
40fb9820 6184
dc2be329 6185 /* Prepare for mnemonic suffix check. */
40fb9820 6186 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6187 switch (mnem_suffix)
6188 {
6189 case BYTE_MNEM_SUFFIX:
6190 suffix_check.no_bsuf = 1;
6191 break;
6192 case WORD_MNEM_SUFFIX:
6193 suffix_check.no_wsuf = 1;
6194 break;
6195 case SHORT_MNEM_SUFFIX:
6196 suffix_check.no_ssuf = 1;
6197 break;
6198 case LONG_MNEM_SUFFIX:
6199 suffix_check.no_lsuf = 1;
6200 break;
6201 case QWORD_MNEM_SUFFIX:
6202 suffix_check.no_qsuf = 1;
6203 break;
6204 default:
6205 /* NB: In Intel syntax, normally we can check for memory operand
6206 size when there is no mnemonic suffix. But jmp and call have
6207 2 different encodings with Dword memory operand size, one with
6208 No_ldSuf and the other without. i.suffix is set to
6209 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6210 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6211 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6212 }
6213
01559ecc
L
6214 /* Must have right number of operands. */
6215 i.error = number_of_operands_mismatch;
6216
45aa61fe 6217 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6218 {
539e75ad 6219 addr_prefix_disp = -1;
dbbc8b7e 6220 found_reverse_match = 0;
539e75ad 6221
29b0f896
AM
6222 if (i.operands != t->operands)
6223 continue;
6224
50aecf8c 6225 /* Check processor support. */
a65babc9 6226 i.error = unsupported;
45a4bb20 6227 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6228 continue;
6229
e1d4d893 6230 /* Check AT&T mnemonic. */
a65babc9 6231 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6232 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6233 continue;
6234
4b5aaf5f 6235 /* Check AT&T/Intel syntax. */
a65babc9 6236 i.error = unsupported_syntax;
5c07affc 6237 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6238 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6239 continue;
6240
4b5aaf5f
L
6241 /* Check Intel64/AMD64 ISA. */
6242 switch (isa64)
6243 {
6244 default:
6245 /* Default: Don't accept Intel64. */
6246 if (t->opcode_modifier.isa64 == INTEL64)
6247 continue;
6248 break;
6249 case amd64:
6250 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6251 if (t->opcode_modifier.isa64 >= INTEL64)
6252 continue;
6253 break;
6254 case intel64:
6255 /* -mintel64: Don't accept AMD64. */
5990e377 6256 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6257 continue;
6258 break;
6259 }
6260
dc2be329 6261 /* Check the suffix. */
a65babc9 6262 i.error = invalid_instruction_suffix;
dc2be329
L
6263 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6264 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6265 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6266 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6267 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6268 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6269 continue;
29b0f896 6270
3ac21baa
JB
6271 size_match = operand_size_match (t);
6272 if (!size_match)
7d5e4556 6273 continue;
539e75ad 6274
6f2f06be
JB
6275 /* This is intentionally not
6276
0cfa3eb3 6277 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6278
6279 as the case of a missing * on the operand is accepted (perhaps with
6280 a warning, issued further down). */
0cfa3eb3 6281 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6282 {
6283 i.error = operand_type_mismatch;
6284 continue;
6285 }
6286
5c07affc
L
6287 for (j = 0; j < MAX_OPERANDS; j++)
6288 operand_types[j] = t->operand_types[j];
6289
e365e234
JB
6290 /* In general, don't allow
6291 - 64-bit operands outside of 64-bit mode,
6292 - 32-bit operands on pre-386. */
4873e243 6293 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6294 if (((i.suffix == QWORD_MNEM_SUFFIX
6295 && flag_code != CODE_64BIT
6296 && (t->base_opcode != 0x0fc7
6297 || t->extension_opcode != 1 /* cmpxchg8b */))
6298 || (i.suffix == LONG_MNEM_SUFFIX
6299 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6300 && (intel_syntax
3cd7f3e3 6301 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6302 && !intel_float_operand (t->name))
6303 : intel_float_operand (t->name) != 2)
4873e243
JB
6304 && (t->operands == i.imm_operands
6305 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6306 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6307 && operand_types[i.imm_operands].bitfield.class != RegMask)
6308 || (operand_types[j].bitfield.class != RegMMX
6309 && operand_types[j].bitfield.class != RegSIMD
6310 && operand_types[j].bitfield.class != RegMask))
63112cd6 6311 && !t->opcode_modifier.sib)
192dc9c6
JB
6312 continue;
6313
29b0f896 6314 /* Do not verify operands when there are none. */
e365e234 6315 if (!t->operands)
da4977e0
JB
6316 {
6317 if (VEX_check_encoding (t))
6318 {
6319 specific_error = i.error;
6320 continue;
6321 }
6322
6323 /* We've found a match; break out of loop. */
6324 break;
6325 }
252b5132 6326
48bcea9f
JB
6327 if (!t->opcode_modifier.jump
6328 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6329 {
6330 /* There should be only one Disp operand. */
6331 for (j = 0; j < MAX_OPERANDS; j++)
6332 if (operand_type_check (operand_types[j], disp))
539e75ad 6333 break;
48bcea9f
JB
6334 if (j < MAX_OPERANDS)
6335 {
6336 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6337
6338 addr_prefix_disp = j;
6339
6340 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6341 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6342 switch (flag_code)
40fb9820 6343 {
48bcea9f
JB
6344 case CODE_16BIT:
6345 override = !override;
6346 /* Fall through. */
6347 case CODE_32BIT:
6348 if (operand_types[j].bitfield.disp32
6349 && operand_types[j].bitfield.disp16)
40fb9820 6350 {
48bcea9f
JB
6351 operand_types[j].bitfield.disp16 = override;
6352 operand_types[j].bitfield.disp32 = !override;
40fb9820 6353 }
48bcea9f
JB
6354 operand_types[j].bitfield.disp32s = 0;
6355 operand_types[j].bitfield.disp64 = 0;
6356 break;
6357
6358 case CODE_64BIT:
6359 if (operand_types[j].bitfield.disp32s
6360 || operand_types[j].bitfield.disp64)
40fb9820 6361 {
48bcea9f
JB
6362 operand_types[j].bitfield.disp64 &= !override;
6363 operand_types[j].bitfield.disp32s &= !override;
6364 operand_types[j].bitfield.disp32 = override;
40fb9820 6365 }
48bcea9f
JB
6366 operand_types[j].bitfield.disp16 = 0;
6367 break;
40fb9820 6368 }
539e75ad 6369 }
48bcea9f 6370 }
539e75ad 6371
02a86693
L
6372 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6373 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6374 continue;
6375
56ffb741 6376 /* We check register size if needed. */
e2195274
JB
6377 if (t->opcode_modifier.checkregsize)
6378 {
6379 check_register = (1 << t->operands) - 1;
6380 if (i.broadcast)
6381 check_register &= ~(1 << i.broadcast->operand);
6382 }
6383 else
6384 check_register = 0;
6385
c6fb90c8 6386 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6387 switch (t->operands)
6388 {
6389 case 1:
40fb9820 6390 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6391 continue;
6392 break;
6393 case 2:
33eaf5de 6394 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6395 only in 32bit mode and we can use opcode 0x90. In 64bit
6396 mode, we can't use 0x90 for xchg %eax, %eax since it should
6397 zero-extend %eax to %rax. */
6398 if (flag_code == CODE_64BIT
6399 && t->base_opcode == 0x90
75e5731b
JB
6400 && i.types[0].bitfield.instance == Accum
6401 && i.types[0].bitfield.dword
6402 && i.types[1].bitfield.instance == Accum
6403 && i.types[1].bitfield.dword)
8b38ad71 6404 continue;
1212781b
JB
6405 /* xrelease mov %eax, <disp> is another special case. It must not
6406 match the accumulator-only encoding of mov. */
6407 if (flag_code != CODE_64BIT
6408 && i.hle_prefix
6409 && t->base_opcode == 0xa0
75e5731b 6410 && i.types[0].bitfield.instance == Accum
8dc0818e 6411 && (i.flags[1] & Operand_Mem))
1212781b 6412 continue;
f5eb1d70
JB
6413 /* Fall through. */
6414
6415 case 3:
3ac21baa
JB
6416 if (!(size_match & MATCH_STRAIGHT))
6417 goto check_reverse;
64c49ab3
JB
6418 /* Reverse direction of operands if swapping is possible in the first
6419 place (operands need to be symmetric) and
6420 - the load form is requested, and the template is a store form,
6421 - the store form is requested, and the template is a load form,
6422 - the non-default (swapped) form is requested. */
6423 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6424 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6425 && !operand_type_all_zero (&overlap1))
6426 switch (i.dir_encoding)
6427 {
6428 case dir_encoding_load:
6429 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6430 || t->opcode_modifier.regmem)
64c49ab3
JB
6431 goto check_reverse;
6432 break;
6433
6434 case dir_encoding_store:
6435 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6436 && !t->opcode_modifier.regmem)
64c49ab3
JB
6437 goto check_reverse;
6438 break;
6439
6440 case dir_encoding_swap:
6441 goto check_reverse;
6442
6443 case dir_encoding_default:
6444 break;
6445 }
86fa6981 6446 /* If we want store form, we skip the current load. */
64c49ab3
JB
6447 if ((i.dir_encoding == dir_encoding_store
6448 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6449 && i.mem_operands == 0
6450 && t->opcode_modifier.load)
fa99fab2 6451 continue;
1a0670f3 6452 /* Fall through. */
f48ff2ae 6453 case 4:
c0f3af97 6454 case 5:
c6fb90c8 6455 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6456 if (!operand_type_match (overlap0, i.types[0])
6457 || !operand_type_match (overlap1, i.types[1])
e2195274 6458 || ((check_register & 3) == 3
dc821c5f 6459 && !operand_type_register_match (i.types[0],
40fb9820 6460 operand_types[0],
dc821c5f 6461 i.types[1],
40fb9820 6462 operand_types[1])))
29b0f896
AM
6463 {
6464 /* Check if other direction is valid ... */
38e314eb 6465 if (!t->opcode_modifier.d)
29b0f896
AM
6466 continue;
6467
dc1e8a47 6468 check_reverse:
3ac21baa
JB
6469 if (!(size_match & MATCH_REVERSE))
6470 continue;
29b0f896 6471 /* Try reversing direction of operands. */
f5eb1d70
JB
6472 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6473 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6474 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6475 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6476 || (check_register
dc821c5f 6477 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6478 operand_types[i.operands - 1],
6479 i.types[i.operands - 1],
45664ddb 6480 operand_types[0])))
29b0f896
AM
6481 {
6482 /* Does not match either direction. */
6483 continue;
6484 }
38e314eb 6485 /* found_reverse_match holds which of D or FloatR
29b0f896 6486 we've found. */
38e314eb
JB
6487 if (!t->opcode_modifier.d)
6488 found_reverse_match = 0;
6489 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6490 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6491 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6492 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6493 || operand_types[0].bitfield.class == RegMMX
6494 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6495 || is_any_vex_encoding(t))
6496 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6497 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6498 else
38e314eb 6499 found_reverse_match = Opcode_D;
40fb9820 6500 if (t->opcode_modifier.floatr)
8a2ed489 6501 found_reverse_match |= Opcode_FloatR;
29b0f896 6502 }
f48ff2ae 6503 else
29b0f896 6504 {
f48ff2ae 6505 /* Found a forward 2 operand match here. */
d1cbb4db
L
6506 switch (t->operands)
6507 {
c0f3af97
L
6508 case 5:
6509 overlap4 = operand_type_and (i.types[4],
6510 operand_types[4]);
1a0670f3 6511 /* Fall through. */
d1cbb4db 6512 case 4:
c6fb90c8
L
6513 overlap3 = operand_type_and (i.types[3],
6514 operand_types[3]);
1a0670f3 6515 /* Fall through. */
d1cbb4db 6516 case 3:
c6fb90c8
L
6517 overlap2 = operand_type_and (i.types[2],
6518 operand_types[2]);
d1cbb4db
L
6519 break;
6520 }
29b0f896 6521
f48ff2ae
L
6522 switch (t->operands)
6523 {
c0f3af97
L
6524 case 5:
6525 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6526 || !operand_type_register_match (i.types[3],
c0f3af97 6527 operand_types[3],
c0f3af97
L
6528 i.types[4],
6529 operand_types[4]))
6530 continue;
1a0670f3 6531 /* Fall through. */
f48ff2ae 6532 case 4:
40fb9820 6533 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6534 || ((check_register & 0xa) == 0xa
6535 && !operand_type_register_match (i.types[1],
f7768225
JB
6536 operand_types[1],
6537 i.types[3],
e2195274
JB
6538 operand_types[3]))
6539 || ((check_register & 0xc) == 0xc
6540 && !operand_type_register_match (i.types[2],
6541 operand_types[2],
6542 i.types[3],
6543 operand_types[3])))
f48ff2ae 6544 continue;
1a0670f3 6545 /* Fall through. */
f48ff2ae
L
6546 case 3:
6547 /* Here we make use of the fact that there are no
23e42951 6548 reverse match 3 operand instructions. */
40fb9820 6549 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6550 || ((check_register & 5) == 5
6551 && !operand_type_register_match (i.types[0],
23e42951
JB
6552 operand_types[0],
6553 i.types[2],
e2195274
JB
6554 operand_types[2]))
6555 || ((check_register & 6) == 6
6556 && !operand_type_register_match (i.types[1],
6557 operand_types[1],
6558 i.types[2],
6559 operand_types[2])))
f48ff2ae
L
6560 continue;
6561 break;
6562 }
29b0f896 6563 }
f48ff2ae 6564 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6565 slip through to break. */
6566 }
c0f3af97 6567
da4977e0
JB
6568 /* Check if vector operands are valid. */
6569 if (check_VecOperands (t))
6570 {
6571 specific_error = i.error;
6572 continue;
6573 }
6574
6575 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6576 if (VEX_check_encoding (t))
5614d22c
JB
6577 {
6578 specific_error = i.error;
6579 continue;
6580 }
a683cc34 6581
29b0f896
AM
6582 /* We've found a match; break out of loop. */
6583 break;
6584 }
6585
6586 if (t == current_templates->end)
6587 {
6588 /* We found no match. */
a65babc9 6589 const char *err_msg;
5614d22c 6590 switch (specific_error ? specific_error : i.error)
a65babc9
L
6591 {
6592 default:
6593 abort ();
86e026a4 6594 case operand_size_mismatch:
a65babc9
L
6595 err_msg = _("operand size mismatch");
6596 break;
6597 case operand_type_mismatch:
6598 err_msg = _("operand type mismatch");
6599 break;
6600 case register_type_mismatch:
6601 err_msg = _("register type mismatch");
6602 break;
6603 case number_of_operands_mismatch:
6604 err_msg = _("number of operands mismatch");
6605 break;
6606 case invalid_instruction_suffix:
6607 err_msg = _("invalid instruction suffix");
6608 break;
6609 case bad_imm4:
4a2608e3 6610 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6611 break;
a65babc9
L
6612 case unsupported_with_intel_mnemonic:
6613 err_msg = _("unsupported with Intel mnemonic");
6614 break;
6615 case unsupported_syntax:
6616 err_msg = _("unsupported syntax");
6617 break;
6618 case unsupported:
35262a23 6619 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6620 current_templates->start->name);
6621 return NULL;
260cd341
LC
6622 case invalid_sib_address:
6623 err_msg = _("invalid SIB address");
6624 break;
6c30d220
L
6625 case invalid_vsib_address:
6626 err_msg = _("invalid VSIB address");
6627 break;
7bab8ab5
JB
6628 case invalid_vector_register_set:
6629 err_msg = _("mask, index, and destination registers must be distinct");
6630 break;
260cd341
LC
6631 case invalid_tmm_register_set:
6632 err_msg = _("all tmm registers must be distinct");
6633 break;
6c30d220
L
6634 case unsupported_vector_index_register:
6635 err_msg = _("unsupported vector index register");
6636 break;
43234a1e
L
6637 case unsupported_broadcast:
6638 err_msg = _("unsupported broadcast");
6639 break;
43234a1e
L
6640 case broadcast_needed:
6641 err_msg = _("broadcast is needed for operand of such type");
6642 break;
6643 case unsupported_masking:
6644 err_msg = _("unsupported masking");
6645 break;
6646 case mask_not_on_destination:
6647 err_msg = _("mask not on destination operand");
6648 break;
6649 case no_default_mask:
6650 err_msg = _("default mask isn't allowed");
6651 break;
6652 case unsupported_rc_sae:
6653 err_msg = _("unsupported static rounding/sae");
6654 break;
6655 case rc_sae_operand_not_last_imm:
6656 if (intel_syntax)
6657 err_msg = _("RC/SAE operand must precede immediate operands");
6658 else
6659 err_msg = _("RC/SAE operand must follow immediate operands");
6660 break;
6661 case invalid_register_operand:
6662 err_msg = _("invalid register operand");
6663 break;
a65babc9
L
6664 }
6665 as_bad (_("%s for `%s'"), err_msg,
891edac4 6666 current_templates->start->name);
fa99fab2 6667 return NULL;
29b0f896 6668 }
252b5132 6669
29b0f896
AM
6670 if (!quiet_warnings)
6671 {
6672 if (!intel_syntax
0cfa3eb3 6673 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6674 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6675
40fb9820 6676 if (t->opcode_modifier.isprefix
3cd7f3e3 6677 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6678 {
6679 /* Warn them that a data or address size prefix doesn't
6680 affect assembly of the next line of code. */
6681 as_warn (_("stand-alone `%s' prefix"), t->name);
6682 }
6683 }
6684
6685 /* Copy the template we found. */
6686 i.tm = *t;
539e75ad
L
6687
6688 if (addr_prefix_disp != -1)
6689 i.tm.operand_types[addr_prefix_disp]
6690 = operand_types[addr_prefix_disp];
6691
29b0f896
AM
6692 if (found_reverse_match)
6693 {
dfd69174
JB
6694 /* If we found a reverse match we must alter the opcode direction
6695 bit and clear/flip the regmem modifier one. found_reverse_match
6696 holds bits to change (different for int & float insns). */
29b0f896
AM
6697
6698 i.tm.base_opcode ^= found_reverse_match;
6699
f5eb1d70
JB
6700 i.tm.operand_types[0] = operand_types[i.operands - 1];
6701 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6702
6703 /* Certain SIMD insns have their load forms specified in the opcode
6704 table, and hence we need to _set_ RegMem instead of clearing it.
6705 We need to avoid setting the bit though on insns like KMOVW. */
6706 i.tm.opcode_modifier.regmem
6707 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6708 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6709 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6710 }
6711
fa99fab2 6712 return t;
29b0f896
AM
6713}
6714
6715static int
e3bb37b5 6716check_string (void)
29b0f896 6717{
51c8edf6
JB
6718 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6719 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6720
51c8edf6 6721 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6722 {
51c8edf6
JB
6723 as_bad (_("`%s' operand %u must use `%ses' segment"),
6724 i.tm.name,
6725 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6726 register_prefix);
6727 return 0;
29b0f896 6728 }
51c8edf6
JB
6729
6730 /* There's only ever one segment override allowed per instruction.
6731 This instruction possibly has a legal segment override on the
6732 second operand, so copy the segment to where non-string
6733 instructions store it, allowing common code. */
6734 i.seg[op] = i.seg[1];
6735
29b0f896
AM
6736 return 1;
6737}
6738
6739static int
543613e9 6740process_suffix (void)
29b0f896
AM
6741{
6742 /* If matched instruction specifies an explicit instruction mnemonic
6743 suffix, use it. */
673fe0f0 6744 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6745 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6746 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6747 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6748 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6749 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6750 else if (i.reg_operands
c8f8eebc
JB
6751 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6752 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6753 {
65fca059
JB
6754 unsigned int numop = i.operands;
6755
6756 /* movsx/movzx want only their source operand considered here, for the
6757 ambiguity checking below. The suffix will be replaced afterwards
6758 to represent the destination (register). */
6759 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6760 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6761 --i.operands;
6762
643bb870
JB
6763 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6764 if (i.tm.base_opcode == 0xf20f38f0
6765 && i.tm.operand_types[1].bitfield.qword)
6766 i.rex |= REX_W;
6767
29b0f896 6768 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6769 based on GPR operands. */
29b0f896
AM
6770 if (!i.suffix)
6771 {
6772 /* We take i.suffix from the last register operand specified,
6773 Destination register type is more significant than source
381d071f
L
6774 register type. crc32 in SSE4.2 prefers source register
6775 type. */
1a035124 6776 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6777
1a035124
JB
6778 while (op--)
6779 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6780 || i.tm.operand_types[op].bitfield.instance == Accum)
6781 {
6782 if (i.types[op].bitfield.class != Reg)
6783 continue;
6784 if (i.types[op].bitfield.byte)
6785 i.suffix = BYTE_MNEM_SUFFIX;
6786 else if (i.types[op].bitfield.word)
6787 i.suffix = WORD_MNEM_SUFFIX;
6788 else if (i.types[op].bitfield.dword)
6789 i.suffix = LONG_MNEM_SUFFIX;
6790 else if (i.types[op].bitfield.qword)
6791 i.suffix = QWORD_MNEM_SUFFIX;
6792 else
6793 continue;
6794 break;
6795 }
65fca059
JB
6796
6797 /* As an exception, movsx/movzx silently default to a byte source
6798 in AT&T mode. */
6799 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6800 && !i.suffix && !intel_syntax)
6801 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6802 }
6803 else if (i.suffix == BYTE_MNEM_SUFFIX)
6804 {
2eb952a4 6805 if (intel_syntax
3cd7f3e3 6806 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6807 && i.tm.opcode_modifier.no_bsuf)
6808 i.suffix = 0;
6809 else if (!check_byte_reg ())
29b0f896
AM
6810 return 0;
6811 }
6812 else if (i.suffix == LONG_MNEM_SUFFIX)
6813 {
2eb952a4 6814 if (intel_syntax
3cd7f3e3 6815 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6816 && i.tm.opcode_modifier.no_lsuf
6817 && !i.tm.opcode_modifier.todword
6818 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6819 i.suffix = 0;
6820 else if (!check_long_reg ())
29b0f896
AM
6821 return 0;
6822 }
6823 else if (i.suffix == QWORD_MNEM_SUFFIX)
6824 {
955e1e6a 6825 if (intel_syntax
3cd7f3e3 6826 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6827 && i.tm.opcode_modifier.no_qsuf
6828 && !i.tm.opcode_modifier.todword
6829 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6830 i.suffix = 0;
6831 else if (!check_qword_reg ())
29b0f896
AM
6832 return 0;
6833 }
6834 else if (i.suffix == WORD_MNEM_SUFFIX)
6835 {
2eb952a4 6836 if (intel_syntax
3cd7f3e3 6837 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6838 && i.tm.opcode_modifier.no_wsuf)
6839 i.suffix = 0;
6840 else if (!check_word_reg ())
29b0f896
AM
6841 return 0;
6842 }
3cd7f3e3
L
6843 else if (intel_syntax
6844 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6845 /* Do nothing if the instruction is going to ignore the prefix. */
6846 ;
6847 else
6848 abort ();
65fca059
JB
6849
6850 /* Undo the movsx/movzx change done above. */
6851 i.operands = numop;
29b0f896 6852 }
3cd7f3e3
L
6853 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6854 && !i.suffix)
29b0f896 6855 {
13e600d0
JB
6856 i.suffix = stackop_size;
6857 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6858 {
6859 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6860 .code16gcc directive to support 16-bit mode with
6861 32-bit address. For IRET without a suffix, generate
6862 16-bit IRET (opcode 0xcf) to return from an interrupt
6863 handler. */
13e600d0
JB
6864 if (i.tm.base_opcode == 0xcf)
6865 {
6866 i.suffix = WORD_MNEM_SUFFIX;
6867 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6868 }
6869 /* Warn about changed behavior for segment register push/pop. */
6870 else if ((i.tm.base_opcode | 1) == 0x07)
6871 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6872 i.tm.name);
06f74c5c 6873 }
29b0f896 6874 }
c006a730 6875 else if (!i.suffix
0cfa3eb3
JB
6876 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6877 || i.tm.opcode_modifier.jump == JUMP_BYTE
6878 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6879 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6880 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6881 {
6882 switch (flag_code)
6883 {
6884 case CODE_64BIT:
40fb9820 6885 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6886 {
828c2a25
JB
6887 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6888 || i.tm.opcode_modifier.no_lsuf)
6889 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6890 break;
6891 }
1a0670f3 6892 /* Fall through. */
9306ca4a 6893 case CODE_32BIT:
40fb9820 6894 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6895 i.suffix = LONG_MNEM_SUFFIX;
6896 break;
6897 case CODE_16BIT:
40fb9820 6898 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6899 i.suffix = WORD_MNEM_SUFFIX;
6900 break;
6901 }
6902 }
252b5132 6903
c006a730 6904 if (!i.suffix
3cd7f3e3 6905 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6906 /* Also cover lret/retf/iret in 64-bit mode. */
6907 || (flag_code == CODE_64BIT
6908 && !i.tm.opcode_modifier.no_lsuf
6909 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6910 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
6911 /* Explicit sizing prefixes are assumed to disambiguate insns. */
6912 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
6913 /* Accept FLDENV et al without suffix. */
6914 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6915 {
6c0946d0 6916 unsigned int suffixes, evex = 0;
c006a730
JB
6917
6918 suffixes = !i.tm.opcode_modifier.no_bsuf;
6919 if (!i.tm.opcode_modifier.no_wsuf)
6920 suffixes |= 1 << 1;
6921 if (!i.tm.opcode_modifier.no_lsuf)
6922 suffixes |= 1 << 2;
6923 if (!i.tm.opcode_modifier.no_ldsuf)
6924 suffixes |= 1 << 3;
6925 if (!i.tm.opcode_modifier.no_ssuf)
6926 suffixes |= 1 << 4;
6927 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6928 suffixes |= 1 << 5;
6929
6c0946d0
JB
6930 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6931 also suitable for AT&T syntax mode, it was requested that this be
6932 restricted to just Intel syntax. */
b9915cbc 6933 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6934 {
b9915cbc 6935 unsigned int op;
6c0946d0 6936
b9915cbc 6937 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6938 {
b9915cbc
JB
6939 if (is_evex_encoding (&i.tm)
6940 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6941 {
b9915cbc
JB
6942 if (i.tm.operand_types[op].bitfield.ymmword)
6943 i.tm.operand_types[op].bitfield.xmmword = 0;
6944 if (i.tm.operand_types[op].bitfield.zmmword)
6945 i.tm.operand_types[op].bitfield.ymmword = 0;
6946 if (!i.tm.opcode_modifier.evex
6947 || i.tm.opcode_modifier.evex == EVEXDYN)
6948 i.tm.opcode_modifier.evex = EVEX512;
6949 }
6c0946d0 6950
b9915cbc
JB
6951 if (i.tm.operand_types[op].bitfield.xmmword
6952 + i.tm.operand_types[op].bitfield.ymmword
6953 + i.tm.operand_types[op].bitfield.zmmword < 2)
6954 continue;
6c0946d0 6955
b9915cbc
JB
6956 /* Any properly sized operand disambiguates the insn. */
6957 if (i.types[op].bitfield.xmmword
6958 || i.types[op].bitfield.ymmword
6959 || i.types[op].bitfield.zmmword)
6960 {
6961 suffixes &= ~(7 << 6);
6962 evex = 0;
6963 break;
6964 }
6c0946d0 6965
b9915cbc
JB
6966 if ((i.flags[op] & Operand_Mem)
6967 && i.tm.operand_types[op].bitfield.unspecified)
6968 {
6969 if (i.tm.operand_types[op].bitfield.xmmword)
6970 suffixes |= 1 << 6;
6971 if (i.tm.operand_types[op].bitfield.ymmword)
6972 suffixes |= 1 << 7;
6973 if (i.tm.operand_types[op].bitfield.zmmword)
6974 suffixes |= 1 << 8;
6975 if (is_evex_encoding (&i.tm))
6976 evex = EVEX512;
6c0946d0
JB
6977 }
6978 }
6979 }
6980
6981 /* Are multiple suffixes / operand sizes allowed? */
c006a730 6982 if (suffixes & (suffixes - 1))
9306ca4a 6983 {
873494c8 6984 if (intel_syntax
3cd7f3e3 6985 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 6986 || operand_check == check_error))
9306ca4a 6987 {
c006a730 6988 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
6989 return 0;
6990 }
c006a730 6991 if (operand_check == check_error)
9306ca4a 6992 {
c006a730
JB
6993 as_bad (_("no instruction mnemonic suffix given and "
6994 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
6995 return 0;
6996 }
c006a730 6997 if (operand_check == check_warning)
873494c8
JB
6998 as_warn (_("%s; using default for `%s'"),
6999 intel_syntax
7000 ? _("ambiguous operand size")
7001 : _("no instruction mnemonic suffix given and "
7002 "no register operands"),
7003 i.tm.name);
c006a730
JB
7004
7005 if (i.tm.opcode_modifier.floatmf)
7006 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
7007 else if ((i.tm.base_opcode | 8) == 0xfbe
7008 || (i.tm.base_opcode == 0x63
7009 && i.tm.cpu_flags.bitfield.cpu64))
7010 /* handled below */;
6c0946d0
JB
7011 else if (evex)
7012 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7013 else if (flag_code == CODE_16BIT)
7014 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7015 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7016 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7017 else
7018 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7019 }
29b0f896 7020 }
252b5132 7021
65fca059
JB
7022 if ((i.tm.base_opcode | 8) == 0xfbe
7023 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
7024 {
7025 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7026 In AT&T syntax, if there is no suffix (warned about above), the default
7027 will be byte extension. */
7028 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7029 i.tm.base_opcode |= 1;
7030
7031 /* For further processing, the suffix should represent the destination
7032 (register). This is already the case when one was used with
7033 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7034 no suffix to begin with. */
7035 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7036 {
7037 if (i.types[1].bitfield.word)
7038 i.suffix = WORD_MNEM_SUFFIX;
7039 else if (i.types[1].bitfield.qword)
7040 i.suffix = QWORD_MNEM_SUFFIX;
7041 else
7042 i.suffix = LONG_MNEM_SUFFIX;
7043
7044 i.tm.opcode_modifier.w = 0;
7045 }
7046 }
7047
50128d0c
JB
7048 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7049 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7050 != (i.tm.operand_types[1].bitfield.class == Reg);
7051
d2224064
JB
7052 /* Change the opcode based on the operand size given by i.suffix. */
7053 switch (i.suffix)
29b0f896 7054 {
d2224064
JB
7055 /* Size floating point instruction. */
7056 case LONG_MNEM_SUFFIX:
7057 if (i.tm.opcode_modifier.floatmf)
7058 {
7059 i.tm.base_opcode ^= 4;
7060 break;
7061 }
7062 /* fall through */
7063 case WORD_MNEM_SUFFIX:
7064 case QWORD_MNEM_SUFFIX:
29b0f896 7065 /* It's not a byte, select word/dword operation. */
40fb9820 7066 if (i.tm.opcode_modifier.w)
29b0f896 7067 {
50128d0c 7068 if (i.short_form)
29b0f896
AM
7069 i.tm.base_opcode |= 8;
7070 else
7071 i.tm.base_opcode |= 1;
7072 }
d2224064
JB
7073 /* fall through */
7074 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7075 /* Now select between word & dword operations via the operand
7076 size prefix, except for instructions that will ignore this
7077 prefix anyway. */
c8f8eebc 7078 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7079 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7080 && !i.tm.opcode_modifier.floatmf
7081 && !is_any_vex_encoding (&i.tm)
7082 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7083 || (flag_code == CODE_64BIT
7084 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7085 {
7086 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7087
0cfa3eb3 7088 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7089 prefix = ADDR_PREFIX_OPCODE;
252b5132 7090
29b0f896
AM
7091 if (!add_prefix (prefix))
7092 return 0;
24eab124 7093 }
252b5132 7094
29b0f896
AM
7095 /* Set mode64 for an operand. */
7096 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7097 && flag_code == CODE_64BIT
d2224064 7098 && !i.tm.opcode_modifier.norex64
4ed21b58 7099 && !i.tm.opcode_modifier.vexw
46e883c5 7100 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7101 need rex64. */
7102 && ! (i.operands == 2
7103 && i.tm.base_opcode == 0x90
7104 && i.tm.extension_opcode == None
75e5731b
JB
7105 && i.types[0].bitfield.instance == Accum
7106 && i.types[0].bitfield.qword
7107 && i.types[1].bitfield.instance == Accum
7108 && i.types[1].bitfield.qword))
d2224064 7109 i.rex |= REX_W;
3e73aa7c 7110
d2224064 7111 break;
8bbb3ad8
JB
7112
7113 case 0:
7114 /* Select word/dword/qword operation with explict data sizing prefix
7115 when there are no suitable register operands. */
7116 if (i.tm.opcode_modifier.w
7117 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7118 && (!i.reg_operands
7119 || (i.reg_operands == 1
7120 /* ShiftCount */
7121 && (i.tm.operand_types[0].bitfield.instance == RegC
7122 /* InOutPortReg */
7123 || i.tm.operand_types[0].bitfield.instance == RegD
7124 || i.tm.operand_types[1].bitfield.instance == RegD
7125 /* CRC32 */
7126 || i.tm.base_opcode == 0xf20f38f0))))
7127 i.tm.base_opcode |= 1;
7128 break;
29b0f896 7129 }
7ecd2f8b 7130
c8f8eebc 7131 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7132 {
c8f8eebc
JB
7133 gas_assert (!i.suffix);
7134 gas_assert (i.reg_operands);
c0a30a9f 7135
c8f8eebc
JB
7136 if (i.tm.operand_types[0].bitfield.instance == Accum
7137 || i.operands == 1)
7138 {
7139 /* The address size override prefix changes the size of the
7140 first operand. */
7141 if (flag_code == CODE_64BIT
7142 && i.op[0].regs->reg_type.bitfield.word)
7143 {
7144 as_bad (_("16-bit addressing unavailable for `%s'"),
7145 i.tm.name);
7146 return 0;
7147 }
7148
7149 if ((flag_code == CODE_32BIT
7150 ? i.op[0].regs->reg_type.bitfield.word
7151 : i.op[0].regs->reg_type.bitfield.dword)
7152 && !add_prefix (ADDR_PREFIX_OPCODE))
7153 return 0;
7154 }
c0a30a9f
L
7155 else
7156 {
c8f8eebc
JB
7157 /* Check invalid register operand when the address size override
7158 prefix changes the size of register operands. */
7159 unsigned int op;
7160 enum { need_word, need_dword, need_qword } need;
7161
7162 if (flag_code == CODE_32BIT)
7163 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7164 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7165 need = need_dword;
7166 else
7167 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7168
c8f8eebc
JB
7169 for (op = 0; op < i.operands; op++)
7170 {
7171 if (i.types[op].bitfield.class != Reg)
7172 continue;
7173
7174 switch (need)
7175 {
7176 case need_word:
7177 if (i.op[op].regs->reg_type.bitfield.word)
7178 continue;
7179 break;
7180 case need_dword:
7181 if (i.op[op].regs->reg_type.bitfield.dword)
7182 continue;
7183 break;
7184 case need_qword:
7185 if (i.op[op].regs->reg_type.bitfield.qword)
7186 continue;
7187 break;
7188 }
7189
7190 as_bad (_("invalid register operand size for `%s'"),
7191 i.tm.name);
7192 return 0;
7193 }
7194 }
c0a30a9f
L
7195 }
7196
29b0f896
AM
7197 return 1;
7198}
3e73aa7c 7199
29b0f896 7200static int
543613e9 7201check_byte_reg (void)
29b0f896
AM
7202{
7203 int op;
543613e9 7204
29b0f896
AM
7205 for (op = i.operands; --op >= 0;)
7206 {
dc821c5f 7207 /* Skip non-register operands. */
bab6aec1 7208 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7209 continue;
7210
29b0f896
AM
7211 /* If this is an eight bit register, it's OK. If it's the 16 or
7212 32 bit version of an eight bit register, we will just use the
7213 low portion, and that's OK too. */
dc821c5f 7214 if (i.types[op].bitfield.byte)
29b0f896
AM
7215 continue;
7216
5a819eb9 7217 /* I/O port address operands are OK too. */
75e5731b
JB
7218 if (i.tm.operand_types[op].bitfield.instance == RegD
7219 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7220 continue;
7221
9706160a
JB
7222 /* crc32 only wants its source operand checked here. */
7223 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7224 continue;
7225
29b0f896 7226 /* Any other register is bad. */
73c76375
JB
7227 as_bad (_("`%s%s' not allowed with `%s%c'"),
7228 register_prefix, i.op[op].regs->reg_name,
7229 i.tm.name, i.suffix);
7230 return 0;
29b0f896
AM
7231 }
7232 return 1;
7233}
7234
7235static int
e3bb37b5 7236check_long_reg (void)
29b0f896
AM
7237{
7238 int op;
7239
7240 for (op = i.operands; --op >= 0;)
dc821c5f 7241 /* Skip non-register operands. */
bab6aec1 7242 if (i.types[op].bitfield.class != Reg)
dc821c5f 7243 continue;
29b0f896
AM
7244 /* Reject eight bit registers, except where the template requires
7245 them. (eg. movzb) */
dc821c5f 7246 else if (i.types[op].bitfield.byte
bab6aec1 7247 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7248 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7249 && (i.tm.operand_types[op].bitfield.word
7250 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7251 {
a540244d
L
7252 as_bad (_("`%s%s' not allowed with `%s%c'"),
7253 register_prefix,
29b0f896
AM
7254 i.op[op].regs->reg_name,
7255 i.tm.name,
7256 i.suffix);
7257 return 0;
7258 }
be4c5e58
L
7259 /* Error if the e prefix on a general reg is missing. */
7260 else if (i.types[op].bitfield.word
bab6aec1 7261 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7262 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7263 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7264 {
be4c5e58
L
7265 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7266 register_prefix, i.op[op].regs->reg_name,
7267 i.suffix);
7268 return 0;
252b5132 7269 }
e4630f71 7270 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7271 else if (i.types[op].bitfield.qword
bab6aec1 7272 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7273 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7274 && i.tm.operand_types[op].bitfield.dword)
252b5132 7275 {
34828aad 7276 if (intel_syntax
65fca059 7277 && i.tm.opcode_modifier.toqword
3528c362 7278 && i.types[0].bitfield.class != RegSIMD)
34828aad 7279 {
ca61edf2 7280 /* Convert to QWORD. We want REX byte. */
34828aad
L
7281 i.suffix = QWORD_MNEM_SUFFIX;
7282 }
7283 else
7284 {
2b5d6a91 7285 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7286 register_prefix, i.op[op].regs->reg_name,
7287 i.suffix);
7288 return 0;
7289 }
29b0f896
AM
7290 }
7291 return 1;
7292}
252b5132 7293
29b0f896 7294static int
e3bb37b5 7295check_qword_reg (void)
29b0f896
AM
7296{
7297 int op;
252b5132 7298
29b0f896 7299 for (op = i.operands; --op >= 0; )
dc821c5f 7300 /* Skip non-register operands. */
bab6aec1 7301 if (i.types[op].bitfield.class != Reg)
dc821c5f 7302 continue;
29b0f896
AM
7303 /* Reject eight bit registers, except where the template requires
7304 them. (eg. movzb) */
dc821c5f 7305 else if (i.types[op].bitfield.byte
bab6aec1 7306 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7307 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7308 && (i.tm.operand_types[op].bitfield.word
7309 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7310 {
a540244d
L
7311 as_bad (_("`%s%s' not allowed with `%s%c'"),
7312 register_prefix,
29b0f896
AM
7313 i.op[op].regs->reg_name,
7314 i.tm.name,
7315 i.suffix);
7316 return 0;
7317 }
e4630f71 7318 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7319 else if ((i.types[op].bitfield.word
7320 || i.types[op].bitfield.dword)
bab6aec1 7321 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7322 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7323 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7324 {
7325 /* Prohibit these changes in the 64bit mode, since the
7326 lowering is more complicated. */
34828aad 7327 if (intel_syntax
ca61edf2 7328 && i.tm.opcode_modifier.todword
3528c362 7329 && i.types[0].bitfield.class != RegSIMD)
34828aad 7330 {
ca61edf2 7331 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7332 i.suffix = LONG_MNEM_SUFFIX;
7333 }
7334 else
7335 {
2b5d6a91 7336 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7337 register_prefix, i.op[op].regs->reg_name,
7338 i.suffix);
7339 return 0;
7340 }
252b5132 7341 }
29b0f896
AM
7342 return 1;
7343}
252b5132 7344
29b0f896 7345static int
e3bb37b5 7346check_word_reg (void)
29b0f896
AM
7347{
7348 int op;
7349 for (op = i.operands; --op >= 0;)
dc821c5f 7350 /* Skip non-register operands. */
bab6aec1 7351 if (i.types[op].bitfield.class != Reg)
dc821c5f 7352 continue;
29b0f896
AM
7353 /* Reject eight bit registers, except where the template requires
7354 them. (eg. movzb) */
dc821c5f 7355 else if (i.types[op].bitfield.byte
bab6aec1 7356 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7357 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7358 && (i.tm.operand_types[op].bitfield.word
7359 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7360 {
a540244d
L
7361 as_bad (_("`%s%s' not allowed with `%s%c'"),
7362 register_prefix,
29b0f896
AM
7363 i.op[op].regs->reg_name,
7364 i.tm.name,
7365 i.suffix);
7366 return 0;
7367 }
9706160a
JB
7368 /* Error if the e or r prefix on a general reg is present. */
7369 else if ((i.types[op].bitfield.dword
dc821c5f 7370 || i.types[op].bitfield.qword)
bab6aec1 7371 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7372 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7373 && i.tm.operand_types[op].bitfield.word)
252b5132 7374 {
9706160a
JB
7375 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7376 register_prefix, i.op[op].regs->reg_name,
7377 i.suffix);
7378 return 0;
29b0f896
AM
7379 }
7380 return 1;
7381}
252b5132 7382
29b0f896 7383static int
40fb9820 7384update_imm (unsigned int j)
29b0f896 7385{
bc0844ae 7386 i386_operand_type overlap = i.types[j];
40fb9820
L
7387 if ((overlap.bitfield.imm8
7388 || overlap.bitfield.imm8s
7389 || overlap.bitfield.imm16
7390 || overlap.bitfield.imm32
7391 || overlap.bitfield.imm32s
7392 || overlap.bitfield.imm64)
0dfbf9d7
L
7393 && !operand_type_equal (&overlap, &imm8)
7394 && !operand_type_equal (&overlap, &imm8s)
7395 && !operand_type_equal (&overlap, &imm16)
7396 && !operand_type_equal (&overlap, &imm32)
7397 && !operand_type_equal (&overlap, &imm32s)
7398 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7399 {
7400 if (i.suffix)
7401 {
40fb9820
L
7402 i386_operand_type temp;
7403
0dfbf9d7 7404 operand_type_set (&temp, 0);
7ab9ffdd 7405 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7406 {
7407 temp.bitfield.imm8 = overlap.bitfield.imm8;
7408 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7409 }
7410 else if (i.suffix == WORD_MNEM_SUFFIX)
7411 temp.bitfield.imm16 = overlap.bitfield.imm16;
7412 else if (i.suffix == QWORD_MNEM_SUFFIX)
7413 {
7414 temp.bitfield.imm64 = overlap.bitfield.imm64;
7415 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7416 }
7417 else
7418 temp.bitfield.imm32 = overlap.bitfield.imm32;
7419 overlap = temp;
29b0f896 7420 }
0dfbf9d7
L
7421 else if (operand_type_equal (&overlap, &imm16_32_32s)
7422 || operand_type_equal (&overlap, &imm16_32)
7423 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7424 {
40fb9820 7425 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7426 overlap = imm16;
40fb9820 7427 else
65da13b5 7428 overlap = imm32s;
29b0f896 7429 }
8bbb3ad8
JB
7430 else if (i.prefix[REX_PREFIX] & REX_W)
7431 overlap = operand_type_and (overlap, imm32s);
7432 else if (i.prefix[DATA_PREFIX])
7433 overlap = operand_type_and (overlap,
7434 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7435 if (!operand_type_equal (&overlap, &imm8)
7436 && !operand_type_equal (&overlap, &imm8s)
7437 && !operand_type_equal (&overlap, &imm16)
7438 && !operand_type_equal (&overlap, &imm32)
7439 && !operand_type_equal (&overlap, &imm32s)
7440 && !operand_type_equal (&overlap, &imm64))
29b0f896 7441 {
4eed87de
AM
7442 as_bad (_("no instruction mnemonic suffix given; "
7443 "can't determine immediate size"));
29b0f896
AM
7444 return 0;
7445 }
7446 }
40fb9820 7447 i.types[j] = overlap;
29b0f896 7448
40fb9820
L
7449 return 1;
7450}
7451
7452static int
7453finalize_imm (void)
7454{
bc0844ae 7455 unsigned int j, n;
29b0f896 7456
bc0844ae
L
7457 /* Update the first 2 immediate operands. */
7458 n = i.operands > 2 ? 2 : i.operands;
7459 if (n)
7460 {
7461 for (j = 0; j < n; j++)
7462 if (update_imm (j) == 0)
7463 return 0;
40fb9820 7464
bc0844ae
L
7465 /* The 3rd operand can't be immediate operand. */
7466 gas_assert (operand_type_check (i.types[2], imm) == 0);
7467 }
29b0f896
AM
7468
7469 return 1;
7470}
7471
7472static int
e3bb37b5 7473process_operands (void)
29b0f896
AM
7474{
7475 /* Default segment register this instruction will use for memory
7476 accesses. 0 means unknown. This is only for optimizing out
7477 unnecessary segment overrides. */
7478 const seg_entry *default_seg = 0;
7479
a5aeccd9
JB
7480 if (i.tm.opcode_modifier.sse2avx)
7481 {
7482 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7483 need converting. */
7484 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7485 i.prefix[REX_PREFIX] = 0;
7486 i.rex_encoding = 0;
7487 }
c423d21a
JB
7488 /* ImmExt should be processed after SSE2AVX. */
7489 else if (i.tm.opcode_modifier.immext)
7490 process_immext ();
a5aeccd9 7491
2426c15f 7492 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7493 {
91d6fa6a
NC
7494 unsigned int dupl = i.operands;
7495 unsigned int dest = dupl - 1;
9fcfb3d7
L
7496 unsigned int j;
7497
c0f3af97 7498 /* The destination must be an xmm register. */
9c2799c2 7499 gas_assert (i.reg_operands
91d6fa6a 7500 && MAX_OPERANDS > dupl
7ab9ffdd 7501 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7502
75e5731b 7503 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7504 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7505 {
8cd7925b 7506 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7507 {
7508 /* Keep xmm0 for instructions with VEX prefix and 3
7509 sources. */
75e5731b 7510 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7511 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7512 goto duplicate;
7513 }
e2ec9d29 7514 else
c0f3af97
L
7515 {
7516 /* We remove the first xmm0 and keep the number of
7517 operands unchanged, which in fact duplicates the
7518 destination. */
7519 for (j = 1; j < i.operands; j++)
7520 {
7521 i.op[j - 1] = i.op[j];
7522 i.types[j - 1] = i.types[j];
7523 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7524 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7525 }
7526 }
7527 }
7528 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7529 {
91d6fa6a 7530 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7531 && (i.tm.opcode_modifier.vexsources
7532 == VEX3SOURCES));
c0f3af97
L
7533
7534 /* Add the implicit xmm0 for instructions with VEX prefix
7535 and 3 sources. */
7536 for (j = i.operands; j > 0; j--)
7537 {
7538 i.op[j] = i.op[j - 1];
7539 i.types[j] = i.types[j - 1];
7540 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7541 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7542 }
7543 i.op[0].regs
7544 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 7545 i.types[0] = regxmm;
c0f3af97
L
7546 i.tm.operand_types[0] = regxmm;
7547
7548 i.operands += 2;
7549 i.reg_operands += 2;
7550 i.tm.operands += 2;
7551
91d6fa6a 7552 dupl++;
c0f3af97 7553 dest++;
91d6fa6a
NC
7554 i.op[dupl] = i.op[dest];
7555 i.types[dupl] = i.types[dest];
7556 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7557 i.flags[dupl] = i.flags[dest];
e2ec9d29 7558 }
c0f3af97
L
7559 else
7560 {
dc1e8a47 7561 duplicate:
c0f3af97
L
7562 i.operands++;
7563 i.reg_operands++;
7564 i.tm.operands++;
7565
91d6fa6a
NC
7566 i.op[dupl] = i.op[dest];
7567 i.types[dupl] = i.types[dest];
7568 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7569 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7570 }
7571
7572 if (i.tm.opcode_modifier.immext)
7573 process_immext ();
7574 }
75e5731b 7575 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7576 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7577 {
7578 unsigned int j;
7579
9fcfb3d7
L
7580 for (j = 1; j < i.operands; j++)
7581 {
7582 i.op[j - 1] = i.op[j];
7583 i.types[j - 1] = i.types[j];
7584
7585 /* We need to adjust fields in i.tm since they are used by
7586 build_modrm_byte. */
7587 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7588
7589 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7590 }
7591
e2ec9d29
L
7592 i.operands--;
7593 i.reg_operands--;
e2ec9d29
L
7594 i.tm.operands--;
7595 }
920d2ddc
IT
7596 else if (i.tm.opcode_modifier.implicitquadgroup)
7597 {
a477a8c4
JB
7598 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7599
920d2ddc 7600 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7601 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7602 regnum = register_number (i.op[1].regs);
7603 first_reg_in_group = regnum & ~3;
7604 last_reg_in_group = first_reg_in_group + 3;
7605 if (regnum != first_reg_in_group)
7606 as_warn (_("source register `%s%s' implicitly denotes"
7607 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7608 register_prefix, i.op[1].regs->reg_name,
7609 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7610 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7611 i.tm.name);
7612 }
e2ec9d29
L
7613 else if (i.tm.opcode_modifier.regkludge)
7614 {
7615 /* The imul $imm, %reg instruction is converted into
7616 imul $imm, %reg, %reg, and the clr %reg instruction
7617 is converted into xor %reg, %reg. */
7618
7619 unsigned int first_reg_op;
7620
7621 if (operand_type_check (i.types[0], reg))
7622 first_reg_op = 0;
7623 else
7624 first_reg_op = 1;
7625 /* Pretend we saw the extra register operand. */
9c2799c2 7626 gas_assert (i.reg_operands == 1
7ab9ffdd 7627 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7628 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7629 i.types[first_reg_op + 1] = i.types[first_reg_op];
7630 i.operands++;
7631 i.reg_operands++;
29b0f896
AM
7632 }
7633
85b80b0f 7634 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7635 {
7636 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7637 must be put into the modrm byte). Now, we make the modrm and
7638 index base bytes based on all the info we've collected. */
29b0f896
AM
7639
7640 default_seg = build_modrm_byte ();
7641 }
00cee14f 7642 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7643 {
7644 if (flag_code != CODE_64BIT
7645 ? i.tm.base_opcode == POP_SEG_SHORT
7646 && i.op[0].regs->reg_num == 1
7647 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7648 && i.op[0].regs->reg_num < 4)
7649 {
7650 as_bad (_("you can't `%s %s%s'"),
7651 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7652 return 0;
7653 }
7654 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7655 {
7656 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7657 i.tm.opcode_length = 2;
7658 }
7659 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7660 }
8a2ed489 7661 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7662 {
7663 default_seg = &ds;
7664 }
40fb9820 7665 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7666 {
7667 /* For the string instructions that allow a segment override
7668 on one of their operands, the default segment is ds. */
7669 default_seg = &ds;
7670 }
50128d0c 7671 else if (i.short_form)
85b80b0f
JB
7672 {
7673 /* The register or float register operand is in operand
7674 0 or 1. */
bab6aec1 7675 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7676
7677 /* Register goes in low 3 bits of opcode. */
7678 i.tm.base_opcode |= i.op[op].regs->reg_num;
7679 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7680 i.rex |= REX_B;
7681 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7682 {
7683 /* Warn about some common errors, but press on regardless.
7684 The first case can be generated by gcc (<= 2.8.1). */
7685 if (i.operands == 2)
7686 {
7687 /* Reversed arguments on faddp, fsubp, etc. */
7688 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7689 register_prefix, i.op[!intel_syntax].regs->reg_name,
7690 register_prefix, i.op[intel_syntax].regs->reg_name);
7691 }
7692 else
7693 {
7694 /* Extraneous `l' suffix on fp insn. */
7695 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7696 register_prefix, i.op[0].regs->reg_name);
7697 }
7698 }
7699 }
29b0f896 7700
514a8bb0 7701 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7702 && i.tm.base_opcode == 0x8d /* lea */
7703 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7704 {
7705 if (!quiet_warnings)
7706 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7707 if (optimize)
7708 {
7709 i.seg[0] = NULL;
7710 i.prefix[SEG_PREFIX] = 0;
7711 }
7712 }
52271982
AM
7713
7714 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7715 is neither the default nor the one already recorded from a prefix,
7716 use an opcode prefix to select it. If we never figured out what
7717 the default segment is, then default_seg will be zero at this
7718 point, and the specified segment prefix will always be used. */
7719 if (i.seg[0]
7720 && i.seg[0] != default_seg
7721 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7722 {
7723 if (!add_prefix (i.seg[0]->seg_prefix))
7724 return 0;
7725 }
7726 return 1;
7727}
7728
a5aeccd9
JB
7729static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
7730 bfd_boolean do_sse2avx)
7731{
7732 if (r->reg_flags & RegRex)
7733 {
7734 if (i.rex & rex_bit)
7735 as_bad (_("same type of prefix used twice"));
7736 i.rex |= rex_bit;
7737 }
7738 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7739 {
7740 gas_assert (i.vex.register_specifier == r);
7741 i.vex.register_specifier += 8;
7742 }
7743
7744 if (r->reg_flags & RegVRex)
7745 i.vrex |= rex_bit;
7746}
7747
29b0f896 7748static const seg_entry *
e3bb37b5 7749build_modrm_byte (void)
29b0f896
AM
7750{
7751 const seg_entry *default_seg = 0;
c0f3af97 7752 unsigned int source, dest;
8cd7925b 7753 int vex_3_sources;
c0f3af97 7754
8cd7925b 7755 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7756 if (vex_3_sources)
7757 {
91d6fa6a 7758 unsigned int nds, reg_slot;
4c2c6516 7759 expressionS *exp;
c0f3af97 7760
6b8d3588 7761 dest = i.operands - 1;
c0f3af97 7762 nds = dest - 1;
922d8de8 7763
a683cc34 7764 /* There are 2 kinds of instructions:
bed3d976 7765 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7766 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7767 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7768 ZMM register.
bed3d976 7769 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7770 plus 1 memory operand, with VexXDS. */
922d8de8 7771 gas_assert ((i.reg_operands == 4
bed3d976
JB
7772 || (i.reg_operands == 3 && i.mem_operands == 1))
7773 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7774 && i.tm.opcode_modifier.vexw
3528c362 7775 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7776
48db9223
JB
7777 /* If VexW1 is set, the first non-immediate operand is the source and
7778 the second non-immediate one is encoded in the immediate operand. */
7779 if (i.tm.opcode_modifier.vexw == VEXW1)
7780 {
7781 source = i.imm_operands;
7782 reg_slot = i.imm_operands + 1;
7783 }
7784 else
7785 {
7786 source = i.imm_operands + 1;
7787 reg_slot = i.imm_operands;
7788 }
7789
a683cc34 7790 if (i.imm_operands == 0)
bed3d976
JB
7791 {
7792 /* When there is no immediate operand, generate an 8bit
7793 immediate operand to encode the first operand. */
7794 exp = &im_expressions[i.imm_operands++];
7795 i.op[i.operands].imms = exp;
7796 i.types[i.operands] = imm8;
7797 i.operands++;
7798
3528c362 7799 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7800 exp->X_op = O_constant;
7801 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7802 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7803 }
922d8de8 7804 else
bed3d976 7805 {
9d3bf266
JB
7806 gas_assert (i.imm_operands == 1);
7807 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7808 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7809
9d3bf266
JB
7810 /* Turn on Imm8 again so that output_imm will generate it. */
7811 i.types[0].bitfield.imm8 = 1;
bed3d976 7812
3528c362 7813 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7814 i.op[0].imms->X_add_number
bed3d976 7815 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7816 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7817 }
a683cc34 7818
3528c362 7819 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7820 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7821 }
7822 else
7823 source = dest = 0;
29b0f896
AM
7824
7825 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7826 implicit registers do not count. If there are 3 register
7827 operands, it must be a instruction with VexNDS. For a
7828 instruction with VexNDD, the destination register is encoded
7829 in VEX prefix. If there are 4 register operands, it must be
7830 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7831 if (i.mem_operands == 0
7832 && ((i.reg_operands == 2
2426c15f 7833 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7834 || (i.reg_operands == 3
2426c15f 7835 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7836 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7837 {
cab737b9
L
7838 switch (i.operands)
7839 {
7840 case 2:
7841 source = 0;
7842 break;
7843 case 3:
c81128dc
L
7844 /* When there are 3 operands, one of them may be immediate,
7845 which may be the first or the last operand. Otherwise,
c0f3af97
L
7846 the first operand must be shift count register (cl) or it
7847 is an instruction with VexNDS. */
9c2799c2 7848 gas_assert (i.imm_operands == 1
7ab9ffdd 7849 || (i.imm_operands == 0
2426c15f 7850 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7851 || (i.types[0].bitfield.instance == RegC
7852 && i.types[0].bitfield.byte))));
40fb9820 7853 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7854 || (i.types[0].bitfield.instance == RegC
7855 && i.types[0].bitfield.byte))
40fb9820
L
7856 source = 1;
7857 else
7858 source = 0;
cab737b9
L
7859 break;
7860 case 4:
368d64cc
L
7861 /* When there are 4 operands, the first two must be 8bit
7862 immediate operands. The source operand will be the 3rd
c0f3af97
L
7863 one.
7864
7865 For instructions with VexNDS, if the first operand
7866 an imm8, the source operand is the 2nd one. If the last
7867 operand is imm8, the source operand is the first one. */
9c2799c2 7868 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7869 && i.types[0].bitfield.imm8
7870 && i.types[1].bitfield.imm8)
2426c15f 7871 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7872 && i.imm_operands == 1
7873 && (i.types[0].bitfield.imm8
43234a1e
L
7874 || i.types[i.operands - 1].bitfield.imm8
7875 || i.rounding)));
9f2670f2
L
7876 if (i.imm_operands == 2)
7877 source = 2;
7878 else
c0f3af97
L
7879 {
7880 if (i.types[0].bitfield.imm8)
7881 source = 1;
7882 else
7883 source = 0;
7884 }
c0f3af97
L
7885 break;
7886 case 5:
e771e7c9 7887 if (is_evex_encoding (&i.tm))
43234a1e
L
7888 {
7889 /* For EVEX instructions, when there are 5 operands, the
7890 first one must be immediate operand. If the second one
7891 is immediate operand, the source operand is the 3th
7892 one. If the last one is immediate operand, the source
7893 operand is the 2nd one. */
7894 gas_assert (i.imm_operands == 2
7895 && i.tm.opcode_modifier.sae
7896 && operand_type_check (i.types[0], imm));
7897 if (operand_type_check (i.types[1], imm))
7898 source = 2;
7899 else if (operand_type_check (i.types[4], imm))
7900 source = 1;
7901 else
7902 abort ();
7903 }
cab737b9
L
7904 break;
7905 default:
7906 abort ();
7907 }
7908
c0f3af97
L
7909 if (!vex_3_sources)
7910 {
7911 dest = source + 1;
7912
43234a1e
L
7913 /* RC/SAE operand could be between DEST and SRC. That happens
7914 when one operand is GPR and the other one is XMM/YMM/ZMM
7915 register. */
7916 if (i.rounding && i.rounding->operand == (int) dest)
7917 dest++;
7918
2426c15f 7919 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7920 {
43234a1e 7921 /* For instructions with VexNDS, the register-only source
c5d0745b 7922 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7923 register. It is encoded in VEX prefix. */
f12dc422
L
7924
7925 i386_operand_type op;
7926 unsigned int vvvv;
7927
c2ecccb3
L
7928 /* Swap two source operands if needed. */
7929 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
7930 {
7931 vvvv = source;
7932 source = dest;
7933 }
7934 else
7935 vvvv = dest;
7936
7937 op = i.tm.operand_types[vvvv];
c0f3af97 7938 if ((dest + 1) >= i.operands
bab6aec1 7939 || ((op.bitfield.class != Reg
dc821c5f 7940 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7941 && op.bitfield.class != RegSIMD
43234a1e 7942 && !operand_type_equal (&op, &regmask)))
c0f3af97 7943 abort ();
f12dc422 7944 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7945 dest++;
7946 }
7947 }
29b0f896
AM
7948
7949 i.rm.mode = 3;
dfd69174
JB
7950 /* One of the register operands will be encoded in the i.rm.reg
7951 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7952 fields. If no form of this instruction supports a memory
7953 destination operand, then we assume the source operand may
7954 sometimes be a memory operand and so we need to store the
7955 destination in the i.rm.reg field. */
dfd69174 7956 if (!i.tm.opcode_modifier.regmem
40fb9820 7957 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7958 {
7959 i.rm.reg = i.op[dest].regs->reg_num;
7960 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7961 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7962 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7963 i.has_regmmx = TRUE;
3528c362
JB
7964 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7965 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4 7966 {
260cd341
LC
7967 if (i.types[dest].bitfield.tmmword
7968 || i.types[source].bitfield.tmmword)
7969 i.has_regtmm = TRUE;
7970 else if (i.types[dest].bitfield.zmmword
7971 || i.types[source].bitfield.zmmword)
b4a3a7b4
L
7972 i.has_regzmm = TRUE;
7973 else if (i.types[dest].bitfield.ymmword
7974 || i.types[source].bitfield.ymmword)
7975 i.has_regymm = TRUE;
7976 else
7977 i.has_regxmm = TRUE;
7978 }
a5aeccd9
JB
7979 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
7980 set_rex_vrex (i.op[source].regs, REX_B, FALSE);
29b0f896
AM
7981 }
7982 else
7983 {
7984 i.rm.reg = i.op[source].regs->reg_num;
7985 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9
JB
7986 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
7987 set_rex_vrex (i.op[source].regs, REX_R, FALSE);
29b0f896 7988 }
e0c7f900 7989 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7990 {
4a5c67ed 7991 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7992 abort ();
e0c7f900 7993 i.rex &= ~REX_R;
c4a530c5
JB
7994 add_prefix (LOCK_PREFIX_OPCODE);
7995 }
29b0f896
AM
7996 }
7997 else
7998 { /* If it's not 2 reg operands... */
c0f3af97
L
7999 unsigned int mem;
8000
29b0f896
AM
8001 if (i.mem_operands)
8002 {
8003 unsigned int fake_zero_displacement = 0;
99018f42 8004 unsigned int op;
4eed87de 8005
7ab9ffdd 8006 for (op = 0; op < i.operands; op++)
8dc0818e 8007 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8008 break;
7ab9ffdd 8009 gas_assert (op < i.operands);
29b0f896 8010
63112cd6 8011 if (i.tm.opcode_modifier.sib)
6c30d220 8012 {
260cd341
LC
8013 /* The index register of VSIB shouldn't be RegIZ. */
8014 if (i.tm.opcode_modifier.sib != SIBMEM
8015 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8016 abort ();
8017
8018 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8019 if (!i.base_reg)
8020 {
8021 i.sib.base = NO_BASE_REGISTER;
8022 i.sib.scale = i.log2_scale_factor;
8023 i.types[op].bitfield.disp8 = 0;
8024 i.types[op].bitfield.disp16 = 0;
8025 i.types[op].bitfield.disp64 = 0;
43083a50 8026 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
8027 {
8028 /* Must be 32 bit */
8029 i.types[op].bitfield.disp32 = 1;
8030 i.types[op].bitfield.disp32s = 0;
8031 }
8032 else
8033 {
8034 i.types[op].bitfield.disp32 = 0;
8035 i.types[op].bitfield.disp32s = 1;
8036 }
8037 }
260cd341
LC
8038
8039 /* Since the mandatory SIB always has index register, so
8040 the code logic remains unchanged. The non-mandatory SIB
8041 without index register is allowed and will be handled
8042 later. */
8043 if (i.index_reg)
8044 {
8045 if (i.index_reg->reg_num == RegIZ)
8046 i.sib.index = NO_INDEX_REGISTER;
8047 else
8048 i.sib.index = i.index_reg->reg_num;
8049 set_rex_vrex (i.index_reg, REX_X, FALSE);
8050 }
6c30d220
L
8051 }
8052
29b0f896
AM
8053 default_seg = &ds;
8054
8055 if (i.base_reg == 0)
8056 {
8057 i.rm.mode = 0;
8058 if (!i.disp_operands)
9bb129e8 8059 fake_zero_displacement = 1;
29b0f896
AM
8060 if (i.index_reg == 0)
8061 {
73053c1f
JB
8062 i386_operand_type newdisp;
8063
260cd341
LC
8064 /* Both check for VSIB and mandatory non-vector SIB. */
8065 gas_assert (!i.tm.opcode_modifier.sib
8066 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8067 /* Operand is just <disp> */
20f0a1fc 8068 if (flag_code == CODE_64BIT)
29b0f896
AM
8069 {
8070 /* 64bit mode overwrites the 32bit absolute
8071 addressing by RIP relative addressing and
8072 absolute addressing is encoded by one of the
8073 redundant SIB forms. */
8074 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8075 i.sib.base = NO_BASE_REGISTER;
8076 i.sib.index = NO_INDEX_REGISTER;
73053c1f 8077 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 8078 }
fc225355
L
8079 else if ((flag_code == CODE_16BIT)
8080 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8081 {
8082 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8083 newdisp = disp16;
20f0a1fc
NC
8084 }
8085 else
8086 {
8087 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8088 newdisp = disp32;
29b0f896 8089 }
73053c1f
JB
8090 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8091 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8092 }
63112cd6 8093 else if (!i.tm.opcode_modifier.sib)
29b0f896 8094 {
6c30d220 8095 /* !i.base_reg && i.index_reg */
e968fc9b 8096 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8097 i.sib.index = NO_INDEX_REGISTER;
8098 else
8099 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8100 i.sib.base = NO_BASE_REGISTER;
8101 i.sib.scale = i.log2_scale_factor;
8102 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8103 i.types[op].bitfield.disp8 = 0;
8104 i.types[op].bitfield.disp16 = 0;
8105 i.types[op].bitfield.disp64 = 0;
43083a50 8106 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8107 {
8108 /* Must be 32 bit */
8109 i.types[op].bitfield.disp32 = 1;
8110 i.types[op].bitfield.disp32s = 0;
8111 }
29b0f896 8112 else
40fb9820
L
8113 {
8114 i.types[op].bitfield.disp32 = 0;
8115 i.types[op].bitfield.disp32s = 1;
8116 }
29b0f896 8117 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8118 i.rex |= REX_X;
29b0f896
AM
8119 }
8120 }
8121 /* RIP addressing for 64bit mode. */
e968fc9b 8122 else if (i.base_reg->reg_num == RegIP)
29b0f896 8123 {
63112cd6 8124 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8125 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8126 i.types[op].bitfield.disp8 = 0;
8127 i.types[op].bitfield.disp16 = 0;
8128 i.types[op].bitfield.disp32 = 0;
8129 i.types[op].bitfield.disp32s = 1;
8130 i.types[op].bitfield.disp64 = 0;
71903a11 8131 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8132 if (! i.disp_operands)
8133 fake_zero_displacement = 1;
29b0f896 8134 }
dc821c5f 8135 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8136 {
63112cd6 8137 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8138 switch (i.base_reg->reg_num)
8139 {
8140 case 3: /* (%bx) */
8141 if (i.index_reg == 0)
8142 i.rm.regmem = 7;
8143 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8144 i.rm.regmem = i.index_reg->reg_num - 6;
8145 break;
8146 case 5: /* (%bp) */
8147 default_seg = &ss;
8148 if (i.index_reg == 0)
8149 {
8150 i.rm.regmem = 6;
40fb9820 8151 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8152 {
8153 /* fake (%bp) into 0(%bp) */
b5014f7a 8154 i.types[op].bitfield.disp8 = 1;
252b5132 8155 fake_zero_displacement = 1;
29b0f896
AM
8156 }
8157 }
8158 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8159 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8160 break;
8161 default: /* (%si) -> 4 or (%di) -> 5 */
8162 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8163 }
8164 i.rm.mode = mode_from_disp_size (i.types[op]);
8165 }
8166 else /* i.base_reg and 32/64 bit mode */
8167 {
8168 if (flag_code == CODE_64BIT
40fb9820
L
8169 && operand_type_check (i.types[op], disp))
8170 {
73053c1f
JB
8171 i.types[op].bitfield.disp16 = 0;
8172 i.types[op].bitfield.disp64 = 0;
40fb9820 8173 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8174 {
8175 i.types[op].bitfield.disp32 = 0;
8176 i.types[op].bitfield.disp32s = 1;
8177 }
40fb9820 8178 else
73053c1f
JB
8179 {
8180 i.types[op].bitfield.disp32 = 1;
8181 i.types[op].bitfield.disp32s = 0;
8182 }
40fb9820 8183 }
20f0a1fc 8184
63112cd6 8185 if (!i.tm.opcode_modifier.sib)
6c30d220 8186 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8187 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8188 i.rex |= REX_B;
29b0f896
AM
8189 i.sib.base = i.base_reg->reg_num;
8190 /* x86-64 ignores REX prefix bit here to avoid decoder
8191 complications. */
848930b2
JB
8192 if (!(i.base_reg->reg_flags & RegRex)
8193 && (i.base_reg->reg_num == EBP_REG_NUM
8194 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8195 default_seg = &ss;
848930b2 8196 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8197 {
848930b2 8198 fake_zero_displacement = 1;
b5014f7a 8199 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8200 }
8201 i.sib.scale = i.log2_scale_factor;
8202 if (i.index_reg == 0)
8203 {
260cd341
LC
8204 /* Only check for VSIB. */
8205 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8206 && i.tm.opcode_modifier.sib != VECSIB256
8207 && i.tm.opcode_modifier.sib != VECSIB512);
8208
29b0f896
AM
8209 /* <disp>(%esp) becomes two byte modrm with no index
8210 register. We've already stored the code for esp
8211 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8212 Any base register besides %esp will not use the
8213 extra modrm byte. */
8214 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8215 }
63112cd6 8216 else if (!i.tm.opcode_modifier.sib)
29b0f896 8217 {
e968fc9b 8218 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8219 i.sib.index = NO_INDEX_REGISTER;
8220 else
8221 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8222 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8223 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8224 i.rex |= REX_X;
29b0f896 8225 }
67a4f2b7
AO
8226
8227 if (i.disp_operands
8228 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8229 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8230 i.rm.mode = 0;
8231 else
a501d77e
L
8232 {
8233 if (!fake_zero_displacement
8234 && !i.disp_operands
8235 && i.disp_encoding)
8236 {
8237 fake_zero_displacement = 1;
8238 if (i.disp_encoding == disp_encoding_8bit)
8239 i.types[op].bitfield.disp8 = 1;
8240 else
8241 i.types[op].bitfield.disp32 = 1;
8242 }
8243 i.rm.mode = mode_from_disp_size (i.types[op]);
8244 }
29b0f896 8245 }
252b5132 8246
29b0f896
AM
8247 if (fake_zero_displacement)
8248 {
8249 /* Fakes a zero displacement assuming that i.types[op]
8250 holds the correct displacement size. */
8251 expressionS *exp;
8252
9c2799c2 8253 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8254 exp = &disp_expressions[i.disp_operands++];
8255 i.op[op].disps = exp;
8256 exp->X_op = O_constant;
8257 exp->X_add_number = 0;
8258 exp->X_add_symbol = (symbolS *) 0;
8259 exp->X_op_symbol = (symbolS *) 0;
8260 }
c0f3af97
L
8261
8262 mem = op;
29b0f896 8263 }
c0f3af97
L
8264 else
8265 mem = ~0;
252b5132 8266
8c43a48b 8267 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8268 {
8269 if (operand_type_check (i.types[0], imm))
8270 i.vex.register_specifier = NULL;
8271 else
8272 {
8273 /* VEX.vvvv encodes one of the sources when the first
8274 operand is not an immediate. */
1ef99a7b 8275 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8276 i.vex.register_specifier = i.op[0].regs;
8277 else
8278 i.vex.register_specifier = i.op[1].regs;
8279 }
8280
8281 /* Destination is a XMM register encoded in the ModRM.reg
8282 and VEX.R bit. */
8283 i.rm.reg = i.op[2].regs->reg_num;
8284 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8285 i.rex |= REX_R;
8286
8287 /* ModRM.rm and VEX.B encodes the other source. */
8288 if (!i.mem_operands)
8289 {
8290 i.rm.mode = 3;
8291
1ef99a7b 8292 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8293 i.rm.regmem = i.op[1].regs->reg_num;
8294 else
8295 i.rm.regmem = i.op[0].regs->reg_num;
8296
8297 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8298 i.rex |= REX_B;
8299 }
8300 }
2426c15f 8301 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8302 {
8303 i.vex.register_specifier = i.op[2].regs;
8304 if (!i.mem_operands)
8305 {
8306 i.rm.mode = 3;
8307 i.rm.regmem = i.op[1].regs->reg_num;
8308 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8309 i.rex |= REX_B;
8310 }
8311 }
29b0f896
AM
8312 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8313 (if any) based on i.tm.extension_opcode. Again, we must be
8314 careful to make sure that segment/control/debug/test/MMX
8315 registers are coded into the i.rm.reg field. */
f88c9eb0 8316 else if (i.reg_operands)
29b0f896 8317 {
99018f42 8318 unsigned int op;
7ab9ffdd
L
8319 unsigned int vex_reg = ~0;
8320
8321 for (op = 0; op < i.operands; op++)
b4a3a7b4 8322 {
bab6aec1 8323 if (i.types[op].bitfield.class == Reg
f74a6307
JB
8324 || i.types[op].bitfield.class == RegBND
8325 || i.types[op].bitfield.class == RegMask
00cee14f 8326 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
8327 || i.types[op].bitfield.class == RegCR
8328 || i.types[op].bitfield.class == RegDR
8329 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 8330 break;
3528c362 8331 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4 8332 {
260cd341
LC
8333 if (i.types[op].bitfield.tmmword)
8334 i.has_regtmm = TRUE;
8335 else if (i.types[op].bitfield.zmmword)
b4a3a7b4
L
8336 i.has_regzmm = TRUE;
8337 else if (i.types[op].bitfield.ymmword)
8338 i.has_regymm = TRUE;
8339 else
8340 i.has_regxmm = TRUE;
8341 break;
8342 }
3528c362 8343 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
8344 {
8345 i.has_regmmx = TRUE;
8346 break;
8347 }
8348 }
c0209578 8349
7ab9ffdd
L
8350 if (vex_3_sources)
8351 op = dest;
2426c15f 8352 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8353 {
8354 /* For instructions with VexNDS, the register-only
8355 source operand is encoded in VEX prefix. */
8356 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8357
7ab9ffdd 8358 if (op > mem)
c0f3af97 8359 {
7ab9ffdd
L
8360 vex_reg = op++;
8361 gas_assert (op < i.operands);
c0f3af97
L
8362 }
8363 else
c0f3af97 8364 {
f12dc422
L
8365 /* Check register-only source operand when two source
8366 operands are swapped. */
8367 if (!i.tm.operand_types[op].bitfield.baseindex
8368 && i.tm.operand_types[op + 1].bitfield.baseindex)
8369 {
8370 vex_reg = op;
8371 op += 2;
8372 gas_assert (mem == (vex_reg + 1)
8373 && op < i.operands);
8374 }
8375 else
8376 {
8377 vex_reg = op + 1;
8378 gas_assert (vex_reg < i.operands);
8379 }
c0f3af97 8380 }
7ab9ffdd 8381 }
2426c15f 8382 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8383 {
f12dc422 8384 /* For instructions with VexNDD, the register destination
7ab9ffdd 8385 is encoded in VEX prefix. */
f12dc422
L
8386 if (i.mem_operands == 0)
8387 {
8388 /* There is no memory operand. */
8389 gas_assert ((op + 2) == i.operands);
8390 vex_reg = op + 1;
8391 }
8392 else
8d63c93e 8393 {
ed438a93
JB
8394 /* There are only 2 non-immediate operands. */
8395 gas_assert (op < i.imm_operands + 2
8396 && i.operands == i.imm_operands + 2);
8397 vex_reg = i.imm_operands + 1;
f12dc422 8398 }
7ab9ffdd
L
8399 }
8400 else
8401 gas_assert (op < i.operands);
99018f42 8402
7ab9ffdd
L
8403 if (vex_reg != (unsigned int) ~0)
8404 {
f12dc422 8405 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8406
bab6aec1 8407 if ((type->bitfield.class != Reg
dc821c5f 8408 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8409 && type->bitfield.class != RegSIMD
43234a1e 8410 && !operand_type_equal (type, &regmask))
7ab9ffdd 8411 abort ();
f88c9eb0 8412
7ab9ffdd
L
8413 i.vex.register_specifier = i.op[vex_reg].regs;
8414 }
8415
1b9f0c97
L
8416 /* Don't set OP operand twice. */
8417 if (vex_reg != op)
7ab9ffdd 8418 {
1b9f0c97
L
8419 /* If there is an extension opcode to put here, the
8420 register number must be put into the regmem field. */
8421 if (i.tm.extension_opcode != None)
8422 {
8423 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8424 set_rex_vrex (i.op[op].regs, REX_B,
8425 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8426 }
8427 else
8428 {
8429 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8430 set_rex_vrex (i.op[op].regs, REX_R,
8431 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8432 }
7ab9ffdd 8433 }
252b5132 8434
29b0f896
AM
8435 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8436 must set it to 3 to indicate this is a register operand
8437 in the regmem field. */
8438 if (!i.mem_operands)
8439 i.rm.mode = 3;
8440 }
252b5132 8441
29b0f896 8442 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8443 if (i.tm.extension_opcode != None)
29b0f896
AM
8444 i.rm.reg = i.tm.extension_opcode;
8445 }
8446 return default_seg;
8447}
252b5132 8448
376cd056
JB
8449static unsigned int
8450flip_code16 (unsigned int code16)
8451{
8452 gas_assert (i.tm.operands == 1);
8453
8454 return !(i.prefix[REX_PREFIX] & REX_W)
8455 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8456 || i.tm.operand_types[0].bitfield.disp32s
8457 : i.tm.operand_types[0].bitfield.disp16)
8458 ? CODE16 : 0;
8459}
8460
29b0f896 8461static void
e3bb37b5 8462output_branch (void)
29b0f896
AM
8463{
8464 char *p;
f8a5c266 8465 int size;
29b0f896
AM
8466 int code16;
8467 int prefix;
8468 relax_substateT subtype;
8469 symbolS *sym;
8470 offsetT off;
8471
f8a5c266 8472 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8473 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8474
8475 prefix = 0;
8476 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8477 {
29b0f896
AM
8478 prefix = 1;
8479 i.prefixes -= 1;
376cd056 8480 code16 ^= flip_code16(code16);
252b5132 8481 }
29b0f896
AM
8482 /* Pentium4 branch hints. */
8483 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8484 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8485 {
29b0f896
AM
8486 prefix++;
8487 i.prefixes--;
8488 }
8489 if (i.prefix[REX_PREFIX] != 0)
8490 {
8491 prefix++;
8492 i.prefixes--;
2f66722d
AM
8493 }
8494
7e8b059b
L
8495 /* BND prefixed jump. */
8496 if (i.prefix[BND_PREFIX] != 0)
8497 {
6cb0a70e
JB
8498 prefix++;
8499 i.prefixes--;
7e8b059b
L
8500 }
8501
f2810fe0
JB
8502 if (i.prefixes != 0)
8503 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8504
8505 /* It's always a symbol; End frag & setup for relax.
8506 Make sure there is enough room in this frag for the largest
8507 instruction we may generate in md_convert_frag. This is 2
8508 bytes for the opcode and room for the prefix and largest
8509 displacement. */
8510 frag_grow (prefix + 2 + 4);
8511 /* Prefix and 1 opcode byte go in fr_fix. */
8512 p = frag_more (prefix + 1);
8513 if (i.prefix[DATA_PREFIX] != 0)
8514 *p++ = DATA_PREFIX_OPCODE;
8515 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8516 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8517 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8518 if (i.prefix[BND_PREFIX] != 0)
8519 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8520 if (i.prefix[REX_PREFIX] != 0)
8521 *p++ = i.prefix[REX_PREFIX];
8522 *p = i.tm.base_opcode;
8523
8524 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8525 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8526 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8527 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8528 else
f8a5c266 8529 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8530 subtype |= code16;
3e73aa7c 8531
29b0f896
AM
8532 sym = i.op[0].disps->X_add_symbol;
8533 off = i.op[0].disps->X_add_number;
3e73aa7c 8534
29b0f896
AM
8535 if (i.op[0].disps->X_op != O_constant
8536 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8537 {
29b0f896
AM
8538 /* Handle complex expressions. */
8539 sym = make_expr_symbol (i.op[0].disps);
8540 off = 0;
8541 }
3e73aa7c 8542
29b0f896
AM
8543 /* 1 possible extra opcode + 4 byte displacement go in var part.
8544 Pass reloc in fr_var. */
d258b828 8545 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8546}
3e73aa7c 8547
bd7ab16b
L
8548#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8549/* Return TRUE iff PLT32 relocation should be used for branching to
8550 symbol S. */
8551
8552static bfd_boolean
8553need_plt32_p (symbolS *s)
8554{
8555 /* PLT32 relocation is ELF only. */
8556 if (!IS_ELF)
8557 return FALSE;
8558
a5def729
RO
8559#ifdef TE_SOLARIS
8560 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8561 krtld support it. */
8562 return FALSE;
8563#endif
8564
bd7ab16b
L
8565 /* Since there is no need to prepare for PLT branch on x86-64, we
8566 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8567 be used as a marker for 32-bit PC-relative branches. */
8568 if (!object_64bit)
8569 return FALSE;
8570
8571 /* Weak or undefined symbol need PLT32 relocation. */
8572 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8573 return TRUE;
8574
8575 /* Non-global symbol doesn't need PLT32 relocation. */
8576 if (! S_IS_EXTERNAL (s))
8577 return FALSE;
8578
8579 /* Other global symbols need PLT32 relocation. NB: Symbol with
8580 non-default visibilities are treated as normal global symbol
8581 so that PLT32 relocation can be used as a marker for 32-bit
8582 PC-relative branches. It is useful for linker relaxation. */
8583 return TRUE;
8584}
8585#endif
8586
29b0f896 8587static void
e3bb37b5 8588output_jump (void)
29b0f896
AM
8589{
8590 char *p;
8591 int size;
3e02c1cc 8592 fixS *fixP;
bd7ab16b 8593 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8594
0cfa3eb3 8595 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8596 {
8597 /* This is a loop or jecxz type instruction. */
8598 size = 1;
8599 if (i.prefix[ADDR_PREFIX] != 0)
8600 {
8601 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
8602 i.prefixes -= 1;
8603 }
8604 /* Pentium4 branch hints. */
8605 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8606 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8607 {
8608 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
8609 i.prefixes--;
3e73aa7c
JH
8610 }
8611 }
29b0f896
AM
8612 else
8613 {
8614 int code16;
3e73aa7c 8615
29b0f896
AM
8616 code16 = 0;
8617 if (flag_code == CODE_16BIT)
8618 code16 = CODE16;
3e73aa7c 8619
29b0f896
AM
8620 if (i.prefix[DATA_PREFIX] != 0)
8621 {
8622 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
8623 i.prefixes -= 1;
376cd056 8624 code16 ^= flip_code16(code16);
29b0f896 8625 }
252b5132 8626
29b0f896
AM
8627 size = 4;
8628 if (code16)
8629 size = 2;
8630 }
9fcc94b6 8631
6cb0a70e
JB
8632 /* BND prefixed jump. */
8633 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8634 {
6cb0a70e 8635 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
29b0f896
AM
8636 i.prefixes -= 1;
8637 }
252b5132 8638
6cb0a70e 8639 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8640 {
6cb0a70e 8641 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7e8b059b
L
8642 i.prefixes -= 1;
8643 }
8644
f2810fe0
JB
8645 if (i.prefixes != 0)
8646 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8647
42164a71
L
8648 p = frag_more (i.tm.opcode_length + size);
8649 switch (i.tm.opcode_length)
8650 {
8651 case 2:
8652 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8653 /* Fall through. */
42164a71
L
8654 case 1:
8655 *p++ = i.tm.base_opcode;
8656 break;
8657 default:
8658 abort ();
8659 }
e0890092 8660
bd7ab16b
L
8661#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8662 if (size == 4
8663 && jump_reloc == NO_RELOC
8664 && need_plt32_p (i.op[0].disps->X_add_symbol))
8665 jump_reloc = BFD_RELOC_X86_64_PLT32;
8666#endif
8667
8668 jump_reloc = reloc (size, 1, 1, jump_reloc);
8669
3e02c1cc 8670 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8671 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8672
8673 /* All jumps handled here are signed, but don't use a signed limit
8674 check for 32 and 16 bit jumps as we want to allow wrap around at
8675 4G and 64k respectively. */
8676 if (size == 1)
8677 fixP->fx_signed = 1;
29b0f896 8678}
e0890092 8679
29b0f896 8680static void
e3bb37b5 8681output_interseg_jump (void)
29b0f896
AM
8682{
8683 char *p;
8684 int size;
8685 int prefix;
8686 int code16;
252b5132 8687
29b0f896
AM
8688 code16 = 0;
8689 if (flag_code == CODE_16BIT)
8690 code16 = CODE16;
a217f122 8691
29b0f896
AM
8692 prefix = 0;
8693 if (i.prefix[DATA_PREFIX] != 0)
8694 {
8695 prefix = 1;
8696 i.prefixes -= 1;
8697 code16 ^= CODE16;
8698 }
6cb0a70e
JB
8699
8700 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8701
29b0f896
AM
8702 size = 4;
8703 if (code16)
8704 size = 2;
252b5132 8705
f2810fe0
JB
8706 if (i.prefixes != 0)
8707 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8708
29b0f896
AM
8709 /* 1 opcode; 2 segment; offset */
8710 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8711
29b0f896
AM
8712 if (i.prefix[DATA_PREFIX] != 0)
8713 *p++ = DATA_PREFIX_OPCODE;
252b5132 8714
29b0f896
AM
8715 if (i.prefix[REX_PREFIX] != 0)
8716 *p++ = i.prefix[REX_PREFIX];
252b5132 8717
29b0f896
AM
8718 *p++ = i.tm.base_opcode;
8719 if (i.op[1].imms->X_op == O_constant)
8720 {
8721 offsetT n = i.op[1].imms->X_add_number;
252b5132 8722
29b0f896
AM
8723 if (size == 2
8724 && !fits_in_unsigned_word (n)
8725 && !fits_in_signed_word (n))
8726 {
8727 as_bad (_("16-bit jump out of range"));
8728 return;
8729 }
8730 md_number_to_chars (p, n, size);
8731 }
8732 else
8733 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8734 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8735 if (i.op[0].imms->X_op != O_constant)
8736 as_bad (_("can't handle non absolute segment in `%s'"),
8737 i.tm.name);
8738 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8739}
a217f122 8740
b4a3a7b4
L
8741#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8742void
8743x86_cleanup (void)
8744{
8745 char *p;
8746 asection *seg = now_seg;
8747 subsegT subseg = now_subseg;
8748 asection *sec;
8749 unsigned int alignment, align_size_1;
8750 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8751 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8752 unsigned int padding;
8753
8754 if (!IS_ELF || !x86_used_note)
8755 return;
8756
b4a3a7b4
L
8757 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8758
8759 /* The .note.gnu.property section layout:
8760
8761 Field Length Contents
8762 ---- ---- ----
8763 n_namsz 4 4
8764 n_descsz 4 The note descriptor size
8765 n_type 4 NT_GNU_PROPERTY_TYPE_0
8766 n_name 4 "GNU"
8767 n_desc n_descsz The program property array
8768 .... .... ....
8769 */
8770
8771 /* Create the .note.gnu.property section. */
8772 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8773 bfd_set_section_flags (sec,
b4a3a7b4
L
8774 (SEC_ALLOC
8775 | SEC_LOAD
8776 | SEC_DATA
8777 | SEC_HAS_CONTENTS
8778 | SEC_READONLY));
8779
8780 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8781 {
8782 align_size_1 = 7;
8783 alignment = 3;
8784 }
8785 else
8786 {
8787 align_size_1 = 3;
8788 alignment = 2;
8789 }
8790
fd361982 8791 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8792 elf_section_type (sec) = SHT_NOTE;
8793
8794 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8795 + 4-byte data */
8796 isa_1_descsz_raw = 4 + 4 + 4;
8797 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8798 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8799
8800 feature_2_descsz_raw = isa_1_descsz;
8801 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8802 + 4-byte data */
8803 feature_2_descsz_raw += 4 + 4 + 4;
8804 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8805 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8806 & ~align_size_1);
8807
8808 descsz = feature_2_descsz;
8809 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8810 p = frag_more (4 + 4 + 4 + 4 + descsz);
8811
8812 /* Write n_namsz. */
8813 md_number_to_chars (p, (valueT) 4, 4);
8814
8815 /* Write n_descsz. */
8816 md_number_to_chars (p + 4, (valueT) descsz, 4);
8817
8818 /* Write n_type. */
8819 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8820
8821 /* Write n_name. */
8822 memcpy (p + 4 * 3, "GNU", 4);
8823
8824 /* Write 4-byte type. */
8825 md_number_to_chars (p + 4 * 4,
8826 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8827
8828 /* Write 4-byte data size. */
8829 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8830
8831 /* Write 4-byte data. */
8832 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8833
8834 /* Zero out paddings. */
8835 padding = isa_1_descsz - isa_1_descsz_raw;
8836 if (padding)
8837 memset (p + 4 * 7, 0, padding);
8838
8839 /* Write 4-byte type. */
8840 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8841 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8842
8843 /* Write 4-byte data size. */
8844 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8845
8846 /* Write 4-byte data. */
8847 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8848 (valueT) x86_feature_2_used, 4);
8849
8850 /* Zero out paddings. */
8851 padding = feature_2_descsz - feature_2_descsz_raw;
8852 if (padding)
8853 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8854
8855 /* We probably can't restore the current segment, for there likely
8856 isn't one yet... */
8857 if (seg && subseg)
8858 subseg_set (seg, subseg);
8859}
8860#endif
8861
9c33702b
JB
8862static unsigned int
8863encoding_length (const fragS *start_frag, offsetT start_off,
8864 const char *frag_now_ptr)
8865{
8866 unsigned int len = 0;
8867
8868 if (start_frag != frag_now)
8869 {
8870 const fragS *fr = start_frag;
8871
8872 do {
8873 len += fr->fr_fix;
8874 fr = fr->fr_next;
8875 } while (fr && fr != frag_now);
8876 }
8877
8878 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8879}
8880
e379e5f3 8881/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8882 be macro-fused with conditional jumps.
8883 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8884 or is one of the following format:
8885
8886 cmp m, imm
8887 add m, imm
8888 sub m, imm
8889 test m, imm
8890 and m, imm
8891 inc m
8892 dec m
8893
8894 it is unfusible. */
e379e5f3
L
8895
8896static int
79d72f45 8897maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8898{
8899 /* No RIP address. */
8900 if (i.base_reg && i.base_reg->reg_num == RegIP)
8901 return 0;
8902
8903 /* No VEX/EVEX encoding. */
8904 if (is_any_vex_encoding (&i.tm))
8905 return 0;
8906
79d72f45
HL
8907 /* add, sub without add/sub m, imm. */
8908 if (i.tm.base_opcode <= 5
e379e5f3
L
8909 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8910 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8911 && (i.tm.extension_opcode == 0x5
e379e5f3 8912 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8913 {
8914 *mf_cmp_p = mf_cmp_alu_cmp;
8915 return !(i.mem_operands && i.imm_operands);
8916 }
e379e5f3 8917
79d72f45
HL
8918 /* and without and m, imm. */
8919 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8920 || ((i.tm.base_opcode | 3) == 0x83
8921 && i.tm.extension_opcode == 0x4))
8922 {
8923 *mf_cmp_p = mf_cmp_test_and;
8924 return !(i.mem_operands && i.imm_operands);
8925 }
8926
8927 /* test without test m imm. */
e379e5f3
L
8928 if ((i.tm.base_opcode | 1) == 0x85
8929 || (i.tm.base_opcode | 1) == 0xa9
8930 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8931 && i.tm.extension_opcode == 0))
8932 {
8933 *mf_cmp_p = mf_cmp_test_and;
8934 return !(i.mem_operands && i.imm_operands);
8935 }
8936
8937 /* cmp without cmp m, imm. */
8938 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8939 || ((i.tm.base_opcode | 3) == 0x83
8940 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8941 {
8942 *mf_cmp_p = mf_cmp_alu_cmp;
8943 return !(i.mem_operands && i.imm_operands);
8944 }
e379e5f3 8945
79d72f45 8946 /* inc, dec without inc/dec m. */
e379e5f3
L
8947 if ((i.tm.cpu_flags.bitfield.cpuno64
8948 && (i.tm.base_opcode | 0xf) == 0x4f)
8949 || ((i.tm.base_opcode | 1) == 0xff
8950 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8951 {
8952 *mf_cmp_p = mf_cmp_incdec;
8953 return !i.mem_operands;
8954 }
e379e5f3
L
8955
8956 return 0;
8957}
8958
8959/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8960
8961static int
79d72f45 8962add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8963{
8964 /* NB: Don't work with COND_JUMP86 without i386. */
8965 if (!align_branch_power
8966 || now_seg == absolute_section
8967 || !cpu_arch_flags.bitfield.cpui386
8968 || !(align_branch & align_branch_fused_bit))
8969 return 0;
8970
79d72f45 8971 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
8972 {
8973 if (last_insn.kind == last_insn_other
8974 || last_insn.seg != now_seg)
8975 return 1;
8976 if (flag_debug)
8977 as_warn_where (last_insn.file, last_insn.line,
8978 _("`%s` skips -malign-branch-boundary on `%s`"),
8979 last_insn.name, i.tm.name);
8980 }
8981
8982 return 0;
8983}
8984
8985/* Return 1 if a BRANCH_PREFIX frag should be generated. */
8986
8987static int
8988add_branch_prefix_frag_p (void)
8989{
8990 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
8991 to PadLock instructions since they include prefixes in opcode. */
8992 if (!align_branch_power
8993 || !align_branch_prefix_size
8994 || now_seg == absolute_section
8995 || i.tm.cpu_flags.bitfield.cpupadlock
8996 || !cpu_arch_flags.bitfield.cpui386)
8997 return 0;
8998
8999 /* Don't add prefix if it is a prefix or there is no operand in case
9000 that segment prefix is special. */
9001 if (!i.operands || i.tm.opcode_modifier.isprefix)
9002 return 0;
9003
9004 if (last_insn.kind == last_insn_other
9005 || last_insn.seg != now_seg)
9006 return 1;
9007
9008 if (flag_debug)
9009 as_warn_where (last_insn.file, last_insn.line,
9010 _("`%s` skips -malign-branch-boundary on `%s`"),
9011 last_insn.name, i.tm.name);
9012
9013 return 0;
9014}
9015
9016/* Return 1 if a BRANCH_PADDING frag should be generated. */
9017
9018static int
79d72f45
HL
9019add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9020 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9021{
9022 int add_padding;
9023
9024 /* NB: Don't work with COND_JUMP86 without i386. */
9025 if (!align_branch_power
9026 || now_seg == absolute_section
9027 || !cpu_arch_flags.bitfield.cpui386)
9028 return 0;
9029
9030 add_padding = 0;
9031
9032 /* Check for jcc and direct jmp. */
9033 if (i.tm.opcode_modifier.jump == JUMP)
9034 {
9035 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9036 {
9037 *branch_p = align_branch_jmp;
9038 add_padding = align_branch & align_branch_jmp_bit;
9039 }
9040 else
9041 {
79d72f45
HL
9042 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9043 igore the lowest bit. */
9044 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9045 *branch_p = align_branch_jcc;
9046 if ((align_branch & align_branch_jcc_bit))
9047 add_padding = 1;
9048 }
9049 }
9050 else if (is_any_vex_encoding (&i.tm))
9051 return 0;
9052 else if ((i.tm.base_opcode | 1) == 0xc3)
9053 {
9054 /* Near ret. */
9055 *branch_p = align_branch_ret;
9056 if ((align_branch & align_branch_ret_bit))
9057 add_padding = 1;
9058 }
9059 else
9060 {
9061 /* Check for indirect jmp, direct and indirect calls. */
9062 if (i.tm.base_opcode == 0xe8)
9063 {
9064 /* Direct call. */
9065 *branch_p = align_branch_call;
9066 if ((align_branch & align_branch_call_bit))
9067 add_padding = 1;
9068 }
9069 else if (i.tm.base_opcode == 0xff
9070 && (i.tm.extension_opcode == 2
9071 || i.tm.extension_opcode == 4))
9072 {
9073 /* Indirect call and jmp. */
9074 *branch_p = align_branch_indirect;
9075 if ((align_branch & align_branch_indirect_bit))
9076 add_padding = 1;
9077 }
9078
9079 if (add_padding
9080 && i.disp_operands
9081 && tls_get_addr
9082 && (i.op[0].disps->X_op == O_symbol
9083 || (i.op[0].disps->X_op == O_subtract
9084 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9085 {
9086 symbolS *s = i.op[0].disps->X_add_symbol;
9087 /* No padding to call to global or undefined tls_get_addr. */
9088 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9089 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9090 return 0;
9091 }
9092 }
9093
9094 if (add_padding
9095 && last_insn.kind != last_insn_other
9096 && last_insn.seg == now_seg)
9097 {
9098 if (flag_debug)
9099 as_warn_where (last_insn.file, last_insn.line,
9100 _("`%s` skips -malign-branch-boundary on `%s`"),
9101 last_insn.name, i.tm.name);
9102 return 0;
9103 }
9104
9105 return add_padding;
9106}
9107
29b0f896 9108static void
e3bb37b5 9109output_insn (void)
29b0f896 9110{
2bbd9c25
JJ
9111 fragS *insn_start_frag;
9112 offsetT insn_start_off;
e379e5f3
L
9113 fragS *fragP = NULL;
9114 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9115 /* The initializer is arbitrary just to avoid uninitialized error.
9116 it's actually either assigned in add_branch_padding_frag_p
9117 or never be used. */
9118 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9119
b4a3a7b4
L
9120#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9121 if (IS_ELF && x86_used_note)
9122 {
9123 if (i.tm.cpu_flags.bitfield.cpucmov)
9124 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
9125 if (i.tm.cpu_flags.bitfield.cpusse)
9126 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
9127 if (i.tm.cpu_flags.bitfield.cpusse2)
9128 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
9129 if (i.tm.cpu_flags.bitfield.cpusse3)
9130 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
9131 if (i.tm.cpu_flags.bitfield.cpussse3)
9132 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
9133 if (i.tm.cpu_flags.bitfield.cpusse4_1)
9134 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
9135 if (i.tm.cpu_flags.bitfield.cpusse4_2)
9136 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
9137 if (i.tm.cpu_flags.bitfield.cpuavx)
9138 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
9139 if (i.tm.cpu_flags.bitfield.cpuavx2)
9140 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
9141 if (i.tm.cpu_flags.bitfield.cpufma)
9142 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
9143 if (i.tm.cpu_flags.bitfield.cpuavx512f)
9144 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
9145 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
9146 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
9147 if (i.tm.cpu_flags.bitfield.cpuavx512er)
9148 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
9149 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
9150 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
9151 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
9152 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
9153 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
9154 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
9155 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
9156 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
9157 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
9158 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
9159 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
9160 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
9161 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
9162 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
9163 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
9164 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
9165 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
9166 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
9167 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
9168 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
9169 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
9170 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
9171 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
9172 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
9173
9174 if (i.tm.cpu_flags.bitfield.cpu8087
9175 || i.tm.cpu_flags.bitfield.cpu287
9176 || i.tm.cpu_flags.bitfield.cpu387
9177 || i.tm.cpu_flags.bitfield.cpu687
9178 || i.tm.cpu_flags.bitfield.cpufisttp)
9179 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
319ff62c
JB
9180 if (i.has_regmmx
9181 || i.tm.base_opcode == 0xf77 /* emms */
a7e12755
L
9182 || i.tm.base_opcode == 0xf0e /* femms */
9183 || i.tm.base_opcode == 0xf2a /* cvtpi2ps */
9184 || i.tm.base_opcode == 0x660f2a /* cvtpi2pd */)
b4a3a7b4
L
9185 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
9186 if (i.has_regxmm)
9187 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
39776b11
L
9188 if (i.has_regymm
9189 || (i.has_regxmm
9190 && (i.tm.opcode_modifier.vex
9191 || i.tm.opcode_modifier.evex)))
b4a3a7b4 9192 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
39776b11
L
9193 if (i.has_regzmm
9194 || ((i.has_regxmm || i.has_regymm)
9195 && i.tm.opcode_modifier.evex))
b4a3a7b4
L
9196 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
9197 if (i.tm.cpu_flags.bitfield.cpufxsr)
9198 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9199 if (i.tm.cpu_flags.bitfield.cpuxsave)
9200 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9201 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9202 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9203 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9204 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
9205 }
9206#endif
9207
29b0f896
AM
9208 /* Tie dwarf2 debug info to the address at the start of the insn.
9209 We can't do this after the insn has been output as the current
9210 frag may have been closed off. eg. by frag_var. */
9211 dwarf2_emit_insn (0);
9212
2bbd9c25
JJ
9213 insn_start_frag = frag_now;
9214 insn_start_off = frag_now_fix ();
9215
79d72f45 9216 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9217 {
9218 char *p;
9219 /* Branch can be 8 bytes. Leave some room for prefixes. */
9220 unsigned int max_branch_padding_size = 14;
9221
9222 /* Align section to boundary. */
9223 record_alignment (now_seg, align_branch_power);
9224
9225 /* Make room for padding. */
9226 frag_grow (max_branch_padding_size);
9227
9228 /* Start of the padding. */
9229 p = frag_more (0);
9230
9231 fragP = frag_now;
9232
9233 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9234 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9235 NULL, 0, p);
9236
79d72f45 9237 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9238 fragP->tc_frag_data.branch_type = branch;
9239 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9240 }
9241
29b0f896 9242 /* Output jumps. */
0cfa3eb3 9243 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9244 output_branch ();
0cfa3eb3
JB
9245 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9246 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9247 output_jump ();
0cfa3eb3 9248 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9249 output_interseg_jump ();
9250 else
9251 {
9252 /* Output normal instructions here. */
9253 char *p;
9254 unsigned char *q;
47465058 9255 unsigned int j;
331d2d0d 9256 unsigned int prefix;
79d72f45 9257 enum mf_cmp_kind mf_cmp;
4dffcebc 9258
e4e00185 9259 if (avoid_fence
c3949f43
JB
9260 && (i.tm.base_opcode == 0xfaee8
9261 || i.tm.base_opcode == 0xfaef0
9262 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
9263 {
9264 /* Encode lfence, mfence, and sfence as
9265 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9266 offsetT val = 0x240483f0ULL;
9267 p = frag_more (5);
9268 md_number_to_chars (p, val, 5);
9269 return;
9270 }
9271
d022bddd
IT
9272 /* Some processors fail on LOCK prefix. This options makes
9273 assembler ignore LOCK prefix and serves as a workaround. */
9274 if (omit_lock_prefix)
9275 {
9276 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9277 return;
9278 i.prefix[LOCK_PREFIX] = 0;
9279 }
9280
e379e5f3
L
9281 if (branch)
9282 /* Skip if this is a branch. */
9283 ;
79d72f45 9284 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9285 {
9286 /* Make room for padding. */
9287 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9288 p = frag_more (0);
9289
9290 fragP = frag_now;
9291
9292 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9293 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9294 NULL, 0, p);
9295
79d72f45 9296 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9297 fragP->tc_frag_data.branch_type = align_branch_fused;
9298 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9299 }
9300 else if (add_branch_prefix_frag_p ())
9301 {
9302 unsigned int max_prefix_size = align_branch_prefix_size;
9303
9304 /* Make room for padding. */
9305 frag_grow (max_prefix_size);
9306 p = frag_more (0);
9307
9308 fragP = frag_now;
9309
9310 frag_var (rs_machine_dependent, max_prefix_size, 0,
9311 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9312 NULL, 0, p);
9313
9314 fragP->tc_frag_data.max_bytes = max_prefix_size;
9315 }
9316
43234a1e
L
9317 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9318 don't need the explicit prefix. */
9319 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9320 {
c0f3af97 9321 switch (i.tm.opcode_length)
bc4bd9ab 9322 {
c0f3af97
L
9323 case 3:
9324 if (i.tm.base_opcode & 0xff000000)
4dffcebc 9325 {
c0f3af97 9326 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
9327 if (!i.tm.cpu_flags.bitfield.cpupadlock
9328 || prefix != REPE_PREFIX_OPCODE
9329 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9330 add_prefix (prefix);
c0f3af97
L
9331 }
9332 break;
9333 case 2:
9334 if ((i.tm.base_opcode & 0xff0000) != 0)
9335 {
9336 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 9337 add_prefix (prefix);
4dffcebc 9338 }
c0f3af97
L
9339 break;
9340 case 1:
9341 break;
390c91cf
L
9342 case 0:
9343 /* Check for pseudo prefixes. */
9344 as_bad_where (insn_start_frag->fr_file,
9345 insn_start_frag->fr_line,
9346 _("pseudo prefix without instruction"));
9347 return;
c0f3af97
L
9348 default:
9349 abort ();
bc4bd9ab 9350 }
c0f3af97 9351
6d19a37a 9352#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9353 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9354 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9355 perform IE->LE optimization. A dummy REX_OPCODE prefix
9356 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9357 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9358 if (x86_elf_abi == X86_64_X32_ABI
9359 && i.operands == 2
14470f07
L
9360 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9361 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9362 && i.prefix[REX_PREFIX] == 0)
9363 add_prefix (REX_OPCODE);
6d19a37a 9364#endif
cf61b747 9365
c0f3af97
L
9366 /* The prefix bytes. */
9367 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9368 if (*q)
9369 FRAG_APPEND_1_CHAR (*q);
0f10071e 9370 }
ae5c1c7b 9371 else
c0f3af97
L
9372 {
9373 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9374 if (*q)
9375 switch (j)
9376 {
c0f3af97
L
9377 case SEG_PREFIX:
9378 case ADDR_PREFIX:
9379 FRAG_APPEND_1_CHAR (*q);
9380 break;
9381 default:
9382 /* There should be no other prefixes for instructions
9383 with VEX prefix. */
9384 abort ();
9385 }
9386
43234a1e
L
9387 /* For EVEX instructions i.vrex should become 0 after
9388 build_evex_prefix. For VEX instructions upper 16 registers
9389 aren't available, so VREX should be 0. */
9390 if (i.vrex)
9391 abort ();
c0f3af97
L
9392 /* Now the VEX prefix. */
9393 p = frag_more (i.vex.length);
9394 for (j = 0; j < i.vex.length; j++)
9395 p[j] = i.vex.bytes[j];
9396 }
252b5132 9397
29b0f896 9398 /* Now the opcode; be careful about word order here! */
4dffcebc 9399 if (i.tm.opcode_length == 1)
29b0f896
AM
9400 {
9401 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9402 }
9403 else
9404 {
4dffcebc 9405 switch (i.tm.opcode_length)
331d2d0d 9406 {
43234a1e
L
9407 case 4:
9408 p = frag_more (4);
9409 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9410 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9411 break;
4dffcebc 9412 case 3:
331d2d0d
L
9413 p = frag_more (3);
9414 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9415 break;
9416 case 2:
9417 p = frag_more (2);
9418 break;
9419 default:
9420 abort ();
9421 break;
331d2d0d 9422 }
0f10071e 9423
29b0f896
AM
9424 /* Put out high byte first: can't use md_number_to_chars! */
9425 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9426 *p = i.tm.base_opcode & 0xff;
9427 }
3e73aa7c 9428
29b0f896 9429 /* Now the modrm byte and sib byte (if present). */
40fb9820 9430 if (i.tm.opcode_modifier.modrm)
29b0f896 9431 {
4a3523fa
L
9432 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
9433 | i.rm.reg << 3
9434 | i.rm.mode << 6));
29b0f896
AM
9435 /* If i.rm.regmem == ESP (4)
9436 && i.rm.mode != (Register mode)
9437 && not 16 bit
9438 ==> need second modrm byte. */
9439 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9440 && i.rm.mode != 3
dc821c5f 9441 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
9442 FRAG_APPEND_1_CHAR ((i.sib.base << 0
9443 | i.sib.index << 3
9444 | i.sib.scale << 6));
29b0f896 9445 }
3e73aa7c 9446
29b0f896 9447 if (i.disp_operands)
2bbd9c25 9448 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9449
29b0f896 9450 if (i.imm_operands)
2bbd9c25 9451 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9452
9453 /*
9454 * frag_now_fix () returning plain abs_section_offset when we're in the
9455 * absolute section, and abs_section_offset not getting updated as data
9456 * gets added to the frag breaks the logic below.
9457 */
9458 if (now_seg != absolute_section)
9459 {
9460 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9461 if (j > 15)
9462 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9463 j);
e379e5f3
L
9464 else if (fragP)
9465 {
9466 /* NB: Don't add prefix with GOTPC relocation since
9467 output_disp() above depends on the fixed encoding
9468 length. Can't add prefix with TLS relocation since
9469 it breaks TLS linker optimization. */
9470 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9471 /* Prefix count on the current instruction. */
9472 unsigned int count = i.vex.length;
9473 unsigned int k;
9474 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9475 /* REX byte is encoded in VEX/EVEX prefix. */
9476 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9477 count++;
9478
9479 /* Count prefixes for extended opcode maps. */
9480 if (!i.vex.length)
9481 switch (i.tm.opcode_length)
9482 {
9483 case 3:
9484 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9485 {
9486 count++;
9487 switch ((i.tm.base_opcode >> 8) & 0xff)
9488 {
9489 case 0x38:
9490 case 0x3a:
9491 count++;
9492 break;
9493 default:
9494 break;
9495 }
9496 }
9497 break;
9498 case 2:
9499 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9500 count++;
9501 break;
9502 case 1:
9503 break;
9504 default:
9505 abort ();
9506 }
9507
9508 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9509 == BRANCH_PREFIX)
9510 {
9511 /* Set the maximum prefix size in BRANCH_PREFIX
9512 frag. */
9513 if (fragP->tc_frag_data.max_bytes > max)
9514 fragP->tc_frag_data.max_bytes = max;
9515 if (fragP->tc_frag_data.max_bytes > count)
9516 fragP->tc_frag_data.max_bytes -= count;
9517 else
9518 fragP->tc_frag_data.max_bytes = 0;
9519 }
9520 else
9521 {
9522 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9523 frag. */
9524 unsigned int max_prefix_size;
9525 if (align_branch_prefix_size > max)
9526 max_prefix_size = max;
9527 else
9528 max_prefix_size = align_branch_prefix_size;
9529 if (max_prefix_size > count)
9530 fragP->tc_frag_data.max_prefix_length
9531 = max_prefix_size - count;
9532 }
9533
9534 /* Use existing segment prefix if possible. Use CS
9535 segment prefix in 64-bit mode. In 32-bit mode, use SS
9536 segment prefix with ESP/EBP base register and use DS
9537 segment prefix without ESP/EBP base register. */
9538 if (i.prefix[SEG_PREFIX])
9539 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9540 else if (flag_code == CODE_64BIT)
9541 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9542 else if (i.base_reg
9543 && (i.base_reg->reg_num == 4
9544 || i.base_reg->reg_num == 5))
9545 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9546 else
9547 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9548 }
9c33702b 9549 }
29b0f896 9550 }
252b5132 9551
e379e5f3
L
9552 /* NB: Don't work with COND_JUMP86 without i386. */
9553 if (align_branch_power
9554 && now_seg != absolute_section
9555 && cpu_arch_flags.bitfield.cpui386)
9556 {
9557 /* Terminate each frag so that we can add prefix and check for
9558 fused jcc. */
9559 frag_wane (frag_now);
9560 frag_new (0);
9561 }
9562
29b0f896
AM
9563#ifdef DEBUG386
9564 if (flag_debug)
9565 {
7b81dfbb 9566 pi ("" /*line*/, &i);
29b0f896
AM
9567 }
9568#endif /* DEBUG386 */
9569}
252b5132 9570
e205caa7
L
9571/* Return the size of the displacement operand N. */
9572
9573static int
9574disp_size (unsigned int n)
9575{
9576 int size = 4;
43234a1e 9577
b5014f7a 9578 if (i.types[n].bitfield.disp64)
40fb9820
L
9579 size = 8;
9580 else if (i.types[n].bitfield.disp8)
9581 size = 1;
9582 else if (i.types[n].bitfield.disp16)
9583 size = 2;
e205caa7
L
9584 return size;
9585}
9586
9587/* Return the size of the immediate operand N. */
9588
9589static int
9590imm_size (unsigned int n)
9591{
9592 int size = 4;
40fb9820
L
9593 if (i.types[n].bitfield.imm64)
9594 size = 8;
9595 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9596 size = 1;
9597 else if (i.types[n].bitfield.imm16)
9598 size = 2;
e205caa7
L
9599 return size;
9600}
9601
29b0f896 9602static void
64e74474 9603output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9604{
9605 char *p;
9606 unsigned int n;
252b5132 9607
29b0f896
AM
9608 for (n = 0; n < i.operands; n++)
9609 {
b5014f7a 9610 if (operand_type_check (i.types[n], disp))
29b0f896
AM
9611 {
9612 if (i.op[n].disps->X_op == O_constant)
9613 {
e205caa7 9614 int size = disp_size (n);
43234a1e 9615 offsetT val = i.op[n].disps->X_add_number;
252b5132 9616
629cfaf1
JB
9617 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9618 size);
29b0f896
AM
9619 p = frag_more (size);
9620 md_number_to_chars (p, val, size);
9621 }
9622 else
9623 {
f86103b7 9624 enum bfd_reloc_code_real reloc_type;
e205caa7 9625 int size = disp_size (n);
40fb9820 9626 int sign = i.types[n].bitfield.disp32s;
29b0f896 9627 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9628 fixS *fixP;
29b0f896 9629
e205caa7 9630 /* We can't have 8 bit displacement here. */
9c2799c2 9631 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9632
29b0f896
AM
9633 /* The PC relative address is computed relative
9634 to the instruction boundary, so in case immediate
9635 fields follows, we need to adjust the value. */
9636 if (pcrel && i.imm_operands)
9637 {
29b0f896 9638 unsigned int n1;
e205caa7 9639 int sz = 0;
252b5132 9640
29b0f896 9641 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9642 if (operand_type_check (i.types[n1], imm))
252b5132 9643 {
e205caa7
L
9644 /* Only one immediate is allowed for PC
9645 relative address. */
9c2799c2 9646 gas_assert (sz == 0);
e205caa7
L
9647 sz = imm_size (n1);
9648 i.op[n].disps->X_add_number -= sz;
252b5132 9649 }
29b0f896 9650 /* We should find the immediate. */
9c2799c2 9651 gas_assert (sz != 0);
29b0f896 9652 }
520dc8e8 9653
29b0f896 9654 p = frag_more (size);
d258b828 9655 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9656 if (GOT_symbol
2bbd9c25 9657 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9658 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9659 || reloc_type == BFD_RELOC_X86_64_32S
9660 || (reloc_type == BFD_RELOC_64
9661 && object_64bit))
d6ab8113
JB
9662 && (i.op[n].disps->X_op == O_symbol
9663 || (i.op[n].disps->X_op == O_add
9664 && ((symbol_get_value_expression
9665 (i.op[n].disps->X_op_symbol)->X_op)
9666 == O_subtract))))
9667 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9668 {
4fa24527 9669 if (!object_64bit)
7b81dfbb
AJ
9670 {
9671 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9672 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9673 i.op[n].imms->X_add_number +=
9674 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9675 }
9676 else if (reloc_type == BFD_RELOC_64)
9677 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9678 else
7b81dfbb
AJ
9679 /* Don't do the adjustment for x86-64, as there
9680 the pcrel addressing is relative to the _next_
9681 insn, and that is taken care of in other code. */
d6ab8113 9682 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9683 }
e379e5f3
L
9684 else if (align_branch_power)
9685 {
9686 switch (reloc_type)
9687 {
9688 case BFD_RELOC_386_TLS_GD:
9689 case BFD_RELOC_386_TLS_LDM:
9690 case BFD_RELOC_386_TLS_IE:
9691 case BFD_RELOC_386_TLS_IE_32:
9692 case BFD_RELOC_386_TLS_GOTIE:
9693 case BFD_RELOC_386_TLS_GOTDESC:
9694 case BFD_RELOC_386_TLS_DESC_CALL:
9695 case BFD_RELOC_X86_64_TLSGD:
9696 case BFD_RELOC_X86_64_TLSLD:
9697 case BFD_RELOC_X86_64_GOTTPOFF:
9698 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9699 case BFD_RELOC_X86_64_TLSDESC_CALL:
9700 i.has_gotpc_tls_reloc = TRUE;
9701 default:
9702 break;
9703 }
9704 }
02a86693
L
9705 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9706 size, i.op[n].disps, pcrel,
9707 reloc_type);
9708 /* Check for "call/jmp *mem", "mov mem, %reg",
9709 "test %reg, mem" and "binop mem, %reg" where binop
9710 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9711 instructions without data prefix. Always generate
9712 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9713 if (i.prefix[DATA_PREFIX] == 0
9714 && (generate_relax_relocations
9715 || (!object_64bit
9716 && i.rm.mode == 0
9717 && i.rm.regmem == 5))
0cb4071e
L
9718 && (i.rm.mode == 2
9719 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9720 && !is_any_vex_encoding(&i.tm)
02a86693
L
9721 && ((i.operands == 1
9722 && i.tm.base_opcode == 0xff
9723 && (i.rm.reg == 2 || i.rm.reg == 4))
9724 || (i.operands == 2
9725 && (i.tm.base_opcode == 0x8b
9726 || i.tm.base_opcode == 0x85
2ae4c703 9727 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9728 {
9729 if (object_64bit)
9730 {
9731 fixP->fx_tcbit = i.rex != 0;
9732 if (i.base_reg
e968fc9b 9733 && (i.base_reg->reg_num == RegIP))
02a86693
L
9734 fixP->fx_tcbit2 = 1;
9735 }
9736 else
9737 fixP->fx_tcbit2 = 1;
9738 }
29b0f896
AM
9739 }
9740 }
9741 }
9742}
252b5132 9743
29b0f896 9744static void
64e74474 9745output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9746{
9747 char *p;
9748 unsigned int n;
252b5132 9749
29b0f896
AM
9750 for (n = 0; n < i.operands; n++)
9751 {
43234a1e
L
9752 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9753 if (i.rounding && (int) n == i.rounding->operand)
9754 continue;
9755
40fb9820 9756 if (operand_type_check (i.types[n], imm))
29b0f896
AM
9757 {
9758 if (i.op[n].imms->X_op == O_constant)
9759 {
e205caa7 9760 int size = imm_size (n);
29b0f896 9761 offsetT val;
b4cac588 9762
29b0f896
AM
9763 val = offset_in_range (i.op[n].imms->X_add_number,
9764 size);
9765 p = frag_more (size);
9766 md_number_to_chars (p, val, size);
9767 }
9768 else
9769 {
9770 /* Not absolute_section.
9771 Need a 32-bit fixup (don't support 8bit
9772 non-absolute imms). Try to support other
9773 sizes ... */
f86103b7 9774 enum bfd_reloc_code_real reloc_type;
e205caa7
L
9775 int size = imm_size (n);
9776 int sign;
29b0f896 9777
40fb9820 9778 if (i.types[n].bitfield.imm32s
a7d61044 9779 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9780 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9781 sign = 1;
e205caa7
L
9782 else
9783 sign = 0;
520dc8e8 9784
29b0f896 9785 p = frag_more (size);
d258b828 9786 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9787
2bbd9c25
JJ
9788 /* This is tough to explain. We end up with this one if we
9789 * have operands that look like
9790 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9791 * obtain the absolute address of the GOT, and it is strongly
9792 * preferable from a performance point of view to avoid using
9793 * a runtime relocation for this. The actual sequence of
9794 * instructions often look something like:
9795 *
9796 * call .L66
9797 * .L66:
9798 * popl %ebx
9799 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9800 *
9801 * The call and pop essentially return the absolute address
9802 * of the label .L66 and store it in %ebx. The linker itself
9803 * will ultimately change the first operand of the addl so
9804 * that %ebx points to the GOT, but to keep things simple, the
9805 * .o file must have this operand set so that it generates not
9806 * the absolute address of .L66, but the absolute address of
9807 * itself. This allows the linker itself simply treat a GOTPC
9808 * relocation as asking for a pcrel offset to the GOT to be
9809 * added in, and the addend of the relocation is stored in the
9810 * operand field for the instruction itself.
9811 *
9812 * Our job here is to fix the operand so that it would add
9813 * the correct offset so that %ebx would point to itself. The
9814 * thing that is tricky is that .-.L66 will point to the
9815 * beginning of the instruction, so we need to further modify
9816 * the operand so that it will point to itself. There are
9817 * other cases where you have something like:
9818 *
9819 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9820 *
9821 * and here no correction would be required. Internally in
9822 * the assembler we treat operands of this form as not being
9823 * pcrel since the '.' is explicitly mentioned, and I wonder
9824 * whether it would simplify matters to do it this way. Who
9825 * knows. In earlier versions of the PIC patches, the
9826 * pcrel_adjust field was used to store the correction, but
9827 * since the expression is not pcrel, I felt it would be
9828 * confusing to do it this way. */
9829
d6ab8113 9830 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9831 || reloc_type == BFD_RELOC_X86_64_32S
9832 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9833 && GOT_symbol
9834 && GOT_symbol == i.op[n].imms->X_add_symbol
9835 && (i.op[n].imms->X_op == O_symbol
9836 || (i.op[n].imms->X_op == O_add
9837 && ((symbol_get_value_expression
9838 (i.op[n].imms->X_op_symbol)->X_op)
9839 == O_subtract))))
9840 {
4fa24527 9841 if (!object_64bit)
d6ab8113 9842 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9843 else if (size == 4)
d6ab8113 9844 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9845 else if (size == 8)
9846 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9847 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9848 i.op[n].imms->X_add_number +=
9849 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9850 }
29b0f896
AM
9851 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9852 i.op[n].imms, 0, reloc_type);
9853 }
9854 }
9855 }
252b5132
RH
9856}
9857\f
d182319b
JB
9858/* x86_cons_fix_new is called via the expression parsing code when a
9859 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9860static int cons_sign = -1;
9861
9862void
e3bb37b5 9863x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9864 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9865{
d258b828 9866 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9867
9868#ifdef TE_PE
9869 if (exp->X_op == O_secrel)
9870 {
9871 exp->X_op = O_symbol;
9872 r = BFD_RELOC_32_SECREL;
9873 }
9874#endif
9875
9876 fix_new_exp (frag, off, len, exp, 0, r);
9877}
9878
357d1bd8
L
9879/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9880 purpose of the `.dc.a' internal pseudo-op. */
9881
9882int
9883x86_address_bytes (void)
9884{
9885 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9886 return 4;
9887 return stdoutput->arch_info->bits_per_address / 8;
9888}
9889
d382c579
TG
9890#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9891 || defined (LEX_AT)
d258b828 9892# define lex_got(reloc, adjust, types) NULL
718ddfc0 9893#else
f3c180ae
AM
9894/* Parse operands of the form
9895 <symbol>@GOTOFF+<nnn>
9896 and similar .plt or .got references.
9897
9898 If we find one, set up the correct relocation in RELOC and copy the
9899 input string, minus the `@GOTOFF' into a malloc'd buffer for
9900 parsing by the calling routine. Return this buffer, and if ADJUST
9901 is non-null set it to the length of the string we removed from the
9902 input line. Otherwise return NULL. */
9903static char *
91d6fa6a 9904lex_got (enum bfd_reloc_code_real *rel,
64e74474 9905 int *adjust,
d258b828 9906 i386_operand_type *types)
f3c180ae 9907{
7b81dfbb
AJ
9908 /* Some of the relocations depend on the size of what field is to
9909 be relocated. But in our callers i386_immediate and i386_displacement
9910 we don't yet know the operand size (this will be set by insn
9911 matching). Hence we record the word32 relocation here,
9912 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9913 static const struct {
9914 const char *str;
cff8d58a 9915 int len;
4fa24527 9916 const enum bfd_reloc_code_real rel[2];
40fb9820 9917 const i386_operand_type types64;
f3c180ae 9918 } gotrel[] = {
8ce3d284 9919#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9920 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9921 BFD_RELOC_SIZE32 },
9922 OPERAND_TYPE_IMM32_64 },
8ce3d284 9923#endif
cff8d58a
L
9924 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9925 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9926 OPERAND_TYPE_IMM64 },
cff8d58a
L
9927 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9928 BFD_RELOC_X86_64_PLT32 },
40fb9820 9929 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9930 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9931 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9932 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9933 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9934 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9935 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9936 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9937 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9938 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9939 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9940 BFD_RELOC_X86_64_TLSGD },
40fb9820 9941 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9942 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9943 _dummy_first_bfd_reloc_code_real },
40fb9820 9944 OPERAND_TYPE_NONE },
cff8d58a
L
9945 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9946 BFD_RELOC_X86_64_TLSLD },
40fb9820 9947 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9948 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9949 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9950 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9951 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9952 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9953 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9954 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9955 _dummy_first_bfd_reloc_code_real },
40fb9820 9956 OPERAND_TYPE_NONE },
cff8d58a
L
9957 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9958 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9959 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9960 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9961 _dummy_first_bfd_reloc_code_real },
40fb9820 9962 OPERAND_TYPE_NONE },
cff8d58a
L
9963 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9964 _dummy_first_bfd_reloc_code_real },
40fb9820 9965 OPERAND_TYPE_NONE },
cff8d58a
L
9966 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9967 BFD_RELOC_X86_64_GOT32 },
40fb9820 9968 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
9969 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
9970 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 9971 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9972 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
9973 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 9974 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
9975 };
9976 char *cp;
9977 unsigned int j;
9978
d382c579 9979#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
9980 if (!IS_ELF)
9981 return NULL;
d382c579 9982#endif
718ddfc0 9983
f3c180ae 9984 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 9985 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
9986 return NULL;
9987
47465058 9988 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 9989 {
cff8d58a 9990 int len = gotrel[j].len;
28f81592 9991 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 9992 {
4fa24527 9993 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 9994 {
28f81592
AM
9995 int first, second;
9996 char *tmpbuf, *past_reloc;
f3c180ae 9997
91d6fa6a 9998 *rel = gotrel[j].rel[object_64bit];
f3c180ae 9999
3956db08
JB
10000 if (types)
10001 {
10002 if (flag_code != CODE_64BIT)
40fb9820
L
10003 {
10004 types->bitfield.imm32 = 1;
10005 types->bitfield.disp32 = 1;
10006 }
3956db08
JB
10007 else
10008 *types = gotrel[j].types64;
10009 }
10010
8fd4256d 10011 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
10012 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10013
28f81592 10014 /* The length of the first part of our input line. */
f3c180ae 10015 first = cp - input_line_pointer;
28f81592
AM
10016
10017 /* The second part goes from after the reloc token until
67c11a9b 10018 (and including) an end_of_line char or comma. */
28f81592 10019 past_reloc = cp + 1 + len;
67c11a9b
AM
10020 cp = past_reloc;
10021 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10022 ++cp;
10023 second = cp + 1 - past_reloc;
28f81592
AM
10024
10025 /* Allocate and copy string. The trailing NUL shouldn't
10026 be necessary, but be safe. */
add39d23 10027 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10028 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10029 if (second != 0 && *past_reloc != ' ')
10030 /* Replace the relocation token with ' ', so that
10031 errors like foo@GOTOFF1 will be detected. */
10032 tmpbuf[first++] = ' ';
af89796a
L
10033 else
10034 /* Increment length by 1 if the relocation token is
10035 removed. */
10036 len++;
10037 if (adjust)
10038 *adjust = len;
0787a12d
AM
10039 memcpy (tmpbuf + first, past_reloc, second);
10040 tmpbuf[first + second] = '\0';
f3c180ae
AM
10041 return tmpbuf;
10042 }
10043
4fa24527
JB
10044 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10045 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10046 return NULL;
10047 }
10048 }
10049
10050 /* Might be a symbol version string. Don't as_bad here. */
10051 return NULL;
10052}
4e4f7c87 10053#endif
f3c180ae 10054
a988325c
NC
10055#ifdef TE_PE
10056#ifdef lex_got
10057#undef lex_got
10058#endif
10059/* Parse operands of the form
10060 <symbol>@SECREL32+<nnn>
10061
10062 If we find one, set up the correct relocation in RELOC and copy the
10063 input string, minus the `@SECREL32' into a malloc'd buffer for
10064 parsing by the calling routine. Return this buffer, and if ADJUST
10065 is non-null set it to the length of the string we removed from the
34bca508
L
10066 input line. Otherwise return NULL.
10067
a988325c
NC
10068 This function is copied from the ELF version above adjusted for PE targets. */
10069
10070static char *
10071lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10072 int *adjust ATTRIBUTE_UNUSED,
d258b828 10073 i386_operand_type *types)
a988325c
NC
10074{
10075 static const struct
10076 {
10077 const char *str;
10078 int len;
10079 const enum bfd_reloc_code_real rel[2];
10080 const i386_operand_type types64;
10081 }
10082 gotrel[] =
10083 {
10084 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10085 BFD_RELOC_32_SECREL },
10086 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10087 };
10088
10089 char *cp;
10090 unsigned j;
10091
10092 for (cp = input_line_pointer; *cp != '@'; cp++)
10093 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10094 return NULL;
10095
10096 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10097 {
10098 int len = gotrel[j].len;
10099
10100 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10101 {
10102 if (gotrel[j].rel[object_64bit] != 0)
10103 {
10104 int first, second;
10105 char *tmpbuf, *past_reloc;
10106
10107 *rel = gotrel[j].rel[object_64bit];
10108 if (adjust)
10109 *adjust = len;
10110
10111 if (types)
10112 {
10113 if (flag_code != CODE_64BIT)
10114 {
10115 types->bitfield.imm32 = 1;
10116 types->bitfield.disp32 = 1;
10117 }
10118 else
10119 *types = gotrel[j].types64;
10120 }
10121
10122 /* The length of the first part of our input line. */
10123 first = cp - input_line_pointer;
10124
10125 /* The second part goes from after the reloc token until
10126 (and including) an end_of_line char or comma. */
10127 past_reloc = cp + 1 + len;
10128 cp = past_reloc;
10129 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10130 ++cp;
10131 second = cp + 1 - past_reloc;
10132
10133 /* Allocate and copy string. The trailing NUL shouldn't
10134 be necessary, but be safe. */
add39d23 10135 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10136 memcpy (tmpbuf, input_line_pointer, first);
10137 if (second != 0 && *past_reloc != ' ')
10138 /* Replace the relocation token with ' ', so that
10139 errors like foo@SECLREL321 will be detected. */
10140 tmpbuf[first++] = ' ';
10141 memcpy (tmpbuf + first, past_reloc, second);
10142 tmpbuf[first + second] = '\0';
10143 return tmpbuf;
10144 }
10145
10146 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10147 gotrel[j].str, 1 << (5 + object_64bit));
10148 return NULL;
10149 }
10150 }
10151
10152 /* Might be a symbol version string. Don't as_bad here. */
10153 return NULL;
10154}
10155
10156#endif /* TE_PE */
10157
62ebcb5c 10158bfd_reloc_code_real_type
e3bb37b5 10159x86_cons (expressionS *exp, int size)
f3c180ae 10160{
62ebcb5c
AM
10161 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10162
ee86248c
JB
10163 intel_syntax = -intel_syntax;
10164
3c7b9c2c 10165 exp->X_md = 0;
4fa24527 10166 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10167 {
10168 /* Handle @GOTOFF and the like in an expression. */
10169 char *save;
10170 char *gotfree_input_line;
4a57f2cf 10171 int adjust = 0;
f3c180ae
AM
10172
10173 save = input_line_pointer;
d258b828 10174 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10175 if (gotfree_input_line)
10176 input_line_pointer = gotfree_input_line;
10177
10178 expression (exp);
10179
10180 if (gotfree_input_line)
10181 {
10182 /* expression () has merrily parsed up to the end of line,
10183 or a comma - in the wrong buffer. Transfer how far
10184 input_line_pointer has moved to the right buffer. */
10185 input_line_pointer = (save
10186 + (input_line_pointer - gotfree_input_line)
10187 + adjust);
10188 free (gotfree_input_line);
3992d3b7
AM
10189 if (exp->X_op == O_constant
10190 || exp->X_op == O_absent
10191 || exp->X_op == O_illegal
0398aac5 10192 || exp->X_op == O_register
3992d3b7
AM
10193 || exp->X_op == O_big)
10194 {
10195 char c = *input_line_pointer;
10196 *input_line_pointer = 0;
10197 as_bad (_("missing or invalid expression `%s'"), save);
10198 *input_line_pointer = c;
10199 }
b9519cfe
L
10200 else if ((got_reloc == BFD_RELOC_386_PLT32
10201 || got_reloc == BFD_RELOC_X86_64_PLT32)
10202 && exp->X_op != O_symbol)
10203 {
10204 char c = *input_line_pointer;
10205 *input_line_pointer = 0;
10206 as_bad (_("invalid PLT expression `%s'"), save);
10207 *input_line_pointer = c;
10208 }
f3c180ae
AM
10209 }
10210 }
10211 else
10212 expression (exp);
ee86248c
JB
10213
10214 intel_syntax = -intel_syntax;
10215
10216 if (intel_syntax)
10217 i386_intel_simplify (exp);
62ebcb5c
AM
10218
10219 return got_reloc;
f3c180ae 10220}
f3c180ae 10221
9f32dd5b
L
10222static void
10223signed_cons (int size)
6482c264 10224{
d182319b
JB
10225 if (flag_code == CODE_64BIT)
10226 cons_sign = 1;
10227 cons (size);
10228 cons_sign = -1;
6482c264
NC
10229}
10230
d182319b 10231#ifdef TE_PE
6482c264 10232static void
7016a5d5 10233pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10234{
10235 expressionS exp;
10236
10237 do
10238 {
10239 expression (&exp);
10240 if (exp.X_op == O_symbol)
10241 exp.X_op = O_secrel;
10242
10243 emit_expr (&exp, 4);
10244 }
10245 while (*input_line_pointer++ == ',');
10246
10247 input_line_pointer--;
10248 demand_empty_rest_of_line ();
10249}
6482c264
NC
10250#endif
10251
43234a1e
L
10252/* Handle Vector operations. */
10253
10254static char *
10255check_VecOperations (char *op_string, char *op_end)
10256{
10257 const reg_entry *mask;
10258 const char *saved;
10259 char *end_op;
10260
10261 while (*op_string
10262 && (op_end == NULL || op_string < op_end))
10263 {
10264 saved = op_string;
10265 if (*op_string == '{')
10266 {
10267 op_string++;
10268
10269 /* Check broadcasts. */
10270 if (strncmp (op_string, "1to", 3) == 0)
10271 {
10272 int bcst_type;
10273
10274 if (i.broadcast)
10275 goto duplicated_vec_op;
10276
10277 op_string += 3;
10278 if (*op_string == '8')
8e6e0792 10279 bcst_type = 8;
b28d1bda 10280 else if (*op_string == '4')
8e6e0792 10281 bcst_type = 4;
b28d1bda 10282 else if (*op_string == '2')
8e6e0792 10283 bcst_type = 2;
43234a1e
L
10284 else if (*op_string == '1'
10285 && *(op_string+1) == '6')
10286 {
8e6e0792 10287 bcst_type = 16;
43234a1e
L
10288 op_string++;
10289 }
10290 else
10291 {
10292 as_bad (_("Unsupported broadcast: `%s'"), saved);
10293 return NULL;
10294 }
10295 op_string++;
10296
10297 broadcast_op.type = bcst_type;
10298 broadcast_op.operand = this_operand;
1f75763a 10299 broadcast_op.bytes = 0;
43234a1e
L
10300 i.broadcast = &broadcast_op;
10301 }
10302 /* Check masking operation. */
10303 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10304 {
8a6fb3f9
JB
10305 if (mask == &bad_reg)
10306 return NULL;
10307
43234a1e 10308 /* k0 can't be used for write mask. */
f74a6307 10309 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10310 {
6d2cd6b2
JB
10311 as_bad (_("`%s%s' can't be used for write mask"),
10312 register_prefix, mask->reg_name);
43234a1e
L
10313 return NULL;
10314 }
10315
10316 if (!i.mask)
10317 {
10318 mask_op.mask = mask;
10319 mask_op.zeroing = 0;
10320 mask_op.operand = this_operand;
10321 i.mask = &mask_op;
10322 }
10323 else
10324 {
10325 if (i.mask->mask)
10326 goto duplicated_vec_op;
10327
10328 i.mask->mask = mask;
10329
10330 /* Only "{z}" is allowed here. No need to check
10331 zeroing mask explicitly. */
10332 if (i.mask->operand != this_operand)
10333 {
10334 as_bad (_("invalid write mask `%s'"), saved);
10335 return NULL;
10336 }
10337 }
10338
10339 op_string = end_op;
10340 }
10341 /* Check zeroing-flag for masking operation. */
10342 else if (*op_string == 'z')
10343 {
10344 if (!i.mask)
10345 {
10346 mask_op.mask = NULL;
10347 mask_op.zeroing = 1;
10348 mask_op.operand = this_operand;
10349 i.mask = &mask_op;
10350 }
10351 else
10352 {
10353 if (i.mask->zeroing)
10354 {
10355 duplicated_vec_op:
10356 as_bad (_("duplicated `%s'"), saved);
10357 return NULL;
10358 }
10359
10360 i.mask->zeroing = 1;
10361
10362 /* Only "{%k}" is allowed here. No need to check mask
10363 register explicitly. */
10364 if (i.mask->operand != this_operand)
10365 {
10366 as_bad (_("invalid zeroing-masking `%s'"),
10367 saved);
10368 return NULL;
10369 }
10370 }
10371
10372 op_string++;
10373 }
10374 else
10375 goto unknown_vec_op;
10376
10377 if (*op_string != '}')
10378 {
10379 as_bad (_("missing `}' in `%s'"), saved);
10380 return NULL;
10381 }
10382 op_string++;
0ba3a731
L
10383
10384 /* Strip whitespace since the addition of pseudo prefixes
10385 changed how the scrubber treats '{'. */
10386 if (is_space_char (*op_string))
10387 ++op_string;
10388
43234a1e
L
10389 continue;
10390 }
10391 unknown_vec_op:
10392 /* We don't know this one. */
10393 as_bad (_("unknown vector operation: `%s'"), saved);
10394 return NULL;
10395 }
10396
6d2cd6b2
JB
10397 if (i.mask && i.mask->zeroing && !i.mask->mask)
10398 {
10399 as_bad (_("zeroing-masking only allowed with write mask"));
10400 return NULL;
10401 }
10402
43234a1e
L
10403 return op_string;
10404}
10405
252b5132 10406static int
70e41ade 10407i386_immediate (char *imm_start)
252b5132
RH
10408{
10409 char *save_input_line_pointer;
f3c180ae 10410 char *gotfree_input_line;
252b5132 10411 segT exp_seg = 0;
47926f60 10412 expressionS *exp;
40fb9820
L
10413 i386_operand_type types;
10414
0dfbf9d7 10415 operand_type_set (&types, ~0);
252b5132
RH
10416
10417 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10418 {
31b2323c
L
10419 as_bad (_("at most %d immediate operands are allowed"),
10420 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10421 return 0;
10422 }
10423
10424 exp = &im_expressions[i.imm_operands++];
520dc8e8 10425 i.op[this_operand].imms = exp;
252b5132
RH
10426
10427 if (is_space_char (*imm_start))
10428 ++imm_start;
10429
10430 save_input_line_pointer = input_line_pointer;
10431 input_line_pointer = imm_start;
10432
d258b828 10433 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10434 if (gotfree_input_line)
10435 input_line_pointer = gotfree_input_line;
252b5132
RH
10436
10437 exp_seg = expression (exp);
10438
83183c0c 10439 SKIP_WHITESPACE ();
43234a1e
L
10440
10441 /* Handle vector operations. */
10442 if (*input_line_pointer == '{')
10443 {
10444 input_line_pointer = check_VecOperations (input_line_pointer,
10445 NULL);
10446 if (input_line_pointer == NULL)
10447 return 0;
10448 }
10449
252b5132 10450 if (*input_line_pointer)
f3c180ae 10451 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10452
10453 input_line_pointer = save_input_line_pointer;
f3c180ae 10454 if (gotfree_input_line)
ee86248c
JB
10455 {
10456 free (gotfree_input_line);
10457
10458 if (exp->X_op == O_constant || exp->X_op == O_register)
10459 exp->X_op = O_illegal;
10460 }
10461
10462 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10463}
252b5132 10464
ee86248c
JB
10465static int
10466i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10467 i386_operand_type types, const char *imm_start)
10468{
10469 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10470 {
313c53d1
L
10471 if (imm_start)
10472 as_bad (_("missing or invalid immediate expression `%s'"),
10473 imm_start);
3992d3b7 10474 return 0;
252b5132 10475 }
3e73aa7c 10476 else if (exp->X_op == O_constant)
252b5132 10477 {
47926f60 10478 /* Size it properly later. */
40fb9820 10479 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10480 /* If not 64bit, sign extend val. */
10481 if (flag_code != CODE_64BIT
4eed87de
AM
10482 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10483 exp->X_add_number
10484 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10485 }
4c63da97 10486#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10487 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10488 && exp_seg != absolute_section
47926f60 10489 && exp_seg != text_section
24eab124
AM
10490 && exp_seg != data_section
10491 && exp_seg != bss_section
10492 && exp_seg != undefined_section
f86103b7 10493 && !bfd_is_com_section (exp_seg))
252b5132 10494 {
d0b47220 10495 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10496 return 0;
10497 }
10498#endif
a841bdf5 10499 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10500 {
313c53d1
L
10501 if (imm_start)
10502 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10503 return 0;
10504 }
252b5132
RH
10505 else
10506 {
10507 /* This is an address. The size of the address will be
24eab124 10508 determined later, depending on destination register,
3e73aa7c 10509 suffix, or the default for the section. */
40fb9820
L
10510 i.types[this_operand].bitfield.imm8 = 1;
10511 i.types[this_operand].bitfield.imm16 = 1;
10512 i.types[this_operand].bitfield.imm32 = 1;
10513 i.types[this_operand].bitfield.imm32s = 1;
10514 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10515 i.types[this_operand] = operand_type_and (i.types[this_operand],
10516 types);
252b5132
RH
10517 }
10518
10519 return 1;
10520}
10521
551c1ca1 10522static char *
e3bb37b5 10523i386_scale (char *scale)
252b5132 10524{
551c1ca1
AM
10525 offsetT val;
10526 char *save = input_line_pointer;
252b5132 10527
551c1ca1
AM
10528 input_line_pointer = scale;
10529 val = get_absolute_expression ();
10530
10531 switch (val)
252b5132 10532 {
551c1ca1 10533 case 1:
252b5132
RH
10534 i.log2_scale_factor = 0;
10535 break;
551c1ca1 10536 case 2:
252b5132
RH
10537 i.log2_scale_factor = 1;
10538 break;
551c1ca1 10539 case 4:
252b5132
RH
10540 i.log2_scale_factor = 2;
10541 break;
551c1ca1 10542 case 8:
252b5132
RH
10543 i.log2_scale_factor = 3;
10544 break;
10545 default:
a724f0f4
JB
10546 {
10547 char sep = *input_line_pointer;
10548
10549 *input_line_pointer = '\0';
10550 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10551 scale);
10552 *input_line_pointer = sep;
10553 input_line_pointer = save;
10554 return NULL;
10555 }
252b5132 10556 }
29b0f896 10557 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10558 {
10559 as_warn (_("scale factor of %d without an index register"),
24eab124 10560 1 << i.log2_scale_factor);
252b5132 10561 i.log2_scale_factor = 0;
252b5132 10562 }
551c1ca1
AM
10563 scale = input_line_pointer;
10564 input_line_pointer = save;
10565 return scale;
252b5132
RH
10566}
10567
252b5132 10568static int
e3bb37b5 10569i386_displacement (char *disp_start, char *disp_end)
252b5132 10570{
29b0f896 10571 expressionS *exp;
252b5132
RH
10572 segT exp_seg = 0;
10573 char *save_input_line_pointer;
f3c180ae 10574 char *gotfree_input_line;
40fb9820
L
10575 int override;
10576 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10577 int ret;
252b5132 10578
31b2323c
L
10579 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10580 {
10581 as_bad (_("at most %d displacement operands are allowed"),
10582 MAX_MEMORY_OPERANDS);
10583 return 0;
10584 }
10585
0dfbf9d7 10586 operand_type_set (&bigdisp, 0);
6f2f06be 10587 if (i.jumpabsolute
48bcea9f 10588 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10589 || (current_templates->start->opcode_modifier.jump != JUMP
10590 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10591 {
48bcea9f 10592 i386_addressing_mode ();
e05278af 10593 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10594 if (flag_code == CODE_64BIT)
10595 {
10596 if (!override)
10597 {
10598 bigdisp.bitfield.disp32s = 1;
10599 bigdisp.bitfield.disp64 = 1;
10600 }
48bcea9f
JB
10601 else
10602 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10603 }
10604 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10605 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10606 else
10607 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10608 }
10609 else
10610 {
376cd056
JB
10611 /* For PC-relative branches, the width of the displacement may be
10612 dependent upon data size, but is never dependent upon address size.
10613 Also make sure to not unintentionally match against a non-PC-relative
10614 branch template. */
10615 static templates aux_templates;
10616 const insn_template *t = current_templates->start;
10617 bfd_boolean has_intel64 = FALSE;
10618
10619 aux_templates.start = t;
10620 while (++t < current_templates->end)
10621 {
10622 if (t->opcode_modifier.jump
10623 != current_templates->start->opcode_modifier.jump)
10624 break;
4b5aaf5f 10625 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10626 has_intel64 = TRUE;
10627 }
10628 if (t < current_templates->end)
10629 {
10630 aux_templates.end = t;
10631 current_templates = &aux_templates;
10632 }
10633
e05278af 10634 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10635 if (flag_code == CODE_64BIT)
10636 {
376cd056
JB
10637 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10638 && (!intel64 || !has_intel64))
40fb9820
L
10639 bigdisp.bitfield.disp16 = 1;
10640 else
48bcea9f 10641 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10642 }
10643 else
e05278af
JB
10644 {
10645 if (!override)
10646 override = (i.suffix == (flag_code != CODE_16BIT
10647 ? WORD_MNEM_SUFFIX
10648 : LONG_MNEM_SUFFIX));
40fb9820
L
10649 bigdisp.bitfield.disp32 = 1;
10650 if ((flag_code == CODE_16BIT) ^ override)
10651 {
10652 bigdisp.bitfield.disp32 = 0;
10653 bigdisp.bitfield.disp16 = 1;
10654 }
e05278af 10655 }
e05278af 10656 }
c6fb90c8
L
10657 i.types[this_operand] = operand_type_or (i.types[this_operand],
10658 bigdisp);
252b5132
RH
10659
10660 exp = &disp_expressions[i.disp_operands];
520dc8e8 10661 i.op[this_operand].disps = exp;
252b5132
RH
10662 i.disp_operands++;
10663 save_input_line_pointer = input_line_pointer;
10664 input_line_pointer = disp_start;
10665 END_STRING_AND_SAVE (disp_end);
10666
10667#ifndef GCC_ASM_O_HACK
10668#define GCC_ASM_O_HACK 0
10669#endif
10670#if GCC_ASM_O_HACK
10671 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10672 if (i.types[this_operand].bitfield.baseIndex
24eab124 10673 && displacement_string_end[-1] == '+')
252b5132
RH
10674 {
10675 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10676 constraint within gcc asm statements.
10677 For instance:
10678
10679 #define _set_tssldt_desc(n,addr,limit,type) \
10680 __asm__ __volatile__ ( \
10681 "movw %w2,%0\n\t" \
10682 "movw %w1,2+%0\n\t" \
10683 "rorl $16,%1\n\t" \
10684 "movb %b1,4+%0\n\t" \
10685 "movb %4,5+%0\n\t" \
10686 "movb $0,6+%0\n\t" \
10687 "movb %h1,7+%0\n\t" \
10688 "rorl $16,%1" \
10689 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10690
10691 This works great except that the output assembler ends
10692 up looking a bit weird if it turns out that there is
10693 no offset. You end up producing code that looks like:
10694
10695 #APP
10696 movw $235,(%eax)
10697 movw %dx,2+(%eax)
10698 rorl $16,%edx
10699 movb %dl,4+(%eax)
10700 movb $137,5+(%eax)
10701 movb $0,6+(%eax)
10702 movb %dh,7+(%eax)
10703 rorl $16,%edx
10704 #NO_APP
10705
47926f60 10706 So here we provide the missing zero. */
24eab124
AM
10707
10708 *displacement_string_end = '0';
252b5132
RH
10709 }
10710#endif
d258b828 10711 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10712 if (gotfree_input_line)
10713 input_line_pointer = gotfree_input_line;
252b5132 10714
24eab124 10715 exp_seg = expression (exp);
252b5132 10716
636c26b0
AM
10717 SKIP_WHITESPACE ();
10718 if (*input_line_pointer)
10719 as_bad (_("junk `%s' after expression"), input_line_pointer);
10720#if GCC_ASM_O_HACK
10721 RESTORE_END_STRING (disp_end + 1);
10722#endif
636c26b0 10723 input_line_pointer = save_input_line_pointer;
636c26b0 10724 if (gotfree_input_line)
ee86248c
JB
10725 {
10726 free (gotfree_input_line);
10727
10728 if (exp->X_op == O_constant || exp->X_op == O_register)
10729 exp->X_op = O_illegal;
10730 }
10731
10732 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10733
10734 RESTORE_END_STRING (disp_end);
10735
10736 return ret;
10737}
10738
10739static int
10740i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10741 i386_operand_type types, const char *disp_start)
10742{
10743 i386_operand_type bigdisp;
10744 int ret = 1;
636c26b0 10745
24eab124
AM
10746 /* We do this to make sure that the section symbol is in
10747 the symbol table. We will ultimately change the relocation
47926f60 10748 to be relative to the beginning of the section. */
1ae12ab7 10749 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10750 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10751 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10752 {
636c26b0 10753 if (exp->X_op != O_symbol)
3992d3b7 10754 goto inv_disp;
636c26b0 10755
e5cb08ac 10756 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10757 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10758 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10759 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10760 exp->X_op = O_subtract;
10761 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10762 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10763 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10764 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10765 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10766 else
29b0f896 10767 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10768 }
252b5132 10769
3992d3b7
AM
10770 else if (exp->X_op == O_absent
10771 || exp->X_op == O_illegal
ee86248c 10772 || exp->X_op == O_big)
2daf4fd8 10773 {
3992d3b7
AM
10774 inv_disp:
10775 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10776 disp_start);
3992d3b7 10777 ret = 0;
2daf4fd8
AM
10778 }
10779
0e1147d9
L
10780 else if (flag_code == CODE_64BIT
10781 && !i.prefix[ADDR_PREFIX]
10782 && exp->X_op == O_constant)
10783 {
10784 /* Since displacement is signed extended to 64bit, don't allow
10785 disp32 and turn off disp32s if they are out of range. */
10786 i.types[this_operand].bitfield.disp32 = 0;
10787 if (!fits_in_signed_long (exp->X_add_number))
10788 {
10789 i.types[this_operand].bitfield.disp32s = 0;
10790 if (i.types[this_operand].bitfield.baseindex)
10791 {
10792 as_bad (_("0x%lx out range of signed 32bit displacement"),
10793 (long) exp->X_add_number);
10794 ret = 0;
10795 }
10796 }
10797 }
10798
4c63da97 10799#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10800 else if (exp->X_op != O_constant
10801 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10802 && exp_seg != absolute_section
10803 && exp_seg != text_section
10804 && exp_seg != data_section
10805 && exp_seg != bss_section
10806 && exp_seg != undefined_section
10807 && !bfd_is_com_section (exp_seg))
24eab124 10808 {
d0b47220 10809 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10810 ret = 0;
24eab124 10811 }
252b5132 10812#endif
3956db08 10813
48bcea9f
JB
10814 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10815 /* Constants get taken care of by optimize_disp(). */
10816 && exp->X_op != O_constant)
10817 i.types[this_operand].bitfield.disp8 = 1;
10818
40fb9820
L
10819 /* Check if this is a displacement only operand. */
10820 bigdisp = i.types[this_operand];
10821 bigdisp.bitfield.disp8 = 0;
10822 bigdisp.bitfield.disp16 = 0;
10823 bigdisp.bitfield.disp32 = 0;
10824 bigdisp.bitfield.disp32s = 0;
10825 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10826 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10827 i.types[this_operand] = operand_type_and (i.types[this_operand],
10828 types);
3956db08 10829
3992d3b7 10830 return ret;
252b5132
RH
10831}
10832
2abc2bec
JB
10833/* Return the active addressing mode, taking address override and
10834 registers forming the address into consideration. Update the
10835 address override prefix if necessary. */
47926f60 10836
2abc2bec
JB
10837static enum flag_code
10838i386_addressing_mode (void)
252b5132 10839{
be05d201
L
10840 enum flag_code addr_mode;
10841
10842 if (i.prefix[ADDR_PREFIX])
10843 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10844 else if (flag_code == CODE_16BIT
10845 && current_templates->start->cpu_flags.bitfield.cpumpx
10846 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10847 from md_assemble() by "is not a valid base/index expression"
10848 when there is a base and/or index. */
10849 && !i.types[this_operand].bitfield.baseindex)
10850 {
10851 /* MPX insn memory operands with neither base nor index must be forced
10852 to use 32-bit addressing in 16-bit mode. */
10853 addr_mode = CODE_32BIT;
10854 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10855 ++i.prefixes;
10856 gas_assert (!i.types[this_operand].bitfield.disp16);
10857 gas_assert (!i.types[this_operand].bitfield.disp32);
10858 }
be05d201
L
10859 else
10860 {
10861 addr_mode = flag_code;
10862
24eab124 10863#if INFER_ADDR_PREFIX
be05d201
L
10864 if (i.mem_operands == 0)
10865 {
10866 /* Infer address prefix from the first memory operand. */
10867 const reg_entry *addr_reg = i.base_reg;
10868
10869 if (addr_reg == NULL)
10870 addr_reg = i.index_reg;
eecb386c 10871
be05d201
L
10872 if (addr_reg)
10873 {
e968fc9b 10874 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10875 addr_mode = CODE_32BIT;
10876 else if (flag_code != CODE_64BIT
dc821c5f 10877 && addr_reg->reg_type.bitfield.word)
be05d201
L
10878 addr_mode = CODE_16BIT;
10879
10880 if (addr_mode != flag_code)
10881 {
10882 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10883 i.prefixes += 1;
10884 /* Change the size of any displacement too. At most one
10885 of Disp16 or Disp32 is set.
10886 FIXME. There doesn't seem to be any real need for
10887 separate Disp16 and Disp32 flags. The same goes for
10888 Imm16 and Imm32. Removing them would probably clean
10889 up the code quite a lot. */
10890 if (flag_code != CODE_64BIT
10891 && (i.types[this_operand].bitfield.disp16
10892 || i.types[this_operand].bitfield.disp32))
10893 i.types[this_operand]
10894 = operand_type_xor (i.types[this_operand], disp16_32);
10895 }
10896 }
10897 }
24eab124 10898#endif
be05d201
L
10899 }
10900
2abc2bec
JB
10901 return addr_mode;
10902}
10903
10904/* Make sure the memory operand we've been dealt is valid.
10905 Return 1 on success, 0 on a failure. */
10906
10907static int
10908i386_index_check (const char *operand_string)
10909{
10910 const char *kind = "base/index";
10911 enum flag_code addr_mode = i386_addressing_mode ();
10912
fc0763e6 10913 if (current_templates->start->opcode_modifier.isstring
c3949f43 10914 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10915 && (current_templates->end[-1].opcode_modifier.isstring
10916 || i.mem_operands))
10917 {
10918 /* Memory operands of string insns are special in that they only allow
10919 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10920 const reg_entry *expected_reg;
10921 static const char *di_si[][2] =
10922 {
10923 { "esi", "edi" },
10924 { "si", "di" },
10925 { "rsi", "rdi" }
10926 };
10927 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10928
10929 kind = "string address";
10930
8325cc63 10931 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10932 {
51c8edf6
JB
10933 int es_op = current_templates->end[-1].opcode_modifier.isstring
10934 - IS_STRING_ES_OP0;
10935 int op = 0;
fc0763e6 10936
51c8edf6 10937 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10938 || ((!i.mem_operands != !intel_syntax)
10939 && current_templates->end[-1].operand_types[1]
10940 .bitfield.baseindex))
51c8edf6
JB
10941 op = 1;
10942 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10943 }
10944 else
be05d201 10945 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10946
be05d201
L
10947 if (i.base_reg != expected_reg
10948 || i.index_reg
fc0763e6 10949 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10950 {
be05d201
L
10951 /* The second memory operand must have the same size as
10952 the first one. */
10953 if (i.mem_operands
10954 && i.base_reg
10955 && !((addr_mode == CODE_64BIT
dc821c5f 10956 && i.base_reg->reg_type.bitfield.qword)
be05d201 10957 || (addr_mode == CODE_32BIT
dc821c5f
JB
10958 ? i.base_reg->reg_type.bitfield.dword
10959 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10960 goto bad_address;
10961
fc0763e6
JB
10962 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10963 operand_string,
10964 intel_syntax ? '[' : '(',
10965 register_prefix,
be05d201 10966 expected_reg->reg_name,
fc0763e6 10967 intel_syntax ? ']' : ')');
be05d201 10968 return 1;
fc0763e6 10969 }
be05d201
L
10970 else
10971 return 1;
10972
dc1e8a47 10973 bad_address:
be05d201
L
10974 as_bad (_("`%s' is not a valid %s expression"),
10975 operand_string, kind);
10976 return 0;
3e73aa7c
JH
10977 }
10978 else
10979 {
be05d201
L
10980 if (addr_mode != CODE_16BIT)
10981 {
10982 /* 32-bit/64-bit checks. */
10983 if ((i.base_reg
e968fc9b
JB
10984 && ((addr_mode == CODE_64BIT
10985 ? !i.base_reg->reg_type.bitfield.qword
10986 : !i.base_reg->reg_type.bitfield.dword)
10987 || (i.index_reg && i.base_reg->reg_num == RegIP)
10988 || i.base_reg->reg_num == RegIZ))
be05d201 10989 || (i.index_reg
1b54b8d7
JB
10990 && !i.index_reg->reg_type.bitfield.xmmword
10991 && !i.index_reg->reg_type.bitfield.ymmword
10992 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 10993 && ((addr_mode == CODE_64BIT
e968fc9b
JB
10994 ? !i.index_reg->reg_type.bitfield.qword
10995 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
10996 || !i.index_reg->reg_type.bitfield.baseindex)))
10997 goto bad_address;
8178be5b 10998
260cd341 10999 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
8178be5b 11000 if (current_templates->start->base_opcode == 0xf30f1b
260cd341
LC
11001 || (current_templates->start->base_opcode & ~1) == 0x0f1a
11002 || current_templates->start->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11003 {
11004 /* They cannot use RIP-relative addressing. */
e968fc9b 11005 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11006 {
11007 as_bad (_("`%s' cannot be used here"), operand_string);
11008 return 0;
11009 }
11010
11011 /* bndldx and bndstx ignore their scale factor. */
260cd341 11012 if ((current_templates->start->base_opcode & ~1) == 0x0f1a
8178be5b
JB
11013 && i.log2_scale_factor)
11014 as_warn (_("register scaling is being ignored here"));
11015 }
be05d201
L
11016 }
11017 else
3e73aa7c 11018 {
be05d201 11019 /* 16-bit checks. */
3e73aa7c 11020 if ((i.base_reg
dc821c5f 11021 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11022 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11023 || (i.index_reg
dc821c5f 11024 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11025 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11026 || !(i.base_reg
11027 && i.base_reg->reg_num < 6
11028 && i.index_reg->reg_num >= 6
11029 && i.log2_scale_factor == 0))))
be05d201 11030 goto bad_address;
3e73aa7c
JH
11031 }
11032 }
be05d201 11033 return 1;
24eab124 11034}
252b5132 11035
43234a1e
L
11036/* Handle vector immediates. */
11037
11038static int
11039RC_SAE_immediate (const char *imm_start)
11040{
11041 unsigned int match_found, j;
11042 const char *pstr = imm_start;
11043 expressionS *exp;
11044
11045 if (*pstr != '{')
11046 return 0;
11047
11048 pstr++;
11049 match_found = 0;
11050 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11051 {
11052 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11053 {
11054 if (!i.rounding)
11055 {
11056 rc_op.type = RC_NamesTable[j].type;
11057 rc_op.operand = this_operand;
11058 i.rounding = &rc_op;
11059 }
11060 else
11061 {
11062 as_bad (_("duplicated `%s'"), imm_start);
11063 return 0;
11064 }
11065 pstr += RC_NamesTable[j].len;
11066 match_found = 1;
11067 break;
11068 }
11069 }
11070 if (!match_found)
11071 return 0;
11072
11073 if (*pstr++ != '}')
11074 {
11075 as_bad (_("Missing '}': '%s'"), imm_start);
11076 return 0;
11077 }
11078 /* RC/SAE immediate string should contain nothing more. */;
11079 if (*pstr != 0)
11080 {
11081 as_bad (_("Junk after '}': '%s'"), imm_start);
11082 return 0;
11083 }
11084
11085 exp = &im_expressions[i.imm_operands++];
11086 i.op[this_operand].imms = exp;
11087
11088 exp->X_op = O_constant;
11089 exp->X_add_number = 0;
11090 exp->X_add_symbol = (symbolS *) 0;
11091 exp->X_op_symbol = (symbolS *) 0;
11092
11093 i.types[this_operand].bitfield.imm8 = 1;
11094 return 1;
11095}
11096
8325cc63
JB
11097/* Only string instructions can have a second memory operand, so
11098 reduce current_templates to just those if it contains any. */
11099static int
11100maybe_adjust_templates (void)
11101{
11102 const insn_template *t;
11103
11104 gas_assert (i.mem_operands == 1);
11105
11106 for (t = current_templates->start; t < current_templates->end; ++t)
11107 if (t->opcode_modifier.isstring)
11108 break;
11109
11110 if (t < current_templates->end)
11111 {
11112 static templates aux_templates;
11113 bfd_boolean recheck;
11114
11115 aux_templates.start = t;
11116 for (; t < current_templates->end; ++t)
11117 if (!t->opcode_modifier.isstring)
11118 break;
11119 aux_templates.end = t;
11120
11121 /* Determine whether to re-check the first memory operand. */
11122 recheck = (aux_templates.start != current_templates->start
11123 || t != current_templates->end);
11124
11125 current_templates = &aux_templates;
11126
11127 if (recheck)
11128 {
11129 i.mem_operands = 0;
11130 if (i.memop1_string != NULL
11131 && i386_index_check (i.memop1_string) == 0)
11132 return 0;
11133 i.mem_operands = 1;
11134 }
11135 }
11136
11137 return 1;
11138}
11139
fc0763e6 11140/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11141 on error. */
252b5132 11142
252b5132 11143static int
a7619375 11144i386_att_operand (char *operand_string)
252b5132 11145{
af6bdddf
AM
11146 const reg_entry *r;
11147 char *end_op;
24eab124 11148 char *op_string = operand_string;
252b5132 11149
24eab124 11150 if (is_space_char (*op_string))
252b5132
RH
11151 ++op_string;
11152
24eab124 11153 /* We check for an absolute prefix (differentiating,
47926f60 11154 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11155 if (*op_string == ABSOLUTE_PREFIX)
11156 {
11157 ++op_string;
11158 if (is_space_char (*op_string))
11159 ++op_string;
6f2f06be 11160 i.jumpabsolute = TRUE;
24eab124 11161 }
252b5132 11162
47926f60 11163 /* Check if operand is a register. */
4d1bb795 11164 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11165 {
40fb9820
L
11166 i386_operand_type temp;
11167
8a6fb3f9
JB
11168 if (r == &bad_reg)
11169 return 0;
11170
24eab124
AM
11171 /* Check for a segment override by searching for ':' after a
11172 segment register. */
11173 op_string = end_op;
11174 if (is_space_char (*op_string))
11175 ++op_string;
00cee14f 11176 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11177 {
11178 switch (r->reg_num)
11179 {
11180 case 0:
11181 i.seg[i.mem_operands] = &es;
11182 break;
11183 case 1:
11184 i.seg[i.mem_operands] = &cs;
11185 break;
11186 case 2:
11187 i.seg[i.mem_operands] = &ss;
11188 break;
11189 case 3:
11190 i.seg[i.mem_operands] = &ds;
11191 break;
11192 case 4:
11193 i.seg[i.mem_operands] = &fs;
11194 break;
11195 case 5:
11196 i.seg[i.mem_operands] = &gs;
11197 break;
11198 }
252b5132 11199
24eab124 11200 /* Skip the ':' and whitespace. */
252b5132
RH
11201 ++op_string;
11202 if (is_space_char (*op_string))
24eab124 11203 ++op_string;
252b5132 11204
24eab124
AM
11205 if (!is_digit_char (*op_string)
11206 && !is_identifier_char (*op_string)
11207 && *op_string != '('
11208 && *op_string != ABSOLUTE_PREFIX)
11209 {
11210 as_bad (_("bad memory operand `%s'"), op_string);
11211 return 0;
11212 }
47926f60 11213 /* Handle case of %es:*foo. */
24eab124
AM
11214 if (*op_string == ABSOLUTE_PREFIX)
11215 {
11216 ++op_string;
11217 if (is_space_char (*op_string))
11218 ++op_string;
6f2f06be 11219 i.jumpabsolute = TRUE;
24eab124
AM
11220 }
11221 goto do_memory_reference;
11222 }
43234a1e
L
11223
11224 /* Handle vector operations. */
11225 if (*op_string == '{')
11226 {
11227 op_string = check_VecOperations (op_string, NULL);
11228 if (op_string == NULL)
11229 return 0;
11230 }
11231
24eab124
AM
11232 if (*op_string)
11233 {
d0b47220 11234 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11235 return 0;
11236 }
40fb9820
L
11237 temp = r->reg_type;
11238 temp.bitfield.baseindex = 0;
c6fb90c8
L
11239 i.types[this_operand] = operand_type_or (i.types[this_operand],
11240 temp);
7d5e4556 11241 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11242 i.op[this_operand].regs = r;
24eab124
AM
11243 i.reg_operands++;
11244 }
af6bdddf
AM
11245 else if (*op_string == REGISTER_PREFIX)
11246 {
11247 as_bad (_("bad register name `%s'"), op_string);
11248 return 0;
11249 }
24eab124 11250 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11251 {
24eab124 11252 ++op_string;
6f2f06be 11253 if (i.jumpabsolute)
24eab124 11254 {
d0b47220 11255 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11256 return 0;
11257 }
11258 if (!i386_immediate (op_string))
11259 return 0;
11260 }
43234a1e
L
11261 else if (RC_SAE_immediate (operand_string))
11262 {
11263 /* If it is a RC or SAE immediate, do nothing. */
11264 ;
11265 }
24eab124
AM
11266 else if (is_digit_char (*op_string)
11267 || is_identifier_char (*op_string)
d02603dc 11268 || *op_string == '"'
e5cb08ac 11269 || *op_string == '(')
24eab124 11270 {
47926f60 11271 /* This is a memory reference of some sort. */
af6bdddf 11272 char *base_string;
252b5132 11273
47926f60 11274 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11275 char *displacement_string_start;
11276 char *displacement_string_end;
43234a1e 11277 char *vop_start;
252b5132 11278
24eab124 11279 do_memory_reference:
8325cc63
JB
11280 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11281 return 0;
24eab124 11282 if ((i.mem_operands == 1
40fb9820 11283 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11284 || i.mem_operands == 2)
11285 {
11286 as_bad (_("too many memory references for `%s'"),
11287 current_templates->start->name);
11288 return 0;
11289 }
252b5132 11290
24eab124
AM
11291 /* Check for base index form. We detect the base index form by
11292 looking for an ')' at the end of the operand, searching
11293 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11294 after the '('. */
af6bdddf 11295 base_string = op_string + strlen (op_string);
c3332e24 11296
43234a1e
L
11297 /* Handle vector operations. */
11298 vop_start = strchr (op_string, '{');
11299 if (vop_start && vop_start < base_string)
11300 {
11301 if (check_VecOperations (vop_start, base_string) == NULL)
11302 return 0;
11303 base_string = vop_start;
11304 }
11305
af6bdddf
AM
11306 --base_string;
11307 if (is_space_char (*base_string))
11308 --base_string;
252b5132 11309
47926f60 11310 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11311 displacement_string_start = op_string;
11312 displacement_string_end = base_string + 1;
252b5132 11313
24eab124
AM
11314 if (*base_string == ')')
11315 {
af6bdddf 11316 char *temp_string;
24eab124
AM
11317 unsigned int parens_balanced = 1;
11318 /* We've already checked that the number of left & right ()'s are
47926f60 11319 equal, so this loop will not be infinite. */
24eab124
AM
11320 do
11321 {
11322 base_string--;
11323 if (*base_string == ')')
11324 parens_balanced++;
11325 if (*base_string == '(')
11326 parens_balanced--;
11327 }
11328 while (parens_balanced);
c3332e24 11329
af6bdddf 11330 temp_string = base_string;
c3332e24 11331
24eab124 11332 /* Skip past '(' and whitespace. */
252b5132
RH
11333 ++base_string;
11334 if (is_space_char (*base_string))
24eab124 11335 ++base_string;
252b5132 11336
af6bdddf 11337 if (*base_string == ','
4eed87de
AM
11338 || ((i.base_reg = parse_register (base_string, &end_op))
11339 != NULL))
252b5132 11340 {
af6bdddf 11341 displacement_string_end = temp_string;
252b5132 11342
40fb9820 11343 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11344
af6bdddf 11345 if (i.base_reg)
24eab124 11346 {
8a6fb3f9
JB
11347 if (i.base_reg == &bad_reg)
11348 return 0;
24eab124
AM
11349 base_string = end_op;
11350 if (is_space_char (*base_string))
11351 ++base_string;
af6bdddf
AM
11352 }
11353
11354 /* There may be an index reg or scale factor here. */
11355 if (*base_string == ',')
11356 {
11357 ++base_string;
11358 if (is_space_char (*base_string))
11359 ++base_string;
11360
4eed87de
AM
11361 if ((i.index_reg = parse_register (base_string, &end_op))
11362 != NULL)
24eab124 11363 {
8a6fb3f9
JB
11364 if (i.index_reg == &bad_reg)
11365 return 0;
af6bdddf 11366 base_string = end_op;
24eab124
AM
11367 if (is_space_char (*base_string))
11368 ++base_string;
af6bdddf
AM
11369 if (*base_string == ',')
11370 {
11371 ++base_string;
11372 if (is_space_char (*base_string))
11373 ++base_string;
11374 }
e5cb08ac 11375 else if (*base_string != ')')
af6bdddf 11376 {
4eed87de
AM
11377 as_bad (_("expecting `,' or `)' "
11378 "after index register in `%s'"),
af6bdddf
AM
11379 operand_string);
11380 return 0;
11381 }
24eab124 11382 }
af6bdddf 11383 else if (*base_string == REGISTER_PREFIX)
24eab124 11384 {
f76bf5e0
L
11385 end_op = strchr (base_string, ',');
11386 if (end_op)
11387 *end_op = '\0';
af6bdddf 11388 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11389 return 0;
11390 }
252b5132 11391
47926f60 11392 /* Check for scale factor. */
551c1ca1 11393 if (*base_string != ')')
af6bdddf 11394 {
551c1ca1
AM
11395 char *end_scale = i386_scale (base_string);
11396
11397 if (!end_scale)
af6bdddf 11398 return 0;
24eab124 11399
551c1ca1 11400 base_string = end_scale;
af6bdddf
AM
11401 if (is_space_char (*base_string))
11402 ++base_string;
11403 if (*base_string != ')')
11404 {
4eed87de
AM
11405 as_bad (_("expecting `)' "
11406 "after scale factor in `%s'"),
af6bdddf
AM
11407 operand_string);
11408 return 0;
11409 }
11410 }
11411 else if (!i.index_reg)
24eab124 11412 {
4eed87de
AM
11413 as_bad (_("expecting index register or scale factor "
11414 "after `,'; got '%c'"),
af6bdddf 11415 *base_string);
24eab124
AM
11416 return 0;
11417 }
11418 }
af6bdddf 11419 else if (*base_string != ')')
24eab124 11420 {
4eed87de
AM
11421 as_bad (_("expecting `,' or `)' "
11422 "after base register in `%s'"),
af6bdddf 11423 operand_string);
24eab124
AM
11424 return 0;
11425 }
c3332e24 11426 }
af6bdddf 11427 else if (*base_string == REGISTER_PREFIX)
c3332e24 11428 {
f76bf5e0
L
11429 end_op = strchr (base_string, ',');
11430 if (end_op)
11431 *end_op = '\0';
af6bdddf 11432 as_bad (_("bad register name `%s'"), base_string);
24eab124 11433 return 0;
c3332e24 11434 }
24eab124
AM
11435 }
11436
11437 /* If there's an expression beginning the operand, parse it,
11438 assuming displacement_string_start and
11439 displacement_string_end are meaningful. */
11440 if (displacement_string_start != displacement_string_end)
11441 {
11442 if (!i386_displacement (displacement_string_start,
11443 displacement_string_end))
11444 return 0;
11445 }
11446
11447 /* Special case for (%dx) while doing input/output op. */
11448 if (i.base_reg
75e5731b
JB
11449 && i.base_reg->reg_type.bitfield.instance == RegD
11450 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11451 && i.index_reg == 0
11452 && i.log2_scale_factor == 0
11453 && i.seg[i.mem_operands] == 0
40fb9820 11454 && !operand_type_check (i.types[this_operand], disp))
24eab124 11455 {
2fb5be8d 11456 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11457 return 1;
11458 }
11459
eecb386c
AM
11460 if (i386_index_check (operand_string) == 0)
11461 return 0;
c48dadc9 11462 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11463 if (i.mem_operands == 0)
11464 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11465 i.mem_operands++;
11466 }
11467 else
ce8a8b2f
AM
11468 {
11469 /* It's not a memory operand; argh! */
24eab124
AM
11470 as_bad (_("invalid char %s beginning operand %d `%s'"),
11471 output_invalid (*op_string),
11472 this_operand + 1,
11473 op_string);
11474 return 0;
11475 }
47926f60 11476 return 1; /* Normal return. */
252b5132
RH
11477}
11478\f
fa94de6b
RM
11479/* Calculate the maximum variable size (i.e., excluding fr_fix)
11480 that an rs_machine_dependent frag may reach. */
11481
11482unsigned int
11483i386_frag_max_var (fragS *frag)
11484{
11485 /* The only relaxable frags are for jumps.
11486 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11487 gas_assert (frag->fr_type == rs_machine_dependent);
11488 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11489}
11490
b084df0b
L
11491#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11492static int
8dcea932 11493elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11494{
11495 /* STT_GNU_IFUNC symbol must go through PLT. */
11496 if ((symbol_get_bfdsym (fr_symbol)->flags
11497 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11498 return 0;
11499
11500 if (!S_IS_EXTERNAL (fr_symbol))
11501 /* Symbol may be weak or local. */
11502 return !S_IS_WEAK (fr_symbol);
11503
8dcea932
L
11504 /* Global symbols with non-default visibility can't be preempted. */
11505 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11506 return 1;
11507
11508 if (fr_var != NO_RELOC)
11509 switch ((enum bfd_reloc_code_real) fr_var)
11510 {
11511 case BFD_RELOC_386_PLT32:
11512 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11513 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11514 return 0;
11515 default:
11516 abort ();
11517 }
11518
b084df0b
L
11519 /* Global symbols with default visibility in a shared library may be
11520 preempted by another definition. */
8dcea932 11521 return !shared;
b084df0b
L
11522}
11523#endif
11524
79d72f45
HL
11525/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11526 Note also work for Skylake and Cascadelake.
11527---------------------------------------------------------------------
11528| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11529| ------ | ----------- | ------- | -------- |
11530| Jo | N | N | Y |
11531| Jno | N | N | Y |
11532| Jc/Jb | Y | N | Y |
11533| Jae/Jnb | Y | N | Y |
11534| Je/Jz | Y | Y | Y |
11535| Jne/Jnz | Y | Y | Y |
11536| Jna/Jbe | Y | N | Y |
11537| Ja/Jnbe | Y | N | Y |
11538| Js | N | N | Y |
11539| Jns | N | N | Y |
11540| Jp/Jpe | N | N | Y |
11541| Jnp/Jpo | N | N | Y |
11542| Jl/Jnge | Y | Y | Y |
11543| Jge/Jnl | Y | Y | Y |
11544| Jle/Jng | Y | Y | Y |
11545| Jg/Jnle | Y | Y | Y |
11546--------------------------------------------------------------------- */
11547static int
11548i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11549{
11550 if (mf_cmp == mf_cmp_alu_cmp)
11551 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11552 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11553 if (mf_cmp == mf_cmp_incdec)
11554 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11555 || mf_jcc == mf_jcc_jle);
11556 if (mf_cmp == mf_cmp_test_and)
11557 return 1;
11558 return 0;
11559}
11560
e379e5f3
L
11561/* Return the next non-empty frag. */
11562
11563static fragS *
11564i386_next_non_empty_frag (fragS *fragP)
11565{
11566 /* There may be a frag with a ".fill 0" when there is no room in
11567 the current frag for frag_grow in output_insn. */
11568 for (fragP = fragP->fr_next;
11569 (fragP != NULL
11570 && fragP->fr_type == rs_fill
11571 && fragP->fr_fix == 0);
11572 fragP = fragP->fr_next)
11573 ;
11574 return fragP;
11575}
11576
11577/* Return the next jcc frag after BRANCH_PADDING. */
11578
11579static fragS *
79d72f45 11580i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11581{
79d72f45
HL
11582 fragS *branch_fragP;
11583 if (!pad_fragP)
e379e5f3
L
11584 return NULL;
11585
79d72f45
HL
11586 if (pad_fragP->fr_type == rs_machine_dependent
11587 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11588 == BRANCH_PADDING))
11589 {
79d72f45
HL
11590 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11591 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11592 return NULL;
79d72f45
HL
11593 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11594 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11595 pad_fragP->tc_frag_data.mf_type))
11596 return branch_fragP;
e379e5f3
L
11597 }
11598
11599 return NULL;
11600}
11601
11602/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11603
11604static void
11605i386_classify_machine_dependent_frag (fragS *fragP)
11606{
11607 fragS *cmp_fragP;
11608 fragS *pad_fragP;
11609 fragS *branch_fragP;
11610 fragS *next_fragP;
11611 unsigned int max_prefix_length;
11612
11613 if (fragP->tc_frag_data.classified)
11614 return;
11615
11616 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11617 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11618 for (next_fragP = fragP;
11619 next_fragP != NULL;
11620 next_fragP = next_fragP->fr_next)
11621 {
11622 next_fragP->tc_frag_data.classified = 1;
11623 if (next_fragP->fr_type == rs_machine_dependent)
11624 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11625 {
11626 case BRANCH_PADDING:
11627 /* The BRANCH_PADDING frag must be followed by a branch
11628 frag. */
11629 branch_fragP = i386_next_non_empty_frag (next_fragP);
11630 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11631 break;
11632 case FUSED_JCC_PADDING:
11633 /* Check if this is a fused jcc:
11634 FUSED_JCC_PADDING
11635 CMP like instruction
11636 BRANCH_PADDING
11637 COND_JUMP
11638 */
11639 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11640 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11641 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11642 if (branch_fragP)
11643 {
11644 /* The BRANCH_PADDING frag is merged with the
11645 FUSED_JCC_PADDING frag. */
11646 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11647 /* CMP like instruction size. */
11648 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11649 frag_wane (pad_fragP);
11650 /* Skip to branch_fragP. */
11651 next_fragP = branch_fragP;
11652 }
11653 else if (next_fragP->tc_frag_data.max_prefix_length)
11654 {
11655 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11656 a fused jcc. */
11657 next_fragP->fr_subtype
11658 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11659 next_fragP->tc_frag_data.max_bytes
11660 = next_fragP->tc_frag_data.max_prefix_length;
11661 /* This will be updated in the BRANCH_PREFIX scan. */
11662 next_fragP->tc_frag_data.max_prefix_length = 0;
11663 }
11664 else
11665 frag_wane (next_fragP);
11666 break;
11667 }
11668 }
11669
11670 /* Stop if there is no BRANCH_PREFIX. */
11671 if (!align_branch_prefix_size)
11672 return;
11673
11674 /* Scan for BRANCH_PREFIX. */
11675 for (; fragP != NULL; fragP = fragP->fr_next)
11676 {
11677 if (fragP->fr_type != rs_machine_dependent
11678 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11679 != BRANCH_PREFIX))
11680 continue;
11681
11682 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11683 COND_JUMP_PREFIX. */
11684 max_prefix_length = 0;
11685 for (next_fragP = fragP;
11686 next_fragP != NULL;
11687 next_fragP = next_fragP->fr_next)
11688 {
11689 if (next_fragP->fr_type == rs_fill)
11690 /* Skip rs_fill frags. */
11691 continue;
11692 else if (next_fragP->fr_type != rs_machine_dependent)
11693 /* Stop for all other frags. */
11694 break;
11695
11696 /* rs_machine_dependent frags. */
11697 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11698 == BRANCH_PREFIX)
11699 {
11700 /* Count BRANCH_PREFIX frags. */
11701 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11702 {
11703 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11704 frag_wane (next_fragP);
11705 }
11706 else
11707 max_prefix_length
11708 += next_fragP->tc_frag_data.max_bytes;
11709 }
11710 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11711 == BRANCH_PADDING)
11712 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11713 == FUSED_JCC_PADDING))
11714 {
11715 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11716 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11717 break;
11718 }
11719 else
11720 /* Stop for other rs_machine_dependent frags. */
11721 break;
11722 }
11723
11724 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11725
11726 /* Skip to the next frag. */
11727 fragP = next_fragP;
11728 }
11729}
11730
11731/* Compute padding size for
11732
11733 FUSED_JCC_PADDING
11734 CMP like instruction
11735 BRANCH_PADDING
11736 COND_JUMP/UNCOND_JUMP
11737
11738 or
11739
11740 BRANCH_PADDING
11741 COND_JUMP/UNCOND_JUMP
11742 */
11743
11744static int
11745i386_branch_padding_size (fragS *fragP, offsetT address)
11746{
11747 unsigned int offset, size, padding_size;
11748 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11749
11750 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11751 if (!address)
11752 address = fragP->fr_address;
11753 address += fragP->fr_fix;
11754
11755 /* CMP like instrunction size. */
11756 size = fragP->tc_frag_data.cmp_size;
11757
11758 /* The base size of the branch frag. */
11759 size += branch_fragP->fr_fix;
11760
11761 /* Add opcode and displacement bytes for the rs_machine_dependent
11762 branch frag. */
11763 if (branch_fragP->fr_type == rs_machine_dependent)
11764 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11765
11766 /* Check if branch is within boundary and doesn't end at the last
11767 byte. */
11768 offset = address & ((1U << align_branch_power) - 1);
11769 if ((offset + size) >= (1U << align_branch_power))
11770 /* Padding needed to avoid crossing boundary. */
11771 padding_size = (1U << align_branch_power) - offset;
11772 else
11773 /* No padding needed. */
11774 padding_size = 0;
11775
11776 /* The return value may be saved in tc_frag_data.length which is
11777 unsigned byte. */
11778 if (!fits_in_unsigned_byte (padding_size))
11779 abort ();
11780
11781 return padding_size;
11782}
11783
11784/* i386_generic_table_relax_frag()
11785
11786 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11787 grow/shrink padding to align branch frags. Hand others to
11788 relax_frag(). */
11789
11790long
11791i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11792{
11793 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11794 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11795 {
11796 long padding_size = i386_branch_padding_size (fragP, 0);
11797 long grow = padding_size - fragP->tc_frag_data.length;
11798
11799 /* When the BRANCH_PREFIX frag is used, the computed address
11800 must match the actual address and there should be no padding. */
11801 if (fragP->tc_frag_data.padding_address
11802 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11803 || padding_size))
11804 abort ();
11805
11806 /* Update the padding size. */
11807 if (grow)
11808 fragP->tc_frag_data.length = padding_size;
11809
11810 return grow;
11811 }
11812 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11813 {
11814 fragS *padding_fragP, *next_fragP;
11815 long padding_size, left_size, last_size;
11816
11817 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11818 if (!padding_fragP)
11819 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11820 return (fragP->tc_frag_data.length
11821 - fragP->tc_frag_data.last_length);
11822
11823 /* Compute the relative address of the padding frag in the very
11824 first time where the BRANCH_PREFIX frag sizes are zero. */
11825 if (!fragP->tc_frag_data.padding_address)
11826 fragP->tc_frag_data.padding_address
11827 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11828
11829 /* First update the last length from the previous interation. */
11830 left_size = fragP->tc_frag_data.prefix_length;
11831 for (next_fragP = fragP;
11832 next_fragP != padding_fragP;
11833 next_fragP = next_fragP->fr_next)
11834 if (next_fragP->fr_type == rs_machine_dependent
11835 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11836 == BRANCH_PREFIX))
11837 {
11838 if (left_size)
11839 {
11840 int max = next_fragP->tc_frag_data.max_bytes;
11841 if (max)
11842 {
11843 int size;
11844 if (max > left_size)
11845 size = left_size;
11846 else
11847 size = max;
11848 left_size -= size;
11849 next_fragP->tc_frag_data.last_length = size;
11850 }
11851 }
11852 else
11853 next_fragP->tc_frag_data.last_length = 0;
11854 }
11855
11856 /* Check the padding size for the padding frag. */
11857 padding_size = i386_branch_padding_size
11858 (padding_fragP, (fragP->fr_address
11859 + fragP->tc_frag_data.padding_address));
11860
11861 last_size = fragP->tc_frag_data.prefix_length;
11862 /* Check if there is change from the last interation. */
11863 if (padding_size == last_size)
11864 {
11865 /* Update the expected address of the padding frag. */
11866 padding_fragP->tc_frag_data.padding_address
11867 = (fragP->fr_address + padding_size
11868 + fragP->tc_frag_data.padding_address);
11869 return 0;
11870 }
11871
11872 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11873 {
11874 /* No padding if there is no sufficient room. Clear the
11875 expected address of the padding frag. */
11876 padding_fragP->tc_frag_data.padding_address = 0;
11877 padding_size = 0;
11878 }
11879 else
11880 /* Store the expected address of the padding frag. */
11881 padding_fragP->tc_frag_data.padding_address
11882 = (fragP->fr_address + padding_size
11883 + fragP->tc_frag_data.padding_address);
11884
11885 fragP->tc_frag_data.prefix_length = padding_size;
11886
11887 /* Update the length for the current interation. */
11888 left_size = padding_size;
11889 for (next_fragP = fragP;
11890 next_fragP != padding_fragP;
11891 next_fragP = next_fragP->fr_next)
11892 if (next_fragP->fr_type == rs_machine_dependent
11893 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11894 == BRANCH_PREFIX))
11895 {
11896 if (left_size)
11897 {
11898 int max = next_fragP->tc_frag_data.max_bytes;
11899 if (max)
11900 {
11901 int size;
11902 if (max > left_size)
11903 size = left_size;
11904 else
11905 size = max;
11906 left_size -= size;
11907 next_fragP->tc_frag_data.length = size;
11908 }
11909 }
11910 else
11911 next_fragP->tc_frag_data.length = 0;
11912 }
11913
11914 return (fragP->tc_frag_data.length
11915 - fragP->tc_frag_data.last_length);
11916 }
11917 return relax_frag (segment, fragP, stretch);
11918}
11919
ee7fcc42
AM
11920/* md_estimate_size_before_relax()
11921
11922 Called just before relax() for rs_machine_dependent frags. The x86
11923 assembler uses these frags to handle variable size jump
11924 instructions.
11925
11926 Any symbol that is now undefined will not become defined.
11927 Return the correct fr_subtype in the frag.
11928 Return the initial "guess for variable size of frag" to caller.
11929 The guess is actually the growth beyond the fixed part. Whatever
11930 we do to grow the fixed or variable part contributes to our
11931 returned value. */
11932
252b5132 11933int
7016a5d5 11934md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11935{
e379e5f3
L
11936 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11937 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11938 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11939 {
11940 i386_classify_machine_dependent_frag (fragP);
11941 return fragP->tc_frag_data.length;
11942 }
11943
252b5132 11944 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11945 check for un-relaxable symbols. On an ELF system, we can't relax
11946 an externally visible symbol, because it may be overridden by a
11947 shared library. */
11948 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11949#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11950 || (IS_ELF
8dcea932
L
11951 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11952 fragP->fr_var))
fbeb56a4
DK
11953#endif
11954#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11955 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11956 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11957#endif
11958 )
252b5132 11959 {
b98ef147
AM
11960 /* Symbol is undefined in this segment, or we need to keep a
11961 reloc so that weak symbols can be overridden. */
11962 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11963 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11964 unsigned char *opcode;
11965 int old_fr_fix;
f6af82bd 11966
ee7fcc42 11967 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 11968 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 11969 else if (size == 2)
f6af82bd 11970 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
11971#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11972 else if (need_plt32_p (fragP->fr_symbol))
11973 reloc_type = BFD_RELOC_X86_64_PLT32;
11974#endif
f6af82bd
AM
11975 else
11976 reloc_type = BFD_RELOC_32_PCREL;
252b5132 11977
ee7fcc42
AM
11978 old_fr_fix = fragP->fr_fix;
11979 opcode = (unsigned char *) fragP->fr_opcode;
11980
fddf5b5b 11981 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 11982 {
fddf5b5b
AM
11983 case UNCOND_JUMP:
11984 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 11985 opcode[0] = 0xe9;
252b5132 11986 fragP->fr_fix += size;
062cd5e7
AS
11987 fix_new (fragP, old_fr_fix, size,
11988 fragP->fr_symbol,
11989 fragP->fr_offset, 1,
11990 reloc_type);
252b5132
RH
11991 break;
11992
fddf5b5b 11993 case COND_JUMP86:
412167cb
AM
11994 if (size == 2
11995 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
11996 {
11997 /* Negate the condition, and branch past an
11998 unconditional jump. */
11999 opcode[0] ^= 1;
12000 opcode[1] = 3;
12001 /* Insert an unconditional jump. */
12002 opcode[2] = 0xe9;
12003 /* We added two extra opcode bytes, and have a two byte
12004 offset. */
12005 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12006 fix_new (fragP, old_fr_fix + 2, 2,
12007 fragP->fr_symbol,
12008 fragP->fr_offset, 1,
12009 reloc_type);
fddf5b5b
AM
12010 break;
12011 }
12012 /* Fall through. */
12013
12014 case COND_JUMP:
412167cb
AM
12015 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12016 {
3e02c1cc
AM
12017 fixS *fixP;
12018
412167cb 12019 fragP->fr_fix += 1;
3e02c1cc
AM
12020 fixP = fix_new (fragP, old_fr_fix, 1,
12021 fragP->fr_symbol,
12022 fragP->fr_offset, 1,
12023 BFD_RELOC_8_PCREL);
12024 fixP->fx_signed = 1;
412167cb
AM
12025 break;
12026 }
93c2a809 12027
24eab124 12028 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12029 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12030 opcode[1] = opcode[0] + 0x10;
f6af82bd 12031 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12032 /* We've added an opcode byte. */
12033 fragP->fr_fix += 1 + size;
062cd5e7
AS
12034 fix_new (fragP, old_fr_fix + 1, size,
12035 fragP->fr_symbol,
12036 fragP->fr_offset, 1,
12037 reloc_type);
252b5132 12038 break;
fddf5b5b
AM
12039
12040 default:
12041 BAD_CASE (fragP->fr_subtype);
12042 break;
252b5132
RH
12043 }
12044 frag_wane (fragP);
ee7fcc42 12045 return fragP->fr_fix - old_fr_fix;
252b5132 12046 }
93c2a809 12047
93c2a809
AM
12048 /* Guess size depending on current relax state. Initially the relax
12049 state will correspond to a short jump and we return 1, because
12050 the variable part of the frag (the branch offset) is one byte
12051 long. However, we can relax a section more than once and in that
12052 case we must either set fr_subtype back to the unrelaxed state,
12053 or return the value for the appropriate branch. */
12054 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12055}
12056
47926f60
KH
12057/* Called after relax() is finished.
12058
12059 In: Address of frag.
12060 fr_type == rs_machine_dependent.
12061 fr_subtype is what the address relaxed to.
12062
12063 Out: Any fixSs and constants are set up.
12064 Caller will turn frag into a ".space 0". */
12065
252b5132 12066void
7016a5d5
TG
12067md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12068 fragS *fragP)
252b5132 12069{
29b0f896 12070 unsigned char *opcode;
252b5132 12071 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12072 offsetT target_address;
12073 offsetT opcode_address;
252b5132 12074 unsigned int extension = 0;
847f7ad4 12075 offsetT displacement_from_opcode_start;
252b5132 12076
e379e5f3
L
12077 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12078 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12079 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12080 {
12081 /* Generate nop padding. */
12082 unsigned int size = fragP->tc_frag_data.length;
12083 if (size)
12084 {
12085 if (size > fragP->tc_frag_data.max_bytes)
12086 abort ();
12087
12088 if (flag_debug)
12089 {
12090 const char *msg;
12091 const char *branch = "branch";
12092 const char *prefix = "";
12093 fragS *padding_fragP;
12094 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12095 == BRANCH_PREFIX)
12096 {
12097 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12098 switch (fragP->tc_frag_data.default_prefix)
12099 {
12100 default:
12101 abort ();
12102 break;
12103 case CS_PREFIX_OPCODE:
12104 prefix = " cs";
12105 break;
12106 case DS_PREFIX_OPCODE:
12107 prefix = " ds";
12108 break;
12109 case ES_PREFIX_OPCODE:
12110 prefix = " es";
12111 break;
12112 case FS_PREFIX_OPCODE:
12113 prefix = " fs";
12114 break;
12115 case GS_PREFIX_OPCODE:
12116 prefix = " gs";
12117 break;
12118 case SS_PREFIX_OPCODE:
12119 prefix = " ss";
12120 break;
12121 }
12122 if (padding_fragP)
12123 msg = _("%s:%u: add %d%s at 0x%llx to align "
12124 "%s within %d-byte boundary\n");
12125 else
12126 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12127 "align %s within %d-byte boundary\n");
12128 }
12129 else
12130 {
12131 padding_fragP = fragP;
12132 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12133 "%s within %d-byte boundary\n");
12134 }
12135
12136 if (padding_fragP)
12137 switch (padding_fragP->tc_frag_data.branch_type)
12138 {
12139 case align_branch_jcc:
12140 branch = "jcc";
12141 break;
12142 case align_branch_fused:
12143 branch = "fused jcc";
12144 break;
12145 case align_branch_jmp:
12146 branch = "jmp";
12147 break;
12148 case align_branch_call:
12149 branch = "call";
12150 break;
12151 case align_branch_indirect:
12152 branch = "indiret branch";
12153 break;
12154 case align_branch_ret:
12155 branch = "ret";
12156 break;
12157 default:
12158 break;
12159 }
12160
12161 fprintf (stdout, msg,
12162 fragP->fr_file, fragP->fr_line, size, prefix,
12163 (long long) fragP->fr_address, branch,
12164 1 << align_branch_power);
12165 }
12166 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12167 memset (fragP->fr_opcode,
12168 fragP->tc_frag_data.default_prefix, size);
12169 else
12170 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12171 size, 0);
12172 fragP->fr_fix += size;
12173 }
12174 return;
12175 }
12176
252b5132
RH
12177 opcode = (unsigned char *) fragP->fr_opcode;
12178
47926f60 12179 /* Address we want to reach in file space. */
252b5132 12180 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12181
47926f60 12182 /* Address opcode resides at in file space. */
252b5132
RH
12183 opcode_address = fragP->fr_address + fragP->fr_fix;
12184
47926f60 12185 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12186 displacement_from_opcode_start = target_address - opcode_address;
12187
fddf5b5b 12188 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12189 {
47926f60
KH
12190 /* Don't have to change opcode. */
12191 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12192 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12193 }
12194 else
12195 {
12196 if (no_cond_jump_promotion
12197 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12198 as_warn_where (fragP->fr_file, fragP->fr_line,
12199 _("long jump required"));
252b5132 12200
fddf5b5b
AM
12201 switch (fragP->fr_subtype)
12202 {
12203 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12204 extension = 4; /* 1 opcode + 4 displacement */
12205 opcode[0] = 0xe9;
12206 where_to_put_displacement = &opcode[1];
12207 break;
252b5132 12208
fddf5b5b
AM
12209 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12210 extension = 2; /* 1 opcode + 2 displacement */
12211 opcode[0] = 0xe9;
12212 where_to_put_displacement = &opcode[1];
12213 break;
252b5132 12214
fddf5b5b
AM
12215 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12216 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12217 extension = 5; /* 2 opcode + 4 displacement */
12218 opcode[1] = opcode[0] + 0x10;
12219 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12220 where_to_put_displacement = &opcode[2];
12221 break;
252b5132 12222
fddf5b5b
AM
12223 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12224 extension = 3; /* 2 opcode + 2 displacement */
12225 opcode[1] = opcode[0] + 0x10;
12226 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12227 where_to_put_displacement = &opcode[2];
12228 break;
252b5132 12229
fddf5b5b
AM
12230 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12231 extension = 4;
12232 opcode[0] ^= 1;
12233 opcode[1] = 3;
12234 opcode[2] = 0xe9;
12235 where_to_put_displacement = &opcode[3];
12236 break;
12237
12238 default:
12239 BAD_CASE (fragP->fr_subtype);
12240 break;
12241 }
252b5132 12242 }
fddf5b5b 12243
7b81dfbb
AJ
12244 /* If size if less then four we are sure that the operand fits,
12245 but if it's 4, then it could be that the displacement is larger
12246 then -/+ 2GB. */
12247 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12248 && object_64bit
12249 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12250 + ((addressT) 1 << 31))
12251 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12252 {
12253 as_bad_where (fragP->fr_file, fragP->fr_line,
12254 _("jump target out of range"));
12255 /* Make us emit 0. */
12256 displacement_from_opcode_start = extension;
12257 }
47926f60 12258 /* Now put displacement after opcode. */
252b5132
RH
12259 md_number_to_chars ((char *) where_to_put_displacement,
12260 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12261 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12262 fragP->fr_fix += extension;
12263}
12264\f
7016a5d5 12265/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12266 by our caller that we have all the info we need to fix it up.
12267
7016a5d5
TG
12268 Parameter valP is the pointer to the value of the bits.
12269
252b5132
RH
12270 On the 386, immediates, displacements, and data pointers are all in
12271 the same (little-endian) format, so we don't need to care about which
12272 we are handling. */
12273
94f592af 12274void
7016a5d5 12275md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12276{
94f592af 12277 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12278 valueT value = *valP;
252b5132 12279
f86103b7 12280#if !defined (TE_Mach)
93382f6d
AM
12281 if (fixP->fx_pcrel)
12282 {
12283 switch (fixP->fx_r_type)
12284 {
5865bb77
ILT
12285 default:
12286 break;
12287
d6ab8113
JB
12288 case BFD_RELOC_64:
12289 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12290 break;
93382f6d 12291 case BFD_RELOC_32:
ae8887b5 12292 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12293 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12294 break;
12295 case BFD_RELOC_16:
12296 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12297 break;
12298 case BFD_RELOC_8:
12299 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12300 break;
12301 }
12302 }
252b5132 12303
a161fe53 12304 if (fixP->fx_addsy != NULL
31312f95 12305 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12306 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12307 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12308 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12309 && !use_rela_relocations)
252b5132 12310 {
31312f95
AM
12311 /* This is a hack. There should be a better way to handle this.
12312 This covers for the fact that bfd_install_relocation will
12313 subtract the current location (for partial_inplace, PC relative
12314 relocations); see more below. */
252b5132 12315#ifndef OBJ_AOUT
718ddfc0 12316 if (IS_ELF
252b5132
RH
12317#ifdef TE_PE
12318 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12319#endif
12320 )
12321 value += fixP->fx_where + fixP->fx_frag->fr_address;
12322#endif
12323#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12324 if (IS_ELF)
252b5132 12325 {
6539b54b 12326 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12327
6539b54b 12328 if ((sym_seg == seg
2f66722d 12329 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12330 && sym_seg != absolute_section))
af65af87 12331 && !generic_force_reloc (fixP))
2f66722d
AM
12332 {
12333 /* Yes, we add the values in twice. This is because
6539b54b
AM
12334 bfd_install_relocation subtracts them out again. I think
12335 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12336 it. FIXME. */
12337 value += fixP->fx_where + fixP->fx_frag->fr_address;
12338 }
252b5132
RH
12339 }
12340#endif
12341#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12342 /* For some reason, the PE format does not store a
12343 section address offset for a PC relative symbol. */
12344 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12345 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12346 value += md_pcrel_from (fixP);
12347#endif
12348 }
fbeb56a4 12349#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12350 if (fixP->fx_addsy != NULL
12351 && S_IS_WEAK (fixP->fx_addsy)
12352 /* PR 16858: Do not modify weak function references. */
12353 && ! fixP->fx_pcrel)
fbeb56a4 12354 {
296a8689
NC
12355#if !defined (TE_PEP)
12356 /* For x86 PE weak function symbols are neither PC-relative
12357 nor do they set S_IS_FUNCTION. So the only reliable way
12358 to detect them is to check the flags of their containing
12359 section. */
12360 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12361 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12362 ;
12363 else
12364#endif
fbeb56a4
DK
12365 value -= S_GET_VALUE (fixP->fx_addsy);
12366 }
12367#endif
252b5132
RH
12368
12369 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12370 and we must not disappoint it. */
252b5132 12371#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12372 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12373 switch (fixP->fx_r_type)
12374 {
12375 case BFD_RELOC_386_PLT32:
3e73aa7c 12376 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12377 /* Make the jump instruction point to the address of the operand.
12378 At runtime we merely add the offset to the actual PLT entry.
12379 NB: Subtract the offset size only for jump instructions. */
12380 if (fixP->fx_pcrel)
12381 value = -4;
47926f60 12382 break;
31312f95 12383
13ae64f3
JJ
12384 case BFD_RELOC_386_TLS_GD:
12385 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12386 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12387 case BFD_RELOC_386_TLS_IE:
12388 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12389 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12390 case BFD_RELOC_X86_64_TLSGD:
12391 case BFD_RELOC_X86_64_TLSLD:
12392 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12393 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12394 value = 0; /* Fully resolved at runtime. No addend. */
12395 /* Fallthrough */
12396 case BFD_RELOC_386_TLS_LE:
12397 case BFD_RELOC_386_TLS_LDO_32:
12398 case BFD_RELOC_386_TLS_LE_32:
12399 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12400 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12401 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12402 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12403 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12404 break;
12405
67a4f2b7
AO
12406 case BFD_RELOC_386_TLS_DESC_CALL:
12407 case BFD_RELOC_X86_64_TLSDESC_CALL:
12408 value = 0; /* Fully resolved at runtime. No addend. */
12409 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12410 fixP->fx_done = 0;
12411 return;
12412
47926f60
KH
12413 case BFD_RELOC_VTABLE_INHERIT:
12414 case BFD_RELOC_VTABLE_ENTRY:
12415 fixP->fx_done = 0;
94f592af 12416 return;
47926f60
KH
12417
12418 default:
12419 break;
12420 }
12421#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12422 *valP = value;
f86103b7 12423#endif /* !defined (TE_Mach) */
3e73aa7c 12424
3e73aa7c 12425 /* Are we finished with this relocation now? */
c6682705 12426 if (fixP->fx_addsy == NULL)
3e73aa7c 12427 fixP->fx_done = 1;
fbeb56a4
DK
12428#if defined (OBJ_COFF) && defined (TE_PE)
12429 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12430 {
12431 fixP->fx_done = 0;
12432 /* Remember value for tc_gen_reloc. */
12433 fixP->fx_addnumber = value;
12434 /* Clear out the frag for now. */
12435 value = 0;
12436 }
12437#endif
3e73aa7c
JH
12438 else if (use_rela_relocations)
12439 {
12440 fixP->fx_no_overflow = 1;
062cd5e7
AS
12441 /* Remember value for tc_gen_reloc. */
12442 fixP->fx_addnumber = value;
3e73aa7c
JH
12443 value = 0;
12444 }
f86103b7 12445
94f592af 12446 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12447}
252b5132 12448\f
6d4af3c2 12449const char *
499ac353 12450md_atof (int type, char *litP, int *sizeP)
252b5132 12451{
499ac353
NC
12452 /* This outputs the LITTLENUMs in REVERSE order;
12453 in accord with the bigendian 386. */
12454 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12455}
12456\f
2d545b82 12457static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12458
252b5132 12459static char *
e3bb37b5 12460output_invalid (int c)
252b5132 12461{
3882b010 12462 if (ISPRINT (c))
f9f21a03
L
12463 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12464 "'%c'", c);
252b5132 12465 else
f9f21a03 12466 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12467 "(0x%x)", (unsigned char) c);
252b5132
RH
12468 return output_invalid_buf;
12469}
12470
8a6fb3f9
JB
12471/* Verify that @r can be used in the current context. */
12472
12473static bfd_boolean check_register (const reg_entry *r)
12474{
12475 if (allow_pseudo_reg)
12476 return TRUE;
12477
12478 if (operand_type_all_zero (&r->reg_type))
12479 return FALSE;
12480
12481 if ((r->reg_type.bitfield.dword
12482 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12483 || r->reg_type.bitfield.class == RegCR
22e00a3f 12484 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9
JB
12485 && !cpu_arch_flags.bitfield.cpui386)
12486 return FALSE;
12487
22e00a3f
JB
12488 if (r->reg_type.bitfield.class == RegTR
12489 && (flag_code == CODE_64BIT
12490 || !cpu_arch_flags.bitfield.cpui386
12491 || cpu_arch_isa_flags.bitfield.cpui586
12492 || cpu_arch_isa_flags.bitfield.cpui686))
12493 return FALSE;
12494
8a6fb3f9
JB
12495 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12496 return FALSE;
12497
12498 if (!cpu_arch_flags.bitfield.cpuavx512f)
12499 {
12500 if (r->reg_type.bitfield.zmmword
12501 || r->reg_type.bitfield.class == RegMask)
12502 return FALSE;
12503
12504 if (!cpu_arch_flags.bitfield.cpuavx)
12505 {
12506 if (r->reg_type.bitfield.ymmword)
12507 return FALSE;
12508
12509 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12510 return FALSE;
12511 }
12512 }
12513
260cd341
LC
12514 if (r->reg_type.bitfield.tmmword
12515 && (!cpu_arch_flags.bitfield.cpuamx_tile
12516 || flag_code != CODE_64BIT))
12517 return FALSE;
12518
8a6fb3f9
JB
12519 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12520 return FALSE;
12521
12522 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12523 if (!allow_index_reg && r->reg_num == RegIZ)
12524 return FALSE;
12525
12526 /* Upper 16 vector registers are only available with VREX in 64bit
12527 mode, and require EVEX encoding. */
12528 if (r->reg_flags & RegVRex)
12529 {
12530 if (!cpu_arch_flags.bitfield.cpuavx512f
12531 || flag_code != CODE_64BIT)
12532 return FALSE;
12533
da4977e0
JB
12534 if (i.vec_encoding == vex_encoding_default)
12535 i.vec_encoding = vex_encoding_evex;
12536 else if (i.vec_encoding != vex_encoding_evex)
12537 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12538 }
12539
12540 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12541 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12542 && flag_code != CODE_64BIT)
12543 return FALSE;
12544
12545 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12546 && !intel_syntax)
12547 return FALSE;
12548
12549 return TRUE;
12550}
12551
af6bdddf 12552/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12553
12554static const reg_entry *
4d1bb795 12555parse_real_register (char *reg_string, char **end_op)
252b5132 12556{
af6bdddf
AM
12557 char *s = reg_string;
12558 char *p;
252b5132
RH
12559 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12560 const reg_entry *r;
12561
12562 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12563 if (*s == REGISTER_PREFIX)
12564 ++s;
12565
12566 if (is_space_char (*s))
12567 ++s;
12568
12569 p = reg_name_given;
af6bdddf 12570 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12571 {
12572 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12573 return (const reg_entry *) NULL;
12574 s++;
252b5132
RH
12575 }
12576
6588847e
DN
12577 /* For naked regs, make sure that we are not dealing with an identifier.
12578 This prevents confusing an identifier like `eax_var' with register
12579 `eax'. */
12580 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12581 return (const reg_entry *) NULL;
12582
af6bdddf 12583 *end_op = s;
252b5132
RH
12584
12585 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
12586
5f47d35b 12587 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12588 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12589 {
0e0eea78
JB
12590 if (!cpu_arch_flags.bitfield.cpu8087
12591 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12592 && !cpu_arch_flags.bitfield.cpu387
12593 && !allow_pseudo_reg)
0e0eea78
JB
12594 return (const reg_entry *) NULL;
12595
5f47d35b
AM
12596 if (is_space_char (*s))
12597 ++s;
12598 if (*s == '(')
12599 {
af6bdddf 12600 ++s;
5f47d35b
AM
12601 if (is_space_char (*s))
12602 ++s;
12603 if (*s >= '0' && *s <= '7')
12604 {
db557034 12605 int fpr = *s - '0';
af6bdddf 12606 ++s;
5f47d35b
AM
12607 if (is_space_char (*s))
12608 ++s;
12609 if (*s == ')')
12610 {
12611 *end_op = s + 1;
1e9cc1c2 12612 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
12613 know (r);
12614 return r + fpr;
5f47d35b 12615 }
5f47d35b 12616 }
47926f60 12617 /* We have "%st(" then garbage. */
5f47d35b
AM
12618 return (const reg_entry *) NULL;
12619 }
12620 }
12621
8a6fb3f9 12622 return r && check_register (r) ? r : NULL;
252b5132 12623}
4d1bb795
JB
12624
12625/* REG_STRING starts *before* REGISTER_PREFIX. */
12626
12627static const reg_entry *
12628parse_register (char *reg_string, char **end_op)
12629{
12630 const reg_entry *r;
12631
12632 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12633 r = parse_real_register (reg_string, end_op);
12634 else
12635 r = NULL;
12636 if (!r)
12637 {
12638 char *save = input_line_pointer;
12639 char c;
12640 symbolS *symbolP;
12641
12642 input_line_pointer = reg_string;
d02603dc 12643 c = get_symbol_name (&reg_string);
4d1bb795
JB
12644 symbolP = symbol_find (reg_string);
12645 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12646 {
12647 const expressionS *e = symbol_get_value_expression (symbolP);
12648
0398aac5 12649 know (e->X_op == O_register);
4eed87de 12650 know (e->X_add_number >= 0
c3fe08fa 12651 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12652 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12653 if (!check_register (r))
12654 {
12655 as_bad (_("register '%s%s' cannot be used here"),
12656 register_prefix, r->reg_name);
12657 r = &bad_reg;
12658 }
4d1bb795
JB
12659 *end_op = input_line_pointer;
12660 }
12661 *input_line_pointer = c;
12662 input_line_pointer = save;
12663 }
12664 return r;
12665}
12666
12667int
12668i386_parse_name (char *name, expressionS *e, char *nextcharP)
12669{
12670 const reg_entry *r;
12671 char *end = input_line_pointer;
12672
12673 *end = *nextcharP;
12674 r = parse_register (name, &input_line_pointer);
12675 if (r && end <= input_line_pointer)
12676 {
12677 *nextcharP = *input_line_pointer;
12678 *input_line_pointer = 0;
8a6fb3f9
JB
12679 if (r != &bad_reg)
12680 {
12681 e->X_op = O_register;
12682 e->X_add_number = r - i386_regtab;
12683 }
12684 else
12685 e->X_op = O_illegal;
4d1bb795
JB
12686 return 1;
12687 }
12688 input_line_pointer = end;
12689 *end = 0;
ee86248c 12690 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12691}
12692
12693void
12694md_operand (expressionS *e)
12695{
ee86248c
JB
12696 char *end;
12697 const reg_entry *r;
4d1bb795 12698
ee86248c
JB
12699 switch (*input_line_pointer)
12700 {
12701 case REGISTER_PREFIX:
12702 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12703 if (r)
12704 {
12705 e->X_op = O_register;
12706 e->X_add_number = r - i386_regtab;
12707 input_line_pointer = end;
12708 }
ee86248c
JB
12709 break;
12710
12711 case '[':
9c2799c2 12712 gas_assert (intel_syntax);
ee86248c
JB
12713 end = input_line_pointer++;
12714 expression (e);
12715 if (*input_line_pointer == ']')
12716 {
12717 ++input_line_pointer;
12718 e->X_op_symbol = make_expr_symbol (e);
12719 e->X_add_symbol = NULL;
12720 e->X_add_number = 0;
12721 e->X_op = O_index;
12722 }
12723 else
12724 {
12725 e->X_op = O_absent;
12726 input_line_pointer = end;
12727 }
12728 break;
4d1bb795
JB
12729 }
12730}
12731
252b5132 12732\f
4cc782b5 12733#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12734const char *md_shortopts = "kVQ:sqnO::";
252b5132 12735#else
b6f8c7c4 12736const char *md_shortopts = "qnO::";
252b5132 12737#endif
6e0b89ee 12738
3e73aa7c 12739#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12740#define OPTION_64 (OPTION_MD_BASE + 1)
12741#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12742#define OPTION_MARCH (OPTION_MD_BASE + 3)
12743#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12744#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12745#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12746#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12747#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12748#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12749#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12750#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12751#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12752#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12753#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12754#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12755#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12756#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12757#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12758#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12759#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12760#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12761#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12762#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12763#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12764#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12765#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12766#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12767#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12768#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12769#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12770#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12771#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12772#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12773
99ad8390
NC
12774struct option md_longopts[] =
12775{
3e73aa7c 12776 {"32", no_argument, NULL, OPTION_32},
321098a5 12777#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12778 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12779 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12780#endif
12781#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12782 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12783 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12784 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12785#endif
b3b91714 12786 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12787 {"march", required_argument, NULL, OPTION_MARCH},
12788 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12789 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12790 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12791 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12792 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12793 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12794 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12795 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12796 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12797 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12798 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12799 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12800 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12801# if defined (TE_PE) || defined (TE_PEP)
12802 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12803#endif
d1982f93 12804 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12805 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12806 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12807 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12808 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12809 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12810 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12811 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12812 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12813 {"mlfence-before-indirect-branch", required_argument, NULL,
12814 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12815 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12816 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12817 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12818 {NULL, no_argument, NULL, 0}
12819};
12820size_t md_longopts_size = sizeof (md_longopts);
12821
12822int
17b9d67d 12823md_parse_option (int c, const char *arg)
252b5132 12824{
91d6fa6a 12825 unsigned int j;
e379e5f3 12826 char *arch, *next, *saved, *type;
9103f4f4 12827
252b5132
RH
12828 switch (c)
12829 {
12b55ccc
L
12830 case 'n':
12831 optimize_align_code = 0;
12832 break;
12833
a38cf1db
AM
12834 case 'q':
12835 quiet_warnings = 1;
252b5132
RH
12836 break;
12837
12838#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12839 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12840 should be emitted or not. FIXME: Not implemented. */
12841 case 'Q':
d4693039
JB
12842 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12843 return 0;
252b5132
RH
12844 break;
12845
12846 /* -V: SVR4 argument to print version ID. */
12847 case 'V':
12848 print_version_id ();
12849 break;
12850
a38cf1db
AM
12851 /* -k: Ignore for FreeBSD compatibility. */
12852 case 'k':
252b5132 12853 break;
4cc782b5
ILT
12854
12855 case 's':
12856 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12857 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12858 break;
8dcea932
L
12859
12860 case OPTION_MSHARED:
12861 shared = 1;
12862 break;
b4a3a7b4
L
12863
12864 case OPTION_X86_USED_NOTE:
12865 if (strcasecmp (arg, "yes") == 0)
12866 x86_used_note = 1;
12867 else if (strcasecmp (arg, "no") == 0)
12868 x86_used_note = 0;
12869 else
12870 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12871 break;
12872
12873
99ad8390 12874#endif
321098a5 12875#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12876 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12877 case OPTION_64:
12878 {
12879 const char **list, **l;
12880
3e73aa7c
JH
12881 list = bfd_target_list ();
12882 for (l = list; *l != NULL; l++)
8620418b 12883 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12884 || strcmp (*l, "coff-x86-64") == 0
12885 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12886 || strcmp (*l, "pei-x86-64") == 0
12887 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12888 {
12889 default_arch = "x86_64";
12890 break;
12891 }
3e73aa7c 12892 if (*l == NULL)
2b5d6a91 12893 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12894 free (list);
12895 }
12896 break;
12897#endif
252b5132 12898
351f65ca 12899#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12900 case OPTION_X32:
351f65ca
L
12901 if (IS_ELF)
12902 {
12903 const char **list, **l;
12904
12905 list = bfd_target_list ();
12906 for (l = list; *l != NULL; l++)
12907 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12908 {
12909 default_arch = "x86_64:32";
12910 break;
12911 }
12912 if (*l == NULL)
2b5d6a91 12913 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12914 free (list);
12915 }
12916 else
12917 as_fatal (_("32bit x86_64 is only supported for ELF"));
12918 break;
12919#endif
12920
6e0b89ee
AM
12921 case OPTION_32:
12922 default_arch = "i386";
12923 break;
12924
b3b91714
AM
12925 case OPTION_DIVIDE:
12926#ifdef SVR4_COMMENT_CHARS
12927 {
12928 char *n, *t;
12929 const char *s;
12930
add39d23 12931 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12932 t = n;
12933 for (s = i386_comment_chars; *s != '\0'; s++)
12934 if (*s != '/')
12935 *t++ = *s;
12936 *t = '\0';
12937 i386_comment_chars = n;
12938 }
12939#endif
12940 break;
12941
9103f4f4 12942 case OPTION_MARCH:
293f5f65
L
12943 saved = xstrdup (arg);
12944 arch = saved;
12945 /* Allow -march=+nosse. */
12946 if (*arch == '+')
12947 arch++;
6305a203 12948 do
9103f4f4 12949 {
6305a203 12950 if (*arch == '.')
2b5d6a91 12951 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12952 next = strchr (arch, '+');
12953 if (next)
12954 *next++ = '\0';
91d6fa6a 12955 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12956 {
91d6fa6a 12957 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12958 {
6305a203 12959 /* Processor. */
1ded5609
JB
12960 if (! cpu_arch[j].flags.bitfield.cpui386)
12961 continue;
12962
91d6fa6a 12963 cpu_arch_name = cpu_arch[j].name;
6305a203 12964 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12965 cpu_arch_flags = cpu_arch[j].flags;
12966 cpu_arch_isa = cpu_arch[j].type;
12967 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
12968 if (!cpu_arch_tune_set)
12969 {
12970 cpu_arch_tune = cpu_arch_isa;
12971 cpu_arch_tune_flags = cpu_arch_isa_flags;
12972 }
12973 break;
12974 }
91d6fa6a
NC
12975 else if (*cpu_arch [j].name == '.'
12976 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 12977 {
33eaf5de 12978 /* ISA extension. */
6305a203 12979 i386_cpu_flags flags;
309d3373 12980
293f5f65
L
12981 flags = cpu_flags_or (cpu_arch_flags,
12982 cpu_arch[j].flags);
81486035 12983
5b64d091 12984 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
12985 {
12986 if (cpu_sub_arch_name)
12987 {
12988 char *name = cpu_sub_arch_name;
12989 cpu_sub_arch_name = concat (name,
91d6fa6a 12990 cpu_arch[j].name,
1bf57e9f 12991 (const char *) NULL);
6305a203
L
12992 free (name);
12993 }
12994 else
91d6fa6a 12995 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 12996 cpu_arch_flags = flags;
a586129e 12997 cpu_arch_isa_flags = flags;
6305a203 12998 }
0089dace
L
12999 else
13000 cpu_arch_isa_flags
13001 = cpu_flags_or (cpu_arch_isa_flags,
13002 cpu_arch[j].flags);
6305a203 13003 break;
ccc9c027 13004 }
9103f4f4 13005 }
6305a203 13006
293f5f65
L
13007 if (j >= ARRAY_SIZE (cpu_arch))
13008 {
33eaf5de 13009 /* Disable an ISA extension. */
293f5f65
L
13010 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13011 if (strcmp (arch, cpu_noarch [j].name) == 0)
13012 {
13013 i386_cpu_flags flags;
13014
13015 flags = cpu_flags_and_not (cpu_arch_flags,
13016 cpu_noarch[j].flags);
13017 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13018 {
13019 if (cpu_sub_arch_name)
13020 {
13021 char *name = cpu_sub_arch_name;
13022 cpu_sub_arch_name = concat (arch,
13023 (const char *) NULL);
13024 free (name);
13025 }
13026 else
13027 cpu_sub_arch_name = xstrdup (arch);
13028 cpu_arch_flags = flags;
13029 cpu_arch_isa_flags = flags;
13030 }
13031 break;
13032 }
13033
13034 if (j >= ARRAY_SIZE (cpu_noarch))
13035 j = ARRAY_SIZE (cpu_arch);
13036 }
13037
91d6fa6a 13038 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13039 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13040
13041 arch = next;
9103f4f4 13042 }
293f5f65
L
13043 while (next != NULL);
13044 free (saved);
9103f4f4
L
13045 break;
13046
13047 case OPTION_MTUNE:
13048 if (*arg == '.')
2b5d6a91 13049 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13050 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13051 {
91d6fa6a 13052 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13053 {
ccc9c027 13054 cpu_arch_tune_set = 1;
91d6fa6a
NC
13055 cpu_arch_tune = cpu_arch [j].type;
13056 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13057 break;
13058 }
13059 }
91d6fa6a 13060 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13061 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13062 break;
13063
1efbbeb4
L
13064 case OPTION_MMNEMONIC:
13065 if (strcasecmp (arg, "att") == 0)
13066 intel_mnemonic = 0;
13067 else if (strcasecmp (arg, "intel") == 0)
13068 intel_mnemonic = 1;
13069 else
2b5d6a91 13070 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13071 break;
13072
13073 case OPTION_MSYNTAX:
13074 if (strcasecmp (arg, "att") == 0)
13075 intel_syntax = 0;
13076 else if (strcasecmp (arg, "intel") == 0)
13077 intel_syntax = 1;
13078 else
2b5d6a91 13079 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13080 break;
13081
13082 case OPTION_MINDEX_REG:
13083 allow_index_reg = 1;
13084 break;
13085
13086 case OPTION_MNAKED_REG:
13087 allow_naked_reg = 1;
13088 break;
13089
c0f3af97
L
13090 case OPTION_MSSE2AVX:
13091 sse2avx = 1;
13092 break;
13093
daf50ae7
L
13094 case OPTION_MSSE_CHECK:
13095 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13096 sse_check = check_error;
daf50ae7 13097 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13098 sse_check = check_warning;
daf50ae7 13099 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13100 sse_check = check_none;
daf50ae7 13101 else
2b5d6a91 13102 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13103 break;
13104
7bab8ab5
JB
13105 case OPTION_MOPERAND_CHECK:
13106 if (strcasecmp (arg, "error") == 0)
13107 operand_check = check_error;
13108 else if (strcasecmp (arg, "warning") == 0)
13109 operand_check = check_warning;
13110 else if (strcasecmp (arg, "none") == 0)
13111 operand_check = check_none;
13112 else
13113 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13114 break;
13115
539f890d
L
13116 case OPTION_MAVXSCALAR:
13117 if (strcasecmp (arg, "128") == 0)
13118 avxscalar = vex128;
13119 else if (strcasecmp (arg, "256") == 0)
13120 avxscalar = vex256;
13121 else
2b5d6a91 13122 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13123 break;
13124
03751133
L
13125 case OPTION_MVEXWIG:
13126 if (strcmp (arg, "0") == 0)
40c9c8de 13127 vexwig = vexw0;
03751133 13128 else if (strcmp (arg, "1") == 0)
40c9c8de 13129 vexwig = vexw1;
03751133
L
13130 else
13131 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13132 break;
13133
7e8b059b
L
13134 case OPTION_MADD_BND_PREFIX:
13135 add_bnd_prefix = 1;
13136 break;
13137
43234a1e
L
13138 case OPTION_MEVEXLIG:
13139 if (strcmp (arg, "128") == 0)
13140 evexlig = evexl128;
13141 else if (strcmp (arg, "256") == 0)
13142 evexlig = evexl256;
13143 else if (strcmp (arg, "512") == 0)
13144 evexlig = evexl512;
13145 else
13146 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13147 break;
13148
d3d3c6db
IT
13149 case OPTION_MEVEXRCIG:
13150 if (strcmp (arg, "rne") == 0)
13151 evexrcig = rne;
13152 else if (strcmp (arg, "rd") == 0)
13153 evexrcig = rd;
13154 else if (strcmp (arg, "ru") == 0)
13155 evexrcig = ru;
13156 else if (strcmp (arg, "rz") == 0)
13157 evexrcig = rz;
13158 else
13159 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13160 break;
13161
43234a1e
L
13162 case OPTION_MEVEXWIG:
13163 if (strcmp (arg, "0") == 0)
13164 evexwig = evexw0;
13165 else if (strcmp (arg, "1") == 0)
13166 evexwig = evexw1;
13167 else
13168 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13169 break;
13170
167ad85b
TG
13171# if defined (TE_PE) || defined (TE_PEP)
13172 case OPTION_MBIG_OBJ:
13173 use_big_obj = 1;
13174 break;
13175#endif
13176
d1982f93 13177 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13178 if (strcasecmp (arg, "yes") == 0)
13179 omit_lock_prefix = 1;
13180 else if (strcasecmp (arg, "no") == 0)
13181 omit_lock_prefix = 0;
13182 else
13183 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13184 break;
13185
e4e00185
AS
13186 case OPTION_MFENCE_AS_LOCK_ADD:
13187 if (strcasecmp (arg, "yes") == 0)
13188 avoid_fence = 1;
13189 else if (strcasecmp (arg, "no") == 0)
13190 avoid_fence = 0;
13191 else
13192 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13193 break;
13194
ae531041
L
13195 case OPTION_MLFENCE_AFTER_LOAD:
13196 if (strcasecmp (arg, "yes") == 0)
13197 lfence_after_load = 1;
13198 else if (strcasecmp (arg, "no") == 0)
13199 lfence_after_load = 0;
13200 else
13201 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13202 break;
13203
13204 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13205 if (strcasecmp (arg, "all") == 0)
a09f656b 13206 {
13207 lfence_before_indirect_branch = lfence_branch_all;
13208 if (lfence_before_ret == lfence_before_ret_none)
13209 lfence_before_ret = lfence_before_ret_shl;
13210 }
ae531041
L
13211 else if (strcasecmp (arg, "memory") == 0)
13212 lfence_before_indirect_branch = lfence_branch_memory;
13213 else if (strcasecmp (arg, "register") == 0)
13214 lfence_before_indirect_branch = lfence_branch_register;
13215 else if (strcasecmp (arg, "none") == 0)
13216 lfence_before_indirect_branch = lfence_branch_none;
13217 else
13218 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13219 arg);
13220 break;
13221
13222 case OPTION_MLFENCE_BEFORE_RET:
13223 if (strcasecmp (arg, "or") == 0)
13224 lfence_before_ret = lfence_before_ret_or;
13225 else if (strcasecmp (arg, "not") == 0)
13226 lfence_before_ret = lfence_before_ret_not;
a09f656b 13227 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13228 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13229 else if (strcasecmp (arg, "none") == 0)
13230 lfence_before_ret = lfence_before_ret_none;
13231 else
13232 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13233 arg);
13234 break;
13235
0cb4071e
L
13236 case OPTION_MRELAX_RELOCATIONS:
13237 if (strcasecmp (arg, "yes") == 0)
13238 generate_relax_relocations = 1;
13239 else if (strcasecmp (arg, "no") == 0)
13240 generate_relax_relocations = 0;
13241 else
13242 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13243 break;
13244
e379e5f3
L
13245 case OPTION_MALIGN_BRANCH_BOUNDARY:
13246 {
13247 char *end;
13248 long int align = strtoul (arg, &end, 0);
13249 if (*end == '\0')
13250 {
13251 if (align == 0)
13252 {
13253 align_branch_power = 0;
13254 break;
13255 }
13256 else if (align >= 16)
13257 {
13258 int align_power;
13259 for (align_power = 0;
13260 (align & 1) == 0;
13261 align >>= 1, align_power++)
13262 continue;
13263 /* Limit alignment power to 31. */
13264 if (align == 1 && align_power < 32)
13265 {
13266 align_branch_power = align_power;
13267 break;
13268 }
13269 }
13270 }
13271 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13272 }
13273 break;
13274
13275 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13276 {
13277 char *end;
13278 int align = strtoul (arg, &end, 0);
13279 /* Some processors only support 5 prefixes. */
13280 if (*end == '\0' && align >= 0 && align < 6)
13281 {
13282 align_branch_prefix_size = align;
13283 break;
13284 }
13285 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13286 arg);
13287 }
13288 break;
13289
13290 case OPTION_MALIGN_BRANCH:
13291 align_branch = 0;
13292 saved = xstrdup (arg);
13293 type = saved;
13294 do
13295 {
13296 next = strchr (type, '+');
13297 if (next)
13298 *next++ = '\0';
13299 if (strcasecmp (type, "jcc") == 0)
13300 align_branch |= align_branch_jcc_bit;
13301 else if (strcasecmp (type, "fused") == 0)
13302 align_branch |= align_branch_fused_bit;
13303 else if (strcasecmp (type, "jmp") == 0)
13304 align_branch |= align_branch_jmp_bit;
13305 else if (strcasecmp (type, "call") == 0)
13306 align_branch |= align_branch_call_bit;
13307 else if (strcasecmp (type, "ret") == 0)
13308 align_branch |= align_branch_ret_bit;
13309 else if (strcasecmp (type, "indirect") == 0)
13310 align_branch |= align_branch_indirect_bit;
13311 else
13312 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13313 type = next;
13314 }
13315 while (next != NULL);
13316 free (saved);
13317 break;
13318
76cf450b
L
13319 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13320 align_branch_power = 5;
13321 align_branch_prefix_size = 5;
13322 align_branch = (align_branch_jcc_bit
13323 | align_branch_fused_bit
13324 | align_branch_jmp_bit);
13325 break;
13326
5db04b09 13327 case OPTION_MAMD64:
4b5aaf5f 13328 isa64 = amd64;
5db04b09
L
13329 break;
13330
13331 case OPTION_MINTEL64:
4b5aaf5f 13332 isa64 = intel64;
5db04b09
L
13333 break;
13334
b6f8c7c4
L
13335 case 'O':
13336 if (arg == NULL)
13337 {
13338 optimize = 1;
13339 /* Turn off -Os. */
13340 optimize_for_space = 0;
13341 }
13342 else if (*arg == 's')
13343 {
13344 optimize_for_space = 1;
13345 /* Turn on all encoding optimizations. */
41fd2579 13346 optimize = INT_MAX;
b6f8c7c4
L
13347 }
13348 else
13349 {
13350 optimize = atoi (arg);
13351 /* Turn off -Os. */
13352 optimize_for_space = 0;
13353 }
13354 break;
13355
252b5132
RH
13356 default:
13357 return 0;
13358 }
13359 return 1;
13360}
13361
8a2c8fef
L
13362#define MESSAGE_TEMPLATE \
13363" "
13364
293f5f65
L
13365static char *
13366output_message (FILE *stream, char *p, char *message, char *start,
13367 int *left_p, const char *name, int len)
13368{
13369 int size = sizeof (MESSAGE_TEMPLATE);
13370 int left = *left_p;
13371
13372 /* Reserve 2 spaces for ", " or ",\0" */
13373 left -= len + 2;
13374
13375 /* Check if there is any room. */
13376 if (left >= 0)
13377 {
13378 if (p != start)
13379 {
13380 *p++ = ',';
13381 *p++ = ' ';
13382 }
13383 p = mempcpy (p, name, len);
13384 }
13385 else
13386 {
13387 /* Output the current message now and start a new one. */
13388 *p++ = ',';
13389 *p = '\0';
13390 fprintf (stream, "%s\n", message);
13391 p = start;
13392 left = size - (start - message) - len - 2;
13393
13394 gas_assert (left >= 0);
13395
13396 p = mempcpy (p, name, len);
13397 }
13398
13399 *left_p = left;
13400 return p;
13401}
13402
8a2c8fef 13403static void
1ded5609 13404show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13405{
13406 static char message[] = MESSAGE_TEMPLATE;
13407 char *start = message + 27;
13408 char *p;
13409 int size = sizeof (MESSAGE_TEMPLATE);
13410 int left;
13411 const char *name;
13412 int len;
13413 unsigned int j;
13414
13415 p = start;
13416 left = size - (start - message);
13417 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13418 {
13419 /* Should it be skipped? */
13420 if (cpu_arch [j].skip)
13421 continue;
13422
13423 name = cpu_arch [j].name;
13424 len = cpu_arch [j].len;
13425 if (*name == '.')
13426 {
13427 /* It is an extension. Skip if we aren't asked to show it. */
13428 if (ext)
13429 {
13430 name++;
13431 len--;
13432 }
13433 else
13434 continue;
13435 }
13436 else if (ext)
13437 {
13438 /* It is an processor. Skip if we show only extension. */
13439 continue;
13440 }
1ded5609
JB
13441 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13442 {
13443 /* It is an impossible processor - skip. */
13444 continue;
13445 }
8a2c8fef 13446
293f5f65 13447 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13448 }
13449
293f5f65
L
13450 /* Display disabled extensions. */
13451 if (ext)
13452 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13453 {
13454 name = cpu_noarch [j].name;
13455 len = cpu_noarch [j].len;
13456 p = output_message (stream, p, message, start, &left, name,
13457 len);
13458 }
13459
8a2c8fef
L
13460 *p = '\0';
13461 fprintf (stream, "%s\n", message);
13462}
13463
252b5132 13464void
8a2c8fef 13465md_show_usage (FILE *stream)
252b5132 13466{
4cc782b5
ILT
13467#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13468 fprintf (stream, _("\
d4693039 13469 -Qy, -Qn ignored\n\
a38cf1db 13470 -V print assembler version number\n\
b3b91714
AM
13471 -k ignored\n"));
13472#endif
13473 fprintf (stream, _("\
12b55ccc 13474 -n Do not optimize code alignment\n\
b3b91714
AM
13475 -q quieten some warnings\n"));
13476#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13477 fprintf (stream, _("\
a38cf1db 13478 -s ignored\n"));
b3b91714 13479#endif
d7f449c0
L
13480#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13481 || defined (TE_PE) || defined (TE_PEP))
751d281c 13482 fprintf (stream, _("\
570561f7 13483 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13484#endif
b3b91714
AM
13485#ifdef SVR4_COMMENT_CHARS
13486 fprintf (stream, _("\
13487 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13488#else
13489 fprintf (stream, _("\
b3b91714 13490 --divide ignored\n"));
4cc782b5 13491#endif
9103f4f4 13492 fprintf (stream, _("\
6305a203 13493 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13494 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13495 show_arch (stream, 0, 1);
8a2c8fef
L
13496 fprintf (stream, _("\
13497 EXTENSION is combination of:\n"));
1ded5609 13498 show_arch (stream, 1, 0);
6305a203 13499 fprintf (stream, _("\
8a2c8fef 13500 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13501 show_arch (stream, 0, 0);
ba104c83 13502 fprintf (stream, _("\
c0f3af97
L
13503 -msse2avx encode SSE instructions with VEX prefix\n"));
13504 fprintf (stream, _("\
7c5c05ef 13505 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13506 check SSE instructions\n"));
13507 fprintf (stream, _("\
7c5c05ef 13508 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13509 check operand combinations for validity\n"));
13510 fprintf (stream, _("\
7c5c05ef
L
13511 -mavxscalar=[128|256] (default: 128)\n\
13512 encode scalar AVX instructions with specific vector\n\
539f890d
L
13513 length\n"));
13514 fprintf (stream, _("\
03751133
L
13515 -mvexwig=[0|1] (default: 0)\n\
13516 encode VEX instructions with specific VEX.W value\n\
13517 for VEX.W bit ignored instructions\n"));
13518 fprintf (stream, _("\
7c5c05ef
L
13519 -mevexlig=[128|256|512] (default: 128)\n\
13520 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13521 length\n"));
13522 fprintf (stream, _("\
7c5c05ef
L
13523 -mevexwig=[0|1] (default: 0)\n\
13524 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13525 for EVEX.W bit ignored instructions\n"));
13526 fprintf (stream, _("\
7c5c05ef 13527 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13528 encode EVEX instructions with specific EVEX.RC value\n\
13529 for SAE-only ignored instructions\n"));
13530 fprintf (stream, _("\
7c5c05ef
L
13531 -mmnemonic=[att|intel] "));
13532 if (SYSV386_COMPAT)
13533 fprintf (stream, _("(default: att)\n"));
13534 else
13535 fprintf (stream, _("(default: intel)\n"));
13536 fprintf (stream, _("\
13537 use AT&T/Intel mnemonic\n"));
ba104c83 13538 fprintf (stream, _("\
7c5c05ef
L
13539 -msyntax=[att|intel] (default: att)\n\
13540 use AT&T/Intel syntax\n"));
ba104c83
L
13541 fprintf (stream, _("\
13542 -mindex-reg support pseudo index registers\n"));
13543 fprintf (stream, _("\
13544 -mnaked-reg don't require `%%' prefix for registers\n"));
13545 fprintf (stream, _("\
7e8b059b 13546 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13547#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13548 fprintf (stream, _("\
13549 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13550 fprintf (stream, _("\
13551 -mx86-used-note=[no|yes] "));
13552 if (DEFAULT_X86_USED_NOTE)
13553 fprintf (stream, _("(default: yes)\n"));
13554 else
13555 fprintf (stream, _("(default: no)\n"));
13556 fprintf (stream, _("\
13557 generate x86 used ISA and feature properties\n"));
13558#endif
13559#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13560 fprintf (stream, _("\
13561 -mbig-obj generate big object files\n"));
13562#endif
d022bddd 13563 fprintf (stream, _("\
7c5c05ef 13564 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13565 strip all lock prefixes\n"));
5db04b09 13566 fprintf (stream, _("\
7c5c05ef 13567 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13568 encode lfence, mfence and sfence as\n\
13569 lock addl $0x0, (%%{re}sp)\n"));
13570 fprintf (stream, _("\
7c5c05ef
L
13571 -mrelax-relocations=[no|yes] "));
13572 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13573 fprintf (stream, _("(default: yes)\n"));
13574 else
13575 fprintf (stream, _("(default: no)\n"));
13576 fprintf (stream, _("\
0cb4071e
L
13577 generate relax relocations\n"));
13578 fprintf (stream, _("\
e379e5f3
L
13579 -malign-branch-boundary=NUM (default: 0)\n\
13580 align branches within NUM byte boundary\n"));
13581 fprintf (stream, _("\
13582 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13583 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13584 indirect\n\
13585 specify types of branches to align\n"));
13586 fprintf (stream, _("\
13587 -malign-branch-prefix-size=NUM (default: 5)\n\
13588 align branches with NUM prefixes per instruction\n"));
13589 fprintf (stream, _("\
76cf450b
L
13590 -mbranches-within-32B-boundaries\n\
13591 align branches within 32 byte boundary\n"));
13592 fprintf (stream, _("\
ae531041
L
13593 -mlfence-after-load=[no|yes] (default: no)\n\
13594 generate lfence after load\n"));
13595 fprintf (stream, _("\
13596 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13597 generate lfence before indirect near branch\n"));
13598 fprintf (stream, _("\
a09f656b 13599 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13600 generate lfence before ret\n"));
13601 fprintf (stream, _("\
7c5c05ef 13602 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13603 fprintf (stream, _("\
13604 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13605}
13606
3e73aa7c 13607#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13608 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13609 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13610
13611/* Pick the target format to use. */
13612
47926f60 13613const char *
e3bb37b5 13614i386_target_format (void)
252b5132 13615{
351f65ca
L
13616 if (!strncmp (default_arch, "x86_64", 6))
13617 {
13618 update_code_flag (CODE_64BIT, 1);
13619 if (default_arch[6] == '\0')
7f56bc95 13620 x86_elf_abi = X86_64_ABI;
351f65ca 13621 else
7f56bc95 13622 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13623 }
3e73aa7c 13624 else if (!strcmp (default_arch, "i386"))
78f12dd3 13625 update_code_flag (CODE_32BIT, 1);
5197d474
L
13626 else if (!strcmp (default_arch, "iamcu"))
13627 {
13628 update_code_flag (CODE_32BIT, 1);
13629 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13630 {
13631 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13632 cpu_arch_name = "iamcu";
13633 cpu_sub_arch_name = NULL;
13634 cpu_arch_flags = iamcu_flags;
13635 cpu_arch_isa = PROCESSOR_IAMCU;
13636 cpu_arch_isa_flags = iamcu_flags;
13637 if (!cpu_arch_tune_set)
13638 {
13639 cpu_arch_tune = cpu_arch_isa;
13640 cpu_arch_tune_flags = cpu_arch_isa_flags;
13641 }
13642 }
8d471ec1 13643 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13644 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13645 cpu_arch_name);
13646 }
3e73aa7c 13647 else
2b5d6a91 13648 as_fatal (_("unknown architecture"));
89507696
JB
13649
13650 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13651 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13652 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13653 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13654
252b5132
RH
13655 switch (OUTPUT_FLAVOR)
13656 {
9384f2ff 13657#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13658 case bfd_target_aout_flavour:
47926f60 13659 return AOUT_TARGET_FORMAT;
4c63da97 13660#endif
9384f2ff
AM
13661#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13662# if defined (TE_PE) || defined (TE_PEP)
13663 case bfd_target_coff_flavour:
167ad85b
TG
13664 if (flag_code == CODE_64BIT)
13665 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13666 else
251dae91 13667 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13668# elif defined (TE_GO32)
0561d57c
JK
13669 case bfd_target_coff_flavour:
13670 return "coff-go32";
9384f2ff 13671# else
252b5132
RH
13672 case bfd_target_coff_flavour:
13673 return "coff-i386";
9384f2ff 13674# endif
4c63da97 13675#endif
3e73aa7c 13676#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13677 case bfd_target_elf_flavour:
3e73aa7c 13678 {
351f65ca
L
13679 const char *format;
13680
13681 switch (x86_elf_abi)
4fa24527 13682 {
351f65ca
L
13683 default:
13684 format = ELF_TARGET_FORMAT;
e379e5f3
L
13685#ifndef TE_SOLARIS
13686 tls_get_addr = "___tls_get_addr";
13687#endif
351f65ca 13688 break;
7f56bc95 13689 case X86_64_ABI:
351f65ca 13690 use_rela_relocations = 1;
4fa24527 13691 object_64bit = 1;
e379e5f3
L
13692#ifndef TE_SOLARIS
13693 tls_get_addr = "__tls_get_addr";
13694#endif
351f65ca
L
13695 format = ELF_TARGET_FORMAT64;
13696 break;
7f56bc95 13697 case X86_64_X32_ABI:
4fa24527 13698 use_rela_relocations = 1;
351f65ca 13699 object_64bit = 1;
e379e5f3
L
13700#ifndef TE_SOLARIS
13701 tls_get_addr = "__tls_get_addr";
13702#endif
862be3fb 13703 disallow_64bit_reloc = 1;
351f65ca
L
13704 format = ELF_TARGET_FORMAT32;
13705 break;
4fa24527 13706 }
3632d14b 13707 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13708 {
7f56bc95 13709 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13710 as_fatal (_("Intel L1OM is 64bit only"));
13711 return ELF_TARGET_L1OM_FORMAT;
13712 }
b49f93f6 13713 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13714 {
13715 if (x86_elf_abi != X86_64_ABI)
13716 as_fatal (_("Intel K1OM is 64bit only"));
13717 return ELF_TARGET_K1OM_FORMAT;
13718 }
81486035
L
13719 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13720 {
13721 if (x86_elf_abi != I386_ABI)
13722 as_fatal (_("Intel MCU is 32bit only"));
13723 return ELF_TARGET_IAMCU_FORMAT;
13724 }
8a9036a4 13725 else
351f65ca 13726 return format;
3e73aa7c 13727 }
e57f8c65
TG
13728#endif
13729#if defined (OBJ_MACH_O)
13730 case bfd_target_mach_o_flavour:
d382c579
TG
13731 if (flag_code == CODE_64BIT)
13732 {
13733 use_rela_relocations = 1;
13734 object_64bit = 1;
13735 return "mach-o-x86-64";
13736 }
13737 else
13738 return "mach-o-i386";
4c63da97 13739#endif
252b5132
RH
13740 default:
13741 abort ();
13742 return NULL;
13743 }
13744}
13745
47926f60 13746#endif /* OBJ_MAYBE_ more than one */
252b5132 13747\f
252b5132 13748symbolS *
7016a5d5 13749md_undefined_symbol (char *name)
252b5132 13750{
18dc2407
ILT
13751 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13752 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13753 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13754 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13755 {
13756 if (!GOT_symbol)
13757 {
13758 if (symbol_find (name))
13759 as_bad (_("GOT already in symbol table"));
13760 GOT_symbol = symbol_new (name, undefined_section,
13761 (valueT) 0, &zero_address_frag);
13762 };
13763 return GOT_symbol;
13764 }
252b5132
RH
13765 return 0;
13766}
13767
13768/* Round up a section size to the appropriate boundary. */
47926f60 13769
252b5132 13770valueT
7016a5d5 13771md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13772{
4c63da97
AM
13773#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13774 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13775 {
13776 /* For a.out, force the section size to be aligned. If we don't do
13777 this, BFD will align it for us, but it will not write out the
13778 final bytes of the section. This may be a bug in BFD, but it is
13779 easier to fix it here since that is how the other a.out targets
13780 work. */
13781 int align;
13782
fd361982 13783 align = bfd_section_alignment (segment);
8d3842cd 13784 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13785 }
252b5132
RH
13786#endif
13787
13788 return size;
13789}
13790
13791/* On the i386, PC-relative offsets are relative to the start of the
13792 next instruction. That is, the address of the offset, plus its
13793 size, since the offset is always the last part of the insn. */
13794
13795long
e3bb37b5 13796md_pcrel_from (fixS *fixP)
252b5132
RH
13797{
13798 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13799}
13800
13801#ifndef I386COFF
13802
13803static void
e3bb37b5 13804s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13805{
29b0f896 13806 int temp;
252b5132 13807
8a75718c
JB
13808#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13809 if (IS_ELF)
13810 obj_elf_section_change_hook ();
13811#endif
252b5132
RH
13812 temp = get_absolute_expression ();
13813 subseg_set (bss_section, (subsegT) temp);
13814 demand_empty_rest_of_line ();
13815}
13816
13817#endif
13818
e379e5f3
L
13819/* Remember constant directive. */
13820
13821void
13822i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13823{
13824 if (last_insn.kind != last_insn_directive
13825 && (bfd_section_flags (now_seg) & SEC_CODE))
13826 {
13827 last_insn.seg = now_seg;
13828 last_insn.kind = last_insn_directive;
13829 last_insn.name = "constant directive";
13830 last_insn.file = as_where (&last_insn.line);
ae531041
L
13831 if (lfence_before_ret != lfence_before_ret_none)
13832 {
13833 if (lfence_before_indirect_branch != lfence_branch_none)
13834 as_warn (_("constant directive skips -mlfence-before-ret "
13835 "and -mlfence-before-indirect-branch"));
13836 else
13837 as_warn (_("constant directive skips -mlfence-before-ret"));
13838 }
13839 else if (lfence_before_indirect_branch != lfence_branch_none)
13840 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13841 }
13842}
13843
252b5132 13844void
e3bb37b5 13845i386_validate_fix (fixS *fixp)
252b5132 13846{
02a86693 13847 if (fixp->fx_subsy)
252b5132 13848 {
02a86693 13849 if (fixp->fx_subsy == GOT_symbol)
23df1078 13850 {
02a86693
L
13851 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13852 {
13853 if (!object_64bit)
13854 abort ();
13855#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13856 if (fixp->fx_tcbit2)
56ceb5b5
L
13857 fixp->fx_r_type = (fixp->fx_tcbit
13858 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13859 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13860 else
13861#endif
13862 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13863 }
d6ab8113 13864 else
02a86693
L
13865 {
13866 if (!object_64bit)
13867 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13868 else
13869 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13870 }
13871 fixp->fx_subsy = 0;
23df1078 13872 }
252b5132 13873 }
02a86693
L
13874#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13875 else if (!object_64bit)
13876 {
13877 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13878 && fixp->fx_tcbit2)
13879 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13880 }
13881#endif
252b5132
RH
13882}
13883
252b5132 13884arelent *
7016a5d5 13885tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13886{
13887 arelent *rel;
13888 bfd_reloc_code_real_type code;
13889
13890 switch (fixp->fx_r_type)
13891 {
8ce3d284 13892#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13893 case BFD_RELOC_SIZE32:
13894 case BFD_RELOC_SIZE64:
13895 if (S_IS_DEFINED (fixp->fx_addsy)
13896 && !S_IS_EXTERNAL (fixp->fx_addsy))
13897 {
13898 /* Resolve size relocation against local symbol to size of
13899 the symbol plus addend. */
13900 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13901 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13902 && !fits_in_unsigned_long (value))
13903 as_bad_where (fixp->fx_file, fixp->fx_line,
13904 _("symbol size computation overflow"));
13905 fixp->fx_addsy = NULL;
13906 fixp->fx_subsy = NULL;
13907 md_apply_fix (fixp, (valueT *) &value, NULL);
13908 return NULL;
13909 }
8ce3d284 13910#endif
1a0670f3 13911 /* Fall through. */
8fd4256d 13912
3e73aa7c
JH
13913 case BFD_RELOC_X86_64_PLT32:
13914 case BFD_RELOC_X86_64_GOT32:
13915 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13916 case BFD_RELOC_X86_64_GOTPCRELX:
13917 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13918 case BFD_RELOC_386_PLT32:
13919 case BFD_RELOC_386_GOT32:
02a86693 13920 case BFD_RELOC_386_GOT32X:
252b5132
RH
13921 case BFD_RELOC_386_GOTOFF:
13922 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13923 case BFD_RELOC_386_TLS_GD:
13924 case BFD_RELOC_386_TLS_LDM:
13925 case BFD_RELOC_386_TLS_LDO_32:
13926 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13927 case BFD_RELOC_386_TLS_IE:
13928 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13929 case BFD_RELOC_386_TLS_LE_32:
13930 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13931 case BFD_RELOC_386_TLS_GOTDESC:
13932 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13933 case BFD_RELOC_X86_64_TLSGD:
13934 case BFD_RELOC_X86_64_TLSLD:
13935 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13936 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13937 case BFD_RELOC_X86_64_GOTTPOFF:
13938 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13939 case BFD_RELOC_X86_64_TPOFF64:
13940 case BFD_RELOC_X86_64_GOTOFF64:
13941 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13942 case BFD_RELOC_X86_64_GOT64:
13943 case BFD_RELOC_X86_64_GOTPCREL64:
13944 case BFD_RELOC_X86_64_GOTPC64:
13945 case BFD_RELOC_X86_64_GOTPLT64:
13946 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13947 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13948 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13949 case BFD_RELOC_RVA:
13950 case BFD_RELOC_VTABLE_ENTRY:
13951 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13952#ifdef TE_PE
13953 case BFD_RELOC_32_SECREL:
13954#endif
252b5132
RH
13955 code = fixp->fx_r_type;
13956 break;
dbbaec26
L
13957 case BFD_RELOC_X86_64_32S:
13958 if (!fixp->fx_pcrel)
13959 {
13960 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
13961 code = fixp->fx_r_type;
13962 break;
13963 }
1a0670f3 13964 /* Fall through. */
252b5132 13965 default:
93382f6d 13966 if (fixp->fx_pcrel)
252b5132 13967 {
93382f6d
AM
13968 switch (fixp->fx_size)
13969 {
13970 default:
b091f402
AM
13971 as_bad_where (fixp->fx_file, fixp->fx_line,
13972 _("can not do %d byte pc-relative relocation"),
13973 fixp->fx_size);
93382f6d
AM
13974 code = BFD_RELOC_32_PCREL;
13975 break;
13976 case 1: code = BFD_RELOC_8_PCREL; break;
13977 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 13978 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
13979#ifdef BFD64
13980 case 8: code = BFD_RELOC_64_PCREL; break;
13981#endif
93382f6d
AM
13982 }
13983 }
13984 else
13985 {
13986 switch (fixp->fx_size)
13987 {
13988 default:
b091f402
AM
13989 as_bad_where (fixp->fx_file, fixp->fx_line,
13990 _("can not do %d byte relocation"),
13991 fixp->fx_size);
93382f6d
AM
13992 code = BFD_RELOC_32;
13993 break;
13994 case 1: code = BFD_RELOC_8; break;
13995 case 2: code = BFD_RELOC_16; break;
13996 case 4: code = BFD_RELOC_32; break;
937149dd 13997#ifdef BFD64
3e73aa7c 13998 case 8: code = BFD_RELOC_64; break;
937149dd 13999#endif
93382f6d 14000 }
252b5132
RH
14001 }
14002 break;
14003 }
252b5132 14004
d182319b
JB
14005 if ((code == BFD_RELOC_32
14006 || code == BFD_RELOC_32_PCREL
14007 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14008 && GOT_symbol
14009 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14010 {
4fa24527 14011 if (!object_64bit)
d6ab8113
JB
14012 code = BFD_RELOC_386_GOTPC;
14013 else
14014 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14015 }
7b81dfbb
AJ
14016 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14017 && GOT_symbol
14018 && fixp->fx_addsy == GOT_symbol)
14019 {
14020 code = BFD_RELOC_X86_64_GOTPC64;
14021 }
252b5132 14022
add39d23
TS
14023 rel = XNEW (arelent);
14024 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14025 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14026
14027 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14028
3e73aa7c
JH
14029 if (!use_rela_relocations)
14030 {
14031 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14032 vtable entry to be used in the relocation's section offset. */
14033 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14034 rel->address = fixp->fx_offset;
fbeb56a4
DK
14035#if defined (OBJ_COFF) && defined (TE_PE)
14036 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14037 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14038 else
14039#endif
c6682705 14040 rel->addend = 0;
3e73aa7c
JH
14041 }
14042 /* Use the rela in 64bit mode. */
252b5132 14043 else
3e73aa7c 14044 {
862be3fb
L
14045 if (disallow_64bit_reloc)
14046 switch (code)
14047 {
862be3fb
L
14048 case BFD_RELOC_X86_64_DTPOFF64:
14049 case BFD_RELOC_X86_64_TPOFF64:
14050 case BFD_RELOC_64_PCREL:
14051 case BFD_RELOC_X86_64_GOTOFF64:
14052 case BFD_RELOC_X86_64_GOT64:
14053 case BFD_RELOC_X86_64_GOTPCREL64:
14054 case BFD_RELOC_X86_64_GOTPC64:
14055 case BFD_RELOC_X86_64_GOTPLT64:
14056 case BFD_RELOC_X86_64_PLTOFF64:
14057 as_bad_where (fixp->fx_file, fixp->fx_line,
14058 _("cannot represent relocation type %s in x32 mode"),
14059 bfd_get_reloc_code_name (code));
14060 break;
14061 default:
14062 break;
14063 }
14064
062cd5e7
AS
14065 if (!fixp->fx_pcrel)
14066 rel->addend = fixp->fx_offset;
14067 else
14068 switch (code)
14069 {
14070 case BFD_RELOC_X86_64_PLT32:
14071 case BFD_RELOC_X86_64_GOT32:
14072 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14073 case BFD_RELOC_X86_64_GOTPCRELX:
14074 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14075 case BFD_RELOC_X86_64_TLSGD:
14076 case BFD_RELOC_X86_64_TLSLD:
14077 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14078 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14079 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14080 rel->addend = fixp->fx_offset - fixp->fx_size;
14081 break;
14082 default:
14083 rel->addend = (section->vma
14084 - fixp->fx_size
14085 + fixp->fx_addnumber
14086 + md_pcrel_from (fixp));
14087 break;
14088 }
3e73aa7c
JH
14089 }
14090
252b5132
RH
14091 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14092 if (rel->howto == NULL)
14093 {
14094 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14095 _("cannot represent relocation type %s"),
252b5132
RH
14096 bfd_get_reloc_code_name (code));
14097 /* Set howto to a garbage value so that we can keep going. */
14098 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14099 gas_assert (rel->howto != NULL);
252b5132
RH
14100 }
14101
14102 return rel;
14103}
14104
ee86248c 14105#include "tc-i386-intel.c"
54cfded0 14106
a60de03c
JB
14107void
14108tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14109{
a60de03c
JB
14110 int saved_naked_reg;
14111 char saved_register_dot;
54cfded0 14112
a60de03c
JB
14113 saved_naked_reg = allow_naked_reg;
14114 allow_naked_reg = 1;
14115 saved_register_dot = register_chars['.'];
14116 register_chars['.'] = '.';
14117 allow_pseudo_reg = 1;
14118 expression_and_evaluate (exp);
14119 allow_pseudo_reg = 0;
14120 register_chars['.'] = saved_register_dot;
14121 allow_naked_reg = saved_naked_reg;
14122
e96d56a1 14123 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14124 {
a60de03c
JB
14125 if ((addressT) exp->X_add_number < i386_regtab_size)
14126 {
14127 exp->X_op = O_constant;
14128 exp->X_add_number = i386_regtab[exp->X_add_number]
14129 .dw2_regnum[flag_code >> 1];
14130 }
14131 else
14132 exp->X_op = O_illegal;
54cfded0 14133 }
54cfded0
AM
14134}
14135
14136void
14137tc_x86_frame_initial_instructions (void)
14138{
a60de03c
JB
14139 static unsigned int sp_regno[2];
14140
14141 if (!sp_regno[flag_code >> 1])
14142 {
14143 char *saved_input = input_line_pointer;
14144 char sp[][4] = {"esp", "rsp"};
14145 expressionS exp;
a4447b93 14146
a60de03c
JB
14147 input_line_pointer = sp[flag_code >> 1];
14148 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14149 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14150 sp_regno[flag_code >> 1] = exp.X_add_number;
14151 input_line_pointer = saved_input;
14152 }
a4447b93 14153
61ff971f
L
14154 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14155 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14156}
d2b2c203 14157
d7921315
L
14158int
14159x86_dwarf2_addr_size (void)
14160{
14161#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14162 if (x86_elf_abi == X86_64_X32_ABI)
14163 return 4;
14164#endif
14165 return bfd_arch_bits_per_address (stdoutput) / 8;
14166}
14167
d2b2c203
DJ
14168int
14169i386_elf_section_type (const char *str, size_t len)
14170{
14171 if (flag_code == CODE_64BIT
14172 && len == sizeof ("unwind") - 1
14173 && strncmp (str, "unwind", 6) == 0)
14174 return SHT_X86_64_UNWIND;
14175
14176 return -1;
14177}
bb41ade5 14178
ad5fec3b
EB
14179#ifdef TE_SOLARIS
14180void
14181i386_solaris_fix_up_eh_frame (segT sec)
14182{
14183 if (flag_code == CODE_64BIT)
14184 elf_section_type (sec) = SHT_X86_64_UNWIND;
14185}
14186#endif
14187
bb41ade5
AM
14188#ifdef TE_PE
14189void
14190tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14191{
91d6fa6a 14192 expressionS exp;
bb41ade5 14193
91d6fa6a
NC
14194 exp.X_op = O_secrel;
14195 exp.X_add_symbol = symbol;
14196 exp.X_add_number = 0;
14197 emit_expr (&exp, size);
bb41ade5
AM
14198}
14199#endif
3b22753a
L
14200
14201#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14202/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14203
01e1a5bc 14204bfd_vma
6d4af3c2 14205x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14206{
14207 if (flag_code == CODE_64BIT)
14208 {
14209 if (letter == 'l')
14210 return SHF_X86_64_LARGE;
14211
8f3bae45 14212 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14213 }
3b22753a 14214 else
8f3bae45 14215 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14216 return -1;
14217}
14218
01e1a5bc 14219bfd_vma
3b22753a
L
14220x86_64_section_word (char *str, size_t len)
14221{
8620418b 14222 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14223 return SHF_X86_64_LARGE;
14224
14225 return -1;
14226}
14227
14228static void
14229handle_large_common (int small ATTRIBUTE_UNUSED)
14230{
14231 if (flag_code != CODE_64BIT)
14232 {
14233 s_comm_internal (0, elf_common_parse);
14234 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14235 }
14236 else
14237 {
14238 static segT lbss_section;
14239 asection *saved_com_section_ptr = elf_com_section_ptr;
14240 asection *saved_bss_section = bss_section;
14241
14242 if (lbss_section == NULL)
14243 {
14244 flagword applicable;
14245 segT seg = now_seg;
14246 subsegT subseg = now_subseg;
14247
14248 /* The .lbss section is for local .largecomm symbols. */
14249 lbss_section = subseg_new (".lbss", 0);
14250 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14251 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14252 seg_info (lbss_section)->bss = 1;
14253
14254 subseg_set (seg, subseg);
14255 }
14256
14257 elf_com_section_ptr = &_bfd_elf_large_com_section;
14258 bss_section = lbss_section;
14259
14260 s_comm_internal (0, elf_common_parse);
14261
14262 elf_com_section_ptr = saved_com_section_ptr;
14263 bss_section = saved_bss_section;
14264 }
14265}
14266#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.536475 seconds and 4 git commands to generate.