]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-i386.c
x86: Fix a memory leak in md_assemble
[thirdparty/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
fd67aa11 2 Copyright (C) 1989-2024 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"
c7defc53 33#include "scfi.h"
b52c4ee4
IB
34#include "gen-sframe.h"
35#include "sframe.h"
d2b2c203 36#include "elf/x86-64.h"
40fb9820 37#include "opcodes/i386-init.h"
5c139202 38#include "opcodes/i386-mnem.h"
41fd2579 39#include <limits.h>
41fd2579 40
c3332e24 41#ifndef INFER_ADDR_PREFIX
eecb386c 42#define INFER_ADDR_PREFIX 1
c3332e24
AM
43#endif
44
29b0f896
AM
45#ifndef DEFAULT_ARCH
46#define DEFAULT_ARCH "i386"
246fcdee 47#endif
252b5132 48
edde18a5
AM
49#ifndef INLINE
50#if __GNUC__ >= 2
51#define INLINE __inline__
52#else
53#define INLINE
54#endif
55#endif
56
6305a203
L
57/* Prefixes will be emitted in the order defined below.
58 WAIT_PREFIX must be the first prefix since FWAIT is really is an
59 instruction, and so must come before any prefixes.
60 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 61 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
62#define WAIT_PREFIX 0
63#define SEG_PREFIX 1
64#define ADDR_PREFIX 2
65#define DATA_PREFIX 3
c32fa91d 66#define REP_PREFIX 4
42164a71 67#define HLE_PREFIX REP_PREFIX
7e8b059b 68#define BND_PREFIX REP_PREFIX
c32fa91d 69#define LOCK_PREFIX 5
4e9ac44a
L
70#define REX_PREFIX 6 /* must come last. */
71#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
72
73/* we define the syntax here (modulo base,index,scale syntax) */
74#define REGISTER_PREFIX '%'
75#define IMMEDIATE_PREFIX '$'
76#define ABSOLUTE_PREFIX '*'
77
78/* these are the instruction mnemonic suffixes in AT&T syntax or
79 memory operand size in Intel syntax. */
80#define WORD_MNEM_SUFFIX 'w'
81#define BYTE_MNEM_SUFFIX 'b'
82#define SHORT_MNEM_SUFFIX 's'
83#define LONG_MNEM_SUFFIX 'l'
84#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
85
86#define END_OF_INSN '\0'
87
05909f23
JB
88#define OPERAND_TYPE_NONE { .bitfield = { .class = ClassNone } }
89
79dec6b7
JB
90/* This matches the C -> StaticRounding alias in the opcode table. */
91#define commutative staticrounding
92
6305a203
L
93/*
94 'templates' is for grouping together 'template' structures for opcodes
95 of the same name. This is only used for storing the insns in the grand
96 ole hash table of insns.
97 The templates themselves start at START and range up to (but not including)
98 END.
99 */
100typedef struct
101{
d3ce72d0
NC
102 const insn_template *start;
103 const insn_template *end;
6305a203
L
104}
105templates;
106
107/* 386 operand encoding bytes: see 386 book for details of this. */
108typedef struct
109{
110 unsigned int regmem; /* codes register or memory operand */
111 unsigned int reg; /* codes register operand (or extended opcode) */
112 unsigned int mode; /* how to interpret regmem & reg */
113}
114modrm_byte;
115
116/* x86-64 extension prefix. */
117typedef int rex_byte;
118
6305a203
L
119/* 386 opcode byte to code indirect addressing. */
120typedef struct
121{
122 unsigned base;
123 unsigned index;
124 unsigned scale;
125}
126sib_byte;
127
6305a203
L
128/* x86 arch names, types and features */
129typedef struct
130{
131 const char *name; /* arch name */
6ceeed25
JB
132 unsigned int len:8; /* arch string length */
133 bool skip:1; /* show_arch should skip this. */
6305a203 134 enum processor_type type; /* arch type */
4fc85f37 135 enum { vsz_none, vsz_set, vsz_reset } vsz; /* vector size control */
ae89daec
JB
136 i386_cpu_flags enable; /* cpu feature enable flags */
137 i386_cpu_flags disable; /* cpu feature disable flags */
6305a203
L
138}
139arch_entry;
140
78f12dd3 141static void update_code_flag (int, int);
edd67638 142static void s_insn (int);
1e7dd4a0 143static void s_noopt (int);
e3bb37b5
L
144static void set_code_flag (int);
145static void set_16bit_gcc_code_flag (int);
146static void set_intel_syntax (int);
1efbbeb4 147static void set_intel_mnemonic (int);
db51cc60 148static void set_allow_index_reg (int);
7bab8ab5 149static void set_check (int);
e3bb37b5 150static void set_cpu_arch (int);
6482c264 151#ifdef TE_PE
e3bb37b5 152static void pe_directive_secrel (int);
145667f8 153static void pe_directive_secidx (int);
6482c264 154#endif
e3bb37b5
L
155static void signed_cons (int);
156static char *output_invalid (int c);
ee86248c
JB
157static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
158 const char *);
159static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
160 const char *);
a7619375 161static int i386_att_operand (char *);
e3bb37b5 162static int i386_intel_operand (char *, int);
ee86248c
JB
163static int i386_intel_simplify (expressionS *);
164static int i386_intel_parse_name (const char *, expressionS *);
4f081312 165static const reg_entry *parse_register (const char *, char **);
edd67638 166static const char *parse_insn (const char *, char *, bool);
e3bb37b5
L
167static char *parse_operands (char *, const char *);
168static void swap_operands (void);
783c187b 169static void swap_2_operands (unsigned int, unsigned int);
ed719294 170static enum i386_flag_code i386_addressing_mode (void);
e3bb37b5 171static void optimize_imm (void);
0de704b9 172static bool optimize_disp (const insn_template *t);
83b16ac6 173static const insn_template *match_template (char);
e3bb37b5
L
174static int check_string (void);
175static int process_suffix (void);
176static int check_byte_reg (void);
177static int check_long_reg (void);
178static int check_qword_reg (void);
179static int check_word_reg (void);
180static int finalize_imm (void);
181static int process_operands (void);
5e042380 182static const reg_entry *build_modrm_byte (void);
b5482fe5 183static void output_insn (const struct last_insn *);
e3bb37b5
L
184static void output_imm (fragS *, offsetT);
185static void output_disp (fragS *, offsetT);
d4064aad 186#ifdef OBJ_AOUT
e3bb37b5 187static void s_bss (int);
252b5132 188#endif
17d4e2a2
L
189#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
190static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
191
192/* GNU_PROPERTY_X86_ISA_1_USED. */
193static unsigned int x86_isa_1_used;
194/* GNU_PROPERTY_X86_FEATURE_2_USED. */
195static unsigned int x86_feature_2_used;
196/* Generate x86 used ISA and feature properties. */
197static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 198#endif
252b5132 199
a847613f 200static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 201
8a6fb3f9
JB
202/* parse_register() returns this when a register alias cannot be used. */
203static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
204 { Dw2Inval, Dw2Inval } };
205
34684862 206static const reg_entry *reg_eax;
5e042380
JB
207static const reg_entry *reg_ds;
208static const reg_entry *reg_es;
209static const reg_entry *reg_ss;
6288d05f 210static const reg_entry *reg_st0;
6225c532
JB
211static const reg_entry *reg_k0;
212
c0f3af97
L
213/* VEX prefix. */
214typedef struct
215{
43234a1e
L
216 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
217 unsigned char bytes[4];
c0f3af97
L
218 unsigned int length;
219 /* Destination or source register specifier. */
220 const reg_entry *register_specifier;
221} vex_prefix;
222
252b5132 223/* 'md_assemble ()' gathers together information and puts it into a
47926f60 224 i386_insn. */
252b5132 225
520dc8e8
AM
226union i386_op
227 {
228 expressionS *disps;
229 expressionS *imms;
230 const reg_entry *regs;
231 };
232
a65babc9
L
233enum i386_error
234 {
b4d65f2d 235 no_error, /* Must be first. */
86e026a4 236 operand_size_mismatch,
a65babc9
L
237 operand_type_mismatch,
238 register_type_mismatch,
239 number_of_operands_mismatch,
240 invalid_instruction_suffix,
241 bad_imm4,
a65babc9
L
242 unsupported_with_intel_mnemonic,
243 unsupported_syntax,
80d61d8d 244 unsupported_EGPR_for_addressing,
dd74a603 245 unsupported_nf,
6c30d220 246 unsupported,
9db83a32
JB
247 unsupported_on_arch,
248 unsupported_64bit,
54294d73
JB
249 no_vex_encoding,
250 no_evex_encoding,
260cd341 251 invalid_sib_address,
6c30d220 252 invalid_vsib_address,
7bab8ab5 253 invalid_vector_register_set,
260cd341 254 invalid_tmm_register_set,
0cc78721 255 invalid_dest_and_src_register_set,
08a98d4c 256 invalid_dest_register_set,
80d61d8d 257 invalid_pseudo_prefix,
43234a1e
L
258 unsupported_vector_index_register,
259 unsupported_broadcast,
43234a1e
L
260 broadcast_needed,
261 unsupported_masking,
262 mask_not_on_destination,
263 no_default_mask,
264 unsupported_rc_sae,
54294d73 265 unsupported_vector_size,
08a98d4c 266 unsupported_rsp_register,
58bceb18 267 internal_error,
a65babc9
L
268 };
269
252b5132
RH
270struct _i386_insn
271 {
47926f60 272 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 273 insn_template tm;
252b5132 274
7d5e4556
L
275 /* SUFFIX holds the instruction size suffix for byte, word, dword
276 or qword, if given. */
252b5132
RH
277 char suffix;
278
9a182d04
JB
279 /* OPCODE_LENGTH holds the number of base opcode bytes. */
280 unsigned char opcode_length;
281
47926f60 282 /* OPERANDS gives the number of given operands. */
252b5132
RH
283 unsigned int operands;
284
285 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
286 of given register, displacement, memory operands and immediate
47926f60 287 operands. */
252b5132
RH
288 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
289
290 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 291 use OP[i] for the corresponding operand. */
40fb9820 292 i386_operand_type types[MAX_OPERANDS];
252b5132 293
520dc8e8
AM
294 /* Displacement expression, immediate expression, or register for each
295 operand. */
296 union i386_op op[MAX_OPERANDS];
252b5132 297
3e73aa7c
JH
298 /* Flags for operands. */
299 unsigned int flags[MAX_OPERANDS];
300#define Operand_PCrel 1
c48dadc9 301#define Operand_Mem 2
c032bc4f 302#define Operand_Signed 4 /* .insn only */
3e73aa7c 303
252b5132 304 /* Relocation type for operand */
f86103b7 305 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 306
252b5132
RH
307 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
308 the base index byte below. */
309 const reg_entry *base_reg;
310 const reg_entry *index_reg;
311 unsigned int log2_scale_factor;
312
313 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 314 explicit segment overrides are given. */
5e042380 315 const reg_entry *seg[2];
252b5132
RH
316
317 /* PREFIX holds all the given prefix opcodes (usually null).
318 PREFIXES is the number of prefix opcodes. */
319 unsigned int prefixes;
320 unsigned char prefix[MAX_PREFIXES];
321
d0c2e3ec
JB
322 /* .insn allows for reserved opcode spaces. */
323 unsigned char insn_opcode_space;
324
c032bc4f
JB
325 /* .insn also allows (requires) specifying immediate size. */
326 unsigned char imm_bits[MAX_OPERANDS];
327
50128d0c 328 /* Register is in low 3 bits of opcode. */
5b7c81bd 329 bool short_form;
50128d0c 330
6f2f06be 331 /* The operand to a branch insn indicates an absolute branch. */
5b7c81bd 332 bool jumpabsolute;
6f2f06be 333
a4d3acd2
JB
334 /* The operand to a branch insn indicates a far branch. */
335 bool far_branch;
336
9373f275
L
337 /* There is a memory operand of (%dx) which should be only used
338 with input/output instructions. */
339 bool input_output_operand;
340
921eafea
L
341 /* Extended states. */
342 enum
343 {
344 /* Use MMX state. */
345 xstate_mmx = 1 << 0,
346 /* Use XMM state. */
347 xstate_xmm = 1 << 1,
348 /* Use YMM state. */
349 xstate_ymm = 1 << 2 | xstate_xmm,
350 /* Use ZMM state. */
351 xstate_zmm = 1 << 3 | xstate_ymm,
352 /* Use TMM state. */
32930e4e
L
353 xstate_tmm = 1 << 4,
354 /* Use MASK state. */
355 xstate_mask = 1 << 5
921eafea 356 } xstate;
260cd341 357
e379e5f3 358 /* Has GOTPC or TLS relocation. */
5b7c81bd 359 bool has_gotpc_tls_reloc;
e379e5f3 360
252b5132 361 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 362 addressing modes of this insn are encoded. */
252b5132 363 modrm_byte rm;
3e73aa7c 364 rex_byte rex;
43234a1e 365 rex_byte vrex;
80d61d8d 366 rex_byte rex2;
252b5132 367 sib_byte sib;
c0f3af97 368 vex_prefix vex;
b6169b20 369
6225c532
JB
370 /* Masking attributes.
371
372 The struct describes masking, applied to OPERAND in the instruction.
373 REG is a pointer to the corresponding mask register. ZEROING tells
374 whether merging or zeroing mask is used. */
375 struct Mask_Operation
376 {
377 const reg_entry *reg;
378 unsigned int zeroing;
379 /* The operand where this operation is associated. */
380 unsigned int operand;
381 } mask;
43234a1e
L
382
383 /* Rounding control and SAE attributes. */
ca5312a2
JB
384 struct RC_Operation
385 {
386 enum rc_type
387 {
388 rc_none = -1,
389 rne,
390 rd,
391 ru,
392 rz,
393 saeonly
394 } type;
7063667e
JB
395 /* In Intel syntax the operand modifier form is supposed to be used, but
396 we continue to accept the immediate forms as well. */
397 bool modifier;
ca5312a2 398 } rounding;
43234a1e 399
5273a3cd
JB
400 /* Broadcasting attributes.
401
402 The struct describes broadcasting, applied to OPERAND. TYPE is
403 expresses the broadcast factor. */
404 struct Broadcast_Operation
405 {
0cc78721 406 /* Type of broadcast: {1to2}, {1to4}, {1to8}, {1to16} or {1to32}. */
5273a3cd
JB
407 unsigned int type;
408
409 /* Index of broadcasted operand. */
410 unsigned int operand;
411
412 /* Number of bytes to broadcast. */
413 unsigned int bytes;
414 } broadcast;
43234a1e
L
415
416 /* Compressed disp8*N attribute. */
417 unsigned int memshift;
418
86fa6981
L
419 /* Prefer load or store in encoding. */
420 enum
421 {
422 dir_encoding_default = 0,
423 dir_encoding_load,
64c49ab3
JB
424 dir_encoding_store,
425 dir_encoding_swap
86fa6981 426 } dir_encoding;
891edac4 427
41eb8e88 428 /* Prefer 8bit, 16bit, 32bit displacement in encoding. */
a501d77e
L
429 enum
430 {
431 disp_encoding_default = 0,
432 disp_encoding_8bit,
41eb8e88 433 disp_encoding_16bit,
a501d77e
L
434 disp_encoding_32bit
435 } disp_encoding;
f8a5c266 436
6b6b6807 437 /* Prefer the REX byte in encoding. */
5b7c81bd 438 bool rex_encoding;
6b6b6807 439
80d61d8d
CL
440 /* Prefer the REX2 prefix in encoding. */
441 bool rex2_encoding;
442
dd74a603
CL
443 /* No CSPAZO flags update. */
444 bool has_nf;
445
b6f8c7c4 446 /* Disable instruction size optimization. */
5b7c81bd 447 bool no_optimize;
b6f8c7c4 448
e346d50a 449 /* How to encode instructions. */
86fa6981
L
450 enum
451 {
e346d50a
JB
452 encoding_default = 0,
453 encoding_vex,
454 encoding_vex3,
eb3f3841 455 encoding_egpr, /* REX2 or EVEX. */
e346d50a
JB
456 encoding_evex,
457 encoding_evex512,
458 encoding_error
459 } encoding;
86fa6981 460
d5de92cf
L
461 /* REP prefix. */
462 const char *rep_prefix;
463
165de32a
L
464 /* HLE prefix. */
465 const char *hle_prefix;
42164a71 466
7e8b059b
L
467 /* Have BND prefix. */
468 const char *bnd_prefix;
469
04ef582a
L
470 /* Have NOTRACK prefix. */
471 const char *notrack_prefix;
472
891edac4 473 /* Error message. */
a65babc9 474 enum i386_error error;
252b5132
RH
475 };
476
477typedef struct _i386_insn i386_insn;
478
43234a1e
L
479/* Link RC type with corresponding string, that'll be looked for in
480 asm. */
481struct RC_name
482{
483 enum rc_type type;
484 const char *name;
485 unsigned int len;
486};
487
488static const struct RC_name RC_NamesTable[] =
489{
490 { rne, STRING_COMMA_LEN ("rn-sae") },
491 { rd, STRING_COMMA_LEN ("rd-sae") },
492 { ru, STRING_COMMA_LEN ("ru-sae") },
493 { rz, STRING_COMMA_LEN ("rz-sae") },
494 { saeonly, STRING_COMMA_LEN ("sae") },
495};
496
3bfea8ba
L
497/* To be indexed by segment register number. */
498static const unsigned char i386_seg_prefixes[] = {
499 ES_PREFIX_OPCODE,
500 CS_PREFIX_OPCODE,
501 SS_PREFIX_OPCODE,
502 DS_PREFIX_OPCODE,
503 FS_PREFIX_OPCODE,
504 GS_PREFIX_OPCODE
505};
506
252b5132
RH
507/* List of chars besides those in app.c:symbol_chars that can start an
508 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 509const char extra_symbol_chars[] = "*%-([{}"
252b5132 510#ifdef LEX_AT
32137342
NC
511 "@"
512#endif
513#ifdef LEX_QM
514 "?"
252b5132 515#endif
32137342 516 ;
252b5132 517
b3983e5f
JB
518#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
519 && !defined (TE_GNU) \
520 && !defined (TE_LINUX) \
d85e70a3 521 && !defined (TE_Haiku) \
b3983e5f
JB
522 && !defined (TE_FreeBSD) \
523 && !defined (TE_DragonFly) \
524 && !defined (TE_NetBSD))
252b5132 525/* This array holds the chars that always start a comment. If the
b3b91714
AM
526 pre-processor is disabled, these aren't very useful. The option
527 --divide will remove '/' from this list. */
528const char *i386_comment_chars = "#/";
529#define SVR4_COMMENT_CHARS 1
252b5132 530#define PREFIX_SEPARATOR '\\'
252b5132 531
b3b91714
AM
532#else
533const char *i386_comment_chars = "#";
534#define PREFIX_SEPARATOR '/'
535#endif
536
252b5132
RH
537/* This array holds the chars that only start a comment at the beginning of
538 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
539 .line and .file directives will appear in the pre-processed output.
540 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 541 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
542 #NO_APP at the beginning of its output.
543 Also note that comments started like this one will always work if
252b5132 544 '/' isn't otherwise defined. */
b3b91714 545const char line_comment_chars[] = "#/";
252b5132 546
63a0b638 547const char line_separator_chars[] = ";";
252b5132 548
ce8a8b2f
AM
549/* Chars that can be used to separate mant from exp in floating point
550 nums. */
252b5132
RH
551const char EXP_CHARS[] = "eE";
552
ce8a8b2f
AM
553/* Chars that mean this number is a floating point constant
554 As in 0f12.456
555 or 0d1.2345e12. */
de133cf9 556const char FLT_CHARS[] = "fFdDxXhHbB";
252b5132 557
ce8a8b2f 558/* Tables for lexical analysis. */
252b5132
RH
559static char mnemonic_chars[256];
560static char register_chars[256];
561static char operand_chars[256];
252b5132 562
ce8a8b2f 563/* Lexical macros. */
252b5132
RH
564#define is_operand_char(x) (operand_chars[(unsigned char) x])
565#define is_register_char(x) (register_chars[(unsigned char) x])
566#define is_space_char(x) ((x) == ' ')
252b5132 567
d2b1a14d
JB
568/* All non-digit non-letter characters that may occur in an operand and
569 which aren't already in extra_symbol_chars[]. */
570static const char operand_special_chars[] = "$+,)._~/<>|&^!=:@]";
252b5132
RH
571
572/* md_assemble() always leaves the strings it's passed unaltered. To
573 effect this we maintain a stack of saved characters that we've smashed
574 with '\0's (indicating end of strings for various sub-fields of the
47926f60 575 assembler instruction). */
252b5132 576static char save_stack[32];
ce8a8b2f 577static char *save_stack_p;
252b5132
RH
578#define END_STRING_AND_SAVE(s) \
579 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
580#define RESTORE_END_STRING(s) \
581 do { *(s) = *--save_stack_p; } while (0)
582
47926f60 583/* The instruction we're assembling. */
252b5132
RH
584static i386_insn i;
585
586/* Possible templates for current insn. */
d3b01414 587static templates current_templates;
252b5132 588
31b2323c
L
589/* Per instruction expressionS buffers: max displacements & immediates. */
590static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
591static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 592
47926f60 593/* Current operand we are working on. */
ee86248c 594static int this_operand = -1;
252b5132 595
d0c2e3ec
JB
596/* Are we processing a .insn directive? */
597#define dot_insn() (i.tm.mnem_off == MN__insn)
598
ed719294
JB
599enum i386_flag_code i386_flag_code;
600#define flag_code i386_flag_code /* Permit to continue using original name. */
4fa24527 601static unsigned int object_64bit;
862be3fb 602static unsigned int disallow_64bit_reloc;
3e73aa7c 603static int use_rela_relocations = 0;
e379e5f3
L
604/* __tls_get_addr/___tls_get_addr symbol for TLS. */
605static const char *tls_get_addr;
3e73aa7c 606
071c5d81 607#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7af8ed2d 608
351f65ca
L
609/* The ELF ABI to use. */
610enum x86_elf_abi
611{
612 I386_ABI,
7f56bc95
L
613 X86_64_ABI,
614 X86_64_X32_ABI
351f65ca
L
615};
616
617static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 618#endif
351f65ca 619
167ad85b
TG
620#if defined (TE_PE) || defined (TE_PEP)
621/* Use big object file format. */
622static int use_big_obj = 0;
623#endif
624
8dcea932
L
625#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
626/* 1 if generating code for a shared library. */
627static int shared = 0;
b52c4ee4
IB
628
629unsigned int x86_sframe_cfa_sp_reg;
3e3e792a 630/* The other CFA base register for SFrame stack trace info. */
b52c4ee4
IB
631unsigned int x86_sframe_cfa_fp_reg;
632unsigned int x86_sframe_cfa_ra_reg;
633
8dcea932
L
634#endif
635
47926f60
KH
636/* 1 for intel syntax,
637 0 if att syntax. */
638static int intel_syntax = 0;
252b5132 639
4b5aaf5f
L
640static enum x86_64_isa
641{
642 amd64 = 1, /* AMD64 ISA. */
643 intel64 /* Intel64 ISA. */
644} isa64;
e89c5eaa 645
1efbbeb4
L
646/* 1 for intel mnemonic,
647 0 if att mnemonic. */
648static int intel_mnemonic = !SYSV386_COMPAT;
649
a60de03c
JB
650/* 1 if pseudo registers are permitted. */
651static int allow_pseudo_reg = 0;
652
47926f60
KH
653/* 1 if register prefix % not required. */
654static int allow_naked_reg = 0;
252b5132 655
33eaf5de 656/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
657 instructions supporting it, even if this prefix wasn't specified
658 explicitly. */
659static int add_bnd_prefix = 0;
660
ba104c83 661/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
662static int allow_index_reg = 0;
663
d022bddd
IT
664/* 1 if the assembler should ignore LOCK prefix, even if it was
665 specified explicitly. */
666static int omit_lock_prefix = 0;
667
e4e00185
AS
668/* 1 if the assembler should encode lfence, mfence, and sfence as
669 "lock addl $0, (%{re}sp)". */
670static int avoid_fence = 0;
671
ae531041
L
672/* 1 if lfence should be inserted after every load. */
673static int lfence_after_load = 0;
674
675/* Non-zero if lfence should be inserted before indirect branch. */
676static enum lfence_before_indirect_branch_kind
677 {
678 lfence_branch_none = 0,
679 lfence_branch_register,
680 lfence_branch_memory,
681 lfence_branch_all
682 }
683lfence_before_indirect_branch;
684
685/* Non-zero if lfence should be inserted before ret. */
686static enum lfence_before_ret_kind
687 {
688 lfence_before_ret_none = 0,
689 lfence_before_ret_not,
a09f656b 690 lfence_before_ret_or,
691 lfence_before_ret_shl
ae531041
L
692 }
693lfence_before_ret;
694
0cb4071e
L
695/* 1 if the assembler should generate relax relocations. */
696
697static int generate_relax_relocations
698 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
699
7bab8ab5 700static enum check_kind
daf50ae7 701 {
7bab8ab5
JB
702 check_none = 0,
703 check_warning,
704 check_error
daf50ae7 705 }
7bab8ab5 706sse_check, operand_check = check_warning;
daf50ae7 707
e379e5f3
L
708/* Non-zero if branches should be aligned within power of 2 boundary. */
709static int align_branch_power = 0;
710
711/* Types of branches to align. */
712enum align_branch_kind
713 {
714 align_branch_none = 0,
715 align_branch_jcc = 1,
716 align_branch_fused = 2,
717 align_branch_jmp = 3,
718 align_branch_call = 4,
719 align_branch_indirect = 5,
720 align_branch_ret = 6
721 };
722
723/* Type bits of branches to align. */
724enum align_branch_bit
725 {
726 align_branch_jcc_bit = 1 << align_branch_jcc,
727 align_branch_fused_bit = 1 << align_branch_fused,
728 align_branch_jmp_bit = 1 << align_branch_jmp,
729 align_branch_call_bit = 1 << align_branch_call,
730 align_branch_indirect_bit = 1 << align_branch_indirect,
731 align_branch_ret_bit = 1 << align_branch_ret
732 };
733
734static unsigned int align_branch = (align_branch_jcc_bit
735 | align_branch_fused_bit
736 | align_branch_jmp_bit);
737
79d72f45
HL
738/* Types of condition jump used by macro-fusion. */
739enum mf_jcc_kind
740 {
741 mf_jcc_jo = 0, /* base opcode 0x70 */
742 mf_jcc_jc, /* base opcode 0x72 */
743 mf_jcc_je, /* base opcode 0x74 */
744 mf_jcc_jna, /* base opcode 0x76 */
745 mf_jcc_js, /* base opcode 0x78 */
746 mf_jcc_jp, /* base opcode 0x7a */
747 mf_jcc_jl, /* base opcode 0x7c */
748 mf_jcc_jle, /* base opcode 0x7e */
749 };
750
751/* Types of compare flag-modifying insntructions used by macro-fusion. */
752enum mf_cmp_kind
753 {
754 mf_cmp_test_and, /* test/cmp */
755 mf_cmp_alu_cmp, /* add/sub/cmp */
756 mf_cmp_incdec /* inc/dec */
757 };
758
e379e5f3
L
759/* The maximum padding size for fused jcc. CMP like instruction can
760 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
761 prefixes. */
762#define MAX_FUSED_JCC_PADDING_SIZE 20
763
764/* The maximum number of prefixes added for an instruction. */
765static unsigned int align_branch_prefix_size = 5;
766
b6f8c7c4
L
767/* Optimization:
768 1. Clear the REX_W bit with register operand if possible.
769 2. Above plus use 128bit vector instruction to clear the full vector
770 register.
771 */
772static int optimize = 0;
773
774/* Optimization:
775 1. Clear the REX_W bit with register operand if possible.
776 2. Above plus use 128bit vector instruction to clear the full vector
777 register.
778 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
779 "testb $imm7,%r8".
780 */
781static int optimize_for_space = 0;
782
2ca3ace5
L
783/* Register prefix used for error message. */
784static const char *register_prefix = "%";
785
47926f60
KH
786/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
787 leave, push, and pop instructions so that gcc has the same stack
788 frame as in 32 bit mode. */
789static char stackop_size = '\0';
eecb386c 790
12b55ccc
L
791/* Non-zero to optimize code alignment. */
792int optimize_align_code = 1;
793
47926f60
KH
794/* Non-zero to quieten some warnings. */
795static int quiet_warnings = 0;
a38cf1db 796
d59a54c2
JB
797/* Guard to avoid repeated warnings about non-16-bit code on 16-bit CPUs. */
798static bool pre_386_16bit_warned;
799
47926f60
KH
800/* CPU name. */
801static const char *cpu_arch_name = NULL;
6305a203 802static char *cpu_sub_arch_name = NULL;
a38cf1db 803
47926f60 804/* CPU feature flags. */
cd75cd85 805i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
40fb9820 806
3e624fa4
JB
807/* ISA extensions available in 64-bit mode only. */
808static const i386_cpu_flags cpu_64_flags = CPU_ANY_64_FLAGS;
809
ccc9c027
L
810/* If we have selected a cpu we are generating instructions for. */
811static int cpu_arch_tune_set = 0;
812
9103f4f4 813/* Cpu we are generating instructions for. */
fbf3f584 814enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4 815
ccc9c027 816/* CPU instruction set architecture used. */
fbf3f584 817enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 818
9103f4f4 819/* CPU feature flags of instruction set architecture used. */
fbf3f584 820i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 821
fddf5b5b
AM
822/* If set, conditional jumps are not automatically promoted to handle
823 larger than a byte offset. */
f68697e8 824static bool no_cond_jump_promotion = false;
fddf5b5b 825
5cc00775
JB
826/* This will be set from an expression parser hook if there's any
827 applicable operator involved in an expression. */
828static enum {
829 expr_operator_none,
830 expr_operator_present,
831 expr_large_value,
832} expr_mode;
833
c0f3af97
L
834/* Encode SSE instructions with VEX prefix. */
835static unsigned int sse2avx;
836
c8480b58
L
837/* Encode aligned vector move as unaligned vector move. */
838static unsigned int use_unaligned_vector_move;
839
4fc85f37 840/* Maximum permitted vector size. */
fa88a361
HJ
841#define VSZ128 0
842#define VSZ256 1
843#define VSZ512 2
4fc85f37
JB
844#define VSZ_DEFAULT VSZ512
845static unsigned int vector_size = VSZ_DEFAULT;
846
539f890d
L
847/* Encode scalar AVX instructions with specific vector length. */
848static enum
849 {
850 vex128 = 0,
851 vex256
852 } avxscalar;
853
03751133
L
854/* Encode VEX WIG instructions with specific vex.w. */
855static enum
856 {
857 vexw0 = 0,
858 vexw1
859 } vexwig;
860
43234a1e
L
861/* Encode scalar EVEX LIG instructions with specific vector length. */
862static enum
863 {
864 evexl128 = 0,
865 evexl256,
866 evexl512
867 } evexlig;
868
869/* Encode EVEX WIG instructions with specific evex.w. */
870static enum
871 {
872 evexw0 = 0,
873 evexw1
874 } evexwig;
875
d3d3c6db
IT
876/* Value to encode in EVEX RC bits, for SAE-only instructions. */
877static enum rc_type evexrcig = rne;
878
29b0f896 879/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 880static symbolS *GOT_symbol;
29b0f896 881
a4447b93
RH
882/* The dwarf2 return column, adjusted for 32 or 64 bit. */
883unsigned int x86_dwarf2_return_column;
884
885/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
886int x86_cie_data_alignment;
887
252b5132 888/* Interface to relax_segment.
fddf5b5b
AM
889 There are 3 major relax states for 386 jump insns because the
890 different types of jumps add different sizes to frags when we're
e379e5f3
L
891 figuring out what sort of jump to choose to reach a given label.
892
893 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
894 branches which are handled by md_estimate_size_before_relax() and
895 i386_generic_table_relax_frag(). */
252b5132 896
47926f60 897/* Types. */
93c2a809
AM
898#define UNCOND_JUMP 0
899#define COND_JUMP 1
900#define COND_JUMP86 2
e379e5f3
L
901#define BRANCH_PADDING 3
902#define BRANCH_PREFIX 4
903#define FUSED_JCC_PADDING 5
fddf5b5b 904
47926f60 905/* Sizes. */
252b5132
RH
906#define CODE16 1
907#define SMALL 0
29b0f896 908#define SMALL16 (SMALL | CODE16)
252b5132 909#define BIG 2
29b0f896 910#define BIG16 (BIG | CODE16)
252b5132
RH
911
912#ifndef INLINE
913#ifdef __GNUC__
914#define INLINE __inline__
915#else
916#define INLINE
917#endif
918#endif
919
fddf5b5b
AM
920#define ENCODE_RELAX_STATE(type, size) \
921 ((relax_substateT) (((type) << 2) | (size)))
922#define TYPE_FROM_RELAX_STATE(s) \
923 ((s) >> 2)
924#define DISP_SIZE_FROM_RELAX_STATE(s) \
925 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
926
927/* This table is used by relax_frag to promote short jumps to long
928 ones where necessary. SMALL (short) jumps may be promoted to BIG
929 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
930 don't allow a short jump in a 32 bit code segment to be promoted to
931 a 16 bit offset jump because it's slower (requires data size
932 prefix), and doesn't work, unless the destination is in the bottom
933 64k of the code segment (The top 16 bits of eip are zeroed). */
934
935const relax_typeS md_relax_table[] =
936{
24eab124
AM
937 /* The fields are:
938 1) most positive reach of this state,
939 2) most negative reach of this state,
93c2a809 940 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 941 4) which index into the table to try if we can't fit into this one. */
252b5132 942
fddf5b5b 943 /* UNCOND_JUMP states. */
93c2a809
AM
944 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
945 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
946 /* dword jmp adds 4 bytes to frag:
947 0 extra opcode bytes, 4 displacement bytes. */
252b5132 948 {0, 0, 4, 0},
93c2a809
AM
949 /* word jmp adds 2 byte2 to frag:
950 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
951 {0, 0, 2, 0},
952
93c2a809
AM
953 /* COND_JUMP states. */
954 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
955 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
956 /* dword conditionals adds 5 bytes to frag:
957 1 extra opcode byte, 4 displacement bytes. */
958 {0, 0, 5, 0},
fddf5b5b 959 /* word conditionals add 3 bytes to frag:
93c2a809
AM
960 1 extra opcode byte, 2 displacement bytes. */
961 {0, 0, 3, 0},
962
963 /* COND_JUMP86 states. */
964 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
965 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
966 /* dword conditionals adds 5 bytes to frag:
967 1 extra opcode byte, 4 displacement bytes. */
968 {0, 0, 5, 0},
969 /* word conditionals add 4 bytes to frag:
970 1 displacement byte and a 3 byte long branch insn. */
971 {0, 0, 4, 0}
252b5132
RH
972};
973
6ceeed25 974#define ARCH(n, t, f, s) \
4fc85f37 975 { STRING_COMMA_LEN (#n), s, PROCESSOR_ ## t, vsz_none, CPU_ ## f ## _FLAGS, \
ae89daec
JB
976 CPU_NONE_FLAGS }
977#define SUBARCH(n, e, d, s) \
4fc85f37 978 { STRING_COMMA_LEN (#n), s, PROCESSOR_NONE, vsz_none, CPU_ ## e ## _FLAGS, \
ae89daec 979 CPU_ ## d ## _FLAGS }
4fc85f37
JB
980#define VECARCH(n, e, d, v) \
981 { STRING_COMMA_LEN (#n), false, PROCESSOR_NONE, vsz_ ## v, \
982 CPU_ ## e ## _FLAGS, CPU_ ## d ## _FLAGS }
6ceeed25 983
9103f4f4
L
984static const arch_entry cpu_arch[] =
985{
3ce2ebcf
JB
986 /* Do not replace the first two entries - i386_target_format() and
987 set_cpu_arch() rely on them being there in this order. */
6ceeed25
JB
988 ARCH (generic32, GENERIC32, GENERIC32, false),
989 ARCH (generic64, GENERIC64, GENERIC64, false),
990 ARCH (i8086, UNKNOWN, NONE, false),
4d97c5c8
JB
991 ARCH (i186, UNKNOWN, 186, false),
992 ARCH (i286, UNKNOWN, 286, false),
993 ARCH (i386, I386, 386, false),
994 ARCH (i486, I486, 486, false),
995 ARCH (i586, PENTIUM, 586, false),
4d97c5c8 996 ARCH (pentium, PENTIUM, 586, false),
c8be4b6f 997 ARCH (i686, I686, 686, false),
6ceeed25
JB
998 ARCH (pentiumpro, PENTIUMPRO, PENTIUMPRO, false),
999 ARCH (pentiumii, PENTIUMPRO, P2, false),
1000 ARCH (pentiumiii, PENTIUMPRO, P3, false),
1001 ARCH (pentium4, PENTIUM4, P4, false),
1002 ARCH (prescott, NOCONA, CORE, false),
1003 ARCH (nocona, NOCONA, NOCONA, false),
1004 ARCH (yonah, CORE, CORE, true),
1005 ARCH (core, CORE, CORE, false),
1006 ARCH (merom, CORE2, CORE2, true),
1007 ARCH (core2, CORE2, CORE2, false),
1008 ARCH (corei7, COREI7, COREI7, false),
1009 ARCH (iamcu, IAMCU, IAMCU, false),
1010 ARCH (k6, K6, K6, false),
1011 ARCH (k6_2, K6, K6_2, false),
1012 ARCH (athlon, ATHLON, ATHLON, false),
1013 ARCH (sledgehammer, K8, K8, true),
1014 ARCH (opteron, K8, K8, false),
1015 ARCH (k8, K8, K8, false),
1016 ARCH (amdfam10, AMDFAM10, AMDFAM10, false),
1017 ARCH (bdver1, BD, BDVER1, false),
1018 ARCH (bdver2, BD, BDVER2, false),
1019 ARCH (bdver3, BD, BDVER3, false),
1020 ARCH (bdver4, BD, BDVER4, false),
1021 ARCH (znver1, ZNVER, ZNVER1, false),
1022 ARCH (znver2, ZNVER, ZNVER2, false),
1023 ARCH (znver3, ZNVER, ZNVER3, false),
b0e8fa7f 1024 ARCH (znver4, ZNVER, ZNVER4, false),
b143c979 1025 ARCH (znver5, ZNVER, ZNVER5, false),
6ceeed25
JB
1026 ARCH (btver1, BT, BTVER1, false),
1027 ARCH (btver2, BT, BTVER2, false),
1028
4d97c5c8
JB
1029 SUBARCH (8087, 8087, ANY_8087, false),
1030 SUBARCH (87, NONE, ANY_8087, false), /* Disable only! */
ae89daec
JB
1031 SUBARCH (287, 287, ANY_287, false),
1032 SUBARCH (387, 387, ANY_387, false),
1033 SUBARCH (687, 687, ANY_687, false),
4d97c5c8 1034 SUBARCH (cmov, CMOV, CMOV, false),
88bd2203 1035 SUBARCH (fxsr, FXSR, ANY_FXSR, false),
ae89daec
JB
1036 SUBARCH (mmx, MMX, ANY_MMX, false),
1037 SUBARCH (sse, SSE, ANY_SSE, false),
1038 SUBARCH (sse2, SSE2, ANY_SSE2, false),
1039 SUBARCH (sse3, SSE3, ANY_SSE3, false),
1040 SUBARCH (sse4a, SSE4A, ANY_SSE4A, false),
1041 SUBARCH (ssse3, SSSE3, ANY_SSSE3, false),
1042 SUBARCH (sse4.1, SSE4_1, ANY_SSE4_1, false),
1043 SUBARCH (sse4.2, SSE4_2, ANY_SSE4_2, false),
1044 SUBARCH (sse4, SSE4_2, ANY_SSE4_1, false),
4fc85f37
JB
1045 VECARCH (avx, AVX, ANY_AVX, reset),
1046 VECARCH (avx2, AVX2, ANY_AVX2, reset),
1047 VECARCH (avx512f, AVX512F, ANY_AVX512F, reset),
1048 VECARCH (avx512cd, AVX512CD, ANY_AVX512CD, reset),
1049 VECARCH (avx512er, AVX512ER, ANY_AVX512ER, reset),
1050 VECARCH (avx512pf, AVX512PF, ANY_AVX512PF, reset),
1051 VECARCH (avx512dq, AVX512DQ, ANY_AVX512DQ, reset),
1052 VECARCH (avx512bw, AVX512BW, ANY_AVX512BW, reset),
1053 VECARCH (avx512vl, AVX512VL, ANY_AVX512VL, reset),
cafa5ef7 1054 SUBARCH (monitor, MONITOR, MONITOR, false),
25626f79
JB
1055 SUBARCH (vmx, VMX, ANY_VMX, false),
1056 SUBARCH (vmfunc, VMFUNC, ANY_VMFUNC, false),
ae89daec 1057 SUBARCH (smx, SMX, SMX, false),
5091b9ee
JB
1058 SUBARCH (xsave, XSAVE, ANY_XSAVE, false),
1059 SUBARCH (xsaveopt, XSAVEOPT, ANY_XSAVEOPT, false),
1060 SUBARCH (xsavec, XSAVEC, ANY_XSAVEC, false),
1061 SUBARCH (xsaves, XSAVES, ANY_XSAVES, false),
1062 SUBARCH (aes, AES, ANY_AES, false),
d54678eb
JB
1063 SUBARCH (pclmul, PCLMULQDQ, ANY_PCLMULQDQ, false),
1064 SUBARCH (clmul, PCLMULQDQ, ANY_PCLMULQDQ, true),
ae89daec
JB
1065 SUBARCH (fsgsbase, FSGSBASE, FSGSBASE, false),
1066 SUBARCH (rdrnd, RDRND, RDRND, false),
5091b9ee 1067 SUBARCH (f16c, F16C, ANY_F16C, false),
ae89daec 1068 SUBARCH (bmi2, BMI2, BMI2, false),
5091b9ee
JB
1069 SUBARCH (fma, FMA, ANY_FMA, false),
1070 SUBARCH (fma4, FMA4, ANY_FMA4, false),
1071 SUBARCH (xop, XOP, ANY_XOP, false),
1072 SUBARCH (lwp, LWP, ANY_LWP, false),
ae89daec
JB
1073 SUBARCH (movbe, MOVBE, MOVBE, false),
1074 SUBARCH (cx16, CX16, CX16, false),
c3bb24f5 1075 SUBARCH (lahf_sahf, LAHF_SAHF, LAHF_SAHF, false),
25626f79 1076 SUBARCH (ept, EPT, ANY_EPT, false),
ae89daec
JB
1077 SUBARCH (lzcnt, LZCNT, LZCNT, false),
1078 SUBARCH (popcnt, POPCNT, POPCNT, false),
1079 SUBARCH (hle, HLE, HLE, false),
760ab3d0
JB
1080 SUBARCH (rtm, RTM, ANY_RTM, false),
1081 SUBARCH (tsx, TSX, TSX, false),
ae89daec
JB
1082 SUBARCH (invpcid, INVPCID, INVPCID, false),
1083 SUBARCH (clflush, CLFLUSH, CLFLUSH, false),
1084 SUBARCH (nop, NOP, NOP, false),
1085 SUBARCH (syscall, SYSCALL, SYSCALL, false),
1086 SUBARCH (rdtscp, RDTSCP, RDTSCP, false),
5091b9ee
JB
1087 SUBARCH (3dnow, 3DNOW, ANY_3DNOW, false),
1088 SUBARCH (3dnowa, 3DNOWA, ANY_3DNOWA, false),
ae89daec 1089 SUBARCH (padlock, PADLOCK, PADLOCK, false),
0919e770
JB
1090 SUBARCH (pacifica, SVME, ANY_SVME, true),
1091 SUBARCH (svme, SVME, ANY_SVME, false),
ae89daec
JB
1092 SUBARCH (abm, ABM, ABM, false),
1093 SUBARCH (bmi, BMI, BMI, false),
1094 SUBARCH (tbm, TBM, TBM, false),
1095 SUBARCH (adx, ADX, ADX, false),
1096 SUBARCH (rdseed, RDSEED, RDSEED, false),
1097 SUBARCH (prfchw, PRFCHW, PRFCHW, false),
1098 SUBARCH (smap, SMAP, SMAP, false),
5091b9ee
JB
1099 SUBARCH (mpx, MPX, ANY_MPX, false),
1100 SUBARCH (sha, SHA, ANY_SHA, false),
ae89daec
JB
1101 SUBARCH (clflushopt, CLFLUSHOPT, CLFLUSHOPT, false),
1102 SUBARCH (prefetchwt1, PREFETCHWT1, PREFETCHWT1, false),
1103 SUBARCH (se1, SE1, SE1, false),
1104 SUBARCH (clwb, CLWB, CLWB, false),
4fc85f37
JB
1105 VECARCH (avx512ifma, AVX512IFMA, ANY_AVX512IFMA, reset),
1106 VECARCH (avx512vbmi, AVX512VBMI, ANY_AVX512VBMI, reset),
1107 VECARCH (avx512_4fmaps, AVX512_4FMAPS, ANY_AVX512_4FMAPS, reset),
1108 VECARCH (avx512_4vnniw, AVX512_4VNNIW, ANY_AVX512_4VNNIW, reset),
1109 VECARCH (avx512_vpopcntdq, AVX512_VPOPCNTDQ, ANY_AVX512_VPOPCNTDQ, reset),
1110 VECARCH (avx512_vbmi2, AVX512_VBMI2, ANY_AVX512_VBMI2, reset),
1111 VECARCH (avx512_vnni, AVX512_VNNI, ANY_AVX512_VNNI, reset),
1112 VECARCH (avx512_bitalg, AVX512_BITALG, ANY_AVX512_BITALG, reset),
1113 VECARCH (avx_vnni, AVX_VNNI, ANY_AVX_VNNI, reset),
ae89daec
JB
1114 SUBARCH (clzero, CLZERO, CLZERO, false),
1115 SUBARCH (mwaitx, MWAITX, MWAITX, false),
5091b9ee 1116 SUBARCH (ospke, OSPKE, ANY_OSPKE, false),
ae89daec
JB
1117 SUBARCH (rdpid, RDPID, RDPID, false),
1118 SUBARCH (ptwrite, PTWRITE, PTWRITE, false),
4d97c5c8
JB
1119 SUBARCH (ibt, IBT, IBT, false),
1120 SUBARCH (shstk, SHSTK, SHSTK, false),
88bd2203 1121 SUBARCH (gfni, GFNI, ANY_GFNI, false),
4fc85f37
JB
1122 VECARCH (vaes, VAES, ANY_VAES, reset),
1123 VECARCH (vpclmulqdq, VPCLMULQDQ, ANY_VPCLMULQDQ, reset),
ae89daec
JB
1124 SUBARCH (wbnoinvd, WBNOINVD, WBNOINVD, false),
1125 SUBARCH (pconfig, PCONFIG, PCONFIG, false),
1126 SUBARCH (waitpkg, WAITPKG, WAITPKG, false),
1127 SUBARCH (cldemote, CLDEMOTE, CLDEMOTE, false),
1128 SUBARCH (amx_int8, AMX_INT8, ANY_AMX_INT8, false),
1129 SUBARCH (amx_bf16, AMX_BF16, ANY_AMX_BF16, false),
5091b9ee 1130 SUBARCH (amx_fp16, AMX_FP16, ANY_AMX_FP16, false),
d100d8c1 1131 SUBARCH (amx_complex, AMX_COMPLEX, ANY_AMX_COMPLEX, false),
ae89daec 1132 SUBARCH (amx_tile, AMX_TILE, ANY_AMX_TILE, false),
4d97c5c8
JB
1133 SUBARCH (movdiri, MOVDIRI, MOVDIRI, false),
1134 SUBARCH (movdir64b, MOVDIR64B, MOVDIR64B, false),
4fc85f37
JB
1135 VECARCH (avx512_bf16, AVX512_BF16, ANY_AVX512_BF16, reset),
1136 VECARCH (avx512_vp2intersect, AVX512_VP2INTERSECT,
1137 ANY_AVX512_VP2INTERSECT, reset),
4d97c5c8
JB
1138 SUBARCH (tdx, TDX, TDX, false),
1139 SUBARCH (enqcmd, ENQCMD, ENQCMD, false),
1140 SUBARCH (serialize, SERIALIZE, SERIALIZE, false),
ae89daec
JB
1141 SUBARCH (rdpru, RDPRU, RDPRU, false),
1142 SUBARCH (mcommit, MCOMMIT, MCOMMIT, false),
0919e770 1143 SUBARCH (sev_es, SEV_ES, ANY_SEV_ES, false),
760ab3d0 1144 SUBARCH (tsxldtrk, TSXLDTRK, ANY_TSXLDTRK, false),
88bd2203
JB
1145 SUBARCH (kl, KL, ANY_KL, false),
1146 SUBARCH (widekl, WIDEKL, ANY_WIDEKL, false),
4d97c5c8
JB
1147 SUBARCH (uintr, UINTR, UINTR, false),
1148 SUBARCH (hreset, HRESET, HRESET, false),
4fc85f37 1149 VECARCH (avx512_fp16, AVX512_FP16, ANY_AVX512_FP16, reset),
ef07be45 1150 SUBARCH (prefetchi, PREFETCHI, PREFETCHI, false),
4fc85f37
JB
1151 VECARCH (avx_ifma, AVX_IFMA, ANY_AVX_IFMA, reset),
1152 VECARCH (avx_vnni_int8, AVX_VNNI_INT8, ANY_AVX_VNNI_INT8, reset),
4d97c5c8
JB
1153 SUBARCH (cmpccxadd, CMPCCXADD, CMPCCXADD, false),
1154 SUBARCH (wrmsrns, WRMSRNS, WRMSRNS, false),
1155 SUBARCH (msrlist, MSRLIST, MSRLIST, false),
4fc85f37 1156 VECARCH (avx_ne_convert, AVX_NE_CONVERT, ANY_AVX_NE_CONVERT, reset),
4d97c5c8 1157 SUBARCH (rao_int, RAO_INT, RAO_INT, false),
0919e770 1158 SUBARCH (rmpquery, RMPQUERY, ANY_RMPQUERY, false),
c88ed92f
ZJ
1159 SUBARCH (fred, FRED, ANY_FRED, false),
1160 SUBARCH (lkgs, LKGS, ANY_LKGS, false),
4fc85f37
JB
1161 VECARCH (avx_vnni_int16, AVX_VNNI_INT16, ANY_AVX_VNNI_INT16, reset),
1162 VECARCH (sha512, SHA512, ANY_SHA512, reset),
1163 VECARCH (sm3, SM3, ANY_SM3, reset),
1164 VECARCH (sm4, SM4, ANY_SM4, reset),
b5c37946 1165 SUBARCH (pbndkb, PBNDKB, PBNDKB, false),
4fc85f37 1166 VECARCH (avx10.1, AVX10_1, ANY_AVX512F, set),
8170af78 1167 SUBARCH (user_msr, USER_MSR, USER_MSR, false),
80d61d8d 1168 SUBARCH (apx_f, APX_F, APX_F, false),
293f5f65
L
1169};
1170
6ceeed25
JB
1171#undef SUBARCH
1172#undef ARCH
1173
704209c0 1174#ifdef I386COFF
a6c24e68
NC
1175/* Like s_lcomm_internal in gas/read.c but the alignment string
1176 is allowed to be optional. */
1177
1178static symbolS *
1179pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1180{
1181 addressT align = 0;
1182
1183 SKIP_WHITESPACE ();
1184
7ab9ffdd 1185 if (needs_align
a6c24e68
NC
1186 && *input_line_pointer == ',')
1187 {
1188 align = parse_align (needs_align - 1);
7ab9ffdd 1189
a6c24e68
NC
1190 if (align == (addressT) -1)
1191 return NULL;
1192 }
1193 else
1194 {
1195 if (size >= 8)
1196 align = 3;
1197 else if (size >= 4)
1198 align = 2;
1199 else if (size >= 2)
1200 align = 1;
1201 else
1202 align = 0;
1203 }
1204
1205 bss_alloc (symbolP, size, align);
1206 return symbolP;
1207}
1208
704209c0 1209static void
a6c24e68
NC
1210pe_lcomm (int needs_align)
1211{
1212 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1213}
704209c0 1214#endif
a6c24e68 1215
29b0f896
AM
1216const pseudo_typeS md_pseudo_table[] =
1217{
1218#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1219 {"align", s_align_bytes, 0},
1220#else
1221 {"align", s_align_ptwo, 0},
1222#endif
1223 {"arch", set_cpu_arch, 0},
d4064aad 1224#ifdef OBJ_AOUT
29b0f896 1225 {"bss", s_bss, 0},
d4064aad
JB
1226#endif
1227#ifdef I386COFF
a6c24e68 1228 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1229#endif
1230 {"ffloat", float_cons, 'f'},
1231 {"dfloat", float_cons, 'd'},
1232 {"tfloat", float_cons, 'x'},
7d19d096 1233 {"hfloat", float_cons, 'h'},
de133cf9 1234 {"bfloat16", float_cons, 'b'},
29b0f896 1235 {"value", cons, 2},
d182319b 1236 {"slong", signed_cons, 4},
edd67638 1237 {"insn", s_insn, 0},
1e7dd4a0 1238 {"noopt", s_noopt, 0},
29b0f896
AM
1239 {"optim", s_ignore, 0},
1240 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1241 {"code16", set_code_flag, CODE_16BIT},
1242 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1243#ifdef BFD64
29b0f896 1244 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1245#endif
29b0f896
AM
1246 {"intel_syntax", set_intel_syntax, 1},
1247 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1248 {"intel_mnemonic", set_intel_mnemonic, 1},
1249 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1250 {"allow_index_reg", set_allow_index_reg, 1},
1251 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1252 {"sse_check", set_check, 0},
1253 {"operand_check", set_check, 1},
3b22753a
L
1254#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1255 {"largecomm", handle_large_common, 0},
07a53e5c 1256#else
68d20676 1257 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1258 {"loc", dwarf2_directive_loc, 0},
1259 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1260#endif
6482c264
NC
1261#ifdef TE_PE
1262 {"secrel32", pe_directive_secrel, 0},
145667f8 1263 {"secidx", pe_directive_secidx, 0},
6482c264 1264#endif
29b0f896
AM
1265 {0, 0, 0}
1266};
1267
1268/* For interface with expression (). */
1269extern char *input_line_pointer;
1270
1271/* Hash table for instruction mnemonic lookup. */
629310ab 1272static htab_t op_hash;
29b0f896
AM
1273
1274/* Hash table for register lookup. */
629310ab 1275static htab_t reg_hash;
29b0f896 1276\f
ce8a8b2f
AM
1277 /* Various efficient no-op patterns for aligning code labels.
1278 Note: Don't try to assemble the instructions in the comments.
1279 0L and 0w are not legal. */
62a02d25
L
1280static const unsigned char f32_1[] =
1281 {0x90}; /* nop */
1282static const unsigned char f32_2[] =
1283 {0x66,0x90}; /* xchg %ax,%ax */
1284static const unsigned char f32_3[] =
1285 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
ad9f3230
JB
1286#define f32_4 (f32_5 + 1) /* leal 0(%esi,%eiz),%esi */
1287static const unsigned char f32_5[] =
1288 {0x2e,0x8d,0x74,0x26,0x00}; /* leal %cs:0(%esi,%eiz),%esi */
62a02d25
L
1289static const unsigned char f32_6[] =
1290 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
ad9f3230
JB
1291#define f32_7 (f32_8 + 1) /* leal 0L(%esi,%eiz),%esi */
1292static const unsigned char f32_8[] =
1293 {0x2e,0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal %cs:0L(%esi,%eiz),%esi */
d164359d
JB
1294static const unsigned char f64_3[] =
1295 {0x48,0x89,0xf6}; /* mov %rsi,%rsi */
1296static const unsigned char f64_4[] =
1297 {0x48,0x8d,0x76,0x00}; /* lea 0(%rsi),%rsi */
1298#define f64_5 (f64_6 + 1) /* lea 0(%rsi,%riz),%rsi */
1299static const unsigned char f64_6[] =
1300 {0x2e,0x48,0x8d,0x74,0x26,0x00}; /* lea %cs:0(%rsi,%riz),%rsi */
1301static const unsigned char f64_7[] =
1302 {0x48,0x8d,0xb6,0x00,0x00,0x00,0x00}; /* lea 0L(%rsi),%rsi */
1303#define f64_8 (f64_9 + 1) /* lea 0L(%rsi,%riz),%rsi */
1304static const unsigned char f64_9[] =
1305 {0x2e,0x48,0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* lea %cs:0L(%rsi,%riz),%rsi */
5e0729b6 1306#define f16_2 (f64_3 + 1) /* mov %si,%si */
62a02d25 1307static const unsigned char f16_3[] =
3ae729d5 1308 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
ad9f3230
JB
1309#define f16_4 (f16_5 + 1) /* lea 0W(%si),%si */
1310static const unsigned char f16_5[] =
1311 {0x2e,0x8d,0xb4,0x00,0x00}; /* lea %cs:0W(%si),%si */
3ae729d5
L
1312static const unsigned char jump_disp8[] =
1313 {0xeb}; /* jmp disp8 */
1314static const unsigned char jump32_disp32[] =
1315 {0xe9}; /* jmp disp32 */
1316static const unsigned char jump16_disp32[] =
1317 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1318/* 32-bit NOPs patterns. */
1319static const unsigned char *const f32_patt[] = {
ad9f3230 1320 f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8
62a02d25 1321};
d164359d
JB
1322/* 64-bit NOPs patterns. */
1323static const unsigned char *const f64_patt[] = {
1324 f32_1, f32_2, f64_3, f64_4, f64_5, f64_6, f64_7, f64_8, f64_9
1325};
62a02d25
L
1326/* 16-bit NOPs patterns. */
1327static const unsigned char *const f16_patt[] = {
ad9f3230 1328 f32_1, f16_2, f16_3, f16_4, f16_5
62a02d25
L
1329};
1330/* nopl (%[re]ax) */
1331static const unsigned char alt_3[] =
1332 {0x0f,0x1f,0x00};
1333/* nopl 0(%[re]ax) */
1334static const unsigned char alt_4[] =
1335 {0x0f,0x1f,0x40,0x00};
1336/* nopl 0(%[re]ax,%[re]ax,1) */
ae7067fb 1337#define alt_5 (alt_6 + 1)
62a02d25
L
1338/* nopw 0(%[re]ax,%[re]ax,1) */
1339static const unsigned char alt_6[] =
1340 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1341/* nopl 0L(%[re]ax) */
1342static const unsigned char alt_7[] =
1343 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1344/* nopl 0L(%[re]ax,%[re]ax,1) */
ae7067fb 1345#define alt_8 (alt_9 + 1)
62a02d25
L
1346/* nopw 0L(%[re]ax,%[re]ax,1) */
1347static const unsigned char alt_9[] =
1348 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1349/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
ae7067fb 1350#define alt_10 (alt_11 + 1)
3ae729d5
L
1351/* data16 nopw %cs:0L(%eax,%eax,1) */
1352static const unsigned char alt_11[] =
1353 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1354/* 32-bit and 64-bit NOPs patterns. */
1355static const unsigned char *const alt_patt[] = {
1356 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1357 alt_9, alt_10, alt_11
62a02d25 1358};
bf649e72
L
1359#define alt64_9 (alt64_15 + 6) /* nopq 0L(%rax,%rax,1) */
1360#define alt64_10 (alt64_15 + 5) /* cs nopq 0L(%rax,%rax,1) */
1361/* data16 cs nopq 0L(%rax,%rax,1) */
1362#define alt64_11 (alt64_15 + 4)
1363/* data16 data16 cs nopq 0L(%rax,%rax,1) */
1364#define alt64_12 (alt64_15 + 3)
1365/* data16 data16 data16 cs nopq 0L(%rax,%rax,1) */
1366#define alt64_13 (alt64_15 + 2)
1367/* data16 data16 data16 data16 cs nopq 0L(%rax,%rax,1) */
1368#define alt64_14 (alt64_15 + 1)
1369/* data16 data16 data16 data16 data16 cs nopq 0L(%rax,%rax,1) */
1370static const unsigned char alt64_15[] =
1371 {0x66,0x66,0x66,0x66,0x66,0x2e,0x48,
1372 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1373/* Long 64-bit NOPs patterns. */
1374static const unsigned char *const alt64_patt[] = {
1375 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
1376 alt64_9, alt64_10, alt64_11,alt64_12, alt64_13, alt64_14, alt64_15
1377};
62a02d25
L
1378
1379/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1380 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1381
1382static void
1383i386_output_nops (char *where, const unsigned char *const *patt,
1384 int count, int max_single_nop_size)
1385
1386{
3ae729d5
L
1387 /* Place the longer NOP first. */
1388 int last;
1389 int offset;
3076e594
NC
1390 const unsigned char *nops;
1391
1392 if (max_single_nop_size < 1)
1393 {
1394 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1395 max_single_nop_size);
1396 return;
1397 }
1398
1399 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1400 last = count % max_single_nop_size;
1401
1402 count -= last;
1403 for (offset = 0; offset < count; offset += max_single_nop_size)
1404 memcpy (where + offset, nops, max_single_nop_size);
1405
1406 if (last)
1407 {
1408 nops = patt[last - 1];
ad9f3230 1409 memcpy (where + offset, nops, last);
3ae729d5 1410 }
62a02d25
L
1411}
1412
3ae729d5
L
1413static INLINE int
1414fits_in_imm7 (offsetT num)
1415{
1416 return (num & 0x7f) == num;
1417}
1418
1419static INLINE int
1420fits_in_imm31 (offsetT num)
1421{
1422 return (num & 0x7fffffff) == num;
1423}
62a02d25
L
1424
1425/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1426 single NOP instruction LIMIT. */
1427
1428void
3ae729d5 1429i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1430{
3ae729d5 1431 const unsigned char *const *patt = NULL;
62a02d25 1432 int max_single_nop_size;
3ae729d5
L
1433 /* Maximum number of NOPs before switching to jump over NOPs. */
1434 int max_number_of_nops;
62a02d25 1435
3ae729d5 1436 switch (fragP->fr_type)
62a02d25 1437 {
3ae729d5
L
1438 case rs_fill_nop:
1439 case rs_align_code:
1440 break;
e379e5f3
L
1441 case rs_machine_dependent:
1442 /* Allow NOP padding for jumps and calls. */
1443 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1444 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1445 break;
1446 /* Fall through. */
3ae729d5 1447 default:
62a02d25
L
1448 return;
1449 }
1450
ccc9c027
L
1451 /* We need to decide which NOP sequence to use for 32bit and
1452 64bit. When -mtune= is used:
4eed87de 1453
c8be4b6f 1454 1. For PROCESSOR_I?86, PROCESSOR_PENTIUM, PROCESSOR_IAMCU, and
76bc74dc 1455 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1456 2. For the rest, alt_patt will be used.
1457
1458 When -mtune= isn't used, alt_patt will be used if
d164359d 1459 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt/f64_patt will
76bc74dc 1460 be used.
ccc9c027
L
1461
1462 When -march= or .arch is used, we can't use anything beyond
1463 cpu_arch_isa_flags. */
1464
d12c7ab8 1465 if (fragP->tc_frag_data.code == CODE_16BIT)
ccc9c027 1466 {
3ae729d5
L
1467 patt = f16_patt;
1468 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1469 /* Limit number of NOPs to 2 in 16-bit mode. */
1470 max_number_of_nops = 2;
252b5132 1471 }
33fef721 1472 else
ccc9c027 1473 {
d164359d 1474 patt = fragP->tc_frag_data.code == CODE_64BIT ? f64_patt : f32_patt;
fbf3f584 1475 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027 1476 {
cd75cd85
JB
1477 /* PROCESSOR_UNKNOWN means that all ISAs may be used, unless
1478 explicitly disabled. */
d12c7ab8 1479 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1480 {
1481 case PROCESSOR_UNKNOWN:
1482 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423 1483 optimize with nops. */
9f314ead 1484 if (fragP->tc_frag_data.isanop)
80b8656c 1485 patt = alt_patt;
ccc9c027 1486 break;
c8be4b6f 1487
ef05d495 1488 case PROCESSOR_CORE:
76bc74dc 1489 case PROCESSOR_CORE2:
bd5295b2 1490 case PROCESSOR_COREI7:
bf649e72
L
1491 if (fragP->tc_frag_data.cpunop)
1492 {
1493 if (fragP->tc_frag_data.code == CODE_64BIT)
1494 patt = alt64_patt;
1495 else
1496 patt = alt_patt;
1497 }
1498 break;
1499
1500 case PROCESSOR_PENTIUMPRO:
1501 case PROCESSOR_PENTIUM4:
1502 case PROCESSOR_NOCONA:
76bc74dc 1503 case PROCESSOR_GENERIC64:
ccc9c027
L
1504 case PROCESSOR_K6:
1505 case PROCESSOR_ATHLON:
1506 case PROCESSOR_K8:
4eed87de 1507 case PROCESSOR_AMDFAM10:
8aedb9fe 1508 case PROCESSOR_BD:
029f3522 1509 case PROCESSOR_ZNVER:
7b458c12 1510 case PROCESSOR_BT:
cd75cd85
JB
1511 if (fragP->tc_frag_data.cpunop)
1512 patt = alt_patt;
ccc9c027 1513 break;
cd75cd85 1514
76bc74dc 1515 case PROCESSOR_I386:
ccc9c027
L
1516 case PROCESSOR_I486:
1517 case PROCESSOR_PENTIUM:
c8be4b6f 1518 case PROCESSOR_I686:
81486035 1519 case PROCESSOR_IAMCU:
ccc9c027 1520 case PROCESSOR_GENERIC32:
ccc9c027 1521 break;
c368d2a8
JB
1522 case PROCESSOR_NONE:
1523 abort ();
4eed87de 1524 }
ccc9c027
L
1525 }
1526 else
1527 {
fbf3f584 1528 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1529 {
1530 case PROCESSOR_UNKNOWN:
e6a14101 1531 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1532 PROCESSOR_UNKNOWN. */
1533 abort ();
1534 break;
1535
cd75cd85 1536 default:
ccc9c027 1537 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423 1538 with nops. */
9f314ead 1539 if (fragP->tc_frag_data.isanop)
80b8656c 1540 patt = alt_patt;
ccc9c027 1541 break;
cd75cd85 1542
c368d2a8
JB
1543 case PROCESSOR_NONE:
1544 abort ();
4eed87de 1545 }
ccc9c027
L
1546 }
1547
bf649e72 1548 if (patt != alt_patt && patt != alt64_patt)
76bc74dc 1549 {
d164359d
JB
1550 max_single_nop_size = patt == f32_patt ? ARRAY_SIZE (f32_patt)
1551 : ARRAY_SIZE (f64_patt);
3ae729d5
L
1552 /* Limit number of NOPs to 2 for older processors. */
1553 max_number_of_nops = 2;
76bc74dc
L
1554 }
1555 else
1556 {
bf649e72
L
1557 max_single_nop_size = patt == alt_patt
1558 ? ARRAY_SIZE (alt_patt)
1559 : ARRAY_SIZE (alt64_patt);
3ae729d5
L
1560 /* Limit number of NOPs to 7 for newer processors. */
1561 max_number_of_nops = 7;
1562 }
1563 }
1564
1565 if (limit == 0)
1566 limit = max_single_nop_size;
1567
1568 if (fragP->fr_type == rs_fill_nop)
1569 {
1570 /* Output NOPs for .nop directive. */
1571 if (limit > max_single_nop_size)
1572 {
1573 as_bad_where (fragP->fr_file, fragP->fr_line,
1574 _("invalid single nop size: %d "
1575 "(expect within [0, %d])"),
1576 limit, max_single_nop_size);
1577 return;
1578 }
1579 }
e379e5f3 1580 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1581 fragP->fr_var = count;
1582
0aa5d0c9
JB
1583 /* Emit a plain NOP first when the last thing we saw may not have been
1584 a proper instruction (e.g. a stand-alone prefix or .byte). */
1585 if (!fragP->tc_frag_data.last_insn_normal)
1586 {
1587 *where++ = 0x90;
1588 --count;
1589 }
1590
3ae729d5
L
1591 if ((count / max_single_nop_size) > max_number_of_nops)
1592 {
1593 /* Generate jump over NOPs. */
1594 offsetT disp = count - 2;
1595 if (fits_in_imm7 (disp))
1596 {
1597 /* Use "jmp disp8" if possible. */
1598 count = disp;
1599 where[0] = jump_disp8[0];
1600 where[1] = count;
1601 where += 2;
1602 }
1603 else
1604 {
1605 unsigned int size_of_jump;
1606
1607 if (flag_code == CODE_16BIT)
1608 {
1609 where[0] = jump16_disp32[0];
1610 where[1] = jump16_disp32[1];
1611 size_of_jump = 2;
1612 }
1613 else
1614 {
1615 where[0] = jump32_disp32[0];
1616 size_of_jump = 1;
1617 }
1618
1619 count -= size_of_jump + 4;
1620 if (!fits_in_imm31 (count))
1621 {
1622 as_bad_where (fragP->fr_file, fragP->fr_line,
1623 _("jump over nop padding out of range"));
1624 return;
1625 }
1626
1627 md_number_to_chars (where + size_of_jump, count, 4);
1628 where += size_of_jump + 4;
76bc74dc 1629 }
ccc9c027 1630 }
3ae729d5
L
1631
1632 /* Generate multiple NOPs. */
1633 i386_output_nops (where, patt, count, limit);
252b5132
RH
1634}
1635
c6fb90c8 1636static INLINE int
0dfbf9d7 1637operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1638{
0dfbf9d7 1639 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1640 {
1641 case 3:
0dfbf9d7 1642 if (x->array[2])
c6fb90c8 1643 return 0;
1a0670f3 1644 /* Fall through. */
c6fb90c8 1645 case 2:
0dfbf9d7 1646 if (x->array[1])
c6fb90c8 1647 return 0;
1a0670f3 1648 /* Fall through. */
c6fb90c8 1649 case 1:
0dfbf9d7 1650 return !x->array[0];
c6fb90c8
L
1651 default:
1652 abort ();
1653 }
40fb9820
L
1654}
1655
c6fb90c8 1656static INLINE void
0dfbf9d7 1657operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1658{
0dfbf9d7 1659 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1660 {
1661 case 3:
0dfbf9d7 1662 x->array[2] = v;
1a0670f3 1663 /* Fall through. */
c6fb90c8 1664 case 2:
0dfbf9d7 1665 x->array[1] = v;
1a0670f3 1666 /* Fall through. */
c6fb90c8 1667 case 1:
0dfbf9d7 1668 x->array[0] = v;
1a0670f3 1669 /* Fall through. */
c6fb90c8
L
1670 break;
1671 default:
1672 abort ();
1673 }
bab6aec1
JB
1674
1675 x->bitfield.class = ClassNone;
75e5731b 1676 x->bitfield.instance = InstanceNone;
c6fb90c8 1677}
40fb9820 1678
c6fb90c8 1679static INLINE int
0dfbf9d7
L
1680operand_type_equal (const union i386_operand_type *x,
1681 const union i386_operand_type *y)
c6fb90c8 1682{
0dfbf9d7 1683 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1684 {
1685 case 3:
0dfbf9d7 1686 if (x->array[2] != y->array[2])
c6fb90c8 1687 return 0;
1a0670f3 1688 /* Fall through. */
c6fb90c8 1689 case 2:
0dfbf9d7 1690 if (x->array[1] != y->array[1])
c6fb90c8 1691 return 0;
1a0670f3 1692 /* Fall through. */
c6fb90c8 1693 case 1:
0dfbf9d7 1694 return x->array[0] == y->array[0];
c6fb90c8
L
1695 break;
1696 default:
1697 abort ();
1698 }
1699}
40fb9820 1700
734dfd1c 1701static INLINE bool
a5e91879 1702_is_cpu (const i386_cpu_attr *a, enum i386_cpu cpu)
734dfd1c
JB
1703{
1704 switch (cpu)
1705 {
a5e91879
JB
1706 case Cpu287: return a->bitfield.cpu287;
1707 case Cpu387: return a->bitfield.cpu387;
1708 case Cpu3dnow: return a->bitfield.cpu3dnow;
1709 case Cpu3dnowA: return a->bitfield.cpu3dnowa;
1710 case CpuAVX: return a->bitfield.cpuavx;
1711 case CpuHLE: return a->bitfield.cpuhle;
1712 case CpuAVX512F: return a->bitfield.cpuavx512f;
1713 case CpuAVX512VL: return a->bitfield.cpuavx512vl;
80d61d8d 1714 case CpuAPX_F: return a->bitfield.cpuapx_f;
a5e91879
JB
1715 case Cpu64: return a->bitfield.cpu64;
1716 case CpuNo64: return a->bitfield.cpuno64;
734dfd1c
JB
1717 default:
1718 gas_assert (cpu < CpuAttrEnums);
1719 }
a5e91879
JB
1720 return a->bitfield.isa == cpu + 1u;
1721}
1722
1723static INLINE bool
1724is_cpu (const insn_template *t, enum i386_cpu cpu)
1725{
1726 return _is_cpu(&t->cpu, cpu);
1727}
1728
1729static INLINE bool
1730maybe_cpu (const insn_template *t, enum i386_cpu cpu)
1731{
1732 return _is_cpu(&t->cpu_any, cpu);
734dfd1c
JB
1733}
1734
1735static i386_cpu_flags cpu_flags_from_attr (i386_cpu_attr a)
1736{
1737 const unsigned int bps = sizeof (a.array[0]) * CHAR_BIT;
1738 i386_cpu_flags f = { .array[0] = 0 };
1739
a12915cc 1740 switch (ARRAY_SIZE (a.array))
734dfd1c
JB
1741 {
1742 case 1:
1743 f.array[CpuAttrEnums / bps]
a12915cc
JB
1744#ifndef WORDS_BIGENDIAN
1745 |= (a.array[0] >> CpuIsaBits) << (CpuAttrEnums % bps);
1746#else
1747 |= (a.array[0] << CpuIsaBits) >> (CpuAttrEnums % bps);
1748#endif
1749 if (CpuMax / bps > CpuAttrEnums / bps)
734dfd1c 1750 f.array[CpuAttrEnums / bps + 1]
a12915cc 1751#ifndef WORDS_BIGENDIAN
734dfd1c 1752 = (a.array[0] >> CpuIsaBits) >> (bps - CpuAttrEnums % bps);
a12915cc
JB
1753#else
1754 = (a.array[0] << CpuIsaBits) << (bps - CpuAttrEnums % bps);
1755#endif
734dfd1c 1756 break;
a12915cc 1757
734dfd1c
JB
1758 default:
1759 abort ();
1760 }
1761
1762 if (a.bitfield.isa)
a12915cc 1763#ifndef WORDS_BIGENDIAN
734dfd1c 1764 f.array[(a.bitfield.isa - 1) / bps] |= 1u << ((a.bitfield.isa - 1) % bps);
a12915cc
JB
1765#else
1766 f.array[(a.bitfield.isa - 1) / bps] |= 1u << (~(a.bitfield.isa - 1) % bps);
1767#endif
734dfd1c
JB
1768
1769 return f;
1770}
1771
0dfbf9d7
L
1772static INLINE int
1773cpu_flags_all_zero (const union i386_cpu_flags *x)
1774{
1775 switch (ARRAY_SIZE(x->array))
1776 {
75f8266a
KL
1777 case 5:
1778 if (x->array[4])
1779 return 0;
1780 /* Fall through. */
53467f57
IT
1781 case 4:
1782 if (x->array[3])
1783 return 0;
1784 /* Fall through. */
0dfbf9d7
L
1785 case 3:
1786 if (x->array[2])
1787 return 0;
1a0670f3 1788 /* Fall through. */
0dfbf9d7
L
1789 case 2:
1790 if (x->array[1])
1791 return 0;
1a0670f3 1792 /* Fall through. */
0dfbf9d7
L
1793 case 1:
1794 return !x->array[0];
1795 default:
1796 abort ();
1797 }
1798}
1799
0dfbf9d7
L
1800static INLINE int
1801cpu_flags_equal (const union i386_cpu_flags *x,
1802 const union i386_cpu_flags *y)
1803{
1804 switch (ARRAY_SIZE(x->array))
1805 {
75f8266a
KL
1806 case 5:
1807 if (x->array[4] != y->array[4])
1808 return 0;
1809 /* Fall through. */
53467f57
IT
1810 case 4:
1811 if (x->array[3] != y->array[3])
1812 return 0;
1813 /* Fall through. */
0dfbf9d7
L
1814 case 3:
1815 if (x->array[2] != y->array[2])
1816 return 0;
1a0670f3 1817 /* Fall through. */
0dfbf9d7
L
1818 case 2:
1819 if (x->array[1] != y->array[1])
1820 return 0;
1a0670f3 1821 /* Fall through. */
0dfbf9d7
L
1822 case 1:
1823 return x->array[0] == y->array[0];
1824 break;
1825 default:
1826 abort ();
1827 }
1828}
c6fb90c8
L
1829
1830static INLINE int
c0260ac6 1831cpu_flags_check_cpu64 (const insn_template *t)
c6fb90c8 1832{
c0260ac6
JB
1833 return flag_code == CODE_64BIT
1834 ? !t->cpu.bitfield.cpuno64
1835 : !t->cpu.bitfield.cpu64;
40fb9820
L
1836}
1837
c6fb90c8
L
1838static INLINE i386_cpu_flags
1839cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1840{
c6fb90c8
L
1841 switch (ARRAY_SIZE (x.array))
1842 {
75f8266a
KL
1843 case 5:
1844 x.array [4] &= y.array [4];
1845 /* Fall through. */
53467f57
IT
1846 case 4:
1847 x.array [3] &= y.array [3];
1848 /* Fall through. */
c6fb90c8
L
1849 case 3:
1850 x.array [2] &= y.array [2];
1a0670f3 1851 /* Fall through. */
c6fb90c8
L
1852 case 2:
1853 x.array [1] &= y.array [1];
1a0670f3 1854 /* Fall through. */
c6fb90c8
L
1855 case 1:
1856 x.array [0] &= y.array [0];
1857 break;
1858 default:
1859 abort ();
1860 }
1861 return x;
1862}
40fb9820 1863
c6fb90c8
L
1864static INLINE i386_cpu_flags
1865cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1866{
c6fb90c8 1867 switch (ARRAY_SIZE (x.array))
40fb9820 1868 {
75f8266a
KL
1869 case 5:
1870 x.array [4] |= y.array [4];
1871 /* Fall through. */
53467f57
IT
1872 case 4:
1873 x.array [3] |= y.array [3];
1874 /* Fall through. */
c6fb90c8
L
1875 case 3:
1876 x.array [2] |= y.array [2];
1a0670f3 1877 /* Fall through. */
c6fb90c8
L
1878 case 2:
1879 x.array [1] |= y.array [1];
1a0670f3 1880 /* Fall through. */
c6fb90c8
L
1881 case 1:
1882 x.array [0] |= y.array [0];
40fb9820
L
1883 break;
1884 default:
1885 abort ();
1886 }
40fb9820
L
1887 return x;
1888}
1889
309d3373
JB
1890static INLINE i386_cpu_flags
1891cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1892{
1893 switch (ARRAY_SIZE (x.array))
1894 {
75f8266a
KL
1895 case 5:
1896 x.array [4] &= ~y.array [4];
1897 /* Fall through. */
53467f57
IT
1898 case 4:
1899 x.array [3] &= ~y.array [3];
1900 /* Fall through. */
309d3373
JB
1901 case 3:
1902 x.array [2] &= ~y.array [2];
1a0670f3 1903 /* Fall through. */
309d3373
JB
1904 case 2:
1905 x.array [1] &= ~y.array [1];
1a0670f3 1906 /* Fall through. */
309d3373
JB
1907 case 1:
1908 x.array [0] &= ~y.array [0];
1909 break;
1910 default:
1911 abort ();
1912 }
1913 return x;
1914}
1915
6c0946d0
JB
1916static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1917
6177c84d 1918static INLINE bool need_evex_encoding (const insn_template *t)
a6f3add0 1919{
e346d50a
JB
1920 return i.encoding == encoding_evex
1921 || i.encoding == encoding_evex512
eb3f3841 1922 || (t->opcode_modifier.vex && i.encoding == encoding_egpr)
a6f3add0
JB
1923 || i.mask.reg;
1924}
1925
c0f3af97
L
1926#define CPU_FLAGS_ARCH_MATCH 0x1
1927#define CPU_FLAGS_64BIT_MATCH 0x2
1928
c0f3af97 1929#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1930 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1931
1932/* Return CPU flags match bits. */
3629bb00 1933
40fb9820 1934static int
d3ce72d0 1935cpu_flags_match (const insn_template *t)
40fb9820 1936{
a5e91879
JB
1937 i386_cpu_flags cpu, active, all = cpu_flags_from_attr (t->cpu);
1938 i386_cpu_flags any = cpu_flags_from_attr (t->cpu_any);
c0260ac6 1939 int match = cpu_flags_check_cpu64 (t) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820 1940
a5e91879
JB
1941 all.bitfield.cpu64 = 0;
1942 all.bitfield.cpuno64 = 0;
1943 gas_assert (!any.bitfield.cpu64);
1944 gas_assert (!any.bitfield.cpuno64);
40fb9820 1945
a5e91879 1946 if (cpu_flags_all_zero (&all) && cpu_flags_all_zero (&any))
c0f3af97
L
1947 {
1948 /* This instruction is available on all archs. */
a5e91879 1949 return match | CPU_FLAGS_ARCH_MATCH;
c0f3af97 1950 }
3e624fa4 1951
a5e91879 1952 /* This instruction is available only on some archs. */
3629bb00 1953
a5e91879
JB
1954 /* Dual VEX/EVEX templates may need stripping of one of the flags. */
1955 if (t->opcode_modifier.vex && t->opcode_modifier.evex)
1956 {
1957 /* Dual AVX/AVX512 templates need to retain AVX512* only if we already
1958 know that EVEX encoding will be needed. */
1959 if ((any.bitfield.cpuavx || any.bitfield.cpuavx2 || any.bitfield.cpufma)
1960 && (any.bitfield.cpuavx512f || any.bitfield.cpuavx512vl))
a6f3add0 1961 {
6177c84d 1962 if (need_evex_encoding (t))
a6f3add0 1963 {
a5e91879
JB
1964 any.bitfield.cpuavx = 0;
1965 any.bitfield.cpuavx2 = 0;
1966 any.bitfield.cpufma = 0;
1967 }
6177c84d 1968 /* need_evex_encoding(t) isn't reliable before operands were
a5e91879
JB
1969 parsed. */
1970 else if (i.operands)
1971 {
1972 any.bitfield.cpuavx512f = 0;
1973 any.bitfield.cpuavx512vl = 0;
a6f3add0
JB
1974 }
1975 }
7c3df3c6
JB
1976
1977 /* Dual non-APX/APX templates need massaging from what APX_F() in the
1978 opcode table has produced. While the direct transformation of the
1979 incoming cpuid&(cpuid|APX_F) would be to cpuid&(cpuid) / cpuid&(APX_F)
1980 respectively, it's cheaper to move to just cpuid / cpuid&APX_F
1981 instead. */
1982 if (any.bitfield.cpuapx_f
1983 && (any.bitfield.cpubmi || any.bitfield.cpubmi2
1984 || any.bitfield.cpuavx512f || any.bitfield.cpuavx512bw
1985 || any.bitfield.cpuavx512dq || any.bitfield.cpuamx_tile
5190fa38 1986 || any.bitfield.cpucmpccxadd || any.bitfield.cpuuser_msr))
7c3df3c6
JB
1987 {
1988 /* These checks (verifying that APX_F() was properly used in the
1989 opcode table entry) make sure there's no need for an "else" to
1990 the "if()" below. */
1991 gas_assert (!cpu_flags_all_zero (&all));
1992 cpu = cpu_flags_and (all, any);
1993 gas_assert (cpu_flags_equal (&cpu, &all));
1994
1995 if (need_evex_encoding (t))
1996 all = any;
1997
1998 memset (&any, 0, sizeof (any));
1999 }
a5e91879 2000 }
a6f3add0 2001
a5e91879
JB
2002 if (flag_code != CODE_64BIT)
2003 active = cpu_flags_and_not (cpu_arch_flags, cpu_64_flags);
2004 else
2005 active = cpu_arch_flags;
2006 cpu = cpu_flags_and (all, active);
2007 if (cpu_flags_equal (&cpu, &all))
2008 {
22c36940
JB
2009 /* AVX and AVX2 present at the same time express an operand size
2010 dependency - strip AVX2 for the purposes here. The operand size
2011 dependent check occurs in check_vecOperands(). */
a5e91879
JB
2012 if (any.bitfield.cpuavx && any.bitfield.cpuavx2)
2013 any.bitfield.cpuavx2 = 0;
22c36940 2014
a5e91879
JB
2015 cpu = cpu_flags_and (any, active);
2016 if (cpu_flags_all_zero (&any) || !cpu_flags_all_zero (&cpu))
b58829cd 2017 match |= CPU_FLAGS_ARCH_MATCH;
3629bb00 2018 }
c0f3af97 2019 return match;
40fb9820
L
2020}
2021
c6fb90c8
L
2022static INLINE i386_operand_type
2023operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 2024{
bab6aec1
JB
2025 if (x.bitfield.class != y.bitfield.class)
2026 x.bitfield.class = ClassNone;
75e5731b
JB
2027 if (x.bitfield.instance != y.bitfield.instance)
2028 x.bitfield.instance = InstanceNone;
bab6aec1 2029
c6fb90c8
L
2030 switch (ARRAY_SIZE (x.array))
2031 {
2032 case 3:
2033 x.array [2] &= y.array [2];
1a0670f3 2034 /* Fall through. */
c6fb90c8
L
2035 case 2:
2036 x.array [1] &= y.array [1];
1a0670f3 2037 /* Fall through. */
c6fb90c8
L
2038 case 1:
2039 x.array [0] &= y.array [0];
2040 break;
2041 default:
2042 abort ();
2043 }
2044 return x;
40fb9820
L
2045}
2046
73053c1f
JB
2047static INLINE i386_operand_type
2048operand_type_and_not (i386_operand_type x, i386_operand_type y)
2049{
bab6aec1 2050 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2051 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2052
73053c1f
JB
2053 switch (ARRAY_SIZE (x.array))
2054 {
2055 case 3:
2056 x.array [2] &= ~y.array [2];
2057 /* Fall through. */
2058 case 2:
2059 x.array [1] &= ~y.array [1];
2060 /* Fall through. */
2061 case 1:
2062 x.array [0] &= ~y.array [0];
2063 break;
2064 default:
2065 abort ();
2066 }
2067 return x;
2068}
2069
c6fb90c8
L
2070static INLINE i386_operand_type
2071operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2072{
bab6aec1
JB
2073 gas_assert (x.bitfield.class == ClassNone ||
2074 y.bitfield.class == ClassNone ||
2075 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2076 gas_assert (x.bitfield.instance == InstanceNone ||
2077 y.bitfield.instance == InstanceNone ||
2078 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2079
c6fb90c8 2080 switch (ARRAY_SIZE (x.array))
40fb9820 2081 {
c6fb90c8
L
2082 case 3:
2083 x.array [2] |= y.array [2];
1a0670f3 2084 /* Fall through. */
c6fb90c8
L
2085 case 2:
2086 x.array [1] |= y.array [1];
1a0670f3 2087 /* Fall through. */
c6fb90c8
L
2088 case 1:
2089 x.array [0] |= y.array [0];
40fb9820
L
2090 break;
2091 default:
2092 abort ();
2093 }
c6fb90c8
L
2094 return x;
2095}
40fb9820 2096
c6fb90c8
L
2097static INLINE i386_operand_type
2098operand_type_xor (i386_operand_type x, i386_operand_type y)
2099{
bab6aec1 2100 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2101 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2102
c6fb90c8
L
2103 switch (ARRAY_SIZE (x.array))
2104 {
2105 case 3:
2106 x.array [2] ^= y.array [2];
1a0670f3 2107 /* Fall through. */
c6fb90c8
L
2108 case 2:
2109 x.array [1] ^= y.array [1];
1a0670f3 2110 /* Fall through. */
c6fb90c8
L
2111 case 1:
2112 x.array [0] ^= y.array [0];
2113 break;
2114 default:
2115 abort ();
2116 }
40fb9820
L
2117 return x;
2118}
2119
05909f23
JB
2120static const i386_operand_type anydisp = {
2121 .bitfield = { .disp8 = 1, .disp16 = 1, .disp32 = 1, .disp64 = 1 }
2122};
40fb9820
L
2123
2124enum operand_type
2125{
2126 reg,
40fb9820
L
2127 imm,
2128 disp,
2129 anymem
2130};
2131
c6fb90c8 2132static INLINE int
40fb9820
L
2133operand_type_check (i386_operand_type t, enum operand_type c)
2134{
2135 switch (c)
2136 {
2137 case reg:
bab6aec1 2138 return t.bitfield.class == Reg;
40fb9820 2139
40fb9820
L
2140 case imm:
2141 return (t.bitfield.imm8
2142 || t.bitfield.imm8s
2143 || t.bitfield.imm16
2144 || t.bitfield.imm32
2145 || t.bitfield.imm32s
2146 || t.bitfield.imm64);
2147
2148 case disp:
2149 return (t.bitfield.disp8
2150 || t.bitfield.disp16
2151 || t.bitfield.disp32
40fb9820
L
2152 || t.bitfield.disp64);
2153
2154 case anymem:
2155 return (t.bitfield.disp8
2156 || t.bitfield.disp16
2157 || t.bitfield.disp32
40fb9820
L
2158 || t.bitfield.disp64
2159 || t.bitfield.baseindex);
2160
2161 default:
2162 abort ();
2163 }
2cfe26b6
AM
2164
2165 return 0;
40fb9820
L
2166}
2167
7a54636a
L
2168/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2169 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2170
2171static INLINE int
7a54636a
L
2172match_operand_size (const insn_template *t, unsigned int wanted,
2173 unsigned int given)
5c07affc 2174{
3ac21baa
JB
2175 return !((i.types[given].bitfield.byte
2176 && !t->operand_types[wanted].bitfield.byte)
2177 || (i.types[given].bitfield.word
2178 && !t->operand_types[wanted].bitfield.word)
2179 || (i.types[given].bitfield.dword
2180 && !t->operand_types[wanted].bitfield.dword)
2181 || (i.types[given].bitfield.qword
9db83a32
JB
2182 && (!t->operand_types[wanted].bitfield.qword
2183 /* Don't allow 64-bit (memory) operands outside of 64-bit
2184 mode, when they're used where a 64-bit GPR could also
2185 be used. Checking is needed for Intel Syntax only. */
2186 || (intel_syntax
2187 && flag_code != CODE_64BIT
2188 && (t->operand_types[wanted].bitfield.class == Reg
2189 || t->operand_types[wanted].bitfield.class == Accum
2190 || t->opcode_modifier.isstring))))
3ac21baa
JB
2191 || (i.types[given].bitfield.tbyte
2192 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2193}
2194
dd40ce22
L
2195/* Return 1 if there is no conflict in SIMD register between operand
2196 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2197
2198static INLINE int
dd40ce22
L
2199match_simd_size (const insn_template *t, unsigned int wanted,
2200 unsigned int given)
1b54b8d7 2201{
3ac21baa
JB
2202 return !((i.types[given].bitfield.xmmword
2203 && !t->operand_types[wanted].bitfield.xmmword)
2204 || (i.types[given].bitfield.ymmword
2205 && !t->operand_types[wanted].bitfield.ymmword)
2206 || (i.types[given].bitfield.zmmword
260cd341
LC
2207 && !t->operand_types[wanted].bitfield.zmmword)
2208 || (i.types[given].bitfield.tmmword
2209 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2210}
2211
7a54636a
L
2212/* Return 1 if there is no conflict in any size between operand GIVEN
2213 and opeand WANTED for instruction template T. */
5c07affc
L
2214
2215static INLINE int
dd40ce22
L
2216match_mem_size (const insn_template *t, unsigned int wanted,
2217 unsigned int given)
5c07affc 2218{
7a54636a 2219 return (match_operand_size (t, wanted, given)
3ac21baa 2220 && !((i.types[given].bitfield.unspecified
5273a3cd 2221 && !i.broadcast.type
a5748e0d 2222 && !i.broadcast.bytes
3ac21baa
JB
2223 && !t->operand_types[wanted].bitfield.unspecified)
2224 || (i.types[given].bitfield.fword
2225 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2226 /* For scalar opcode templates to allow register and memory
2227 operands at the same time, some special casing is needed
d6793fa1
JB
2228 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2229 down-conversion vpmov*. */
3528c362 2230 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2231 && t->operand_types[wanted].bitfield.byte
2232 + t->operand_types[wanted].bitfield.word
2233 + t->operand_types[wanted].bitfield.dword
2234 + t->operand_types[wanted].bitfield.qword
2235 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2236 ? (i.types[given].bitfield.xmmword
2237 || i.types[given].bitfield.ymmword
2238 || i.types[given].bitfield.zmmword)
2239 : !match_simd_size(t, wanted, given))));
5c07affc
L
2240}
2241
3ac21baa
JB
2242/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2243 operands for instruction template T, and it has MATCH_REVERSE set if there
2244 is no size conflict on any operands for the template with operands reversed
2245 (and the template allows for reversing in the first place). */
5c07affc 2246
3ac21baa
JB
2247#define MATCH_STRAIGHT 1
2248#define MATCH_REVERSE 2
2249
2250static INLINE unsigned int
d3ce72d0 2251operand_size_match (const insn_template *t)
5c07affc 2252{
3ac21baa 2253 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2254
0cfa3eb3 2255 /* Don't check non-absolute jump instructions. */
5c07affc 2256 if (t->opcode_modifier.jump
0cfa3eb3 2257 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2258 return match;
2259
2260 /* Check memory and accumulator operand size. */
2261 for (j = 0; j < i.operands; j++)
2262 {
3528c362
JB
2263 if (i.types[j].bitfield.class != Reg
2264 && i.types[j].bitfield.class != RegSIMD
255571cd 2265 && t->opcode_modifier.operandconstraint == ANY_SIZE)
5c07affc
L
2266 continue;
2267
bab6aec1 2268 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2269 && !match_operand_size (t, j, j))
5c07affc
L
2270 {
2271 match = 0;
2272 break;
2273 }
2274
3528c362 2275 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2276 && !match_simd_size (t, j, j))
1b54b8d7
JB
2277 {
2278 match = 0;
2279 break;
2280 }
2281
75e5731b 2282 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2283 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2284 {
2285 match = 0;
2286 break;
2287 }
2288
c48dadc9 2289 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2290 {
2291 match = 0;
2292 break;
2293 }
2294 }
2295
3ac21baa 2296 if (!t->opcode_modifier.d)
7b94647a 2297 return match;
5c07affc
L
2298
2299 /* Check reverse. */
aa180741 2300 gas_assert (i.operands >= 2);
5c07affc 2301
f5eb1d70 2302 for (j = 0; j < i.operands; j++)
5c07affc 2303 {
f5eb1d70
JB
2304 unsigned int given = i.operands - j - 1;
2305
aa180741 2306 /* For FMA4 and XOP insns VEX.W controls just the first two
3083f376 2307 register operands. And APX_F insns just swap the two source operands,
2308 with the 3rd one being the destination. */
2309 if (is_cpu (t, CpuFMA4) || is_cpu (t, CpuXOP)
2310 || is_cpu (t, CpuAPX_F))
8bd915b7
JB
2311 given = j < 2 ? 1 - j : j;
2312
bab6aec1 2313 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2314 && !match_operand_size (t, j, given))
7b94647a 2315 return match;
5c07affc 2316
3528c362 2317 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2318 && !match_simd_size (t, j, given))
7b94647a 2319 return match;
dbbc8b7e 2320
75e5731b 2321 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2322 && (!match_operand_size (t, j, given)
2323 || !match_simd_size (t, j, given)))
7b94647a 2324 return match;
dbbc8b7e 2325
f5eb1d70 2326 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
7b94647a 2327 return match;
5c07affc
L
2328 }
2329
3ac21baa 2330 return match | MATCH_REVERSE;
5c07affc
L
2331}
2332
c6fb90c8 2333static INLINE int
40fb9820
L
2334operand_type_match (i386_operand_type overlap,
2335 i386_operand_type given)
2336{
2337 i386_operand_type temp = overlap;
2338
7d5e4556 2339 temp.bitfield.unspecified = 0;
5c07affc
L
2340 temp.bitfield.byte = 0;
2341 temp.bitfield.word = 0;
2342 temp.bitfield.dword = 0;
2343 temp.bitfield.fword = 0;
2344 temp.bitfield.qword = 0;
2345 temp.bitfield.tbyte = 0;
2346 temp.bitfield.xmmword = 0;
c0f3af97 2347 temp.bitfield.ymmword = 0;
43234a1e 2348 temp.bitfield.zmmword = 0;
260cd341 2349 temp.bitfield.tmmword = 0;
0dfbf9d7 2350 if (operand_type_all_zero (&temp))
891edac4 2351 goto mismatch;
40fb9820 2352
6f2f06be 2353 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2354 return 1;
2355
dc1e8a47 2356 mismatch:
a65babc9 2357 i.error = operand_type_mismatch;
891edac4 2358 return 0;
40fb9820
L
2359}
2360
7d5e4556 2361/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2362 unless the expected operand type register overlap is null.
8ee52bcf 2363 Intel syntax sized memory operands are also checked here. */
40fb9820 2364
c6fb90c8 2365static INLINE int
dc821c5f 2366operand_type_register_match (i386_operand_type g0,
40fb9820 2367 i386_operand_type t0,
40fb9820
L
2368 i386_operand_type g1,
2369 i386_operand_type t1)
2370{
bab6aec1 2371 if (g0.bitfield.class != Reg
3528c362 2372 && g0.bitfield.class != RegSIMD
8ee52bcf
JB
2373 && (g0.bitfield.unspecified
2374 || !operand_type_check (g0, anymem)))
40fb9820
L
2375 return 1;
2376
bab6aec1 2377 if (g1.bitfield.class != Reg
3528c362 2378 && g1.bitfield.class != RegSIMD
8ee52bcf
JB
2379 && (g1.bitfield.unspecified
2380 || !operand_type_check (g1, anymem)))
40fb9820
L
2381 return 1;
2382
dc821c5f
JB
2383 if (g0.bitfield.byte == g1.bitfield.byte
2384 && g0.bitfield.word == g1.bitfield.word
2385 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2386 && g0.bitfield.qword == g1.bitfield.qword
2387 && g0.bitfield.xmmword == g1.bitfield.xmmword
2388 && g0.bitfield.ymmword == g1.bitfield.ymmword
2389 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2390 return 1;
2391
c4d09633
JB
2392 /* If expectations overlap in no more than a single size, all is fine. */
2393 g0 = operand_type_and (t0, t1);
2394 if (g0.bitfield.byte
2395 + g0.bitfield.word
2396 + g0.bitfield.dword
2397 + g0.bitfield.qword
2398 + g0.bitfield.xmmword
2399 + g0.bitfield.ymmword
2400 + g0.bitfield.zmmword <= 1)
891edac4
L
2401 return 1;
2402
a65babc9 2403 i.error = register_type_mismatch;
891edac4
L
2404
2405 return 0;
40fb9820
L
2406}
2407
4c692bc7
JB
2408static INLINE unsigned int
2409register_number (const reg_entry *r)
2410{
2411 unsigned int nr = r->reg_num;
2412
2413 if (r->reg_flags & RegRex)
2414 nr += 8;
2415
80d61d8d 2416 if (r->reg_flags & (RegVRex | RegRex2))
200cbe0f
L
2417 nr += 16;
2418
4c692bc7
JB
2419 return nr;
2420}
2421
252b5132 2422static INLINE unsigned int
40fb9820 2423mode_from_disp_size (i386_operand_type t)
252b5132 2424{
b5014f7a 2425 if (t.bitfield.disp8)
40fb9820
L
2426 return 1;
2427 else if (t.bitfield.disp16
a775efc8 2428 || t.bitfield.disp32)
40fb9820
L
2429 return 2;
2430 else
2431 return 0;
252b5132
RH
2432}
2433
2434static INLINE int
65879393 2435fits_in_signed_byte (addressT num)
252b5132 2436{
65879393 2437 return num + 0x80 <= 0xff;
47926f60 2438}
252b5132
RH
2439
2440static INLINE int
65879393 2441fits_in_unsigned_byte (addressT num)
252b5132 2442{
65879393 2443 return num <= 0xff;
47926f60 2444}
252b5132
RH
2445
2446static INLINE int
65879393 2447fits_in_unsigned_word (addressT num)
252b5132 2448{
65879393 2449 return num <= 0xffff;
47926f60 2450}
252b5132
RH
2451
2452static INLINE int
65879393 2453fits_in_signed_word (addressT num)
252b5132 2454{
65879393 2455 return num + 0x8000 <= 0xffff;
47926f60 2456}
2a962e6d 2457
3e73aa7c 2458static INLINE int
65879393 2459fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2460{
2461#ifndef BFD64
2462 return 1;
2463#else
65879393 2464 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2465#endif
2466} /* fits_in_signed_long() */
2a962e6d 2467
3e73aa7c 2468static INLINE int
65879393 2469fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2470{
2471#ifndef BFD64
2472 return 1;
2473#else
65879393 2474 return num <= 0xffffffff;
3e73aa7c
JH
2475#endif
2476} /* fits_in_unsigned_long() */
252b5132 2477
a442cac5
JB
2478static INLINE valueT extend_to_32bit_address (addressT num)
2479{
2480#ifdef BFD64
2481 if (fits_in_unsigned_long(num))
2482 return (num ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
2483
2484 if (!fits_in_signed_long (num))
2485 return num & 0xffffffff;
2486#endif
2487
2488 return num;
2489}
2490
43234a1e 2491static INLINE int
b5014f7a 2492fits_in_disp8 (offsetT num)
43234a1e
L
2493{
2494 int shift = i.memshift;
2495 unsigned int mask;
2496
2497 if (shift == -1)
2498 abort ();
2499
2500 mask = (1 << shift) - 1;
2501
2502 /* Return 0 if NUM isn't properly aligned. */
2503 if ((num & mask))
2504 return 0;
2505
2506 /* Check if NUM will fit in 8bit after shift. */
2507 return fits_in_signed_byte (num >> shift);
2508}
2509
a683cc34
SP
2510static INLINE int
2511fits_in_imm4 (offsetT num)
2512{
0ff3b7d0 2513 /* Despite the name, check for imm3 if we're dealing with EVEX. */
eb3f3841
JB
2514 return (num & (i.encoding != encoding_evex
2515 && i.encoding != encoding_egpr ? 0xf : 7)) == num;
a683cc34
SP
2516}
2517
40fb9820 2518static i386_operand_type
e3bb37b5 2519smallest_imm_type (offsetT num)
252b5132 2520{
40fb9820 2521 i386_operand_type t;
7ab9ffdd 2522
0dfbf9d7 2523 operand_type_set (&t, 0);
40fb9820
L
2524 t.bitfield.imm64 = 1;
2525
2526 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2527 {
2528 /* This code is disabled on the 486 because all the Imm1 forms
2529 in the opcode table are slower on the i486. They're the
2530 versions with the implicitly specified single-position
2531 displacement, which has another syntax if you really want to
2532 use that form. */
40fb9820
L
2533 t.bitfield.imm1 = 1;
2534 t.bitfield.imm8 = 1;
2535 t.bitfield.imm8s = 1;
2536 t.bitfield.imm16 = 1;
2537 t.bitfield.imm32 = 1;
2538 t.bitfield.imm32s = 1;
2539 }
2540 else if (fits_in_signed_byte (num))
2541 {
c34d1cc9
JB
2542 if (fits_in_unsigned_byte (num))
2543 t.bitfield.imm8 = 1;
40fb9820
L
2544 t.bitfield.imm8s = 1;
2545 t.bitfield.imm16 = 1;
8170af78
HL
2546 if (flag_code != CODE_64BIT || fits_in_unsigned_long (num))
2547 t.bitfield.imm32 = 1;
40fb9820
L
2548 t.bitfield.imm32s = 1;
2549 }
2550 else if (fits_in_unsigned_byte (num))
2551 {
2552 t.bitfield.imm8 = 1;
2553 t.bitfield.imm16 = 1;
2554 t.bitfield.imm32 = 1;
2555 t.bitfield.imm32s = 1;
2556 }
2557 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2558 {
2559 t.bitfield.imm16 = 1;
8170af78
HL
2560 if (flag_code != CODE_64BIT || fits_in_unsigned_long (num))
2561 t.bitfield.imm32 = 1;
40fb9820
L
2562 t.bitfield.imm32s = 1;
2563 }
2564 else if (fits_in_signed_long (num))
2565 {
8170af78
HL
2566 if (flag_code != CODE_64BIT || fits_in_unsigned_long (num))
2567 t.bitfield.imm32 = 1;
40fb9820
L
2568 t.bitfield.imm32s = 1;
2569 }
2570 else if (fits_in_unsigned_long (num))
2571 t.bitfield.imm32 = 1;
2572
2573 return t;
47926f60 2574}
252b5132 2575
847f7ad4 2576static offsetT
e3bb37b5 2577offset_in_range (offsetT val, int size)
847f7ad4 2578{
508866be 2579 addressT mask;
ba2adb93 2580
847f7ad4
AM
2581 switch (size)
2582 {
508866be
L
2583 case 1: mask = ((addressT) 1 << 8) - 1; break;
2584 case 2: mask = ((addressT) 1 << 16) - 1; break;
3e73aa7c 2585#ifdef BFD64
64965897 2586 case 4: mask = ((addressT) 1 << 32) - 1; break;
3e73aa7c 2587#endif
64965897 2588 case sizeof (val): return val;
47926f60 2589 default: abort ();
847f7ad4
AM
2590 }
2591
4fe51f7d 2592 if ((val & ~mask) != 0 && (-val & ~mask) != 0)
f493c217
AM
2593 as_warn (_("0x%" PRIx64 " shortened to 0x%" PRIx64),
2594 (uint64_t) val, (uint64_t) (val & mask));
847f7ad4 2595
847f7ad4
AM
2596 return val & mask;
2597}
2598
76d3f746
JB
2599static INLINE const char *insn_name (const insn_template *t)
2600{
5c139202 2601 return &i386_mnemonics[t->mnem_off];
76d3f746
JB
2602}
2603
c32fa91d
L
2604enum PREFIX_GROUP
2605{
2606 PREFIX_EXIST = 0,
2607 PREFIX_LOCK,
2608 PREFIX_REP,
04ef582a 2609 PREFIX_DS,
c32fa91d
L
2610 PREFIX_OTHER
2611};
2612
2613/* Returns
2614 a. PREFIX_EXIST if attempting to add a prefix where one from the
2615 same class already exists.
2616 b. PREFIX_LOCK if lock prefix is added.
2617 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2618 d. PREFIX_DS if ds prefix is added.
2619 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2620 */
2621
2622static enum PREFIX_GROUP
e3bb37b5 2623add_prefix (unsigned int prefix)
252b5132 2624{
c32fa91d 2625 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2626 unsigned int q;
252b5132 2627
29b0f896
AM
2628 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2629 && flag_code == CODE_64BIT)
b1905489 2630 {
161a04f6 2631 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2632 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2633 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2634 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2635 ret = PREFIX_EXIST;
b1905489
JB
2636 q = REX_PREFIX;
2637 }
3e73aa7c 2638 else
b1905489
JB
2639 {
2640 switch (prefix)
2641 {
2642 default:
2643 abort ();
2644
b1905489 2645 case DS_PREFIX_OPCODE:
04ef582a
L
2646 ret = PREFIX_DS;
2647 /* Fall through. */
2648 case CS_PREFIX_OPCODE:
b1905489
JB
2649 case ES_PREFIX_OPCODE:
2650 case FS_PREFIX_OPCODE:
2651 case GS_PREFIX_OPCODE:
2652 case SS_PREFIX_OPCODE:
2653 q = SEG_PREFIX;
2654 break;
2655
2656 case REPNE_PREFIX_OPCODE:
2657 case REPE_PREFIX_OPCODE:
c32fa91d
L
2658 q = REP_PREFIX;
2659 ret = PREFIX_REP;
2660 break;
2661
b1905489 2662 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2663 q = LOCK_PREFIX;
2664 ret = PREFIX_LOCK;
b1905489
JB
2665 break;
2666
2667 case FWAIT_OPCODE:
2668 q = WAIT_PREFIX;
2669 break;
2670
2671 case ADDR_PREFIX_OPCODE:
2672 q = ADDR_PREFIX;
2673 break;
2674
2675 case DATA_PREFIX_OPCODE:
2676 q = DATA_PREFIX;
2677 break;
2678 }
2679 if (i.prefix[q] != 0)
c32fa91d 2680 ret = PREFIX_EXIST;
b1905489 2681 }
252b5132 2682
b1905489 2683 if (ret)
252b5132 2684 {
b1905489
JB
2685 if (!i.prefix[q])
2686 ++i.prefixes;
2687 i.prefix[q] |= prefix;
252b5132 2688 }
b1905489
JB
2689 else
2690 as_bad (_("same type of prefix used twice"));
252b5132 2691
252b5132
RH
2692 return ret;
2693}
2694
2695static void
78f12dd3 2696update_code_flag (int value, int check)
eecb386c 2697{
b44fef84
JB
2698 PRINTF_LIKE ((*as_error)) = check ? as_fatal : as_bad;
2699
da5f9eb4 2700 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpu64 )
b44fef84
JB
2701 {
2702 as_error (_("64bit mode not supported on `%s'."),
2703 cpu_arch_name ? cpu_arch_name : default_arch);
2704 return;
2705 }
2706
2707 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
2708 {
2709 as_error (_("32bit mode not supported on `%s'."),
2710 cpu_arch_name ? cpu_arch_name : default_arch);
2711 return;
2712 }
78f12dd3 2713
1e9cc1c2 2714 flag_code = (enum flag_code) value;
b44fef84 2715
eecb386c
AM
2716 stackop_size = '\0';
2717}
2718
78f12dd3
L
2719static void
2720set_code_flag (int value)
2721{
2722 update_code_flag (value, 0);
2723}
2724
eecb386c 2725static void
e3bb37b5 2726set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2727{
1e9cc1c2 2728 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2729 if (flag_code != CODE_16BIT)
2730 abort ();
9306ca4a 2731 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2732}
2733
213f15cf
JB
2734static void
2735_set_intel_syntax (int syntax_flag)
2736{
2737 intel_syntax = syntax_flag;
2738
2739 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
2740
2741 register_prefix = allow_naked_reg ? "" : "%";
2742}
2743
252b5132 2744static void
e3bb37b5 2745set_intel_syntax (int syntax_flag)
252b5132
RH
2746{
2747 /* Find out if register prefixing is specified. */
2748 int ask_naked_reg = 0;
2749
2750 SKIP_WHITESPACE ();
29b0f896 2751 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2752 {
d02603dc
NC
2753 char *string;
2754 int e = get_symbol_name (&string);
252b5132 2755
47926f60 2756 if (strcmp (string, "prefix") == 0)
252b5132 2757 ask_naked_reg = 1;
47926f60 2758 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2759 ask_naked_reg = -1;
2760 else
d0b47220 2761 as_bad (_("bad argument to syntax directive."));
d02603dc 2762 (void) restore_line_pointer (e);
252b5132
RH
2763 }
2764 demand_empty_rest_of_line ();
c3332e24 2765
252b5132 2766 if (ask_naked_reg == 0)
213f15cf 2767 allow_naked_reg = (syntax_flag
f86103b7 2768 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2769 else
2770 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2771
213f15cf 2772 _set_intel_syntax (syntax_flag);
252b5132
RH
2773}
2774
1efbbeb4
L
2775static void
2776set_intel_mnemonic (int mnemonic_flag)
2777{
e1d4d893 2778 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2779}
2780
db51cc60
L
2781static void
2782set_allow_index_reg (int flag)
2783{
2784 allow_index_reg = flag;
2785}
2786
cb19c032 2787static void
7bab8ab5 2788set_check (int what)
cb19c032 2789{
7bab8ab5
JB
2790 enum check_kind *kind;
2791 const char *str;
2792
2793 if (what)
2794 {
2795 kind = &operand_check;
2796 str = "operand";
2797 }
2798 else
2799 {
2800 kind = &sse_check;
2801 str = "sse";
2802 }
2803
cb19c032
L
2804 SKIP_WHITESPACE ();
2805
2806 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2807 {
d02603dc
NC
2808 char *string;
2809 int e = get_symbol_name (&string);
cb19c032
L
2810
2811 if (strcmp (string, "none") == 0)
7bab8ab5 2812 *kind = check_none;
cb19c032 2813 else if (strcmp (string, "warning") == 0)
7bab8ab5 2814 *kind = check_warning;
cb19c032 2815 else if (strcmp (string, "error") == 0)
7bab8ab5 2816 *kind = check_error;
cb19c032 2817 else
7bab8ab5 2818 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2819 (void) restore_line_pointer (e);
cb19c032
L
2820 }
2821 else
7bab8ab5 2822 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2823
2824 demand_empty_rest_of_line ();
2825}
2826
8a9036a4
L
2827static void
2828check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2829 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2830{
2831#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2832 static const char *arch;
2833
c085ab00 2834 /* Intel MCU is only supported on ELF. */
8a9036a4
L
2835 if (!IS_ELF)
2836 return;
2837
2838 if (!arch)
2839 {
2840 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2841 use default_arch. */
2842 arch = cpu_arch_name;
2843 if (!arch)
2844 arch = default_arch;
2845 }
2846
81486035 2847 /* If we are targeting Intel MCU, we must enable it. */
648d04db
JB
2848 if ((get_elf_backend_data (stdoutput)->elf_machine_code == EM_IAMCU)
2849 == new_flag.bitfield.cpuiamcu)
81486035
L
2850 return;
2851
8a9036a4
L
2852 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2853#endif
2854}
2855
8180707f 2856static void
bd483d21 2857extend_cpu_sub_arch_name (const char *pfx, const char *name)
8180707f
JB
2858{
2859 if (cpu_sub_arch_name)
2860 cpu_sub_arch_name = reconcat (cpu_sub_arch_name, cpu_sub_arch_name,
bd483d21 2861 pfx, name, (const char *) NULL);
8180707f 2862 else
bd483d21
JB
2863 cpu_sub_arch_name = concat (pfx, name, (const char *) NULL);
2864}
2865
2866static void isa_enable (unsigned int idx)
2867{
2868 i386_cpu_flags flags = cpu_flags_or (cpu_arch_flags, cpu_arch[idx].enable);
2869
2870 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2871 {
2872 extend_cpu_sub_arch_name (".", cpu_arch[idx].name);
2873 cpu_arch_flags = flags;
2874 }
2875
2876 cpu_arch_isa_flags = cpu_flags_or (cpu_arch_isa_flags, cpu_arch[idx].enable);
2877}
2878
2879static void isa_disable (unsigned int idx)
2880{
2881 i386_cpu_flags flags
2882 = cpu_flags_and_not (cpu_arch_flags, cpu_arch[idx].disable);
2883
2884 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2885 {
2886 extend_cpu_sub_arch_name (".no", cpu_arch[idx].name);
2887 cpu_arch_flags = flags;
2888 }
2889
2890 cpu_arch_isa_flags
2891 = cpu_flags_and_not (cpu_arch_isa_flags, cpu_arch[idx].disable);
8180707f
JB
2892}
2893
e413e4e9 2894static void
e3bb37b5 2895set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2896{
f68697e8
JB
2897 typedef struct arch_stack_entry
2898 {
2899 const struct arch_stack_entry *prev;
2900 const char *name;
2901 char *sub_name;
2902 i386_cpu_flags flags;
2903 i386_cpu_flags isa_flags;
2904 enum processor_type isa;
2905 enum flag_code flag_code;
4fc85f37 2906 unsigned int vector_size;
f68697e8
JB
2907 char stackop_size;
2908 bool no_cond_jump_promotion;
2909 } arch_stack_entry;
2910 static const arch_stack_entry *arch_stack_top;
dfab07b9
JB
2911 char *s;
2912 int e;
2913 const char *string;
2914 unsigned int j = 0;
f68697e8 2915
47926f60 2916 SKIP_WHITESPACE ();
e413e4e9 2917
dfab07b9
JB
2918 if (is_end_of_line[(unsigned char) *input_line_pointer])
2919 {
2920 as_bad (_("missing cpu architecture"));
2921 input_line_pointer++;
2922 return;
2923 }
2924
2925 e = get_symbol_name (&s);
2926 string = s;
2927
2928 if (strcmp (string, "push") == 0)
e413e4e9 2929 {
dfab07b9 2930 arch_stack_entry *top = XNEW (arch_stack_entry);
e413e4e9 2931
dfab07b9
JB
2932 top->name = cpu_arch_name;
2933 if (cpu_sub_arch_name)
2934 top->sub_name = xstrdup (cpu_sub_arch_name);
2935 else
2936 top->sub_name = NULL;
2937 top->flags = cpu_arch_flags;
2938 top->isa = cpu_arch_isa;
2939 top->isa_flags = cpu_arch_isa_flags;
2940 top->flag_code = flag_code;
4fc85f37 2941 top->vector_size = vector_size;
dfab07b9
JB
2942 top->stackop_size = stackop_size;
2943 top->no_cond_jump_promotion = no_cond_jump_promotion;
2944
2945 top->prev = arch_stack_top;
2946 arch_stack_top = top;
2947
2948 (void) restore_line_pointer (e);
2949 demand_empty_rest_of_line ();
2950 return;
2951 }
2952
2953 if (strcmp (string, "pop") == 0)
2954 {
2955 const arch_stack_entry *top = arch_stack_top;
2956
2957 if (!top)
2958 as_bad (_(".arch stack is empty"));
2959 else if (top->flag_code != flag_code
2960 || top->stackop_size != stackop_size)
2961 {
2962 static const unsigned int bits[] = {
2963 [CODE_16BIT] = 16,
2964 [CODE_32BIT] = 32,
2965 [CODE_64BIT] = 64,
2966 };
2967
2968 as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"),
2969 bits[top->flag_code],
2970 top->stackop_size == LONG_MNEM_SUFFIX ? "gcc" : "");
2971 }
2972 else
3ce2ebcf 2973 {
dfab07b9
JB
2974 arch_stack_top = top->prev;
2975
2976 cpu_arch_name = top->name;
2977 free (cpu_sub_arch_name);
2978 cpu_sub_arch_name = top->sub_name;
2979 cpu_arch_flags = top->flags;
2980 cpu_arch_isa = top->isa;
2981 cpu_arch_isa_flags = top->isa_flags;
4fc85f37 2982 vector_size = top->vector_size;
dfab07b9
JB
2983 no_cond_jump_promotion = top->no_cond_jump_promotion;
2984
2985 XDELETE (top);
2986 }
2987
2988 (void) restore_line_pointer (e);
2989 demand_empty_rest_of_line ();
2990 return;
2991 }
2992
2993 if (strcmp (string, "default") == 0)
2994 {
2995 if (strcmp (default_arch, "iamcu") == 0)
2996 string = default_arch;
2997 else
2998 {
2999 static const i386_cpu_flags cpu_unknown_flags = CPU_UNKNOWN_FLAGS;
3000
3001 cpu_arch_name = NULL;
3002 free (cpu_sub_arch_name);
3003 cpu_sub_arch_name = NULL;
3004 cpu_arch_flags = cpu_unknown_flags;
dfab07b9
JB
3005 cpu_arch_isa = PROCESSOR_UNKNOWN;
3006 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].enable;
3007 if (!cpu_arch_tune_set)
fb263707 3008 cpu_arch_tune = PROCESSOR_UNKNOWN;
dfab07b9 3009
4fc85f37
JB
3010 vector_size = VSZ_DEFAULT;
3011
dfab07b9
JB
3012 j = ARRAY_SIZE (cpu_arch) + 1;
3013 }
3014 }
3015
3016 for (; j < ARRAY_SIZE (cpu_arch); j++)
3017 {
3018 if (strcmp (string + (*string == '.'), cpu_arch[j].name) == 0
3019 && (*string == '.') == (cpu_arch[j].type == PROCESSOR_NONE))
3020 {
3021 if (*string != '.')
3022 {
3023 check_cpu_arch_compatible (string, cpu_arch[j].enable);
3ce2ebcf 3024
da5f9eb4 3025 if (flag_code == CODE_64BIT && !cpu_arch[j].enable.bitfield.cpu64 )
1d07cfb4
JB
3026 {
3027 as_bad (_("64bit mode not supported on `%s'."),
3028 cpu_arch[j].name);
3029 (void) restore_line_pointer (e);
3030 ignore_rest_of_line ();
3031 return;
3032 }
3033
3034 if (flag_code == CODE_32BIT && !cpu_arch[j].enable.bitfield.cpui386)
3035 {
3036 as_bad (_("32bit mode not supported on `%s'."),
3037 cpu_arch[j].name);
3038 (void) restore_line_pointer (e);
3039 ignore_rest_of_line ();
3040 return;
3041 }
3042
dfab07b9 3043 cpu_arch_name = cpu_arch[j].name;
3ce2ebcf
JB
3044 free (cpu_sub_arch_name);
3045 cpu_sub_arch_name = NULL;
dfab07b9 3046 cpu_arch_flags = cpu_arch[j].enable;
dfab07b9
JB
3047 cpu_arch_isa = cpu_arch[j].type;
3048 cpu_arch_isa_flags = cpu_arch[j].enable;
3ce2ebcf 3049 if (!cpu_arch_tune_set)
fb263707 3050 cpu_arch_tune = cpu_arch_isa;
4fc85f37
JB
3051
3052 vector_size = VSZ_DEFAULT;
3053
dfab07b9
JB
3054 pre_386_16bit_warned = false;
3055 break;
3ce2ebcf 3056 }
f68697e8 3057
dfab07b9
JB
3058 if (cpu_flags_all_zero (&cpu_arch[j].enable))
3059 continue;
f68697e8 3060
bd483d21 3061 isa_enable (j);
f68697e8
JB
3062
3063 (void) restore_line_pointer (e);
4fc85f37
JB
3064
3065 switch (cpu_arch[j].vsz)
3066 {
3067 default:
3068 break;
3069
3070 case vsz_set:
3071#ifdef SVR4_COMMENT_CHARS
3072 if (*input_line_pointer == ':' || *input_line_pointer == '/')
3073#else
3074 if (*input_line_pointer == '/')
3075#endif
3076 {
3077 ++input_line_pointer;
3078 switch (get_absolute_expression ())
3079 {
3080 case 512: vector_size = VSZ512; break;
3081 case 256: vector_size = VSZ256; break;
3082 case 128: vector_size = VSZ128; break;
3083 default:
3084 as_bad (_("Unrecognized vector size specifier"));
3085 ignore_rest_of_line ();
3086 return;
3087 }
3088 break;
3089 }
3090 /* Fall through. */
3091 case vsz_reset:
3092 vector_size = VSZ_DEFAULT;
3093 break;
3094 }
3095
f68697e8
JB
3096 demand_empty_rest_of_line ();
3097 return;
3098 }
dfab07b9 3099 }
3ce2ebcf 3100
dfab07b9
JB
3101 if (startswith (string, ".no") && j >= ARRAY_SIZE (cpu_arch))
3102 {
3103 /* Disable an ISA extension. */
3104 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
3105 if (cpu_arch[j].type == PROCESSOR_NONE
3106 && strcmp (string + 3, cpu_arch[j].name) == 0)
3107 {
bd483d21 3108 isa_disable (j);
e413e4e9 3109
4fc85f37
JB
3110 if (cpu_arch[j].vsz == vsz_set)
3111 vector_size = VSZ_DEFAULT;
3112
dfab07b9
JB
3113 (void) restore_line_pointer (e);
3114 demand_empty_rest_of_line ();
3115 return;
3116 }
e413e4e9 3117 }
dfab07b9
JB
3118
3119 if (j == ARRAY_SIZE (cpu_arch))
3120 as_bad (_("no such architecture: `%s'"), string);
3121
3122 *input_line_pointer = e;
e413e4e9 3123
fddf5b5b
AM
3124 no_cond_jump_promotion = 0;
3125 if (*input_line_pointer == ','
29b0f896 3126 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 3127 {
d02603dc 3128 ++input_line_pointer;
dfab07b9
JB
3129 e = get_symbol_name (&s);
3130 string = s;
fddf5b5b
AM
3131
3132 if (strcmp (string, "nojumps") == 0)
3133 no_cond_jump_promotion = 1;
3134 else if (strcmp (string, "jumps") == 0)
3135 ;
3136 else
3137 as_bad (_("no such architecture modifier: `%s'"), string);
3138
d02603dc 3139 (void) restore_line_pointer (e);
fddf5b5b
AM
3140 }
3141
e413e4e9
AM
3142 demand_empty_rest_of_line ();
3143}
3144
8a9036a4
L
3145enum bfd_architecture
3146i386_arch (void)
3147{
c085ab00 3148 if (cpu_arch_isa == PROCESSOR_IAMCU)
81486035 3149 {
ed049bd6 3150 if (!IS_ELF || flag_code == CODE_64BIT)
81486035
L
3151 as_fatal (_("Intel MCU is 32bit ELF only"));
3152 return bfd_arch_iamcu;
3153 }
8a9036a4
L
3154 else
3155 return bfd_arch_i386;
3156}
3157
b9d79e03 3158unsigned long
7016a5d5 3159i386_mach (void)
b9d79e03 3160{
d34049e8 3161 if (startswith (default_arch, "x86_64"))
8a9036a4 3162 {
c085ab00 3163 if (default_arch[6] == '\0')
8a9036a4 3164 return bfd_mach_x86_64;
351f65ca
L
3165 else
3166 return bfd_mach_x64_32;
8a9036a4 3167 }
5197d474
L
3168 else if (!strcmp (default_arch, "i386")
3169 || !strcmp (default_arch, "iamcu"))
81486035
L
3170 {
3171 if (cpu_arch_isa == PROCESSOR_IAMCU)
3172 {
ed049bd6 3173 if (!IS_ELF)
81486035
L
3174 as_fatal (_("Intel MCU is 32bit ELF only"));
3175 return bfd_mach_i386_iamcu;
3176 }
3177 else
3178 return bfd_mach_i386_i386;
3179 }
b9d79e03 3180 else
2b5d6a91 3181 as_fatal (_("unknown architecture"));
b9d79e03 3182}
b9d79e03 3183\f
99f0fb12
JB
3184#include "opcodes/i386-tbl.h"
3185
d3b01414
JB
3186static void
3187op_lookup (const char *mnemonic)
3188{
3189 i386_op_off_t *pos = str_hash_find (op_hash, mnemonic);
3190
3191 if (pos != NULL)
3192 {
3193 current_templates.start = &i386_optab[pos[0]];
3194 current_templates.end = &i386_optab[pos[1]];
3195 }
3196 else
3197 current_templates.end = current_templates.start = NULL;
3198}
3199
252b5132 3200void
7016a5d5 3201md_begin (void)
252b5132 3202{
86fa6981
L
3203 /* Support pseudo prefixes like {disp32}. */
3204 lex_type ['{'] = LEX_BEGIN_NAME;
3205
47926f60 3206 /* Initialize op_hash hash table. */
629310ab 3207 op_hash = str_htab_create ();
252b5132
RH
3208
3209 {
d3b01414
JB
3210 const i386_op_off_t *cur = i386_op_sets;
3211 const i386_op_off_t *end = cur + ARRAY_SIZE (i386_op_sets) - 1;
3212
3213 for (; cur < end; ++cur)
3214 if (str_hash_insert (op_hash, insn_name (&i386_optab[*cur]), cur, 0))
3215 as_fatal (_("duplicate %s"), insn_name (&i386_optab[*cur]));
252b5132
RH
3216 }
3217
47926f60 3218 /* Initialize reg_hash hash table. */
629310ab 3219 reg_hash = str_htab_create ();
252b5132 3220 {
29b0f896 3221 const reg_entry *regtab;
c3fe08fa 3222 unsigned int regtab_size = i386_regtab_size;
252b5132 3223
c3fe08fa 3224 for (regtab = i386_regtab; regtab_size--; regtab++)
6225c532 3225 {
6288d05f
JB
3226 switch (regtab->reg_type.bitfield.class)
3227 {
3228 case Reg:
34684862
JB
3229 if (regtab->reg_type.bitfield.dword)
3230 {
3231 if (regtab->reg_type.bitfield.instance == Accum)
3232 reg_eax = regtab;
3233 }
3234 else if (regtab->reg_type.bitfield.tbyte)
6288d05f
JB
3235 {
3236 /* There's no point inserting st(<N>) in the hash table, as
3237 parentheses aren't included in register_chars[] anyway. */
3238 if (regtab->reg_type.bitfield.instance != Accum)
3239 continue;
3240 reg_st0 = regtab;
3241 }
3242 break;
3243
5e042380
JB
3244 case SReg:
3245 switch (regtab->reg_num)
3246 {
3247 case 0: reg_es = regtab; break;
3248 case 2: reg_ss = regtab; break;
3249 case 3: reg_ds = regtab; break;
3250 }
3251 break;
3252
6288d05f
JB
3253 case RegMask:
3254 if (!regtab->reg_num)
3255 reg_k0 = regtab;
3256 break;
3257 }
3258
6225c532
JB
3259 if (str_hash_insert (reg_hash, regtab->reg_name, regtab, 0) != NULL)
3260 as_fatal (_("duplicate %s"), regtab->reg_name);
6225c532 3261 }
252b5132
RH
3262 }
3263
47926f60 3264 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3265 {
29b0f896 3266 int c;
d2b1a14d 3267 const char *p;
252b5132
RH
3268
3269 for (c = 0; c < 256; c++)
3270 {
014fbcda 3271 if (ISDIGIT (c) || ISLOWER (c))
252b5132
RH
3272 {
3273 mnemonic_chars[c] = c;
3274 register_chars[c] = c;
3275 operand_chars[c] = c;
3276 }
3882b010 3277 else if (ISUPPER (c))
252b5132 3278 {
3882b010 3279 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3280 register_chars[c] = mnemonic_chars[c];
3281 operand_chars[c] = c;
3282 }
b3983e5f
JB
3283#ifdef SVR4_COMMENT_CHARS
3284 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3285 operand_chars[c] = c;
3286#endif
252b5132 3287
4795cd4a
JB
3288 if (c >= 128)
3289 operand_chars[c] = c;
252b5132
RH
3290 }
3291
c0f3af97 3292 mnemonic_chars['_'] = '_';
791fe849 3293 mnemonic_chars['-'] = '-';
0003779b 3294 mnemonic_chars['.'] = '.';
252b5132 3295
d2b1a14d
JB
3296 for (p = extra_symbol_chars; *p != '\0'; p++)
3297 operand_chars[(unsigned char) *p] = *p;
252b5132
RH
3298 for (p = operand_special_chars; *p != '\0'; p++)
3299 operand_chars[(unsigned char) *p] = *p;
3300 }
3301
fabb73d1 3302 if (object_64bit)
a4447b93 3303 {
ca19b261
KT
3304#if defined (OBJ_COFF) && defined (TE_PE)
3305 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3306 ? 32 : 16);
3307#else
a4447b93 3308 x86_dwarf2_return_column = 16;
ca19b261 3309#endif
61ff971f 3310 x86_cie_data_alignment = -8;
b52c4ee4 3311#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
788b11d9
JB
3312 x86_sframe_cfa_sp_reg = REG_SP;
3313 x86_sframe_cfa_fp_reg = REG_FP;
b52c4ee4 3314#endif
a4447b93
RH
3315 }
3316 else
3317 {
3318 x86_dwarf2_return_column = 8;
3319 x86_cie_data_alignment = -4;
3320 }
e379e5f3
L
3321
3322 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3323 can be turned into BRANCH_PREFIX frag. */
3324 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3325 abort ();
252b5132
RH
3326}
3327
3328void
e3bb37b5 3329i386_print_statistics (FILE *file)
252b5132 3330{
629310ab
ML
3331 htab_print_statistics (file, "i386 opcode", op_hash);
3332 htab_print_statistics (file, "i386 register", reg_hash);
252b5132 3333}
654d6f31
AM
3334
3335void
3336i386_md_end (void)
3337{
3338 htab_delete (op_hash);
3339 htab_delete (reg_hash);
3340}
252b5132 3341\f
252b5132
RH
3342#ifdef DEBUG386
3343
ce8a8b2f 3344/* Debugging routines for md_assemble. */
d3ce72d0 3345static void pte (insn_template *);
40fb9820 3346static void pt (i386_operand_type);
e3bb37b5
L
3347static void pe (expressionS *);
3348static void ps (symbolS *);
252b5132
RH
3349
3350static void
2c703856 3351pi (const char *line, i386_insn *x)
252b5132 3352{
09137c09 3353 unsigned int j;
252b5132
RH
3354
3355 fprintf (stdout, "%s: template ", line);
3356 pte (&x->tm);
09f131f2
JH
3357 fprintf (stdout, " address: base %s index %s scale %x\n",
3358 x->base_reg ? x->base_reg->reg_name : "none",
3359 x->index_reg ? x->index_reg->reg_name : "none",
3360 x->log2_scale_factor);
3361 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3362 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3363 fprintf (stdout, " sib: base %x index %x scale %x\n",
3364 x->sib.base, x->sib.index, x->sib.scale);
3365 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3366 (x->rex & REX_W) != 0,
3367 (x->rex & REX_R) != 0,
3368 (x->rex & REX_X) != 0,
3369 (x->rex & REX_B) != 0);
09137c09 3370 for (j = 0; j < x->operands; j++)
252b5132 3371 {
09137c09
SP
3372 fprintf (stdout, " #%d: ", j + 1);
3373 pt (x->types[j]);
252b5132 3374 fprintf (stdout, "\n");
bab6aec1 3375 if (x->types[j].bitfield.class == Reg
3528c362
JB
3376 || x->types[j].bitfield.class == RegMMX
3377 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3378 || x->types[j].bitfield.class == RegMask
00cee14f 3379 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3380 || x->types[j].bitfield.class == RegCR
3381 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3382 || x->types[j].bitfield.class == RegTR
3383 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3384 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3385 if (operand_type_check (x->types[j], imm))
3386 pe (x->op[j].imms);
3387 if (operand_type_check (x->types[j], disp))
3388 pe (x->op[j].disps);
252b5132
RH
3389 }
3390}
3391
3392static void
d3ce72d0 3393pte (insn_template *t)
252b5132 3394{
b933fa4b 3395 static const unsigned char opc_pfx[] = { 0, 0x66, 0xf3, 0xf2 };
441f6aca 3396 static const char *const opc_spc[] = {
0cc78721 3397 NULL, "0f", "0f38", "0f3a", NULL, "evexmap5", "evexmap6", NULL,
441f6aca
JB
3398 "XOP08", "XOP09", "XOP0A",
3399 };
09137c09 3400 unsigned int j;
441f6aca 3401
252b5132 3402 fprintf (stdout, " %d operands ", t->operands);
441f6aca
JB
3403 if (opc_pfx[t->opcode_modifier.opcodeprefix])
3404 fprintf (stdout, "pfx %x ", opc_pfx[t->opcode_modifier.opcodeprefix]);
ddb62495
JB
3405 if (opc_spc[t->opcode_space])
3406 fprintf (stdout, "space %s ", opc_spc[t->opcode_space]);
47926f60 3407 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3408 if (t->extension_opcode != None)
3409 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3410 if (t->opcode_modifier.d)
252b5132 3411 fprintf (stdout, "D");
40fb9820 3412 if (t->opcode_modifier.w)
252b5132
RH
3413 fprintf (stdout, "W");
3414 fprintf (stdout, "\n");
09137c09 3415 for (j = 0; j < t->operands; j++)
252b5132 3416 {
09137c09
SP
3417 fprintf (stdout, " #%d type ", j + 1);
3418 pt (t->operand_types[j]);
252b5132
RH
3419 fprintf (stdout, "\n");
3420 }
3421}
3422
3423static void
e3bb37b5 3424pe (expressionS *e)
252b5132 3425{
24eab124 3426 fprintf (stdout, " operation %d\n", e->X_op);
b8281767
AM
3427 fprintf (stdout, " add_number %" PRId64 " (%" PRIx64 ")\n",
3428 (int64_t) e->X_add_number, (uint64_t) (valueT) e->X_add_number);
252b5132
RH
3429 if (e->X_add_symbol)
3430 {
3431 fprintf (stdout, " add_symbol ");
3432 ps (e->X_add_symbol);
3433 fprintf (stdout, "\n");
3434 }
3435 if (e->X_op_symbol)
3436 {
3437 fprintf (stdout, " op_symbol ");
3438 ps (e->X_op_symbol);
3439 fprintf (stdout, "\n");
3440 }
3441}
3442
3443static void
e3bb37b5 3444ps (symbolS *s)
252b5132
RH
3445{
3446 fprintf (stdout, "%s type %s%s",
3447 S_GET_NAME (s),
3448 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3449 segment_name (S_GET_SEGMENT (s)));
3450}
3451
7b81dfbb 3452static struct type_name
252b5132 3453 {
40fb9820
L
3454 i386_operand_type mask;
3455 const char *name;
252b5132 3456 }
7b81dfbb 3457const type_names[] =
252b5132 3458{
05909f23
JB
3459 { { .bitfield = { .class = Reg, .byte = 1 } }, "r8" },
3460 { { .bitfield = { .class = Reg, .word = 1 } }, "r16" },
3461 { { .bitfield = { .class = Reg, .dword = 1 } }, "r32" },
3462 { { .bitfield = { .class = Reg, .qword = 1 } }, "r64" },
3463 { { .bitfield = { .instance = Accum, .byte = 1 } }, "acc8" },
3464 { { .bitfield = { .instance = Accum, .word = 1 } }, "acc16" },
3465 { { .bitfield = { .instance = Accum, .dword = 1 } }, "acc32" },
3466 { { .bitfield = { .instance = Accum, .qword = 1 } }, "acc64" },
3467 { { .bitfield = { .imm8 = 1 } }, "i8" },
3468 { { .bitfield = { .imm8s = 1 } }, "i8s" },
3469 { { .bitfield = { .imm16 = 1 } }, "i16" },
3470 { { .bitfield = { .imm32 = 1 } }, "i32" },
3471 { { .bitfield = { .imm32s = 1 } }, "i32s" },
3472 { { .bitfield = { .imm64 = 1 } }, "i64" },
3473 { { .bitfield = { .imm1 = 1 } }, "i1" },
3474 { { .bitfield = { .baseindex = 1 } }, "BaseIndex" },
3475 { { .bitfield = { .disp8 = 1 } }, "d8" },
3476 { { .bitfield = { .disp16 = 1 } }, "d16" },
3477 { { .bitfield = { .disp32 = 1 } }, "d32" },
3478 { { .bitfield = { .disp64 = 1 } }, "d64" },
3479 { { .bitfield = { .instance = RegD, .word = 1 } }, "InOutPortReg" },
3480 { { .bitfield = { .instance = RegC, .byte = 1 } }, "ShiftCount" },
3481 { { .bitfield = { .class = RegCR } }, "control reg" },
3482 { { .bitfield = { .class = RegTR } }, "test reg" },
3483 { { .bitfield = { .class = RegDR } }, "debug reg" },
3484 { { .bitfield = { .class = Reg, .tbyte = 1 } }, "FReg" },
3485 { { .bitfield = { .instance = Accum, .tbyte = 1 } }, "FAcc" },
3486 { { .bitfield = { .class = SReg } }, "SReg" },
3487 { { .bitfield = { .class = RegMMX } }, "rMMX" },
3488 { { .bitfield = { .class = RegSIMD, .xmmword = 1 } }, "rXMM" },
3489 { { .bitfield = { .class = RegSIMD, .ymmword = 1 } }, "rYMM" },
3490 { { .bitfield = { .class = RegSIMD, .zmmword = 1 } }, "rZMM" },
3491 { { .bitfield = { .class = RegSIMD, .tmmword = 1 } }, "rTMM" },
3492 { { .bitfield = { .class = RegMask } }, "Mask reg" },
252b5132
RH
3493};
3494
3495static void
40fb9820 3496pt (i386_operand_type t)
252b5132 3497{
40fb9820 3498 unsigned int j;
c6fb90c8 3499 i386_operand_type a;
252b5132 3500
40fb9820 3501 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3502 {
3503 a = operand_type_and (t, type_names[j].mask);
2c703856 3504 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3505 fprintf (stdout, "%s, ", type_names[j].name);
3506 }
252b5132
RH
3507 fflush (stdout);
3508}
3509
3510#endif /* DEBUG386 */
3511\f
252b5132 3512static bfd_reloc_code_real_type
3956db08 3513reloc (unsigned int size,
64e74474
AM
3514 int pcrel,
3515 int sign,
3516 bfd_reloc_code_real_type other)
252b5132 3517{
47926f60 3518 if (other != NO_RELOC)
3956db08 3519 {
91d6fa6a 3520 reloc_howto_type *rel;
3956db08
JB
3521
3522 if (size == 8)
3523 switch (other)
3524 {
64e74474
AM
3525 case BFD_RELOC_X86_64_GOT32:
3526 return BFD_RELOC_X86_64_GOT64;
3527 break;
553d1284
L
3528 case BFD_RELOC_X86_64_GOTPLT64:
3529 return BFD_RELOC_X86_64_GOTPLT64;
3530 break;
64e74474
AM
3531 case BFD_RELOC_X86_64_PLTOFF64:
3532 return BFD_RELOC_X86_64_PLTOFF64;
3533 break;
3534 case BFD_RELOC_X86_64_GOTPC32:
3535 other = BFD_RELOC_X86_64_GOTPC64;
3536 break;
3537 case BFD_RELOC_X86_64_GOTPCREL:
3538 other = BFD_RELOC_X86_64_GOTPCREL64;
3539 break;
3540 case BFD_RELOC_X86_64_TPOFF32:
3541 other = BFD_RELOC_X86_64_TPOFF64;
3542 break;
3543 case BFD_RELOC_X86_64_DTPOFF32:
3544 other = BFD_RELOC_X86_64_DTPOFF64;
3545 break;
3546 default:
3547 break;
3956db08 3548 }
e05278af 3549
8ce3d284 3550#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3551 if (other == BFD_RELOC_SIZE32)
3552 {
3553 if (size == 8)
1ab668bf 3554 other = BFD_RELOC_SIZE64;
8fd4256d 3555 if (pcrel)
1ab668bf
AM
3556 {
3557 as_bad (_("there are no pc-relative size relocations"));
3558 return NO_RELOC;
3559 }
8fd4256d 3560 }
8ce3d284 3561#endif
8fd4256d 3562
e05278af 3563 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3564 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3565 sign = -1;
3566
91d6fa6a
NC
3567 rel = bfd_reloc_type_lookup (stdoutput, other);
3568 if (!rel)
3956db08 3569 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3570 else if (size != bfd_get_reloc_size (rel))
3956db08 3571 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3572 bfd_get_reloc_size (rel),
3956db08 3573 size);
91d6fa6a 3574 else if (pcrel && !rel->pc_relative)
3956db08 3575 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3576 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3577 && !sign)
91d6fa6a 3578 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3579 && sign > 0))
3956db08
JB
3580 as_bad (_("relocated field and relocation type differ in signedness"));
3581 else
3582 return other;
3583 return NO_RELOC;
3584 }
252b5132
RH
3585
3586 if (pcrel)
3587 {
3e73aa7c 3588 if (!sign)
3956db08 3589 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3590 switch (size)
3591 {
3592 case 1: return BFD_RELOC_8_PCREL;
3593 case 2: return BFD_RELOC_16_PCREL;
d258b828 3594 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3595 case 8: return BFD_RELOC_64_PCREL;
252b5132 3596 }
3956db08 3597 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3598 }
3599 else
3600 {
3956db08 3601 if (sign > 0)
e5cb08ac 3602 switch (size)
3e73aa7c
JH
3603 {
3604 case 4: return BFD_RELOC_X86_64_32S;
3605 }
3606 else
3607 switch (size)
3608 {
3609 case 1: return BFD_RELOC_8;
3610 case 2: return BFD_RELOC_16;
3611 case 4: return BFD_RELOC_32;
3612 case 8: return BFD_RELOC_64;
3613 }
3956db08
JB
3614 as_bad (_("cannot do %s %u byte relocation"),
3615 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3616 }
3617
0cc9e1d3 3618 return NO_RELOC;
252b5132
RH
3619}
3620
071c5d81 3621#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
47926f60
KH
3622/* Here we decide which fixups can be adjusted to make them relative to
3623 the beginning of the section instead of the symbol. Basically we need
3624 to make sure that the dynamic relocations are done correctly, so in
3625 some cases we force the original symbol to be used. */
3626
252b5132 3627int
071c5d81 3628tc_i386_fix_adjustable (fixS *fixP)
252b5132 3629{
718ddfc0 3630 if (!IS_ELF)
31312f95
AM
3631 return 1;
3632
a161fe53
AM
3633 /* Don't adjust pc-relative references to merge sections in 64-bit
3634 mode. */
3635 if (use_rela_relocations
3636 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3637 && fixP->fx_pcrel)
252b5132 3638 return 0;
31312f95 3639
8d01d9a9
AJ
3640 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3641 and changed later by validate_fix. */
3642 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3643 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3644 return 0;
3645
8fd4256d
L
3646 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3647 for size relocations. */
3648 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3649 || fixP->fx_r_type == BFD_RELOC_SIZE64
3650 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3651 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3652 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3653 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3654 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3655 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3656 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3657 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3658 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3659 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3660 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3661 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3662 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3663 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3664 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3665 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3666 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
3d5a60de 3667 || fixP->fx_r_type == BFD_RELOC_X86_64_CODE_4_GOTPCRELX
bffbf940
JJ
3668 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3669 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3670 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3671 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940 3672 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
a533c8df 3673 || fixP->fx_r_type == BFD_RELOC_X86_64_CODE_4_GOTTPOFF
5bc71c2a 3674 || fixP->fx_r_type == BFD_RELOC_X86_64_CODE_6_GOTTPOFF
bffbf940 3675 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3676 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3677 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7 3678 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
a533c8df 3679 || fixP->fx_r_type == BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
67a4f2b7 3680 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3681 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3682 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3683 return 0;
3684 return 1;
3685}
071c5d81 3686#endif
252b5132 3687
a9aabc23
JB
3688static INLINE bool
3689want_disp32 (const insn_template *t)
3690{
3691 return flag_code != CODE_64BIT
3692 || i.prefix[ADDR_PREFIX]
7fc69528 3693 || (t->mnem_off == MN_lea
fe134c65
JB
3694 && (!i.types[1].bitfield.qword
3695 || t->opcode_modifier.size == SIZE32));
a9aabc23
JB
3696}
3697
b4cac588 3698static int
e3bb37b5 3699intel_float_operand (const char *mnemonic)
252b5132 3700{
9306ca4a
JB
3701 /* Note that the value returned is meaningful only for opcodes with (memory)
3702 operands, hence the code here is free to improperly handle opcodes that
3703 have no operands (for better performance and smaller code). */
3704
3705 if (mnemonic[0] != 'f')
3706 return 0; /* non-math */
3707
3708 switch (mnemonic[1])
3709 {
3710 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3711 the fs segment override prefix not currently handled because no
3712 call path can make opcodes without operands get here */
3713 case 'i':
3714 return 2 /* integer op */;
3715 case 'l':
3716 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3717 return 3; /* fldcw/fldenv */
3718 break;
3719 case 'n':
3720 if (mnemonic[2] != 'o' /* fnop */)
3721 return 3; /* non-waiting control op */
3722 break;
3723 case 'r':
3724 if (mnemonic[2] == 's')
3725 return 3; /* frstor/frstpm */
3726 break;
3727 case 's':
3728 if (mnemonic[2] == 'a')
3729 return 3; /* fsave */
3730 if (mnemonic[2] == 't')
3731 {
3732 switch (mnemonic[3])
3733 {
3734 case 'c': /* fstcw */
3735 case 'd': /* fstdw */
3736 case 'e': /* fstenv */
3737 case 's': /* fsts[gw] */
3738 return 3;
3739 }
3740 }
3741 break;
3742 case 'x':
3743 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3744 return 0; /* fxsave/fxrstor are not really math ops */
3745 break;
3746 }
252b5132 3747
9306ca4a 3748 return 1;
252b5132
RH
3749}
3750
9a182d04
JB
3751static INLINE void
3752install_template (const insn_template *t)
3753{
3754 unsigned int l;
3755
3756 i.tm = *t;
3757
a6f3add0
JB
3758 /* Dual VEX/EVEX templates need stripping one of the possible variants. */
3759 if (t->opcode_modifier.vex && t->opcode_modifier.evex)
6177c84d 3760 {
a5e91879
JB
3761 if ((maybe_cpu (t, CpuAVX) || maybe_cpu (t, CpuAVX2)
3762 || maybe_cpu (t, CpuFMA))
3763 && (maybe_cpu (t, CpuAVX512F) || maybe_cpu (t, CpuAVX512VL)))
a6f3add0 3764 {
6177c84d 3765 if (need_evex_encoding (t))
a6f3add0
JB
3766 {
3767 i.tm.opcode_modifier.vex = 0;
a5e91879
JB
3768 i.tm.cpu.bitfield.cpuavx512f = i.tm.cpu_any.bitfield.cpuavx512f;
3769 i.tm.cpu.bitfield.cpuavx512vl = i.tm.cpu_any.bitfield.cpuavx512vl;
a6f3add0
JB
3770 }
3771 else
3772 {
3773 i.tm.opcode_modifier.evex = 0;
a5e91879
JB
3774 if (i.tm.cpu_any.bitfield.cpuavx)
3775 i.tm.cpu.bitfield.cpuavx = 1;
3776 else if (!i.tm.cpu.bitfield.isa)
3777 i.tm.cpu.bitfield.isa = i.tm.cpu_any.bitfield.isa;
3778 else
3779 gas_assert (i.tm.cpu.bitfield.isa == i.tm.cpu_any.bitfield.isa);
a6f3add0
JB
3780 }
3781 }
6177c84d
CL
3782
3783 if ((maybe_cpu (t, CpuCMPCCXADD) || maybe_cpu (t, CpuAMX_TILE)
3784 || maybe_cpu (t, CpuAVX512F) || maybe_cpu (t, CpuAVX512DQ)
3785 || maybe_cpu (t, CpuAVX512BW) || maybe_cpu (t, CpuBMI)
5190fa38 3786 || maybe_cpu (t, CpuBMI2) || maybe_cpu (t, CpuUSER_MSR))
6177c84d
CL
3787 && maybe_cpu (t, CpuAPX_F))
3788 {
3789 if (need_evex_encoding (t))
3790 i.tm.opcode_modifier.vex = 0;
3791 else
3792 i.tm.opcode_modifier.evex = 0;
3793 }
3794 }
a6f3add0 3795
9a182d04
JB
3796 /* Note that for pseudo prefixes this produces a length of 1. But for them
3797 the length isn't interesting at all. */
3798 for (l = 1; l < 4; ++l)
3799 if (!(t->base_opcode >> (8 * l)))
3800 break;
3801
3802 i.opcode_length = l;
3803}
3804
c0f3af97
L
3805/* Build the VEX prefix. */
3806
3807static void
d3ce72d0 3808build_vex_prefix (const insn_template *t)
c0f3af97
L
3809{
3810 unsigned int register_specifier;
c0f3af97 3811 unsigned int vector_length;
03751133 3812 unsigned int w;
c0f3af97
L
3813
3814 /* Check register specifier. */
3815 if (i.vex.register_specifier)
43234a1e
L
3816 {
3817 register_specifier =
3818 ~register_number (i.vex.register_specifier) & 0xf;
3819 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3820 }
c0f3af97
L
3821 else
3822 register_specifier = 0xf;
3823
79f0fa25
L
3824 /* Use 2-byte VEX prefix by swapping destination and source operand
3825 if there are more than 1 register operand. */
3826 if (i.reg_operands > 1
e346d50a 3827 && i.encoding != encoding_vex3
86fa6981 3828 && i.dir_encoding == dir_encoding_default
fa99fab2 3829 && i.operands == i.reg_operands
dbbc8b7e 3830 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
ddb62495 3831 && i.tm.opcode_space == SPACE_0F
dbbc8b7e 3832 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3833 && i.rex == REX_B)
3834 {
67748abf 3835 unsigned int xchg;
fa99fab2 3836
67748abf 3837 swap_2_operands (0, i.operands - 1);
fa99fab2 3838
9c2799c2 3839 gas_assert (i.rm.mode == 3);
fa99fab2
L
3840
3841 i.rex = REX_R;
3842 xchg = i.rm.regmem;
3843 i.rm.regmem = i.rm.reg;
3844 i.rm.reg = xchg;
3845
dbbc8b7e
JB
3846 if (i.tm.opcode_modifier.d)
3847 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
2c735193 3848 ? Opcode_ExtD : Opcode_SIMD_IntD;
dbbc8b7e 3849 else /* Use the next insn. */
9a182d04 3850 install_template (&t[1]);
fa99fab2
L
3851 }
3852
79dec6b7
JB
3853 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3854 are no memory operands and at least 3 register ones. */
3855 if (i.reg_operands >= 3
e346d50a 3856 && i.encoding != encoding_vex3
79dec6b7
JB
3857 && i.reg_operands == i.operands - i.imm_operands
3858 && i.tm.opcode_modifier.vex
3859 && i.tm.opcode_modifier.commutative
7440781b
JB
3860 /* .commutative aliases .staticrounding; disambiguate. */
3861 && !i.tm.opcode_modifier.sae
33740f21
JB
3862 && (i.tm.opcode_modifier.sse2avx
3863 || (optimize > 1 && !i.no_optimize))
79dec6b7
JB
3864 && i.rex == REX_B
3865 && i.vex.register_specifier
3866 && !(i.vex.register_specifier->reg_flags & RegRex))
3867 {
3868 unsigned int xchg = i.operands - i.reg_operands;
79dec6b7 3869
ddb62495 3870 gas_assert (i.tm.opcode_space == SPACE_0F);
79dec6b7
JB
3871 gas_assert (!i.tm.opcode_modifier.sae);
3872 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3873 &i.types[i.operands - 3]));
3874 gas_assert (i.rm.mode == 3);
3875
67748abf 3876 swap_2_operands (xchg, xchg + 1);
79dec6b7
JB
3877
3878 i.rex = 0;
3879 xchg = i.rm.regmem | 8;
3880 i.rm.regmem = ~register_specifier & 0xf;
3881 gas_assert (!(i.rm.regmem & 8));
3882 i.vex.register_specifier += xchg - i.rm.regmem;
3883 register_specifier = ~xchg & 0xf;
3884 }
3885
539f890d
L
3886 if (i.tm.opcode_modifier.vex == VEXScalar)
3887 vector_length = avxscalar;
10c17abd
JB
3888 else if (i.tm.opcode_modifier.vex == VEX256)
3889 vector_length = 1;
d0c2e3ec
JB
3890 else if (dot_insn () && i.tm.opcode_modifier.vex == VEX128)
3891 vector_length = 0;
539f890d 3892 else
10c17abd 3893 {
56522fc5 3894 unsigned int op;
10c17abd 3895
c7213af9
L
3896 /* Determine vector length from the last multi-length vector
3897 operand. */
10c17abd 3898 vector_length = 0;
56522fc5 3899 for (op = t->operands; op--;)
10c17abd
JB
3900 if (t->operand_types[op].bitfield.xmmword
3901 && t->operand_types[op].bitfield.ymmword
3902 && i.types[op].bitfield.ymmword)
3903 {
3904 vector_length = 1;
3905 break;
3906 }
3907 }
c0f3af97 3908
03751133
L
3909 /* Check the REX.W bit and VEXW. */
3910 if (i.tm.opcode_modifier.vexw == VEXWIG)
3911 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
ebe82bfd 3912 else if (i.tm.opcode_modifier.vexw && !(i.rex & REX_W))
03751133
L
3913 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3914 else
931d03b7 3915 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3916
c0f3af97 3917 /* Use 2-byte VEX prefix if possible. */
03751133 3918 if (w == 0
e346d50a 3919 && i.encoding != encoding_vex3
ddb62495 3920 && i.tm.opcode_space == SPACE_0F
c0f3af97
L
3921 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3922 {
3923 /* 2-byte VEX prefix. */
3924 unsigned int r;
3925
3926 i.vex.length = 2;
3927 i.vex.bytes[0] = 0xc5;
3928
3929 /* Check the REX.R bit. */
3930 r = (i.rex & REX_R) ? 0 : 1;
3931 i.vex.bytes[1] = (r << 7
3932 | register_specifier << 3
3933 | vector_length << 2
35648716 3934 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3935 }
3936 else
3937 {
3938 /* 3-byte VEX prefix. */
f88c9eb0 3939 i.vex.length = 3;
f88c9eb0 3940
ddb62495 3941 switch (i.tm.opcode_space)
5dd85c99 3942 {
441f6aca
JB
3943 case SPACE_0F:
3944 case SPACE_0F38:
3945 case SPACE_0F3A:
8170af78 3946 case SPACE_VEXMAP7:
80de6e00 3947 i.vex.bytes[0] = 0xc4;
7f399153 3948 break;
441f6aca
JB
3949 case SPACE_XOP08:
3950 case SPACE_XOP09:
3951 case SPACE_XOP0A:
f88c9eb0 3952 i.vex.bytes[0] = 0x8f;
7f399153
L
3953 break;
3954 default:
3955 abort ();
f88c9eb0 3956 }
c0f3af97 3957
c0f3af97
L
3958 /* The high 3 bits of the second VEX byte are 1's compliment
3959 of RXB bits from REX. */
d0c2e3ec
JB
3960 i.vex.bytes[1] = ((~i.rex & 7) << 5)
3961 | (!dot_insn () ? i.tm.opcode_space
3962 : i.insn_opcode_space);
c0f3af97 3963
c0f3af97
L
3964 i.vex.bytes[2] = (w << 7
3965 | register_specifier << 3
3966 | vector_length << 2
35648716 3967 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3968 }
3969}
3970
5b7c81bd 3971static INLINE bool
7a8655d2
JB
3972is_any_vex_encoding (const insn_template *t)
3973{
706ce984 3974 return t->opcode_modifier.vex || t->opcode_modifier.evex;
7a8655d2
JB
3975}
3976
6177c84d
CL
3977/* We can use this function only when the current encoding is evex. */
3978static INLINE bool
3979is_apx_evex_encoding (void)
3980{
dd74a603 3981 return i.rex2 || i.tm.opcode_space == SPACE_EVEXMAP4 || i.has_nf
6177c84d
CL
3982 || (i.vex.register_specifier
3983 && (i.vex.register_specifier->reg_flags & RegRex2));
3984}
3985
80d61d8d
CL
3986static INLINE bool
3987is_apx_rex2_encoding (void)
3988{
ac32c879 3989 return i.rex2 || i.rex2_encoding
3037cefe 3990 || i.tm.opcode_modifier.rex2;
80d61d8d
CL
3991}
3992
a5748e0d
JB
3993static unsigned int
3994get_broadcast_bytes (const insn_template *t, bool diag)
3995{
3996 unsigned int op, bytes;
3997 const i386_operand_type *types;
3998
3999 if (i.broadcast.type)
9b345ce8 4000 return (1 << (t->opcode_modifier.broadcast - 1)) * i.broadcast.type;
a5748e0d
JB
4001
4002 gas_assert (intel_syntax);
4003
4004 for (op = 0; op < t->operands; ++op)
4005 if (t->operand_types[op].bitfield.baseindex)
4006 break;
4007
4008 gas_assert (op < t->operands);
4009
706ce984 4010 if (t->opcode_modifier.evex != EVEXDYN)
a5748e0d
JB
4011 switch (i.broadcast.bytes)
4012 {
4013 case 1:
4014 if (t->operand_types[op].bitfield.word)
4015 return 2;
4016 /* Fall through. */
4017 case 2:
4018 if (t->operand_types[op].bitfield.dword)
4019 return 4;
4020 /* Fall through. */
4021 case 4:
4022 if (t->operand_types[op].bitfield.qword)
4023 return 8;
4024 /* Fall through. */
4025 case 8:
4026 if (t->operand_types[op].bitfield.xmmword)
4027 return 16;
4028 if (t->operand_types[op].bitfield.ymmword)
4029 return 32;
4030 if (t->operand_types[op].bitfield.zmmword)
4031 return 64;
4032 /* Fall through. */
4033 default:
4034 abort ();
4035 }
4036
4037 gas_assert (op + 1 < t->operands);
4038
4039 if (t->operand_types[op + 1].bitfield.xmmword
4040 + t->operand_types[op + 1].bitfield.ymmword
4041 + t->operand_types[op + 1].bitfield.zmmword > 1)
4042 {
4043 types = &i.types[op + 1];
4044 diag = false;
4045 }
4046 else /* Ambiguous - guess with a preference to non-AVX512VL forms. */
4047 types = &t->operand_types[op];
4048
4049 if (types->bitfield.zmmword)
4050 bytes = 64;
4051 else if (types->bitfield.ymmword)
4052 bytes = 32;
4053 else
4054 bytes = 16;
4055
4056 if (diag)
4057 as_warn (_("ambiguous broadcast for `%s', using %u-bit form"),
76d3f746 4058 insn_name (t), bytes * 8);
a5748e0d
JB
4059
4060 return bytes;
4061}
4062
43234a1e
L
4063/* Build the EVEX prefix. */
4064
4065static void
4066build_evex_prefix (void)
4067{
35648716 4068 unsigned int register_specifier, w;
43234a1e
L
4069 rex_byte vrex_used = 0;
4070
4071 /* Check register specifier. */
4072 if (i.vex.register_specifier)
4073 {
4074 gas_assert ((i.vrex & REX_X) == 0);
4075
4076 register_specifier = i.vex.register_specifier->reg_num;
4077 if ((i.vex.register_specifier->reg_flags & RegRex))
4078 register_specifier += 8;
4079 /* The upper 16 registers are encoded in the fourth byte of the
4080 EVEX prefix. */
4081 if (!(i.vex.register_specifier->reg_flags & RegVRex))
4082 i.vex.bytes[3] = 0x8;
4083 register_specifier = ~register_specifier & 0xf;
4084 }
4085 else
4086 {
4087 register_specifier = 0xf;
4088
4089 /* Encode upper 16 vector index register in the fourth byte of
4090 the EVEX prefix. */
4091 if (!(i.vrex & REX_X))
4092 i.vex.bytes[3] = 0x8;
4093 else
4094 vrex_used |= REX_X;
4095 }
4096
43234a1e
L
4097 /* 4 byte EVEX prefix. */
4098 i.vex.length = 4;
4099 i.vex.bytes[0] = 0x62;
4100
43234a1e
L
4101 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
4102 bits from REX. */
ddb62495 4103 gas_assert (i.tm.opcode_space >= SPACE_0F);
5190fa38 4104 gas_assert (i.tm.opcode_space <= SPACE_VEXMAP7);
d0c2e3ec
JB
4105 i.vex.bytes[1] = ((~i.rex & 7) << 5)
4106 | (!dot_insn () ? i.tm.opcode_space
4107 : i.insn_opcode_space);
43234a1e
L
4108
4109 /* The fifth bit of the second EVEX byte is 1's compliment of the
4110 REX_R bit in VREX. */
4111 if (!(i.vrex & REX_R))
4112 i.vex.bytes[1] |= 0x10;
4113 else
4114 vrex_used |= REX_R;
4115
4116 if ((i.reg_operands + i.imm_operands) == i.operands)
4117 {
4118 /* When all operands are registers, the REX_X bit in REX is not
4119 used. We reuse it to encode the upper 16 registers, which is
4120 indicated by the REX_B bit in VREX. The REX_X bit is encoded
4121 as 1's compliment. */
4122 if ((i.vrex & REX_B))
4123 {
4124 vrex_used |= REX_B;
4125 i.vex.bytes[1] &= ~0x40;
4126 }
4127 }
4128
4129 /* EVEX instructions shouldn't need the REX prefix. */
4130 i.vrex &= ~vrex_used;
4131 gas_assert (i.vrex == 0);
4132
6865c043
L
4133 /* Check the REX.W bit and VEXW. */
4134 if (i.tm.opcode_modifier.vexw == VEXWIG)
4135 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
4136 else if (i.tm.opcode_modifier.vexw)
4137 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
4138 else
931d03b7 4139 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e 4140
43234a1e 4141 /* The third byte of the EVEX prefix. */
35648716
JB
4142 i.vex.bytes[2] = ((w << 7)
4143 | (register_specifier << 3)
4144 | 4 /* Encode the U bit. */
4145 | i.tm.opcode_modifier.opcodeprefix);
43234a1e
L
4146
4147 /* The fourth byte of the EVEX prefix. */
4148 /* The zeroing-masking bit. */
6225c532 4149 if (i.mask.reg && i.mask.zeroing)
43234a1e
L
4150 i.vex.bytes[3] |= 0x80;
4151
4152 /* Don't always set the broadcast bit if there is no RC. */
ca5312a2 4153 if (i.rounding.type == rc_none)
43234a1e
L
4154 {
4155 /* Encode the vector length. */
4156 unsigned int vec_length;
4157
706ce984 4158 if (i.tm.opcode_modifier.evex == EVEXDYN)
e771e7c9 4159 {
56522fc5 4160 unsigned int op;
e771e7c9 4161
c7213af9
L
4162 /* Determine vector length from the last multi-length vector
4163 operand. */
56522fc5 4164 for (op = i.operands; op--;)
e771e7c9
JB
4165 if (i.tm.operand_types[op].bitfield.xmmword
4166 + i.tm.operand_types[op].bitfield.ymmword
4167 + i.tm.operand_types[op].bitfield.zmmword > 1)
4168 {
4169 if (i.types[op].bitfield.zmmword)
c7213af9
L
4170 {
4171 i.tm.opcode_modifier.evex = EVEX512;
4172 break;
4173 }
e771e7c9 4174 else if (i.types[op].bitfield.ymmword)
c7213af9
L
4175 {
4176 i.tm.opcode_modifier.evex = EVEX256;
4177 break;
4178 }
e771e7c9 4179 else if (i.types[op].bitfield.xmmword)
c7213af9
L
4180 {
4181 i.tm.opcode_modifier.evex = EVEX128;
4182 break;
4183 }
9b345ce8
JB
4184 else if ((i.broadcast.type || i.broadcast.bytes)
4185 && op == i.broadcast.operand)
625cbd7a 4186 {
a5748e0d 4187 switch (get_broadcast_bytes (&i.tm, true))
625cbd7a
JB
4188 {
4189 case 64:
4190 i.tm.opcode_modifier.evex = EVEX512;
4191 break;
4192 case 32:
4193 i.tm.opcode_modifier.evex = EVEX256;
4194 break;
4195 case 16:
4196 i.tm.opcode_modifier.evex = EVEX128;
4197 break;
4198 default:
c7213af9 4199 abort ();
625cbd7a 4200 }
c7213af9 4201 break;
625cbd7a 4202 }
e771e7c9 4203 }
c7213af9 4204
56522fc5 4205 if (op >= MAX_OPERANDS)
c7213af9 4206 abort ();
e771e7c9
JB
4207 }
4208
43234a1e
L
4209 switch (i.tm.opcode_modifier.evex)
4210 {
4211 case EVEXLIG: /* LL' is ignored */
4212 vec_length = evexlig << 5;
4213 break;
4214 case EVEX128:
4215 vec_length = 0 << 5;
4216 break;
4217 case EVEX256:
4218 vec_length = 1 << 5;
4219 break;
4220 case EVEX512:
4221 vec_length = 2 << 5;
4222 break;
d0c2e3ec
JB
4223 case EVEX_L3:
4224 if (dot_insn ())
4225 {
4226 vec_length = 3 << 5;
4227 break;
4228 }
4229 /* Fall through. */
43234a1e
L
4230 default:
4231 abort ();
4232 break;
4233 }
4234 i.vex.bytes[3] |= vec_length;
4235 /* Encode the broadcast bit. */
9b345ce8 4236 if (i.broadcast.type || i.broadcast.bytes)
43234a1e
L
4237 i.vex.bytes[3] |= 0x10;
4238 }
ca5312a2
JB
4239 else if (i.rounding.type != saeonly)
4240 i.vex.bytes[3] |= 0x10 | (i.rounding.type << 5);
43234a1e 4241 else
ca5312a2 4242 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e 4243
6225c532
JB
4244 if (i.mask.reg)
4245 i.vex.bytes[3] |= i.mask.reg->reg_num;
43234a1e
L
4246}
4247
80d61d8d
CL
4248/* Build (2 bytes) rex2 prefix.
4249 | D5h |
4250 | m | R4 X4 B4 | W R X B |
4251
4252 Rex2 reuses i.vex as they both encode i.tm.opcode_space in their prefixes.
4253 */
4254static void
4255build_rex2_prefix (void)
4256{
4257 i.vex.length = 2;
4258 i.vex.bytes[0] = 0xd5;
4259 /* For the W R X B bits, the variables of rex prefix will be reused. */
4260 i.vex.bytes[1] = ((i.tm.opcode_space << 7)
4261 | (i.rex2 << 4) | i.rex);
4262}
4263
6177c84d
CL
4264/* Build the EVEX prefix (4-byte) for evex insn
4265 | 62h |
4266 | `R`X`B`R' | B'mmm |
4267 | W | v`v`v`v | `x' | pp |
4268 | z| L'L | b | `v | aaa |
4269*/
4270static void
4271build_apx_evex_prefix (void)
4272{
4273 build_evex_prefix ();
4274 if (i.rex2 & REX_R)
4275 i.vex.bytes[1] &= ~0x10;
4276 if (i.rex2 & REX_B)
4277 i.vex.bytes[1] |= 0x08;
4278 if (i.rex2 & REX_X)
4279 i.vex.bytes[2] &= ~0x04;
4280 if (i.vex.register_specifier
4281 && i.vex.register_specifier->reg_flags & RegRex2)
4282 i.vex.bytes[3] &= ~0x08;
3083f376 4283
4284 /* Encode the NDD bit of the instruction promoted from the legacy
4285 space. */
4286 if (i.vex.register_specifier && i.tm.opcode_space == SPACE_EVEXMAP4)
4287 i.vex.bytes[3] |= 0x10;
dd74a603
CL
4288
4289 /* Encode the NF bit. */
4290 if (i.has_nf)
4291 i.vex.bytes[3] |= 0x04;
6177c84d
CL
4292}
4293
ce705688
JB
4294static void establish_rex (void)
4295{
4296 /* Note that legacy encodings have at most 2 non-immediate operands. */
4297 unsigned int first = i.imm_operands;
4298 unsigned int last = i.operands > first ? i.operands - first - 1 : first;
4299
4300 /* Respect a user-specified REX prefix. */
4301 i.rex |= i.prefix[REX_PREFIX] & REX_OPCODE;
4302
4303 /* For 8 bit registers we need an empty rex prefix. Also if the
4304 instruction already has a prefix, we need to convert old
4305 registers to new ones. */
4306
4307 if ((i.types[first].bitfield.class == Reg && i.types[first].bitfield.byte
80d61d8d
CL
4308 && ((i.op[first].regs->reg_flags & RegRex64) != 0 || i.rex != 0
4309 || i.rex2 != 0))
ce705688 4310 || (i.types[last].bitfield.class == Reg && i.types[last].bitfield.byte
80d61d8d
CL
4311 && ((i.op[last].regs->reg_flags & RegRex64) != 0 || i.rex != 0
4312 || i.rex2 != 0)))
ce705688
JB
4313 {
4314 unsigned int x;
4315
80d61d8d
CL
4316 if (!is_apx_rex2_encoding () && !is_any_vex_encoding(&i.tm))
4317 i.rex |= REX_OPCODE;
ce705688
JB
4318 for (x = first; x <= last; x++)
4319 {
4320 /* Look for 8 bit operand that uses old registers. */
4321 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
4322 && (i.op[x].regs->reg_flags & RegRex64) == 0)
4323 {
4324 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
4325 /* In case it is "hi" register, give up. */
4326 if (i.op[x].regs->reg_num > 3)
4327 as_bad (_("can't encode register '%s%s' in an "
80d61d8d 4328 "instruction requiring REX/REX2 prefix"),
ce705688
JB
4329 register_prefix, i.op[x].regs->reg_name);
4330
4331 /* Otherwise it is equivalent to the extended register.
4332 Since the encoding doesn't change this is merely
4333 cosmetic cleanup for debug output. */
4334 i.op[x].regs += 8;
4335 }
4336 }
4337 }
4338
192781a3 4339 if (i.rex == 0 && i.rex2 == 0 && (i.rex_encoding || i.rex2_encoding))
ce705688
JB
4340 {
4341 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
4342 that uses legacy register. If it is "hi" register, don't add
80d61d8d 4343 rex and rex2 prefix. */
ce705688
JB
4344 unsigned int x;
4345
4346 for (x = first; x <= last; x++)
4347 if (i.types[x].bitfield.class == Reg
4348 && i.types[x].bitfield.byte
4349 && (i.op[x].regs->reg_flags & RegRex64) == 0
4350 && i.op[x].regs->reg_num > 3)
4351 {
4352 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
4353 i.rex_encoding = false;
80d61d8d 4354 i.rex2_encoding = false;
ce705688
JB
4355 break;
4356 }
4357
4358 if (i.rex_encoding)
4359 i.rex = REX_OPCODE;
4360 }
4361
192781a3
CL
4362 if (is_apx_rex2_encoding ())
4363 {
4364 build_rex2_prefix ();
4365 /* The individual REX.RXBW bits got consumed. */
4366 i.rex &= REX_OPCODE;
4367 }
4368 else if (i.rex != 0)
4369 add_prefix (REX_OPCODE | i.rex);
ce705688
JB
4370}
4371
65da13b5
L
4372static void
4373process_immext (void)
4374{
4375 expressionS *exp;
4376
c0f3af97 4377 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
4378 which is coded in the same place as an 8-bit immediate field
4379 would be. Here we fake an 8-bit immediate operand from the
4380 opcode suffix stored in tm.extension_opcode.
4381
c1e679ec 4382 AVX instructions also use this encoding, for some of
c0f3af97 4383 3 argument instructions. */
65da13b5 4384
43234a1e 4385 gas_assert (i.imm_operands <= 1
7ab9ffdd 4386 && (i.operands <= 2
7a8655d2 4387 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4388 && i.operands <= 4)));
65da13b5
L
4389
4390 exp = &im_expressions[i.imm_operands++];
4391 i.op[i.operands].imms = exp;
be1643ff 4392 i.types[i.operands].bitfield.imm8 = 1;
65da13b5
L
4393 i.operands++;
4394 exp->X_op = O_constant;
4395 exp->X_add_number = i.tm.extension_opcode;
4396 i.tm.extension_opcode = None;
4397}
4398
42164a71
L
4399
4400static int
4401check_hle (void)
4402{
742732c7 4403 switch (i.tm.opcode_modifier.prefixok)
42164a71
L
4404 {
4405 default:
4406 abort ();
742732c7
JB
4407 case PrefixLock:
4408 case PrefixNone:
4409 case PrefixNoTrack:
4410 case PrefixRep:
165de32a 4411 as_bad (_("invalid instruction `%s' after `%s'"),
76d3f746 4412 insn_name (&i.tm), i.hle_prefix);
42164a71 4413 return 0;
742732c7 4414 case PrefixHLELock:
42164a71
L
4415 if (i.prefix[LOCK_PREFIX])
4416 return 1;
165de32a 4417 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4418 return 0;
742732c7 4419 case PrefixHLEAny:
42164a71 4420 return 1;
742732c7 4421 case PrefixHLERelease:
42164a71
L
4422 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4423 {
4424 as_bad (_("instruction `%s' after `xacquire' not allowed"),
76d3f746 4425 insn_name (&i.tm));
42164a71
L
4426 return 0;
4427 }
8dc0818e 4428 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4429 {
4430 as_bad (_("memory destination needed for instruction `%s'"
76d3f746 4431 " after `xrelease'"), insn_name (&i.tm));
42164a71
L
4432 return 0;
4433 }
4434 return 1;
4435 }
4436}
4437
c8480b58
L
4438/* Encode aligned vector move as unaligned vector move. */
4439
4440static void
4441encode_with_unaligned_vector_move (void)
4442{
4443 switch (i.tm.base_opcode)
4444 {
b3a9fe6f
L
4445 case 0x28: /* Load instructions. */
4446 case 0x29: /* Store instructions. */
c8480b58 4447 /* movaps/movapd/vmovaps/vmovapd. */
ddb62495 4448 if (i.tm.opcode_space == SPACE_0F
c8480b58 4449 && i.tm.opcode_modifier.opcodeprefix <= PREFIX_0X66)
b3a9fe6f 4450 i.tm.base_opcode = 0x10 | (i.tm.base_opcode & 1);
c8480b58 4451 break;
b3a9fe6f
L
4452 case 0x6f: /* Load instructions. */
4453 case 0x7f: /* Store instructions. */
c8480b58 4454 /* movdqa/vmovdqa/vmovdqa64/vmovdqa32. */
ddb62495 4455 if (i.tm.opcode_space == SPACE_0F
c8480b58
L
4456 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0X66)
4457 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
4458 break;
4459 default:
4460 break;
4461 }
4462}
4463
b6f8c7c4
L
4464/* Try the shortest encoding by shortening operand size. */
4465
4466static void
4467optimize_encoding (void)
4468{
a0a1771e 4469 unsigned int j;
b6f8c7c4 4470
7fc69528 4471 if (i.tm.mnem_off == MN_lea)
fe134c65
JB
4472 {
4473 /* Optimize: -O:
4474 lea symbol, %rN -> mov $symbol, %rN
4475 lea (%rM), %rN -> mov %rM, %rN
4476 lea (,%rM,1), %rN -> mov %rM, %rN
4477
4478 and in 32-bit mode for 16-bit addressing
4479
4480 lea (%rM), %rN -> movzx %rM, %rN
4481
4482 and in 64-bit mode zap 32-bit addressing in favor of using a
4483 32-bit (or less) destination.
4484 */
4485 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4486 {
4487 if (!i.op[1].regs->reg_type.bitfield.word)
4488 i.tm.opcode_modifier.size = SIZE32;
4489 i.prefix[ADDR_PREFIX] = 0;
4490 }
4491
4492 if (!i.index_reg && !i.base_reg)
4493 {
4494 /* Handle:
4495 lea symbol, %rN -> mov $symbol, %rN
4496 */
4497 if (flag_code == CODE_64BIT)
4498 {
4499 /* Don't transform a relocation to a 16-bit one. */
4500 if (i.op[0].disps
4501 && i.op[0].disps->X_op != O_constant
4502 && i.op[1].regs->reg_type.bitfield.word)
4503 return;
4504
4505 if (!i.op[1].regs->reg_type.bitfield.qword
4506 || i.tm.opcode_modifier.size == SIZE32)
4507 {
4508 i.tm.base_opcode = 0xb8;
4509 i.tm.opcode_modifier.modrm = 0;
4510 if (!i.op[1].regs->reg_type.bitfield.word)
4511 i.types[0].bitfield.imm32 = 1;
4512 else
4513 {
4514 i.tm.opcode_modifier.size = SIZE16;
4515 i.types[0].bitfield.imm16 = 1;
4516 }
4517 }
4518 else
4519 {
4520 /* Subject to further optimization below. */
4521 i.tm.base_opcode = 0xc7;
4522 i.tm.extension_opcode = 0;
4523 i.types[0].bitfield.imm32s = 1;
4524 i.types[0].bitfield.baseindex = 0;
4525 }
4526 }
4527 /* Outside of 64-bit mode address and operand sizes have to match if
4528 a relocation is involved, as otherwise we wouldn't (currently) or
4529 even couldn't express the relocation correctly. */
4530 else if (i.op[0].disps
4531 && i.op[0].disps->X_op != O_constant
4532 && ((!i.prefix[ADDR_PREFIX])
4533 != (flag_code == CODE_32BIT
4534 ? i.op[1].regs->reg_type.bitfield.dword
4535 : i.op[1].regs->reg_type.bitfield.word)))
4536 return;
7772f168
JB
4537 /* In 16-bit mode converting LEA with 16-bit addressing and a 32-bit
4538 destination is going to grow encoding size. */
4539 else if (flag_code == CODE_16BIT
4540 && (optimize <= 1 || optimize_for_space)
4541 && !i.prefix[ADDR_PREFIX]
4542 && i.op[1].regs->reg_type.bitfield.dword)
4543 return;
fe134c65
JB
4544 else
4545 {
4546 i.tm.base_opcode = 0xb8;
4547 i.tm.opcode_modifier.modrm = 0;
4548 if (i.op[1].regs->reg_type.bitfield.dword)
4549 i.types[0].bitfield.imm32 = 1;
4550 else
4551 i.types[0].bitfield.imm16 = 1;
4552
4553 if (i.op[0].disps
4554 && i.op[0].disps->X_op == O_constant
4555 && i.op[1].regs->reg_type.bitfield.dword
60cfa10c
L
4556 /* NB: Add () to !i.prefix[ADDR_PREFIX] to silence
4557 GCC 5. */
4558 && (!i.prefix[ADDR_PREFIX]) != (flag_code == CODE_32BIT))
fe134c65
JB
4559 i.op[0].disps->X_add_number &= 0xffff;
4560 }
4561
4562 i.tm.operand_types[0] = i.types[0];
4563 i.imm_operands = 1;
4564 if (!i.op[0].imms)
4565 {
4566 i.op[0].imms = &im_expressions[0];
4567 i.op[0].imms->X_op = O_absent;
4568 }
4569 }
4570 else if (i.op[0].disps
4571 && (i.op[0].disps->X_op != O_constant
4572 || i.op[0].disps->X_add_number))
4573 return;
4574 else
4575 {
4576 /* Handle:
4577 lea (%rM), %rN -> mov %rM, %rN
4578 lea (,%rM,1), %rN -> mov %rM, %rN
4579 lea (%rM), %rN -> movzx %rM, %rN
4580 */
4581 const reg_entry *addr_reg;
4582
4583 if (!i.index_reg && i.base_reg->reg_num != RegIP)
4584 addr_reg = i.base_reg;
4585 else if (!i.base_reg
4586 && i.index_reg->reg_num != RegIZ
4587 && !i.log2_scale_factor)
4588 addr_reg = i.index_reg;
4589 else
4590 return;
4591
4592 if (addr_reg->reg_type.bitfield.word
4593 && i.op[1].regs->reg_type.bitfield.dword)
4594 {
4595 if (flag_code != CODE_32BIT)
4596 return;
ddb62495 4597 i.tm.opcode_space = SPACE_0F;
fe134c65
JB
4598 i.tm.base_opcode = 0xb7;
4599 }
4600 else
4601 i.tm.base_opcode = 0x8b;
4602
4603 if (addr_reg->reg_type.bitfield.dword
4604 && i.op[1].regs->reg_type.bitfield.qword)
4605 i.tm.opcode_modifier.size = SIZE32;
4606
4607 i.op[0].regs = addr_reg;
4608 i.reg_operands = 2;
4609 }
4610
4611 i.mem_operands = 0;
4612 i.disp_operands = 0;
4613 i.prefix[ADDR_PREFIX] = 0;
4614 i.prefix[SEG_PREFIX] = 0;
4615 i.seg[0] = NULL;
4616 }
4617
b6f8c7c4 4618 if (optimize_for_space
7fc69528 4619 && i.tm.mnem_off == MN_test
b6f8c7c4
L
4620 && i.reg_operands == 1
4621 && i.imm_operands == 1
4622 && !i.types[1].bitfield.byte
4623 && i.op[0].imms->X_op == O_constant
7fc69528 4624 && fits_in_imm7 (i.op[0].imms->X_add_number))
b6f8c7c4
L
4625 {
4626 /* Optimize: -Os:
4627 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4628 */
4629 unsigned int base_regnum = i.op[1].regs->reg_num;
4630 if (flag_code == CODE_64BIT || base_regnum < 4)
4631 {
4632 i.types[1].bitfield.byte = 1;
4633 /* Ignore the suffix. */
4634 i.suffix = 0;
80d61d8d
CL
4635 /* Convert to byte registers. 8-bit registers are special,
4636 RegRex64 and non-RegRex64 each have 8 registers. */
7697afb6 4637 if (i.types[1].bitfield.word)
80d61d8d 4638 /* 32 (or 40) 8-bit registers. */
7697afb6 4639 j = 32;
80d61d8d
CL
4640 else if (i.types[1].bitfield.dword)
4641 /* 32 (or 40) 8-bit registers + 32 16-bit registers. */
4642 j = 64;
7697afb6 4643 else
80d61d8d
CL
4644 /* 32 (or 40) 8-bit registers + 32 16-bit registers
4645 + 32 32-bit registers. */
4646 j = 96;
4647
4648 /* In 64-bit mode, the following byte registers cannot be accessed
4649 if using the Rex and Rex2 prefix: AH, BH, CH, DH */
4650 if (!(i.op[1].regs->reg_flags & (RegRex | RegRex2)) && base_regnum < 4)
7697afb6
JB
4651 j += 8;
4652 i.op[1].regs -= j;
b6f8c7c4
L
4653 }
4654 }
4655 else if (flag_code == CODE_64BIT
ddb62495 4656 && i.tm.opcode_space == SPACE_BASE
d3d50934
L
4657 && ((i.types[1].bitfield.qword
4658 && i.reg_operands == 1
b6f8c7c4
L
4659 && i.imm_operands == 1
4660 && i.op[0].imms->X_op == O_constant
507916b8 4661 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4662 && i.tm.extension_opcode == None
4663 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4664 || (fits_in_imm31 (i.op[0].imms->X_add_number)
7fc69528 4665 && (i.tm.base_opcode == 0x24
b6f8c7c4
L
4666 || (i.tm.base_opcode == 0x80
4667 && i.tm.extension_opcode == 0x4)
7fc69528
JB
4668 || i.tm.mnem_off == MN_test
4669 || ((i.tm.base_opcode | 1) == 0xc7
b8364fa7
JB
4670 && i.tm.extension_opcode == 0x0)))
4671 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4672 && i.tm.base_opcode == 0x83
4673 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4674 || (i.types[0].bitfield.qword
4675 && ((i.reg_operands == 2
4676 && i.op[0].regs == i.op[1].regs
7fc69528
JB
4677 && (i.tm.mnem_off == MN_xor
4678 || i.tm.mnem_off == MN_sub))
4679 || i.tm.mnem_off == MN_clr))))
b6f8c7c4
L
4680 {
4681 /* Optimize: -O:
4682 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4683 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4684 testq $imm31, %r64 -> testl $imm31, %r32
4685 xorq %r64, %r64 -> xorl %r32, %r32
4686 subq %r64, %r64 -> subl %r32, %r32
4687 movq $imm31, %r64 -> movl $imm31, %r32
4688 movq $imm32, %r64 -> movl $imm32, %r32
4689 */
04784e33
JB
4690 i.tm.opcode_modifier.size = SIZE32;
4691 if (i.imm_operands)
4692 {
4693 i.types[0].bitfield.imm32 = 1;
4694 i.types[0].bitfield.imm32s = 0;
4695 i.types[0].bitfield.imm64 = 0;
4696 }
4697 else
4698 {
4699 i.types[0].bitfield.dword = 1;
4700 i.types[0].bitfield.qword = 0;
4701 }
4702 i.types[1].bitfield.dword = 1;
4703 i.types[1].bitfield.qword = 0;
7fc69528 4704 if (i.tm.mnem_off == MN_mov || i.tm.mnem_off == MN_lea)
b6f8c7c4
L
4705 {
4706 /* Handle
4707 movq $imm31, %r64 -> movl $imm31, %r32
4708 movq $imm32, %r64 -> movl $imm32, %r32
4709 */
4710 i.tm.operand_types[0].bitfield.imm32 = 1;
4711 i.tm.operand_types[0].bitfield.imm32s = 0;
4712 i.tm.operand_types[0].bitfield.imm64 = 0;
507916b8 4713 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4714 {
4715 /* Handle
4716 movq $imm31, %r64 -> movl $imm31, %r32
4717 */
507916b8 4718 i.tm.base_opcode = 0xb8;
b6f8c7c4 4719 i.tm.extension_opcode = None;
507916b8 4720 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4721 i.tm.opcode_modifier.modrm = 0;
4722 }
4723 }
4724 }
c73a37b2
JB
4725 else if (i.reg_operands == 3
4726 && i.op[0].regs == i.op[1].regs
4727 && i.encoding != encoding_evex
4728 && (i.tm.mnem_off == MN_xor
4729 || i.tm.mnem_off == MN_sub))
4730 {
4731 /* Optimize: -O:
4732 xorb %rNb, %rNb, %rMb -> xorl %rMd, %rMd
4733 xorw %rNw, %rNw, %rMw -> xorl %rMd, %rMd
4734 xorl %rNd, %rNd, %rMd -> xorl %rMd, %rMd
4735 xorq %rN, %rN, %rM -> xorl %rMd, %rMd
4736 subb %rNb, %rNb, %rMb -> subl %rMd, %rMd
4737 subw %rNw, %rNw, %rMw -> subl %rMd, %rMd
4738 subl %rNd, %rNd, %rMd -> subl %rMd, %rMd
4739 subq %rN, %rN, %rM -> subl %rMd, %rMd
4740 */
4741 i.tm.opcode_space = SPACE_BASE;
4742 i.tm.opcode_modifier.evex = 0;
4743 i.tm.opcode_modifier.size = SIZE32;
4744 i.types[0].bitfield.byte = 0;
4745 i.types[0].bitfield.word = 0;
4746 i.types[0].bitfield.dword = 1;
4747 i.types[0].bitfield.qword = 0;
4748 i.op[0].regs = i.op[2].regs;
4749 i.types[1] = i.types[0];
4750 i.op[1].regs = i.op[2].regs;
4751 i.reg_operands = 2;
4752 }
5641ec01
JB
4753 else if (optimize > 1
4754 && !optimize_for_space
4755 && i.reg_operands == 2
4756 && i.op[0].regs == i.op[1].regs
7fc69528 4757 && (i.tm.mnem_off == MN_and || i.tm.mnem_off == MN_or)
5641ec01
JB
4758 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4759 {
4760 /* Optimize: -O2:
4761 andb %rN, %rN -> testb %rN, %rN
4762 andw %rN, %rN -> testw %rN, %rN
4763 andq %rN, %rN -> testq %rN, %rN
4764 orb %rN, %rN -> testb %rN, %rN
4765 orw %rN, %rN -> testw %rN, %rN
4766 orq %rN, %rN -> testq %rN, %rN
4767
4768 and outside of 64-bit mode
4769
4770 andl %rN, %rN -> testl %rN, %rN
4771 orl %rN, %rN -> testl %rN, %rN
4772 */
4773 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4774 }
ad2f4436
JB
4775 else if (i.tm.base_opcode == 0xba
4776 && i.tm.opcode_space == SPACE_0F
4777 && i.reg_operands == 1
4778 && i.op[0].imms->X_op == O_constant
4779 && i.op[0].imms->X_add_number >= 0)
4780 {
4781 /* Optimize: -O:
4782 btw $n, %rN -> btl $n, %rN (outside of 16-bit mode, n < 16)
4783 btq $n, %rN -> btl $n, %rN (in 64-bit mode, n < 32, N < 8)
4784 btl $n, %rN -> btw $n, %rN (in 16-bit mode, n < 16)
4785
4786 With <BT> one of bts, btr, and bts also:
4787 <BT>w $n, %rN -> btl $n, %rN (in 32-bit mode, n < 16)
4788 <BT>l $n, %rN -> btw $n, %rN (in 16-bit mode, n < 16)
4789 */
4790 switch (flag_code)
4791 {
4792 case CODE_64BIT:
4793 if (i.tm.extension_opcode != 4)
4794 break;
4795 if (i.types[1].bitfield.qword
4796 && i.op[0].imms->X_add_number < 32
4797 && !(i.op[1].regs->reg_flags & RegRex))
4798 i.tm.opcode_modifier.size = SIZE32;
4799 /* Fall through. */
4800 case CODE_32BIT:
4801 if (i.types[1].bitfield.word
4802 && i.op[0].imms->X_add_number < 16)
4803 i.tm.opcode_modifier.size = SIZE32;
4804 break;
4805 case CODE_16BIT:
4806 if (i.op[0].imms->X_add_number < 16)
4807 i.tm.opcode_modifier.size = SIZE16;
4808 break;
4809 }
4810 }
99112332 4811 else if (i.reg_operands == 3
b6f8c7c4
L
4812 && i.op[0].regs == i.op[1].regs
4813 && !i.types[2].bitfield.xmmword
4814 && (i.tm.opcode_modifier.vex
6225c532 4815 || ((!i.mask.reg || i.mask.zeroing)
706ce984 4816 && i.tm.opcode_modifier.evex
e346d50a 4817 && (i.encoding != encoding_evex
dd22218c 4818 || cpu_arch_isa_flags.bitfield.cpuavx512vl
734dfd1c 4819 || is_cpu (&i.tm, CpuAVX512VL)
7091c612 4820 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4821 && i.types[2].bitfield.ymmword))))
ddb62495 4822 && i.tm.opcode_space == SPACE_0F
5844ccaa
JB
4823 && ((i.tm.base_opcode | 2) == 0x57
4824 || i.tm.base_opcode == 0xdf
4825 || i.tm.base_opcode == 0xef
4826 || (i.tm.base_opcode | 3) == 0xfb
4827 || i.tm.base_opcode == 0x42
4828 || i.tm.base_opcode == 0x47))
b6f8c7c4 4829 {
99112332 4830 /* Optimize: -O1:
8305403a
L
4831 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4832 vpsubq and vpsubw:
b6f8c7c4
L
4833 EVEX VOP %zmmM, %zmmM, %zmmN
4834 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4835 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4836 EVEX VOP %ymmM, %ymmM, %ymmN
4837 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4838 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4839 VEX VOP %ymmM, %ymmM, %ymmN
4840 -> VEX VOP %xmmM, %xmmM, %xmmN
4841 VOP, one of vpandn and vpxor:
4842 VEX VOP %ymmM, %ymmM, %ymmN
4843 -> VEX VOP %xmmM, %xmmM, %xmmN
4844 VOP, one of vpandnd and vpandnq:
4845 EVEX VOP %zmmM, %zmmM, %zmmN
4846 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4847 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4848 EVEX VOP %ymmM, %ymmM, %ymmN
4849 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4850 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4851 VOP, one of vpxord and vpxorq:
4852 EVEX VOP %zmmM, %zmmM, %zmmN
4853 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4854 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4855 EVEX VOP %ymmM, %ymmM, %ymmN
4856 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4857 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4858 VOP, one of kxord and kxorq:
4859 VEX VOP %kM, %kM, %kN
4860 -> VEX kxorw %kM, %kM, %kN
4861 VOP, one of kandnd and kandnq:
4862 VEX VOP %kM, %kM, %kN
4863 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4864 */
706ce984 4865 if (i.tm.opcode_modifier.evex)
b6f8c7c4 4866 {
e346d50a 4867 if (i.encoding != encoding_evex)
b6f8c7c4
L
4868 {
4869 i.tm.opcode_modifier.vex = VEX128;
4870 i.tm.opcode_modifier.vexw = VEXW0;
4871 i.tm.opcode_modifier.evex = 0;
e346d50a 4872 i.encoding = encoding_vex;
a6f3add0 4873 i.mask.reg = NULL;
b6f8c7c4 4874 }
7b1d7ca1 4875 else if (optimize > 1)
dd22218c
L
4876 i.tm.opcode_modifier.evex = EVEX128;
4877 else
4878 return;
b6f8c7c4 4879 }
f74a6307 4880 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86 4881 {
35648716 4882 i.tm.opcode_modifier.opcodeprefix = PREFIX_NONE;
1424ad86
JB
4883 i.tm.opcode_modifier.vexw = VEXW0;
4884 }
b6f8c7c4
L
4885 else
4886 i.tm.opcode_modifier.vex = VEX128;
4887
4888 if (i.tm.opcode_modifier.vex)
4889 for (j = 0; j < 3; j++)
4890 {
4891 i.types[j].bitfield.xmmword = 1;
4892 i.types[j].bitfield.ymmword = 0;
4893 }
4894 }
e346d50a 4895 else if (i.encoding != encoding_evex
eb3f3841 4896 && i.encoding != encoding_egpr
97ed31ae 4897 && !i.types[0].bitfield.zmmword
392a5972 4898 && !i.types[1].bitfield.zmmword
6225c532 4899 && !i.mask.reg
9b345ce8 4900 && !i.broadcast.type
a5748e0d 4901 && !i.broadcast.bytes
706ce984 4902 && i.tm.opcode_modifier.evex
35648716
JB
4903 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4904 || (i.tm.base_opcode & ~4) == 0xdb
4905 || (i.tm.base_opcode & ~4) == 0xeb)
97ed31ae
L
4906 && i.tm.extension_opcode == None)
4907 {
4908 /* Optimize: -O1:
4909 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4910 vmovdqu32 and vmovdqu64:
4911 EVEX VOP %xmmM, %xmmN
4912 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4913 EVEX VOP %ymmM, %ymmN
4914 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4915 EVEX VOP %xmmM, mem
4916 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4917 EVEX VOP %ymmM, mem
4918 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4919 EVEX VOP mem, %xmmN
4920 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4921 EVEX VOP mem, %ymmN
4922 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4923 VOP, one of vpand, vpandn, vpor, vpxor:
4924 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4925 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4926 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4927 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4928 EVEX VOP{d,q} mem, %xmmM, %xmmN
4929 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4930 EVEX VOP{d,q} mem, %ymmM, %ymmN
4931 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4932 */
a0a1771e 4933 for (j = 0; j < i.operands; j++)
392a5972
L
4934 if (operand_type_check (i.types[j], disp)
4935 && i.op[j].disps->X_op == O_constant)
4936 {
4937 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4938 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4939 bytes, we choose EVEX Disp8 over VEX Disp32. */
4940 int evex_disp8, vex_disp8;
4941 unsigned int memshift = i.memshift;
4942 offsetT n = i.op[j].disps->X_add_number;
4943
4944 evex_disp8 = fits_in_disp8 (n);
4945 i.memshift = 0;
4946 vex_disp8 = fits_in_disp8 (n);
4947 if (evex_disp8 != vex_disp8)
4948 {
4949 i.memshift = memshift;
4950 return;
4951 }
4952
4953 i.types[j].bitfield.disp8 = vex_disp8;
4954 break;
4955 }
35648716
JB
4956 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4957 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2)
4958 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
97ed31ae
L
4959 i.tm.opcode_modifier.vex
4960 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4961 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7 4962 /* VPAND, VPOR, and VPXOR are commutative. */
35648716 4963 if (i.reg_operands == 3 && i.tm.base_opcode != 0xdf)
79dec6b7 4964 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4965 i.tm.opcode_modifier.evex = 0;
4966 i.tm.opcode_modifier.masking = 0;
a0a1771e 4967 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4968 i.tm.opcode_modifier.disp8memshift = 0;
4969 i.memshift = 0;
a0a1771e
JB
4970 if (j < i.operands)
4971 i.types[j].bitfield.disp8
4972 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4973 }
b5c37946
SJ
4974 else if (optimize_for_space
4975 && i.tm.base_opcode == 0x29
4976 && i.tm.opcode_space == SPACE_0F38
4977 && i.operands == i.reg_operands
4978 && i.op[0].regs == i.op[1].regs
4979 && (!i.tm.opcode_modifier.vex
4980 || !(i.op[0].regs->reg_flags & RegRex))
706ce984 4981 && !i.tm.opcode_modifier.evex)
b5c37946
SJ
4982 {
4983 /* Optimize: -Os:
4984 pcmpeqq %xmmN, %xmmN -> pcmpeqd %xmmN, %xmmN
4985 vpcmpeqq %xmmN, %xmmN, %xmmM -> vpcmpeqd %xmmN, %xmmN, %xmmM (N < 8)
4986 vpcmpeqq %ymmN, %ymmN, %ymmM -> vpcmpeqd %ymmN, %ymmN, %ymmM (N < 8)
4987 */
4988 i.tm.opcode_space = SPACE_0F;
4989 i.tm.base_opcode = 0x76;
4990 }
4991 else if (((i.tm.base_opcode >= 0x64
4992 && i.tm.base_opcode <= 0x66
4993 && i.tm.opcode_space == SPACE_0F)
4994 || (i.tm.base_opcode == 0x37
4995 && i.tm.opcode_space == SPACE_0F38))
4996 && i.operands == i.reg_operands
4997 && i.op[0].regs == i.op[1].regs
706ce984 4998 && !i.tm.opcode_modifier.evex)
b5c37946
SJ
4999 {
5000 /* Optimize: -O:
5001 pcmpgt[bwd] %mmN, %mmN -> pxor %mmN, %mmN
5002 pcmpgt[bwdq] %xmmN, %xmmN -> pxor %xmmN, %xmmN
5003 vpcmpgt[bwdq] %xmmN, %xmmN, %xmmM -> vpxor %xmmN, %xmmN, %xmmM (N < 8)
5004 vpcmpgt[bwdq] %xmmN, %xmmN, %xmmM -> vpxor %xmm0, %xmm0, %xmmM (N > 7)
5005 vpcmpgt[bwdq] %ymmN, %ymmN, %ymmM -> vpxor %ymmN, %ymmN, %ymmM (N < 8)
5006 vpcmpgt[bwdq] %ymmN, %ymmN, %ymmM -> vpxor %ymm0, %ymm0, %ymmM (N > 7)
5007 */
5008 i.tm.opcode_space = SPACE_0F;
5009 i.tm.base_opcode = 0xef;
5010 if (i.tm.opcode_modifier.vex && (i.op[0].regs->reg_flags & RegRex))
5011 {
5012 if (i.operands == 2)
5013 {
5014 gas_assert (i.tm.opcode_modifier.sse2avx);
5015
5016 i.operands = 3;
5017 i.reg_operands = 3;
5018 i.tm.operands = 3;
5019
5020 i.op[2].regs = i.op[0].regs;
5021 i.types[2] = i.types[0];
5022 i.flags[2] = i.flags[0];
5023 i.tm.operand_types[2] = i.tm.operand_types[0];
5024
5025 i.tm.opcode_modifier.sse2avx = 0;
5026 }
5027 i.op[0].regs -= i.op[0].regs->reg_num + 8;
5028 i.op[1].regs = i.op[0].regs;
5029 }
5030 }
5031 else if (optimize_for_space
5032 && i.tm.base_opcode == 0x59
5033 && i.tm.opcode_space == SPACE_0F38
5034 && i.operands == i.reg_operands
5035 && i.tm.opcode_modifier.vex
5036 && !(i.op[0].regs->reg_flags & RegRex)
5037 && i.op[0].regs->reg_type.bitfield.xmmword
e346d50a 5038 && i.encoding != encoding_vex3)
b5c37946
SJ
5039 {
5040 /* Optimize: -Os:
5041 vpbroadcastq %xmmN, %xmmM -> vpunpcklqdq %xmmN, %xmmN, %xmmM (N < 8)
5042 */
5043 i.tm.opcode_space = SPACE_0F;
5044 i.tm.base_opcode = 0x6c;
5045 i.tm.opcode_modifier.vexvvvv = 1;
5046
5047 ++i.operands;
5048 ++i.reg_operands;
5049 ++i.tm.operands;
5050
5051 i.op[2].regs = i.op[0].regs;
5052 i.types[2] = i.types[0];
5053 i.flags[2] = i.flags[0];
5054 i.tm.operand_types[2] = i.tm.operand_types[0];
5055
5056 swap_2_operands (1, 2);
5057 }
b6f8c7c4
L
5058}
5059
1e7dd4a0
JB
5060static void
5061s_noopt (int dummy ATTRIBUTE_UNUSED)
5062{
5063 if (!is_it_end_of_statement ())
5064 as_warn (_("`.noopt' arguments ignored"));
5065
5066 optimize = 0;
5067 optimize_for_space = 0;
5068
5069 ignore_rest_of_line ();
5070}
5071
ae531041
L
5072/* Return non-zero for load instruction. */
5073
5074static int
5075load_insn_p (void)
5076{
5077 unsigned int dest;
5078 int any_vex_p = is_any_vex_encoding (&i.tm);
5079 unsigned int base_opcode = i.tm.base_opcode | 1;
5080
5081 if (!any_vex_p)
5082 {
ef07be45
CL
5083 /* Anysize insns: lea, invlpg, clflush, prefetch*, bndmk, bndcl, bndcu,
5084 bndcn, bndstx, bndldx, clflushopt, clwb, cldemote. */
255571cd 5085 if (i.tm.opcode_modifier.operandconstraint == ANY_SIZE)
ae531041
L
5086 return 0;
5087
389d00a5 5088 /* pop. */
6d86a545 5089 if (i.tm.mnem_off == MN_pop)
389d00a5
JB
5090 return 1;
5091 }
5092
ddb62495 5093 if (i.tm.opcode_space == SPACE_BASE)
389d00a5
JB
5094 {
5095 /* popf, popa. */
5096 if (i.tm.base_opcode == 0x9d
a09f656b 5097 || i.tm.base_opcode == 0x61)
ae531041
L
5098 return 1;
5099
5100 /* movs, cmps, lods, scas. */
5101 if ((i.tm.base_opcode | 0xb) == 0xaf)
5102 return 1;
5103
a09f656b 5104 /* outs, xlatb. */
5105 if (base_opcode == 0x6f
5106 || i.tm.base_opcode == 0xd7)
ae531041 5107 return 1;
a09f656b 5108 /* NB: For AMD-specific insns with implicit memory operands,
5109 they're intentionally not covered. */
ae531041
L
5110 }
5111
5112 /* No memory operand. */
5113 if (!i.mem_operands)
5114 return 0;
5115
5116 if (any_vex_p)
5117 {
7fc69528 5118 if (i.tm.mnem_off == MN_vldmxcsr)
ae531041
L
5119 return 1;
5120 }
ddb62495 5121 else if (i.tm.opcode_space == SPACE_BASE)
ae531041
L
5122 {
5123 /* test, not, neg, mul, imul, div, idiv. */
aa4c197d 5124 if (base_opcode == 0xf7 && i.tm.extension_opcode != 1)
ae531041
L
5125 return 1;
5126
5127 /* inc, dec. */
5128 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
5129 return 1;
5130
5131 /* add, or, adc, sbb, and, sub, xor, cmp. */
5132 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
5133 return 1;
5134
ae531041 5135 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
aa4c197d 5136 if ((base_opcode == 0xc1 || (base_opcode | 2) == 0xd3)
ae531041
L
5137 && i.tm.extension_opcode != 6)
5138 return 1;
5139
ae531041 5140 /* Check for x87 instructions. */
aa4c197d 5141 if ((base_opcode | 6) == 0xdf)
ae531041
L
5142 {
5143 /* Skip fst, fstp, fstenv, fstcw. */
5144 if (i.tm.base_opcode == 0xd9
5145 && (i.tm.extension_opcode == 2
5146 || i.tm.extension_opcode == 3
5147 || i.tm.extension_opcode == 6
5148 || i.tm.extension_opcode == 7))
5149 return 0;
5150
5151 /* Skip fisttp, fist, fistp, fstp. */
5152 if (i.tm.base_opcode == 0xdb
5153 && (i.tm.extension_opcode == 1
5154 || i.tm.extension_opcode == 2
5155 || i.tm.extension_opcode == 3
5156 || i.tm.extension_opcode == 7))
5157 return 0;
5158
5159 /* Skip fisttp, fst, fstp, fsave, fstsw. */
5160 if (i.tm.base_opcode == 0xdd
5161 && (i.tm.extension_opcode == 1
5162 || i.tm.extension_opcode == 2
5163 || i.tm.extension_opcode == 3
5164 || i.tm.extension_opcode == 6
5165 || i.tm.extension_opcode == 7))
5166 return 0;
5167
5168 /* Skip fisttp, fist, fistp, fbstp, fistp. */
5169 if (i.tm.base_opcode == 0xdf
5170 && (i.tm.extension_opcode == 1
5171 || i.tm.extension_opcode == 2
5172 || i.tm.extension_opcode == 3
5173 || i.tm.extension_opcode == 6
5174 || i.tm.extension_opcode == 7))
5175 return 0;
5176
5177 return 1;
5178 }
5179 }
ddb62495 5180 else if (i.tm.opcode_space == SPACE_0F)
389d00a5
JB
5181 {
5182 /* bt, bts, btr, btc. */
5183 if (i.tm.base_opcode == 0xba
aa4c197d 5184 && (i.tm.extension_opcode | 3) == 7)
389d00a5
JB
5185 return 1;
5186
5187 /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */
5188 if (i.tm.base_opcode == 0xc7
5189 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
5190 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3
5191 || i.tm.extension_opcode == 6))
5192 return 1;
5193
5194 /* fxrstor, ldmxcsr, xrstor. */
5195 if (i.tm.base_opcode == 0xae
5196 && (i.tm.extension_opcode == 1
5197 || i.tm.extension_opcode == 2
5198 || i.tm.extension_opcode == 5))
5199 return 1;
5200
5201 /* lgdt, lidt, lmsw. */
5202 if (i.tm.base_opcode == 0x01
5203 && (i.tm.extension_opcode == 2
5204 || i.tm.extension_opcode == 3
5205 || i.tm.extension_opcode == 6))
5206 return 1;
5207 }
ae531041
L
5208
5209 dest = i.operands - 1;
5210
5211 /* Check fake imm8 operand and 3 source operands. */
5212 if ((i.tm.opcode_modifier.immext
aa180741 5213 || i.reg_operands + i.mem_operands == 4)
ae531041
L
5214 && i.types[dest].bitfield.imm8)
5215 dest--;
5216
389d00a5 5217 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */
ddb62495 5218 if (i.tm.opcode_space == SPACE_BASE
aa4c197d 5219 && ((base_opcode | 0x38) == 0x39
389d00a5
JB
5220 || (base_opcode | 2) == 0x87))
5221 return 1;
5222
7fc69528 5223 if (i.tm.mnem_off == MN_xadd)
ae531041
L
5224 return 1;
5225
5226 /* Check for load instruction. */
5227 return (i.types[dest].bitfield.class != ClassNone
5228 || i.types[dest].bitfield.instance == Accum);
5229}
5230
5231/* Output lfence, 0xfaee8, after instruction. */
5232
5233static void
5234insert_lfence_after (void)
5235{
5236 if (lfence_after_load && load_insn_p ())
5237 {
a09f656b 5238 /* There are also two REP string instructions that require
5239 special treatment. Specifically, the compare string (CMPS)
5240 and scan string (SCAS) instructions set EFLAGS in a manner
5241 that depends on the data being compared/scanned. When used
5242 with a REP prefix, the number of iterations may therefore
5243 vary depending on this data. If the data is a program secret
5244 chosen by the adversary using an LVI method,
5245 then this data-dependent behavior may leak some aspect
5246 of the secret. */
aa4c197d 5247 if (((i.tm.base_opcode | 0x9) == 0xaf)
a09f656b 5248 && i.prefix[REP_PREFIX])
5249 {
5250 as_warn (_("`%s` changes flags which would affect control flow behavior"),
76d3f746 5251 insn_name (&i.tm));
a09f656b 5252 }
ae531041
L
5253 char *p = frag_more (3);
5254 *p++ = 0xf;
5255 *p++ = 0xae;
5256 *p = 0xe8;
5257 }
5258}
5259
5260/* Output lfence, 0xfaee8, before instruction. */
5261
5262static void
b5482fe5 5263insert_lfence_before (const struct last_insn *last_insn)
ae531041
L
5264{
5265 char *p;
5266
ddb62495 5267 if (i.tm.opcode_space != SPACE_BASE)
ae531041
L
5268 return;
5269
5270 if (i.tm.base_opcode == 0xff
5271 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
5272 {
5273 /* Insert lfence before indirect branch if needed. */
5274
5275 if (lfence_before_indirect_branch == lfence_branch_none)
5276 return;
5277
5278 if (i.operands != 1)
5279 abort ();
5280
5281 if (i.reg_operands == 1)
5282 {
5283 /* Indirect branch via register. Don't insert lfence with
5284 -mlfence-after-load=yes. */
5285 if (lfence_after_load
5286 || lfence_before_indirect_branch == lfence_branch_memory)
5287 return;
5288 }
5289 else if (i.mem_operands == 1
5290 && lfence_before_indirect_branch != lfence_branch_register)
5291 {
5292 as_warn (_("indirect `%s` with memory operand should be avoided"),
76d3f746 5293 insn_name (&i.tm));
ae531041
L
5294 return;
5295 }
5296 else
5297 return;
5298
b5482fe5 5299 if (last_insn->kind != last_insn_other)
ae531041 5300 {
b5482fe5 5301 as_warn_where (last_insn->file, last_insn->line,
ae531041 5302 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
b5482fe5 5303 last_insn->name, insn_name (&i.tm));
ae531041
L
5304 return;
5305 }
5306
5307 p = frag_more (3);
5308 *p++ = 0xf;
5309 *p++ = 0xae;
5310 *p = 0xe8;
5311 return;
5312 }
5313
503648e4 5314 /* Output or/not/shl and lfence before near ret. */
ae531041 5315 if (lfence_before_ret != lfence_before_ret_none
aa4c197d 5316 && (i.tm.base_opcode | 1) == 0xc3)
ae531041 5317 {
b5482fe5 5318 if (last_insn->kind != last_insn_other)
ae531041 5319 {
b5482fe5 5320 as_warn_where (last_insn->file, last_insn->line,
ae531041 5321 _("`%s` skips -mlfence-before-ret on `%s`"),
b5482fe5 5322 last_insn->name, insn_name (&i.tm));
ae531041
L
5323 return;
5324 }
a09f656b 5325
a09f656b 5326 /* Near ret ingore operand size override under CPU64. */
503648e4 5327 char prefix = flag_code == CODE_64BIT
5328 ? 0x48
5329 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 5330
5331 if (lfence_before_ret == lfence_before_ret_not)
5332 {
5333 /* not: 0xf71424, may add prefix
5334 for operand size override or 64-bit code. */
5335 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
5336 if (prefix)
5337 *p++ = prefix;
ae531041
L
5338 *p++ = 0xf7;
5339 *p++ = 0x14;
5340 *p++ = 0x24;
a09f656b 5341 if (prefix)
5342 *p++ = prefix;
ae531041
L
5343 *p++ = 0xf7;
5344 *p++ = 0x14;
5345 *p++ = 0x24;
5346 }
a09f656b 5347 else
5348 {
5349 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
5350 if (prefix)
5351 *p++ = prefix;
5352 if (lfence_before_ret == lfence_before_ret_or)
5353 {
5354 /* or: 0x830c2400, may add prefix
5355 for operand size override or 64-bit code. */
5356 *p++ = 0x83;
5357 *p++ = 0x0c;
5358 }
5359 else
5360 {
5361 /* shl: 0xc1242400, may add prefix
5362 for operand size override or 64-bit code. */
5363 *p++ = 0xc1;
5364 *p++ = 0x24;
5365 }
5366
5367 *p++ = 0x24;
5368 *p++ = 0x0;
5369 }
5370
ae531041
L
5371 *p++ = 0xf;
5372 *p++ = 0xae;
5373 *p = 0xe8;
5374 }
5375}
5376
edd67638
JB
5377/* Shared helper for md_assemble() and s_insn(). */
5378static void init_globals (void)
5379{
5380 unsigned int j;
5381
5382 memset (&i, '\0', sizeof (i));
5383 i.rounding.type = rc_none;
5384 for (j = 0; j < MAX_OPERANDS; j++)
5385 i.reloc[j] = NO_RELOC;
5386 memset (disp_expressions, '\0', sizeof (disp_expressions));
5387 memset (im_expressions, '\0', sizeof (im_expressions));
5388 save_stack_p = save_stack;
5389}
5390
04784e33
JB
5391/* Helper for md_assemble() to decide whether to prepare for a possible 2nd
5392 parsing pass. Instead of introducing a rarely use new insn attribute this
5393 utilizes a common pattern between affected templates. It is deemed
5394 acceptable that this will lead to unnecessary pass 2 preparations in a
5395 limited set of cases. */
5396static INLINE bool may_need_pass2 (const insn_template *t)
5397{
5398 return t->opcode_modifier.sse2avx
5399 /* Note that all SSE2AVX templates have at least one operand. */
a28fedbc 5400 ? t->operand_types[t->operands - 1].bitfield.class == RegSIMD
ddb62495 5401 : (t->opcode_space == SPACE_0F
a28fedbc 5402 && (t->base_opcode | 1) == 0xbf)
ddb62495 5403 || (t->opcode_space == SPACE_BASE
a28fedbc 5404 && t->base_opcode == 0x63);
04784e33
JB
5405}
5406
c7defc53
IB
5407#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
5408
5409/* DWARF register number for EFLAGS. Used for pushf/popf insns. */
5410#define GINSN_DW2_REGNUM_EFLAGS 49
5411/* DWARF register number for RSI. Used as dummy value when RegIP/RegIZ. */
5412#define GINSN_DW2_REGNUM_RSI_DUMMY 4
5413
5414/* Identify the callee-saved registers in System V AMD64 ABI. */
5415
5416bool
5417x86_scfi_callee_saved_p (unsigned int dw2reg_num)
5418{
5419 if (dw2reg_num == 3 /* rbx. */
5420 || dw2reg_num == REG_FP /* rbp. */
5421 || dw2reg_num == REG_SP /* rsp. */
5422 || (dw2reg_num >= 12 && dw2reg_num <= 15) /* r12 - r15. */)
5423 return true;
5424
5425 return false;
5426}
5427
5428/* Check whether an instruction prefix which affects operation size
5429 accompanies. For insns in the legacy space, setting REX.W takes precedence
5430 over the operand-size prefix (66H) when both are used.
5431
5432 The current users of this API are in the handlers for PUSH, POP or other
5433 instructions which affect the stack pointer implicitly: the operation size
5434 (16, 32, or 64 bits) determines the amount by which the stack pointer is
5435 incremented / decremented (2, 4 or 8). */
5436
5437static bool
5438ginsn_opsize_prefix_p (void)
5439{
5440 return (!(i.prefix[REX_PREFIX] & REX_W) && i.prefix[DATA_PREFIX]);
5441}
5442
5443/* Get the DWARF register number for the given register entry.
5444 For specific byte/word/dword register accesses like al, cl, ah, ch, r8d,
5445 r20w etc., we need to identify the DWARF register number for the
5446 corresponding 8-byte GPR.
5447
5448 This function is a hack - it relies on relative ordering of reg entries in
5449 the i386_regtab. FIXME - it will be good to allow a more direct way to get
5450 this information. */
5451
5452static unsigned int
5453ginsn_dw2_regnum (const reg_entry *ireg)
5454{
c7defc53 5455 const reg_entry *temp = ireg;
066673f6 5456 unsigned int dwarf_reg = Dw2Inval, idx = 0;
c7defc53
IB
5457
5458 /* ginsn creation is available for AMD64 abi only ATM. Other flag_code
5459 are not expected. */
5460 gas_assert (ireg && flag_code == CODE_64BIT);
5461
5462 /* Watch out for RegIP, RegIZ. These are expected to appear only with
5463 base/index addressing modes. Although creating inaccurate data
5464 dependencies, using a dummy value (lets say volatile register rsi) will
5465 not hurt SCFI. TBD_GINSN_GEN_NOT_SCFI. */
5466 if (ireg->reg_num == RegIP || ireg->reg_num == RegIZ)
5467 return GINSN_DW2_REGNUM_RSI_DUMMY;
5468
fabb73d1 5469 dwarf_reg = ireg->dw2_regnum[object_64bit];
c7defc53
IB
5470
5471 if (dwarf_reg == Dw2Inval)
5472 {
5473 if (ireg <= &i386_regtab[3])
5474 /* For al, cl, dl, bl, bump over to axl, cxl, dxl, bxl respectively by
5475 adding 8. */
5476 temp = ireg + 8;
5477 else if (ireg <= &i386_regtab[7])
5478 /* For ah, ch, dh, bh, bump over to axl, cxl, dxl, bxl respectively by
5479 adding 4. */
5480 temp = ireg + 4;
5481 else
5482 {
5483 /* The code relies on the relative ordering of the reg entries in
5484 i386_regtab. There are 32 register entries between axl-r31b,
5485 ax-r31w etc. The assertions here ensures the code does not
5486 recurse indefinitely. */
5487 gas_assert ((temp - &i386_regtab[0]) >= 0);
5488 idx = temp - &i386_regtab[0];
5489 gas_assert (idx + 32 < i386_regtab_size - 1);
5490
5491 temp = temp + 32;
5492 }
5493
5494 dwarf_reg = ginsn_dw2_regnum (temp);
5495 }
5496
5497 /* Sanity check - failure may indicate state corruption, bad ginsn or
5498 perhaps the i386-reg table and the current function got out of sync. */
066673f6 5499 gas_assert (dwarf_reg < Dw2Inval);
c7defc53 5500
066673f6 5501 return dwarf_reg;
c7defc53
IB
5502}
5503
5504static ginsnS *
5505x86_ginsn_addsub_reg_mem (const symbolS *insn_end_sym)
5506{
5507 unsigned int dw2_regnum;
5508 unsigned int src1_dw2_regnum;
5509 ginsnS *ginsn = NULL;
5510 ginsnS * (*ginsn_func) (const symbolS *, bool,
5511 enum ginsn_src_type, unsigned int, offsetT,
5512 enum ginsn_src_type, unsigned int, offsetT,
5513 enum ginsn_dst_type, unsigned int, offsetT);
5514 uint16_t opcode = i.tm.base_opcode;
5515
5516 gas_assert (i.tm.opcode_space == SPACE_BASE
5517 && (opcode == 0x1 || opcode == 0x29));
5518 ginsn_func = (opcode == 0x1) ? ginsn_new_add : ginsn_new_sub;
5519
5520 /* op %reg, symbol or even other cases where destination involves indirect
5521 access are unnecessary for SCFI correctness. TBD_GINSN_GEN_NOT_SCFI. */
5522 if (i.mem_operands)
5523 return ginsn;
5524
f8c50ae2
IB
5525 /* Skip detection of 8/16/32-bit op size; 'add/sub reg, reg/mem' ops always
5526 make the dest reg untraceable for SCFI. */
5527
c7defc53
IB
5528 /* op reg, reg/mem. */
5529 src1_dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
5530 /* Of interest only when second opnd is not memory. */
5531 if (i.reg_operands == 2)
5532 {
5533 dw2_regnum = ginsn_dw2_regnum (i.op[1].regs);
5534 ginsn = ginsn_func (insn_end_sym, true,
5535 GINSN_SRC_REG, src1_dw2_regnum, 0,
5536 GINSN_SRC_REG, dw2_regnum, 0,
5537 GINSN_DST_REG, dw2_regnum, 0);
5538 ginsn_set_where (ginsn);
5539 }
5540
5541 return ginsn;
5542}
5543
5544static ginsnS *
5545x86_ginsn_addsub_mem_reg (const symbolS *insn_end_sym)
5546{
5547 unsigned int dw2_regnum;
5548 unsigned int src1_dw2_regnum;
5549 const reg_entry *mem_reg;
5550 int32_t gdisp = 0;
5551 ginsnS *ginsn = NULL;
5552 ginsnS * (*ginsn_func) (const symbolS *, bool,
5553 enum ginsn_src_type, unsigned int, offsetT,
5554 enum ginsn_src_type, unsigned int, offsetT,
5555 enum ginsn_dst_type, unsigned int, offsetT);
5556 uint16_t opcode = i.tm.base_opcode;
5557
5558 gas_assert (i.tm.opcode_space == SPACE_BASE
5559 && (opcode == 0x3 || opcode == 0x2b));
5560 ginsn_func = (opcode == 0x3) ? ginsn_new_add : ginsn_new_sub;
5561
5562 /* op symbol, %reg. */
5563 if (i.mem_operands && !i.base_reg && !i.index_reg)
5564 return ginsn;
5565
f8c50ae2
IB
5566 /* Skip detection of 8/16/32-bit op size; 'add/sub reg/mem, reg' ops always
5567 make the dest reg untraceable for SCFI. */
5568
c7defc53
IB
5569 /* op reg/mem, %reg. */
5570 dw2_regnum = ginsn_dw2_regnum (i.op[1].regs);
5571
5572 if (i.reg_operands == 2)
5573 {
5574 src1_dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
5575 ginsn = ginsn_func (insn_end_sym, true,
5576 GINSN_SRC_REG, src1_dw2_regnum, 0,
5577 GINSN_SRC_REG, dw2_regnum, 0,
5578 GINSN_DST_REG, dw2_regnum, 0);
5579 ginsn_set_where (ginsn);
5580 }
5581 else if (i.mem_operands)
5582 {
5583 mem_reg = (i.base_reg) ? i.base_reg : i.index_reg;
5584 src1_dw2_regnum = ginsn_dw2_regnum (mem_reg);
5585 if (i.disp_operands == 1)
5586 gdisp = i.op[0].disps->X_add_number;
5587 ginsn = ginsn_func (insn_end_sym, true,
5588 GINSN_SRC_INDIRECT, src1_dw2_regnum, gdisp,
5589 GINSN_SRC_REG, dw2_regnum, 0,
5590 GINSN_DST_REG, dw2_regnum, 0);
5591 ginsn_set_where (ginsn);
5592 }
5593
5594 return ginsn;
5595}
5596
5597static ginsnS *
5598x86_ginsn_alu_imm (const symbolS *insn_end_sym)
5599{
5600 offsetT src_imm;
5601 unsigned int dw2_regnum;
5602 ginsnS *ginsn = NULL;
5603 enum ginsn_src_type src_type = GINSN_SRC_REG;
5604 enum ginsn_dst_type dst_type = GINSN_DST_REG;
5605
5606 ginsnS * (*ginsn_func) (const symbolS *, bool,
5607 enum ginsn_src_type, unsigned int, offsetT,
5608 enum ginsn_src_type, unsigned int, offsetT,
5609 enum ginsn_dst_type, unsigned int, offsetT);
5610
5611 /* FIXME - create ginsn where dest is REG_SP / REG_FP only ? */
5612 /* Map for insn.tm.extension_opcode
5613 000 ADD 100 AND
5614 001 OR 101 SUB
5615 010 ADC 110 XOR
5616 011 SBB 111 CMP */
5617
5618 /* add/sub/and imm, %reg only at this time for SCFI.
5619 Although all three ('and', 'or' , 'xor') make the destination reg
5620 untraceable, 'and' op is handled but not 'or' / 'xor' because we will look
5621 into supporting the DRAP pattern at some point. Other opcodes ('adc',
5622 'sbb' and 'cmp') are not generated here either. The ginsn representation
5623 does not have support for the latter three opcodes; GINSN_TYPE_OTHER may
5624 be added for these after x86_ginsn_unhandled () invocation if the
5625 destination register is REG_SP or REG_FP. */
5626 if (i.tm.extension_opcode == 5)
5627 ginsn_func = ginsn_new_sub;
5628 else if (i.tm.extension_opcode == 4)
5629 ginsn_func = ginsn_new_and;
5630 else if (i.tm.extension_opcode == 0)
5631 ginsn_func = ginsn_new_add;
5632 else
5633 return ginsn;
5634
5635 /* TBD_GINSN_REPRESENTATION_LIMIT: There is no representation for when a
5636 symbol is used as an operand, like so:
5637 addq $simd_cmp_op+8, %rdx
5638 Skip generating any ginsn for this. */
5639 if (i.imm_operands == 1
5640 && i.op[0].imms->X_op != O_constant)
5641 return ginsn;
5642
5643 /* addq $1, symbol
5644 addq $1, -16(%rbp)
5645 These are not of interest for SCFI. Also, TBD_GINSN_GEN_NOT_SCFI. */
5646 if (i.mem_operands == 1)
5647 return ginsn;
5648
f8c50ae2
IB
5649 /* 8/16/32-bit op size makes the destination reg untraceable for SCFI.
5650 Deal with this via the x86_ginsn_unhandled () code path. */
5651 if (i.suffix != QWORD_MNEM_SUFFIX)
5652 return ginsn;
5653
c7defc53
IB
5654 gas_assert (i.imm_operands == 1);
5655 src_imm = i.op[0].imms->X_add_number;
5656 /* The second operand may be a register or indirect access. For SCFI, only
5657 the case when the second opnd is a register is interesting. Revisit this
5658 if generating ginsns for a different gen mode TBD_GINSN_GEN_NOT_SCFI. */
5659 if (i.reg_operands == 1)
5660 {
5661 dw2_regnum = ginsn_dw2_regnum (i.op[1].regs);
5662 /* For ginsn, keep the imm as second src operand. */
5663 ginsn = ginsn_func (insn_end_sym, true,
5664 src_type, dw2_regnum, 0,
5665 GINSN_SRC_IMM, 0, src_imm,
5666 dst_type, dw2_regnum, 0);
5667
5668 ginsn_set_where (ginsn);
5669 }
5670
5671 return ginsn;
5672}
5673
5674/* Create ginsn(s) for MOV operations.
5675
5676 The generated ginsns corresponding to mov with indirect access to memory
5677 (src or dest) suffer with loss of information: when both index and base
5678 registers are at play, only base register gets conveyed in ginsn. Note
5679 this TBD_GINSN_GEN_NOT_SCFI. */
5680
5681static ginsnS *
5682x86_ginsn_move (const symbolS *insn_end_sym)
5683{
5684 ginsnS *ginsn = NULL;
5685 unsigned int dst_reg;
5686 unsigned int src_reg;
5687 offsetT src_disp = 0;
5688 offsetT dst_disp = 0;
5689 const reg_entry *dst = NULL;
5690 const reg_entry *src = NULL;
5691 uint16_t opcode = i.tm.base_opcode;
5692 enum ginsn_src_type src_type = GINSN_SRC_REG;
5693 enum ginsn_dst_type dst_type = GINSN_DST_REG;
5694
5695 /* mov %reg, symbol or mov symbol, %reg.
5696 Not of interest for SCFI. Also, TBD_GINSN_GEN_NOT_SCFI. */
5697 if (i.mem_operands == 1 && !i.base_reg && !i.index_reg)
5698 return ginsn;
5699
f8c50ae2
IB
5700 /* 8/16/32-bit op size makes the destination reg untraceable for SCFI.
5701 Handle mov reg, reg only. mov to or from a memory operand will make
5702 dest reg, when present, untraceable, irrespective of the op size. */
5703 if (i.reg_operands == 2 && i.suffix != QWORD_MNEM_SUFFIX)
5704 return ginsn;
5705
c7defc53
IB
5706 gas_assert (i.tm.opcode_space == SPACE_BASE);
5707 if (opcode == 0x8b || opcode == 0x8a)
5708 {
5709 /* mov disp(%reg), %reg. */
5710 if (i.mem_operands)
5711 {
5712 src = (i.base_reg) ? i.base_reg : i.index_reg;
5713 if (i.disp_operands == 1)
5714 src_disp = i.op[0].disps->X_add_number;
5715 src_type = GINSN_SRC_INDIRECT;
5716 }
5717 else
5718 src = i.op[0].regs;
5719
5720 dst = i.op[1].regs;
5721 }
5722 else if (opcode == 0x89 || opcode == 0x88)
5723 {
5724 /* mov %reg, disp(%reg). */
5725 src = i.op[0].regs;
5726 if (i.mem_operands)
5727 {
5728 dst = (i.base_reg) ? i.base_reg : i.index_reg;
5729 if (i.disp_operands == 1)
5730 dst_disp = i.op[1].disps->X_add_number;
5731 dst_type = GINSN_DST_INDIRECT;
5732 }
5733 else
5734 dst = i.op[1].regs;
5735 }
5736
5737 src_reg = ginsn_dw2_regnum (src);
5738 dst_reg = ginsn_dw2_regnum (dst);
5739
5740 ginsn = ginsn_new_mov (insn_end_sym, true,
5741 src_type, src_reg, src_disp,
5742 dst_type, dst_reg, dst_disp);
5743 ginsn_set_where (ginsn);
5744
5745 return ginsn;
5746}
5747
5748/* Generate appropriate ginsn for lea.
09812f08
IB
5749
5750 Unhandled sub-cases (marked with TBD_GINSN_GEN_NOT_SCFI) also suffer with
5751 some loss of information in the final ginsn chosen eventually (type
5752 GINSN_TYPE_OTHER). But this is fine for now for GINSN_GEN_SCFI generation
c7defc53
IB
5753 mode. */
5754
5755static ginsnS *
5756x86_ginsn_lea (const symbolS *insn_end_sym)
5757{
5758 offsetT src_disp = 0;
5759 ginsnS *ginsn = NULL;
09812f08
IB
5760 unsigned int src1_reg;
5761 const reg_entry *src1;
c7defc53
IB
5762 offsetT index_scale;
5763 unsigned int dst_reg;
09812f08 5764 bool index_regiz_p;
c7defc53 5765
03fa0c63 5766 if ((!i.base_reg) != (!i.index_reg || i.index_reg->reg_num == RegIZ))
c7defc53 5767 {
09812f08
IB
5768 /* lea disp(%base), %dst or lea disp(,%index,imm), %dst.
5769 Either index_reg or base_reg exists, but not both. Further, as per
5770 above, the case when just %index exists but is equal to RegIZ is
5771 excluded. If not excluded, a GINSN_TYPE_MOV of %rsi
5772 (GINSN_DW2_REGNUM_RSI_DUMMY) to %dst will be generated by this block.
5773 Such a mov ginsn is imprecise; so, exclude now and generate
5774 GINSN_TYPE_OTHER instead later via the x86_ginsn_unhandled ().
5775 Excluding other cases is required due to
5776 TBD_GINSN_REPRESENTATION_LIMIT. */
c7defc53 5777
c7defc53 5778 index_scale = i.log2_scale_factor;
09812f08
IB
5779 index_regiz_p = i.index_reg && i.index_reg->reg_num == RegIZ;
5780 src1 = i.base_reg ? i.base_reg : i.index_reg;
5781 src1_reg = ginsn_dw2_regnum (src1);
c7defc53 5782 dst_reg = ginsn_dw2_regnum (i.op[1].regs);
09812f08
IB
5783 /* It makes sense to represent a scale factor of 1 precisely here
5784 (i.e., not using GINSN_TYPE_OTHER, but rather similar to the
5785 base-without-index case). A non-zero scale factor is still OK if
5786 the index reg is zero reg.
5787 However, skip from here the case when disp has a symbol instead.
5788 TBD_GINSN_REPRESENTATION_LIMIT. */
5789 if ((!index_scale || index_regiz_p)
5790 && (!i.disp_operands || i.op[0].disps->X_op == O_constant))
5791 {
5792 if (i.disp_operands)
5793 src_disp = i.op[0].disps->X_add_number;
c7defc53 5794
09812f08
IB
5795 if (src_disp)
5796 /* Generate an ADD ginsn. */
5797 ginsn = ginsn_new_add (insn_end_sym, true,
5798 GINSN_SRC_REG, src1_reg, 0,
5799 GINSN_SRC_IMM, 0, src_disp,
5800 GINSN_DST_REG, dst_reg, 0);
5801 else
5802 /* Generate a MOV ginsn. */
5803 ginsn = ginsn_new_mov (insn_end_sym, true,
5804 GINSN_SRC_REG, src1_reg, 0,
5805 GINSN_DST_REG, dst_reg, 0);
5806
5807 ginsn_set_where (ginsn);
5808 }
5809 }
5810 /* Skip handling other cases here,
5811 - when (i.index_reg && i.base_reg) is true,
5812 e.g., lea disp(%base,%index,imm), %dst
5813 We do not have a ginsn representation for multiply.
5814 - or, when (!i.index_reg && !i.base_reg) is true,
5815 e.g., lea symbol, %dst
5816 Not a frequent pattern. If %dst is a register of interest, the user is
5817 likely to use a MOV op anyway.
5818 Deal with these via the x86_ginsn_unhandled () code path to generate
5819 GINSN_TYPE_OTHER when necessary. TBD_GINSN_GEN_NOT_SCFI. */
c7defc53
IB
5820
5821 return ginsn;
5822}
5823
5824static ginsnS *
5825x86_ginsn_jump (const symbolS *insn_end_sym, bool cond_p)
5826{
5827 ginsnS *ginsn = NULL;
5828 const symbolS *src_symbol;
5829 ginsnS * (*ginsn_func) (const symbolS *sym, bool real_p,
5830 enum ginsn_src_type src_type, unsigned int src_reg,
5831 const symbolS *src_ginsn_sym);
5832
5833 gas_assert (i.disp_operands == 1);
5834
5835 ginsn_func = cond_p ? ginsn_new_jump_cond : ginsn_new_jump;
5836 if (i.op[0].disps->X_op == O_symbol && !i.op[0].disps->X_add_number)
5837 {
5838 src_symbol = i.op[0].disps->X_add_symbol;
5839 ginsn = ginsn_func (insn_end_sym, true,
5840 GINSN_SRC_SYMBOL, 0, src_symbol);
5841
5842 ginsn_set_where (ginsn);
5843 }
5844 else
5845 {
5846 /* A non-zero addend in jump/JCC target makes control-flow tracking
5847 difficult. Skip SCFI for now. */
5848 as_bad (_("SCFI: `%s' insn with non-zero addend to sym not supported"),
5849 cond_p ? "JCC" : "jmp");
5850 return ginsn;
5851 }
5852
5853 return ginsn;
5854}
5855
5856static ginsnS *
5857x86_ginsn_enter (const symbolS *insn_end_sym)
5858{
5859 ginsnS *ginsn = NULL;
5860 ginsnS *ginsn_next = NULL;
5861 ginsnS *ginsn_last = NULL;
5862 /* In 64-bit mode, the default stack update size is 8 bytes. */
5863 int stack_opnd_size = 8;
5864
5865 gas_assert (i.imm_operands == 2);
5866
5867 /* For non-zero size operands, bail out as untraceable for SCFI. */
5868 if (i.op[0].imms->X_op != O_constant || i.op[0].imms->X_add_symbol != 0
5869 || i.op[1].imms->X_op != O_constant || i.op[1].imms->X_add_symbol != 0)
5870 {
5871 as_bad ("SCFI: enter insn with non-zero operand not supported");
5872 return ginsn;
5873 }
5874
5875 /* Check if this is a 16-bit op. */
5876 if (ginsn_opsize_prefix_p ())
5877 stack_opnd_size = 2;
5878
5879 /* If the nesting level is 0, the processor pushes the frame pointer from
5880 the BP/EBP/RBP register onto the stack, copies the current stack
5881 pointer from the SP/ESP/RSP register into the BP/EBP/RBP register, and
5882 loads the SP/ESP/RSP register with the current stack-pointer value
5883 minus the value in the size operand. */
5884 ginsn = ginsn_new_sub (insn_end_sym, false,
5885 GINSN_SRC_REG, REG_SP, 0,
5886 GINSN_SRC_IMM, 0, stack_opnd_size,
5887 GINSN_DST_REG, REG_SP, 0);
5888 ginsn_set_where (ginsn);
5889 ginsn_next = ginsn_new_store (insn_end_sym, false,
5890 GINSN_SRC_REG, REG_FP,
5891 GINSN_DST_INDIRECT, REG_SP, 0);
5892 ginsn_set_where (ginsn_next);
5893 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
5894 ginsn_last = ginsn_new_mov (insn_end_sym, false,
5895 GINSN_SRC_REG, REG_SP, 0,
5896 GINSN_DST_REG, REG_FP, 0);
5897 ginsn_set_where (ginsn_last);
5898 gas_assert (!ginsn_link_next (ginsn_next, ginsn_last));
5899
5900 return ginsn;
5901}
5902
5903static ginsnS *
5904x86_ginsn_leave (const symbolS *insn_end_sym)
5905{
5906 ginsnS *ginsn = NULL;
5907 ginsnS *ginsn_next = NULL;
5908 ginsnS *ginsn_last = NULL;
5909 /* In 64-bit mode, the default stack update size is 8 bytes. */
5910 int stack_opnd_size = 8;
5911
5912 /* Check if this is a 16-bit op. */
5913 if (ginsn_opsize_prefix_p ())
5914 stack_opnd_size = 2;
5915
5916 /* The 'leave' instruction copies the contents of the RBP register
5917 into the RSP register to release all stack space allocated to the
5918 procedure. */
5919 ginsn = ginsn_new_mov (insn_end_sym, false,
5920 GINSN_SRC_REG, REG_FP, 0,
5921 GINSN_DST_REG, REG_SP, 0);
5922 ginsn_set_where (ginsn);
5923 /* Then it restores the old value of the RBP register from the stack. */
5924 ginsn_next = ginsn_new_load (insn_end_sym, false,
5925 GINSN_SRC_INDIRECT, REG_SP, 0,
5926 GINSN_DST_REG, REG_FP);
5927 ginsn_set_where (ginsn_next);
5928 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
5929 ginsn_last = ginsn_new_add (insn_end_sym, false,
5930 GINSN_SRC_REG, REG_SP, 0,
5931 GINSN_SRC_IMM, 0, stack_opnd_size,
5932 GINSN_DST_REG, REG_SP, 0);
5933 ginsn_set_where (ginsn_next);
5934 gas_assert (!ginsn_link_next (ginsn_next, ginsn_last));
5935
5936 return ginsn;
5937}
5938
5939/* Check if an instruction is whitelisted.
5940
5941 Some instructions may appear with REG_SP or REG_FP as destination, because
5942 which they are deemed 'interesting' for SCFI. Whitelist them here if they
5943 do not affect SCFI correctness. */
5944
5945static bool
5946x86_ginsn_safe_to_skip_p (void)
5947{
5948 bool skip_p = false;
5949 uint16_t opcode = i.tm.base_opcode;
5950
5951 switch (opcode)
5952 {
5953 case 0x80:
5954 case 0x81:
5955 case 0x83:
5956 if (i.tm.opcode_space != SPACE_BASE)
5957 break;
5958 /* cmp imm, reg/rem. */
5959 if (i.tm.extension_opcode == 7)
5960 skip_p = true;
5961 break;
5962
5963 case 0x38:
5964 case 0x39:
5965 case 0x3a:
5966 case 0x3b:
5967 if (i.tm.opcode_space != SPACE_BASE)
5968 break;
5969 /* cmp imm/reg/mem, reg/rem. */
5970 skip_p = true;
5971 break;
5972
5973 case 0xf6:
5974 case 0xf7:
5975 case 0x84:
5976 case 0x85:
5977 /* test imm/reg/mem, reg/mem. */
5978 if (i.tm.opcode_space != SPACE_BASE)
5979 break;
5980 skip_p = true;
5981 break;
5982
5983 default:
5984 break;
5985 }
5986
5987 return skip_p;
5988}
5989
5990#define X86_GINSN_UNHANDLED_NONE 0
5991#define X86_GINSN_UNHANDLED_DEST_REG 1
5992#define X86_GINSN_UNHANDLED_CFG 2
5993#define X86_GINSN_UNHANDLED_STACKOP 3
5994#define X86_GINSN_UNHANDLED_UNEXPECTED 4
5995
5996/* Check the input insn for its impact on the correctness of the synthesized
5997 CFI. Returns an error code to the caller. */
5998
5999static int
6000x86_ginsn_unhandled (void)
6001{
6002 int err = X86_GINSN_UNHANDLED_NONE;
6003 const reg_entry *reg_op;
6004 unsigned int dw2_regnum;
6005
6006 /* Keep an eye out for instructions affecting control flow. */
6007 if (i.tm.opcode_modifier.jump)
6008 err = X86_GINSN_UNHANDLED_CFG;
6009 /* Also, for any instructions involving an implicit update to the stack
6010 pointer. */
6011 else if (i.tm.opcode_modifier.operandconstraint == IMPLICIT_STACK_OP)
6012 err = X86_GINSN_UNHANDLED_STACKOP;
6013 /* Finally, also check if the missed instructions are affecting REG_SP or
6014 REG_FP. The destination operand is the last at all stages of assembly
6015 (due to following AT&T syntax layout in the internal representation). In
6016 case of Intel syntax input, this still remains true as swap_operands ()
6017 is done by now.
6018 PS: These checks do not involve index / base reg, as indirect memory
6019 accesses via REG_SP or REG_FP do not affect SCFI correctness.
6020 (Also note these instructions are candidates for other ginsn generation
6021 modes in future. TBD_GINSN_GEN_NOT_SCFI.) */
6022 else if (i.operands && i.reg_operands
6023 && !(i.flags[i.operands - 1] & Operand_Mem))
6024 {
6025 reg_op = i.op[i.operands - 1].regs;
6026 if (reg_op)
6027 {
6028 dw2_regnum = ginsn_dw2_regnum (reg_op);
6029 if (dw2_regnum == REG_SP || dw2_regnum == REG_FP)
6030 err = X86_GINSN_UNHANDLED_DEST_REG;
6031 }
6032 else
6033 /* Something unexpected. Indicate to caller. */
6034 err = X86_GINSN_UNHANDLED_UNEXPECTED;
6035 }
6036
6037 return err;
6038}
6039
6040/* Generate one or more generic GAS instructions, a.k.a, ginsns for the current
6041 machine instruction.
6042
6043 Returns the head of linked list of ginsn(s) added, if success; Returns NULL
6044 if failure.
6045
6046 The input ginsn_gen_mode GMODE determines the set of minimal necessary
6047 ginsns necessary for correctness of any passes applicable for that mode.
6048 For supporting the GINSN_GEN_SCFI generation mode, following is the list of
6049 machine instructions that must be translated into the corresponding ginsns
6050 to ensure correctness of SCFI:
6051 - All instructions affecting the two registers that could potentially
6052 be used as the base register for CFA tracking. For SCFI, the base
6053 register for CFA tracking is limited to REG_SP and REG_FP only for
6054 now.
6055 - All change of flow instructions: conditional and unconditional branches,
6056 call and return from functions.
6057 - All instructions that can potentially be a register save / restore
6058 operation.
6059 - All instructions that perform stack manipulation implicitly: the CALL,
6060 RET, PUSH, POP, ENTER, and LEAVE instructions.
6061
6062 The function currently supports GINSN_GEN_SCFI ginsn generation mode only.
6063 To support other generation modes will require work on this target-specific
6064 process of creation of ginsns:
6065 - Some of such places are tagged with TBD_GINSN_GEN_NOT_SCFI to serve as
6066 possible starting points.
6067 - Also note that ginsn representation may need enhancements. Specifically,
6068 note some TBD_GINSN_INFO_LOSS and TBD_GINSN_REPRESENTATION_LIMIT markers.
6069 */
6070
6071static ginsnS *
6072x86_ginsn_new (const symbolS *insn_end_sym, enum ginsn_gen_mode gmode)
6073{
6074 int err = 0;
6075 uint16_t opcode;
6076 unsigned int dw2_regnum;
6077 const reg_entry *mem_reg;
6078 ginsnS *ginsn = NULL;
6079 ginsnS *ginsn_next = NULL;
6080 /* In 64-bit mode, the default stack update size is 8 bytes. */
6081 int stack_opnd_size = 8;
6082
6083 /* Currently supports generation of selected ginsns, sufficient for
6084 the use-case of SCFI only. */
6085 if (gmode != GINSN_GEN_SCFI)
6086 return ginsn;
6087
6088 opcode = i.tm.base_opcode;
6089
6090 /* Until it is clear how to handle APX NDD and other new opcodes, disallow
6091 them from SCFI. */
6092 if (is_apx_rex2_encoding ()
6093 || (i.tm.opcode_modifier.evex && is_apx_evex_encoding ()))
6094 {
6095 as_bad (_("SCFI: unsupported APX op %#x may cause incorrect CFI"),
6096 opcode);
6097 return ginsn;
6098 }
6099
6100 switch (opcode)
6101 {
f8c50ae2
IB
6102
6103 /* Add opcodes 0x0/0x2 and sub opcodes 0x28/0x2a (with opcode_space
6104 SPACE_BASE) are 8-bit ops. While they are relevant for SCFI
6105 correctness, skip handling them here and use the x86_ginsn_unhandled
6106 code path to generate GINSN_TYPE_OTHER when necessary. */
6107
c7defc53
IB
6108 case 0x1: /* add reg, reg/mem. */
6109 case 0x29: /* sub reg, reg/mem. */
6110 if (i.tm.opcode_space != SPACE_BASE)
6111 break;
6112 ginsn = x86_ginsn_addsub_reg_mem (insn_end_sym);
6113 break;
6114
6115 case 0x3: /* add reg/mem, reg. */
6116 case 0x2b: /* sub reg/mem, reg. */
6117 if (i.tm.opcode_space != SPACE_BASE)
6118 break;
6119 ginsn = x86_ginsn_addsub_mem_reg (insn_end_sym);
6120 break;
6121
6122 case 0xa0: /* push fs. */
6123 case 0xa8: /* push gs. */
6124 /* push fs / push gs have opcode_space == SPACE_0F. */
6125 if (i.tm.opcode_space != SPACE_0F)
6126 break;
6127 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6128 /* Check if operation size is 16-bit. */
6129 if (ginsn_opsize_prefix_p ())
6130 stack_opnd_size = 2;
6131 ginsn = ginsn_new_sub (insn_end_sym, false,
6132 GINSN_SRC_REG, REG_SP, 0,
6133 GINSN_SRC_IMM, 0, stack_opnd_size,
6134 GINSN_DST_REG, REG_SP, 0);
6135 ginsn_set_where (ginsn);
6136 ginsn_next = ginsn_new_store (insn_end_sym, false,
6137 GINSN_SRC_REG, dw2_regnum,
6138 GINSN_DST_INDIRECT, REG_SP, 0);
6139 ginsn_set_where (ginsn_next);
6140 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6141 break;
6142
6143 case 0xa1: /* pop fs. */
6144 case 0xa9: /* pop gs. */
6145 /* pop fs / pop gs have opcode_space == SPACE_0F. */
6146 if (i.tm.opcode_space != SPACE_0F)
6147 break;
6148 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6149 /* Check if operation size is 16-bit. */
6150 if (ginsn_opsize_prefix_p ())
6151 stack_opnd_size = 2;
6152 ginsn = ginsn_new_load (insn_end_sym, false,
6153 GINSN_SRC_INDIRECT, REG_SP, 0,
6154 GINSN_DST_REG, dw2_regnum);
6155 ginsn_set_where (ginsn);
6156 ginsn_next = ginsn_new_add (insn_end_sym, false,
6157 GINSN_SRC_REG, REG_SP, 0,
6158 GINSN_SRC_IMM, 0, stack_opnd_size,
6159 GINSN_DST_REG, REG_SP, 0);
6160 ginsn_set_where (ginsn_next);
6161 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6162 break;
6163
6164 case 0x50 ... 0x57:
6165 if (i.tm.opcode_space != SPACE_BASE)
6166 break;
6167 /* push reg. */
6168 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6169 /* Check if operation size is 16-bit. */
6170 if (ginsn_opsize_prefix_p ())
6171 stack_opnd_size = 2;
6172 ginsn = ginsn_new_sub (insn_end_sym, false,
6173 GINSN_SRC_REG, REG_SP, 0,
6174 GINSN_SRC_IMM, 0, stack_opnd_size,
6175 GINSN_DST_REG, REG_SP, 0);
6176 ginsn_set_where (ginsn);
6177 ginsn_next = ginsn_new_store (insn_end_sym, false,
6178 GINSN_SRC_REG, dw2_regnum,
6179 GINSN_DST_INDIRECT, REG_SP, 0);
6180 ginsn_set_where (ginsn_next);
6181 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6182 break;
6183
6184 case 0x58 ... 0x5f:
6185 if (i.tm.opcode_space != SPACE_BASE)
6186 break;
6187 /* pop reg. */
6188 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6189 ginsn = ginsn_new_load (insn_end_sym, false,
6190 GINSN_SRC_INDIRECT, REG_SP, 0,
6191 GINSN_DST_REG, dw2_regnum);
6192 ginsn_set_where (ginsn);
6193 /* Check if operation size is 16-bit. */
6194 if (ginsn_opsize_prefix_p ())
6195 stack_opnd_size = 2;
6196 ginsn_next = ginsn_new_add (insn_end_sym, false,
6197 GINSN_SRC_REG, REG_SP, 0,
6198 GINSN_SRC_IMM, 0, stack_opnd_size,
6199 GINSN_DST_REG, REG_SP, 0);
6200 ginsn_set_where (ginsn_next);
6201 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6202 break;
6203
6204 case 0x6a: /* push imm8. */
6205 case 0x68: /* push imm16/imm32. */
6206 if (i.tm.opcode_space != SPACE_BASE)
6207 break;
6208 /* Check if operation size is 16-bit. */
6209 if (ginsn_opsize_prefix_p ())
6210 stack_opnd_size = 2;
6211 /* Skip getting the value of imm from machine instruction
6212 because this is not important for SCFI. */
6213 ginsn = ginsn_new_sub (insn_end_sym, false,
6214 GINSN_SRC_REG, REG_SP, 0,
6215 GINSN_SRC_IMM, 0, stack_opnd_size,
6216 GINSN_DST_REG, REG_SP, 0);
6217 ginsn_set_where (ginsn);
6218 ginsn_next = ginsn_new_store (insn_end_sym, false,
6219 GINSN_SRC_IMM, 0,
6220 GINSN_DST_INDIRECT, REG_SP, 0);
6221 ginsn_set_where (ginsn_next);
6222 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6223 break;
6224
6225 /* PS: Opcodes 0x80 ... 0x8f with opcode_space SPACE_0F are present
6226 only after relaxation. They do not need to be handled for ginsn
6227 creation. */
6228 case 0x70 ... 0x7f:
6229 if (i.tm.opcode_space != SPACE_BASE)
6230 break;
6231 ginsn = x86_ginsn_jump (insn_end_sym, true);
6232 break;
6233
6234 case 0x80:
6235 case 0x81:
6236 case 0x83:
6237 if (i.tm.opcode_space != SPACE_BASE)
6238 break;
6239 ginsn = x86_ginsn_alu_imm (insn_end_sym);
6240 break;
6241
6242 case 0x8a: /* mov r/m8, r8. */
6243 case 0x8b: /* mov r/m(16/32/64), r(16/32/64). */
6244 case 0x88: /* mov r8, r/m8. */
6245 case 0x89: /* mov r(16/32/64), r/m(16/32/64). */
6246 if (i.tm.opcode_space != SPACE_BASE)
6247 break;
6248 ginsn = x86_ginsn_move (insn_end_sym);
6249 break;
6250
6251 case 0x8d:
6252 if (i.tm.opcode_space != SPACE_BASE)
6253 break;
09812f08 6254 /* lea disp(%base,%index,imm), %dst. */
c7defc53
IB
6255 ginsn = x86_ginsn_lea (insn_end_sym);
6256 break;
6257
6258 case 0x8f:
6259 if (i.tm.opcode_space != SPACE_BASE)
6260 break;
6261 /* pop to reg/mem. */
6262 if (i.mem_operands)
6263 {
6264 mem_reg = (i.base_reg) ? i.base_reg : i.index_reg;
6265 /* Use dummy register if no base or index. Unlike other opcodes,
6266 ginsns must be generated as this affect stack pointer. */
6267 dw2_regnum = (mem_reg
6268 ? ginsn_dw2_regnum (mem_reg)
6269 : GINSN_DW2_REGNUM_RSI_DUMMY);
6270 }
6271 else
6272 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6273 ginsn = ginsn_new_load (insn_end_sym, false,
6274 GINSN_SRC_INDIRECT, REG_SP, 0,
6275 GINSN_DST_INDIRECT, dw2_regnum);
6276 ginsn_set_where (ginsn);
6277 /* Check if operation size is 16-bit. */
6278 if (ginsn_opsize_prefix_p ())
6279 stack_opnd_size = 2;
6280 ginsn_next = ginsn_new_add (insn_end_sym, false,
6281 GINSN_SRC_REG, REG_SP, 0,
6282 GINSN_SRC_IMM, 0, stack_opnd_size,
6283 GINSN_DST_REG, REG_SP, 0);
6284 ginsn_set_where (ginsn_next);
6285 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6286 break;
6287
6288 case 0x9c:
6289 if (i.tm.opcode_space != SPACE_BASE)
6290 break;
6291 /* pushf / pushfq. */
6292 /* Check if operation size is 16-bit. */
6293 if (ginsn_opsize_prefix_p ())
6294 stack_opnd_size = 2;
6295 ginsn = ginsn_new_sub (insn_end_sym, false,
6296 GINSN_SRC_REG, REG_SP, 0,
6297 GINSN_SRC_IMM, 0, stack_opnd_size,
6298 GINSN_DST_REG, REG_SP, 0);
6299 ginsn_set_where (ginsn);
6300 /* FIXME - hardcode the actual DWARF reg number value. As for SCFI
6301 correctness, although this behaves simply a placeholder value; its
6302 just clearer if the value is correct. */
6303 dw2_regnum = GINSN_DW2_REGNUM_EFLAGS;
6304 ginsn_next = ginsn_new_store (insn_end_sym, false,
6305 GINSN_SRC_REG, dw2_regnum,
6306 GINSN_DST_INDIRECT, REG_SP, 0);
6307 ginsn_set_where (ginsn_next);
6308 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6309 break;
6310
6311 case 0x9d:
6312 if (i.tm.opcode_space != SPACE_BASE)
6313 break;
6314 /* popf / popfq. */
6315 /* Check if operation size is 16-bit. */
6316 if (ginsn_opsize_prefix_p ())
6317 stack_opnd_size = 2;
6318 /* FIXME - hardcode the actual DWARF reg number value. As for SCFI
6319 correctness, although this behaves simply a placeholder value; its
6320 just clearer if the value is correct. */
6321 dw2_regnum = GINSN_DW2_REGNUM_EFLAGS;
6322 ginsn = ginsn_new_load (insn_end_sym, false,
6323 GINSN_SRC_INDIRECT, REG_SP, 0,
6324 GINSN_DST_REG, dw2_regnum);
6325 ginsn_set_where (ginsn);
6326 ginsn_next = ginsn_new_add (insn_end_sym, false,
6327 GINSN_SRC_REG, REG_SP, 0,
6328 GINSN_SRC_IMM, 0, stack_opnd_size,
6329 GINSN_DST_REG, REG_SP, 0);
6330 ginsn_set_where (ginsn_next);
6331 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6332 break;
6333
6334 case 0xff:
6335 if (i.tm.opcode_space != SPACE_BASE)
6336 break;
6337 /* push from reg/mem. */
6338 if (i.tm.extension_opcode == 6)
6339 {
6340 /* Check if operation size is 16-bit. */
6341 if (ginsn_opsize_prefix_p ())
6342 stack_opnd_size = 2;
6343 ginsn = ginsn_new_sub (insn_end_sym, false,
6344 GINSN_SRC_REG, REG_SP, 0,
6345 GINSN_SRC_IMM, 0, stack_opnd_size,
6346 GINSN_DST_REG, REG_SP, 0);
6347 ginsn_set_where (ginsn);
6348 if (i.mem_operands)
6349 {
6350 mem_reg = (i.base_reg) ? i.base_reg : i.index_reg;
6351 /* Use dummy register if no base or index. Unlike other opcodes,
6352 ginsns must be generated as this affect stack pointer. */
6353 dw2_regnum = (mem_reg
6354 ? ginsn_dw2_regnum (mem_reg)
6355 : GINSN_DW2_REGNUM_RSI_DUMMY);
6356 }
6357 else
6358 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6359 ginsn_next = ginsn_new_store (insn_end_sym, false,
6360 GINSN_SRC_INDIRECT, dw2_regnum,
6361 GINSN_DST_INDIRECT, REG_SP, 0);
6362 ginsn_set_where (ginsn_next);
6363 gas_assert (!ginsn_link_next (ginsn, ginsn_next));
6364 }
6365 else if (i.tm.extension_opcode == 4)
6366 {
6367 /* jmp r/m. E.g., notrack jmp *%rax. */
6368 if (i.reg_operands)
6369 {
6370 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6371 ginsn = ginsn_new_jump (insn_end_sym, true,
6372 GINSN_SRC_REG, dw2_regnum, NULL);
6373 ginsn_set_where (ginsn);
6374 }
6375 else if (i.mem_operands && i.index_reg)
6376 {
6377 /* jmp *0x0(,%rax,8). */
6378 dw2_regnum = ginsn_dw2_regnum (i.index_reg);
6379 ginsn = ginsn_new_jump (insn_end_sym, true,
6380 GINSN_SRC_REG, dw2_regnum, NULL);
6381 ginsn_set_where (ginsn);
6382 }
6383 else if (i.mem_operands && i.base_reg)
6384 {
6385 dw2_regnum = ginsn_dw2_regnum (i.base_reg);
6386 ginsn = ginsn_new_jump (insn_end_sym, true,
6387 GINSN_SRC_REG, dw2_regnum, NULL);
6388 ginsn_set_where (ginsn);
6389 }
6390 }
6391 else if (i.tm.extension_opcode == 2)
6392 {
6393 /* 0xFF /2 (call). */
6394 if (i.reg_operands)
6395 {
6396 dw2_regnum = ginsn_dw2_regnum (i.op[0].regs);
6397 ginsn = ginsn_new_call (insn_end_sym, true,
6398 GINSN_SRC_REG, dw2_regnum, NULL);
6399 ginsn_set_where (ginsn);
6400 }
6401 else if (i.mem_operands && i.base_reg)
6402 {
6403 dw2_regnum = ginsn_dw2_regnum (i.base_reg);
6404 ginsn = ginsn_new_call (insn_end_sym, true,
6405 GINSN_SRC_REG, dw2_regnum, NULL);
6406 ginsn_set_where (ginsn);
6407 }
6408 }
6409 break;
6410
6411 case 0xc2: /* ret imm16. */
6412 case 0xc3: /* ret. */
6413 if (i.tm.opcode_space != SPACE_BASE)
6414 break;
6415 /* Near ret. */
6416 ginsn = ginsn_new_return (insn_end_sym, true);
6417 ginsn_set_where (ginsn);
6418 break;
6419
6420 case 0xc8:
6421 if (i.tm.opcode_space != SPACE_BASE)
6422 break;
6423 /* enter. */
6424 ginsn = x86_ginsn_enter (insn_end_sym);
6425 break;
6426
6427 case 0xc9:
6428 if (i.tm.opcode_space != SPACE_BASE)
6429 break;
6430 /* leave. */
6431 ginsn = x86_ginsn_leave (insn_end_sym);
6432 break;
6433
6434 case 0xe0 ... 0xe2: /* loop / loope / loopne. */
6435 case 0xe3: /* jecxz / jrcxz. */
6436 if (i.tm.opcode_space != SPACE_BASE)
6437 break;
6438 ginsn = x86_ginsn_jump (insn_end_sym, true);
6439 ginsn_set_where (ginsn);
6440 break;
6441
6442 case 0xe8:
6443 if (i.tm.opcode_space != SPACE_BASE)
6444 break;
6445 /* PS: SCFI machinery does not care about which func is being
6446 called. OK to skip that info. */
6447 ginsn = ginsn_new_call (insn_end_sym, true,
6448 GINSN_SRC_SYMBOL, 0, NULL);
6449 ginsn_set_where (ginsn);
6450 break;
6451
6452 /* PS: opcode 0xe9 appears only after relaxation. Skip here. */
6453 case 0xeb:
6454 /* If opcode_space != SPACE_BASE, this is not a jmp insn. Skip it
6455 for GINSN_GEN_SCFI. */
6456 if (i.tm.opcode_space != SPACE_BASE)
6457 break;
6458 /* Unconditional jmp. */
6459 ginsn = x86_ginsn_jump (insn_end_sym, false);
6460 ginsn_set_where (ginsn);
6461 break;
6462
6463 default:
6464 /* TBD_GINSN_GEN_NOT_SCFI: Skip all other opcodes uninteresting for
6465 GINSN_GEN_SCFI mode. */
6466 break;
6467 }
6468
6469 if (!ginsn && !x86_ginsn_safe_to_skip_p ())
6470 {
6471 /* For all unhandled insns that are not whitelisted, check that they do
6472 not impact SCFI correctness. */
6473 err = x86_ginsn_unhandled ();
6474 switch (err)
6475 {
6476 case X86_GINSN_UNHANDLED_NONE:
6477 break;
6478 case X86_GINSN_UNHANDLED_DEST_REG:
6479 /* Not all writes to REG_FP are harmful in context of SCFI. Simply
6480 generate a GINSN_TYPE_OTHER with destination set to the
6481 appropriate register. The SCFI machinery will bail out if this
6482 ginsn affects SCFI correctness. */
6483 dw2_regnum = ginsn_dw2_regnum (i.op[i.operands - 1].regs);
6484 ginsn = ginsn_new_other (insn_end_sym, true,
6485 GINSN_SRC_IMM, 0,
6486 GINSN_SRC_IMM, 0,
6487 GINSN_DST_REG, dw2_regnum);
6488 ginsn_set_where (ginsn);
6489 break;
6490 case X86_GINSN_UNHANDLED_CFG:
6491 case X86_GINSN_UNHANDLED_STACKOP:
6492 as_bad (_("SCFI: unhandled op %#x may cause incorrect CFI"), opcode);
6493 break;
6494 case X86_GINSN_UNHANDLED_UNEXPECTED:
6495 as_bad (_("SCFI: unexpected op %#x may cause incorrect CFI"),
6496 opcode);
6497 break;
6498 default:
6499 abort ();
6500 break;
6501 }
6502 }
6503
6504 return ginsn;
6505}
6506
6507#endif
6508
252b5132
RH
6509/* This is the guts of the machine-dependent assembler. LINE points to a
6510 machine dependent instruction. This function is supposed to emit
6511 the frags/bytes it assembles to. */
6512
6513void
65da13b5 6514md_assemble (char *line)
252b5132 6515{
40fb9820 6516 unsigned int j;
9db83a32 6517 char mnemonic[MAX_MNEM_SIZE], mnem_suffix = 0, *copy = NULL;
2d4c39a8 6518 char *xstrdup_copy = NULL;
04784e33
JB
6519 const char *end, *pass1_mnem = NULL;
6520 enum i386_error pass1_err = 0;
d3ce72d0 6521 const insn_template *t;
b5482fe5
JB
6522 struct last_insn *last_insn
6523 = &seg_info(now_seg)->tc_segment_info_data.last_insn;
252b5132 6524
47926f60 6525 /* Initialize globals. */
d3b01414 6526 current_templates.end = current_templates.start = NULL;
04784e33 6527 retry:
edd67638 6528 init_globals ();
252b5132 6529
175ce60f
JB
6530 /* Suppress optimization when the last thing we saw may not have been
6531 a proper instruction (e.g. a stand-alone prefix or .byte). */
6532 if (last_insn->kind != last_insn_other)
6533 i.no_optimize = true;
6534
252b5132
RH
6535 /* First parse an instruction mnemonic & call i386_operand for the operands.
6536 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 6537 start of a (possibly prefixed) mnemonic. */
252b5132 6538
edd67638 6539 end = parse_insn (line, mnemonic, false);
5317ad2c 6540 if (end == NULL)
04784e33
JB
6541 {
6542 if (pass1_mnem != NULL)
6543 goto match_error;
9db83a32
JB
6544 if (i.error != no_error)
6545 {
d3b01414
JB
6546 gas_assert (current_templates.start != NULL);
6547 if (may_need_pass2 (current_templates.start) && !i.suffix)
9db83a32
JB
6548 goto no_match;
6549 /* No point in trying a 2nd pass - it'll only find the same suffix
6550 again. */
6551 mnem_suffix = i.suffix;
6552 goto match_error;
6553 }
04784e33
JB
6554 return;
6555 }
d3b01414 6556 t = current_templates.start;
2d4c39a8
L
6557 /* NB: LINE may be change to be the same as XSTRDUP_COPY. */
6558 if (xstrdup_copy != line && may_need_pass2 (t))
04784e33
JB
6559 {
6560 /* Make a copy of the full line in case we need to retry. */
2d4c39a8
L
6561 xstrdup_copy = xstrdup (line);
6562 copy = xstrdup_copy;
04784e33 6563 }
5317ad2c 6564 line += end - line;
83b16ac6 6565 mnem_suffix = i.suffix;
252b5132 6566
29b0f896 6567 line = parse_operands (line, mnemonic);
ee86248c 6568 this_operand = -1;
29b0f896 6569 if (line == NULL)
04784e33 6570 {
2d4c39a8 6571 free (xstrdup_copy);
04784e33
JB
6572 return;
6573 }
252b5132 6574
29b0f896
AM
6575 /* Now we've parsed the mnemonic into a set of templates, and have the
6576 operands at hand. */
6577
b630c145 6578 /* All Intel opcodes have reversed operands except for "bound", "enter",
c0e54661 6579 "invlpg*", "monitor*", "mwait*", "tpause", "umwait", "pvalidate",
b0e8fa7f
TJ
6580 "rmpadjust", "rmpupdate", and "rmpquery". We also don't reverse
6581 intersegment "jmp" and "call" instructions with 2 immediate operands so
6582 that the immediate segment precedes the offset consistently in Intel and
6583 AT&T modes. */
4d456e3d
L
6584 if (intel_syntax
6585 && i.operands > 1
6d86a545
JB
6586 && (t->mnem_off != MN_bound)
6587 && !startswith (mnemonic, "invlpg")
d34049e8
ML
6588 && !startswith (mnemonic, "monitor")
6589 && !startswith (mnemonic, "mwait")
6d86a545 6590 && (t->mnem_off != MN_pvalidate)
d34049e8 6591 && !startswith (mnemonic, "rmp")
6d86a545
JB
6592 && (t->mnem_off != MN_tpause)
6593 && (t->mnem_off != MN_umwait)
47c0279b
JB
6594 && !(i.operands == 2
6595 && operand_type_check (i.types[0], imm)
40fb9820 6596 && operand_type_check (i.types[1], imm)))
29b0f896
AM
6597 swap_operands ();
6598
e7d74879
JB
6599 /* The order of the immediates should be reversed for 2-immediates EXTRQ
6600 and INSERTQ instructions. Also UWRMSR wants its immediate to be in the
6601 "canonical" place (first), despite it appearing last (in AT&T syntax, or
6602 because of the swapping above) in the incoming set of operands. */
6603 if ((i.imm_operands == 2
6604 && (t->mnem_off == MN_extrq || t->mnem_off == MN_insertq))
6605 || (t->mnem_off == MN_uwrmsr && i.imm_operands
6606 && i.operands > i.imm_operands))
ec56d5c0
JB
6607 swap_2_operands (0, 1);
6608
29b0f896 6609 if (i.imm_operands)
8170af78
HL
6610 {
6611 /* For USER_MSR instructions, imm32 stands for the name of an model specific
6612 register (MSR). That's an unsigned quantity, whereas all other insns with
6613 32-bit immediate and 64-bit operand size use sign-extended
6614 immediates (imm32s). Therefore these insns are special-cased, bypassing
6615 the normal handling of immediates here. */
d3b01414 6616 if (is_cpu(current_templates.start, CpuUSER_MSR))
8170af78
HL
6617 {
6618 for (j = 0; j < i.operands; j++)
6619 {
6620 if (operand_type_check(i.types[j], imm))
6621 i.types[j] = smallest_imm_type (i.op[j].imms->X_add_number);
6622 }
6623 }
6624 else
6625 optimize_imm ();
6626 }
29b0f896 6627
0de704b9
JB
6628 if (i.disp_operands && !optimize_disp (t))
6629 return;
29b0f896
AM
6630
6631 /* Next, we find a template that matches the given insn,
6632 making sure the overlap of the given operands types is consistent
6633 with the template operand types. */
252b5132 6634
83b16ac6 6635 if (!(t = match_template (mnem_suffix)))
04784e33
JB
6636 {
6637 const char *err_msg;
6638
6639 if (copy && !mnem_suffix)
6640 {
6641 line = copy;
6642 copy = NULL;
9db83a32 6643 no_match:
04784e33 6644 pass1_err = i.error;
d3b01414 6645 pass1_mnem = insn_name (current_templates.start);
04784e33
JB
6646 goto retry;
6647 }
9db83a32
JB
6648
6649 /* If a non-/only-64bit template (group) was found in pass 1, and if
6650 _some_ template (group) was found in pass 2, squash pass 1's
6651 error. */
6652 if (pass1_err == unsupported_64bit)
6653 pass1_mnem = NULL;
6654
04784e33 6655 match_error:
2d4c39a8 6656 free (xstrdup_copy);
9db83a32 6657
04784e33
JB
6658 switch (pass1_mnem ? pass1_err : i.error)
6659 {
6660 default:
6661 abort ();
6662 case operand_size_mismatch:
6663 err_msg = _("operand size mismatch");
6664 break;
6665 case operand_type_mismatch:
6666 err_msg = _("operand type mismatch");
6667 break;
6668 case register_type_mismatch:
6669 err_msg = _("register type mismatch");
6670 break;
6671 case number_of_operands_mismatch:
6672 err_msg = _("number of operands mismatch");
6673 break;
6674 case invalid_instruction_suffix:
6675 err_msg = _("invalid instruction suffix");
6676 break;
6677 case bad_imm4:
6678 err_msg = _("constant doesn't fit in 4 bits");
6679 break;
6680 case unsupported_with_intel_mnemonic:
6681 err_msg = _("unsupported with Intel mnemonic");
6682 break;
6683 case unsupported_syntax:
6684 err_msg = _("unsupported syntax");
6685 break;
80d61d8d
CL
6686 case unsupported_EGPR_for_addressing:
6687 err_msg = _("extended GPR cannot be used as base/index");
6688 break;
dd74a603
CL
6689 case unsupported_nf:
6690 err_msg = _("{nf} unsupported");
6691 break;
04784e33
JB
6692 case unsupported:
6693 as_bad (_("unsupported instruction `%s'"),
d3b01414 6694 pass1_mnem ? pass1_mnem : insn_name (current_templates.start));
04784e33 6695 return;
9db83a32
JB
6696 case unsupported_on_arch:
6697 as_bad (_("`%s' is not supported on `%s%s'"),
d3b01414 6698 pass1_mnem ? pass1_mnem : insn_name (current_templates.start),
9db83a32
JB
6699 cpu_arch_name ? cpu_arch_name : default_arch,
6700 cpu_sub_arch_name ? cpu_sub_arch_name : "");
6701 return;
6702 case unsupported_64bit:
6703 if (ISLOWER (mnem_suffix))
e8b4b7b2
NC
6704 {
6705 if (flag_code == CODE_64BIT)
6706 as_bad (_("`%s%c' is not supported in 64-bit mode"),
d3b01414 6707 pass1_mnem ? pass1_mnem : insn_name (current_templates.start),
e8b4b7b2
NC
6708 mnem_suffix);
6709 else
6710 as_bad (_("`%s%c' is only supported in 64-bit mode"),
d3b01414 6711 pass1_mnem ? pass1_mnem : insn_name (current_templates.start),
e8b4b7b2
NC
6712 mnem_suffix);
6713 }
9db83a32 6714 else
e8b4b7b2
NC
6715 {
6716 if (flag_code == CODE_64BIT)
6717 as_bad (_("`%s' is not supported in 64-bit mode"),
d3b01414 6718 pass1_mnem ? pass1_mnem : insn_name (current_templates.start));
e8b4b7b2
NC
6719 else
6720 as_bad (_("`%s' is only supported in 64-bit mode"),
d3b01414 6721 pass1_mnem ? pass1_mnem : insn_name (current_templates.start));
e8b4b7b2 6722 }
9db83a32 6723 return;
54294d73
JB
6724 case no_vex_encoding:
6725 err_msg = _("no VEX/XOP encoding");
6726 break;
6727 case no_evex_encoding:
6728 err_msg = _("no EVEX encoding");
6729 break;
04784e33
JB
6730 case invalid_sib_address:
6731 err_msg = _("invalid SIB address");
6732 break;
6733 case invalid_vsib_address:
6734 err_msg = _("invalid VSIB address");
6735 break;
6736 case invalid_vector_register_set:
6737 err_msg = _("mask, index, and destination registers must be distinct");
6738 break;
6739 case invalid_tmm_register_set:
6740 err_msg = _("all tmm registers must be distinct");
6741 break;
6742 case invalid_dest_and_src_register_set:
6743 err_msg = _("destination and source registers must be distinct");
6744 break;
08a98d4c
MZ
6745 case invalid_dest_register_set:
6746 err_msg = _("two dest registers must be distinct");
6747 break;
80d61d8d
CL
6748 case invalid_pseudo_prefix:
6749 err_msg = _("rex2 pseudo prefix cannot be used");
6750 break;
04784e33
JB
6751 case unsupported_vector_index_register:
6752 err_msg = _("unsupported vector index register");
6753 break;
6754 case unsupported_broadcast:
6755 err_msg = _("unsupported broadcast");
6756 break;
6757 case broadcast_needed:
6758 err_msg = _("broadcast is needed for operand of such type");
6759 break;
6760 case unsupported_masking:
6761 err_msg = _("unsupported masking");
6762 break;
6763 case mask_not_on_destination:
6764 err_msg = _("mask not on destination operand");
6765 break;
6766 case no_default_mask:
6767 err_msg = _("default mask isn't allowed");
6768 break;
6769 case unsupported_rc_sae:
6770 err_msg = _("unsupported static rounding/sae");
6771 break;
54294d73
JB
6772 case unsupported_vector_size:
6773 as_bad (_("vector size above %u required for `%s'"), 128u << vector_size,
d3b01414 6774 pass1_mnem ? pass1_mnem : insn_name (current_templates.start));
54294d73 6775 return;
08a98d4c
MZ
6776 case unsupported_rsp_register:
6777 err_msg = _("'rsp' register cannot be used");
6778 break;
58bceb18
JB
6779 case internal_error:
6780 err_msg = _("internal error");
6781 break;
04784e33
JB
6782 }
6783 as_bad (_("%s for `%s'"), err_msg,
d3b01414 6784 pass1_mnem ? pass1_mnem : insn_name (current_templates.start));
04784e33
JB
6785 return;
6786 }
6787
2d4c39a8 6788 free (xstrdup_copy);
252b5132 6789
7bab8ab5 6790 if (sse_check != check_none
ffb86450
JB
6791 /* The opcode space check isn't strictly needed; it's there only to
6792 bypass the logic below when easily possible. */
ddb62495
JB
6793 && t->opcode_space >= SPACE_0F
6794 && t->opcode_space <= SPACE_0F3A
734dfd1c 6795 && !is_cpu (&i.tm, CpuSSE4a)
ffb86450 6796 && !is_any_vex_encoding (t))
daf50ae7 6797 {
06360a5c
JB
6798 /* Some KL and all WideKL insns have only implicit %xmm operands. */
6799 bool simd = is_cpu (t, CpuKL) || is_cpu (t, CpuWideKL);
ffb86450
JB
6800
6801 for (j = 0; j < t->operands; ++j)
6802 {
6803 if (t->operand_types[j].bitfield.class == RegMMX)
6804 break;
6805 if (t->operand_types[j].bitfield.class == RegSIMD)
6806 simd = true;
6807 }
6808
6809 if (j >= t->operands && simd)
6810 (sse_check == check_warning
6811 ? as_warn
76d3f746 6812 : as_bad) (_("SSE instruction `%s' is used"), insn_name (&i.tm));
daf50ae7
L
6813 }
6814
40fb9820 6815 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
6816 if (!add_prefix (FWAIT_OPCODE))
6817 return;
252b5132 6818
d5de92cf 6819 /* Check if REP prefix is OK. */
742732c7 6820 if (i.rep_prefix && i.tm.opcode_modifier.prefixok != PrefixRep)
d5de92cf
L
6821 {
6822 as_bad (_("invalid instruction `%s' after `%s'"),
76d3f746 6823 insn_name (&i.tm), i.rep_prefix);
d5de92cf
L
6824 return;
6825 }
6826
c1ba0266
L
6827 /* Check for lock without a lockable instruction. Destination operand
6828 must be memory unless it is xchg (0x86). */
9a4a4499
JB
6829 if (i.prefix[LOCK_PREFIX])
6830 {
6831 if (i.tm.opcode_modifier.prefixok < PrefixLock
c1ba0266
L
6832 || i.mem_operands == 0
6833 || (i.tm.base_opcode != 0x86
9a4a4499
JB
6834 && !(i.flags[i.operands - 1] & Operand_Mem)))
6835 {
6836 as_bad (_("expecting lockable instruction after `lock'"));
6837 return;
6838 }
6839
6840 /* Zap the redundant prefix from XCHG when optimizing. */
6841 if (i.tm.base_opcode == 0x86 && optimize && !i.no_optimize)
6842 i.prefix[LOCK_PREFIX] = 0;
c32fa91d
L
6843 }
6844
e3669c7f
JB
6845 if (is_any_vex_encoding (&i.tm)
6846 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
6847 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX)
7a8655d2 6848 {
e3669c7f
JB
6849 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
6850 if (i.prefix[DATA_PREFIX])
6851 {
76d3f746 6852 as_bad (_("data size prefix invalid with `%s'"), insn_name (&i.tm));
e3669c7f
JB
6853 return;
6854 }
6855
6856 /* Don't allow e.g. KMOV in TLS code sequences. */
6857 for (j = i.imm_operands; j < i.operands; ++j)
6858 switch (i.reloc[j])
6859 {
5bc71c2a
L
6860 case BFD_RELOC_X86_64_GOTTPOFF:
6861 if (i.tm.mnem_off == MN_add
6862 && i.tm.opcode_space == SPACE_EVEXMAP4
6863 && i.mem_operands == 1
6864 && i.base_reg
6865 && i.base_reg->reg_num == RegIP
6866 && i.tm.operand_types[0].bitfield.class == Reg
6867 && i.tm.operand_types[2].bitfield.class == Reg)
6868 /* Allow APX: add %reg1, foo@gottpoff(%rip), %reg2. */
6869 break;
6870 /* Fall through. */
e3669c7f
JB
6871 case BFD_RELOC_386_TLS_GOTIE:
6872 case BFD_RELOC_386_TLS_LE_32:
e3669c7f 6873 case BFD_RELOC_X86_64_TLSLD:
76d3f746 6874 as_bad (_("TLS relocation cannot be used with `%s'"), insn_name (&i.tm));
e3669c7f
JB
6875 return;
6876 default:
6877 break;
6878 }
7a8655d2
JB
6879 }
6880
42164a71 6881 /* Check if HLE prefix is OK. */
165de32a 6882 if (i.hle_prefix && !check_hle ())
42164a71
L
6883 return;
6884
7e8b059b
L
6885 /* Check BND prefix. */
6886 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
6887 as_bad (_("expecting valid branch instruction after `bnd'"));
6888
04ef582a 6889 /* Check NOTRACK prefix. */
742732c7 6890 if (i.notrack_prefix && i.tm.opcode_modifier.prefixok != PrefixNoTrack)
9fef80d6 6891 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 6892
734dfd1c 6893 if (is_cpu (&i.tm, CpuMPX))
327e8c42
JB
6894 {
6895 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
6896 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
6897 else if (flag_code != CODE_16BIT
6898 ? i.prefix[ADDR_PREFIX]
6899 : i.mem_operands && !i.prefix[ADDR_PREFIX])
6900 as_bad (_("16-bit address isn't allowed in MPX instructions"));
6901 }
7e8b059b
L
6902
6903 /* Insert BND prefix. */
76d3a78a
JB
6904 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
6905 {
6906 if (!i.prefix[BND_PREFIX])
6907 add_prefix (BND_PREFIX_OPCODE);
6908 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
6909 {
6910 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
6911 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
6912 }
6913 }
7e8b059b 6914
29b0f896 6915 /* Check string instruction segment overrides. */
51c8edf6 6916 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 6917 {
51c8edf6 6918 gas_assert (i.mem_operands);
29b0f896 6919 if (!check_string ())
5dd0794d 6920 return;
fc0763e6 6921 i.disp_operands = 0;
29b0f896 6922 }
5dd0794d 6923
9373f275
L
6924 /* The memory operand of (%dx) should be only used with input/output
6925 instructions (base opcodes: 0x6c, 0x6e, 0xec, 0xee). */
6926 if (i.input_output_operand
6927 && ((i.tm.base_opcode | 0x82) != 0xee
ddb62495 6928 || i.tm.opcode_space != SPACE_BASE))
9373f275
L
6929 {
6930 as_bad (_("input/output port address isn't allowed with `%s'"),
76d3f746 6931 insn_name (&i.tm));
9373f275
L
6932 return;
6933 }
6934
b6f8c7c4
L
6935 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
6936 optimize_encoding ();
6937
eb3f3841
JB
6938 /* Past optimization there's no need to distinguish encoding_evex,
6939 encoding_evex512, and encoding_egpr anymore. */
e346d50a
JB
6940 if (i.encoding == encoding_evex512)
6941 i.encoding = encoding_evex;
eb3f3841
JB
6942 else if (i.encoding == encoding_egpr)
6943 i.encoding = is_any_vex_encoding (&i.tm) ? encoding_evex
6944 : encoding_default;
a6f3add0 6945
c8480b58
L
6946 if (use_unaligned_vector_move)
6947 encode_with_unaligned_vector_move ();
6948
29b0f896
AM
6949 if (!process_suffix ())
6950 return;
e413e4e9 6951
ef07be45 6952 /* Check if IP-relative addressing requirements can be satisfied. */
734dfd1c 6953 if (is_cpu (&i.tm, CpuPREFETCHI)
ef07be45 6954 && !(i.base_reg && i.base_reg->reg_num == RegIP))
76d3f746 6955 as_warn (_("'%s' only supports RIP-relative address"), insn_name (&i.tm));
ef07be45 6956
921eafea 6957 /* Update operand types and check extended states. */
bc0844ae 6958 for (j = 0; j < i.operands; j++)
921eafea
L
6959 {
6960 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
3d70986f 6961 switch (i.tm.operand_types[j].bitfield.class)
921eafea
L
6962 {
6963 default:
6964 break;
6965 case RegMMX:
6966 i.xstate |= xstate_mmx;
6967 break;
6968 case RegMask:
32930e4e 6969 i.xstate |= xstate_mask;
921eafea
L
6970 break;
6971 case RegSIMD:
3d70986f 6972 if (i.tm.operand_types[j].bitfield.tmmword)
921eafea 6973 i.xstate |= xstate_tmm;
4fc85f37 6974 else if (i.tm.operand_types[j].bitfield.zmmword
a6f3add0 6975 && !i.tm.opcode_modifier.vex
4fc85f37 6976 && vector_size >= VSZ512)
921eafea 6977 i.xstate |= xstate_zmm;
4fc85f37
JB
6978 else if (i.tm.operand_types[j].bitfield.ymmword
6979 && vector_size >= VSZ256)
921eafea 6980 i.xstate |= xstate_ymm;
3d70986f 6981 else if (i.tm.operand_types[j].bitfield.xmmword)
921eafea
L
6982 i.xstate |= xstate_xmm;
6983 break;
6984 }
6985 }
bc0844ae 6986
29b0f896
AM
6987 /* Make still unresolved immediate matches conform to size of immediate
6988 given in i.suffix. */
6989 if (!finalize_imm ())
6990 return;
252b5132 6991
40fb9820 6992 if (i.types[0].bitfield.imm1)
29b0f896 6993 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 6994
29b0f896
AM
6995 /* For insns with operands there are more diddles to do to the opcode. */
6996 if (i.operands)
6997 {
6998 if (!process_operands ())
6999 return;
7000 }
255571cd 7001 else if (!quiet_warnings && i.tm.opcode_modifier.operandconstraint == UGH)
29b0f896
AM
7002 {
7003 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
76d3f746 7004 as_warn (_("translating to `%sp'"), insn_name (&i.tm));
29b0f896 7005 }
252b5132 7006
7a8655d2 7007 if (is_any_vex_encoding (&i.tm))
9e5e5283 7008 {
c1dc7af5 7009 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 7010 {
c1dc7af5 7011 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
76d3f746 7012 insn_name (&i.tm));
9e5e5283
L
7013 return;
7014 }
c0f3af97 7015
0b9404fd
JB
7016 /* Check for explicit REX prefix. */
7017 if (i.prefix[REX_PREFIX] || i.rex_encoding)
7018 {
76d3f746 7019 as_bad (_("REX prefix invalid with `%s'"), insn_name (&i.tm));
0b9404fd
JB
7020 return;
7021 }
7022
80d61d8d
CL
7023 /* Check for explicit REX2 prefix. */
7024 if (i.rex2_encoding)
7025 {
7026 as_bad (_("{rex2} prefix invalid with `%s'"), insn_name (&i.tm));
7027 return;
7028 }
7029
6177c84d
CL
7030 if (is_apx_evex_encoding ())
7031 build_apx_evex_prefix ();
7032 else if (i.tm.opcode_modifier.vex)
9e5e5283
L
7033 build_vex_prefix (t);
7034 else
7035 build_evex_prefix ();
0b9404fd
JB
7036
7037 /* The individual REX.RXBW bits got consumed. */
7038 i.rex &= REX_OPCODE;
6177c84d
CL
7039
7040 /* The rex2 bits got consumed. */
7041 i.rex2 = 0;
9e5e5283 7042 }
43234a1e 7043
7fc69528
JB
7044 /* Handle conversion of 'int $3' --> special int3 insn. */
7045 if (i.tm.mnem_off == MN_int
a6461c02 7046 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
7047 {
7048 i.tm.base_opcode = INT3_OPCODE;
7049 i.imm_operands = 0;
7050 }
252b5132 7051
0cfa3eb3
JB
7052 if ((i.tm.opcode_modifier.jump == JUMP
7053 || i.tm.opcode_modifier.jump == JUMP_BYTE
7054 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
7055 && i.op[0].disps->X_op == O_constant)
7056 {
7057 /* Convert "jmp constant" (and "call constant") to a jump (call) to
7058 the absolute address given by the constant. Since ix86 jumps and
7059 calls are pc relative, we need to generate a reloc. */
7060 i.op[0].disps->X_add_symbol = &abs_symbol;
7061 i.op[0].disps->X_op = O_symbol;
7062 }
252b5132 7063
ce705688 7064 establish_rex ();
29b0f896 7065
b5482fe5 7066 insert_lfence_before (last_insn);
ae531041 7067
29b0f896 7068 /* We are ready to output the insn. */
b5482fe5 7069 output_insn (last_insn);
e379e5f3 7070
c7defc53
IB
7071#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7072 /* PS: SCFI is enabled only for System V AMD64 ABI. The ABI check has been
7073 performed in i386_target_format. */
7074 if (IS_ELF && flag_synth_cfi)
7075 {
7076 ginsnS *ginsn;
7077 ginsn = x86_ginsn_new (symbol_temp_new_now (), frch_ginsn_gen_mode ());
7078 frch_ginsn_data_append (ginsn);
7079 }
7080#endif
7081
ae531041
L
7082 insert_lfence_after ();
7083
e379e5f3
L
7084 if (i.tm.opcode_modifier.isprefix)
7085 {
b5482fe5
JB
7086 last_insn->kind = last_insn_prefix;
7087 last_insn->name = insn_name (&i.tm);
7088 last_insn->file = as_where (&last_insn->line);
e379e5f3
L
7089 }
7090 else
b5482fe5 7091 last_insn->kind = last_insn_other;
29b0f896
AM
7092}
7093
9db83a32
JB
7094/* The Q suffix is generally valid only in 64-bit mode, with very few
7095 exceptions: fild, fistp, fisttp, and cmpxchg8b. Note that for fild
7096 and fisttp only one of their two templates is matched below: That's
7097 sufficient since other relevant attributes are the same between both
7098 respective templates. */
7099static INLINE bool q_suffix_allowed(const insn_template *t)
7100{
7101 return flag_code == CODE_64BIT
ddb62495 7102 || (t->opcode_space == SPACE_BASE
9db83a32
JB
7103 && t->base_opcode == 0xdf
7104 && (t->extension_opcode & 1)) /* fild / fistp / fisttp */
7fc69528 7105 || t->mnem_off == MN_cmpxchg8b;
9db83a32
JB
7106}
7107
5317ad2c 7108static const char *
edd67638 7109parse_insn (const char *line, char *mnemonic, bool prefix_only)
29b0f896 7110{
5317ad2c 7111 const char *l = line, *token_start = l;
29b0f896 7112 char *mnem_p;
d3b01414 7113 bool pass1 = !current_templates.start;
5c6af06e 7114 int supported;
d3ce72d0 7115 const insn_template *t;
b6169b20 7116 char *dot_p = NULL;
29b0f896 7117
29b0f896
AM
7118 while (1)
7119 {
7120 mnem_p = mnemonic;
778415f5
JB
7121 /* Pseudo-prefixes start with an opening figure brace. */
7122 if ((*mnem_p = *l) == '{')
7123 {
7124 ++mnem_p;
7125 ++l;
7126 }
29b0f896
AM
7127 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
7128 {
b6169b20
L
7129 if (*mnem_p == '.')
7130 dot_p = mnem_p;
29b0f896
AM
7131 mnem_p++;
7132 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 7133 {
778415f5 7134 too_long:
29b0f896
AM
7135 as_bad (_("no such instruction: `%s'"), token_start);
7136 return NULL;
7137 }
7138 l++;
7139 }
778415f5
JB
7140 /* Pseudo-prefixes end with a closing figure brace. */
7141 if (*mnemonic == '{' && *l == '}')
7142 {
7143 *mnem_p++ = *l++;
7144 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
7145 goto too_long;
7146 *mnem_p = '\0';
7147
7148 /* Point l at the closing brace if there's no other separator. */
7149 if (*l != END_OF_INSN && !is_space_char (*l)
7150 && *l != PREFIX_SEPARATOR)
7151 --l;
7152 }
7153 else if (!is_space_char (*l)
7154 && *l != END_OF_INSN
7155 && (intel_syntax
7156 || (*l != PREFIX_SEPARATOR && *l != ',')))
29b0f896 7157 {
edd67638
JB
7158 if (prefix_only)
7159 break;
29b0f896
AM
7160 as_bad (_("invalid character %s in mnemonic"),
7161 output_invalid (*l));
7162 return NULL;
7163 }
7164 if (token_start == l)
7165 {
e44823cf 7166 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
7167 as_bad (_("expecting prefix; got nothing"));
7168 else
7169 as_bad (_("expecting mnemonic; got nothing"));
7170 return NULL;
7171 }
45288df1 7172
29b0f896 7173 /* Look up instruction (or prefix) via hash table. */
d3b01414 7174 op_lookup (mnemonic);
47926f60 7175
29b0f896
AM
7176 if (*l != END_OF_INSN
7177 && (!is_space_char (*l) || l[1] != END_OF_INSN)
d3b01414
JB
7178 && current_templates.start
7179 && current_templates.start->opcode_modifier.isprefix)
29b0f896 7180 {
d3b01414 7181 supported = cpu_flags_match (current_templates.start);
3086ed9a 7182 if (!(supported & CPU_FLAGS_64BIT_MATCH))
2dd88dca
JB
7183 {
7184 as_bad ((flag_code != CODE_64BIT
7185 ? _("`%s' is only supported in 64-bit mode")
7186 : _("`%s' is not supported in 64-bit mode")),
d3b01414 7187 insn_name (current_templates.start));
2dd88dca
JB
7188 return NULL;
7189 }
3086ed9a
JB
7190 if (supported != CPU_FLAGS_PERFECT_MATCH)
7191 {
7192 as_bad (_("`%s' is not supported on `%s%s'"),
d3b01414 7193 insn_name (current_templates.start),
3086ed9a
JB
7194 cpu_arch_name ? cpu_arch_name : default_arch,
7195 cpu_sub_arch_name ? cpu_sub_arch_name : "");
7196 return NULL;
7197 }
29b0f896
AM
7198 /* If we are in 16-bit mode, do not allow addr16 or data16.
7199 Similarly, in 32-bit mode, do not allow addr32 or data32. */
d3b01414
JB
7200 if ((current_templates.start->opcode_modifier.size == SIZE16
7201 || current_templates.start->opcode_modifier.size == SIZE32)
29b0f896 7202 && flag_code != CODE_64BIT
d3b01414 7203 && ((current_templates.start->opcode_modifier.size == SIZE32)
29b0f896
AM
7204 ^ (flag_code == CODE_16BIT)))
7205 {
7206 as_bad (_("redundant %s prefix"),
d3b01414 7207 insn_name (current_templates.start));
29b0f896 7208 return NULL;
45288df1 7209 }
31184569 7210
d3b01414 7211 if (current_templates.start->base_opcode == PSEUDO_PREFIX)
29b0f896 7212 {
86fa6981 7213 /* Handle pseudo prefixes. */
d3b01414 7214 switch (current_templates.start->extension_opcode)
86fa6981 7215 {
41eb8e88 7216 case Prefix_Disp8:
86fa6981
L
7217 /* {disp8} */
7218 i.disp_encoding = disp_encoding_8bit;
7219 break;
41eb8e88
L
7220 case Prefix_Disp16:
7221 /* {disp16} */
7222 i.disp_encoding = disp_encoding_16bit;
7223 break;
7224 case Prefix_Disp32:
86fa6981
L
7225 /* {disp32} */
7226 i.disp_encoding = disp_encoding_32bit;
7227 break;
41eb8e88 7228 case Prefix_Load:
86fa6981
L
7229 /* {load} */
7230 i.dir_encoding = dir_encoding_load;
7231 break;
41eb8e88 7232 case Prefix_Store:
86fa6981
L
7233 /* {store} */
7234 i.dir_encoding = dir_encoding_store;
7235 break;
41eb8e88 7236 case Prefix_VEX:
42e04b36 7237 /* {vex} */
e346d50a 7238 i.encoding = encoding_vex;
86fa6981 7239 break;
41eb8e88 7240 case Prefix_VEX3:
86fa6981 7241 /* {vex3} */
e346d50a 7242 i.encoding = encoding_vex3;
86fa6981 7243 break;
41eb8e88 7244 case Prefix_EVEX:
86fa6981 7245 /* {evex} */
e346d50a 7246 i.encoding = encoding_evex;
86fa6981 7247 break;
41eb8e88 7248 case Prefix_REX:
6b6b6807 7249 /* {rex} */
5b7c81bd 7250 i.rex_encoding = true;
6b6b6807 7251 break;
80d61d8d
CL
7252 case Prefix_REX2:
7253 /* {rex2} */
7254 i.rex2_encoding = true;
7255 break;
dd74a603
CL
7256 case Prefix_NF:
7257 /* {nf} */
7258 i.has_nf = true;
7259 if (i.encoding == encoding_default)
7260 i.encoding = encoding_evex;
7261 break;
41eb8e88 7262 case Prefix_NoOptimize:
b6f8c7c4 7263 /* {nooptimize} */
5b7c81bd 7264 i.no_optimize = true;
b6f8c7c4 7265 break;
86fa6981
L
7266 default:
7267 abort ();
7268 }
dd74a603
CL
7269 if (i.has_nf && i.encoding != encoding_evex)
7270 {
7271 as_bad (_("{nf} cannot be combined with {vex}/{vex3}"));
7272 return NULL;
7273 }
86fa6981
L
7274 }
7275 else
7276 {
7277 /* Add prefix, checking for repeated prefixes. */
d3b01414 7278 switch (add_prefix (current_templates.start->base_opcode))
86fa6981 7279 {
4e9ac44a
L
7280 case PREFIX_EXIST:
7281 return NULL;
7282 case PREFIX_DS:
d3b01414
JB
7283 if (is_cpu (current_templates.start, CpuIBT))
7284 i.notrack_prefix = insn_name (current_templates.start);
4e9ac44a
L
7285 break;
7286 case PREFIX_REP:
d3b01414
JB
7287 if (is_cpu (current_templates.start, CpuHLE))
7288 i.hle_prefix = insn_name (current_templates.start);
7289 else if (is_cpu (current_templates.start, CpuMPX))
7290 i.bnd_prefix = insn_name (current_templates.start);
4e9ac44a 7291 else
d3b01414 7292 i.rep_prefix = insn_name (current_templates.start);
4e9ac44a
L
7293 break;
7294 default:
7295 break;
86fa6981 7296 }
29b0f896
AM
7297 }
7298 /* Skip past PREFIX_SEPARATOR and reset token_start. */
7299 token_start = ++l;
7300 }
7301 else
7302 break;
7303 }
45288df1 7304
edd67638
JB
7305 if (prefix_only)
7306 return token_start;
7307
d3b01414 7308 if (!current_templates.start)
b6169b20 7309 {
07d5e953
JB
7310 /* Deprecated functionality (new code should use pseudo-prefixes instead):
7311 Check if we should swap operand or force 32bit displacement in
f8a5c266 7312 encoding. */
30a55f88 7313 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
97f31cb4
JB
7314 {
7315 if (i.dir_encoding == dir_encoding_default)
7316 i.dir_encoding = dir_encoding_swap;
7317 else
7318 as_warn (_("ignoring `.s' suffix due to earlier `{%s}'"),
7319 i.dir_encoding == dir_encoding_load ? "load" : "store");
7320 }
8d63c93e 7321 else if (mnem_p - 3 == dot_p
a501d77e
L
7322 && dot_p[1] == 'd'
7323 && dot_p[2] == '8')
97f31cb4
JB
7324 {
7325 if (i.disp_encoding == disp_encoding_default)
7326 i.disp_encoding = disp_encoding_8bit;
7327 else if (i.disp_encoding != disp_encoding_8bit)
7328 as_warn (_("ignoring `.d8' suffix due to earlier `{disp<N>}'"));
7329 }
8d63c93e 7330 else if (mnem_p - 4 == dot_p
f8a5c266
L
7331 && dot_p[1] == 'd'
7332 && dot_p[2] == '3'
7333 && dot_p[3] == '2')
97f31cb4
JB
7334 {
7335 if (i.disp_encoding == disp_encoding_default)
7336 i.disp_encoding = disp_encoding_32bit;
7337 else if (i.disp_encoding != disp_encoding_32bit)
7338 as_warn (_("ignoring `.d32' suffix due to earlier `{disp<N>}'"));
7339 }
30a55f88
L
7340 else
7341 goto check_suffix;
7342 mnem_p = dot_p;
7343 *dot_p = '\0';
d3b01414 7344 op_lookup (mnemonic);
b6169b20
L
7345 }
7346
d3b01414 7347 if (!current_templates.start || !pass1)
29b0f896 7348 {
d3b01414 7349 current_templates.start = NULL;
04784e33 7350
dc1e8a47 7351 check_suffix:
1c529385 7352 if (mnem_p > mnemonic)
29b0f896 7353 {
1c529385
LH
7354 /* See if we can get a match by trimming off a suffix. */
7355 switch (mnem_p[-1])
29b0f896 7356 {
1c529385
LH
7357 case WORD_MNEM_SUFFIX:
7358 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
7359 i.suffix = SHORT_MNEM_SUFFIX;
7360 else
1c529385
LH
7361 /* Fall through. */
7362 case BYTE_MNEM_SUFFIX:
7363 case QWORD_MNEM_SUFFIX:
7364 i.suffix = mnem_p[-1];
29b0f896 7365 mnem_p[-1] = '\0';
d3b01414 7366 op_lookup (mnemonic);
1c529385
LH
7367 break;
7368 case SHORT_MNEM_SUFFIX:
7369 case LONG_MNEM_SUFFIX:
7370 if (!intel_syntax)
7371 {
7372 i.suffix = mnem_p[-1];
7373 mnem_p[-1] = '\0';
d3b01414 7374 op_lookup (mnemonic);
1c529385
LH
7375 }
7376 break;
7377
7378 /* Intel Syntax. */
7379 case 'd':
7380 if (intel_syntax)
7381 {
7382 if (intel_float_operand (mnemonic) == 1)
7383 i.suffix = SHORT_MNEM_SUFFIX;
7384 else
7385 i.suffix = LONG_MNEM_SUFFIX;
7386 mnem_p[-1] = '\0';
d3b01414 7387 op_lookup (mnemonic);
1c529385 7388 }
04784e33
JB
7389 /* For compatibility reasons accept MOVSD and CMPSD without
7390 operands even in AT&T mode. */
7391 else if (*l == END_OF_INSN
7392 || (is_space_char (*l) && l[1] == END_OF_INSN))
7393 {
7394 mnem_p[-1] = '\0';
d3b01414
JB
7395 op_lookup (mnemonic);
7396 if (current_templates.start != NULL
04784e33 7397 /* MOVS or CMPS */
d3b01414
JB
7398 && (current_templates.start->base_opcode | 2) == 0xa6
7399 && current_templates.start->opcode_space
04784e33
JB
7400 == SPACE_BASE
7401 && mnem_p[-2] == 's')
7402 {
7403 as_warn (_("found `%sd'; assuming `%sl' was meant"),
7404 mnemonic, mnemonic);
7405 i.suffix = LONG_MNEM_SUFFIX;
7406 }
7407 else
7408 {
d3b01414 7409 current_templates.start = NULL;
04784e33
JB
7410 mnem_p[-1] = 'd';
7411 }
7412 }
1c529385 7413 break;
29b0f896 7414 }
29b0f896 7415 }
1c529385 7416
d3b01414 7417 if (!current_templates.start)
29b0f896 7418 {
04784e33
JB
7419 if (pass1)
7420 as_bad (_("no such instruction: `%s'"), token_start);
29b0f896
AM
7421 return NULL;
7422 }
7423 }
252b5132 7424
d3b01414
JB
7425 if (current_templates.start->opcode_modifier.jump == JUMP
7426 || current_templates.start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
7427 {
7428 /* Check for a branch hint. We allow ",pt" and ",pn" for
7429 predict taken and predict not taken respectively.
7430 I'm not sure that branch hints actually do anything on loop
7431 and jcxz insns (JumpByte) for current Pentium4 chips. They
7432 may work in the future and it doesn't hurt to accept them
7433 now. */
7434 if (l[0] == ',' && l[1] == 'p')
7435 {
7436 if (l[2] == 't')
7437 {
7438 if (!add_prefix (DS_PREFIX_OPCODE))
7439 return NULL;
7440 l += 3;
7441 }
7442 else if (l[2] == 'n')
7443 {
7444 if (!add_prefix (CS_PREFIX_OPCODE))
7445 return NULL;
7446 l += 3;
7447 }
7448 }
7449 }
7450 /* Any other comma loses. */
7451 if (*l == ',')
7452 {
7453 as_bad (_("invalid character %s in mnemonic"),
7454 output_invalid (*l));
7455 return NULL;
7456 }
252b5132 7457
29b0f896 7458 /* Check if instruction is supported on specified architecture. */
5c6af06e 7459 supported = 0;
d3b01414 7460 for (t = current_templates.start; t < current_templates.end; ++t)
5c6af06e 7461 {
c0f3af97 7462 supported |= cpu_flags_match (t);
9db83a32
JB
7463
7464 if (i.suffix == QWORD_MNEM_SUFFIX && !q_suffix_allowed (t))
7465 supported &= ~CPU_FLAGS_64BIT_MATCH;
7466
c0f3af97 7467 if (supported == CPU_FLAGS_PERFECT_MATCH)
d59a54c2 7468 return l;
29b0f896 7469 }
3629bb00 7470
9db83a32
JB
7471 if (pass1)
7472 {
7473 if (supported & CPU_FLAGS_64BIT_MATCH)
7474 i.error = unsupported_on_arch;
7475 else
7476 i.error = unsupported_64bit;
7477 }
252b5132 7478
548d0ee6 7479 return NULL;
29b0f896 7480}
252b5132 7481
29b0f896 7482static char *
e3bb37b5 7483parse_operands (char *l, const char *mnemonic)
29b0f896
AM
7484{
7485 char *token_start;
3138f287 7486
29b0f896
AM
7487 /* 1 if operand is pending after ','. */
7488 unsigned int expecting_operand = 0;
252b5132 7489
29b0f896
AM
7490 while (*l != END_OF_INSN)
7491 {
e68c3d59
JB
7492 /* Non-zero if operand parens not balanced. */
7493 unsigned int paren_not_balanced = 0;
7494 /* True if inside double quotes. */
7495 bool in_quotes = false;
7496
29b0f896
AM
7497 /* Skip optional white space before operand. */
7498 if (is_space_char (*l))
7499 ++l;
d02603dc 7500 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
7501 {
7502 as_bad (_("invalid character %s before operand %d"),
7503 output_invalid (*l),
7504 i.operands + 1);
7505 return NULL;
7506 }
d02603dc 7507 token_start = l; /* After white space. */
e68c3d59 7508 while (in_quotes || paren_not_balanced || *l != ',')
29b0f896
AM
7509 {
7510 if (*l == END_OF_INSN)
7511 {
e68c3d59
JB
7512 if (in_quotes)
7513 {
7514 as_bad (_("unbalanced double quotes in operand %d."),
7515 i.operands + 1);
7516 return NULL;
7517 }
29b0f896
AM
7518 if (paren_not_balanced)
7519 {
98ff9f1c
JB
7520 know (!intel_syntax);
7521 as_bad (_("unbalanced parenthesis in operand %d."),
7522 i.operands + 1);
29b0f896
AM
7523 return NULL;
7524 }
7525 else
7526 break; /* we are done */
7527 }
e68c3d59
JB
7528 else if (*l == '\\' && l[1] == '"')
7529 ++l;
7530 else if (*l == '"')
7531 in_quotes = !in_quotes;
7532 else if (!in_quotes && !is_operand_char (*l) && !is_space_char (*l))
29b0f896
AM
7533 {
7534 as_bad (_("invalid character %s in operand %d"),
7535 output_invalid (*l),
7536 i.operands + 1);
7537 return NULL;
7538 }
e68c3d59 7539 if (!intel_syntax && !in_quotes)
29b0f896
AM
7540 {
7541 if (*l == '(')
7542 ++paren_not_balanced;
7543 if (*l == ')')
7544 --paren_not_balanced;
7545 }
29b0f896
AM
7546 l++;
7547 }
7548 if (l != token_start)
7549 { /* Yes, we've read in another operand. */
7550 unsigned int operand_ok;
7551 this_operand = i.operands++;
7552 if (i.operands > MAX_OPERANDS)
7553 {
7554 as_bad (_("spurious operands; (%d operands/instruction max)"),
7555 MAX_OPERANDS);
7556 return NULL;
7557 }
9d46ce34 7558 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
7559 /* Now parse operand adding info to 'i' as we go along. */
7560 END_STRING_AND_SAVE (l);
7561
1286ab78
L
7562 if (i.mem_operands > 1)
7563 {
7564 as_bad (_("too many memory references for `%s'"),
7565 mnemonic);
7566 return 0;
7567 }
7568
29b0f896
AM
7569 if (intel_syntax)
7570 operand_ok =
7571 i386_intel_operand (token_start,
7572 intel_float_operand (mnemonic));
7573 else
a7619375 7574 operand_ok = i386_att_operand (token_start);
29b0f896
AM
7575
7576 RESTORE_END_STRING (l);
7577 if (!operand_ok)
7578 return NULL;
7579 }
7580 else
7581 {
7582 if (expecting_operand)
7583 {
7584 expecting_operand_after_comma:
7585 as_bad (_("expecting operand after ','; got nothing"));
7586 return NULL;
7587 }
7588 if (*l == ',')
7589 {
7590 as_bad (_("expecting operand before ','; got nothing"));
7591 return NULL;
7592 }
7593 }
7f3f1ea2 7594
29b0f896
AM
7595 /* Now *l must be either ',' or END_OF_INSN. */
7596 if (*l == ',')
7597 {
7598 if (*++l == END_OF_INSN)
7599 {
7600 /* Just skip it, if it's \n complain. */
7601 goto expecting_operand_after_comma;
7602 }
7603 expecting_operand = 1;
7604 }
7605 }
7606 return l;
7607}
7f3f1ea2 7608
050dfa73 7609static void
783c187b 7610swap_2_operands (unsigned int xchg1, unsigned int xchg2)
050dfa73
MM
7611{
7612 union i386_op temp_op;
40fb9820 7613 i386_operand_type temp_type;
c48dadc9 7614 unsigned int temp_flags;
050dfa73 7615 enum bfd_reloc_code_real temp_reloc;
4eed87de 7616
050dfa73
MM
7617 temp_type = i.types[xchg2];
7618 i.types[xchg2] = i.types[xchg1];
7619 i.types[xchg1] = temp_type;
c48dadc9
JB
7620
7621 temp_flags = i.flags[xchg2];
7622 i.flags[xchg2] = i.flags[xchg1];
7623 i.flags[xchg1] = temp_flags;
7624
050dfa73
MM
7625 temp_op = i.op[xchg2];
7626 i.op[xchg2] = i.op[xchg1];
7627 i.op[xchg1] = temp_op;
c48dadc9 7628
050dfa73
MM
7629 temp_reloc = i.reloc[xchg2];
7630 i.reloc[xchg2] = i.reloc[xchg1];
7631 i.reloc[xchg1] = temp_reloc;
43234a1e 7632
c032bc4f
JB
7633 temp_flags = i.imm_bits[xchg2];
7634 i.imm_bits[xchg2] = i.imm_bits[xchg1];
7635 i.imm_bits[xchg1] = temp_flags;
7636
6225c532 7637 if (i.mask.reg)
43234a1e 7638 {
6225c532
JB
7639 if (i.mask.operand == xchg1)
7640 i.mask.operand = xchg2;
7641 else if (i.mask.operand == xchg2)
7642 i.mask.operand = xchg1;
43234a1e 7643 }
a5748e0d 7644 if (i.broadcast.type || i.broadcast.bytes)
43234a1e 7645 {
5273a3cd
JB
7646 if (i.broadcast.operand == xchg1)
7647 i.broadcast.operand = xchg2;
7648 else if (i.broadcast.operand == xchg2)
7649 i.broadcast.operand = xchg1;
43234a1e 7650 }
050dfa73
MM
7651}
7652
29b0f896 7653static void
e3bb37b5 7654swap_operands (void)
29b0f896 7655{
b7c61d9a 7656 switch (i.operands)
050dfa73 7657 {
c0f3af97 7658 case 5:
b7c61d9a 7659 case 4:
4d456e3d 7660 swap_2_operands (1, i.operands - 2);
1a0670f3 7661 /* Fall through. */
b7c61d9a
L
7662 case 3:
7663 case 2:
4d456e3d 7664 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
7665 break;
7666 default:
7667 abort ();
29b0f896 7668 }
29b0f896
AM
7669
7670 if (i.mem_operands == 2)
7671 {
5e042380 7672 const reg_entry *temp_seg;
29b0f896
AM
7673 temp_seg = i.seg[0];
7674 i.seg[0] = i.seg[1];
7675 i.seg[1] = temp_seg;
7676 }
7677}
252b5132 7678
29b0f896
AM
7679/* Try to ensure constant immediates are represented in the smallest
7680 opcode possible. */
7681static void
e3bb37b5 7682optimize_imm (void)
29b0f896
AM
7683{
7684 char guess_suffix = 0;
7685 int op;
252b5132 7686
29b0f896
AM
7687 if (i.suffix)
7688 guess_suffix = i.suffix;
7689 else if (i.reg_operands)
7690 {
7691 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
7692 We can't do this properly yet, i.e. excluding special register
7693 instances, but the following works for instructions with
7694 immediates. In any case, we can't set i.suffix yet. */
29b0f896 7695 for (op = i.operands; --op >= 0;)
bab6aec1
JB
7696 if (i.types[op].bitfield.class != Reg)
7697 continue;
7698 else if (i.types[op].bitfield.byte)
7ab9ffdd 7699 {
40fb9820
L
7700 guess_suffix = BYTE_MNEM_SUFFIX;
7701 break;
7702 }
bab6aec1 7703 else if (i.types[op].bitfield.word)
252b5132 7704 {
40fb9820
L
7705 guess_suffix = WORD_MNEM_SUFFIX;
7706 break;
7707 }
bab6aec1 7708 else if (i.types[op].bitfield.dword)
40fb9820
L
7709 {
7710 guess_suffix = LONG_MNEM_SUFFIX;
7711 break;
7712 }
bab6aec1 7713 else if (i.types[op].bitfield.qword)
40fb9820
L
7714 {
7715 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 7716 break;
252b5132 7717 }
29b0f896 7718 }
f79d55e1
JB
7719 else if ((flag_code == CODE_16BIT)
7720 ^ (i.prefix[DATA_PREFIX] != 0 && !(i.prefix[REX_PREFIX] & REX_W)))
29b0f896 7721 guess_suffix = WORD_MNEM_SUFFIX;
fb1c1058
JB
7722 else if (flag_code != CODE_64BIT
7723 || (!(i.prefix[REX_PREFIX] & REX_W)
7724 /* A more generic (but also more involved) way of dealing
7725 with the special case(s) would be to go look for
7726 DefaultSize attributes on any of the templates. */
d3b01414 7727 && current_templates.start->mnem_off != MN_push))
5cc00775 7728 guess_suffix = LONG_MNEM_SUFFIX;
29b0f896
AM
7729
7730 for (op = i.operands; --op >= 0;)
40fb9820 7731 if (operand_type_check (i.types[op], imm))
29b0f896
AM
7732 {
7733 switch (i.op[op].imms->X_op)
252b5132 7734 {
29b0f896
AM
7735 case O_constant:
7736 /* If a suffix is given, this operand may be shortened. */
7737 switch (guess_suffix)
252b5132 7738 {
29b0f896 7739 case LONG_MNEM_SUFFIX:
40fb9820
L
7740 i.types[op].bitfield.imm32 = 1;
7741 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
7742 break;
7743 case WORD_MNEM_SUFFIX:
40fb9820
L
7744 i.types[op].bitfield.imm16 = 1;
7745 i.types[op].bitfield.imm32 = 1;
7746 i.types[op].bitfield.imm32s = 1;
7747 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
7748 break;
7749 case BYTE_MNEM_SUFFIX:
40fb9820
L
7750 i.types[op].bitfield.imm8 = 1;
7751 i.types[op].bitfield.imm8s = 1;
7752 i.types[op].bitfield.imm16 = 1;
7753 i.types[op].bitfield.imm32 = 1;
7754 i.types[op].bitfield.imm32s = 1;
7755 i.types[op].bitfield.imm64 = 1;
29b0f896 7756 break;
252b5132 7757 }
252b5132 7758
29b0f896
AM
7759 /* If this operand is at most 16 bits, convert it
7760 to a signed 16 bit number before trying to see
7761 whether it will fit in an even smaller size.
7762 This allows a 16-bit operand such as $0xffe0 to
7763 be recognised as within Imm8S range. */
40fb9820 7764 if ((i.types[op].bitfield.imm16)
7e96fb68 7765 && fits_in_unsigned_word (i.op[op].imms->X_add_number))
252b5132 7766 {
87ed972d
JB
7767 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
7768 ^ 0x8000) - 0x8000);
29b0f896 7769 }
a28def75
L
7770#ifdef BFD64
7771 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 7772 if ((i.types[op].bitfield.imm32)
7e96fb68 7773 && fits_in_unsigned_long (i.op[op].imms->X_add_number))
29b0f896
AM
7774 {
7775 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
7776 ^ ((offsetT) 1 << 31))
7777 - ((offsetT) 1 << 31));
7778 }
a28def75 7779#endif
40fb9820 7780 i.types[op]
c6fb90c8
L
7781 = operand_type_or (i.types[op],
7782 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 7783
29b0f896
AM
7784 /* We must avoid matching of Imm32 templates when 64bit
7785 only immediate is available. */
7786 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 7787 i.types[op].bitfield.imm32 = 0;
29b0f896 7788 break;
252b5132 7789
29b0f896
AM
7790 case O_absent:
7791 case O_register:
7792 abort ();
7793
7794 /* Symbols and expressions. */
7795 default:
9cd96992
JB
7796 /* Convert symbolic operand to proper sizes for matching, but don't
7797 prevent matching a set of insns that only supports sizes other
7798 than those matching the insn suffix. */
7799 {
40fb9820 7800 i386_operand_type mask, allowed;
d3b01414 7801 const insn_template *t = current_templates.start;
9cd96992 7802
0dfbf9d7 7803 operand_type_set (&mask, 0);
9cd96992
JB
7804 switch (guess_suffix)
7805 {
7806 case QWORD_MNEM_SUFFIX:
40fb9820
L
7807 mask.bitfield.imm64 = 1;
7808 mask.bitfield.imm32s = 1;
9cd96992
JB
7809 break;
7810 case LONG_MNEM_SUFFIX:
40fb9820 7811 mask.bitfield.imm32 = 1;
9cd96992
JB
7812 break;
7813 case WORD_MNEM_SUFFIX:
40fb9820 7814 mask.bitfield.imm16 = 1;
9cd96992
JB
7815 break;
7816 case BYTE_MNEM_SUFFIX:
40fb9820 7817 mask.bitfield.imm8 = 1;
9cd96992
JB
7818 break;
7819 default:
9cd96992
JB
7820 break;
7821 }
8f0212ac
JB
7822
7823 allowed = operand_type_and (t->operand_types[op], mask);
d3b01414 7824 while (++t < current_templates.end)
8f0212ac
JB
7825 {
7826 allowed = operand_type_or (allowed, t->operand_types[op]);
7827 allowed = operand_type_and (allowed, mask);
7828 }
7829
0dfbf9d7 7830 if (!operand_type_all_zero (&allowed))
c6fb90c8 7831 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 7832 }
29b0f896 7833 break;
252b5132 7834 }
29b0f896
AM
7835 }
7836}
47926f60 7837
29b0f896 7838/* Try to use the smallest displacement type too. */
0de704b9
JB
7839static bool
7840optimize_disp (const insn_template *t)
29b0f896 7841{
0de704b9 7842 unsigned int op;
3e73aa7c 7843
0de704b9
JB
7844 if (!want_disp32 (t)
7845 && (!t->opcode_modifier.jump
7846 || i.jumpabsolute || i.types[0].bitfield.baseindex))
7847 {
7848 for (op = 0; op < i.operands; ++op)
7849 {
7850 const expressionS *exp = i.op[op].disps;
7851
7852 if (!operand_type_check (i.types[op], disp))
7853 continue;
7854
7855 if (exp->X_op != O_constant)
7856 continue;
7857
7858 /* Since displacement is signed extended to 64bit, don't allow
7859 disp32 if it is out of range. */
7860 if (fits_in_signed_long (exp->X_add_number))
7861 continue;
7862
7863 i.types[op].bitfield.disp32 = 0;
7864 if (i.types[op].bitfield.baseindex)
7865 {
7866 as_bad (_("0x%" PRIx64 " out of range of signed 32bit displacement"),
7867 (uint64_t) exp->X_add_number);
7868 return false;
7869 }
7870 }
7871 }
7872
7873 /* Don't optimize displacement for movabs since it only takes 64bit
7874 displacement. */
7875 if (i.disp_encoding > disp_encoding_8bit
7876 || (flag_code == CODE_64BIT && t->mnem_off == MN_movabs))
7877 return true;
7878
7879 for (op = i.operands; op-- > 0;)
40fb9820 7880 if (operand_type_check (i.types[op], disp))
252b5132 7881 {
b300c311 7882 if (i.op[op].disps->X_op == O_constant)
252b5132 7883 {
91d6fa6a 7884 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 7885
91d6fa6a 7886 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 7887 {
2f2be86b
JB
7888 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7889 i.op[op].disps = NULL;
b300c311 7890 i.disp_operands--;
f185acdd
JB
7891 continue;
7892 }
7893
7894 if (i.types[op].bitfield.disp16
cd613c1f 7895 && fits_in_unsigned_word (op_disp))
f185acdd
JB
7896 {
7897 /* If this operand is at most 16 bits, convert
7898 to a signed 16 bit number and don't use 64bit
7899 displacement. */
7900 op_disp = ((op_disp ^ 0x8000) - 0x8000);
7901 i.types[op].bitfield.disp64 = 0;
b300c311 7902 }
f185acdd 7903
28a167a4 7904#ifdef BFD64
a50187b2 7905 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
a775efc8
JB
7906 if ((flag_code != CODE_64BIT
7907 ? i.types[op].bitfield.disp32
0de704b9
JB
7908 : want_disp32 (t)
7909 && (!t->opcode_modifier.jump
a775efc8 7910 || i.jumpabsolute || i.types[op].bitfield.baseindex))
a50187b2 7911 && fits_in_unsigned_long (op_disp))
b300c311 7912 {
a50187b2
JB
7913 /* If this operand is at most 32 bits, convert
7914 to a signed 32 bit number and don't use 64bit
7915 displacement. */
7916 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
7917 i.types[op].bitfield.disp64 = 0;
7918 i.types[op].bitfield.disp32 = 1;
7919 }
28a167a4 7920
a50187b2
JB
7921 if (flag_code == CODE_64BIT && fits_in_signed_long (op_disp))
7922 {
7923 i.types[op].bitfield.disp64 = 0;
a775efc8 7924 i.types[op].bitfield.disp32 = 1;
b300c311 7925 }
28a167a4 7926#endif
40fb9820 7927 if ((i.types[op].bitfield.disp32
40fb9820 7928 || i.types[op].bitfield.disp16)
b5014f7a 7929 && fits_in_disp8 (op_disp))
40fb9820 7930 i.types[op].bitfield.disp8 = 1;
77c59789
JB
7931
7932 i.op[op].disps->X_add_number = op_disp;
252b5132 7933 }
67a4f2b7
AO
7934 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
7935 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
7936 {
7937 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
7938 i.op[op].disps, 0, i.reloc[op]);
2f2be86b 7939 i.types[op] = operand_type_and_not (i.types[op], anydisp);
67a4f2b7
AO
7940 }
7941 else
b300c311 7942 /* We only support 64bit displacement on constants. */
40fb9820 7943 i.types[op].bitfield.disp64 = 0;
252b5132 7944 }
0de704b9
JB
7945
7946 return true;
29b0f896
AM
7947}
7948
4a1b91ea
L
7949/* Return 1 if there is a match in broadcast bytes between operand
7950 GIVEN and instruction template T. */
7951
7952static INLINE int
7953match_broadcast_size (const insn_template *t, unsigned int given)
7954{
7955 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
7956 && i.types[given].bitfield.byte)
7957 || (t->opcode_modifier.broadcast == WORD_BROADCAST
7958 && i.types[given].bitfield.word)
7959 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
7960 && i.types[given].bitfield.dword)
7961 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
7962 && i.types[given].bitfield.qword));
7963}
7964
6c30d220
L
7965/* Check if operands are valid for the instruction. */
7966
7967static int
7968check_VecOperands (const insn_template *t)
7969{
43234a1e 7970 unsigned int op;
e2195274 7971 i386_cpu_flags cpu;
e2195274
JB
7972
7973 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
7974 any one operand are implicity requiring AVX512VL support if the actual
7975 operand size is YMMword or XMMword. Since this function runs after
a61cb9db
L
7976 template matching, there's no need to check for YMMword/XMMword in
7977 the template. */
734dfd1c 7978 cpu = cpu_flags_and (cpu_flags_from_attr (t->cpu), avx512);
e2195274 7979 if (!cpu_flags_all_zero (&cpu)
734dfd1c 7980 && !is_cpu (t, CpuAVX512VL)
a6f3add0 7981 && !cpu_arch_flags.bitfield.cpuavx512vl
6177c84d 7982 && (!t->opcode_modifier.vex || need_evex_encoding (t)))
e2195274
JB
7983 {
7984 for (op = 0; op < t->operands; ++op)
7985 {
7986 if (t->operand_types[op].bitfield.zmmword
7987 && (i.types[op].bitfield.ymmword
7988 || i.types[op].bitfield.xmmword))
7989 {
54294d73 7990 i.error = operand_size_mismatch;
e2195274
JB
7991 return 1;
7992 }
7993 }
7994 }
43234a1e 7995
22c36940
JB
7996 /* Somewhat similarly, templates specifying both AVX and AVX2 are
7997 requiring AVX2 support if the actual operand size is YMMword. */
a5e91879 7998 if (maybe_cpu (t, CpuAVX) && maybe_cpu (t, CpuAVX2)
22c36940
JB
7999 && !cpu_arch_flags.bitfield.cpuavx2)
8000 {
8001 for (op = 0; op < t->operands; ++op)
8002 {
8003 if (t->operand_types[op].bitfield.xmmword
8004 && i.types[op].bitfield.ymmword)
8005 {
54294d73 8006 i.error = operand_size_mismatch;
22c36940
JB
8007 return 1;
8008 }
8009 }
8010 }
8011
6c30d220 8012 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 8013 if (!t->opcode_modifier.sib
6c30d220 8014 && i.index_reg
1b54b8d7
JB
8015 && (i.index_reg->reg_type.bitfield.xmmword
8016 || i.index_reg->reg_type.bitfield.ymmword
8017 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
8018 {
8019 i.error = unsupported_vector_index_register;
8020 return 1;
8021 }
8022
ad8ecc81 8023 /* Check if default mask is allowed. */
255571cd 8024 if (t->opcode_modifier.operandconstraint == NO_DEFAULT_MASK
6225c532 8025 && (!i.mask.reg || i.mask.reg->reg_num == 0))
ad8ecc81
MZ
8026 {
8027 i.error = no_default_mask;
8028 return 1;
8029 }
8030
7bab8ab5
JB
8031 /* For VSIB byte, we need a vector register for index, and all vector
8032 registers must be distinct. */
260cd341 8033 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
8034 {
8035 if (!i.index_reg
63112cd6 8036 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 8037 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 8038 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 8039 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 8040 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 8041 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
8042 {
8043 i.error = invalid_vsib_address;
8044 return 1;
8045 }
8046
6225c532
JB
8047 gas_assert (i.reg_operands == 2 || i.mask.reg);
8048 if (i.reg_operands == 2 && !i.mask.reg)
43234a1e 8049 {
3528c362 8050 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
8051 gas_assert (i.types[0].bitfield.xmmword
8052 || i.types[0].bitfield.ymmword);
3528c362 8053 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
8054 gas_assert (i.types[2].bitfield.xmmword
8055 || i.types[2].bitfield.ymmword);
43234a1e
L
8056 if (operand_check == check_none)
8057 return 0;
8058 if (register_number (i.op[0].regs)
8059 != register_number (i.index_reg)
8060 && register_number (i.op[2].regs)
8061 != register_number (i.index_reg)
8062 && register_number (i.op[0].regs)
8063 != register_number (i.op[2].regs))
8064 return 0;
8065 if (operand_check == check_error)
8066 {
8067 i.error = invalid_vector_register_set;
8068 return 1;
8069 }
8070 as_warn (_("mask, index, and destination registers should be distinct"));
8071 }
6225c532 8072 else if (i.reg_operands == 1 && i.mask.reg)
8444f82a 8073 {
3528c362 8074 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
8075 && (i.types[1].bitfield.xmmword
8076 || i.types[1].bitfield.ymmword
8077 || i.types[1].bitfield.zmmword)
8444f82a
MZ
8078 && (register_number (i.op[1].regs)
8079 == register_number (i.index_reg)))
8080 {
8081 if (operand_check == check_error)
8082 {
8083 i.error = invalid_vector_register_set;
8084 return 1;
8085 }
8086 if (operand_check != check_none)
8087 as_warn (_("index and destination registers should be distinct"));
8088 }
8089 }
43234a1e 8090 }
7bab8ab5 8091
fc141319
L
8092 /* For AMX instructions with 3 TMM register operands, all operands
8093 must be distinct. */
8094 if (i.reg_operands == 3
8095 && t->operand_types[0].bitfield.tmmword
8096 && (i.op[0].regs == i.op[1].regs
8097 || i.op[0].regs == i.op[2].regs
8098 || i.op[1].regs == i.op[2].regs))
8099 {
8100 i.error = invalid_tmm_register_set;
8101 return 1;
260cd341
LC
8102 }
8103
0cc78721
CL
8104 /* For some special instructions require that destination must be distinct
8105 from source registers. */
255571cd 8106 if (t->opcode_modifier.operandconstraint == DISTINCT_DEST)
0cc78721
CL
8107 {
8108 unsigned int dest_reg = i.operands - 1;
8109
8110 know (i.operands >= 3);
8111
8112 /* #UD if dest_reg == src1_reg or dest_reg == src2_reg. */
8113 if (i.op[dest_reg - 1].regs == i.op[dest_reg].regs
8114 || (i.reg_operands > 2
8115 && i.op[dest_reg - 2].regs == i.op[dest_reg].regs))
8116 {
8117 i.error = invalid_dest_and_src_register_set;
8118 return 1;
8119 }
8120 }
8121
43234a1e
L
8122 /* Check if broadcast is supported by the instruction and is applied
8123 to the memory operand. */
a5748e0d 8124 if (i.broadcast.type || i.broadcast.bytes)
43234a1e 8125 {
8e6e0792 8126 i386_operand_type type, overlap;
43234a1e
L
8127
8128 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 8129 and its broadcast bytes match the memory operand. */
5273a3cd 8130 op = i.broadcast.operand;
8e6e0792 8131 if (!t->opcode_modifier.broadcast
c48dadc9 8132 || !(i.flags[op] & Operand_Mem)
c39e5b26 8133 || (!i.types[op].bitfield.unspecified
4a1b91ea 8134 && !match_broadcast_size (t, op)))
43234a1e
L
8135 {
8136 bad_broadcast:
8137 i.error = unsupported_broadcast;
8138 return 1;
8139 }
8e6e0792
JB
8140
8141 operand_type_set (&type, 0);
a5748e0d 8142 switch (get_broadcast_bytes (t, false))
8e6e0792 8143 {
4a1b91ea
L
8144 case 2:
8145 type.bitfield.word = 1;
8146 break;
8147 case 4:
8148 type.bitfield.dword = 1;
8149 break;
8e6e0792
JB
8150 case 8:
8151 type.bitfield.qword = 1;
8152 break;
8153 case 16:
8154 type.bitfield.xmmword = 1;
8155 break;
8156 case 32:
4fc85f37
JB
8157 if (vector_size < VSZ256)
8158 goto bad_broadcast;
8e6e0792
JB
8159 type.bitfield.ymmword = 1;
8160 break;
8161 case 64:
4fc85f37
JB
8162 if (vector_size < VSZ512)
8163 goto bad_broadcast;
8e6e0792
JB
8164 type.bitfield.zmmword = 1;
8165 break;
8166 default:
8167 goto bad_broadcast;
8168 }
8169
8170 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
8171 if (t->operand_types[op].bitfield.class == RegSIMD
8172 && t->operand_types[op].bitfield.byte
8173 + t->operand_types[op].bitfield.word
8174 + t->operand_types[op].bitfield.dword
8175 + t->operand_types[op].bitfield.qword > 1)
8176 {
8177 overlap.bitfield.xmmword = 0;
8178 overlap.bitfield.ymmword = 0;
8179 overlap.bitfield.zmmword = 0;
8180 }
8e6e0792
JB
8181 if (operand_type_all_zero (&overlap))
8182 goto bad_broadcast;
8183
9c19e9ec 8184 if (t->opcode_modifier.checkoperandsize)
8e6e0792
JB
8185 {
8186 unsigned int j;
8187
e2195274 8188 type.bitfield.baseindex = 1;
8e6e0792
JB
8189 for (j = 0; j < i.operands; ++j)
8190 {
8191 if (j != op
8192 && !operand_type_register_match(i.types[j],
8193 t->operand_types[j],
8194 type,
8195 t->operand_types[op]))
8196 goto bad_broadcast;
8197 }
8198 }
43234a1e
L
8199 }
8200 /* If broadcast is supported in this instruction, we need to check if
8201 operand of one-element size isn't specified without broadcast. */
8202 else if (t->opcode_modifier.broadcast && i.mem_operands)
8203 {
8204 /* Find memory operand. */
8205 for (op = 0; op < i.operands; op++)
8dc0818e 8206 if (i.flags[op] & Operand_Mem)
43234a1e
L
8207 break;
8208 gas_assert (op < i.operands);
8209 /* Check size of the memory operand. */
4a1b91ea 8210 if (match_broadcast_size (t, op))
43234a1e
L
8211 {
8212 i.error = broadcast_needed;
8213 return 1;
8214 }
8215 }
c39e5b26
JB
8216 else
8217 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
8218
8219 /* Check if requested masking is supported. */
6225c532 8220 if (i.mask.reg)
43234a1e 8221 {
b1c79256 8222 if (!t->opcode_modifier.masking)
ae2387fe 8223 {
b1c79256
JB
8224 i.error = unsupported_masking;
8225 return 1;
8226 }
8227
8228 /* Common rules for masking:
8229 - mask register destinations permit only zeroing-masking, without
8230 that actually being expressed by a {z} operand suffix or EVEX.z,
8231 - memory destinations allow only merging-masking,
8232 - scatter/gather insns (i.e. ones using vSIB) only allow merging-
8233 masking. */
8234 if (i.mask.zeroing
8235 && (t->operand_types[t->operands - 1].bitfield.class == RegMask
8236 || (i.flags[t->operands - 1] & Operand_Mem)
8237 || t->opcode_modifier.sib))
8238 {
8239 i.error = unsupported_masking;
8240 return 1;
ae2387fe 8241 }
43234a1e
L
8242 }
8243
8244 /* Check if masking is applied to dest operand. */
6225c532 8245 if (i.mask.reg && (i.mask.operand != i.operands - 1))
43234a1e
L
8246 {
8247 i.error = mask_not_on_destination;
8248 return 1;
8249 }
8250
43234a1e 8251 /* Check RC/SAE. */
ca5312a2 8252 if (i.rounding.type != rc_none)
43234a1e 8253 {
a80195f1 8254 if (!t->opcode_modifier.sae
cf665fee
JB
8255 || ((i.rounding.type != saeonly) != t->opcode_modifier.staticrounding)
8256 || i.mem_operands)
43234a1e
L
8257 {
8258 i.error = unsupported_rc_sae;
8259 return 1;
8260 }
cf665fee
JB
8261
8262 /* Non-EVEX.LIG forms need to have a ZMM register as at least one
8263 operand. */
8264 if (t->opcode_modifier.evex != EVEXLIG)
7bab8ab5 8265 {
cf665fee
JB
8266 for (op = 0; op < t->operands; ++op)
8267 if (i.types[op].bitfield.zmmword)
8268 break;
8269 if (op >= t->operands)
8270 {
8271 i.error = operand_size_mismatch;
8272 return 1;
8273 }
7bab8ab5 8274 }
6c30d220
L
8275 }
8276
da4977e0 8277 /* Check the special Imm4 cases; must be the first operand. */
eea43579 8278 if ((is_cpu (t, CpuXOP) && t->operands == 5)
ec6b11e7
JB
8279 || (t->opcode_space == SPACE_0F3A
8280 && (t->base_opcode | 3) == 0x0b
8281 && is_cpu (t, CpuAPX_F)))
da4977e0
JB
8282 {
8283 if (i.op[0].imms->X_op != O_constant
8284 || !fits_in_imm4 (i.op[0].imms->X_add_number))
8285 {
8286 i.error = bad_imm4;
8287 return 1;
8288 }
8289
8290 /* Turn off Imm<N> so that update_imm won't complain. */
eea43579
JB
8291 if (t->operands == 5)
8292 operand_type_set (&i.types[0], 0);
da4977e0
JB
8293 }
8294
43234a1e 8295 /* Check vector Disp8 operand. */
b5014f7a 8296 if (t->opcode_modifier.disp8memshift
a6f3add0 8297 && (!t->opcode_modifier.vex
6177c84d 8298 || need_evex_encoding (t))
1a42a9fe 8299 && i.disp_encoding <= disp_encoding_8bit)
43234a1e 8300 {
9b345ce8 8301 if (i.broadcast.type || i.broadcast.bytes)
4a1b91ea 8302 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 8303 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 8304 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
8305 else
8306 {
125ff819 8307 const i386_operand_type *type = NULL, *fallback = NULL;
7091c612
JB
8308
8309 i.memshift = 0;
8310 for (op = 0; op < i.operands; op++)
8dc0818e 8311 if (i.flags[op] & Operand_Mem)
7091c612 8312 {
4174bfff
JB
8313 if (t->opcode_modifier.evex == EVEXLIG)
8314 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
8315 else if (t->operand_types[op].bitfield.xmmword
8316 + t->operand_types[op].bitfield.ymmword
8317 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
8318 type = &t->operand_types[op];
8319 else if (!i.types[op].bitfield.unspecified)
8320 type = &i.types[op];
125ff819
JB
8321 else /* Ambiguities get resolved elsewhere. */
8322 fallback = &t->operand_types[op];
7091c612 8323 }
3528c362 8324 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 8325 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
8326 {
8327 if (i.types[op].bitfield.zmmword)
8328 i.memshift = 6;
8329 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
8330 i.memshift = 5;
8331 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
8332 i.memshift = 4;
8333 }
8334
125ff819
JB
8335 if (!type && !i.memshift)
8336 type = fallback;
7091c612
JB
8337 if (type)
8338 {
8339 if (type->bitfield.zmmword)
8340 i.memshift = 6;
8341 else if (type->bitfield.ymmword)
8342 i.memshift = 5;
8343 else if (type->bitfield.xmmword)
8344 i.memshift = 4;
8345 }
8346
8347 /* For the check in fits_in_disp8(). */
8348 if (i.memshift == 0)
8349 i.memshift = -1;
8350 }
43234a1e
L
8351
8352 for (op = 0; op < i.operands; op++)
8353 if (operand_type_check (i.types[op], disp)
8354 && i.op[op].disps->X_op == O_constant)
8355 {
b5014f7a 8356 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 8357 {
b5014f7a
JB
8358 i.types[op].bitfield.disp8 = 1;
8359 return 0;
43234a1e 8360 }
b5014f7a 8361 i.types[op].bitfield.disp8 = 0;
43234a1e
L
8362 }
8363 }
b5014f7a
JB
8364
8365 i.memshift = 0;
43234a1e 8366
6c30d220
L
8367 return 0;
8368}
8369
da4977e0 8370/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
8371
8372static int
da4977e0 8373VEX_check_encoding (const insn_template *t)
a683cc34 8374{
e346d50a 8375 if (i.encoding == encoding_error)
da4977e0
JB
8376 {
8377 i.error = unsupported;
8378 return 1;
8379 }
8380
4fc85f37
JB
8381 /* Vector size restrictions. */
8382 if ((vector_size < VSZ512
fa88a361 8383 && t->opcode_modifier.evex == EVEX512)
4fc85f37
JB
8384 || (vector_size < VSZ256
8385 && (t->opcode_modifier.evex == EVEX256
fa88a361 8386 || t->opcode_modifier.vex == VEX256)))
4fc85f37 8387 {
54294d73 8388 i.error = unsupported_vector_size;
4fc85f37
JB
8389 return 1;
8390 }
8391
eb3f3841 8392 switch (i.encoding)
43234a1e 8393 {
eb3f3841
JB
8394 case encoding_default:
8395 break;
8396
8397 case encoding_vex:
8398 case encoding_vex3:
8399 /* This instruction must be encoded with VEX prefix. */
8400 if (!t->opcode_modifier.vex)
8401 {
8402 i.error = no_vex_encoding;
8403 return 1;
8404 }
8405 break;
8406
8407 case encoding_evex:
8408 case encoding_evex512:
86fa6981 8409 /* This instruction must be encoded with EVEX prefix. */
706ce984 8410 if (!t->opcode_modifier.evex)
86fa6981 8411 {
54294d73 8412 i.error = no_evex_encoding;
86fa6981
L
8413 return 1;
8414 }
eb3f3841 8415 break;
43234a1e 8416
eb3f3841
JB
8417 case encoding_egpr:
8418 /* This instruction must be encoded with REX2 or EVEX prefix. */
8419 if (t->opcode_modifier.vex && !t->opcode_modifier.evex)
86fa6981 8420 {
eb3f3841 8421 i.error = no_evex_encoding;
86fa6981
L
8422 return 1;
8423 }
eb3f3841
JB
8424 break;
8425
8426 default:
8427 abort ();
86fa6981 8428 }
a683cc34 8429
a683cc34
SP
8430 return 0;
8431}
8432
80d61d8d
CL
8433/* Check if Egprs operands are valid for the instruction. */
8434
8435static bool
8436check_EgprOperands (const insn_template *t)
8437{
8438 if (!t->opcode_modifier.noegpr)
192781a3 8439 return false;
80d61d8d
CL
8440
8441 for (unsigned int op = 0; op < i.operands; op++)
8442 {
8443 if (i.types[op].bitfield.class != Reg)
8444 continue;
8445
8446 if (i.op[op].regs->reg_flags & RegRex2)
8447 {
8448 i.error = register_type_mismatch;
192781a3 8449 return true;
80d61d8d
CL
8450 }
8451 }
8452
8453 if ((i.index_reg && (i.index_reg->reg_flags & RegRex2))
8454 || (i.base_reg && (i.base_reg->reg_flags & RegRex2)))
8455 {
8456 i.error = unsupported_EGPR_for_addressing;
192781a3 8457 return true;
80d61d8d
CL
8458 }
8459
8460 /* Check if pseudo prefix {rex2} is valid. */
ebe82bfd 8461 if (i.rex2_encoding && !t->opcode_modifier.sse2avx)
80d61d8d
CL
8462 {
8463 i.error = invalid_pseudo_prefix;
192781a3 8464 return true;
80d61d8d
CL
8465 }
8466
192781a3 8467 return false;
80d61d8d
CL
8468}
8469
08a98d4c
MZ
8470/* Check if APX operands are valid for the instruction. */
8471static bool
8472check_APX_operands (const insn_template *t)
8473{
8474 /* Push2* and Pop2* cannot use RSP and Pop2* cannot pop two same registers.
8475 */
8476 switch (t->mnem_off)
8477 {
8478 case MN_pop2:
8479 case MN_pop2p:
8480 if (register_number (i.op[0].regs) == register_number (i.op[1].regs))
8481 {
8482 i.error = invalid_dest_register_set;
8483 return 1;
8484 }
8485 /* fall through */
8486 case MN_push2:
8487 case MN_push2p:
8488 if (register_number (i.op[0].regs) == 4
8489 || register_number (i.op[1].regs) == 4)
8490 {
8491 i.error = unsupported_rsp_register;
8492 return 1;
8493 }
8494 break;
8495 }
8496 return 0;
8497}
8498
6967f19d
HL
8499/* Check if the instruction use the REX registers or REX prefix. */
8500static bool
8501check_Rex_required (void)
8502{
8503 for (unsigned int op = 0; op < i.operands; op++)
8504 {
8505 if (i.types[op].bitfield.class != Reg)
8506 continue;
8507
8508 if (i.op[op].regs->reg_flags & (RegRex | RegRex64))
8509 return true;
8510 }
8511
8512 if ((i.index_reg && (i.index_reg->reg_flags & (RegRex | RegRex64)))
8513 || (i.base_reg && (i.base_reg->reg_flags & (RegRex | RegRex64))))
8514 return true;
8515
8516 /* Check pseudo prefix {rex} are valid. */
8517 return i.rex_encoding;
8518}
8519
8520/* Optimize APX NDD insns to legacy insns. */
8521static unsigned int
8522can_convert_NDD_to_legacy (const insn_template *t)
8523{
8524 unsigned int match_dest_op = ~0;
8525
dd74a603 8526 if (!i.has_nf && i.reg_operands >= 2)
6967f19d
HL
8527 {
8528 unsigned int dest = i.operands - 1;
8529 unsigned int src1 = i.operands - 2;
8530 unsigned int src2 = (i.operands > 3) ? i.operands - 3 : 0;
8531
8532 if (i.types[src1].bitfield.class == Reg
8533 && i.op[src1].regs == i.op[dest].regs)
8534 match_dest_op = src1;
8535 /* If the first operand is the same as the third operand,
8536 these instructions need to support the ability to commutative
8537 the first two operands and still not change the semantics in order
8538 to be optimized. */
8539 else if (optimize > 1
8540 && t->opcode_modifier.commutative
8541 && i.types[src2].bitfield.class == Reg
8542 && i.op[src2].regs == i.op[dest].regs)
8543 match_dest_op = src2;
8544 }
8545 return match_dest_op;
8546}
8547
7b94647a
JB
8548/* Helper function for the progress() macro in match_template(). */
8549static INLINE enum i386_error progress (enum i386_error new,
8550 enum i386_error last,
8551 unsigned int line, unsigned int *line_p)
8552{
8553 if (line <= *line_p)
8554 return last;
8555 *line_p = line;
8556 return new;
8557}
8558
d3ce72d0 8559static const insn_template *
83b16ac6 8560match_template (char mnem_suffix)
29b0f896
AM
8561{
8562 /* Points to template once we've found it. */
d3ce72d0 8563 const insn_template *t;
40fb9820 8564 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 8565 i386_operand_type overlap4;
29b0f896 8566 unsigned int found_reverse_match;
40fb9820 8567 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 8568 int addr_prefix_disp;
7b94647a
JB
8569 unsigned int j, size_match, check_register, errline = __LINE__;
8570 enum i386_error specific_error = number_of_operands_mismatch;
8571#define progress(err) progress (err, specific_error, __LINE__, &errline)
29b0f896 8572
c0f3af97
L
8573#if MAX_OPERANDS != 5
8574# error "MAX_OPERANDS must be 5."
f48ff2ae
L
8575#endif
8576
29b0f896 8577 found_reverse_match = 0;
539e75ad 8578 addr_prefix_disp = -1;
40fb9820 8579
d3b01414 8580 for (t = current_templates.start; t < current_templates.end; t++)
29b0f896 8581 {
539e75ad 8582 addr_prefix_disp = -1;
dbbc8b7e 8583 found_reverse_match = 0;
539e75ad 8584
7b94647a 8585 /* Must have right number of operands. */
29b0f896
AM
8586 if (i.operands != t->operands)
8587 continue;
8588
b58829cd
JB
8589 /* Skip SSE2AVX templates when inapplicable. */
8590 if (t->opcode_modifier.sse2avx
8591 && (!sse2avx || i.prefix[DATA_PREFIX]))
8592 {
8593 /* Another non-SSE2AVX template has to follow. */
8594 gas_assert (t + 1 < current_templates.end);
8595 continue;
8596 }
8597
50aecf8c 8598 /* Check processor support. */
7b94647a 8599 specific_error = progress (unsupported);
45a4bb20 8600 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
8601 continue;
8602
e1d4d893 8603 /* Check AT&T mnemonic. */
7b94647a 8604 specific_error = progress (unsupported_with_intel_mnemonic);
35266cb1
JB
8605 if (!intel_syntax && intel_mnemonic
8606 && t->opcode_modifier.dialect == ATT_MNEMONIC)
1efbbeb4
L
8607 continue;
8608
4b5aaf5f 8609 /* Check AT&T/Intel syntax. */
7b94647a 8610 specific_error = progress (unsupported_syntax);
7d3182d6 8611 if (intel_syntax
35266cb1
JB
8612 ? t->opcode_modifier.dialect >= ATT_SYNTAX
8613 : t->opcode_modifier.dialect == INTEL_SYNTAX)
1efbbeb4
L
8614 continue;
8615
dd74a603
CL
8616 /* Check NF support. */
8617 specific_error = progress (unsupported_nf);
8618 if (i.has_nf && !t->opcode_modifier.nf)
8619 continue;
8620
4b5aaf5f
L
8621 /* Check Intel64/AMD64 ISA. */
8622 switch (isa64)
8623 {
8624 default:
8625 /* Default: Don't accept Intel64. */
8626 if (t->opcode_modifier.isa64 == INTEL64)
8627 continue;
8628 break;
8629 case amd64:
8630 /* -mamd64: Don't accept Intel64 and Intel64 only. */
8631 if (t->opcode_modifier.isa64 >= INTEL64)
8632 continue;
8633 break;
8634 case intel64:
8635 /* -mintel64: Don't accept AMD64. */
5990e377 8636 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
8637 continue;
8638 break;
8639 }
8640
dc2be329 8641 /* Check the suffix. */
7b94647a 8642 specific_error = progress (invalid_instruction_suffix);
7505bb03
JB
8643 if ((t->opcode_modifier.no_bsuf && mnem_suffix == BYTE_MNEM_SUFFIX)
8644 || (t->opcode_modifier.no_wsuf && mnem_suffix == WORD_MNEM_SUFFIX)
8645 || (t->opcode_modifier.no_lsuf && mnem_suffix == LONG_MNEM_SUFFIX)
8646 || (t->opcode_modifier.no_ssuf && mnem_suffix == SHORT_MNEM_SUFFIX)
8647 || (t->opcode_modifier.no_qsuf && mnem_suffix == QWORD_MNEM_SUFFIX))
83b16ac6 8648 continue;
29b0f896 8649
7b94647a 8650 specific_error = progress (operand_size_mismatch);
3ac21baa
JB
8651 size_match = operand_size_match (t);
8652 if (!size_match)
7d5e4556 8653 continue;
539e75ad 8654
6f2f06be
JB
8655 /* This is intentionally not
8656
0cfa3eb3 8657 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
8658
8659 as the case of a missing * on the operand is accepted (perhaps with
8660 a warning, issued further down). */
7b94647a 8661 specific_error = progress (operand_type_mismatch);
0cfa3eb3 8662 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
7b94647a 8663 continue;
6f2f06be 8664
a4d3acd2
JB
8665 /* In Intel syntax, normally we can check for memory operand size when
8666 there is no mnemonic suffix. But jmp and call have 2 different
8667 encodings with Dword memory operand size. Skip the "near" one
8668 (permitting a register operand) when "far" was requested. */
8669 if (i.far_branch
8670 && t->opcode_modifier.jump == JUMP_ABSOLUTE
8671 && t->operand_types[0].bitfield.class == Reg)
8672 continue;
8673
5c07affc
L
8674 for (j = 0; j < MAX_OPERANDS; j++)
8675 operand_types[j] = t->operand_types[j];
8676
9db83a32 8677 /* In general, don't allow 32-bit operands on pre-386. */
7b94647a
JB
8678 specific_error = progress (mnem_suffix ? invalid_instruction_suffix
8679 : operand_size_mismatch);
4873e243 8680 j = i.imm_operands + (t->operands > i.imm_operands + 1);
9db83a32
JB
8681 if (i.suffix == LONG_MNEM_SUFFIX
8682 && !cpu_arch_flags.bitfield.cpui386
45aa61fe 8683 && (intel_syntax
3cd7f3e3 8684 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
76d3f746
JB
8685 && !intel_float_operand (insn_name (t)))
8686 : intel_float_operand (insn_name (t)) != 2)
4873e243
JB
8687 && (t->operands == i.imm_operands
8688 || (operand_types[i.imm_operands].bitfield.class != RegMMX
8689 && operand_types[i.imm_operands].bitfield.class != RegSIMD
8690 && operand_types[i.imm_operands].bitfield.class != RegMask)
8691 || (operand_types[j].bitfield.class != RegMMX
8692 && operand_types[j].bitfield.class != RegSIMD
8693 && operand_types[j].bitfield.class != RegMask))
63112cd6 8694 && !t->opcode_modifier.sib)
192dc9c6
JB
8695 continue;
8696
29b0f896 8697 /* Do not verify operands when there are none. */
e365e234 8698 if (!t->operands)
da4977e0
JB
8699 {
8700 if (VEX_check_encoding (t))
8701 {
7b94647a 8702 specific_error = progress (i.error);
da4977e0
JB
8703 continue;
8704 }
8705
80d61d8d
CL
8706 /* Check if pseudo prefix {rex2} is valid. */
8707 if (t->opcode_modifier.noegpr && i.rex2_encoding)
8708 {
8709 specific_error = progress (invalid_pseudo_prefix);
8710 continue;
8711 }
8712
da4977e0
JB
8713 /* We've found a match; break out of loop. */
8714 break;
8715 }
252b5132 8716
48bcea9f
JB
8717 if (!t->opcode_modifier.jump
8718 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
8719 {
8720 /* There should be only one Disp operand. */
8721 for (j = 0; j < MAX_OPERANDS; j++)
8722 if (operand_type_check (operand_types[j], disp))
539e75ad 8723 break;
48bcea9f
JB
8724 if (j < MAX_OPERANDS)
8725 {
5b7c81bd 8726 bool override = (i.prefix[ADDR_PREFIX] != 0);
48bcea9f
JB
8727
8728 addr_prefix_disp = j;
8729
a775efc8
JB
8730 /* Address size prefix will turn Disp64 operand into Disp32 and
8731 Disp32/Disp16 one into Disp16/Disp32 respectively. */
48bcea9f 8732 switch (flag_code)
40fb9820 8733 {
48bcea9f
JB
8734 case CODE_16BIT:
8735 override = !override;
8736 /* Fall through. */
8737 case CODE_32BIT:
8738 if (operand_types[j].bitfield.disp32
8739 && operand_types[j].bitfield.disp16)
40fb9820 8740 {
48bcea9f
JB
8741 operand_types[j].bitfield.disp16 = override;
8742 operand_types[j].bitfield.disp32 = !override;
40fb9820 8743 }
a775efc8 8744 gas_assert (!operand_types[j].bitfield.disp64);
48bcea9f
JB
8745 break;
8746
8747 case CODE_64BIT:
a775efc8 8748 if (operand_types[j].bitfield.disp64)
40fb9820 8749 {
a775efc8 8750 gas_assert (!operand_types[j].bitfield.disp32);
48bcea9f 8751 operand_types[j].bitfield.disp32 = override;
a775efc8 8752 operand_types[j].bitfield.disp64 = !override;
40fb9820 8753 }
48bcea9f
JB
8754 operand_types[j].bitfield.disp16 = 0;
8755 break;
40fb9820 8756 }
539e75ad 8757 }
48bcea9f 8758 }
539e75ad 8759
56ffb741 8760 /* We check register size if needed. */
9c19e9ec 8761 if (t->opcode_modifier.checkoperandsize)
e2195274
JB
8762 {
8763 check_register = (1 << t->operands) - 1;
a5748e0d 8764 if (i.broadcast.type || i.broadcast.bytes)
5273a3cd 8765 check_register &= ~(1 << i.broadcast.operand);
e2195274
JB
8766 }
8767 else
8768 check_register = 0;
8769
c6fb90c8 8770 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
8771 switch (t->operands)
8772 {
8773 case 1:
40fb9820 8774 if (!operand_type_match (overlap0, i.types[0]))
29b0f896 8775 continue;
ae9a0a51
JB
8776
8777 /* Allow the ModR/M encoding to be requested by using the {load} or
8778 {store} pseudo prefix on an applicable insn. */
8779 if (!t->opcode_modifier.modrm
8780 && i.reg_operands == 1
8781 && ((i.dir_encoding == dir_encoding_load
8782 && t->mnem_off != MN_pop)
8783 || (i.dir_encoding == dir_encoding_store
8784 && t->mnem_off != MN_push))
8785 /* Avoid BSWAP. */
8786 && t->mnem_off != MN_bswap)
8787 continue;
29b0f896 8788 break;
ae9a0a51 8789
29b0f896 8790 case 2:
33eaf5de 8791 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
8792 only in 32bit mode and we can use opcode 0x90. In 64bit
8793 mode, we can't use 0x90 for xchg %eax, %eax since it should
8794 zero-extend %eax to %rax. */
ae9a0a51
JB
8795 if (t->base_opcode == 0x90
8796 && t->opcode_space == SPACE_BASE)
8797 {
8798 if (flag_code == CODE_64BIT
8799 && i.types[0].bitfield.instance == Accum
8800 && i.types[0].bitfield.dword
8801 && i.types[1].bitfield.instance == Accum)
8802 continue;
8803
8804 /* Allow the ModR/M encoding to be requested by using the
8805 {load} or {store} pseudo prefix. */
8806 if (i.dir_encoding == dir_encoding_load
8807 || i.dir_encoding == dir_encoding_store)
8808 continue;
8809 }
e3669c7f
JB
8810
8811 if (t->base_opcode == MOV_AX_DISP32
ddb62495 8812 && t->opcode_space == SPACE_BASE
69196391 8813 && t->mnem_off != MN_movabs)
e3669c7f
JB
8814 {
8815 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
8816 if (i.reloc[0] == BFD_RELOC_386_GOT32)
8817 continue;
8818
8819 /* xrelease mov %eax, <disp> is another special case. It must not
8820 match the accumulator-only encoding of mov. */
8821 if (i.hle_prefix)
8822 continue;
ae9a0a51
JB
8823
8824 /* Allow the ModR/M encoding to be requested by using a suitable
8825 {load} or {store} pseudo prefix. */
8826 if (i.dir_encoding == (i.types[0].bitfield.instance == Accum
8827 ? dir_encoding_store
8828 : dir_encoding_load)
8829 && !i.types[0].bitfield.disp64
8830 && !i.types[1].bitfield.disp64)
8831 continue;
8832 }
8833
8834 /* Allow the ModR/M encoding to be requested by using the {load} or
8835 {store} pseudo prefix on an applicable insn. */
8836 if (!t->opcode_modifier.modrm
8837 && i.reg_operands == 1
8838 && i.imm_operands == 1
8839 && (i.dir_encoding == dir_encoding_load
8840 || i.dir_encoding == dir_encoding_store)
8841 && t->opcode_space == SPACE_BASE)
8842 {
8843 if (t->base_opcode == 0xb0 /* mov $imm, %reg */
8844 && i.dir_encoding == dir_encoding_store)
8845 continue;
8846
8847 if ((t->base_opcode | 0x38) == 0x3c /* <alu> $imm, %acc */
8848 && (t->base_opcode != 0x3c /* cmp $imm, %acc */
8849 || i.dir_encoding == dir_encoding_load))
8850 continue;
8851
8852 if (t->base_opcode == 0xa8 /* test $imm, %acc */
8853 && i.dir_encoding == dir_encoding_load)
8854 continue;
e3669c7f 8855 }
f5eb1d70
JB
8856 /* Fall through. */
8857
8858 case 3:
3ac21baa
JB
8859 if (!(size_match & MATCH_STRAIGHT))
8860 goto check_reverse;
64c49ab3
JB
8861 /* Reverse direction of operands if swapping is possible in the first
8862 place (operands need to be symmetric) and
8863 - the load form is requested, and the template is a store form,
8864 - the store form is requested, and the template is a load form,
8865 - the non-default (swapped) form is requested. */
8866 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
3083f376 8867
8868 j = i.operands - 1 - (t->opcode_space == SPACE_EVEXMAP4
8869 && t->opcode_modifier.vexvvvv);
8870
f5eb1d70 8871 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
8872 && !operand_type_all_zero (&overlap1))
8873 switch (i.dir_encoding)
8874 {
8875 case dir_encoding_load:
3083f376 8876 if (operand_type_check (operand_types[j], anymem)
dfd69174 8877 || t->opcode_modifier.regmem)
64c49ab3
JB
8878 goto check_reverse;
8879 break;
8880
8881 case dir_encoding_store:
3083f376 8882 if (!operand_type_check (operand_types[j], anymem)
dfd69174 8883 && !t->opcode_modifier.regmem)
64c49ab3
JB
8884 goto check_reverse;
8885 break;
8886
8887 case dir_encoding_swap:
8888 goto check_reverse;
8889
8890 case dir_encoding_default:
8891 break;
8892 }
3083f376 8893
86fa6981 8894 /* If we want store form, we skip the current load. */
64c49ab3
JB
8895 if ((i.dir_encoding == dir_encoding_store
8896 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
8897 && i.mem_operands == 0
8898 && t->opcode_modifier.load)
fa99fab2 8899 continue;
1a0670f3 8900 /* Fall through. */
f48ff2ae 8901 case 4:
c0f3af97 8902 case 5:
c6fb90c8 8903 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
8904 if (!operand_type_match (overlap0, i.types[0])
8905 || !operand_type_match (overlap1, i.types[1])
e2195274 8906 || ((check_register & 3) == 3
dc821c5f 8907 && !operand_type_register_match (i.types[0],
40fb9820 8908 operand_types[0],
dc821c5f 8909 i.types[1],
40fb9820 8910 operand_types[1])))
29b0f896 8911 {
7b94647a
JB
8912 specific_error = progress (i.error);
8913
29b0f896 8914 /* Check if other direction is valid ... */
38e314eb 8915 if (!t->opcode_modifier.d)
29b0f896
AM
8916 continue;
8917
dc1e8a47 8918 check_reverse:
3ac21baa
JB
8919 if (!(size_match & MATCH_REVERSE))
8920 continue;
29b0f896 8921 /* Try reversing direction of operands. */
734dfd1c 8922 j = is_cpu (t, CpuFMA4)
3083f376 8923 || is_cpu (t, CpuXOP)
8924 || is_cpu (t, CpuAPX_F) ? 1 : i.operands - 1;
8bd915b7
JB
8925 overlap0 = operand_type_and (i.types[0], operand_types[j]);
8926 overlap1 = operand_type_and (i.types[j], operand_types[0]);
c975cec5 8927 overlap2 = operand_type_and (i.types[1], operand_types[1]);
3083f376 8928 gas_assert (t->operands != 3 || !check_register
8929 || is_cpu (t, CpuAPX_F));
40fb9820 8930 if (!operand_type_match (overlap0, i.types[0])
8bd915b7 8931 || !operand_type_match (overlap1, i.types[j])
c975cec5
JB
8932 || (t->operands == 3
8933 && !operand_type_match (overlap2, i.types[1]))
45664ddb 8934 || (check_register
dc821c5f 8935 && !operand_type_register_match (i.types[0],
8bd915b7
JB
8936 operand_types[j],
8937 i.types[j],
45664ddb 8938 operand_types[0])))
29b0f896
AM
8939 {
8940 /* Does not match either direction. */
7b94647a 8941 specific_error = progress (i.error);
29b0f896
AM
8942 continue;
8943 }
ac9226cf 8944 /* found_reverse_match holds which variant of D
29b0f896 8945 we've found. */
38e314eb
JB
8946 if (!t->opcode_modifier.d)
8947 found_reverse_match = 0;
8948 else if (operand_types[0].bitfield.tbyte)
ac9226cf 8949 {
4943d587
JB
8950 if (t->opcode_modifier.operandconstraint != UGH)
8951 found_reverse_match = Opcode_FloatD;
bd782808
JB
8952 else
8953 found_reverse_match = ~0;
ac9226cf 8954 /* FSUB{,R} and FDIV{,R} may need a 2nd bit flipped. */
bd782808 8955 if ((t->extension_opcode & 4)
ac9226cf
JB
8956 && (intel_syntax || intel_mnemonic))
8957 found_reverse_match |= Opcode_FloatR;
8958 }
734dfd1c 8959 else if (is_cpu (t, CpuFMA4) || is_cpu (t, CpuXOP))
8bd915b7
JB
8960 {
8961 found_reverse_match = Opcode_VexW;
8962 goto check_operands_345;
8963 }
dd74a603
CL
8964 else if (t->opcode_space == SPACE_EVEXMAP4
8965 && t->opcode_modifier.w)
3083f376 8966 {
8967 found_reverse_match = Opcode_D;
8968 goto check_operands_345;
8969 }
ddb62495
JB
8970 else if (t->opcode_space != SPACE_BASE
8971 && (t->opcode_space != SPACE_0F
2c735193
JB
8972 /* MOV to/from CR/DR/TR, as an exception, follow
8973 the base opcode space encoding model. */
8974 || (t->base_opcode | 7) != 0x27))
dbbc8b7e 8975 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
2c735193 8976 ? Opcode_ExtD : Opcode_SIMD_IntD;
a33ef3c2 8977 else if (!t->opcode_modifier.commutative)
38e314eb 8978 found_reverse_match = Opcode_D;
a33ef3c2
JB
8979 else
8980 found_reverse_match = ~0;
29b0f896 8981 }
f48ff2ae 8982 else
29b0f896 8983 {
f48ff2ae 8984 /* Found a forward 2 operand match here. */
8bd915b7 8985 check_operands_345:
d1cbb4db
L
8986 switch (t->operands)
8987 {
c0f3af97 8988 case 5:
3d0738af 8989 overlap4 = operand_type_and (i.types[4], operand_types[4]);
c0f3af97 8990 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 8991 || !operand_type_register_match (i.types[3],
c0f3af97 8992 operand_types[3],
c0f3af97
L
8993 i.types[4],
8994 operand_types[4]))
7b94647a
JB
8995 {
8996 specific_error = progress (i.error);
8997 continue;
8998 }
1a0670f3 8999 /* Fall through. */
f48ff2ae 9000 case 4:
3d0738af 9001 overlap3 = operand_type_and (i.types[3], operand_types[3]);
40fb9820 9002 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
9003 || ((check_register & 0xa) == 0xa
9004 && !operand_type_register_match (i.types[1],
f7768225
JB
9005 operand_types[1],
9006 i.types[3],
e2195274
JB
9007 operand_types[3]))
9008 || ((check_register & 0xc) == 0xc
9009 && !operand_type_register_match (i.types[2],
9010 operand_types[2],
9011 i.types[3],
9012 operand_types[3])))
7b94647a
JB
9013 {
9014 specific_error = progress (i.error);
9015 continue;
9016 }
1a0670f3 9017 /* Fall through. */
f48ff2ae 9018 case 3:
3d0738af 9019 overlap2 = operand_type_and (i.types[2], operand_types[2]);
40fb9820 9020 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
9021 || ((check_register & 5) == 5
9022 && !operand_type_register_match (i.types[0],
23e42951
JB
9023 operand_types[0],
9024 i.types[2],
e2195274
JB
9025 operand_types[2]))
9026 || ((check_register & 6) == 6
9027 && !operand_type_register_match (i.types[1],
9028 operand_types[1],
9029 i.types[2],
9030 operand_types[2])))
7b94647a
JB
9031 {
9032 specific_error = progress (i.error);
9033 continue;
9034 }
f48ff2ae
L
9035 break;
9036 }
29b0f896 9037 }
f48ff2ae 9038 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
9039 slip through to break. */
9040 }
c0f3af97 9041
9bb4d860
L
9042 /* Check if VEX/EVEX encoding requirements can be satisfied. */
9043 if (VEX_check_encoding (t))
da4977e0 9044 {
7b94647a 9045 specific_error = progress (i.error);
da4977e0
JB
9046 continue;
9047 }
9048
80d61d8d
CL
9049 /* Check if EGPR operands(r16-r31) are valid. */
9050 if (check_EgprOperands (t))
9051 {
9052 specific_error = progress (i.error);
9053 continue;
9054 }
9055
9bb4d860
L
9056 /* Check if vector operands are valid. */
9057 if (check_VecOperands (t))
5614d22c 9058 {
7b94647a 9059 specific_error = progress (i.error);
5614d22c
JB
9060 continue;
9061 }
a683cc34 9062
08a98d4c
MZ
9063 /* Check if APX operands are valid. */
9064 if (check_APX_operands (t))
9065 {
9066 specific_error = progress (i.error);
9067 continue;
9068 }
9069
58bceb18 9070 /* Check whether to use the shorter VEX encoding for certain insns where
39bb3ade
JB
9071 the EVEX encoding comes first in the table. This requires the respective
9072 AVX-* feature to be explicitly enabled.
9073
9074 Most of the respective insns have just a single EVEX and a single VEX
9075 template. The one that's presently different is generated using the
9076 Vxy / Exy constructs: There are 3 suffix-less EVEX forms, the latter
9077 two of which may fall back to their two corresponding VEX forms. */
9078 j = t->mnem_off != MN_vcvtneps2bf16 ? 1 : 2;
d3b01414 9079 if ((t == current_templates.start || j > 1)
58bceb18
JB
9080 && t->opcode_modifier.disp8memshift
9081 && !t->opcode_modifier.vex
6177c84d 9082 && !need_evex_encoding (t)
d3b01414 9083 && t + j < current_templates.end
39bb3ade 9084 && t[j].opcode_modifier.vex)
58bceb18
JB
9085 {
9086 i386_cpu_flags cpu;
9087 unsigned int memshift = i.memshift;
9088
9089 i.memshift = 0;
39bb3ade
JB
9090 cpu = cpu_flags_and (cpu_flags_from_attr (t[j].cpu),
9091 cpu_arch_isa_flags);
58bceb18
JB
9092 if (!cpu_flags_all_zero (&cpu)
9093 && (!i.types[0].bitfield.disp8
9094 || !operand_type_check (i.types[0], disp)
9095 || i.op[0].disps->X_op != O_constant
9096 || fits_in_disp8 (i.op[0].disps->X_add_number)))
9097 {
9098 specific_error = progress (internal_error);
39bb3ade 9099 t += j - 1;
58bceb18
JB
9100 continue;
9101 }
9102 i.memshift = memshift;
9103 }
9104
6967f19d
HL
9105 /* If we can optimize a NDD insn to legacy insn, like
9106 add %r16, %r8, %r8 -> add %r16, %r8,
9107 add %r8, %r16, %r8 -> add %r16, %r8, then rematch template.
9108 Note that the semantics have not been changed. */
9109 if (optimize
9110 && !i.no_optimize
e346d50a 9111 && i.encoding != encoding_evex
0ebcbb1b
JB
9112 && ((t + 1 < current_templates.end
9113 && !t[1].opcode_modifier.evex
9114 && t[1].opcode_space <= SPACE_0F38
9115 && t->opcode_modifier.vexvvvv == VexVVVV_DST)
9116 || t->mnem_off == MN_movbe)
6967f19d
HL
9117 && (i.types[i.operands - 1].bitfield.dword
9118 || i.types[i.operands - 1].bitfield.qword))
9119 {
9120 unsigned int match_dest_op = can_convert_NDD_to_legacy (t);
9121
9122 if (match_dest_op != (unsigned int) ~0)
9123 {
9124 size_match = true;
9125 /* We ensure that the next template has the same input
9126 operands as the original matching template by the first
9127 opernd (ATT). To avoid someone support new NDD insns and
9128 put it in the wrong position. */
9129 overlap0 = operand_type_and (i.types[0],
9130 t[1].operand_types[0]);
9131 if (t->opcode_modifier.d)
9132 overlap1 = operand_type_and (i.types[0],
9133 t[1].operand_types[1]);
9134 if (!operand_type_match (overlap0, i.types[0])
9135 && (!t->opcode_modifier.d
9136 || !operand_type_match (overlap1, i.types[0])))
9137 size_match = false;
9138
9139 if (size_match
9140 && (t[1].opcode_space <= SPACE_0F
9141 /* Some non-legacy-map0/1 insns can be shorter when
9142 legacy-encoded and when no REX prefix is required. */
9143 || (!check_EgprOperands (t + 1)
9144 && !check_Rex_required ()
9145 && !i.op[i.operands - 1].regs->reg_type.bitfield.qword)))
9146 {
9147 if (i.operands > 2 && match_dest_op == i.operands - 3)
9148 swap_2_operands (match_dest_op, i.operands - 2);
9149
9150 --i.operands;
9151 --i.reg_operands;
9152
0ebcbb1b
JB
9153 if (t->mnem_off == MN_movbe)
9154 {
9155 gas_assert (t[1].mnem_off == MN_bswap);
9156 ++current_templates.end;
9157 }
9158
6967f19d
HL
9159 specific_error = progress (internal_error);
9160 continue;
9161 }
9162
9163 }
9164 }
9165
29b0f896
AM
9166 /* We've found a match; break out of loop. */
9167 break;
9168 }
9169
7b94647a
JB
9170#undef progress
9171
d3b01414 9172 if (t == current_templates.end)
29b0f896
AM
9173 {
9174 /* We found no match. */
04784e33 9175 i.error = specific_error;
fa99fab2 9176 return NULL;
29b0f896 9177 }
252b5132 9178
29b0f896
AM
9179 if (!quiet_warnings)
9180 {
9181 if (!intel_syntax
0cfa3eb3 9182 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
76d3f746 9183 as_warn (_("indirect %s without `*'"), insn_name (t));
29b0f896 9184
40fb9820 9185 if (t->opcode_modifier.isprefix
3cd7f3e3 9186 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
9187 {
9188 /* Warn them that a data or address size prefix doesn't
9189 affect assembly of the next line of code. */
76d3f746 9190 as_warn (_("stand-alone `%s' prefix"), insn_name (t));
29b0f896
AM
9191 }
9192 }
9193
9194 /* Copy the template we found. */
9a182d04 9195 install_template (t);
539e75ad
L
9196
9197 if (addr_prefix_disp != -1)
9198 i.tm.operand_types[addr_prefix_disp]
9199 = operand_types[addr_prefix_disp];
9200
09de03fc
JB
9201 /* APX insns acting on byte operands are WIG, yet that can't be expressed
9202 in the templates (they're also covering word/dword/qword operands). */
9203 if (t->opcode_space == SPACE_EVEXMAP4 && !t->opcode_modifier.vexw &&
9204 i.types[i.operands - 1].bitfield.byte)
9205 {
9206 gas_assert (t->opcode_modifier.w);
9207 i.tm.opcode_modifier.vexw = VEXWIG;
9208 }
9209
8bd915b7 9210 switch (found_reverse_match)
29b0f896 9211 {
8bd915b7
JB
9212 case 0:
9213 break;
9214
bd782808
JB
9215 case Opcode_FloatR:
9216 case Opcode_FloatR | Opcode_FloatD:
9217 i.tm.extension_opcode ^= Opcode_FloatR >> 3;
9218 found_reverse_match &= Opcode_FloatD;
9219
9220 /* Fall through. */
8bd915b7 9221 default:
dfd69174
JB
9222 /* If we found a reverse match we must alter the opcode direction
9223 bit and clear/flip the regmem modifier one. found_reverse_match
9224 holds bits to change (different for int & float insns). */
29b0f896
AM
9225
9226 i.tm.base_opcode ^= found_reverse_match;
9227
3083f376 9228 if (i.tm.opcode_space == SPACE_EVEXMAP4)
9229 goto swap_first_2;
9230
dfd69174
JB
9231 /* Certain SIMD insns have their load forms specified in the opcode
9232 table, and hence we need to _set_ RegMem instead of clearing it.
9233 We need to avoid setting the bit though on insns like KMOVW. */
9234 i.tm.opcode_modifier.regmem
9235 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
9236 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
9237 && !i.tm.opcode_modifier.regmem;
a33ef3c2
JB
9238
9239 /* Fall through. */
9240 case ~0:
9241 i.tm.operand_types[0] = operand_types[i.operands - 1];
9242 i.tm.operand_types[i.operands - 1] = operand_types[0];
8bd915b7
JB
9243 break;
9244
9245 case Opcode_VexW:
9246 /* Only the first two register operands need reversing, alongside
9247 flipping VEX.W. */
9248 i.tm.opcode_modifier.vexw ^= VEXW0 ^ VEXW1;
9249
3083f376 9250 swap_first_2:
8bd915b7
JB
9251 j = i.tm.operand_types[0].bitfield.imm8;
9252 i.tm.operand_types[j] = operand_types[j + 1];
9253 i.tm.operand_types[j + 1] = operand_types[j];
9254 break;
29b0f896
AM
9255 }
9256
fa99fab2 9257 return t;
29b0f896
AM
9258}
9259
9260static int
e3bb37b5 9261check_string (void)
29b0f896 9262{
51c8edf6
JB
9263 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
9264 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 9265
5e042380 9266 if (i.seg[op] != NULL && i.seg[op] != reg_es)
29b0f896 9267 {
51c8edf6 9268 as_bad (_("`%s' operand %u must use `%ses' segment"),
76d3f746 9269 insn_name (&i.tm),
51c8edf6
JB
9270 intel_syntax ? i.tm.operands - es_op : es_op + 1,
9271 register_prefix);
9272 return 0;
29b0f896 9273 }
51c8edf6
JB
9274
9275 /* There's only ever one segment override allowed per instruction.
9276 This instruction possibly has a legal segment override on the
9277 second operand, so copy the segment to where non-string
9278 instructions store it, allowing common code. */
9279 i.seg[op] = i.seg[1];
9280
29b0f896
AM
9281 return 1;
9282}
9283
9284static int
543613e9 9285process_suffix (void)
29b0f896 9286{
7fc69528 9287 bool is_movx = false;
8b65b895 9288
29b0f896
AM
9289 /* If matched instruction specifies an explicit instruction mnemonic
9290 suffix, use it. */
673fe0f0 9291 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 9292 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 9293 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 9294 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 9295 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 9296 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 9297 else if (i.reg_operands
c8f8eebc 9298 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
255571cd 9299 && i.tm.opcode_modifier.operandconstraint != ADDR_PREFIX_OP_REG)
29b0f896 9300 {
65fca059 9301 unsigned int numop = i.operands;
389d00a5
JB
9302
9303 /* MOVSX/MOVZX */
ddb62495 9304 is_movx = (i.tm.opcode_space == SPACE_0F
389d00a5 9305 && (i.tm.base_opcode | 8) == 0xbe)
ddb62495 9306 || (i.tm.opcode_space == SPACE_BASE
389d00a5 9307 && i.tm.base_opcode == 0x63
734dfd1c 9308 && is_cpu (&i.tm, Cpu64));
389d00a5 9309
65fca059
JB
9310 /* movsx/movzx want only their source operand considered here, for the
9311 ambiguity checking below. The suffix will be replaced afterwards
9312 to represent the destination (register). */
389d00a5 9313 if (is_movx && (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63))
65fca059
JB
9314 --i.operands;
9315
643bb870 9316 /* crc32 needs REX.W set regardless of suffix / source operand size. */
7fc69528 9317 if (i.tm.mnem_off == MN_crc32 && i.tm.operand_types[1].bitfield.qword)
643bb870
JB
9318 i.rex |= REX_W;
9319
29b0f896 9320 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 9321 based on GPR operands. */
29b0f896
AM
9322 if (!i.suffix)
9323 {
9324 /* We take i.suffix from the last register operand specified,
9325 Destination register type is more significant than source
381d071f
L
9326 register type. crc32 in SSE4.2 prefers source register
9327 type. */
7fc69528 9328 unsigned int op = i.tm.mnem_off == MN_crc32 ? 1 : i.operands;
20592a94 9329
1a035124
JB
9330 while (op--)
9331 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
9332 || i.tm.operand_types[op].bitfield.instance == Accum)
9333 {
9334 if (i.types[op].bitfield.class != Reg)
9335 continue;
9336 if (i.types[op].bitfield.byte)
9337 i.suffix = BYTE_MNEM_SUFFIX;
9338 else if (i.types[op].bitfield.word)
9339 i.suffix = WORD_MNEM_SUFFIX;
9340 else if (i.types[op].bitfield.dword)
9341 i.suffix = LONG_MNEM_SUFFIX;
9342 else if (i.types[op].bitfield.qword)
9343 i.suffix = QWORD_MNEM_SUFFIX;
9344 else
9345 continue;
9346 break;
9347 }
65fca059
JB
9348
9349 /* As an exception, movsx/movzx silently default to a byte source
9350 in AT&T mode. */
389d00a5 9351 if (is_movx && i.tm.opcode_modifier.w && !i.suffix && !intel_syntax)
65fca059 9352 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
9353 }
9354 else if (i.suffix == BYTE_MNEM_SUFFIX)
9355 {
1cb0ab18 9356 if (!check_byte_reg ())
29b0f896
AM
9357 return 0;
9358 }
9359 else if (i.suffix == LONG_MNEM_SUFFIX)
9360 {
1cb0ab18 9361 if (!check_long_reg ())
29b0f896
AM
9362 return 0;
9363 }
9364 else if (i.suffix == QWORD_MNEM_SUFFIX)
9365 {
1cb0ab18 9366 if (!check_qword_reg ())
29b0f896
AM
9367 return 0;
9368 }
9369 else if (i.suffix == WORD_MNEM_SUFFIX)
9370 {
1cb0ab18 9371 if (!check_word_reg ())
29b0f896
AM
9372 return 0;
9373 }
3cd7f3e3
L
9374 else if (intel_syntax
9375 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
9376 /* Do nothing if the instruction is going to ignore the prefix. */
9377 ;
9378 else
9379 abort ();
65fca059
JB
9380
9381 /* Undo the movsx/movzx change done above. */
9382 i.operands = numop;
29b0f896 9383 }
3cd7f3e3
L
9384 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
9385 && !i.suffix)
29b0f896 9386 {
13e600d0
JB
9387 i.suffix = stackop_size;
9388 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
9389 {
9390 /* stackop_size is set to LONG_MNEM_SUFFIX for the
9391 .code16gcc directive to support 16-bit mode with
9392 32-bit address. For IRET without a suffix, generate
9393 16-bit IRET (opcode 0xcf) to return from an interrupt
9394 handler. */
13e600d0
JB
9395 if (i.tm.base_opcode == 0xcf)
9396 {
9397 i.suffix = WORD_MNEM_SUFFIX;
9398 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
9399 }
9400 /* Warn about changed behavior for segment register push/pop. */
9401 else if ((i.tm.base_opcode | 1) == 0x07)
9402 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
76d3f746 9403 insn_name (&i.tm));
06f74c5c 9404 }
29b0f896 9405 }
c006a730 9406 else if (!i.suffix
0cfa3eb3
JB
9407 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
9408 || i.tm.opcode_modifier.jump == JUMP_BYTE
9409 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
ddb62495 9410 || (i.tm.opcode_space == SPACE_0F
389d00a5 9411 && i.tm.base_opcode == 0x01 /* [ls][gi]dt */
64e74474 9412 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
9413 {
9414 switch (flag_code)
9415 {
9416 case CODE_64BIT:
40fb9820 9417 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 9418 {
828c2a25
JB
9419 if (i.tm.opcode_modifier.jump == JUMP_BYTE
9420 || i.tm.opcode_modifier.no_lsuf)
9421 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
9422 break;
9423 }
1a0670f3 9424 /* Fall through. */
9306ca4a 9425 case CODE_32BIT:
40fb9820 9426 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
9427 i.suffix = LONG_MNEM_SUFFIX;
9428 break;
9429 case CODE_16BIT:
40fb9820 9430 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
9431 i.suffix = WORD_MNEM_SUFFIX;
9432 break;
9433 }
9434 }
252b5132 9435
c006a730 9436 if (!i.suffix
3cd7f3e3 9437 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
9438 /* Also cover lret/retf/iret in 64-bit mode. */
9439 || (flag_code == CODE_64BIT
9440 && !i.tm.opcode_modifier.no_lsuf
9441 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 9442 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
9443 /* Explicit sizing prefixes are assumed to disambiguate insns. */
9444 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
9445 /* Accept FLDENV et al without suffix. */
9446 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 9447 {
6c0946d0 9448 unsigned int suffixes, evex = 0;
c006a730
JB
9449
9450 suffixes = !i.tm.opcode_modifier.no_bsuf;
9451 if (!i.tm.opcode_modifier.no_wsuf)
9452 suffixes |= 1 << 1;
9453 if (!i.tm.opcode_modifier.no_lsuf)
9454 suffixes |= 1 << 2;
c006a730
JB
9455 if (!i.tm.opcode_modifier.no_ssuf)
9456 suffixes |= 1 << 4;
9457 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
9458 suffixes |= 1 << 5;
9459
6c0946d0
JB
9460 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
9461 also suitable for AT&T syntax mode, it was requested that this be
9462 restricted to just Intel syntax. */
a5748e0d
JB
9463 if (intel_syntax && is_any_vex_encoding (&i.tm)
9464 && !i.broadcast.type && !i.broadcast.bytes)
6c0946d0 9465 {
b9915cbc 9466 unsigned int op;
6c0946d0 9467
b9915cbc 9468 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 9469 {
4fc85f37
JB
9470 if (vector_size < VSZ512)
9471 {
9472 i.tm.operand_types[op].bitfield.zmmword = 0;
9473 if (vector_size < VSZ256)
9474 {
9475 i.tm.operand_types[op].bitfield.ymmword = 0;
9476 if (i.tm.operand_types[op].bitfield.xmmword
706ce984 9477 && i.tm.opcode_modifier.evex == EVEXDYN)
4fc85f37
JB
9478 i.tm.opcode_modifier.evex = EVEX128;
9479 }
9480 else if (i.tm.operand_types[op].bitfield.ymmword
9481 && !i.tm.operand_types[op].bitfield.xmmword
706ce984 9482 && i.tm.opcode_modifier.evex == EVEXDYN)
4fc85f37
JB
9483 i.tm.opcode_modifier.evex = EVEX256;
9484 }
706ce984 9485 else if (i.tm.opcode_modifier.evex
4fc85f37 9486 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 9487 {
b9915cbc
JB
9488 if (i.tm.operand_types[op].bitfield.ymmword)
9489 i.tm.operand_types[op].bitfield.xmmword = 0;
9490 if (i.tm.operand_types[op].bitfield.zmmword)
9491 i.tm.operand_types[op].bitfield.ymmword = 0;
706ce984 9492 if (i.tm.opcode_modifier.evex == EVEXDYN)
b9915cbc
JB
9493 i.tm.opcode_modifier.evex = EVEX512;
9494 }
6c0946d0 9495
b9915cbc
JB
9496 if (i.tm.operand_types[op].bitfield.xmmword
9497 + i.tm.operand_types[op].bitfield.ymmword
9498 + i.tm.operand_types[op].bitfield.zmmword < 2)
9499 continue;
6c0946d0 9500
b9915cbc
JB
9501 /* Any properly sized operand disambiguates the insn. */
9502 if (i.types[op].bitfield.xmmword
9503 || i.types[op].bitfield.ymmword
9504 || i.types[op].bitfield.zmmword)
9505 {
9506 suffixes &= ~(7 << 6);
9507 evex = 0;
9508 break;
9509 }
6c0946d0 9510
b9915cbc
JB
9511 if ((i.flags[op] & Operand_Mem)
9512 && i.tm.operand_types[op].bitfield.unspecified)
9513 {
9514 if (i.tm.operand_types[op].bitfield.xmmword)
9515 suffixes |= 1 << 6;
9516 if (i.tm.operand_types[op].bitfield.ymmword)
9517 suffixes |= 1 << 7;
9518 if (i.tm.operand_types[op].bitfield.zmmword)
9519 suffixes |= 1 << 8;
706ce984 9520 if (i.tm.opcode_modifier.evex)
b9915cbc 9521 evex = EVEX512;
6c0946d0
JB
9522 }
9523 }
9524 }
9525
9526 /* Are multiple suffixes / operand sizes allowed? */
c006a730 9527 if (suffixes & (suffixes - 1))
9306ca4a 9528 {
873494c8 9529 if (intel_syntax
3cd7f3e3 9530 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 9531 || operand_check == check_error))
9306ca4a 9532 {
76d3f746 9533 as_bad (_("ambiguous operand size for `%s'"), insn_name (&i.tm));
9306ca4a
JB
9534 return 0;
9535 }
c006a730 9536 if (operand_check == check_error)
9306ca4a 9537 {
c006a730 9538 as_bad (_("no instruction mnemonic suffix given and "
76d3f746 9539 "no register operands; can't size `%s'"), insn_name (&i.tm));
9306ca4a
JB
9540 return 0;
9541 }
c006a730 9542 if (operand_check == check_warning)
873494c8
JB
9543 as_warn (_("%s; using default for `%s'"),
9544 intel_syntax
9545 ? _("ambiguous operand size")
9546 : _("no instruction mnemonic suffix given and "
9547 "no register operands"),
76d3f746 9548 insn_name (&i.tm));
c006a730
JB
9549
9550 if (i.tm.opcode_modifier.floatmf)
9551 i.suffix = SHORT_MNEM_SUFFIX;
389d00a5 9552 else if (is_movx)
65fca059 9553 /* handled below */;
6c0946d0
JB
9554 else if (evex)
9555 i.tm.opcode_modifier.evex = evex;
c006a730
JB
9556 else if (flag_code == CODE_16BIT)
9557 i.suffix = WORD_MNEM_SUFFIX;
1a035124 9558 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 9559 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
9560 else
9561 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 9562 }
29b0f896 9563 }
252b5132 9564
389d00a5 9565 if (is_movx)
65fca059
JB
9566 {
9567 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
9568 In AT&T syntax, if there is no suffix (warned about above), the default
9569 will be byte extension. */
9570 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
9571 i.tm.base_opcode |= 1;
9572
9573 /* For further processing, the suffix should represent the destination
9574 (register). This is already the case when one was used with
9575 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
9576 no suffix to begin with. */
9577 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
9578 {
9579 if (i.types[1].bitfield.word)
9580 i.suffix = WORD_MNEM_SUFFIX;
9581 else if (i.types[1].bitfield.qword)
9582 i.suffix = QWORD_MNEM_SUFFIX;
9583 else
9584 i.suffix = LONG_MNEM_SUFFIX;
9585
9586 i.tm.opcode_modifier.w = 0;
9587 }
9588 }
9589
50128d0c
JB
9590 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
9591 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
9592 != (i.tm.operand_types[1].bitfield.class == Reg);
9593
d2224064
JB
9594 /* Change the opcode based on the operand size given by i.suffix. */
9595 switch (i.suffix)
29b0f896 9596 {
d2224064
JB
9597 /* Size floating point instruction. */
9598 case LONG_MNEM_SUFFIX:
9599 if (i.tm.opcode_modifier.floatmf)
9600 {
9601 i.tm.base_opcode ^= 4;
9602 break;
9603 }
9604 /* fall through */
9605 case WORD_MNEM_SUFFIX:
9606 case QWORD_MNEM_SUFFIX:
29b0f896 9607 /* It's not a byte, select word/dword operation. */
40fb9820 9608 if (i.tm.opcode_modifier.w)
29b0f896 9609 {
50128d0c 9610 if (i.short_form)
29b0f896
AM
9611 i.tm.base_opcode |= 8;
9612 else
9613 i.tm.base_opcode |= 1;
9614 }
4e3be89f
JB
9615
9616 /* Set mode64 for an operand. */
9617 if (i.suffix == QWORD_MNEM_SUFFIX)
9618 {
9619 if (flag_code == CODE_64BIT
9620 && !i.tm.opcode_modifier.norex64
9621 && !i.tm.opcode_modifier.vexw
9622 /* Special case for xchg %rax,%rax. It is NOP and doesn't
9623 need rex64. */
9624 && ! (i.operands == 2
9625 && i.tm.base_opcode == 0x90
9626 && i.tm.opcode_space == SPACE_BASE
9627 && i.types[0].bitfield.instance == Accum
9628 && i.types[1].bitfield.instance == Accum))
9629 i.rex |= REX_W;
9630
9631 break;
9632 }
9633
d2224064
JB
9634 /* fall through */
9635 case SHORT_MNEM_SUFFIX:
29b0f896
AM
9636 /* Now select between word & dword operations via the operand
9637 size prefix, except for instructions that will ignore this
9638 prefix anyway. */
4e3be89f 9639 if (i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc 9640 && !i.tm.opcode_modifier.floatmf
6177c84d
CL
9641 && (!is_any_vex_encoding (&i.tm)
9642 || i.tm.opcode_space == SPACE_EVEXMAP4)
c8f8eebc
JB
9643 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
9644 || (flag_code == CODE_64BIT
9645 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
9646 {
9647 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 9648
0cfa3eb3 9649 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 9650 prefix = ADDR_PREFIX_OPCODE;
252b5132 9651
6177c84d
CL
9652 /* The DATA PREFIX of EVEX promoted from legacy APX instructions
9653 needs to be adjusted. */
9654 if (i.tm.opcode_space == SPACE_EVEXMAP4)
9655 {
9656 gas_assert (!i.tm.opcode_modifier.opcodeprefix);
9657 i.tm.opcode_modifier.opcodeprefix = PREFIX_0X66;
9658 }
9659 else if (!add_prefix (prefix))
29b0f896 9660 return 0;
24eab124 9661 }
252b5132 9662
d2224064 9663 break;
8bbb3ad8
JB
9664
9665 case 0:
f9a6a8f0 9666 /* Select word/dword/qword operation with explicit data sizing prefix
8bbb3ad8
JB
9667 when there are no suitable register operands. */
9668 if (i.tm.opcode_modifier.w
9669 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
9670 && (!i.reg_operands
9671 || (i.reg_operands == 1
9672 /* ShiftCount */
9673 && (i.tm.operand_types[0].bitfield.instance == RegC
9674 /* InOutPortReg */
9675 || i.tm.operand_types[0].bitfield.instance == RegD
9676 || i.tm.operand_types[1].bitfield.instance == RegD
7fc69528 9677 || i.tm.mnem_off == MN_crc32))))
8bbb3ad8
JB
9678 i.tm.base_opcode |= 1;
9679 break;
29b0f896 9680 }
7ecd2f8b 9681
255571cd 9682 if (i.tm.opcode_modifier.operandconstraint == ADDR_PREFIX_OP_REG)
c0a30a9f 9683 {
c8f8eebc
JB
9684 gas_assert (!i.suffix);
9685 gas_assert (i.reg_operands);
c0a30a9f 9686
c8f8eebc
JB
9687 if (i.tm.operand_types[0].bitfield.instance == Accum
9688 || i.operands == 1)
9689 {
9690 /* The address size override prefix changes the size of the
9691 first operand. */
9692 if (flag_code == CODE_64BIT
9693 && i.op[0].regs->reg_type.bitfield.word)
9694 {
9695 as_bad (_("16-bit addressing unavailable for `%s'"),
76d3f746 9696 insn_name (&i.tm));
c8f8eebc
JB
9697 return 0;
9698 }
9699
9700 if ((flag_code == CODE_32BIT
9701 ? i.op[0].regs->reg_type.bitfield.word
9702 : i.op[0].regs->reg_type.bitfield.dword)
9703 && !add_prefix (ADDR_PREFIX_OPCODE))
9704 return 0;
9705 }
c0a30a9f
L
9706 else
9707 {
c8f8eebc
JB
9708 /* Check invalid register operand when the address size override
9709 prefix changes the size of register operands. */
9710 unsigned int op;
9711 enum { need_word, need_dword, need_qword } need;
9712
27f13469 9713 /* Check the register operand for the address size prefix if
b3a3496f 9714 the memory operand has no real registers, like symbol, DISP
829f3fe1 9715 or bogus (x32-only) symbol(%rip) when symbol(%eip) is meant. */
27f13469
L
9716 if (i.mem_operands == 1
9717 && i.reg_operands == 1
9718 && i.operands == 2
27f13469 9719 && i.types[1].bitfield.class == Reg
b3a3496f
L
9720 && (flag_code == CODE_32BIT
9721 ? i.op[1].regs->reg_type.bitfield.word
9722 : i.op[1].regs->reg_type.bitfield.dword)
9723 && ((i.base_reg == NULL && i.index_reg == NULL)
829f3fe1
JB
9724#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
9725 || (x86_elf_abi == X86_64_X32_ABI
9726 && i.base_reg
b3a3496f
L
9727 && i.base_reg->reg_num == RegIP
9728 && i.base_reg->reg_type.bitfield.qword))
829f3fe1
JB
9729#else
9730 || 0)
9731#endif
27f13469
L
9732 && !add_prefix (ADDR_PREFIX_OPCODE))
9733 return 0;
9734
c8f8eebc
JB
9735 if (flag_code == CODE_32BIT)
9736 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
9737 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
9738 need = need_dword;
9739 else
9740 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 9741
c8f8eebc
JB
9742 for (op = 0; op < i.operands; op++)
9743 {
9744 if (i.types[op].bitfield.class != Reg)
9745 continue;
9746
9747 switch (need)
9748 {
9749 case need_word:
9750 if (i.op[op].regs->reg_type.bitfield.word)
9751 continue;
9752 break;
9753 case need_dword:
9754 if (i.op[op].regs->reg_type.bitfield.dword)
9755 continue;
9756 break;
9757 case need_qword:
9758 if (i.op[op].regs->reg_type.bitfield.qword)
9759 continue;
9760 break;
9761 }
9762
9763 as_bad (_("invalid register operand size for `%s'"),
76d3f746 9764 insn_name (&i.tm));
c8f8eebc
JB
9765 return 0;
9766 }
9767 }
c0a30a9f
L
9768 }
9769
29b0f896
AM
9770 return 1;
9771}
3e73aa7c 9772
29b0f896 9773static int
543613e9 9774check_byte_reg (void)
29b0f896
AM
9775{
9776 int op;
543613e9 9777
29b0f896
AM
9778 for (op = i.operands; --op >= 0;)
9779 {
dc821c5f 9780 /* Skip non-register operands. */
bab6aec1 9781 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
9782 continue;
9783
29b0f896
AM
9784 /* If this is an eight bit register, it's OK. If it's the 16 or
9785 32 bit version of an eight bit register, we will just use the
9786 low portion, and that's OK too. */
dc821c5f 9787 if (i.types[op].bitfield.byte)
29b0f896
AM
9788 continue;
9789
5a819eb9 9790 /* I/O port address operands are OK too. */
75e5731b
JB
9791 if (i.tm.operand_types[op].bitfield.instance == RegD
9792 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
9793 continue;
9794
9706160a 9795 /* crc32 only wants its source operand checked here. */
7fc69528 9796 if (i.tm.mnem_off == MN_crc32 && op != 0)
9344ff29
L
9797 continue;
9798
29b0f896 9799 /* Any other register is bad. */
73c76375
JB
9800 as_bad (_("`%s%s' not allowed with `%s%c'"),
9801 register_prefix, i.op[op].regs->reg_name,
76d3f746 9802 insn_name (&i.tm), i.suffix);
73c76375 9803 return 0;
29b0f896
AM
9804 }
9805 return 1;
9806}
9807
9808static int
e3bb37b5 9809check_long_reg (void)
29b0f896
AM
9810{
9811 int op;
9812
9813 for (op = i.operands; --op >= 0;)
dc821c5f 9814 /* Skip non-register operands. */
bab6aec1 9815 if (i.types[op].bitfield.class != Reg)
dc821c5f 9816 continue;
29b0f896
AM
9817 /* Reject eight bit registers, except where the template requires
9818 them. (eg. movzb) */
dc821c5f 9819 else if (i.types[op].bitfield.byte
bab6aec1 9820 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 9821 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
9822 && (i.tm.operand_types[op].bitfield.word
9823 || i.tm.operand_types[op].bitfield.dword))
29b0f896 9824 {
a540244d
L
9825 as_bad (_("`%s%s' not allowed with `%s%c'"),
9826 register_prefix,
29b0f896 9827 i.op[op].regs->reg_name,
76d3f746 9828 insn_name (&i.tm),
29b0f896
AM
9829 i.suffix);
9830 return 0;
9831 }
d9a1b711
JB
9832 /* Error if the e prefix on a general reg is missing, or if the r
9833 prefix on a general reg is present. */
9834 else if ((i.types[op].bitfield.word
9835 || i.types[op].bitfield.qword)
bab6aec1 9836 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 9837 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 9838 && i.tm.operand_types[op].bitfield.dword)
29b0f896 9839 {
be4c5e58
L
9840 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
9841 register_prefix, i.op[op].regs->reg_name,
9842 i.suffix);
9843 return 0;
252b5132 9844 }
29b0f896
AM
9845 return 1;
9846}
252b5132 9847
29b0f896 9848static int
e3bb37b5 9849check_qword_reg (void)
29b0f896
AM
9850{
9851 int op;
252b5132 9852
29b0f896 9853 for (op = i.operands; --op >= 0; )
dc821c5f 9854 /* Skip non-register operands. */
bab6aec1 9855 if (i.types[op].bitfield.class != Reg)
dc821c5f 9856 continue;
29b0f896
AM
9857 /* Reject eight bit registers, except where the template requires
9858 them. (eg. movzb) */
dc821c5f 9859 else if (i.types[op].bitfield.byte
bab6aec1 9860 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 9861 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 9862 && (i.tm.operand_types[op].bitfield.word
742b55c7
JB
9863 || i.tm.operand_types[op].bitfield.dword
9864 || i.tm.operand_types[op].bitfield.qword))
29b0f896 9865 {
a540244d
L
9866 as_bad (_("`%s%s' not allowed with `%s%c'"),
9867 register_prefix,
29b0f896 9868 i.op[op].regs->reg_name,
76d3f746 9869 insn_name (&i.tm),
29b0f896
AM
9870 i.suffix);
9871 return 0;
9872 }
d9a1b711 9873 /* Error if the r prefix on a general reg is missing. */
dc821c5f
JB
9874 else if ((i.types[op].bitfield.word
9875 || i.types[op].bitfield.dword)
bab6aec1 9876 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 9877 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 9878 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
9879 {
9880 /* Prohibit these changes in the 64bit mode, since the
9881 lowering is more complicated. */
1cb0ab18
JB
9882 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
9883 register_prefix, i.op[op].regs->reg_name, i.suffix);
9884 return 0;
252b5132 9885 }
29b0f896
AM
9886 return 1;
9887}
252b5132 9888
29b0f896 9889static int
e3bb37b5 9890check_word_reg (void)
29b0f896
AM
9891{
9892 int op;
9893 for (op = i.operands; --op >= 0;)
dc821c5f 9894 /* Skip non-register operands. */
bab6aec1 9895 if (i.types[op].bitfield.class != Reg)
dc821c5f 9896 continue;
29b0f896
AM
9897 /* Reject eight bit registers, except where the template requires
9898 them. (eg. movzb) */
dc821c5f 9899 else if (i.types[op].bitfield.byte
bab6aec1 9900 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 9901 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
9902 && (i.tm.operand_types[op].bitfield.word
9903 || i.tm.operand_types[op].bitfield.dword))
29b0f896 9904 {
a540244d
L
9905 as_bad (_("`%s%s' not allowed with `%s%c'"),
9906 register_prefix,
29b0f896 9907 i.op[op].regs->reg_name,
76d3f746 9908 insn_name (&i.tm),
29b0f896
AM
9909 i.suffix);
9910 return 0;
9911 }
9706160a
JB
9912 /* Error if the e or r prefix on a general reg is present. */
9913 else if ((i.types[op].bitfield.dword
dc821c5f 9914 || i.types[op].bitfield.qword)
bab6aec1 9915 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 9916 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 9917 && i.tm.operand_types[op].bitfield.word)
252b5132 9918 {
9706160a
JB
9919 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
9920 register_prefix, i.op[op].regs->reg_name,
9921 i.suffix);
9922 return 0;
29b0f896
AM
9923 }
9924 return 1;
9925}
252b5132 9926
29b0f896 9927static int
40fb9820 9928update_imm (unsigned int j)
29b0f896 9929{
bc0844ae 9930 i386_operand_type overlap = i.types[j];
c34d1cc9
JB
9931
9932 if (i.tm.operand_types[j].bitfield.imm8
9933 && i.tm.operand_types[j].bitfield.imm8s
9934 && overlap.bitfield.imm8 && overlap.bitfield.imm8s)
9935 {
9936 /* This combination is used on 8-bit immediates where e.g. $~0 is
9937 desirable to permit. We're past operand type matching, so simply
9938 put things back in the shape they were before introducing the
9939 distinction between Imm8, Imm8S, and Imm8|Imm8S. */
9940 overlap.bitfield.imm8s = 0;
9941 }
9942
be1643ff
JB
9943 if (overlap.bitfield.imm8
9944 + overlap.bitfield.imm8s
9945 + overlap.bitfield.imm16
9946 + overlap.bitfield.imm32
9947 + overlap.bitfield.imm32s
9948 + overlap.bitfield.imm64 > 1)
29b0f896 9949 {
05909f23
JB
9950 static const i386_operand_type imm16 = { .bitfield = { .imm16 = 1 } };
9951 static const i386_operand_type imm32 = { .bitfield = { .imm32 = 1 } };
9952 static const i386_operand_type imm32s = { .bitfield = { .imm32s = 1 } };
9953 static const i386_operand_type imm16_32 = { .bitfield =
9954 { .imm16 = 1, .imm32 = 1 }
9955 };
9956 static const i386_operand_type imm16_32s = { .bitfield =
9957 { .imm16 = 1, .imm32s = 1 }
9958 };
9959 static const i386_operand_type imm16_32_32s = { .bitfield =
9960 { .imm16 = 1, .imm32 = 1, .imm32s = 1 }
9961 };
9962
29b0f896
AM
9963 if (i.suffix)
9964 {
40fb9820
L
9965 i386_operand_type temp;
9966
0dfbf9d7 9967 operand_type_set (&temp, 0);
7ab9ffdd 9968 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
9969 {
9970 temp.bitfield.imm8 = overlap.bitfield.imm8;
9971 temp.bitfield.imm8s = overlap.bitfield.imm8s;
9972 }
9973 else if (i.suffix == WORD_MNEM_SUFFIX)
9974 temp.bitfield.imm16 = overlap.bitfield.imm16;
9975 else if (i.suffix == QWORD_MNEM_SUFFIX)
9976 {
9977 temp.bitfield.imm64 = overlap.bitfield.imm64;
9978 temp.bitfield.imm32s = overlap.bitfield.imm32s;
9979 }
9980 else
9981 temp.bitfield.imm32 = overlap.bitfield.imm32;
9982 overlap = temp;
29b0f896 9983 }
0dfbf9d7
L
9984 else if (operand_type_equal (&overlap, &imm16_32_32s)
9985 || operand_type_equal (&overlap, &imm16_32)
9986 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 9987 {
f79d55e1
JB
9988 if ((flag_code == CODE_16BIT)
9989 ^ (i.prefix[DATA_PREFIX] != 0 && !(i.prefix[REX_PREFIX] & REX_W)))
65da13b5 9990 overlap = imm16;
40fb9820 9991 else
65da13b5 9992 overlap = imm32s;
29b0f896 9993 }
8bbb3ad8
JB
9994 else if (i.prefix[REX_PREFIX] & REX_W)
9995 overlap = operand_type_and (overlap, imm32s);
9996 else if (i.prefix[DATA_PREFIX])
9997 overlap = operand_type_and (overlap,
9998 flag_code != CODE_16BIT ? imm16 : imm32);
be1643ff
JB
9999 if (overlap.bitfield.imm8
10000 + overlap.bitfield.imm8s
10001 + overlap.bitfield.imm16
10002 + overlap.bitfield.imm32
10003 + overlap.bitfield.imm32s
10004 + overlap.bitfield.imm64 != 1)
29b0f896 10005 {
4eed87de
AM
10006 as_bad (_("no instruction mnemonic suffix given; "
10007 "can't determine immediate size"));
29b0f896
AM
10008 return 0;
10009 }
10010 }
40fb9820 10011 i.types[j] = overlap;
29b0f896 10012
40fb9820
L
10013 return 1;
10014}
10015
10016static int
10017finalize_imm (void)
10018{
bc0844ae 10019 unsigned int j, n;
29b0f896 10020
bc0844ae
L
10021 /* Update the first 2 immediate operands. */
10022 n = i.operands > 2 ? 2 : i.operands;
10023 if (n)
10024 {
10025 for (j = 0; j < n; j++)
10026 if (update_imm (j) == 0)
10027 return 0;
40fb9820 10028
bc0844ae
L
10029 /* The 3rd operand can't be immediate operand. */
10030 gas_assert (operand_type_check (i.types[2], imm) == 0);
10031 }
29b0f896
AM
10032
10033 return 1;
10034}
10035
0a3eba42
JB
10036static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
10037 bool do_sse2avx)
10038{
10039 if (r->reg_flags & RegRex)
10040 {
10041 if (i.rex & rex_bit)
10042 as_bad (_("same type of prefix used twice"));
10043 i.rex |= rex_bit;
10044 }
10045 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
10046 {
10047 gas_assert (i.vex.register_specifier == r);
10048 i.vex.register_specifier += 8;
10049 }
10050
10051 if (r->reg_flags & RegVRex)
10052 i.vrex |= rex_bit;
80d61d8d
CL
10053
10054 if (r->reg_flags & RegRex2)
10055 i.rex2 |= rex_bit;
10056}
10057
10058static INLINE void
10059set_rex_rex2 (const reg_entry *r, unsigned int rex_bit)
10060{
10061 if ((r->reg_flags & RegRex) != 0)
10062 i.rex |= rex_bit;
10063 if ((r->reg_flags & RegRex2) != 0)
10064 i.rex2 |= rex_bit;
0a3eba42
JB
10065}
10066
29b0f896 10067static int
e3bb37b5 10068process_operands (void)
29b0f896
AM
10069{
10070 /* Default segment register this instruction will use for memory
10071 accesses. 0 means unknown. This is only for optimizing out
10072 unnecessary segment overrides. */
5e042380 10073 const reg_entry *default_seg = NULL;
29b0f896 10074
3083f376 10075 for (unsigned int j = 0; j < i.operands; j++)
10076 if (i.types[j].bitfield.instance != InstanceNone)
10077 i.reg_operands--;
31b4cda3 10078
a5aeccd9
JB
10079 if (i.tm.opcode_modifier.sse2avx)
10080 {
10081 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
10082 need converting. */
10083 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
10084 i.prefix[REX_PREFIX] = 0;
10085 i.rex_encoding = 0;
ebe82bfd 10086 i.rex2_encoding = 0;
a5aeccd9 10087 }
c423d21a
JB
10088 /* ImmExt should be processed after SSE2AVX. */
10089 else if (i.tm.opcode_modifier.immext)
10090 process_immext ();
a5aeccd9 10091
ecb96e55
JB
10092 /* TILEZERO is unusual in that it has a single operand encoded in ModR/M.reg,
10093 not ModR/M.rm. To avoid special casing this in build_modrm_byte(), fake a
10094 new destination operand here, while converting the source one to register
10095 number 0. */
10096 if (i.tm.mnem_off == MN_tilezero)
10097 {
10098 i.op[1].regs = i.op[0].regs;
10099 i.op[0].regs -= i.op[0].regs->reg_num;
10100 i.types[1] = i.types[0];
10101 i.tm.operand_types[1] = i.tm.operand_types[0];
10102 i.flags[1] = i.flags[0];
10103 i.operands++;
10104 i.reg_operands++;
10105 i.tm.operands++;
10106 }
10107
2426c15f 10108 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 10109 {
05909f23
JB
10110 static const i386_operand_type regxmm = {
10111 .bitfield = { .class = RegSIMD, .xmmword = 1 }
10112 };
91d6fa6a
NC
10113 unsigned int dupl = i.operands;
10114 unsigned int dest = dupl - 1;
9fcfb3d7
L
10115 unsigned int j;
10116
c0f3af97 10117 /* The destination must be an xmm register. */
9c2799c2 10118 gas_assert (i.reg_operands
91d6fa6a 10119 && MAX_OPERANDS > dupl
7ab9ffdd 10120 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 10121
75e5731b 10122 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 10123 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 10124 {
95dfdd85
JB
10125 /* Keep xmm0 for instructions with VEX prefix and 3
10126 sources. */
10127 i.tm.operand_types[0].bitfield.instance = InstanceNone;
10128 i.tm.operand_types[0].bitfield.class = RegSIMD;
31b4cda3 10129 i.reg_operands++;
95dfdd85 10130 goto duplicate;
c0f3af97 10131 }
95dfdd85
JB
10132
10133 if (i.tm.opcode_modifier.operandconstraint == IMPLICIT_1ST_XMM0)
7ab9ffdd 10134 {
aa180741 10135 gas_assert ((MAX_OPERANDS - 1) > dupl);
c0f3af97
L
10136
10137 /* Add the implicit xmm0 for instructions with VEX prefix
10138 and 3 sources. */
10139 for (j = i.operands; j > 0; j--)
10140 {
10141 i.op[j] = i.op[j - 1];
10142 i.types[j] = i.types[j - 1];
10143 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 10144 i.flags[j] = i.flags[j - 1];
c0f3af97
L
10145 }
10146 i.op[0].regs
629310ab 10147 = (const reg_entry *) str_hash_find (reg_hash, "xmm0");
7ab9ffdd 10148 i.types[0] = regxmm;
c0f3af97
L
10149 i.tm.operand_types[0] = regxmm;
10150
10151 i.operands += 2;
10152 i.reg_operands += 2;
10153 i.tm.operands += 2;
10154
91d6fa6a 10155 dupl++;
c0f3af97 10156 dest++;
91d6fa6a
NC
10157 i.op[dupl] = i.op[dest];
10158 i.types[dupl] = i.types[dest];
10159 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 10160 i.flags[dupl] = i.flags[dest];
e2ec9d29 10161 }
c0f3af97
L
10162 else
10163 {
dc1e8a47 10164 duplicate:
c0f3af97
L
10165 i.operands++;
10166 i.reg_operands++;
10167 i.tm.operands++;
10168
91d6fa6a
NC
10169 i.op[dupl] = i.op[dest];
10170 i.types[dupl] = i.types[dest];
10171 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 10172 i.flags[dupl] = i.flags[dest];
c0f3af97
L
10173 }
10174
10175 if (i.tm.opcode_modifier.immext)
10176 process_immext ();
10177 }
75e5731b 10178 else if (i.tm.operand_types[0].bitfield.instance == Accum
bd782808 10179 && i.tm.opcode_modifier.modrm)
c0f3af97
L
10180 {
10181 unsigned int j;
10182
9fcfb3d7
L
10183 for (j = 1; j < i.operands; j++)
10184 {
10185 i.op[j - 1] = i.op[j];
10186 i.types[j - 1] = i.types[j];
10187
10188 /* We need to adjust fields in i.tm since they are used by
10189 build_modrm_byte. */
10190 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
10191
10192 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
10193 }
10194
31b4cda3
JB
10195 /* No adjustment to i.reg_operands: This was already done at the top
10196 of the function. */
e2ec9d29 10197 i.operands--;
e2ec9d29
L
10198 i.tm.operands--;
10199 }
255571cd 10200 else if (i.tm.opcode_modifier.operandconstraint == IMPLICIT_QUAD_GROUP)
920d2ddc 10201 {
a477a8c4
JB
10202 unsigned int regnum, first_reg_in_group, last_reg_in_group;
10203
920d2ddc 10204 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 10205 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
10206 regnum = register_number (i.op[1].regs);
10207 first_reg_in_group = regnum & ~3;
10208 last_reg_in_group = first_reg_in_group + 3;
10209 if (regnum != first_reg_in_group)
10210 as_warn (_("source register `%s%s' implicitly denotes"
10211 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
10212 register_prefix, i.op[1].regs->reg_name,
10213 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
10214 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
76d3f746 10215 insn_name (&i.tm));
a477a8c4 10216 }
255571cd 10217 else if (i.tm.opcode_modifier.operandconstraint == REG_KLUDGE)
e2ec9d29
L
10218 {
10219 /* The imul $imm, %reg instruction is converted into
10220 imul $imm, %reg, %reg, and the clr %reg instruction
10221 is converted into xor %reg, %reg. */
10222
10223 unsigned int first_reg_op;
10224
10225 if (operand_type_check (i.types[0], reg))
10226 first_reg_op = 0;
10227 else
10228 first_reg_op = 1;
10229 /* Pretend we saw the extra register operand. */
9c2799c2 10230 gas_assert (i.reg_operands == 1
7ab9ffdd 10231 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
10232 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
10233 i.types[first_reg_op + 1] = i.types[first_reg_op];
10234 i.operands++;
10235 i.reg_operands++;
29b0f896
AM
10236 }
10237
85b80b0f 10238 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
10239 {
10240 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
10241 must be put into the modrm byte). Now, we make the modrm and
10242 index base bytes based on all the info we've collected. */
29b0f896
AM
10243
10244 default_seg = build_modrm_byte ();
bd782808
JB
10245
10246 if (!quiet_warnings && i.tm.opcode_modifier.operandconstraint == UGH)
10247 {
10248 /* Warn about some common errors, but press on regardless. */
10249 if (i.operands == 2)
10250 {
10251 /* Reversed arguments on faddp or fmulp. */
10252 as_warn (_("translating to `%s %s%s,%s%s'"), insn_name (&i.tm),
10253 register_prefix, i.op[!intel_syntax].regs->reg_name,
10254 register_prefix, i.op[intel_syntax].regs->reg_name);
10255 }
10256 else if (i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
10257 {
10258 /* Extraneous `l' suffix on fp insn. */
10259 as_warn (_("translating to `%s %s%s'"), insn_name (&i.tm),
10260 register_prefix, i.op[0].regs->reg_name);
10261 }
10262 }
29b0f896 10263 }
0ff3b7d0 10264 else if (i.types[0].bitfield.class == SReg && !dot_insn ())
85b80b0f
JB
10265 {
10266 if (flag_code != CODE_64BIT
10267 ? i.tm.base_opcode == POP_SEG_SHORT
10268 && i.op[0].regs->reg_num == 1
389d00a5 10269 : (i.tm.base_opcode | 1) == (POP_SEG386_SHORT & 0xff)
85b80b0f
JB
10270 && i.op[0].regs->reg_num < 4)
10271 {
10272 as_bad (_("you can't `%s %s%s'"),
76d3f746 10273 insn_name (&i.tm), register_prefix, i.op[0].regs->reg_name);
85b80b0f
JB
10274 return 0;
10275 }
389d00a5 10276 if (i.op[0].regs->reg_num > 3
ddb62495 10277 && i.tm.opcode_space == SPACE_BASE )
85b80b0f 10278 {
389d00a5 10279 i.tm.base_opcode ^= (POP_SEG_SHORT ^ POP_SEG386_SHORT) & 0xff;
ddb62495 10280 i.tm.opcode_space = SPACE_0F;
85b80b0f
JB
10281 }
10282 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
10283 }
ddb62495 10284 else if (i.tm.opcode_space == SPACE_BASE
389d00a5 10285 && (i.tm.base_opcode & ~3) == MOV_AX_DISP32)
29b0f896 10286 {
5e042380 10287 default_seg = reg_ds;
29b0f896 10288 }
40fb9820 10289 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
10290 {
10291 /* For the string instructions that allow a segment override
10292 on one of their operands, the default segment is ds. */
5e042380 10293 default_seg = reg_ds;
29b0f896 10294 }
50128d0c 10295 else if (i.short_form)
85b80b0f 10296 {
0ff3b7d0
JB
10297 /* The register operand is in the 1st or 2nd non-immediate operand. */
10298 const reg_entry *r = i.op[i.imm_operands].regs;
85b80b0f 10299
0ff3b7d0
JB
10300 if (!dot_insn ()
10301 && r->reg_type.bitfield.instance == Accum
10302 && i.op[i.imm_operands + 1].regs)
10303 r = i.op[i.imm_operands + 1].regs;
85b80b0f 10304 /* Register goes in low 3 bits of opcode. */
4943d587 10305 i.tm.base_opcode |= r->reg_num;
0a3eba42 10306 set_rex_vrex (r, REX_B, false);
0ff3b7d0
JB
10307
10308 if (dot_insn () && i.reg_operands == 2)
10309 {
10310 gas_assert (is_any_vex_encoding (&i.tm)
e346d50a 10311 || i.encoding != encoding_default);
0ff3b7d0
JB
10312 i.vex.register_specifier = i.op[i.operands - 1].regs;
10313 }
10314 }
10315 else if (i.reg_operands == 1
10316 && !i.flags[i.operands - 1]
10317 && i.tm.operand_types[i.operands - 1].bitfield.instance
10318 == InstanceNone)
10319 {
10320 gas_assert (is_any_vex_encoding (&i.tm)
e346d50a 10321 || i.encoding != encoding_default);
0ff3b7d0 10322 i.vex.register_specifier = i.op[i.operands - 1].regs;
85b80b0f 10323 }
29b0f896 10324
514a8bb0 10325 if ((i.seg[0] || i.prefix[SEG_PREFIX])
7fc69528 10326 && i.tm.mnem_off == MN_lea)
92334ad2
JB
10327 {
10328 if (!quiet_warnings)
76d3f746 10329 as_warn (_("segment override on `%s' is ineffectual"), insn_name (&i.tm));
739d7649 10330 if (optimize && !i.no_optimize)
92334ad2
JB
10331 {
10332 i.seg[0] = NULL;
10333 i.prefix[SEG_PREFIX] = 0;
10334 }
10335 }
52271982
AM
10336
10337 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
10338 is neither the default nor the one already recorded from a prefix,
10339 use an opcode prefix to select it. If we never figured out what
10340 the default segment is, then default_seg will be zero at this
10341 point, and the specified segment prefix will always be used. */
10342 if (i.seg[0]
10343 && i.seg[0] != default_seg
5e042380 10344 && i386_seg_prefixes[i.seg[0]->reg_num] != i.prefix[SEG_PREFIX])
29b0f896 10345 {
5e042380 10346 if (!add_prefix (i386_seg_prefixes[i.seg[0]->reg_num]))
29b0f896
AM
10347 return 0;
10348 }
10349 return 1;
10350}
10351
5e042380 10352static const reg_entry *
e3bb37b5 10353build_modrm_byte (void)
29b0f896 10354{
5e042380 10355 const reg_entry *default_seg = NULL;
ecb96e55
JB
10356 unsigned int source = i.imm_operands - i.tm.opcode_modifier.immext
10357 /* Compensate for kludge in md_assemble(). */
10358 + i.tm.operand_types[0].bitfield.imm1;
10359 unsigned int dest = i.operands - 1 - i.tm.opcode_modifier.immext;
10360 unsigned int v, op, reg_slot = ~0;
10361
10362 /* Accumulator (in particular %st), shift count (%cl), and alike need
10363 to be skipped just like immediate operands do. */
10364 if (i.tm.operand_types[source].bitfield.instance)
10365 ++source;
10366 while (i.tm.operand_types[dest].bitfield.instance)
10367 --dest;
10368
10369 for (op = source; op < i.operands; ++op)
10370 if (i.tm.operand_types[op].bitfield.baseindex)
10371 break;
c0f3af97 10372
ecb96e55 10373 if (i.reg_operands + i.mem_operands + (i.tm.extension_opcode != None) == 4)
c0f3af97 10374 {
4c2c6516 10375 expressionS *exp;
c0f3af97 10376
a683cc34 10377 /* There are 2 kinds of instructions:
bed3d976 10378 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 10379 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 10380 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 10381 ZMM register.
bed3d976 10382 2. 4 operands: 4 register operands or 3 register operands
0ff3b7d0
JB
10383 plus 1 memory operand, with VexXDS.
10384 3. Other equivalent combinations when coming from s_insn(). */
eea96d3f 10385 gas_assert (i.tm.opcode_modifier.vexvvvv
0ff3b7d0
JB
10386 && i.tm.opcode_modifier.vexw);
10387 gas_assert (dot_insn ()
10388 || i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 10389
ecb96e55
JB
10390 /* Of the first two non-immediate operands the one with the template
10391 not allowing for a memory one is encoded in the immediate operand. */
10392 if (source == op)
10393 reg_slot = source + 1;
48db9223 10394 else
ecb96e55 10395 reg_slot = source++;
48db9223 10396
0ff3b7d0
JB
10397 if (!dot_insn ())
10398 {
10399 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
10400 gas_assert (!(i.op[reg_slot].regs->reg_flags & RegVRex));
10401 }
10402 else
10403 gas_assert (i.tm.operand_types[reg_slot].bitfield.class != ClassNone);
10404
a683cc34 10405 if (i.imm_operands == 0)
bed3d976
JB
10406 {
10407 /* When there is no immediate operand, generate an 8bit
10408 immediate operand to encode the first operand. */
10409 exp = &im_expressions[i.imm_operands++];
10410 i.op[i.operands].imms = exp;
be1643ff 10411 i.types[i.operands].bitfield.imm8 = 1;
bed3d976
JB
10412 i.operands++;
10413
bed3d976 10414 exp->X_op = O_constant;
43234a1e 10415 }
922d8de8 10416 else
bed3d976 10417 {
9d3bf266
JB
10418 gas_assert (i.imm_operands == 1);
10419 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
10420 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 10421
9d3bf266
JB
10422 /* Turn on Imm8 again so that output_imm will generate it. */
10423 i.types[0].bitfield.imm8 = 1;
bed3d976 10424
0ff3b7d0 10425 exp = i.op[0].imms;
bed3d976 10426 }
0ff3b7d0 10427 exp->X_add_number |= register_number (i.op[reg_slot].regs)
706ce984 10428 << (3 + !(i.tm.opcode_modifier.evex
e346d50a 10429 || i.encoding == encoding_evex));
c0f3af97 10430 }
f12dc422 10431
3083f376 10432 if (i.tm.opcode_modifier.vexvvvv == VexVVVV_DST)
10433 {
10434 v = dest;
10435 dest-- ;
10436 }
10437 else
10438 {
10439 for (v = source + 1; v < dest; ++v)
10440 if (v != reg_slot)
10441 break;
10442 if (v >= dest)
10443 v = ~0;
10444 }
ecb96e55
JB
10445 if (i.tm.extension_opcode != None)
10446 {
10447 if (dest != source)
10448 v = dest;
10449 dest = ~0;
10450 }
10451 gas_assert (source < dest);
10452 if (i.tm.opcode_modifier.operandconstraint == SWAP_SOURCES
10453 && source != op)
10454 {
10455 unsigned int tmp = source;
f12dc422 10456
ecb96e55
JB
10457 source = v;
10458 v = tmp;
10459 }
29b0f896 10460
ecb96e55
JB
10461 if (v < MAX_OPERANDS)
10462 {
10463 gas_assert (i.tm.opcode_modifier.vexvvvv);
10464 i.vex.register_specifier = i.op[v].regs;
29b0f896 10465 }
c0f3af97 10466
ecb96e55
JB
10467 if (op < i.operands)
10468 {
29b0f896
AM
10469 if (i.mem_operands)
10470 {
10471 unsigned int fake_zero_displacement = 0;
4eed87de 10472
ecb96e55 10473 gas_assert (i.flags[op] & Operand_Mem);
29b0f896 10474
63112cd6 10475 if (i.tm.opcode_modifier.sib)
6c30d220 10476 {
260cd341
LC
10477 /* The index register of VSIB shouldn't be RegIZ. */
10478 if (i.tm.opcode_modifier.sib != SIBMEM
10479 && i.index_reg->reg_num == RegIZ)
6c30d220
L
10480 abort ();
10481
10482 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
10483 if (!i.base_reg)
10484 {
10485 i.sib.base = NO_BASE_REGISTER;
10486 i.sib.scale = i.log2_scale_factor;
2f2be86b 10487 i.types[op] = operand_type_and_not (i.types[op], anydisp);
a775efc8 10488 i.types[op].bitfield.disp32 = 1;
6c30d220 10489 }
260cd341
LC
10490
10491 /* Since the mandatory SIB always has index register, so
10492 the code logic remains unchanged. The non-mandatory SIB
10493 without index register is allowed and will be handled
10494 later. */
10495 if (i.index_reg)
10496 {
10497 if (i.index_reg->reg_num == RegIZ)
10498 i.sib.index = NO_INDEX_REGISTER;
10499 else
10500 i.sib.index = i.index_reg->reg_num;
5b7c81bd 10501 set_rex_vrex (i.index_reg, REX_X, false);
260cd341 10502 }
6c30d220
L
10503 }
10504
5e042380 10505 default_seg = reg_ds;
29b0f896
AM
10506
10507 if (i.base_reg == 0)
10508 {
10509 i.rm.mode = 0;
10510 if (!i.disp_operands)
9bb129e8 10511 fake_zero_displacement = 1;
29b0f896
AM
10512 if (i.index_reg == 0)
10513 {
260cd341
LC
10514 /* Both check for VSIB and mandatory non-vector SIB. */
10515 gas_assert (!i.tm.opcode_modifier.sib
10516 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 10517 /* Operand is just <disp> */
2f2be86b 10518 i.types[op] = operand_type_and_not (i.types[op], anydisp);
20f0a1fc 10519 if (flag_code == CODE_64BIT)
29b0f896
AM
10520 {
10521 /* 64bit mode overwrites the 32bit absolute
10522 addressing by RIP relative addressing and
10523 absolute addressing is encoded by one of the
10524 redundant SIB forms. */
10525 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
10526 i.sib.base = NO_BASE_REGISTER;
10527 i.sib.index = NO_INDEX_REGISTER;
a775efc8 10528 i.types[op].bitfield.disp32 = 1;
20f0a1fc 10529 }
fc225355
L
10530 else if ((flag_code == CODE_16BIT)
10531 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
10532 {
10533 i.rm.regmem = NO_BASE_REGISTER_16;
2f2be86b 10534 i.types[op].bitfield.disp16 = 1;
20f0a1fc
NC
10535 }
10536 else
10537 {
10538 i.rm.regmem = NO_BASE_REGISTER;
2f2be86b 10539 i.types[op].bitfield.disp32 = 1;
29b0f896
AM
10540 }
10541 }
63112cd6 10542 else if (!i.tm.opcode_modifier.sib)
29b0f896 10543 {
6c30d220 10544 /* !i.base_reg && i.index_reg */
e968fc9b 10545 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
10546 i.sib.index = NO_INDEX_REGISTER;
10547 else
10548 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
10549 i.sib.base = NO_BASE_REGISTER;
10550 i.sib.scale = i.log2_scale_factor;
10551 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
2f2be86b 10552 i.types[op] = operand_type_and_not (i.types[op], anydisp);
a775efc8 10553 i.types[op].bitfield.disp32 = 1;
80d61d8d 10554 set_rex_rex2 (i.index_reg, REX_X);
29b0f896
AM
10555 }
10556 }
10557 /* RIP addressing for 64bit mode. */
e968fc9b 10558 else if (i.base_reg->reg_num == RegIP)
29b0f896 10559 {
63112cd6 10560 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 10561 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
10562 i.types[op].bitfield.disp8 = 0;
10563 i.types[op].bitfield.disp16 = 0;
a775efc8 10564 i.types[op].bitfield.disp32 = 1;
40fb9820 10565 i.types[op].bitfield.disp64 = 0;
71903a11 10566 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
10567 if (! i.disp_operands)
10568 fake_zero_displacement = 1;
29b0f896 10569 }
dc821c5f 10570 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 10571 {
63112cd6 10572 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
10573 switch (i.base_reg->reg_num)
10574 {
10575 case 3: /* (%bx) */
10576 if (i.index_reg == 0)
10577 i.rm.regmem = 7;
10578 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
10579 i.rm.regmem = i.index_reg->reg_num - 6;
10580 break;
10581 case 5: /* (%bp) */
5e042380 10582 default_seg = reg_ss;
29b0f896
AM
10583 if (i.index_reg == 0)
10584 {
10585 i.rm.regmem = 6;
40fb9820 10586 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
10587 {
10588 /* fake (%bp) into 0(%bp) */
41eb8e88 10589 if (i.disp_encoding == disp_encoding_16bit)
1a02d6b0
L
10590 i.types[op].bitfield.disp16 = 1;
10591 else
10592 i.types[op].bitfield.disp8 = 1;
252b5132 10593 fake_zero_displacement = 1;
29b0f896
AM
10594 }
10595 }
10596 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
10597 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
10598 break;
10599 default: /* (%si) -> 4 or (%di) -> 5 */
10600 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
10601 }
41eb8e88
L
10602 if (!fake_zero_displacement
10603 && !i.disp_operands
10604 && i.disp_encoding)
10605 {
10606 fake_zero_displacement = 1;
10607 if (i.disp_encoding == disp_encoding_8bit)
10608 i.types[op].bitfield.disp8 = 1;
10609 else
10610 i.types[op].bitfield.disp16 = 1;
10611 }
29b0f896
AM
10612 i.rm.mode = mode_from_disp_size (i.types[op]);
10613 }
10614 else /* i.base_reg and 32/64 bit mode */
10615 {
a9aabc23 10616 if (operand_type_check (i.types[op], disp))
40fb9820 10617 {
73053c1f
JB
10618 i.types[op].bitfield.disp16 = 0;
10619 i.types[op].bitfield.disp64 = 0;
a775efc8 10620 i.types[op].bitfield.disp32 = 1;
40fb9820 10621 }
20f0a1fc 10622
63112cd6 10623 if (!i.tm.opcode_modifier.sib)
6c30d220 10624 i.rm.regmem = i.base_reg->reg_num;
80d61d8d 10625 set_rex_rex2 (i.base_reg, REX_B);
29b0f896
AM
10626 i.sib.base = i.base_reg->reg_num;
10627 /* x86-64 ignores REX prefix bit here to avoid decoder
10628 complications. */
848930b2
JB
10629 if (!(i.base_reg->reg_flags & RegRex)
10630 && (i.base_reg->reg_num == EBP_REG_NUM
10631 || i.base_reg->reg_num == ESP_REG_NUM))
5e042380 10632 default_seg = reg_ss;
848930b2 10633 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 10634 {
848930b2 10635 fake_zero_displacement = 1;
1a02d6b0
L
10636 if (i.disp_encoding == disp_encoding_32bit)
10637 i.types[op].bitfield.disp32 = 1;
10638 else
10639 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
10640 }
10641 i.sib.scale = i.log2_scale_factor;
10642 if (i.index_reg == 0)
10643 {
260cd341
LC
10644 /* Only check for VSIB. */
10645 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
10646 && i.tm.opcode_modifier.sib != VECSIB256
10647 && i.tm.opcode_modifier.sib != VECSIB512);
10648
29b0f896
AM
10649 /* <disp>(%esp) becomes two byte modrm with no index
10650 register. We've already stored the code for esp
10651 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
10652 Any base register besides %esp will not use the
10653 extra modrm byte. */
10654 i.sib.index = NO_INDEX_REGISTER;
29b0f896 10655 }
63112cd6 10656 else if (!i.tm.opcode_modifier.sib)
29b0f896 10657 {
e968fc9b 10658 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
10659 i.sib.index = NO_INDEX_REGISTER;
10660 else
10661 i.sib.index = i.index_reg->reg_num;
29b0f896 10662 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
80d61d8d 10663 set_rex_rex2 (i.index_reg, REX_X);
29b0f896 10664 }
67a4f2b7
AO
10665
10666 if (i.disp_operands
10667 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
10668 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
10669 i.rm.mode = 0;
10670 else
a501d77e
L
10671 {
10672 if (!fake_zero_displacement
10673 && !i.disp_operands
10674 && i.disp_encoding)
10675 {
10676 fake_zero_displacement = 1;
10677 if (i.disp_encoding == disp_encoding_8bit)
10678 i.types[op].bitfield.disp8 = 1;
10679 else
10680 i.types[op].bitfield.disp32 = 1;
10681 }
10682 i.rm.mode = mode_from_disp_size (i.types[op]);
10683 }
29b0f896 10684 }
252b5132 10685
29b0f896
AM
10686 if (fake_zero_displacement)
10687 {
10688 /* Fakes a zero displacement assuming that i.types[op]
10689 holds the correct displacement size. */
10690 expressionS *exp;
10691
9c2799c2 10692 gas_assert (i.op[op].disps == 0);
29b0f896
AM
10693 exp = &disp_expressions[i.disp_operands++];
10694 i.op[op].disps = exp;
10695 exp->X_op = O_constant;
10696 exp->X_add_number = 0;
10697 exp->X_add_symbol = (symbolS *) 0;
10698 exp->X_op_symbol = (symbolS *) 0;
10699 }
10700 }
ecb96e55
JB
10701 else
10702 {
10703 i.rm.mode = 3;
10704 i.rm.regmem = i.op[op].regs->reg_num;
10705 set_rex_vrex (i.op[op].regs, REX_B, false);
10706 }
252b5132 10707
ecb96e55
JB
10708 if (op == dest)
10709 dest = ~0;
10710 if (op == source)
10711 source = ~0;
10712 }
10713 else
10714 {
10715 i.rm.mode = 3;
10716 if (!i.tm.opcode_modifier.regmem)
f88c9eb0 10717 {
ecb96e55
JB
10718 gas_assert (source < MAX_OPERANDS);
10719 i.rm.regmem = i.op[source].regs->reg_num;
10720 set_rex_vrex (i.op[source].regs, REX_B,
10721 dest >= MAX_OPERANDS && i.tm.opcode_modifier.sse2avx);
10722 source = ~0;
f88c9eb0 10723 }
ecb96e55 10724 else
29b0f896 10725 {
ecb96e55
JB
10726 gas_assert (dest < MAX_OPERANDS);
10727 i.rm.regmem = i.op[dest].regs->reg_num;
10728 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
10729 dest = ~0;
29b0f896 10730 }
ecb96e55 10731 }
252b5132 10732
ecb96e55
JB
10733 /* Fill in i.rm.reg field with extension opcode (if any) or the
10734 appropriate register. */
10735 if (i.tm.extension_opcode != None)
10736 i.rm.reg = i.tm.extension_opcode;
10737 else if (!i.tm.opcode_modifier.regmem && dest < MAX_OPERANDS)
10738 {
10739 i.rm.reg = i.op[dest].regs->reg_num;
10740 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
10741 }
10742 else
10743 {
10744 gas_assert (source < MAX_OPERANDS);
10745 i.rm.reg = i.op[source].regs->reg_num;
10746 set_rex_vrex (i.op[source].regs, REX_R, false);
29b0f896 10747 }
ecb96e55
JB
10748
10749 if (flag_code != CODE_64BIT && (i.rex & REX_R))
10750 {
10751 gas_assert (i.types[!i.tm.opcode_modifier.regmem].bitfield.class == RegCR);
10752 i.rex &= ~REX_R;
10753 add_prefix (LOCK_PREFIX_OPCODE);
10754 }
10755
29b0f896
AM
10756 return default_seg;
10757}
252b5132 10758
48ef937e
JB
10759static INLINE void
10760frag_opcode_byte (unsigned char byte)
10761{
10762 if (now_seg != absolute_section)
10763 FRAG_APPEND_1_CHAR (byte);
10764 else
10765 ++abs_section_offset;
10766}
10767
376cd056
JB
10768static unsigned int
10769flip_code16 (unsigned int code16)
10770{
10771 gas_assert (i.tm.operands == 1);
10772
10773 return !(i.prefix[REX_PREFIX] & REX_W)
10774 && (code16 ? i.tm.operand_types[0].bitfield.disp32
376cd056
JB
10775 : i.tm.operand_types[0].bitfield.disp16)
10776 ? CODE16 : 0;
10777}
10778
29b0f896 10779static void
e3bb37b5 10780output_branch (void)
29b0f896
AM
10781{
10782 char *p;
f8a5c266 10783 int size;
29b0f896
AM
10784 int code16;
10785 int prefix;
10786 relax_substateT subtype;
10787 symbolS *sym;
10788 offsetT off;
10789
48ef937e
JB
10790 if (now_seg == absolute_section)
10791 {
10792 as_bad (_("relaxable branches not supported in absolute section"));
10793 return;
10794 }
10795
f8a5c266 10796 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
1a42a9fe 10797 size = i.disp_encoding > disp_encoding_8bit ? BIG : SMALL;
29b0f896
AM
10798
10799 prefix = 0;
10800 if (i.prefix[DATA_PREFIX] != 0)
252b5132 10801 {
29b0f896
AM
10802 prefix = 1;
10803 i.prefixes -= 1;
376cd056 10804 code16 ^= flip_code16(code16);
252b5132 10805 }
29b0f896
AM
10806 /* Pentium4 branch hints. */
10807 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
10808 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 10809 {
29b0f896
AM
10810 prefix++;
10811 i.prefixes--;
10812 }
10813 if (i.prefix[REX_PREFIX] != 0)
10814 {
10815 prefix++;
10816 i.prefixes--;
2f66722d
AM
10817 }
10818
7e8b059b
L
10819 /* BND prefixed jump. */
10820 if (i.prefix[BND_PREFIX] != 0)
10821 {
6cb0a70e
JB
10822 prefix++;
10823 i.prefixes--;
7e8b059b
L
10824 }
10825
f2810fe0 10826 if (i.prefixes != 0)
76d3f746 10827 as_warn (_("skipping prefixes on `%s'"), insn_name (&i.tm));
29b0f896
AM
10828
10829 /* It's always a symbol; End frag & setup for relax.
10830 Make sure there is enough room in this frag for the largest
10831 instruction we may generate in md_convert_frag. This is 2
10832 bytes for the opcode and room for the prefix and largest
10833 displacement. */
10834 frag_grow (prefix + 2 + 4);
10835 /* Prefix and 1 opcode byte go in fr_fix. */
10836 p = frag_more (prefix + 1);
10837 if (i.prefix[DATA_PREFIX] != 0)
10838 *p++ = DATA_PREFIX_OPCODE;
10839 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
10840 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
10841 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
10842 if (i.prefix[BND_PREFIX] != 0)
10843 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
10844 if (i.prefix[REX_PREFIX] != 0)
10845 *p++ = i.prefix[REX_PREFIX];
10846 *p = i.tm.base_opcode;
10847
10848 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 10849 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 10850 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 10851 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 10852 else
f8a5c266 10853 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 10854 subtype |= code16;
3e73aa7c 10855
29b0f896
AM
10856 sym = i.op[0].disps->X_add_symbol;
10857 off = i.op[0].disps->X_add_number;
3e73aa7c 10858
29b0f896
AM
10859 if (i.op[0].disps->X_op != O_constant
10860 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 10861 {
29b0f896
AM
10862 /* Handle complex expressions. */
10863 sym = make_expr_symbol (i.op[0].disps);
10864 off = 0;
10865 }
3e73aa7c 10866
29b0f896
AM
10867 /* 1 possible extra opcode + 4 byte displacement go in var part.
10868 Pass reloc in fr_var. */
d258b828 10869 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 10870}
3e73aa7c 10871
bd7ab16b
L
10872#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10873/* Return TRUE iff PLT32 relocation should be used for branching to
10874 symbol S. */
10875
5b7c81bd 10876static bool
bd7ab16b
L
10877need_plt32_p (symbolS *s)
10878{
10879 /* PLT32 relocation is ELF only. */
10880 if (!IS_ELF)
5b7c81bd 10881 return false;
bd7ab16b 10882
a5def729
RO
10883#ifdef TE_SOLARIS
10884 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
10885 krtld support it. */
5b7c81bd 10886 return false;
a5def729
RO
10887#endif
10888
bd7ab16b
L
10889 /* Since there is no need to prepare for PLT branch on x86-64, we
10890 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
10891 be used as a marker for 32-bit PC-relative branches. */
10892 if (!object_64bit)
5b7c81bd 10893 return false;
bd7ab16b 10894
44365e88 10895 if (s == NULL)
5b7c81bd 10896 return false;
44365e88 10897
bd7ab16b
L
10898 /* Weak or undefined symbol need PLT32 relocation. */
10899 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
5b7c81bd 10900 return true;
bd7ab16b
L
10901
10902 /* Non-global symbol doesn't need PLT32 relocation. */
10903 if (! S_IS_EXTERNAL (s))
5b7c81bd 10904 return false;
bd7ab16b
L
10905
10906 /* Other global symbols need PLT32 relocation. NB: Symbol with
10907 non-default visibilities are treated as normal global symbol
10908 so that PLT32 relocation can be used as a marker for 32-bit
10909 PC-relative branches. It is useful for linker relaxation. */
5b7c81bd 10910 return true;
bd7ab16b
L
10911}
10912#endif
10913
29b0f896 10914static void
e3bb37b5 10915output_jump (void)
29b0f896
AM
10916{
10917 char *p;
10918 int size;
3e02c1cc 10919 fixS *fixP;
bd7ab16b 10920 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 10921
0cfa3eb3 10922 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
10923 {
10924 /* This is a loop or jecxz type instruction. */
10925 size = 1;
10926 if (i.prefix[ADDR_PREFIX] != 0)
10927 {
48ef937e 10928 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
10929 i.prefixes -= 1;
10930 }
10931 /* Pentium4 branch hints. */
10932 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
10933 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
10934 {
48ef937e 10935 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 10936 i.prefixes--;
3e73aa7c
JH
10937 }
10938 }
29b0f896
AM
10939 else
10940 {
10941 int code16;
3e73aa7c 10942
29b0f896
AM
10943 code16 = 0;
10944 if (flag_code == CODE_16BIT)
10945 code16 = CODE16;
3e73aa7c 10946
29b0f896
AM
10947 if (i.prefix[DATA_PREFIX] != 0)
10948 {
48ef937e 10949 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 10950 i.prefixes -= 1;
376cd056 10951 code16 ^= flip_code16(code16);
29b0f896 10952 }
252b5132 10953
29b0f896
AM
10954 size = 4;
10955 if (code16)
10956 size = 2;
10957 }
9fcc94b6 10958
6cb0a70e
JB
10959 /* BND prefixed jump. */
10960 if (i.prefix[BND_PREFIX] != 0)
29b0f896 10961 {
48ef937e 10962 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
10963 i.prefixes -= 1;
10964 }
252b5132 10965
6cb0a70e 10966 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 10967 {
48ef937e 10968 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
10969 i.prefixes -= 1;
10970 }
10971
f2810fe0 10972 if (i.prefixes != 0)
76d3f746 10973 as_warn (_("skipping prefixes on `%s'"), insn_name (&i.tm));
e0890092 10974
48ef937e
JB
10975 if (now_seg == absolute_section)
10976 {
9a182d04 10977 abs_section_offset += i.opcode_length + size;
48ef937e
JB
10978 return;
10979 }
10980
9a182d04
JB
10981 p = frag_more (i.opcode_length + size);
10982 switch (i.opcode_length)
42164a71
L
10983 {
10984 case 2:
10985 *p++ = i.tm.base_opcode >> 8;
1a0670f3 10986 /* Fall through. */
42164a71
L
10987 case 1:
10988 *p++ = i.tm.base_opcode;
10989 break;
10990 default:
10991 abort ();
10992 }
e0890092 10993
bd7ab16b 10994#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1ef3994a
JB
10995 if (flag_code == CODE_64BIT && size == 4
10996 && jump_reloc == NO_RELOC && i.op[0].disps->X_add_number == 0
bd7ab16b
L
10997 && need_plt32_p (i.op[0].disps->X_add_symbol))
10998 jump_reloc = BFD_RELOC_X86_64_PLT32;
10999#endif
11000
11001 jump_reloc = reloc (size, 1, 1, jump_reloc);
11002
3e02c1cc 11003 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 11004 i.op[0].disps, 1, jump_reloc);
3e02c1cc 11005
eb19308f
JB
11006 /* All jumps handled here are signed, but don't unconditionally use a
11007 signed limit check for 32 and 16 bit jumps as we want to allow wrap
11008 around at 4G (outside of 64-bit mode) and 64k (except for XBEGIN)
11009 respectively. */
11010 switch (size)
11011 {
11012 case 1:
11013 fixP->fx_signed = 1;
11014 break;
11015
11016 case 2:
7fc69528 11017 if (i.tm.mnem_off == MN_xbegin)
eb19308f
JB
11018 fixP->fx_signed = 1;
11019 break;
11020
11021 case 4:
11022 if (flag_code == CODE_64BIT)
11023 fixP->fx_signed = 1;
11024 break;
11025 }
29b0f896 11026}
e0890092 11027
29b0f896 11028static void
e3bb37b5 11029output_interseg_jump (void)
29b0f896
AM
11030{
11031 char *p;
11032 int size;
11033 int prefix;
11034 int code16;
252b5132 11035
29b0f896
AM
11036 code16 = 0;
11037 if (flag_code == CODE_16BIT)
11038 code16 = CODE16;
a217f122 11039
29b0f896
AM
11040 prefix = 0;
11041 if (i.prefix[DATA_PREFIX] != 0)
11042 {
11043 prefix = 1;
11044 i.prefixes -= 1;
11045 code16 ^= CODE16;
11046 }
6cb0a70e
JB
11047
11048 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 11049
29b0f896
AM
11050 size = 4;
11051 if (code16)
11052 size = 2;
252b5132 11053
f2810fe0 11054 if (i.prefixes != 0)
76d3f746 11055 as_warn (_("skipping prefixes on `%s'"), insn_name (&i.tm));
252b5132 11056
48ef937e
JB
11057 if (now_seg == absolute_section)
11058 {
11059 abs_section_offset += prefix + 1 + 2 + size;
11060 return;
11061 }
11062
29b0f896
AM
11063 /* 1 opcode; 2 segment; offset */
11064 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 11065
29b0f896
AM
11066 if (i.prefix[DATA_PREFIX] != 0)
11067 *p++ = DATA_PREFIX_OPCODE;
252b5132 11068
29b0f896
AM
11069 if (i.prefix[REX_PREFIX] != 0)
11070 *p++ = i.prefix[REX_PREFIX];
252b5132 11071
29b0f896
AM
11072 *p++ = i.tm.base_opcode;
11073 if (i.op[1].imms->X_op == O_constant)
11074 {
11075 offsetT n = i.op[1].imms->X_add_number;
252b5132 11076
29b0f896
AM
11077 if (size == 2
11078 && !fits_in_unsigned_word (n)
11079 && !fits_in_signed_word (n))
11080 {
11081 as_bad (_("16-bit jump out of range"));
11082 return;
11083 }
11084 md_number_to_chars (p, n, size);
11085 }
11086 else
11087 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 11088 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
6d96a594
C
11089
11090 p += size;
11091 if (i.op[0].imms->X_op == O_constant)
11092 md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2);
11093 else
11094 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
11095 i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0]));
29b0f896 11096}
a217f122 11097
b4a3a7b4
L
11098#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11099void
11100x86_cleanup (void)
11101{
11102 char *p;
11103 asection *seg = now_seg;
11104 subsegT subseg = now_subseg;
11105 asection *sec;
11106 unsigned int alignment, align_size_1;
11107 unsigned int isa_1_descsz, feature_2_descsz, descsz;
11108 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
11109 unsigned int padding;
11110
1273b2f8 11111 if (!IS_ELF || !x86_used_note)
b4a3a7b4
L
11112 return;
11113
b4a3a7b4
L
11114 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
11115
11116 /* The .note.gnu.property section layout:
11117
11118 Field Length Contents
11119 ---- ---- ----
11120 n_namsz 4 4
11121 n_descsz 4 The note descriptor size
11122 n_type 4 NT_GNU_PROPERTY_TYPE_0
11123 n_name 4 "GNU"
11124 n_desc n_descsz The program property array
11125 .... .... ....
11126 */
11127
11128 /* Create the .note.gnu.property section. */
11129 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 11130 bfd_set_section_flags (sec,
b4a3a7b4
L
11131 (SEC_ALLOC
11132 | SEC_LOAD
11133 | SEC_DATA
11134 | SEC_HAS_CONTENTS
11135 | SEC_READONLY));
11136
11137 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
11138 {
11139 align_size_1 = 7;
11140 alignment = 3;
11141 }
11142 else
11143 {
11144 align_size_1 = 3;
11145 alignment = 2;
11146 }
11147
fd361982 11148 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
11149 elf_section_type (sec) = SHT_NOTE;
11150
1273b2f8
L
11151 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
11152 + 4-byte data */
11153 isa_1_descsz_raw = 4 + 4 + 4;
11154 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
11155 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
b4a3a7b4
L
11156
11157 feature_2_descsz_raw = isa_1_descsz;
11158 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
1273b2f8 11159 + 4-byte data */
b4a3a7b4
L
11160 feature_2_descsz_raw += 4 + 4 + 4;
11161 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
11162 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
11163 & ~align_size_1);
11164
11165 descsz = feature_2_descsz;
11166 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
11167 p = frag_more (4 + 4 + 4 + 4 + descsz);
11168
11169 /* Write n_namsz. */
11170 md_number_to_chars (p, (valueT) 4, 4);
11171
11172 /* Write n_descsz. */
11173 md_number_to_chars (p + 4, (valueT) descsz, 4);
11174
11175 /* Write n_type. */
11176 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
11177
11178 /* Write n_name. */
11179 memcpy (p + 4 * 3, "GNU", 4);
11180
1273b2f8
L
11181 /* Write 4-byte type. */
11182 md_number_to_chars (p + 4 * 4,
11183 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
b4a3a7b4 11184
1273b2f8
L
11185 /* Write 4-byte data size. */
11186 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
b4a3a7b4 11187
1273b2f8
L
11188 /* Write 4-byte data. */
11189 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
b4a3a7b4 11190
1273b2f8
L
11191 /* Zero out paddings. */
11192 padding = isa_1_descsz - isa_1_descsz_raw;
11193 if (padding)
11194 memset (p + 4 * 7, 0, padding);
b4a3a7b4
L
11195
11196 /* Write 4-byte type. */
11197 md_number_to_chars (p + isa_1_descsz + 4 * 4,
11198 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
11199
11200 /* Write 4-byte data size. */
11201 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
11202
11203 /* Write 4-byte data. */
11204 md_number_to_chars (p + isa_1_descsz + 4 * 6,
11205 (valueT) x86_feature_2_used, 4);
11206
11207 /* Zero out paddings. */
11208 padding = feature_2_descsz - feature_2_descsz_raw;
11209 if (padding)
11210 memset (p + isa_1_descsz + 4 * 7, 0, padding);
11211
11212 /* We probably can't restore the current segment, for there likely
11213 isn't one yet... */
11214 if (seg && subseg)
11215 subseg_set (seg, subseg);
11216}
b52c4ee4
IB
11217
11218bool
11219x86_support_sframe_p (void)
11220{
3e3e792a 11221 /* At this time, SFrame stack trace is supported for AMD64 ABI only. */
b52c4ee4
IB
11222 return (x86_elf_abi == X86_64_ABI);
11223}
11224
11225bool
11226x86_sframe_ra_tracking_p (void)
11227{
11228 /* In AMD64, return address is always stored on the stack at a fixed offset
11229 from the CFA (provided via x86_sframe_cfa_ra_offset ()).
11230 Do not track explicitly via an SFrame Frame Row Entry. */
11231 return false;
11232}
11233
11234offsetT
11235x86_sframe_cfa_ra_offset (void)
11236{
11237 gas_assert (x86_elf_abi == X86_64_ABI);
11238 return (offsetT) -8;
11239}
11240
11241unsigned char
11242x86_sframe_get_abi_arch (void)
11243{
11244 unsigned char sframe_abi_arch = 0;
11245
11246 if (x86_support_sframe_p ())
11247 {
11248 gas_assert (!target_big_endian);
11249 sframe_abi_arch = SFRAME_ABI_AMD64_ENDIAN_LITTLE;
11250 }
11251
11252 return sframe_abi_arch;
11253}
11254
b4a3a7b4
L
11255#endif
11256
9c33702b
JB
11257static unsigned int
11258encoding_length (const fragS *start_frag, offsetT start_off,
11259 const char *frag_now_ptr)
11260{
11261 unsigned int len = 0;
11262
11263 if (start_frag != frag_now)
11264 {
11265 const fragS *fr = start_frag;
11266
11267 do {
11268 len += fr->fr_fix;
11269 fr = fr->fr_next;
11270 } while (fr && fr != frag_now);
11271 }
11272
11273 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
11274}
11275
e379e5f3 11276/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
11277 be macro-fused with conditional jumps.
11278 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
11279 or is one of the following format:
11280
11281 cmp m, imm
11282 add m, imm
11283 sub m, imm
11284 test m, imm
11285 and m, imm
11286 inc m
11287 dec m
11288
11289 it is unfusible. */
e379e5f3
L
11290
11291static int
79d72f45 11292maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
11293{
11294 /* No RIP address. */
11295 if (i.base_reg && i.base_reg->reg_num == RegIP)
11296 return 0;
11297
389d00a5 11298 /* No opcodes outside of base encoding space. */
ddb62495 11299 if (i.tm.opcode_space != SPACE_BASE)
e379e5f3
L
11300 return 0;
11301
79d72f45
HL
11302 /* add, sub without add/sub m, imm. */
11303 if (i.tm.base_opcode <= 5
e379e5f3
L
11304 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
11305 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 11306 && (i.tm.extension_opcode == 0x5
e379e5f3 11307 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
11308 {
11309 *mf_cmp_p = mf_cmp_alu_cmp;
11310 return !(i.mem_operands && i.imm_operands);
11311 }
e379e5f3 11312
79d72f45
HL
11313 /* and without and m, imm. */
11314 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
11315 || ((i.tm.base_opcode | 3) == 0x83
11316 && i.tm.extension_opcode == 0x4))
11317 {
11318 *mf_cmp_p = mf_cmp_test_and;
11319 return !(i.mem_operands && i.imm_operands);
11320 }
11321
11322 /* test without test m imm. */
e379e5f3
L
11323 if ((i.tm.base_opcode | 1) == 0x85
11324 || (i.tm.base_opcode | 1) == 0xa9
11325 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
11326 && i.tm.extension_opcode == 0))
11327 {
11328 *mf_cmp_p = mf_cmp_test_and;
11329 return !(i.mem_operands && i.imm_operands);
11330 }
11331
11332 /* cmp without cmp m, imm. */
11333 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
11334 || ((i.tm.base_opcode | 3) == 0x83
11335 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
11336 {
11337 *mf_cmp_p = mf_cmp_alu_cmp;
11338 return !(i.mem_operands && i.imm_operands);
11339 }
e379e5f3 11340
79d72f45 11341 /* inc, dec without inc/dec m. */
734dfd1c 11342 if ((is_cpu (&i.tm, CpuNo64)
e379e5f3
L
11343 && (i.tm.base_opcode | 0xf) == 0x4f)
11344 || ((i.tm.base_opcode | 1) == 0xff
11345 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
11346 {
11347 *mf_cmp_p = mf_cmp_incdec;
11348 return !i.mem_operands;
11349 }
e379e5f3
L
11350
11351 return 0;
11352}
11353
11354/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
11355
11356static int
b5482fe5
JB
11357add_fused_jcc_padding_frag_p (enum mf_cmp_kind *mf_cmp_p,
11358 const struct last_insn *last_insn)
e379e5f3
L
11359{
11360 /* NB: Don't work with COND_JUMP86 without i386. */
11361 if (!align_branch_power
11362 || now_seg == absolute_section
11363 || !cpu_arch_flags.bitfield.cpui386
11364 || !(align_branch & align_branch_fused_bit))
11365 return 0;
11366
79d72f45 11367 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3 11368 {
b5482fe5 11369 if (last_insn->kind == last_insn_other)
e379e5f3
L
11370 return 1;
11371 if (flag_debug)
b5482fe5 11372 as_warn_where (last_insn->file, last_insn->line,
e379e5f3 11373 _("`%s` skips -malign-branch-boundary on `%s`"),
b5482fe5 11374 last_insn->name, insn_name (&i.tm));
e379e5f3
L
11375 }
11376
11377 return 0;
11378}
11379
11380/* Return 1 if a BRANCH_PREFIX frag should be generated. */
11381
11382static int
b5482fe5 11383add_branch_prefix_frag_p (const struct last_insn *last_insn)
e379e5f3
L
11384{
11385 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
11386 to PadLock instructions since they include prefixes in opcode. */
11387 if (!align_branch_power
11388 || !align_branch_prefix_size
11389 || now_seg == absolute_section
734dfd1c 11390 || is_cpu (&i.tm, CpuPadLock)
e379e5f3
L
11391 || !cpu_arch_flags.bitfield.cpui386)
11392 return 0;
11393
11394 /* Don't add prefix if it is a prefix or there is no operand in case
11395 that segment prefix is special. */
11396 if (!i.operands || i.tm.opcode_modifier.isprefix)
11397 return 0;
11398
b5482fe5 11399 if (last_insn->kind == last_insn_other)
e379e5f3
L
11400 return 1;
11401
11402 if (flag_debug)
b5482fe5 11403 as_warn_where (last_insn->file, last_insn->line,
e379e5f3 11404 _("`%s` skips -malign-branch-boundary on `%s`"),
b5482fe5 11405 last_insn->name, insn_name (&i.tm));
e379e5f3
L
11406
11407 return 0;
11408}
11409
11410/* Return 1 if a BRANCH_PADDING frag should be generated. */
11411
11412static int
79d72f45 11413add_branch_padding_frag_p (enum align_branch_kind *branch_p,
b5482fe5
JB
11414 enum mf_jcc_kind *mf_jcc_p,
11415 const struct last_insn *last_insn)
e379e5f3
L
11416{
11417 int add_padding;
11418
11419 /* NB: Don't work with COND_JUMP86 without i386. */
11420 if (!align_branch_power
11421 || now_seg == absolute_section
389d00a5 11422 || !cpu_arch_flags.bitfield.cpui386
ddb62495 11423 || i.tm.opcode_space != SPACE_BASE)
e379e5f3
L
11424 return 0;
11425
11426 add_padding = 0;
11427
11428 /* Check for jcc and direct jmp. */
11429 if (i.tm.opcode_modifier.jump == JUMP)
11430 {
11431 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
11432 {
11433 *branch_p = align_branch_jmp;
11434 add_padding = align_branch & align_branch_jmp_bit;
11435 }
11436 else
11437 {
79d72f45
HL
11438 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
11439 igore the lowest bit. */
11440 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
11441 *branch_p = align_branch_jcc;
11442 if ((align_branch & align_branch_jcc_bit))
11443 add_padding = 1;
11444 }
11445 }
e379e5f3
L
11446 else if ((i.tm.base_opcode | 1) == 0xc3)
11447 {
11448 /* Near ret. */
11449 *branch_p = align_branch_ret;
11450 if ((align_branch & align_branch_ret_bit))
11451 add_padding = 1;
11452 }
11453 else
11454 {
11455 /* Check for indirect jmp, direct and indirect calls. */
11456 if (i.tm.base_opcode == 0xe8)
11457 {
11458 /* Direct call. */
11459 *branch_p = align_branch_call;
11460 if ((align_branch & align_branch_call_bit))
11461 add_padding = 1;
11462 }
11463 else if (i.tm.base_opcode == 0xff
11464 && (i.tm.extension_opcode == 2
11465 || i.tm.extension_opcode == 4))
11466 {
11467 /* Indirect call and jmp. */
11468 *branch_p = align_branch_indirect;
11469 if ((align_branch & align_branch_indirect_bit))
11470 add_padding = 1;
11471 }
11472
11473 if (add_padding
11474 && i.disp_operands
11475 && tls_get_addr
11476 && (i.op[0].disps->X_op == O_symbol
11477 || (i.op[0].disps->X_op == O_subtract
11478 && i.op[0].disps->X_op_symbol == GOT_symbol)))
11479 {
11480 symbolS *s = i.op[0].disps->X_add_symbol;
11481 /* No padding to call to global or undefined tls_get_addr. */
11482 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
11483 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
11484 return 0;
11485 }
11486 }
11487
11488 if (add_padding
b5482fe5 11489 && last_insn->kind != last_insn_other)
e379e5f3
L
11490 {
11491 if (flag_debug)
b5482fe5 11492 as_warn_where (last_insn->file, last_insn->line,
e379e5f3 11493 _("`%s` skips -malign-branch-boundary on `%s`"),
b5482fe5 11494 last_insn->name, insn_name (&i.tm));
e379e5f3
L
11495 return 0;
11496 }
11497
11498 return add_padding;
11499}
11500
29b0f896 11501static void
b5482fe5 11502output_insn (const struct last_insn *last_insn)
29b0f896 11503{
2bbd9c25
JJ
11504 fragS *insn_start_frag;
11505 offsetT insn_start_off;
e379e5f3
L
11506 fragS *fragP = NULL;
11507 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
11508 /* The initializer is arbitrary just to avoid uninitialized error.
11509 it's actually either assigned in add_branch_padding_frag_p
11510 or never be used. */
11511 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 11512
b4a3a7b4 11513#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 11514 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4 11515 {
32930e4e 11516 if ((i.xstate & xstate_tmm) == xstate_tmm
734dfd1c 11517 || is_cpu (&i.tm, CpuAMX_TILE))
32930e4e
L
11518 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
11519
734dfd1c
JB
11520 if (is_cpu (&i.tm, Cpu8087)
11521 || is_cpu (&i.tm, Cpu287)
11522 || is_cpu (&i.tm, Cpu387)
11523 || is_cpu (&i.tm, Cpu687)
11524 || is_cpu (&i.tm, CpuFISTTP))
b4a3a7b4 11525 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
014d61ea 11526
921eafea 11527 if ((i.xstate & xstate_mmx)
7fc69528
JB
11528 || i.tm.mnem_off == MN_emms
11529 || i.tm.mnem_off == MN_femms)
b4a3a7b4 11530 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
014d61ea 11531
32930e4e
L
11532 if (i.index_reg)
11533 {
11534 if (i.index_reg->reg_type.bitfield.zmmword)
11535 i.xstate |= xstate_zmm;
11536 else if (i.index_reg->reg_type.bitfield.ymmword)
11537 i.xstate |= xstate_ymm;
11538 else if (i.index_reg->reg_type.bitfield.xmmword)
11539 i.xstate |= xstate_xmm;
11540 }
014d61ea
JB
11541
11542 /* vzeroall / vzeroupper */
734dfd1c 11543 if (i.tm.base_opcode == 0x77 && is_cpu (&i.tm, CpuAVX))
014d61ea
JB
11544 i.xstate |= xstate_ymm;
11545
c4694f17 11546 if ((i.xstate & xstate_xmm)
389d00a5
JB
11547 /* ldmxcsr / stmxcsr / vldmxcsr / vstmxcsr */
11548 || (i.tm.base_opcode == 0xae
734dfd1c
JB
11549 && (is_cpu (&i.tm, CpuSSE)
11550 || is_cpu (&i.tm, CpuAVX)))
11551 || is_cpu (&i.tm, CpuWideKL)
11552 || is_cpu (&i.tm, CpuKL))
b4a3a7b4 11553 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
014d61ea 11554
921eafea 11555 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 11556 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 11557 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4 11558 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
6225c532 11559 if (i.mask.reg || (i.xstate & xstate_mask) == xstate_mask)
32930e4e 11560 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK;
734dfd1c 11561 if (is_cpu (&i.tm, CpuFXSR))
b4a3a7b4 11562 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
734dfd1c 11563 if (is_cpu (&i.tm, CpuXsave))
b4a3a7b4 11564 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
734dfd1c 11565 if (is_cpu (&i.tm, CpuXsaveopt))
b4a3a7b4 11566 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
734dfd1c 11567 if (is_cpu (&i.tm, CpuXSAVEC))
b4a3a7b4 11568 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
b0ab0693
L
11569
11570 if (x86_feature_2_used
734dfd1c
JB
11571 || is_cpu (&i.tm, CpuCMOV)
11572 || is_cpu (&i.tm, CpuSYSCALL)
7fc69528 11573 || i.tm.mnem_off == MN_cmpxchg8b)
b0ab0693 11574 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_BASELINE;
734dfd1c
JB
11575 if (is_cpu (&i.tm, CpuSSE3)
11576 || is_cpu (&i.tm, CpuSSSE3)
11577 || is_cpu (&i.tm, CpuSSE4_1)
11578 || is_cpu (&i.tm, CpuSSE4_2)
11579 || is_cpu (&i.tm, CpuCX16)
11580 || is_cpu (&i.tm, CpuPOPCNT)
b0ab0693
L
11581 /* LAHF-SAHF insns in 64-bit mode. */
11582 || (flag_code == CODE_64BIT
35648716 11583 && (i.tm.base_opcode | 1) == 0x9f
ddb62495 11584 && i.tm.opcode_space == SPACE_BASE))
b0ab0693 11585 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2;
734dfd1c
JB
11586 if (is_cpu (&i.tm, CpuAVX)
11587 || is_cpu (&i.tm, CpuAVX2)
a9860005
JB
11588 /* Any VEX encoded insns execpt for AVX512F, AVX512BW, AVX512DQ,
11589 XOP, FMA4, LPW, TBM, and AMX. */
b0ab0693 11590 || (i.tm.opcode_modifier.vex
734dfd1c
JB
11591 && !is_cpu (&i.tm, CpuAVX512F)
11592 && !is_cpu (&i.tm, CpuAVX512BW)
11593 && !is_cpu (&i.tm, CpuAVX512DQ)
11594 && !is_cpu (&i.tm, CpuXOP)
11595 && !is_cpu (&i.tm, CpuFMA4)
11596 && !is_cpu (&i.tm, CpuLWP)
11597 && !is_cpu (&i.tm, CpuTBM)
b0ab0693 11598 && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM))
734dfd1c
JB
11599 || is_cpu (&i.tm, CpuF16C)
11600 || is_cpu (&i.tm, CpuFMA)
11601 || is_cpu (&i.tm, CpuLZCNT)
11602 || is_cpu (&i.tm, CpuMovbe)
11603 || is_cpu (&i.tm, CpuXSAVES)
b0ab0693
L
11604 || (x86_feature_2_used
11605 & (GNU_PROPERTY_X86_FEATURE_2_XSAVE
11606 | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
11607 | GNU_PROPERTY_X86_FEATURE_2_XSAVEC)) != 0)
11608 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V3;
734dfd1c
JB
11609 if (is_cpu (&i.tm, CpuAVX512F)
11610 || is_cpu (&i.tm, CpuAVX512BW)
11611 || is_cpu (&i.tm, CpuAVX512DQ)
11612 || is_cpu (&i.tm, CpuAVX512VL)
a9860005
JB
11613 /* Any EVEX encoded insns except for AVX512ER, AVX512PF,
11614 AVX512-4FMAPS, and AVX512-4VNNIW. */
b0ab0693 11615 || (i.tm.opcode_modifier.evex
734dfd1c
JB
11616 && !is_cpu (&i.tm, CpuAVX512ER)
11617 && !is_cpu (&i.tm, CpuAVX512PF)
11618 && !is_cpu (&i.tm, CpuAVX512_4FMAPS)
11619 && !is_cpu (&i.tm, CpuAVX512_4VNNIW)))
b0ab0693 11620 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V4;
b4a3a7b4
L
11621 }
11622#endif
11623
29b0f896
AM
11624 /* Tie dwarf2 debug info to the address at the start of the insn.
11625 We can't do this after the insn has been output as the current
11626 frag may have been closed off. eg. by frag_var. */
11627 dwarf2_emit_insn (0);
11628
2bbd9c25
JJ
11629 insn_start_frag = frag_now;
11630 insn_start_off = frag_now_fix ();
11631
b5482fe5 11632 if (add_branch_padding_frag_p (&branch, &mf_jcc, last_insn))
e379e5f3
L
11633 {
11634 char *p;
11635 /* Branch can be 8 bytes. Leave some room for prefixes. */
11636 unsigned int max_branch_padding_size = 14;
11637
11638 /* Align section to boundary. */
11639 record_alignment (now_seg, align_branch_power);
11640
11641 /* Make room for padding. */
11642 frag_grow (max_branch_padding_size);
11643
11644 /* Start of the padding. */
11645 p = frag_more (0);
11646
11647 fragP = frag_now;
11648
11649 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
11650 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
11651 NULL, 0, p);
11652
79d72f45 11653 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
11654 fragP->tc_frag_data.branch_type = branch;
11655 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
11656 }
11657
d59a54c2
JB
11658 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT)
11659 && !pre_386_16bit_warned)
11660 {
11661 as_warn (_("use .code16 to ensure correct addressing mode"));
11662 pre_386_16bit_warned = true;
11663 }
11664
29b0f896 11665 /* Output jumps. */
0cfa3eb3 11666 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 11667 output_branch ();
0cfa3eb3
JB
11668 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
11669 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 11670 output_jump ();
0cfa3eb3 11671 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
11672 output_interseg_jump ();
11673 else
11674 {
11675 /* Output normal instructions here. */
11676 char *p;
11677 unsigned char *q;
47465058 11678 unsigned int j;
79d72f45 11679 enum mf_cmp_kind mf_cmp;
4dffcebc 11680
e4e00185 11681 if (avoid_fence
389d00a5
JB
11682 && (i.tm.base_opcode == 0xaee8
11683 || i.tm.base_opcode == 0xaef0
11684 || i.tm.base_opcode == 0xaef8))
48ef937e
JB
11685 {
11686 /* Encode lfence, mfence, and sfence as
11687 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
47f4115a 11688 if (flag_code == CODE_16BIT)
76d3f746 11689 as_bad (_("Cannot convert `%s' in 16-bit mode"), insn_name (&i.tm));
47f4115a
JB
11690 else if (omit_lock_prefix)
11691 as_bad (_("Cannot convert `%s' with `-momit-lock-prefix=yes' in effect"),
76d3f746 11692 insn_name (&i.tm));
47f4115a 11693 else if (now_seg != absolute_section)
48ef937e
JB
11694 {
11695 offsetT val = 0x240483f0ULL;
11696
11697 p = frag_more (5);
11698 md_number_to_chars (p, val, 5);
11699 }
11700 else
11701 abs_section_offset += 5;
11702 return;
11703 }
e4e00185 11704
d022bddd
IT
11705 /* Some processors fail on LOCK prefix. This options makes
11706 assembler ignore LOCK prefix and serves as a workaround. */
11707 if (omit_lock_prefix)
11708 {
35648716
JB
11709 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE
11710 && i.tm.opcode_modifier.isprefix)
d022bddd
IT
11711 return;
11712 i.prefix[LOCK_PREFIX] = 0;
11713 }
11714
e379e5f3
L
11715 if (branch)
11716 /* Skip if this is a branch. */
11717 ;
b5482fe5 11718 else if (add_fused_jcc_padding_frag_p (&mf_cmp, last_insn))
e379e5f3
L
11719 {
11720 /* Make room for padding. */
11721 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
11722 p = frag_more (0);
11723
11724 fragP = frag_now;
11725
11726 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
11727 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
11728 NULL, 0, p);
11729
79d72f45 11730 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
11731 fragP->tc_frag_data.branch_type = align_branch_fused;
11732 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
11733 }
b5482fe5 11734 else if (add_branch_prefix_frag_p (last_insn))
e379e5f3
L
11735 {
11736 unsigned int max_prefix_size = align_branch_prefix_size;
11737
11738 /* Make room for padding. */
11739 frag_grow (max_prefix_size);
11740 p = frag_more (0);
11741
11742 fragP = frag_now;
11743
11744 frag_var (rs_machine_dependent, max_prefix_size, 0,
11745 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
11746 NULL, 0, p);
11747
11748 fragP->tc_frag_data.max_bytes = max_prefix_size;
11749 }
11750
43234a1e
L
11751 /* Since the VEX/EVEX prefix contains the implicit prefix, we
11752 don't need the explicit prefix. */
cf665fee 11753 if (!is_any_vex_encoding (&i.tm))
bc4bd9ab 11754 {
7b47a312 11755 switch (i.tm.opcode_modifier.opcodeprefix)
bc4bd9ab 11756 {
7b47a312
L
11757 case PREFIX_0X66:
11758 add_prefix (0x66);
11759 break;
11760 case PREFIX_0XF2:
11761 add_prefix (0xf2);
11762 break;
11763 case PREFIX_0XF3:
734dfd1c 11764 if (!is_cpu (&i.tm, CpuPadLock)
8b65b895
L
11765 || (i.prefix[REP_PREFIX] != 0xf3))
11766 add_prefix (0xf3);
c0f3af97 11767 break;
7b47a312 11768 case PREFIX_NONE:
9a182d04 11769 switch (i.opcode_length)
c0f3af97 11770 {
7b47a312 11771 case 2:
7b47a312 11772 break;
9a182d04 11773 case 1:
7b47a312 11774 /* Check for pseudo prefixes. */
9a182d04
JB
11775 if (!i.tm.opcode_modifier.isprefix || i.tm.base_opcode)
11776 break;
7b47a312
L
11777 as_bad_where (insn_start_frag->fr_file,
11778 insn_start_frag->fr_line,
11779 _("pseudo prefix without instruction"));
11780 return;
11781 default:
11782 abort ();
4dffcebc 11783 }
c0f3af97 11784 break;
c0f3af97
L
11785 default:
11786 abort ();
bc4bd9ab 11787 }
c0f3af97 11788
6d19a37a 11789#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
11790 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
11791 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
11792 perform IE->LE optimization. A dummy REX_OPCODE prefix
11793 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
11794 relocation for GDesc -> IE/LE optimization. */
cf61b747 11795 if (x86_elf_abi == X86_64_X32_ABI
a533c8df 11796 && !is_apx_rex2_encoding ()
cf61b747 11797 && i.operands == 2
14470f07
L
11798 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
11799 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
11800 && i.prefix[REX_PREFIX] == 0)
11801 add_prefix (REX_OPCODE);
6d19a37a 11802#endif
cf61b747 11803
c0f3af97
L
11804 /* The prefix bytes. */
11805 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
11806 if (*q)
48ef937e 11807 frag_opcode_byte (*q);
80d61d8d
CL
11808
11809 if (is_apx_rex2_encoding ())
11810 {
11811 frag_opcode_byte (i.vex.bytes[0]);
11812 frag_opcode_byte (i.vex.bytes[1]);
11813 }
0f10071e 11814 }
ae5c1c7b 11815 else
c0f3af97
L
11816 {
11817 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
11818 if (*q)
11819 switch (j)
11820 {
c0f3af97
L
11821 case SEG_PREFIX:
11822 case ADDR_PREFIX:
48ef937e 11823 frag_opcode_byte (*q);
c0f3af97
L
11824 break;
11825 default:
11826 /* There should be no other prefixes for instructions
11827 with VEX prefix. */
11828 abort ();
11829 }
11830
43234a1e
L
11831 /* For EVEX instructions i.vrex should become 0 after
11832 build_evex_prefix. For VEX instructions upper 16 registers
11833 aren't available, so VREX should be 0. */
11834 if (i.vrex)
11835 abort ();
c0f3af97 11836 /* Now the VEX prefix. */
48ef937e
JB
11837 if (now_seg != absolute_section)
11838 {
11839 p = frag_more (i.vex.length);
11840 for (j = 0; j < i.vex.length; j++)
11841 p[j] = i.vex.bytes[j];
11842 }
11843 else
11844 abs_section_offset += i.vex.length;
c0f3af97 11845 }
252b5132 11846
29b0f896 11847 /* Now the opcode; be careful about word order here! */
389d00a5
JB
11848 j = i.opcode_length;
11849 if (!i.vex.length)
ddb62495 11850 switch (i.tm.opcode_space)
389d00a5
JB
11851 {
11852 case SPACE_BASE:
11853 break;
11854 case SPACE_0F:
11855 ++j;
11856 break;
11857 case SPACE_0F38:
11858 case SPACE_0F3A:
11859 j += 2;
11860 break;
11861 default:
11862 abort ();
11863 }
11864
48ef937e 11865 if (now_seg == absolute_section)
389d00a5
JB
11866 abs_section_offset += j;
11867 else if (j == 1)
29b0f896
AM
11868 {
11869 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
11870 }
11871 else
11872 {
389d00a5
JB
11873 p = frag_more (j);
11874 if (!i.vex.length
ddb62495 11875 && i.tm.opcode_space != SPACE_BASE)
389d00a5
JB
11876 {
11877 *p++ = 0x0f;
ddb62495
JB
11878 if (i.tm.opcode_space != SPACE_0F)
11879 *p++ = i.tm.opcode_space == SPACE_0F38
389d00a5
JB
11880 ? 0x38 : 0x3a;
11881 }
11882
9a182d04 11883 switch (i.opcode_length)
331d2d0d 11884 {
4dffcebc 11885 case 2:
389d00a5
JB
11886 /* Put out high byte first: can't use md_number_to_chars! */
11887 *p++ = (i.tm.base_opcode >> 8) & 0xff;
11888 /* Fall through. */
11889 case 1:
11890 *p = i.tm.base_opcode & 0xff;
4dffcebc
L
11891 break;
11892 default:
11893 abort ();
11894 break;
331d2d0d 11895 }
0f10071e 11896
29b0f896 11897 }
3e73aa7c 11898
29b0f896 11899 /* Now the modrm byte and sib byte (if present). */
40fb9820 11900 if (i.tm.opcode_modifier.modrm)
29b0f896 11901 {
48ef937e
JB
11902 frag_opcode_byte ((i.rm.regmem << 0)
11903 | (i.rm.reg << 3)
11904 | (i.rm.mode << 6));
29b0f896
AM
11905 /* If i.rm.regmem == ESP (4)
11906 && i.rm.mode != (Register mode)
11907 && not 16 bit
11908 ==> need second modrm byte. */
11909 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
11910 && i.rm.mode != 3
dc821c5f 11911 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
11912 frag_opcode_byte ((i.sib.base << 0)
11913 | (i.sib.index << 3)
11914 | (i.sib.scale << 6));
29b0f896 11915 }
3e73aa7c 11916
29b0f896 11917 if (i.disp_operands)
2bbd9c25 11918 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 11919
29b0f896 11920 if (i.imm_operands)
2bbd9c25 11921 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
11922
11923 /*
11924 * frag_now_fix () returning plain abs_section_offset when we're in the
11925 * absolute section, and abs_section_offset not getting updated as data
11926 * gets added to the frag breaks the logic below.
11927 */
11928 if (now_seg != absolute_section)
11929 {
11930 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
11931 if (j > 15)
0afc614c
L
11932 {
11933 if (dot_insn ())
11934 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
11935 j);
11936 else
11937 as_bad (_("instruction length of %u bytes exceeds the limit of 15"),
11938 j);
11939 }
e379e5f3
L
11940 else if (fragP)
11941 {
11942 /* NB: Don't add prefix with GOTPC relocation since
11943 output_disp() above depends on the fixed encoding
11944 length. Can't add prefix with TLS relocation since
11945 it breaks TLS linker optimization. */
11946 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
11947 /* Prefix count on the current instruction. */
11948 unsigned int count = i.vex.length;
11949 unsigned int k;
11950 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
11951 /* REX byte is encoded in VEX/EVEX prefix. */
11952 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
11953 count++;
11954
11955 /* Count prefixes for extended opcode maps. */
11956 if (!i.vex.length)
ddb62495 11957 switch (i.tm.opcode_space)
e379e5f3 11958 {
389d00a5 11959 case SPACE_BASE:
e379e5f3 11960 break;
389d00a5
JB
11961 case SPACE_0F:
11962 count++;
e379e5f3 11963 break;
389d00a5
JB
11964 case SPACE_0F38:
11965 case SPACE_0F3A:
11966 count += 2;
e379e5f3
L
11967 break;
11968 default:
11969 abort ();
11970 }
11971
11972 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11973 == BRANCH_PREFIX)
11974 {
11975 /* Set the maximum prefix size in BRANCH_PREFIX
11976 frag. */
11977 if (fragP->tc_frag_data.max_bytes > max)
11978 fragP->tc_frag_data.max_bytes = max;
11979 if (fragP->tc_frag_data.max_bytes > count)
11980 fragP->tc_frag_data.max_bytes -= count;
11981 else
11982 fragP->tc_frag_data.max_bytes = 0;
11983 }
11984 else
11985 {
11986 /* Remember the maximum prefix size in FUSED_JCC_PADDING
11987 frag. */
11988 unsigned int max_prefix_size;
11989 if (align_branch_prefix_size > max)
11990 max_prefix_size = max;
11991 else
11992 max_prefix_size = align_branch_prefix_size;
11993 if (max_prefix_size > count)
11994 fragP->tc_frag_data.max_prefix_length
11995 = max_prefix_size - count;
11996 }
11997
11998 /* Use existing segment prefix if possible. Use CS
11999 segment prefix in 64-bit mode. In 32-bit mode, use SS
12000 segment prefix with ESP/EBP base register and use DS
12001 segment prefix without ESP/EBP base register. */
12002 if (i.prefix[SEG_PREFIX])
12003 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
12004 else if (flag_code == CODE_64BIT)
12005 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
12006 else if (i.base_reg
12007 && (i.base_reg->reg_num == 4
12008 || i.base_reg->reg_num == 5))
12009 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
12010 else
12011 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
12012 }
9c33702b 12013 }
29b0f896 12014 }
252b5132 12015
e379e5f3
L
12016 /* NB: Don't work with COND_JUMP86 without i386. */
12017 if (align_branch_power
12018 && now_seg != absolute_section
12019 && cpu_arch_flags.bitfield.cpui386)
12020 {
12021 /* Terminate each frag so that we can add prefix and check for
12022 fused jcc. */
12023 frag_wane (frag_now);
12024 frag_new (0);
12025 }
12026
29b0f896
AM
12027#ifdef DEBUG386
12028 if (flag_debug)
12029 {
7b81dfbb 12030 pi ("" /*line*/, &i);
29b0f896
AM
12031 }
12032#endif /* DEBUG386 */
12033}
252b5132 12034
e205caa7
L
12035/* Return the size of the displacement operand N. */
12036
12037static int
12038disp_size (unsigned int n)
12039{
12040 int size = 4;
43234a1e 12041
b5014f7a 12042 if (i.types[n].bitfield.disp64)
40fb9820
L
12043 size = 8;
12044 else if (i.types[n].bitfield.disp8)
12045 size = 1;
12046 else if (i.types[n].bitfield.disp16)
12047 size = 2;
e205caa7
L
12048 return size;
12049}
12050
12051/* Return the size of the immediate operand N. */
12052
12053static int
12054imm_size (unsigned int n)
12055{
12056 int size = 4;
40fb9820
L
12057 if (i.types[n].bitfield.imm64)
12058 size = 8;
12059 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
12060 size = 1;
12061 else if (i.types[n].bitfield.imm16)
12062 size = 2;
e205caa7
L
12063 return size;
12064}
12065
29b0f896 12066static void
64e74474 12067output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
12068{
12069 char *p;
12070 unsigned int n;
252b5132 12071
29b0f896
AM
12072 for (n = 0; n < i.operands; n++)
12073 {
b5014f7a 12074 if (operand_type_check (i.types[n], disp))
29b0f896 12075 {
48ef937e
JB
12076 int size = disp_size (n);
12077
12078 if (now_seg == absolute_section)
12079 abs_section_offset += size;
12080 else if (i.op[n].disps->X_op == O_constant)
29b0f896 12081 {
43234a1e 12082 offsetT val = i.op[n].disps->X_add_number;
252b5132 12083
629cfaf1
JB
12084 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
12085 size);
29b0f896
AM
12086 p = frag_more (size);
12087 md_number_to_chars (p, val, size);
12088 }
12089 else
12090 {
f86103b7 12091 enum bfd_reloc_code_real reloc_type;
a775efc8
JB
12092 bool pcrel = (i.flags[n] & Operand_PCrel) != 0;
12093 bool sign = (flag_code == CODE_64BIT && size == 4
12094 && (!want_disp32 (&i.tm)
12095 || (i.tm.opcode_modifier.jump && !i.jumpabsolute
12096 && !i.types[n].bitfield.baseindex)))
12097 || pcrel;
02a86693 12098 fixS *fixP;
29b0f896 12099
e205caa7 12100 /* We can't have 8 bit displacement here. */
9c2799c2 12101 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 12102
29b0f896
AM
12103 /* The PC relative address is computed relative
12104 to the instruction boundary, so in case immediate
12105 fields follows, we need to adjust the value. */
12106 if (pcrel && i.imm_operands)
12107 {
29b0f896 12108 unsigned int n1;
e205caa7 12109 int sz = 0;
252b5132 12110
29b0f896 12111 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 12112 if (operand_type_check (i.types[n1], imm))
252b5132 12113 {
e205caa7 12114 /* Only one immediate is allowed for PC
e3bf0aad
JB
12115 relative address, except with .insn. */
12116 gas_assert (sz == 0 || dot_insn ());
12117 sz += imm_size (n1);
252b5132 12118 }
e3bf0aad 12119 /* We should find at least one immediate. */
9c2799c2 12120 gas_assert (sz != 0);
e3bf0aad 12121 i.op[n].disps->X_add_number -= sz;
29b0f896 12122 }
520dc8e8 12123
29b0f896 12124 p = frag_more (size);
d258b828 12125 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 12126 if (GOT_symbol
2bbd9c25 12127 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 12128 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
12129 || reloc_type == BFD_RELOC_X86_64_32S
12130 || (reloc_type == BFD_RELOC_64
12131 && object_64bit))
d6ab8113
JB
12132 && (i.op[n].disps->X_op == O_symbol
12133 || (i.op[n].disps->X_op == O_add
12134 && ((symbol_get_value_expression
12135 (i.op[n].disps->X_op_symbol)->X_op)
12136 == O_subtract))))
12137 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 12138 {
4fa24527 12139 if (!object_64bit)
7b81dfbb
AJ
12140 {
12141 reloc_type = BFD_RELOC_386_GOTPC;
5b7c81bd 12142 i.has_gotpc_tls_reloc = true;
98da05bf 12143 i.op[n].disps->X_add_number +=
d583596c 12144 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
12145 }
12146 else if (reloc_type == BFD_RELOC_64)
12147 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 12148 else
7b81dfbb
AJ
12149 /* Don't do the adjustment for x86-64, as there
12150 the pcrel addressing is relative to the _next_
12151 insn, and that is taken care of in other code. */
d6ab8113 12152 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 12153 }
e379e5f3
L
12154 else if (align_branch_power)
12155 {
12156 switch (reloc_type)
12157 {
12158 case BFD_RELOC_386_TLS_GD:
12159 case BFD_RELOC_386_TLS_LDM:
12160 case BFD_RELOC_386_TLS_IE:
12161 case BFD_RELOC_386_TLS_IE_32:
12162 case BFD_RELOC_386_TLS_GOTIE:
12163 case BFD_RELOC_386_TLS_GOTDESC:
12164 case BFD_RELOC_386_TLS_DESC_CALL:
12165 case BFD_RELOC_X86_64_TLSGD:
12166 case BFD_RELOC_X86_64_TLSLD:
12167 case BFD_RELOC_X86_64_GOTTPOFF:
a533c8df 12168 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF:
5bc71c2a 12169 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF:
e379e5f3 12170 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
a533c8df 12171 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC:
e379e5f3 12172 case BFD_RELOC_X86_64_TLSDESC_CALL:
5b7c81bd 12173 i.has_gotpc_tls_reloc = true;
e379e5f3
L
12174 default:
12175 break;
12176 }
12177 }
02a86693
L
12178 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
12179 size, i.op[n].disps, pcrel,
12180 reloc_type);
eb19308f
JB
12181
12182 if (flag_code == CODE_64BIT && size == 4 && pcrel
12183 && !i.prefix[ADDR_PREFIX])
12184 fixP->fx_signed = 1;
12185
5bc71c2a
L
12186 if (reloc_type == BFD_RELOC_X86_64_GOTTPOFF
12187 && i.tm.opcode_space == SPACE_EVEXMAP4)
12188 {
12189 /* Only "add %reg1, foo@gottpoff(%rip), %reg2" is
12190 allowed in md_assemble. Set fx_tcbit2 for EVEX
12191 prefix. */
12192 fixP->fx_tcbit2 = 1;
12193 continue;
12194 }
12195
12196 if (i.base_reg && i.base_reg->reg_num == RegIP)
12197 {
12198 if (reloc_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
12199 {
12200 /* Set fx_tcbit for REX2 prefix. */
12201 if (is_apx_rex2_encoding ())
12202 fixP->fx_tcbit = 1;
12203 continue;
12204 }
12205 }
12206 /* In 64-bit, i386_validate_fix updates only (%rip)
12207 relocations. */
12208 else if (object_64bit)
12209 continue;
3d5a60de 12210
02a86693
L
12211 /* Check for "call/jmp *mem", "mov mem, %reg",
12212 "test %reg, mem" and "binop mem, %reg" where binop
12213 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
12214 instructions without data prefix. Always generate
12215 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
12216 if (i.prefix[DATA_PREFIX] == 0
0cb4071e
L
12217 && (i.rm.mode == 2
12218 || (i.rm.mode == 0 && i.rm.regmem == 5))
ddb62495 12219 && i.tm.opcode_space == SPACE_BASE
02a86693
L
12220 && ((i.operands == 1
12221 && i.tm.base_opcode == 0xff
12222 && (i.rm.reg == 2 || i.rm.reg == 4))
12223 || (i.operands == 2
12224 && (i.tm.base_opcode == 0x8b
12225 || i.tm.base_opcode == 0x85
2ae4c703 12226 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
12227 {
12228 if (object_64bit)
12229 {
5bc71c2a
L
12230 if (reloc_type == BFD_RELOC_X86_64_GOTTPOFF)
12231 {
12232 /* Set fx_tcbit for REX2 prefix. */
12233 if (is_apx_rex2_encoding ())
12234 fixP->fx_tcbit = 1;
12235 }
820a7755 12236 else if (generate_relax_relocations)
5bc71c2a
L
12237 {
12238 /* Set fx_tcbit3 for REX2 prefix. */
12239 if (is_apx_rex2_encoding ())
12240 fixP->fx_tcbit3 = 1;
12241 else if (i.rex)
12242 fixP->fx_tcbit2 = 1;
12243 else
12244 fixP->fx_tcbit = 1;
12245 }
02a86693 12246 }
820a7755
JB
12247 else if (generate_relax_relocations
12248 || (i.rm.mode == 0 && i.rm.regmem == 5))
02a86693
L
12249 fixP->fx_tcbit2 = 1;
12250 }
29b0f896
AM
12251 }
12252 }
12253 }
12254}
252b5132 12255
29b0f896 12256static void
64e74474 12257output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
12258{
12259 char *p;
12260 unsigned int n;
252b5132 12261
29b0f896
AM
12262 for (n = 0; n < i.operands; n++)
12263 {
40fb9820 12264 if (operand_type_check (i.types[n], imm))
29b0f896 12265 {
48ef937e
JB
12266 int size = imm_size (n);
12267
12268 if (now_seg == absolute_section)
12269 abs_section_offset += size;
12270 else if (i.op[n].imms->X_op == O_constant)
29b0f896 12271 {
29b0f896 12272 offsetT val;
b4cac588 12273
29b0f896
AM
12274 val = offset_in_range (i.op[n].imms->X_add_number,
12275 size);
12276 p = frag_more (size);
12277 md_number_to_chars (p, val, size);
12278 }
12279 else
12280 {
12281 /* Not absolute_section.
12282 Need a 32-bit fixup (don't support 8bit
12283 non-absolute imms). Try to support other
12284 sizes ... */
f86103b7 12285 enum bfd_reloc_code_real reloc_type;
e205caa7 12286 int sign;
29b0f896 12287
40fb9820 12288 if (i.types[n].bitfield.imm32s
a7d61044 12289 && (i.suffix == QWORD_MNEM_SUFFIX
c032bc4f 12290 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)
f79d55e1 12291 || (i.prefix[REX_PREFIX] & REX_W)
c032bc4f 12292 || dot_insn ()))
29b0f896 12293 sign = 1;
e205caa7
L
12294 else
12295 sign = 0;
520dc8e8 12296
29b0f896 12297 p = frag_more (size);
d258b828 12298 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 12299
2bbd9c25
JJ
12300 /* This is tough to explain. We end up with this one if we
12301 * have operands that look like
12302 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
12303 * obtain the absolute address of the GOT, and it is strongly
12304 * preferable from a performance point of view to avoid using
12305 * a runtime relocation for this. The actual sequence of
12306 * instructions often look something like:
12307 *
12308 * call .L66
12309 * .L66:
12310 * popl %ebx
12311 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
12312 *
12313 * The call and pop essentially return the absolute address
12314 * of the label .L66 and store it in %ebx. The linker itself
12315 * will ultimately change the first operand of the addl so
12316 * that %ebx points to the GOT, but to keep things simple, the
12317 * .o file must have this operand set so that it generates not
12318 * the absolute address of .L66, but the absolute address of
12319 * itself. This allows the linker itself simply treat a GOTPC
12320 * relocation as asking for a pcrel offset to the GOT to be
12321 * added in, and the addend of the relocation is stored in the
12322 * operand field for the instruction itself.
12323 *
12324 * Our job here is to fix the operand so that it would add
12325 * the correct offset so that %ebx would point to itself. The
12326 * thing that is tricky is that .-.L66 will point to the
12327 * beginning of the instruction, so we need to further modify
12328 * the operand so that it will point to itself. There are
12329 * other cases where you have something like:
12330 *
12331 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
12332 *
12333 * and here no correction would be required. Internally in
12334 * the assembler we treat operands of this form as not being
12335 * pcrel since the '.' is explicitly mentioned, and I wonder
12336 * whether it would simplify matters to do it this way. Who
12337 * knows. In earlier versions of the PIC patches, the
12338 * pcrel_adjust field was used to store the correction, but
12339 * since the expression is not pcrel, I felt it would be
12340 * confusing to do it this way. */
12341
d6ab8113 12342 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
12343 || reloc_type == BFD_RELOC_X86_64_32S
12344 || reloc_type == BFD_RELOC_64)
29b0f896
AM
12345 && GOT_symbol
12346 && GOT_symbol == i.op[n].imms->X_add_symbol
12347 && (i.op[n].imms->X_op == O_symbol
12348 || (i.op[n].imms->X_op == O_add
12349 && ((symbol_get_value_expression
12350 (i.op[n].imms->X_op_symbol)->X_op)
12351 == O_subtract))))
12352 {
4fa24527 12353 if (!object_64bit)
d6ab8113 12354 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 12355 else if (size == 4)
d6ab8113 12356 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
12357 else if (size == 8)
12358 reloc_type = BFD_RELOC_X86_64_GOTPC64;
5b7c81bd 12359 i.has_gotpc_tls_reloc = true;
d583596c
JB
12360 i.op[n].imms->X_add_number +=
12361 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 12362 }
29b0f896
AM
12363 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
12364 i.op[n].imms, 0, reloc_type);
12365 }
12366 }
12367 }
252b5132
RH
12368}
12369\f
d182319b
JB
12370/* x86_cons_fix_new is called via the expression parsing code when a
12371 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
12372static int cons_sign = -1;
12373
12374void
e3bb37b5 12375x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 12376 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 12377{
d258b828 12378 r = reloc (len, 0, cons_sign, r);
d182319b
JB
12379
12380#ifdef TE_PE
12381 if (exp->X_op == O_secrel)
12382 {
12383 exp->X_op = O_symbol;
12384 r = BFD_RELOC_32_SECREL;
12385 }
145667f8
MH
12386 else if (exp->X_op == O_secidx)
12387 r = BFD_RELOC_16_SECIDX;
d182319b
JB
12388#endif
12389
12390 fix_new_exp (frag, off, len, exp, 0, r);
12391}
12392
357d1bd8
L
12393/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
12394 purpose of the `.dc.a' internal pseudo-op. */
12395
12396int
12397x86_address_bytes (void)
12398{
12399 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
12400 return 4;
12401 return stdoutput->arch_info->bits_per_address / 8;
12402}
12403
deea4973
JB
12404#if (!(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
12405 || defined (LEX_AT)) && !defined (TE_PE)
d258b828 12406# define lex_got(reloc, adjust, types) NULL
718ddfc0 12407#else
f3c180ae
AM
12408/* Parse operands of the form
12409 <symbol>@GOTOFF+<nnn>
12410 and similar .plt or .got references.
12411
12412 If we find one, set up the correct relocation in RELOC and copy the
12413 input string, minus the `@GOTOFF' into a malloc'd buffer for
12414 parsing by the calling routine. Return this buffer, and if ADJUST
12415 is non-null set it to the length of the string we removed from the
12416 input line. Otherwise return NULL. */
12417static char *
91d6fa6a 12418lex_got (enum bfd_reloc_code_real *rel,
64e74474 12419 int *adjust,
d258b828 12420 i386_operand_type *types)
f3c180ae 12421{
7b81dfbb
AJ
12422 /* Some of the relocations depend on the size of what field is to
12423 be relocated. But in our callers i386_immediate and i386_displacement
12424 we don't yet know the operand size (this will be set by insn
12425 matching). Hence we record the word32 relocation here,
12426 and adjust the reloc according to the real size in reloc(). */
145667f8
MH
12427 static const struct
12428 {
f3c180ae 12429 const char *str;
cff8d58a 12430 int len;
4fa24527 12431 const enum bfd_reloc_code_real rel[2];
40fb9820 12432 const i386_operand_type types64;
5b7c81bd 12433 bool need_GOT_symbol;
145667f8
MH
12434 }
12435 gotrel[] =
12436 {
05909f23
JB
12437
12438#define OPERAND_TYPE_IMM32_32S_DISP32 { .bitfield = \
12439 { .imm32 = 1, .imm32s = 1, .disp32 = 1 } }
12440#define OPERAND_TYPE_IMM32_32S_64_DISP32 { .bitfield = \
12441 { .imm32 = 1, .imm32s = 1, .imm64 = 1, .disp32 = 1 } }
12442#define OPERAND_TYPE_IMM32_32S_64_DISP32_64 { .bitfield = \
12443 { .imm32 = 1, .imm32s = 1, .imm64 = 1, .disp32 = 1, .disp64 = 1 } }
12444#define OPERAND_TYPE_IMM64_DISP64 { .bitfield = \
12445 { .imm64 = 1, .disp64 = 1 } }
12446
deea4973 12447#ifndef TE_PE
8ce3d284 12448#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
12449 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
12450 BFD_RELOC_SIZE32 },
05909f23 12451 { .bitfield = { .imm32 = 1, .imm64 = 1 } }, false },
8ce3d284 12452#endif
cff8d58a
L
12453 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
12454 BFD_RELOC_X86_64_PLTOFF64 },
05909f23 12455 { .bitfield = { .imm64 = 1 } }, true },
cff8d58a
L
12456 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
12457 BFD_RELOC_X86_64_PLT32 },
a775efc8 12458 OPERAND_TYPE_IMM32_32S_DISP32, false },
cff8d58a
L
12459 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
12460 BFD_RELOC_X86_64_GOTPLT64 },
5b7c81bd 12461 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
12462 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
12463 BFD_RELOC_X86_64_GOTOFF64 },
5b7c81bd 12464 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
12465 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
12466 BFD_RELOC_X86_64_GOTPCREL },
a775efc8 12467 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
12468 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
12469 BFD_RELOC_X86_64_TLSGD },
a775efc8 12470 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
12471 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
12472 _dummy_first_bfd_reloc_code_real },
5b7c81bd 12473 OPERAND_TYPE_NONE, true },
cff8d58a
L
12474 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
12475 BFD_RELOC_X86_64_TLSLD },
a775efc8 12476 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
12477 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
12478 BFD_RELOC_X86_64_GOTTPOFF },
a775efc8 12479 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
12480 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
12481 BFD_RELOC_X86_64_TPOFF32 },
a775efc8 12482 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
12483 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
12484 _dummy_first_bfd_reloc_code_real },
5b7c81bd 12485 OPERAND_TYPE_NONE, true },
cff8d58a
L
12486 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
12487 BFD_RELOC_X86_64_DTPOFF32 },
a775efc8 12488 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
12489 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
12490 _dummy_first_bfd_reloc_code_real },
5b7c81bd 12491 OPERAND_TYPE_NONE, true },
cff8d58a
L
12492 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
12493 _dummy_first_bfd_reloc_code_real },
5b7c81bd 12494 OPERAND_TYPE_NONE, true },
cff8d58a
L
12495 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
12496 BFD_RELOC_X86_64_GOT32 },
a775efc8 12497 OPERAND_TYPE_IMM32_32S_64_DISP32, true },
cff8d58a
L
12498 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
12499 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
a775efc8 12500 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
12501 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
12502 BFD_RELOC_X86_64_TLSDESC_CALL },
a775efc8 12503 OPERAND_TYPE_IMM32_32S_DISP32, true },
deea4973
JB
12504#else /* TE_PE */
12505 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
12506 BFD_RELOC_32_SECREL },
a775efc8 12507 OPERAND_TYPE_IMM32_32S_64_DISP32_64, false },
deea4973 12508#endif
05909f23
JB
12509
12510#undef OPERAND_TYPE_IMM32_32S_DISP32
12511#undef OPERAND_TYPE_IMM32_32S_64_DISP32
12512#undef OPERAND_TYPE_IMM32_32S_64_DISP32_64
12513#undef OPERAND_TYPE_IMM64_DISP64
12514
f3c180ae
AM
12515 };
12516 char *cp;
12517 unsigned int j;
12518
deea4973 12519#if defined (OBJ_MAYBE_ELF) && !defined (TE_PE)
718ddfc0
JB
12520 if (!IS_ELF)
12521 return NULL;
d382c579 12522#endif
718ddfc0 12523
f3c180ae 12524 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 12525 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
12526 return NULL;
12527
47465058 12528 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 12529 {
cff8d58a 12530 int len = gotrel[j].len;
28f81592 12531 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 12532 {
4fa24527 12533 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 12534 {
28f81592
AM
12535 int first, second;
12536 char *tmpbuf, *past_reloc;
f3c180ae 12537
91d6fa6a 12538 *rel = gotrel[j].rel[object_64bit];
f3c180ae 12539
3956db08
JB
12540 if (types)
12541 {
12542 if (flag_code != CODE_64BIT)
40fb9820
L
12543 {
12544 types->bitfield.imm32 = 1;
12545 types->bitfield.disp32 = 1;
12546 }
3956db08
JB
12547 else
12548 *types = gotrel[j].types64;
12549 }
12550
844bf810 12551 if (gotrel[j].need_GOT_symbol && GOT_symbol == NULL)
f3c180ae
AM
12552 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
12553
28f81592 12554 /* The length of the first part of our input line. */
f3c180ae 12555 first = cp - input_line_pointer;
28f81592
AM
12556
12557 /* The second part goes from after the reloc token until
67c11a9b 12558 (and including) an end_of_line char or comma. */
28f81592 12559 past_reloc = cp + 1 + len;
67c11a9b
AM
12560 cp = past_reloc;
12561 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
12562 ++cp;
12563 second = cp + 1 - past_reloc;
28f81592
AM
12564
12565 /* Allocate and copy string. The trailing NUL shouldn't
12566 be necessary, but be safe. */
add39d23 12567 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 12568 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
12569 if (second != 0 && *past_reloc != ' ')
12570 /* Replace the relocation token with ' ', so that
12571 errors like foo@GOTOFF1 will be detected. */
12572 tmpbuf[first++] = ' ';
af89796a
L
12573 else
12574 /* Increment length by 1 if the relocation token is
12575 removed. */
12576 len++;
12577 if (adjust)
12578 *adjust = len;
0787a12d
AM
12579 memcpy (tmpbuf + first, past_reloc, second);
12580 tmpbuf[first + second] = '\0';
f3c180ae
AM
12581 return tmpbuf;
12582 }
12583
4fa24527
JB
12584 as_bad (_("@%s reloc is not supported with %d-bit output format"),
12585 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
12586 return NULL;
12587 }
12588 }
12589
12590 /* Might be a symbol version string. Don't as_bad here. */
12591 return NULL;
12592}
4e4f7c87 12593#endif
f3c180ae 12594
62ebcb5c 12595bfd_reloc_code_real_type
e3bb37b5 12596x86_cons (expressionS *exp, int size)
f3c180ae 12597{
62ebcb5c
AM
12598 bfd_reloc_code_real_type got_reloc = NO_RELOC;
12599
6b50f5f4
JB
12600 intel_syntax = -intel_syntax;
12601 exp->X_md = 0;
5cc00775 12602 expr_mode = expr_operator_none;
6b50f5f4 12603
2748c1b1
L
12604#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
12605 && !defined (LEX_AT)) \
12606 || defined (TE_PE)
4fa24527 12607 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
12608 {
12609 /* Handle @GOTOFF and the like in an expression. */
12610 char *save;
12611 char *gotfree_input_line;
4a57f2cf 12612 int adjust = 0;
f3c180ae
AM
12613
12614 save = input_line_pointer;
d258b828 12615 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
12616 if (gotfree_input_line)
12617 input_line_pointer = gotfree_input_line;
12618
12619 expression (exp);
12620
12621 if (gotfree_input_line)
12622 {
12623 /* expression () has merrily parsed up to the end of line,
12624 or a comma - in the wrong buffer. Transfer how far
12625 input_line_pointer has moved to the right buffer. */
12626 input_line_pointer = (save
12627 + (input_line_pointer - gotfree_input_line)
12628 + adjust);
12629 free (gotfree_input_line);
3992d3b7
AM
12630 if (exp->X_op == O_constant
12631 || exp->X_op == O_absent
12632 || exp->X_op == O_illegal
0398aac5 12633 || exp->X_op == O_register
3992d3b7
AM
12634 || exp->X_op == O_big)
12635 {
12636 char c = *input_line_pointer;
12637 *input_line_pointer = 0;
12638 as_bad (_("missing or invalid expression `%s'"), save);
12639 *input_line_pointer = c;
12640 }
b9519cfe
L
12641 else if ((got_reloc == BFD_RELOC_386_PLT32
12642 || got_reloc == BFD_RELOC_X86_64_PLT32)
12643 && exp->X_op != O_symbol)
12644 {
12645 char c = *input_line_pointer;
12646 *input_line_pointer = 0;
12647 as_bad (_("invalid PLT expression `%s'"), save);
12648 *input_line_pointer = c;
12649 }
f3c180ae
AM
12650 }
12651 }
12652 else
6b50f5f4 12653#endif
f3c180ae 12654 expression (exp);
ee86248c
JB
12655
12656 intel_syntax = -intel_syntax;
12657
12658 if (intel_syntax)
12659 i386_intel_simplify (exp);
62ebcb5c 12660
a442cac5 12661 /* If not 64bit, massage value, to account for wraparound when !BFD64. */
5cc00775
JB
12662 if (size <= 4 && expr_mode == expr_operator_present
12663 && exp->X_op == O_constant && !object_64bit)
a442cac5
JB
12664 exp->X_add_number = extend_to_32bit_address (exp->X_add_number);
12665
62ebcb5c 12666 return got_reloc;
f3c180ae 12667}
f3c180ae 12668
9f32dd5b
L
12669static void
12670signed_cons (int size)
6482c264 12671{
a442cac5 12672 if (object_64bit)
d182319b
JB
12673 cons_sign = 1;
12674 cons (size);
12675 cons_sign = -1;
6482c264
NC
12676}
12677
edd67638
JB
12678static void
12679s_insn (int dummy ATTRIBUTE_UNUSED)
12680{
393fbe8d 12681 char mnemonic[MAX_MNEM_SIZE], *line = input_line_pointer, *ptr;
edd67638
JB
12682 char *saved_ilp = find_end_of_line (line, false), saved_char;
12683 const char *end;
12684 unsigned int j;
12685 valueT val;
12686 bool vex = false, xop = false, evex = false;
b5482fe5 12687 struct last_insn *last_insn;
edd67638
JB
12688
12689 init_globals ();
12690
12691 saved_char = *saved_ilp;
12692 *saved_ilp = 0;
12693
12694 end = parse_insn (line, mnemonic, true);
12695 if (end == NULL)
12696 {
12697 bad:
12698 *saved_ilp = saved_char;
12699 ignore_rest_of_line ();
d0c2e3ec 12700 i.tm.mnem_off = 0;
edd67638
JB
12701 return;
12702 }
12703 line += end - line;
12704
d3b01414
JB
12705 current_templates.start = &i.tm;
12706 current_templates.end = &i.tm + 1;
edd67638 12707 i.tm.mnem_off = MN__insn;
393fbe8d 12708 i.tm.extension_opcode = None;
edd67638
JB
12709
12710 if (startswith (line, "VEX")
12711 && (line[3] == '.' || is_space_char (line[3])))
12712 {
12713 vex = true;
12714 line += 3;
12715 }
12716 else if (startswith (line, "XOP") && ISDIGIT (line[3]))
12717 {
12718 char *e;
12719 unsigned long n = strtoul (line + 3, &e, 16);
12720
12721 if (e == line + 5 && n >= 0x08 && n <= 0x1f
12722 && (*e == '.' || is_space_char (*e)))
12723 {
12724 xop = true;
d0c2e3ec
JB
12725 /* Arrange for build_vex_prefix() to emit 0x8f. */
12726 i.tm.opcode_space = SPACE_XOP08;
12727 i.insn_opcode_space = n;
edd67638
JB
12728 line = e;
12729 }
12730 }
12731 else if (startswith (line, "EVEX")
12732 && (line[4] == '.' || is_space_char (line[4])))
12733 {
12734 evex = true;
12735 line += 4;
12736 }
12737
12738 if (vex || xop
e346d50a 12739 ? i.encoding == encoding_evex
edd67638 12740 : evex
e346d50a
JB
12741 ? i.encoding == encoding_vex
12742 || i.encoding == encoding_vex3
12743 : i.encoding != encoding_default)
edd67638
JB
12744 {
12745 as_bad (_("pseudo-prefix conflicts with encoding specifier"));
12746 goto bad;
12747 }
12748
e346d50a
JB
12749 if (line > end && i.encoding == encoding_default)
12750 i.encoding = evex ? encoding_evex : encoding_vex;
0ff3b7d0 12751
e346d50a 12752 if (i.encoding != encoding_default)
1adecddd
JB
12753 {
12754 /* Only address size and segment override prefixes are permitted with
12755 VEX/XOP/EVEX encodings. */
12756 const unsigned char *p = i.prefix;
12757
12758 for (j = 0; j < ARRAY_SIZE (i.prefix); ++j, ++p)
12759 {
12760 if (!*p)
12761 continue;
12762
12763 switch (j)
12764 {
12765 case SEG_PREFIX:
12766 case ADDR_PREFIX:
12767 break;
12768 default:
12769 as_bad (_("illegal prefix used with VEX/XOP/EVEX"));
12770 goto bad;
12771 }
12772 }
12773 }
12774
edd67638
JB
12775 if (line > end && *line == '.')
12776 {
d0c2e3ec
JB
12777 /* Length specifier (VEX.L, XOP.L, EVEX.L'L). */
12778 switch (line[1])
12779 {
12780 case 'L':
12781 switch (line[2])
12782 {
12783 case '0':
12784 if (evex)
12785 i.tm.opcode_modifier.evex = EVEX128;
12786 else
12787 i.tm.opcode_modifier.vex = VEX128;
12788 break;
12789
12790 case '1':
12791 if (evex)
12792 i.tm.opcode_modifier.evex = EVEX256;
12793 else
12794 i.tm.opcode_modifier.vex = VEX256;
12795 break;
12796
12797 case '2':
12798 if (evex)
12799 i.tm.opcode_modifier.evex = EVEX512;
12800 break;
12801
12802 case '3':
12803 if (evex)
12804 i.tm.opcode_modifier.evex = EVEX_L3;
12805 break;
12806
12807 case 'I':
12808 if (line[3] == 'G')
12809 {
12810 if (evex)
12811 i.tm.opcode_modifier.evex = EVEXLIG;
12812 else
12813 i.tm.opcode_modifier.vex = VEXScalar; /* LIG */
12814 ++line;
12815 }
12816 break;
12817 }
12818
12819 if (i.tm.opcode_modifier.vex || i.tm.opcode_modifier.evex)
12820 line += 3;
12821 break;
12822
12823 case '1':
12824 if (line[2] == '2' && line[3] == '8')
12825 {
12826 if (evex)
12827 i.tm.opcode_modifier.evex = EVEX128;
12828 else
12829 i.tm.opcode_modifier.vex = VEX128;
12830 line += 4;
12831 }
12832 break;
12833
12834 case '2':
12835 if (line[2] == '5' && line[3] == '6')
12836 {
12837 if (evex)
12838 i.tm.opcode_modifier.evex = EVEX256;
12839 else
12840 i.tm.opcode_modifier.vex = VEX256;
12841 line += 4;
12842 }
12843 break;
12844
12845 case '5':
12846 if (evex && line[2] == '1' && line[3] == '2')
12847 {
12848 i.tm.opcode_modifier.evex = EVEX512;
12849 line += 4;
12850 }
12851 break;
12852 }
12853 }
12854
12855 if (line > end && *line == '.')
12856 {
12857 /* embedded prefix (VEX.pp, XOP.pp, EVEX.pp). */
12858 switch (line[1])
12859 {
12860 case 'N':
12861 if (line[2] == 'P')
12862 line += 3;
12863 break;
12864
12865 case '6':
12866 if (line[2] == '6')
12867 {
12868 i.tm.opcode_modifier.opcodeprefix = PREFIX_0X66;
12869 line += 3;
12870 }
12871 break;
12872
12873 case 'F': case 'f':
12874 if (line[2] == '3')
12875 {
12876 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
12877 line += 3;
12878 }
12879 else if (line[2] == '2')
12880 {
12881 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF2;
12882 line += 3;
12883 }
12884 break;
12885 }
12886 }
12887
12888 if (line > end && !xop && *line == '.')
12889 {
12890 /* Encoding space (VEX.mmmmm, EVEX.mmmm). */
12891 switch (line[1])
12892 {
12893 case '0':
12894 if (TOUPPER (line[2]) != 'F')
12895 break;
12896 if (line[3] == '.' || is_space_char (line[3]))
12897 {
12898 i.insn_opcode_space = SPACE_0F;
12899 line += 3;
12900 }
12901 else if (line[3] == '3'
12902 && (line[4] == '8' || TOUPPER (line[4]) == 'A')
12903 && (line[5] == '.' || is_space_char (line[5])))
12904 {
12905 i.insn_opcode_space = line[4] == '8' ? SPACE_0F38 : SPACE_0F3A;
12906 line += 5;
12907 }
12908 break;
12909
12910 case 'M':
12911 if (ISDIGIT (line[2]) && line[2] != '0')
12912 {
12913 char *e;
12914 unsigned long n = strtoul (line + 2, &e, 10);
12915
12916 if (n <= (evex ? 15 : 31)
12917 && (*e == '.' || is_space_char (*e)))
12918 {
12919 i.insn_opcode_space = n;
12920 line = e;
12921 }
12922 }
12923 break;
12924 }
12925 }
12926
12927 if (line > end && *line == '.' && line[1] == 'W')
12928 {
12929 /* VEX.W, XOP.W, EVEX.W */
12930 switch (line[2])
12931 {
12932 case '0':
12933 i.tm.opcode_modifier.vexw = VEXW0;
12934 break;
12935
12936 case '1':
12937 i.tm.opcode_modifier.vexw = VEXW1;
12938 break;
12939
12940 case 'I':
12941 if (line[3] == 'G')
12942 {
12943 i.tm.opcode_modifier.vexw = VEXWIG;
12944 ++line;
12945 }
12946 break;
12947 }
12948
12949 if (i.tm.opcode_modifier.vexw)
12950 line += 3;
12951 }
12952
12953 if (line > end && *line && !is_space_char (*line))
12954 {
12955 /* Improve diagnostic a little. */
12956 if (*line == '.' && line[1] && !is_space_char (line[1]))
12957 ++line;
12958 goto done;
edd67638
JB
12959 }
12960
393fbe8d
JB
12961 /* Before processing the opcode expression, find trailing "+r" or
12962 "/<digit>" specifiers. */
12963 for (ptr = line; ; ++ptr)
12964 {
12965 unsigned long n;
12966 char *e;
12967
12968 ptr = strpbrk (ptr, "+/,");
12969 if (ptr == NULL || *ptr == ',')
12970 break;
12971
12972 if (*ptr == '+' && ptr[1] == 'r'
12973 && (ptr[2] == ',' || (is_space_char (ptr[2]) && ptr[3] == ',')))
12974 {
12975 *ptr = ' ';
12976 ptr[1] = ' ';
12977 i.short_form = true;
12978 break;
12979 }
12980
12981 if (*ptr == '/' && ISDIGIT (ptr[1])
12982 && (n = strtoul (ptr + 1, &e, 8)) < 8
12983 && e == ptr + 2
12984 && (ptr[2] == ',' || (is_space_char (ptr[2]) && ptr[3] == ',')))
12985 {
12986 *ptr = ' ';
12987 ptr[1] = ' ';
12988 i.tm.extension_opcode = n;
12989 i.tm.opcode_modifier.modrm = 1;
12990 break;
12991 }
12992 }
12993
edd67638
JB
12994 input_line_pointer = line;
12995 val = get_absolute_expression ();
12996 line = input_line_pointer;
12997
393fbe8d
JB
12998 if (i.short_form && (val & 7))
12999 as_warn ("`+r' assumes low three opcode bits to be clear");
13000
edd67638
JB
13001 for (j = 1; j < sizeof(val); ++j)
13002 if (!(val >> (j * 8)))
13003 break;
13004
13005 /* Trim off a prefix if present. */
13006 if (j > 1 && !vex && !xop && !evex)
13007 {
13008 uint8_t byte = val >> ((j - 1) * 8);
13009
13010 switch (byte)
13011 {
13012 case DATA_PREFIX_OPCODE:
13013 case REPE_PREFIX_OPCODE:
13014 case REPNE_PREFIX_OPCODE:
13015 if (!add_prefix (byte))
13016 goto bad;
13017 val &= ((uint64_t)1 << (--j * 8)) - 1;
13018 break;
13019 }
13020 }
13021
6804f42c
JB
13022 /* Parse operands, if any, before evaluating encoding space. */
13023 if (*line == ',')
13024 {
13025 i.memshift = -1;
13026
13027 ptr = parse_operands (line + 1, &i386_mnemonics[MN__insn]);
13028 this_operand = -1;
13029 if (!ptr)
13030 goto bad;
13031 line = ptr;
13032
13033 if (!i.operands)
13034 {
13035 as_bad (_("expecting operand after ','; got nothing"));
13036 goto done;
13037 }
13038
13039 if (i.mem_operands > 1)
13040 {
13041 as_bad (_("too many memory references for `%s'"),
13042 &i386_mnemonics[MN__insn]);
13043 goto done;
13044 }
13045
13046 /* No need to distinguish encoding_evex and encoding_evex512. */
13047 if (i.encoding == encoding_evex512)
13048 i.encoding = encoding_evex;
13049 }
13050
edd67638 13051 /* Trim off encoding space. */
d0c2e3ec 13052 if (j > 1 && !i.insn_opcode_space && (val >> ((j - 1) * 8)) == 0x0f)
edd67638
JB
13053 {
13054 uint8_t byte = val >> ((--j - 1) * 8);
13055
d0c2e3ec 13056 i.insn_opcode_space = SPACE_0F;
6804f42c
JB
13057 switch (byte & -(j > 1 && !i.rex2_encoding
13058 && (i.encoding != encoding_egpr || evex)))
edd67638
JB
13059 {
13060 case 0x38:
d0c2e3ec 13061 i.insn_opcode_space = SPACE_0F38;
edd67638
JB
13062 --j;
13063 break;
13064 case 0x3a:
d0c2e3ec 13065 i.insn_opcode_space = SPACE_0F3A;
edd67638
JB
13066 --j;
13067 break;
13068 }
d0c2e3ec 13069 i.tm.opcode_space = i.insn_opcode_space;
edd67638
JB
13070 val &= ((uint64_t)1 << (j * 8)) - 1;
13071 }
d0c2e3ec
JB
13072 if (!i.tm.opcode_space && (vex || evex))
13073 /* Arrange for build_vex_prefix() to properly emit 0xC4/0xC5.
13074 Also avoid hitting abort() there or in build_evex_prefix(). */
13075 i.tm.opcode_space = i.insn_opcode_space == SPACE_0F ? SPACE_0F
13076 : SPACE_0F38;
edd67638
JB
13077
13078 if (j > 2)
13079 {
13080 as_bad (_("opcode residual (%#"PRIx64") too wide"), (uint64_t) val);
6804f42c 13081 goto done;
edd67638
JB
13082 }
13083 i.opcode_length = j;
0ff3b7d0
JB
13084
13085 /* Handle operands, if any. */
6804f42c 13086 if (i.operands)
0ff3b7d0
JB
13087 {
13088 i386_operand_type combined;
f7377a91 13089 expressionS *disp_exp = NULL;
0ff3b7d0
JB
13090 bool changed;
13091
eb3f3841
JB
13092 if (i.encoding == encoding_egpr)
13093 {
13094 if (vex || xop)
13095 {
13096 as_bad (_("eGPR use conflicts with encoding specifier"));
13097 goto done;
13098 }
13099 if (evex)
13100 i.encoding = encoding_evex;
13101 else
13102 i.encoding = encoding_default;
13103 }
13104
0ff3b7d0
JB
13105 /* Are we to emit ModR/M encoding? */
13106 if (!i.short_form
13107 && (i.mem_operands
e346d50a 13108 || i.reg_operands > (i.encoding != encoding_default)
0ff3b7d0
JB
13109 || i.tm.extension_opcode != None))
13110 i.tm.opcode_modifier.modrm = 1;
13111
13112 if (!i.tm.opcode_modifier.modrm
13113 && (i.reg_operands
e346d50a 13114 > i.short_form + 0U + (i.encoding != encoding_default)
0ff3b7d0
JB
13115 || i.mem_operands))
13116 {
13117 as_bad (_("too many register/memory operands"));
13118 goto done;
13119 }
13120
13121 /* Enforce certain constraints on operands. */
13122 switch (i.reg_operands + i.mem_operands
13123 + (i.tm.extension_opcode != None))
13124 {
13125 case 0:
13126 if (i.short_form)
13127 {
13128 as_bad (_("too few register/memory operands"));
13129 goto done;
13130 }
13131 /* Fall through. */
13132 case 1:
13133 if (i.tm.opcode_modifier.modrm)
13134 {
13135 as_bad (_("too few register/memory operands"));
13136 goto done;
13137 }
13138 break;
13139
13140 case 2:
13141 break;
13142
13143 case 4:
13144 if (i.imm_operands
13145 && (i.op[0].imms->X_op != O_constant
13146 || !fits_in_imm4 (i.op[0].imms->X_add_number)))
13147 {
13148 as_bad (_("constant doesn't fit in %d bits"), evex ? 3 : 4);
13149 goto done;
13150 }
13151 /* Fall through. */
13152 case 3:
e346d50a 13153 if (i.encoding != encoding_default)
0ff3b7d0
JB
13154 {
13155 i.tm.opcode_modifier.vexvvvv = 1;
13156 break;
13157 }
13158 /* Fall through. */
13159 default:
13160 as_bad (_("too many register/memory operands"));
13161 goto done;
13162 }
13163
13164 /* Bring operands into canonical order (imm, mem, reg). */
13165 do
13166 {
13167 changed = false;
13168
13169 for (j = 1; j < i.operands; ++j)
13170 {
13171 if ((!operand_type_check (i.types[j - 1], imm)
13172 && operand_type_check (i.types[j], imm))
13173 || (i.types[j - 1].bitfield.class != ClassNone
13174 && i.types[j].bitfield.class == ClassNone))
13175 {
13176 swap_2_operands (j - 1, j);
13177 changed = true;
13178 }
13179 }
13180 }
13181 while (changed);
13182
13183 /* For Intel syntax swap the order of register operands. */
13184 if (intel_syntax)
13185 switch (i.reg_operands)
13186 {
13187 case 0:
13188 case 1:
13189 break;
13190
13191 case 4:
13192 swap_2_operands (i.imm_operands + i.mem_operands + 1, i.operands - 2);
13193 /* Fall through. */
13194 case 3:
13195 case 2:
13196 swap_2_operands (i.imm_operands + i.mem_operands, i.operands - 1);
13197 break;
13198
13199 default:
13200 abort ();
13201 }
13202
13203 /* Enforce constraints when using VSIB. */
13204 if (i.index_reg
13205 && (i.index_reg->reg_type.bitfield.xmmword
13206 || i.index_reg->reg_type.bitfield.ymmword
13207 || i.index_reg->reg_type.bitfield.zmmword))
13208 {
e346d50a 13209 if (i.encoding == encoding_default)
0ff3b7d0
JB
13210 {
13211 as_bad (_("VSIB unavailable with legacy encoding"));
13212 goto done;
13213 }
13214
e346d50a 13215 if (i.encoding == encoding_evex
0ff3b7d0
JB
13216 && i.reg_operands > 1)
13217 {
13218 /* We could allow two register operands, encoding the 2nd one in
13219 an 8-bit immediate like for 4-register-operand insns, but that
13220 would require ugly fiddling with process_operands() and/or
13221 build_modrm_byte(). */
13222 as_bad (_("too many register operands with VSIB"));
13223 goto done;
13224 }
13225
13226 i.tm.opcode_modifier.sib = 1;
13227 }
13228
13229 /* Establish operand size encoding. */
13230 operand_type_set (&combined, 0);
f7377a91 13231
0ff3b7d0
JB
13232 for (j = i.imm_operands; j < i.operands; ++j)
13233 {
3e4a511b 13234 /* Look for 8-bit operands that use old registers. */
e346d50a 13235 if (i.encoding != encoding_default
3e4a511b
JB
13236 && flag_code == CODE_64BIT
13237 && i.types[j].bitfield.class == Reg
13238 && i.types[j].bitfield.byte
13239 && !(i.op[j].regs->reg_flags & RegRex64)
13240 && i.op[j].regs->reg_num > 3)
13241 as_bad (_("can't encode register '%s%s' with VEX/XOP/EVEX"),
13242 register_prefix, i.op[j].regs->reg_name);
13243
0ff3b7d0
JB
13244 i.types[j].bitfield.instance = InstanceNone;
13245
13246 if (operand_type_check (i.types[j], disp))
f7377a91
JB
13247 {
13248 i.types[j].bitfield.baseindex = 1;
13249 disp_exp = i.op[j].disps;
13250 }
13251
13252 if (evex && i.types[j].bitfield.baseindex)
13253 {
13254 unsigned int n = i.memshift;
13255
13256 if (i.types[j].bitfield.byte)
13257 n = 0;
13258 else if (i.types[j].bitfield.word)
13259 n = 1;
13260 else if (i.types[j].bitfield.dword)
13261 n = 2;
13262 else if (i.types[j].bitfield.qword)
13263 n = 3;
13264 else if (i.types[j].bitfield.xmmword)
13265 n = 4;
13266 else if (i.types[j].bitfield.ymmword)
13267 n = 5;
13268 else if (i.types[j].bitfield.zmmword)
13269 n = 6;
13270
13271 if (i.memshift < 32 && n != i.memshift)
13272 as_warn ("conflicting memory operand size specifiers");
13273 i.memshift = n;
13274 }
0ff3b7d0
JB
13275
13276 if ((i.broadcast.type || i.broadcast.bytes)
13277 && j == i.broadcast.operand)
13278 continue;
13279
13280 combined = operand_type_or (combined, i.types[j]);
13281 combined.bitfield.class = ClassNone;
13282 }
13283
f7377a91
JB
13284 switch ((i.broadcast.type ? i.broadcast.type : 1)
13285 << (i.memshift < 32 ? i.memshift : 0))
13286 {
13287 case 64: combined.bitfield.zmmword = 1; break;
13288 case 32: combined.bitfield.ymmword = 1; break;
13289 case 16: combined.bitfield.xmmword = 1; break;
13290 case 8: combined.bitfield.qword = 1; break;
13291 case 4: combined.bitfield.dword = 1; break;
13292 }
13293
e346d50a 13294 if (i.encoding == encoding_default)
0ff3b7d0
JB
13295 {
13296 if (flag_code == CODE_64BIT && combined.bitfield.qword)
13297 i.rex |= REX_W;
13298 else if ((flag_code == CODE_16BIT ? combined.bitfield.dword
13299 : combined.bitfield.word)
13300 && !add_prefix (DATA_PREFIX_OPCODE))
13301 goto done;
13302 }
13303 else if (!i.tm.opcode_modifier.vexw)
13304 {
13305 if (flag_code == CODE_64BIT)
13306 {
13307 if (combined.bitfield.qword)
13308 i.tm.opcode_modifier.vexw = VEXW1;
13309 else if (combined.bitfield.dword)
13310 i.tm.opcode_modifier.vexw = VEXW0;
13311 }
13312
13313 if (!i.tm.opcode_modifier.vexw)
13314 i.tm.opcode_modifier.vexw = VEXWIG;
13315 }
13316
13317 if (vex || xop)
13318 {
13319 if (!i.tm.opcode_modifier.vex)
13320 {
13321 if (combined.bitfield.ymmword)
13322 i.tm.opcode_modifier.vex = VEX256;
13323 else if (combined.bitfield.xmmword)
13324 i.tm.opcode_modifier.vex = VEX128;
13325 }
13326 }
13327 else if (evex)
13328 {
13329 if (!i.tm.opcode_modifier.evex)
13330 {
13331 /* Do _not_ consider AVX512VL here. */
13332 if (i.rounding.type != rc_none || combined.bitfield.zmmword)
13333 i.tm.opcode_modifier.evex = EVEX512;
13334 else if (combined.bitfield.ymmword)
13335 i.tm.opcode_modifier.evex = EVEX256;
13336 else if (combined.bitfield.xmmword)
13337 i.tm.opcode_modifier.evex = EVEX128;
13338 }
f7377a91
JB
13339
13340 if (i.memshift >= 32)
13341 {
13342 unsigned int n = 0;
13343
13344 switch (i.tm.opcode_modifier.evex)
13345 {
13346 case EVEX512: n = 64; break;
13347 case EVEX256: n = 32; break;
13348 case EVEX128: n = 16; break;
13349 }
13350
13351 if (i.broadcast.type)
13352 n /= i.broadcast.type;
13353
13354 if (n > 0)
13355 for (i.memshift = 0; !(n & 1); n >>= 1)
13356 ++i.memshift;
13357 else if (disp_exp != NULL && disp_exp->X_op == O_constant
13358 && disp_exp->X_add_number != 0
13359 && i.disp_encoding != disp_encoding_32bit)
13360 {
13361 if (!quiet_warnings)
13362 as_warn ("cannot determine memory operand size");
13363 i.disp_encoding = disp_encoding_32bit;
13364 }
13365 }
0ff3b7d0
JB
13366 }
13367
f7377a91
JB
13368 if (i.memshift >= 32)
13369 i.memshift = 0;
13370 else if (!evex)
e346d50a 13371 i.encoding = encoding_error;
f7377a91 13372
0ff3b7d0
JB
13373 if (i.disp_operands && !optimize_disp (&i.tm))
13374 goto done;
13375
c032bc4f
JB
13376 /* Establish size for immediate operands. */
13377 for (j = 0; j < i.imm_operands; ++j)
13378 {
13379 expressionS *expP = i.op[j].imms;
13380
13381 gas_assert (operand_type_check (i.types[j], imm));
13382 operand_type_set (&i.types[j], 0);
13383
13384 if (i.imm_bits[j] > 32)
13385 i.types[j].bitfield.imm64 = 1;
13386 else if (i.imm_bits[j] > 16)
13387 {
13388 if (flag_code == CODE_64BIT && (i.flags[j] & Operand_Signed))
13389 i.types[j].bitfield.imm32s = 1;
13390 else
13391 i.types[j].bitfield.imm32 = 1;
13392 }
13393 else if (i.imm_bits[j] > 8)
13394 i.types[j].bitfield.imm16 = 1;
13395 else if (i.imm_bits[j] > 0)
13396 {
13397 if (i.flags[j] & Operand_Signed)
13398 i.types[j].bitfield.imm8s = 1;
13399 else
13400 i.types[j].bitfield.imm8 = 1;
13401 }
13402 else if (expP->X_op == O_constant)
13403 {
13404 i.types[j] = smallest_imm_type (expP->X_add_number);
13405 i.types[j].bitfield.imm1 = 0;
13406 /* Oddly enough imm_size() checks imm64 first, so the bit needs
13407 zapping since smallest_imm_type() sets it unconditionally. */
13408 if (flag_code != CODE_64BIT)
13409 {
13410 i.types[j].bitfield.imm64 = 0;
13411 i.types[j].bitfield.imm32s = 0;
13412 i.types[j].bitfield.imm32 = 1;
13413 }
13414 else if (i.types[j].bitfield.imm32 || i.types[j].bitfield.imm32s)
13415 i.types[j].bitfield.imm64 = 0;
13416 }
13417 else
13418 /* Non-constant expressions are sized heuristically. */
13419 switch (flag_code)
13420 {
13421 case CODE_64BIT: i.types[j].bitfield.imm32s = 1; break;
13422 case CODE_32BIT: i.types[j].bitfield.imm32 = 1; break;
13423 case CODE_16BIT: i.types[j].bitfield.imm16 = 1; break;
13424 }
13425 }
13426
0ff3b7d0
JB
13427 for (j = 0; j < i.operands; ++j)
13428 i.tm.operand_types[j] = i.types[j];
13429
13430 process_operands ();
13431 }
13432
13433 /* Don't set opcode until after processing operands, to avoid any
13434 potential special casing there. */
13435 i.tm.base_opcode |= val;
13436
e346d50a
JB
13437 if (i.encoding == encoding_error
13438 || (i.encoding != encoding_evex
0ff3b7d0
JB
13439 ? i.broadcast.type || i.broadcast.bytes
13440 || i.rounding.type != rc_none
13441 || i.mask.reg
f586e340
JB
13442 : (i.mem_operands && i.rounding.type != rc_none)
13443 || ((i.broadcast.type || i.broadcast.bytes)
13444 && !(i.flags[i.broadcast.operand] & Operand_Mem))))
0ff3b7d0
JB
13445 {
13446 as_bad (_("conflicting .insn operands"));
13447 goto done;
13448 }
edd67638 13449
d0c2e3ec
JB
13450 if (vex || xop)
13451 {
13452 if (!i.tm.opcode_modifier.vex)
13453 i.tm.opcode_modifier.vex = VEXScalar; /* LIG */
13454
13455 build_vex_prefix (NULL);
13456 i.rex &= REX_OPCODE;
13457 }
13458 else if (evex)
13459 {
13460 if (!i.tm.opcode_modifier.evex)
13461 i.tm.opcode_modifier.evex = EVEXLIG;
13462
13463 build_evex_prefix ();
13464 i.rex &= REX_OPCODE;
13465 }
ce705688
JB
13466 else
13467 establish_rex ();
d0c2e3ec 13468
b5482fe5
JB
13469 last_insn = &seg_info(now_seg)->tc_segment_info_data.last_insn;
13470 output_insn (last_insn);
13471 last_insn->kind = last_insn_directive;
13472 last_insn->name = ".insn directive";
13473 last_insn->file = as_where (&last_insn->line);
edd67638 13474
c7defc53
IB
13475#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
13476 /* PS: SCFI is enabled only for System V AMD64 ABI. The ABI check has been
13477 performed in i386_target_format. */
13478 if (IS_ELF && flag_synth_cfi)
13479 as_bad (_("SCFI: hand-crafting instructions not supported"));
13480#endif
13481
d0c2e3ec 13482 done:
edd67638
JB
13483 *saved_ilp = saved_char;
13484 input_line_pointer = line;
13485
13486 demand_empty_rest_of_line ();
d0c2e3ec
JB
13487
13488 /* Make sure dot_insn() won't yield "true" anymore. */
13489 i.tm.mnem_off = 0;
edd67638
JB
13490}
13491
d182319b 13492#ifdef TE_PE
6482c264 13493static void
7016a5d5 13494pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
13495{
13496 expressionS exp;
13497
13498 do
13499 {
13500 expression (&exp);
13501 if (exp.X_op == O_symbol)
13502 exp.X_op = O_secrel;
13503
13504 emit_expr (&exp, 4);
13505 }
13506 while (*input_line_pointer++ == ',');
13507
13508 input_line_pointer--;
13509 demand_empty_rest_of_line ();
13510}
145667f8
MH
13511
13512static void
13513pe_directive_secidx (int dummy ATTRIBUTE_UNUSED)
13514{
13515 expressionS exp;
13516
13517 do
13518 {
13519 expression (&exp);
13520 if (exp.X_op == O_symbol)
13521 exp.X_op = O_secidx;
13522
13523 emit_expr (&exp, 2);
13524 }
13525 while (*input_line_pointer++ == ',');
13526
13527 input_line_pointer--;
13528 demand_empty_rest_of_line ();
13529}
6482c264
NC
13530#endif
13531
7063667e
JB
13532/* Handle Rounding Control / SAE specifiers. */
13533
13534static char *
13535RC_SAE_specifier (const char *pstr)
13536{
13537 unsigned int j;
13538
13539 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
13540 {
13541 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
13542 {
13543 if (i.rounding.type != rc_none)
13544 {
13545 as_bad (_("duplicated `{%s}'"), RC_NamesTable[j].name);
13546 return NULL;
13547 }
13548
eb3f3841
JB
13549 switch (i.encoding)
13550 {
13551 case encoding_default:
13552 case encoding_egpr:
13553 i.encoding = encoding_evex512;
13554 break;
13555 case encoding_evex:
13556 case encoding_evex512:
13557 break;
13558 default:
13559 return NULL;
13560 }
a6f3add0 13561
7063667e
JB
13562 i.rounding.type = RC_NamesTable[j].type;
13563
13564 return (char *)(pstr + RC_NamesTable[j].len);
13565 }
13566 }
13567
13568 return NULL;
13569}
13570
43234a1e
L
13571/* Handle Vector operations. */
13572
13573static char *
f70c6814 13574check_VecOperations (char *op_string)
43234a1e
L
13575{
13576 const reg_entry *mask;
13577 const char *saved;
13578 char *end_op;
13579
f70c6814 13580 while (*op_string)
43234a1e
L
13581 {
13582 saved = op_string;
13583 if (*op_string == '{')
13584 {
13585 op_string++;
13586
13587 /* Check broadcasts. */
d34049e8 13588 if (startswith (op_string, "1to"))
43234a1e 13589 {
5273a3cd 13590 unsigned int bcst_type;
43234a1e 13591
5273a3cd 13592 if (i.broadcast.type)
43234a1e
L
13593 goto duplicated_vec_op;
13594
13595 op_string += 3;
13596 if (*op_string == '8')
8e6e0792 13597 bcst_type = 8;
b28d1bda 13598 else if (*op_string == '4')
8e6e0792 13599 bcst_type = 4;
b28d1bda 13600 else if (*op_string == '2')
8e6e0792 13601 bcst_type = 2;
43234a1e
L
13602 else if (*op_string == '1'
13603 && *(op_string+1) == '6')
13604 {
8e6e0792 13605 bcst_type = 16;
43234a1e
L
13606 op_string++;
13607 }
0cc78721
CL
13608 else if (*op_string == '3'
13609 && *(op_string+1) == '2')
13610 {
13611 bcst_type = 32;
13612 op_string++;
13613 }
43234a1e
L
13614 else
13615 {
13616 as_bad (_("Unsupported broadcast: `%s'"), saved);
13617 return NULL;
13618 }
13619 op_string++;
13620
eb3f3841
JB
13621 switch (i.encoding)
13622 {
13623 case encoding_default:
13624 case encoding_egpr:
13625 i.encoding = encoding_evex;
13626 break;
13627 case encoding_evex:
13628 case encoding_evex512:
13629 break;
13630 default:
13631 goto unknown_vec_op;
13632 }
a6f3add0 13633
5273a3cd
JB
13634 i.broadcast.type = bcst_type;
13635 i.broadcast.operand = this_operand;
f7377a91
JB
13636
13637 /* For .insn a data size specifier may be appended. */
13638 if (dot_insn () && *op_string == ':')
13639 goto dot_insn_modifier;
13640 }
13641 /* Check .insn special cases. */
13642 else if (dot_insn () && *op_string == ':')
13643 {
13644 dot_insn_modifier:
c032bc4f 13645 switch (op_string[1])
f7377a91
JB
13646 {
13647 unsigned long n;
13648
c032bc4f 13649 case 'd':
f7377a91
JB
13650 if (i.memshift < 32)
13651 goto duplicated_vec_op;
13652
13653 n = strtoul (op_string + 2, &end_op, 0);
13654 if (n)
13655 for (i.memshift = 0; !(n & 1); n >>= 1)
13656 ++i.memshift;
13657 if (i.memshift < 32 && n == 1)
13658 op_string = end_op;
c032bc4f
JB
13659 break;
13660
13661 case 's': case 'u':
13662 /* This isn't really a "vector" operation, but a sign/size
13663 specifier for immediate operands of .insn. Note that AT&T
13664 syntax handles the same in i386_immediate(). */
13665 if (!intel_syntax)
13666 break;
13667
13668 if (i.imm_bits[this_operand])
13669 goto duplicated_vec_op;
13670
13671 n = strtoul (op_string + 2, &end_op, 0);
13672 if (n && n <= (flag_code == CODE_64BIT ? 64 : 32))
13673 {
13674 i.imm_bits[this_operand] = n;
13675 if (op_string[1] == 's')
13676 i.flags[this_operand] |= Operand_Signed;
13677 op_string = end_op;
13678 }
13679 break;
f7377a91 13680 }
43234a1e
L
13681 }
13682 /* Check masking operation. */
13683 else if ((mask = parse_register (op_string, &end_op)) != NULL)
13684 {
8a6fb3f9
JB
13685 if (mask == &bad_reg)
13686 return NULL;
13687
43234a1e 13688 /* k0 can't be used for write mask. */
f74a6307 13689 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 13690 {
6d2cd6b2
JB
13691 as_bad (_("`%s%s' can't be used for write mask"),
13692 register_prefix, mask->reg_name);
43234a1e
L
13693 return NULL;
13694 }
13695
6225c532 13696 if (!i.mask.reg)
43234a1e 13697 {
6225c532
JB
13698 i.mask.reg = mask;
13699 i.mask.operand = this_operand;
43234a1e 13700 }
6225c532
JB
13701 else if (i.mask.reg->reg_num)
13702 goto duplicated_vec_op;
43234a1e
L
13703 else
13704 {
6225c532 13705 i.mask.reg = mask;
43234a1e
L
13706
13707 /* Only "{z}" is allowed here. No need to check
13708 zeroing mask explicitly. */
6225c532 13709 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
13710 {
13711 as_bad (_("invalid write mask `%s'"), saved);
13712 return NULL;
13713 }
13714 }
13715
13716 op_string = end_op;
13717 }
13718 /* Check zeroing-flag for masking operation. */
13719 else if (*op_string == 'z')
13720 {
6225c532 13721 if (!i.mask.reg)
43234a1e 13722 {
6225c532
JB
13723 i.mask.reg = reg_k0;
13724 i.mask.zeroing = 1;
13725 i.mask.operand = this_operand;
43234a1e
L
13726 }
13727 else
13728 {
6225c532 13729 if (i.mask.zeroing)
43234a1e
L
13730 {
13731 duplicated_vec_op:
13732 as_bad (_("duplicated `%s'"), saved);
13733 return NULL;
13734 }
13735
6225c532 13736 i.mask.zeroing = 1;
43234a1e
L
13737
13738 /* Only "{%k}" is allowed here. No need to check mask
13739 register explicitly. */
6225c532 13740 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
13741 {
13742 as_bad (_("invalid zeroing-masking `%s'"),
13743 saved);
13744 return NULL;
13745 }
13746 }
13747
13748 op_string++;
13749 }
7063667e
JB
13750 else if (intel_syntax
13751 && (op_string = RC_SAE_specifier (op_string)) != NULL)
13752 i.rounding.modifier = true;
43234a1e
L
13753 else
13754 goto unknown_vec_op;
13755
13756 if (*op_string != '}')
13757 {
13758 as_bad (_("missing `}' in `%s'"), saved);
13759 return NULL;
13760 }
13761 op_string++;
0ba3a731
L
13762
13763 /* Strip whitespace since the addition of pseudo prefixes
13764 changed how the scrubber treats '{'. */
13765 if (is_space_char (*op_string))
13766 ++op_string;
13767
43234a1e
L
13768 continue;
13769 }
13770 unknown_vec_op:
13771 /* We don't know this one. */
13772 as_bad (_("unknown vector operation: `%s'"), saved);
13773 return NULL;
13774 }
13775
6225c532 13776 if (i.mask.reg && i.mask.zeroing && !i.mask.reg->reg_num)
6d2cd6b2
JB
13777 {
13778 as_bad (_("zeroing-masking only allowed with write mask"));
13779 return NULL;
13780 }
13781
43234a1e
L
13782 return op_string;
13783}
13784
252b5132 13785static int
70e41ade 13786i386_immediate (char *imm_start)
252b5132
RH
13787{
13788 char *save_input_line_pointer;
f3c180ae 13789 char *gotfree_input_line;
252b5132 13790 segT exp_seg = 0;
47926f60 13791 expressionS *exp;
40fb9820
L
13792 i386_operand_type types;
13793
0dfbf9d7 13794 operand_type_set (&types, ~0);
252b5132
RH
13795
13796 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
13797 {
31b2323c
L
13798 as_bad (_("at most %d immediate operands are allowed"),
13799 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
13800 return 0;
13801 }
13802
13803 exp = &im_expressions[i.imm_operands++];
520dc8e8 13804 i.op[this_operand].imms = exp;
252b5132
RH
13805
13806 if (is_space_char (*imm_start))
13807 ++imm_start;
13808
13809 save_input_line_pointer = input_line_pointer;
13810 input_line_pointer = imm_start;
13811
d258b828 13812 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
13813 if (gotfree_input_line)
13814 input_line_pointer = gotfree_input_line;
252b5132 13815
5cc00775 13816 expr_mode = expr_operator_none;
252b5132
RH
13817 exp_seg = expression (exp);
13818
c032bc4f
JB
13819 /* For .insn immediates there may be a size specifier. */
13820 if (dot_insn () && *input_line_pointer == '{' && input_line_pointer[1] == ':'
13821 && (input_line_pointer[2] == 's' || input_line_pointer[2] == 'u'))
13822 {
13823 char *e;
13824 unsigned long n = strtoul (input_line_pointer + 3, &e, 0);
13825
13826 if (*e == '}' && n && n <= (flag_code == CODE_64BIT ? 64 : 32))
13827 {
13828 i.imm_bits[this_operand] = n;
13829 if (input_line_pointer[2] == 's')
13830 i.flags[this_operand] |= Operand_Signed;
13831 input_line_pointer = e + 1;
13832 }
13833 }
13834
83183c0c 13835 SKIP_WHITESPACE ();
252b5132 13836 if (*input_line_pointer)
f3c180ae 13837 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
13838
13839 input_line_pointer = save_input_line_pointer;
f3c180ae 13840 if (gotfree_input_line)
ee86248c
JB
13841 {
13842 free (gotfree_input_line);
13843
9aac24b1 13844 if (exp->X_op == O_constant)
ee86248c
JB
13845 exp->X_op = O_illegal;
13846 }
13847
9aac24b1
JB
13848 if (exp_seg == reg_section)
13849 {
13850 as_bad (_("illegal immediate register operand %s"), imm_start);
13851 return 0;
13852 }
13853
ee86248c
JB
13854 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
13855}
252b5132 13856
ee86248c
JB
13857static int
13858i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
13859 i386_operand_type types, const char *imm_start)
13860{
13861 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 13862 {
313c53d1
L
13863 if (imm_start)
13864 as_bad (_("missing or invalid immediate expression `%s'"),
13865 imm_start);
3992d3b7 13866 return 0;
252b5132 13867 }
3e73aa7c 13868 else if (exp->X_op == O_constant)
252b5132 13869 {
47926f60 13870 /* Size it properly later. */
40fb9820 13871 i.types[this_operand].bitfield.imm64 = 1;
a442cac5
JB
13872
13873 /* If not 64bit, sign/zero extend val, to account for wraparound
13874 when !BFD64. */
5cc00775
JB
13875 if (expr_mode == expr_operator_present
13876 && flag_code != CODE_64BIT && !object_64bit)
a442cac5 13877 exp->X_add_number = extend_to_32bit_address (exp->X_add_number);
252b5132 13878 }
4c63da97 13879#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 13880 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 13881 && exp_seg != absolute_section
47926f60 13882 && exp_seg != text_section
24eab124
AM
13883 && exp_seg != data_section
13884 && exp_seg != bss_section
13885 && exp_seg != undefined_section
f86103b7 13886 && !bfd_is_com_section (exp_seg))
252b5132 13887 {
d0b47220 13888 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
13889 return 0;
13890 }
13891#endif
13892 else
13893 {
13894 /* This is an address. The size of the address will be
24eab124 13895 determined later, depending on destination register,
3e73aa7c 13896 suffix, or the default for the section. */
40fb9820
L
13897 i.types[this_operand].bitfield.imm8 = 1;
13898 i.types[this_operand].bitfield.imm16 = 1;
13899 i.types[this_operand].bitfield.imm32 = 1;
13900 i.types[this_operand].bitfield.imm32s = 1;
13901 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
13902 i.types[this_operand] = operand_type_and (i.types[this_operand],
13903 types);
252b5132
RH
13904 }
13905
13906 return 1;
13907}
13908
551c1ca1 13909static char *
e3bb37b5 13910i386_scale (char *scale)
252b5132 13911{
551c1ca1
AM
13912 offsetT val;
13913 char *save = input_line_pointer;
252b5132 13914
551c1ca1
AM
13915 input_line_pointer = scale;
13916 val = get_absolute_expression ();
13917
13918 switch (val)
252b5132 13919 {
551c1ca1 13920 case 1:
252b5132
RH
13921 i.log2_scale_factor = 0;
13922 break;
551c1ca1 13923 case 2:
252b5132
RH
13924 i.log2_scale_factor = 1;
13925 break;
551c1ca1 13926 case 4:
252b5132
RH
13927 i.log2_scale_factor = 2;
13928 break;
551c1ca1 13929 case 8:
252b5132
RH
13930 i.log2_scale_factor = 3;
13931 break;
13932 default:
a724f0f4
JB
13933 {
13934 char sep = *input_line_pointer;
13935
13936 *input_line_pointer = '\0';
13937 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
13938 scale);
13939 *input_line_pointer = sep;
13940 input_line_pointer = save;
13941 return NULL;
13942 }
252b5132 13943 }
29b0f896 13944 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
13945 {
13946 as_warn (_("scale factor of %d without an index register"),
24eab124 13947 1 << i.log2_scale_factor);
252b5132 13948 i.log2_scale_factor = 0;
252b5132 13949 }
551c1ca1
AM
13950 scale = input_line_pointer;
13951 input_line_pointer = save;
13952 return scale;
252b5132
RH
13953}
13954
252b5132 13955static int
e3bb37b5 13956i386_displacement (char *disp_start, char *disp_end)
252b5132 13957{
29b0f896 13958 expressionS *exp;
252b5132
RH
13959 segT exp_seg = 0;
13960 char *save_input_line_pointer;
f3c180ae 13961 char *gotfree_input_line;
40fb9820
L
13962 int override;
13963 i386_operand_type bigdisp, types = anydisp;
3992d3b7 13964 int ret;
252b5132 13965
31b2323c
L
13966 if (i.disp_operands == MAX_MEMORY_OPERANDS)
13967 {
13968 as_bad (_("at most %d displacement operands are allowed"),
13969 MAX_MEMORY_OPERANDS);
13970 return 0;
13971 }
13972
0dfbf9d7 13973 operand_type_set (&bigdisp, 0);
6f2f06be 13974 if (i.jumpabsolute
48bcea9f 13975 || i.types[this_operand].bitfield.baseindex
d3b01414
JB
13976 || (current_templates.start->opcode_modifier.jump != JUMP
13977 && current_templates.start->opcode_modifier.jump != JUMP_DWORD))
e05278af 13978 {
48bcea9f 13979 i386_addressing_mode ();
e05278af 13980 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
13981 if (flag_code == CODE_64BIT)
13982 {
a775efc8 13983 bigdisp.bitfield.disp32 = 1;
40fb9820 13984 if (!override)
a775efc8 13985 bigdisp.bitfield.disp64 = 1;
40fb9820
L
13986 }
13987 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 13988 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
13989 else
13990 bigdisp.bitfield.disp32 = 1;
e05278af
JB
13991 }
13992 else
13993 {
376cd056
JB
13994 /* For PC-relative branches, the width of the displacement may be
13995 dependent upon data size, but is never dependent upon address size.
13996 Also make sure to not unintentionally match against a non-PC-relative
13997 branch template. */
d3b01414 13998 const insn_template *t = current_templates.start;
5b7c81bd 13999 bool has_intel64 = false;
376cd056 14000
d3b01414 14001 while (++t < current_templates.end)
376cd056
JB
14002 {
14003 if (t->opcode_modifier.jump
d3b01414 14004 != current_templates.start->opcode_modifier.jump)
376cd056 14005 break;
4b5aaf5f 14006 if ((t->opcode_modifier.isa64 >= INTEL64))
5b7c81bd 14007 has_intel64 = true;
376cd056 14008 }
d3b01414 14009 current_templates.end = t;
376cd056 14010
e05278af 14011 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
14012 if (flag_code == CODE_64BIT)
14013 {
376cd056
JB
14014 if ((override || i.suffix == WORD_MNEM_SUFFIX)
14015 && (!intel64 || !has_intel64))
40fb9820
L
14016 bigdisp.bitfield.disp16 = 1;
14017 else
a775efc8 14018 bigdisp.bitfield.disp32 = 1;
40fb9820
L
14019 }
14020 else
e05278af
JB
14021 {
14022 if (!override)
14023 override = (i.suffix == (flag_code != CODE_16BIT
14024 ? WORD_MNEM_SUFFIX
14025 : LONG_MNEM_SUFFIX));
40fb9820
L
14026 bigdisp.bitfield.disp32 = 1;
14027 if ((flag_code == CODE_16BIT) ^ override)
14028 {
14029 bigdisp.bitfield.disp32 = 0;
14030 bigdisp.bitfield.disp16 = 1;
14031 }
e05278af 14032 }
e05278af 14033 }
c6fb90c8
L
14034 i.types[this_operand] = operand_type_or (i.types[this_operand],
14035 bigdisp);
252b5132
RH
14036
14037 exp = &disp_expressions[i.disp_operands];
520dc8e8 14038 i.op[this_operand].disps = exp;
252b5132
RH
14039 i.disp_operands++;
14040 save_input_line_pointer = input_line_pointer;
14041 input_line_pointer = disp_start;
14042 END_STRING_AND_SAVE (disp_end);
14043
14044#ifndef GCC_ASM_O_HACK
14045#define GCC_ASM_O_HACK 0
14046#endif
14047#if GCC_ASM_O_HACK
14048 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 14049 if (i.types[this_operand].bitfield.baseIndex
24eab124 14050 && displacement_string_end[-1] == '+')
252b5132
RH
14051 {
14052 /* This hack is to avoid a warning when using the "o"
24eab124
AM
14053 constraint within gcc asm statements.
14054 For instance:
14055
14056 #define _set_tssldt_desc(n,addr,limit,type) \
14057 __asm__ __volatile__ ( \
14058 "movw %w2,%0\n\t" \
14059 "movw %w1,2+%0\n\t" \
14060 "rorl $16,%1\n\t" \
14061 "movb %b1,4+%0\n\t" \
14062 "movb %4,5+%0\n\t" \
14063 "movb $0,6+%0\n\t" \
14064 "movb %h1,7+%0\n\t" \
14065 "rorl $16,%1" \
14066 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
14067
14068 This works great except that the output assembler ends
14069 up looking a bit weird if it turns out that there is
14070 no offset. You end up producing code that looks like:
14071
14072 #APP
14073 movw $235,(%eax)
14074 movw %dx,2+(%eax)
14075 rorl $16,%edx
14076 movb %dl,4+(%eax)
14077 movb $137,5+(%eax)
14078 movb $0,6+(%eax)
14079 movb %dh,7+(%eax)
14080 rorl $16,%edx
14081 #NO_APP
14082
47926f60 14083 So here we provide the missing zero. */
24eab124
AM
14084
14085 *displacement_string_end = '0';
252b5132
RH
14086 }
14087#endif
d258b828 14088 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
14089 if (gotfree_input_line)
14090 input_line_pointer = gotfree_input_line;
252b5132 14091
5cc00775 14092 expr_mode = expr_operator_none;
24eab124 14093 exp_seg = expression (exp);
252b5132 14094
636c26b0
AM
14095 SKIP_WHITESPACE ();
14096 if (*input_line_pointer)
14097 as_bad (_("junk `%s' after expression"), input_line_pointer);
14098#if GCC_ASM_O_HACK
14099 RESTORE_END_STRING (disp_end + 1);
14100#endif
636c26b0 14101 input_line_pointer = save_input_line_pointer;
636c26b0 14102 if (gotfree_input_line)
ee86248c
JB
14103 {
14104 free (gotfree_input_line);
14105
14106 if (exp->X_op == O_constant || exp->X_op == O_register)
14107 exp->X_op = O_illegal;
14108 }
14109
14110 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
14111
14112 RESTORE_END_STRING (disp_end);
14113
14114 return ret;
14115}
14116
14117static int
14118i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
14119 i386_operand_type types, const char *disp_start)
14120{
ee86248c 14121 int ret = 1;
636c26b0 14122
24eab124
AM
14123 /* We do this to make sure that the section symbol is in
14124 the symbol table. We will ultimately change the relocation
47926f60 14125 to be relative to the beginning of the section. */
1ae12ab7 14126 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
14127 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
14128 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 14129 {
636c26b0 14130 if (exp->X_op != O_symbol)
3992d3b7 14131 goto inv_disp;
636c26b0 14132
e5cb08ac 14133 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
14134 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
14135 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 14136 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
14137 exp->X_op = O_subtract;
14138 exp->X_op_symbol = GOT_symbol;
1ae12ab7 14139 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 14140 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
14141 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
14142 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 14143 else
29b0f896 14144 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 14145 }
252b5132 14146
3992d3b7
AM
14147 else if (exp->X_op == O_absent
14148 || exp->X_op == O_illegal
ee86248c 14149 || exp->X_op == O_big)
2daf4fd8 14150 {
3992d3b7
AM
14151 inv_disp:
14152 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 14153 disp_start);
3992d3b7 14154 ret = 0;
2daf4fd8
AM
14155 }
14156
a50187b2
JB
14157 else if (exp->X_op == O_constant)
14158 {
14159 /* Sizing gets taken care of by optimize_disp().
14160
14161 If not 64bit, sign/zero extend val, to account for wraparound
14162 when !BFD64. */
5cc00775
JB
14163 if (expr_mode == expr_operator_present
14164 && flag_code != CODE_64BIT && !object_64bit)
a50187b2
JB
14165 exp->X_add_number = extend_to_32bit_address (exp->X_add_number);
14166 }
14167
4c63da97 14168#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
a50187b2 14169 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
3992d3b7
AM
14170 && exp_seg != absolute_section
14171 && exp_seg != text_section
14172 && exp_seg != data_section
14173 && exp_seg != bss_section
14174 && exp_seg != undefined_section
14175 && !bfd_is_com_section (exp_seg))
24eab124 14176 {
d0b47220 14177 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 14178 ret = 0;
24eab124 14179 }
252b5132 14180#endif
3956db08 14181
d3b01414 14182 else if (current_templates.start->opcode_modifier.jump == JUMP_BYTE)
48bcea9f
JB
14183 i.types[this_operand].bitfield.disp8 = 1;
14184
40fb9820 14185 /* Check if this is a displacement only operand. */
02b83698
JB
14186 if (!i.types[this_operand].bitfield.baseindex)
14187 i.types[this_operand] =
14188 operand_type_or (operand_type_and_not (i.types[this_operand], anydisp),
14189 operand_type_and (i.types[this_operand], types));
3956db08 14190
3992d3b7 14191 return ret;
252b5132
RH
14192}
14193
2abc2bec
JB
14194/* Return the active addressing mode, taking address override and
14195 registers forming the address into consideration. Update the
14196 address override prefix if necessary. */
47926f60 14197
2abc2bec
JB
14198static enum flag_code
14199i386_addressing_mode (void)
252b5132 14200{
be05d201
L
14201 enum flag_code addr_mode;
14202
14203 if (i.prefix[ADDR_PREFIX])
14204 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3 14205 else if (flag_code == CODE_16BIT
d3b01414 14206 && is_cpu (current_templates.start, CpuMPX)
a23b33b3
JB
14207 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
14208 from md_assemble() by "is not a valid base/index expression"
14209 when there is a base and/or index. */
14210 && !i.types[this_operand].bitfield.baseindex)
14211 {
14212 /* MPX insn memory operands with neither base nor index must be forced
14213 to use 32-bit addressing in 16-bit mode. */
14214 addr_mode = CODE_32BIT;
14215 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
14216 ++i.prefixes;
14217 gas_assert (!i.types[this_operand].bitfield.disp16);
14218 gas_assert (!i.types[this_operand].bitfield.disp32);
14219 }
be05d201
L
14220 else
14221 {
14222 addr_mode = flag_code;
14223
24eab124 14224#if INFER_ADDR_PREFIX
be05d201
L
14225 if (i.mem_operands == 0)
14226 {
14227 /* Infer address prefix from the first memory operand. */
14228 const reg_entry *addr_reg = i.base_reg;
14229
14230 if (addr_reg == NULL)
14231 addr_reg = i.index_reg;
eecb386c 14232
be05d201
L
14233 if (addr_reg)
14234 {
e968fc9b 14235 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
14236 addr_mode = CODE_32BIT;
14237 else if (flag_code != CODE_64BIT
dc821c5f 14238 && addr_reg->reg_type.bitfield.word)
be05d201
L
14239 addr_mode = CODE_16BIT;
14240
14241 if (addr_mode != flag_code)
14242 {
14243 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
14244 i.prefixes += 1;
14245 /* Change the size of any displacement too. At most one
14246 of Disp16 or Disp32 is set.
14247 FIXME. There doesn't seem to be any real need for
14248 separate Disp16 and Disp32 flags. The same goes for
14249 Imm16 and Imm32. Removing them would probably clean
14250 up the code quite a lot. */
14251 if (flag_code != CODE_64BIT
14252 && (i.types[this_operand].bitfield.disp16
14253 || i.types[this_operand].bitfield.disp32))
05909f23
JB
14254 {
14255 static const i386_operand_type disp16_32 = {
14256 .bitfield = { .disp16 = 1, .disp32 = 1 }
14257 };
14258
14259 i.types[this_operand]
14260 = operand_type_xor (i.types[this_operand], disp16_32);
14261 }
be05d201
L
14262 }
14263 }
14264 }
24eab124 14265#endif
be05d201
L
14266 }
14267
2abc2bec
JB
14268 return addr_mode;
14269}
14270
14271/* Make sure the memory operand we've been dealt is valid.
14272 Return 1 on success, 0 on a failure. */
14273
14274static int
14275i386_index_check (const char *operand_string)
14276{
14277 const char *kind = "base/index";
14278 enum flag_code addr_mode = i386_addressing_mode ();
d3b01414 14279 const insn_template *t = current_templates.end - 1;
2abc2bec 14280
77a19f0e 14281 if (t->opcode_modifier.isstring)
fc0763e6
JB
14282 {
14283 /* Memory operands of string insns are special in that they only allow
14284 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201 14285 const reg_entry *expected_reg;
069a1561 14286 static const char di_si[][2][4] =
be05d201
L
14287 {
14288 { "esi", "edi" },
14289 { "si", "di" },
14290 { "rsi", "rdi" }
14291 };
069a1561 14292 static const char bx[][4] = { "ebx", "bx", "rbx" };
fc0763e6
JB
14293
14294 kind = "string address";
14295
a152332d 14296 if (t->opcode_modifier.prefixok == PrefixRep)
fc0763e6 14297 {
77a19f0e 14298 int es_op = t->opcode_modifier.isstring - IS_STRING_ES_OP0;
51c8edf6 14299 int op = 0;
fc0763e6 14300
77a19f0e 14301 if (!t->operand_types[0].bitfield.baseindex
fc0763e6 14302 || ((!i.mem_operands != !intel_syntax)
77a19f0e 14303 && t->operand_types[1].bitfield.baseindex))
51c8edf6 14304 op = 1;
fe0e921f
AM
14305 expected_reg
14306 = (const reg_entry *) str_hash_find (reg_hash,
14307 di_si[addr_mode][op == es_op]);
fc0763e6
JB
14308 }
14309 else
fe0e921f
AM
14310 expected_reg
14311 = (const reg_entry *)str_hash_find (reg_hash, bx[addr_mode]);
fc0763e6 14312
be05d201
L
14313 if (i.base_reg != expected_reg
14314 || i.index_reg
fc0763e6 14315 || operand_type_check (i.types[this_operand], disp))
fc0763e6 14316 {
be05d201
L
14317 /* The second memory operand must have the same size as
14318 the first one. */
14319 if (i.mem_operands
14320 && i.base_reg
14321 && !((addr_mode == CODE_64BIT
dc821c5f 14322 && i.base_reg->reg_type.bitfield.qword)
be05d201 14323 || (addr_mode == CODE_32BIT
dc821c5f
JB
14324 ? i.base_reg->reg_type.bitfield.dword
14325 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
14326 goto bad_address;
14327
fc0763e6
JB
14328 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
14329 operand_string,
14330 intel_syntax ? '[' : '(',
14331 register_prefix,
be05d201 14332 expected_reg->reg_name,
fc0763e6 14333 intel_syntax ? ']' : ')');
be05d201 14334 return 1;
fc0763e6 14335 }
be05d201
L
14336 else
14337 return 1;
14338
dc1e8a47 14339 bad_address:
be05d201
L
14340 as_bad (_("`%s' is not a valid %s expression"),
14341 operand_string, kind);
14342 return 0;
3e73aa7c
JH
14343 }
14344 else
14345 {
d3b01414 14346 t = current_templates.start;
77a19f0e 14347
be05d201
L
14348 if (addr_mode != CODE_16BIT)
14349 {
14350 /* 32-bit/64-bit checks. */
41eb8e88
L
14351 if (i.disp_encoding == disp_encoding_16bit)
14352 {
14353 bad_disp:
14354 as_bad (_("invalid `%s' prefix"),
14355 addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}");
14356 return 0;
14357 }
14358
be05d201 14359 if ((i.base_reg
e968fc9b
JB
14360 && ((addr_mode == CODE_64BIT
14361 ? !i.base_reg->reg_type.bitfield.qword
14362 : !i.base_reg->reg_type.bitfield.dword)
14363 || (i.index_reg && i.base_reg->reg_num == RegIP)
14364 || i.base_reg->reg_num == RegIZ))
be05d201 14365 || (i.index_reg
1b54b8d7
JB
14366 && !i.index_reg->reg_type.bitfield.xmmword
14367 && !i.index_reg->reg_type.bitfield.ymmword
14368 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 14369 && ((addr_mode == CODE_64BIT
e968fc9b
JB
14370 ? !i.index_reg->reg_type.bitfield.qword
14371 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
14372 || !i.index_reg->reg_type.bitfield.baseindex)))
14373 goto bad_address;
8178be5b 14374
260cd341 14375 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
7fc69528
JB
14376 if (t->mnem_off == MN_bndmk
14377 || t->mnem_off == MN_bndldx
14378 || t->mnem_off == MN_bndstx
a152332d 14379 || t->opcode_modifier.sib == SIBMEM)
8178be5b
JB
14380 {
14381 /* They cannot use RIP-relative addressing. */
e968fc9b 14382 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
14383 {
14384 as_bad (_("`%s' cannot be used here"), operand_string);
14385 return 0;
14386 }
14387
14388 /* bndldx and bndstx ignore their scale factor. */
7fc69528 14389 if ((t->mnem_off == MN_bndldx || t->mnem_off == MN_bndstx)
8178be5b
JB
14390 && i.log2_scale_factor)
14391 as_warn (_("register scaling is being ignored here"));
14392 }
be05d201
L
14393 }
14394 else
3e73aa7c 14395 {
be05d201 14396 /* 16-bit checks. */
41eb8e88
L
14397 if (i.disp_encoding == disp_encoding_32bit)
14398 goto bad_disp;
14399
3e73aa7c 14400 if ((i.base_reg
dc821c5f 14401 && (!i.base_reg->reg_type.bitfield.word
40fb9820 14402 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 14403 || (i.index_reg
dc821c5f 14404 && (!i.index_reg->reg_type.bitfield.word
40fb9820 14405 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
14406 || !(i.base_reg
14407 && i.base_reg->reg_num < 6
14408 && i.index_reg->reg_num >= 6
14409 && i.log2_scale_factor == 0))))
be05d201 14410 goto bad_address;
3e73aa7c
JH
14411 }
14412 }
be05d201 14413 return 1;
24eab124 14414}
252b5132 14415
43234a1e
L
14416/* Handle vector immediates. */
14417
14418static int
14419RC_SAE_immediate (const char *imm_start)
14420{
43234a1e 14421 const char *pstr = imm_start;
43234a1e
L
14422
14423 if (*pstr != '{')
14424 return 0;
14425
7063667e
JB
14426 pstr = RC_SAE_specifier (pstr + 1);
14427 if (pstr == NULL)
43234a1e
L
14428 return 0;
14429
14430 if (*pstr++ != '}')
14431 {
14432 as_bad (_("Missing '}': '%s'"), imm_start);
14433 return 0;
14434 }
14435 /* RC/SAE immediate string should contain nothing more. */;
14436 if (*pstr != 0)
14437 {
14438 as_bad (_("Junk after '}': '%s'"), imm_start);
14439 return 0;
14440 }
14441
cf665fee
JB
14442 /* Internally this doesn't count as an operand. */
14443 --i.operands;
43234a1e 14444
43234a1e
L
14445 return 1;
14446}
14447
9d299bea
JB
14448static INLINE bool starts_memory_operand (char c)
14449{
014fbcda 14450 return ISDIGIT (c)
4795cd4a 14451 || is_name_beginner (c)
014fbcda 14452 || strchr ("([\"+-!~", c);
9d299bea
JB
14453}
14454
fc0763e6 14455/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 14456 on error. */
252b5132 14457
252b5132 14458static int
a7619375 14459i386_att_operand (char *operand_string)
252b5132 14460{
af6bdddf
AM
14461 const reg_entry *r;
14462 char *end_op;
24eab124 14463 char *op_string = operand_string;
252b5132 14464
24eab124 14465 if (is_space_char (*op_string))
252b5132
RH
14466 ++op_string;
14467
24eab124 14468 /* We check for an absolute prefix (differentiating,
47926f60 14469 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
ccb05c9c 14470 if (*op_string == ABSOLUTE_PREFIX
d3b01414 14471 && current_templates.start->opcode_modifier.jump)
24eab124
AM
14472 {
14473 ++op_string;
14474 if (is_space_char (*op_string))
14475 ++op_string;
5b7c81bd 14476 i.jumpabsolute = true;
24eab124 14477 }
252b5132 14478
47926f60 14479 /* Check if operand is a register. */
4d1bb795 14480 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 14481 {
40fb9820
L
14482 i386_operand_type temp;
14483
8a6fb3f9
JB
14484 if (r == &bad_reg)
14485 return 0;
14486
24eab124
AM
14487 /* Check for a segment override by searching for ':' after a
14488 segment register. */
14489 op_string = end_op;
14490 if (is_space_char (*op_string))
14491 ++op_string;
00cee14f 14492 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124 14493 {
5e042380 14494 i.seg[i.mem_operands] = r;
252b5132 14495
24eab124 14496 /* Skip the ':' and whitespace. */
252b5132
RH
14497 ++op_string;
14498 if (is_space_char (*op_string))
24eab124 14499 ++op_string;
252b5132 14500
47926f60 14501 /* Handle case of %es:*foo. */
ccb05c9c 14502 if (!i.jumpabsolute && *op_string == ABSOLUTE_PREFIX
d3b01414 14503 && current_templates.start->opcode_modifier.jump)
24eab124
AM
14504 {
14505 ++op_string;
14506 if (is_space_char (*op_string))
14507 ++op_string;
5b7c81bd 14508 i.jumpabsolute = true;
24eab124 14509 }
c8d541e2 14510
9d299bea 14511 if (!starts_memory_operand (*op_string))
c8d541e2
JB
14512 {
14513 as_bad (_("bad memory operand `%s'"), op_string);
14514 return 0;
14515 }
24eab124
AM
14516 goto do_memory_reference;
14517 }
43234a1e
L
14518
14519 /* Handle vector operations. */
14520 if (*op_string == '{')
14521 {
f70c6814 14522 op_string = check_VecOperations (op_string);
43234a1e
L
14523 if (op_string == NULL)
14524 return 0;
14525 }
14526
24eab124
AM
14527 if (*op_string)
14528 {
d0b47220 14529 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
14530 return 0;
14531 }
0ff3b7d0
JB
14532
14533 /* Reject pseudo registers for .insn. */
14534 if (dot_insn () && r->reg_type.bitfield.class == ClassNone)
14535 {
14536 as_bad (_("`%s%s' cannot be used here"),
14537 register_prefix, r->reg_name);
14538 return 0;
14539 }
14540
40fb9820
L
14541 temp = r->reg_type;
14542 temp.bitfield.baseindex = 0;
c6fb90c8
L
14543 i.types[this_operand] = operand_type_or (i.types[this_operand],
14544 temp);
7d5e4556 14545 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 14546 i.op[this_operand].regs = r;
24eab124 14547 i.reg_operands++;
cf665fee
JB
14548
14549 /* A GPR may follow an RC or SAE immediate only if a (vector) register
14550 operand was also present earlier on. */
14551 if (i.rounding.type != rc_none && temp.bitfield.class == Reg
14552 && i.reg_operands == 1)
14553 {
14554 unsigned int j;
14555
14556 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); ++j)
14557 if (i.rounding.type == RC_NamesTable[j].type)
14558 break;
14559 as_bad (_("`%s': misplaced `{%s}'"),
d3b01414 14560 insn_name (current_templates.start), RC_NamesTable[j].name);
cf665fee
JB
14561 return 0;
14562 }
24eab124 14563 }
af6bdddf
AM
14564 else if (*op_string == REGISTER_PREFIX)
14565 {
14566 as_bad (_("bad register name `%s'"), op_string);
14567 return 0;
14568 }
24eab124 14569 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 14570 {
24eab124 14571 ++op_string;
6f2f06be 14572 if (i.jumpabsolute)
24eab124 14573 {
d0b47220 14574 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
14575 return 0;
14576 }
14577 if (!i386_immediate (op_string))
14578 return 0;
cf665fee
JB
14579 if (i.rounding.type != rc_none)
14580 {
14581 as_bad (_("`%s': RC/SAE operand must follow immediate operands"),
d3b01414 14582 insn_name (current_templates.start));
cf665fee
JB
14583 return 0;
14584 }
24eab124 14585 }
43234a1e
L
14586 else if (RC_SAE_immediate (operand_string))
14587 {
cf665fee
JB
14588 /* If it is a RC or SAE immediate, do the necessary placement check:
14589 Only another immediate or a GPR may precede it. */
14590 if (i.mem_operands || i.reg_operands + i.imm_operands > 1
14591 || (i.reg_operands == 1
14592 && i.op[0].regs->reg_type.bitfield.class != Reg))
14593 {
14594 as_bad (_("`%s': misplaced `%s'"),
d3b01414 14595 insn_name (current_templates.start), operand_string);
cf665fee
JB
14596 return 0;
14597 }
43234a1e 14598 }
9d299bea 14599 else if (starts_memory_operand (*op_string))
24eab124 14600 {
47926f60 14601 /* This is a memory reference of some sort. */
af6bdddf 14602 char *base_string;
252b5132 14603
47926f60 14604 /* Start and end of displacement string expression (if found). */
eecb386c
AM
14605 char *displacement_string_start;
14606 char *displacement_string_end;
252b5132 14607
24eab124 14608 do_memory_reference:
24eab124
AM
14609 /* Check for base index form. We detect the base index form by
14610 looking for an ')' at the end of the operand, searching
14611 for the '(' matching it, and finding a REGISTER_PREFIX or ','
14612 after the '('. */
af6bdddf 14613 base_string = op_string + strlen (op_string);
c3332e24 14614
43234a1e 14615 /* Handle vector operations. */
6b5ba0d4
JB
14616 --base_string;
14617 if (is_space_char (*base_string))
14618 --base_string;
14619
14620 if (*base_string == '}')
43234a1e 14621 {
6b5ba0d4
JB
14622 char *vop_start = NULL;
14623
14624 while (base_string-- > op_string)
14625 {
14626 if (*base_string == '"')
14627 break;
14628 if (*base_string != '{')
14629 continue;
14630
14631 vop_start = base_string;
14632
14633 --base_string;
14634 if (is_space_char (*base_string))
14635 --base_string;
14636
14637 if (*base_string != '}')
14638 break;
14639
14640 vop_start = NULL;
14641 }
14642
14643 if (!vop_start)
14644 {
14645 as_bad (_("unbalanced figure braces"));
14646 return 0;
14647 }
14648
f70c6814 14649 if (check_VecOperations (vop_start) == NULL)
43234a1e 14650 return 0;
43234a1e
L
14651 }
14652
47926f60 14653 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
14654 displacement_string_start = op_string;
14655 displacement_string_end = base_string + 1;
252b5132 14656
24eab124
AM
14657 if (*base_string == ')')
14658 {
af6bdddf 14659 char *temp_string;
e87fb6a6
JB
14660 unsigned int parens_not_balanced = 0;
14661 bool in_quotes = false;
e68c3d59 14662
24eab124 14663 /* We've already checked that the number of left & right ()'s are
e87fb6a6
JB
14664 equal, and that there's a matching set of double quotes. */
14665 end_op = base_string;
14666 for (temp_string = op_string; temp_string < end_op; temp_string++)
24eab124 14667 {
e87fb6a6
JB
14668 if (*temp_string == '\\' && temp_string[1] == '"')
14669 ++temp_string;
14670 else if (*temp_string == '"')
14671 in_quotes = !in_quotes;
14672 else if (!in_quotes)
14673 {
14674 if (*temp_string == '(' && !parens_not_balanced++)
14675 base_string = temp_string;
14676 if (*temp_string == ')')
14677 --parens_not_balanced;
14678 }
24eab124 14679 }
c3332e24 14680
af6bdddf 14681 temp_string = base_string;
c3332e24 14682
24eab124 14683 /* Skip past '(' and whitespace. */
4f081312 14684 gas_assert (*base_string == '(');
e87fb6a6 14685 ++base_string;
252b5132 14686 if (is_space_char (*base_string))
24eab124 14687 ++base_string;
252b5132 14688
af6bdddf 14689 if (*base_string == ','
4eed87de
AM
14690 || ((i.base_reg = parse_register (base_string, &end_op))
14691 != NULL))
252b5132 14692 {
af6bdddf 14693 displacement_string_end = temp_string;
252b5132 14694
40fb9820 14695 i.types[this_operand].bitfield.baseindex = 1;
252b5132 14696
af6bdddf 14697 if (i.base_reg)
24eab124 14698 {
8a6fb3f9
JB
14699 if (i.base_reg == &bad_reg)
14700 return 0;
24eab124
AM
14701 base_string = end_op;
14702 if (is_space_char (*base_string))
14703 ++base_string;
af6bdddf
AM
14704 }
14705
14706 /* There may be an index reg or scale factor here. */
14707 if (*base_string == ',')
14708 {
14709 ++base_string;
14710 if (is_space_char (*base_string))
14711 ++base_string;
14712
4eed87de
AM
14713 if ((i.index_reg = parse_register (base_string, &end_op))
14714 != NULL)
24eab124 14715 {
8a6fb3f9
JB
14716 if (i.index_reg == &bad_reg)
14717 return 0;
af6bdddf 14718 base_string = end_op;
24eab124
AM
14719 if (is_space_char (*base_string))
14720 ++base_string;
af6bdddf
AM
14721 if (*base_string == ',')
14722 {
14723 ++base_string;
14724 if (is_space_char (*base_string))
14725 ++base_string;
14726 }
e5cb08ac 14727 else if (*base_string != ')')
af6bdddf 14728 {
4eed87de
AM
14729 as_bad (_("expecting `,' or `)' "
14730 "after index register in `%s'"),
af6bdddf
AM
14731 operand_string);
14732 return 0;
14733 }
24eab124 14734 }
af6bdddf 14735 else if (*base_string == REGISTER_PREFIX)
24eab124 14736 {
f76bf5e0
L
14737 end_op = strchr (base_string, ',');
14738 if (end_op)
14739 *end_op = '\0';
af6bdddf 14740 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
14741 return 0;
14742 }
252b5132 14743
47926f60 14744 /* Check for scale factor. */
551c1ca1 14745 if (*base_string != ')')
af6bdddf 14746 {
551c1ca1
AM
14747 char *end_scale = i386_scale (base_string);
14748
14749 if (!end_scale)
af6bdddf 14750 return 0;
24eab124 14751
551c1ca1 14752 base_string = end_scale;
af6bdddf
AM
14753 if (is_space_char (*base_string))
14754 ++base_string;
14755 if (*base_string != ')')
14756 {
4eed87de
AM
14757 as_bad (_("expecting `)' "
14758 "after scale factor in `%s'"),
af6bdddf
AM
14759 operand_string);
14760 return 0;
14761 }
14762 }
14763 else if (!i.index_reg)
24eab124 14764 {
4eed87de
AM
14765 as_bad (_("expecting index register or scale factor "
14766 "after `,'; got '%c'"),
af6bdddf 14767 *base_string);
24eab124
AM
14768 return 0;
14769 }
14770 }
af6bdddf 14771 else if (*base_string != ')')
24eab124 14772 {
4eed87de
AM
14773 as_bad (_("expecting `,' or `)' "
14774 "after base register in `%s'"),
af6bdddf 14775 operand_string);
24eab124
AM
14776 return 0;
14777 }
c3332e24 14778 }
af6bdddf 14779 else if (*base_string == REGISTER_PREFIX)
c3332e24 14780 {
f76bf5e0
L
14781 end_op = strchr (base_string, ',');
14782 if (end_op)
14783 *end_op = '\0';
af6bdddf 14784 as_bad (_("bad register name `%s'"), base_string);
24eab124 14785 return 0;
c3332e24 14786 }
24eab124
AM
14787 }
14788
14789 /* If there's an expression beginning the operand, parse it,
14790 assuming displacement_string_start and
14791 displacement_string_end are meaningful. */
14792 if (displacement_string_start != displacement_string_end)
14793 {
14794 if (!i386_displacement (displacement_string_start,
14795 displacement_string_end))
14796 return 0;
14797 }
14798
14799 /* Special case for (%dx) while doing input/output op. */
14800 if (i.base_reg
75e5731b
JB
14801 && i.base_reg->reg_type.bitfield.instance == RegD
14802 && i.base_reg->reg_type.bitfield.word
24eab124
AM
14803 && i.index_reg == 0
14804 && i.log2_scale_factor == 0
14805 && i.seg[i.mem_operands] == 0
40fb9820 14806 && !operand_type_check (i.types[this_operand], disp))
24eab124 14807 {
2fb5be8d 14808 i.types[this_operand] = i.base_reg->reg_type;
f0a4cb15
CL
14809 i.op[this_operand].regs = i.base_reg;
14810 i.base_reg = NULL;
9373f275 14811 i.input_output_operand = true;
24eab124
AM
14812 return 1;
14813 }
14814
eecb386c
AM
14815 if (i386_index_check (operand_string) == 0)
14816 return 0;
c48dadc9 14817 i.flags[this_operand] |= Operand_Mem;
24eab124
AM
14818 i.mem_operands++;
14819 }
14820 else
ce8a8b2f
AM
14821 {
14822 /* It's not a memory operand; argh! */
24eab124
AM
14823 as_bad (_("invalid char %s beginning operand %d `%s'"),
14824 output_invalid (*op_string),
14825 this_operand + 1,
14826 op_string);
14827 return 0;
14828 }
47926f60 14829 return 1; /* Normal return. */
252b5132
RH
14830}
14831\f
fa94de6b
RM
14832/* Calculate the maximum variable size (i.e., excluding fr_fix)
14833 that an rs_machine_dependent frag may reach. */
14834
14835unsigned int
14836i386_frag_max_var (fragS *frag)
14837{
14838 /* The only relaxable frags are for jumps.
14839 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
14840 gas_assert (frag->fr_type == rs_machine_dependent);
14841 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
14842}
14843
b084df0b
L
14844#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14845static int
8dcea932 14846elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
14847{
14848 /* STT_GNU_IFUNC symbol must go through PLT. */
14849 if ((symbol_get_bfdsym (fr_symbol)->flags
14850 & BSF_GNU_INDIRECT_FUNCTION) != 0)
14851 return 0;
14852
14853 if (!S_IS_EXTERNAL (fr_symbol))
14854 /* Symbol may be weak or local. */
14855 return !S_IS_WEAK (fr_symbol);
14856
8dcea932
L
14857 /* Global symbols with non-default visibility can't be preempted. */
14858 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
14859 return 1;
14860
14861 if (fr_var != NO_RELOC)
14862 switch ((enum bfd_reloc_code_real) fr_var)
14863 {
14864 case BFD_RELOC_386_PLT32:
14865 case BFD_RELOC_X86_64_PLT32:
33eaf5de 14866 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
14867 return 0;
14868 default:
14869 abort ();
14870 }
14871
b084df0b
L
14872 /* Global symbols with default visibility in a shared library may be
14873 preempted by another definition. */
8dcea932 14874 return !shared;
b084df0b
L
14875}
14876#endif
14877
79d72f45
HL
14878/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
14879 Note also work for Skylake and Cascadelake.
14880---------------------------------------------------------------------
14881| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
14882| ------ | ----------- | ------- | -------- |
14883| Jo | N | N | Y |
14884| Jno | N | N | Y |
14885| Jc/Jb | Y | N | Y |
14886| Jae/Jnb | Y | N | Y |
14887| Je/Jz | Y | Y | Y |
14888| Jne/Jnz | Y | Y | Y |
14889| Jna/Jbe | Y | N | Y |
14890| Ja/Jnbe | Y | N | Y |
14891| Js | N | N | Y |
14892| Jns | N | N | Y |
14893| Jp/Jpe | N | N | Y |
14894| Jnp/Jpo | N | N | Y |
14895| Jl/Jnge | Y | Y | Y |
14896| Jge/Jnl | Y | Y | Y |
14897| Jle/Jng | Y | Y | Y |
14898| Jg/Jnle | Y | Y | Y |
14899--------------------------------------------------------------------- */
14900static int
14901i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
14902{
14903 if (mf_cmp == mf_cmp_alu_cmp)
14904 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
14905 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
14906 if (mf_cmp == mf_cmp_incdec)
14907 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
14908 || mf_jcc == mf_jcc_jle);
14909 if (mf_cmp == mf_cmp_test_and)
14910 return 1;
14911 return 0;
14912}
14913
e379e5f3
L
14914/* Return the next non-empty frag. */
14915
14916static fragS *
14917i386_next_non_empty_frag (fragS *fragP)
14918{
14919 /* There may be a frag with a ".fill 0" when there is no room in
14920 the current frag for frag_grow in output_insn. */
14921 for (fragP = fragP->fr_next;
14922 (fragP != NULL
14923 && fragP->fr_type == rs_fill
14924 && fragP->fr_fix == 0);
14925 fragP = fragP->fr_next)
14926 ;
14927 return fragP;
14928}
14929
14930/* Return the next jcc frag after BRANCH_PADDING. */
14931
14932static fragS *
79d72f45 14933i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 14934{
79d72f45
HL
14935 fragS *branch_fragP;
14936 if (!pad_fragP)
e379e5f3
L
14937 return NULL;
14938
79d72f45
HL
14939 if (pad_fragP->fr_type == rs_machine_dependent
14940 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
14941 == BRANCH_PADDING))
14942 {
79d72f45
HL
14943 branch_fragP = i386_next_non_empty_frag (pad_fragP);
14944 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 14945 return NULL;
79d72f45
HL
14946 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
14947 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
14948 pad_fragP->tc_frag_data.mf_type))
14949 return branch_fragP;
e379e5f3
L
14950 }
14951
14952 return NULL;
14953}
14954
14955/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
14956
14957static void
14958i386_classify_machine_dependent_frag (fragS *fragP)
14959{
14960 fragS *cmp_fragP;
14961 fragS *pad_fragP;
14962 fragS *branch_fragP;
14963 fragS *next_fragP;
14964 unsigned int max_prefix_length;
14965
14966 if (fragP->tc_frag_data.classified)
14967 return;
14968
14969 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
14970 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
14971 for (next_fragP = fragP;
14972 next_fragP != NULL;
14973 next_fragP = next_fragP->fr_next)
14974 {
14975 next_fragP->tc_frag_data.classified = 1;
14976 if (next_fragP->fr_type == rs_machine_dependent)
14977 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
14978 {
14979 case BRANCH_PADDING:
14980 /* The BRANCH_PADDING frag must be followed by a branch
14981 frag. */
14982 branch_fragP = i386_next_non_empty_frag (next_fragP);
14983 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
14984 break;
14985 case FUSED_JCC_PADDING:
14986 /* Check if this is a fused jcc:
14987 FUSED_JCC_PADDING
14988 CMP like instruction
14989 BRANCH_PADDING
14990 COND_JUMP
14991 */
14992 cmp_fragP = i386_next_non_empty_frag (next_fragP);
14993 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 14994 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
14995 if (branch_fragP)
14996 {
14997 /* The BRANCH_PADDING frag is merged with the
14998 FUSED_JCC_PADDING frag. */
14999 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
15000 /* CMP like instruction size. */
15001 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
15002 frag_wane (pad_fragP);
15003 /* Skip to branch_fragP. */
15004 next_fragP = branch_fragP;
15005 }
15006 else if (next_fragP->tc_frag_data.max_prefix_length)
15007 {
15008 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
15009 a fused jcc. */
15010 next_fragP->fr_subtype
15011 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
15012 next_fragP->tc_frag_data.max_bytes
15013 = next_fragP->tc_frag_data.max_prefix_length;
15014 /* This will be updated in the BRANCH_PREFIX scan. */
15015 next_fragP->tc_frag_data.max_prefix_length = 0;
15016 }
15017 else
15018 frag_wane (next_fragP);
15019 break;
15020 }
15021 }
15022
15023 /* Stop if there is no BRANCH_PREFIX. */
15024 if (!align_branch_prefix_size)
15025 return;
15026
15027 /* Scan for BRANCH_PREFIX. */
15028 for (; fragP != NULL; fragP = fragP->fr_next)
15029 {
15030 if (fragP->fr_type != rs_machine_dependent
15031 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
15032 != BRANCH_PREFIX))
15033 continue;
15034
15035 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
15036 COND_JUMP_PREFIX. */
15037 max_prefix_length = 0;
15038 for (next_fragP = fragP;
15039 next_fragP != NULL;
15040 next_fragP = next_fragP->fr_next)
15041 {
15042 if (next_fragP->fr_type == rs_fill)
15043 /* Skip rs_fill frags. */
15044 continue;
15045 else if (next_fragP->fr_type != rs_machine_dependent)
15046 /* Stop for all other frags. */
15047 break;
15048
15049 /* rs_machine_dependent frags. */
15050 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
15051 == BRANCH_PREFIX)
15052 {
15053 /* Count BRANCH_PREFIX frags. */
15054 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
15055 {
15056 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
15057 frag_wane (next_fragP);
15058 }
15059 else
15060 max_prefix_length
15061 += next_fragP->tc_frag_data.max_bytes;
15062 }
15063 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
15064 == BRANCH_PADDING)
15065 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
15066 == FUSED_JCC_PADDING))
15067 {
15068 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
15069 fragP->tc_frag_data.u.padding_fragP = next_fragP;
15070 break;
15071 }
15072 else
15073 /* Stop for other rs_machine_dependent frags. */
15074 break;
15075 }
15076
15077 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
15078
15079 /* Skip to the next frag. */
15080 fragP = next_fragP;
15081 }
15082}
15083
15084/* Compute padding size for
15085
15086 FUSED_JCC_PADDING
15087 CMP like instruction
15088 BRANCH_PADDING
15089 COND_JUMP/UNCOND_JUMP
15090
15091 or
15092
15093 BRANCH_PADDING
15094 COND_JUMP/UNCOND_JUMP
15095 */
15096
15097static int
15098i386_branch_padding_size (fragS *fragP, offsetT address)
15099{
15100 unsigned int offset, size, padding_size;
15101 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
15102
15103 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
15104 if (!address)
15105 address = fragP->fr_address;
15106 address += fragP->fr_fix;
15107
15108 /* CMP like instrunction size. */
15109 size = fragP->tc_frag_data.cmp_size;
15110
15111 /* The base size of the branch frag. */
15112 size += branch_fragP->fr_fix;
15113
15114 /* Add opcode and displacement bytes for the rs_machine_dependent
15115 branch frag. */
15116 if (branch_fragP->fr_type == rs_machine_dependent)
15117 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
15118
15119 /* Check if branch is within boundary and doesn't end at the last
15120 byte. */
15121 offset = address & ((1U << align_branch_power) - 1);
15122 if ((offset + size) >= (1U << align_branch_power))
15123 /* Padding needed to avoid crossing boundary. */
15124 padding_size = (1U << align_branch_power) - offset;
15125 else
15126 /* No padding needed. */
15127 padding_size = 0;
15128
15129 /* The return value may be saved in tc_frag_data.length which is
15130 unsigned byte. */
15131 if (!fits_in_unsigned_byte (padding_size))
15132 abort ();
15133
15134 return padding_size;
15135}
15136
15137/* i386_generic_table_relax_frag()
15138
15139 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
15140 grow/shrink padding to align branch frags. Hand others to
15141 relax_frag(). */
15142
15143long
15144i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
15145{
15146 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
15147 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
15148 {
15149 long padding_size = i386_branch_padding_size (fragP, 0);
15150 long grow = padding_size - fragP->tc_frag_data.length;
15151
15152 /* When the BRANCH_PREFIX frag is used, the computed address
15153 must match the actual address and there should be no padding. */
15154 if (fragP->tc_frag_data.padding_address
15155 && (fragP->tc_frag_data.padding_address != fragP->fr_address
15156 || padding_size))
15157 abort ();
15158
15159 /* Update the padding size. */
15160 if (grow)
15161 fragP->tc_frag_data.length = padding_size;
15162
15163 return grow;
15164 }
15165 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
15166 {
15167 fragS *padding_fragP, *next_fragP;
15168 long padding_size, left_size, last_size;
15169
15170 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
15171 if (!padding_fragP)
15172 /* Use the padding set by the leading BRANCH_PREFIX frag. */
15173 return (fragP->tc_frag_data.length
15174 - fragP->tc_frag_data.last_length);
15175
15176 /* Compute the relative address of the padding frag in the very
15177 first time where the BRANCH_PREFIX frag sizes are zero. */
15178 if (!fragP->tc_frag_data.padding_address)
15179 fragP->tc_frag_data.padding_address
15180 = padding_fragP->fr_address - (fragP->fr_address - stretch);
15181
15182 /* First update the last length from the previous interation. */
15183 left_size = fragP->tc_frag_data.prefix_length;
15184 for (next_fragP = fragP;
15185 next_fragP != padding_fragP;
15186 next_fragP = next_fragP->fr_next)
15187 if (next_fragP->fr_type == rs_machine_dependent
15188 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
15189 == BRANCH_PREFIX))
15190 {
15191 if (left_size)
15192 {
15193 int max = next_fragP->tc_frag_data.max_bytes;
15194 if (max)
15195 {
15196 int size;
15197 if (max > left_size)
15198 size = left_size;
15199 else
15200 size = max;
15201 left_size -= size;
15202 next_fragP->tc_frag_data.last_length = size;
15203 }
15204 }
15205 else
15206 next_fragP->tc_frag_data.last_length = 0;
15207 }
15208
15209 /* Check the padding size for the padding frag. */
15210 padding_size = i386_branch_padding_size
15211 (padding_fragP, (fragP->fr_address
15212 + fragP->tc_frag_data.padding_address));
15213
15214 last_size = fragP->tc_frag_data.prefix_length;
15215 /* Check if there is change from the last interation. */
15216 if (padding_size == last_size)
15217 {
15218 /* Update the expected address of the padding frag. */
15219 padding_fragP->tc_frag_data.padding_address
15220 = (fragP->fr_address + padding_size
15221 + fragP->tc_frag_data.padding_address);
15222 return 0;
15223 }
15224
15225 if (padding_size > fragP->tc_frag_data.max_prefix_length)
15226 {
15227 /* No padding if there is no sufficient room. Clear the
15228 expected address of the padding frag. */
15229 padding_fragP->tc_frag_data.padding_address = 0;
15230 padding_size = 0;
15231 }
15232 else
15233 /* Store the expected address of the padding frag. */
15234 padding_fragP->tc_frag_data.padding_address
15235 = (fragP->fr_address + padding_size
15236 + fragP->tc_frag_data.padding_address);
15237
15238 fragP->tc_frag_data.prefix_length = padding_size;
15239
15240 /* Update the length for the current interation. */
15241 left_size = padding_size;
15242 for (next_fragP = fragP;
15243 next_fragP != padding_fragP;
15244 next_fragP = next_fragP->fr_next)
15245 if (next_fragP->fr_type == rs_machine_dependent
15246 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
15247 == BRANCH_PREFIX))
15248 {
15249 if (left_size)
15250 {
15251 int max = next_fragP->tc_frag_data.max_bytes;
15252 if (max)
15253 {
15254 int size;
15255 if (max > left_size)
15256 size = left_size;
15257 else
15258 size = max;
15259 left_size -= size;
15260 next_fragP->tc_frag_data.length = size;
15261 }
15262 }
15263 else
15264 next_fragP->tc_frag_data.length = 0;
15265 }
15266
15267 return (fragP->tc_frag_data.length
15268 - fragP->tc_frag_data.last_length);
15269 }
15270 return relax_frag (segment, fragP, stretch);
15271}
15272
ee7fcc42
AM
15273/* md_estimate_size_before_relax()
15274
15275 Called just before relax() for rs_machine_dependent frags. The x86
15276 assembler uses these frags to handle variable size jump
15277 instructions.
15278
15279 Any symbol that is now undefined will not become defined.
15280 Return the correct fr_subtype in the frag.
15281 Return the initial "guess for variable size of frag" to caller.
15282 The guess is actually the growth beyond the fixed part. Whatever
15283 we do to grow the fixed or variable part contributes to our
15284 returned value. */
15285
252b5132 15286int
7016a5d5 15287md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 15288{
e379e5f3
L
15289 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
15290 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
15291 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
15292 {
15293 i386_classify_machine_dependent_frag (fragP);
15294 return fragP->tc_frag_data.length;
15295 }
15296
252b5132 15297 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
15298 check for un-relaxable symbols. On an ELF system, we can't relax
15299 an externally visible symbol, because it may be overridden by a
15300 shared library. */
15301 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 15302#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 15303 || (IS_ELF
8dcea932
L
15304 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
15305 fragP->fr_var))
fbeb56a4
DK
15306#endif
15307#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 15308 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 15309 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
15310#endif
15311 )
252b5132 15312 {
b98ef147
AM
15313 /* Symbol is undefined in this segment, or we need to keep a
15314 reloc so that weak symbols can be overridden. */
15315 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 15316 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
15317 unsigned char *opcode;
15318 int old_fr_fix;
eb19308f 15319 fixS *fixP = NULL;
f6af82bd 15320
ee7fcc42 15321 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 15322 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 15323 else if (size == 2)
f6af82bd 15324 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b 15325#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
ed719294
JB
15326 else if (fragP->tc_frag_data.code == CODE_64BIT
15327 && fragP->fr_offset == 0
1ef3994a 15328 && need_plt32_p (fragP->fr_symbol))
bd7ab16b
L
15329 reloc_type = BFD_RELOC_X86_64_PLT32;
15330#endif
f6af82bd
AM
15331 else
15332 reloc_type = BFD_RELOC_32_PCREL;
252b5132 15333
ee7fcc42
AM
15334 old_fr_fix = fragP->fr_fix;
15335 opcode = (unsigned char *) fragP->fr_opcode;
15336
fddf5b5b 15337 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 15338 {
fddf5b5b
AM
15339 case UNCOND_JUMP:
15340 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 15341 opcode[0] = 0xe9;
252b5132 15342 fragP->fr_fix += size;
eb19308f
JB
15343 fixP = fix_new (fragP, old_fr_fix, size,
15344 fragP->fr_symbol,
15345 fragP->fr_offset, 1,
15346 reloc_type);
252b5132
RH
15347 break;
15348
fddf5b5b 15349 case COND_JUMP86:
412167cb
AM
15350 if (size == 2
15351 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
15352 {
15353 /* Negate the condition, and branch past an
15354 unconditional jump. */
15355 opcode[0] ^= 1;
15356 opcode[1] = 3;
15357 /* Insert an unconditional jump. */
15358 opcode[2] = 0xe9;
15359 /* We added two extra opcode bytes, and have a two byte
15360 offset. */
15361 fragP->fr_fix += 2 + 2;
062cd5e7
AS
15362 fix_new (fragP, old_fr_fix + 2, 2,
15363 fragP->fr_symbol,
15364 fragP->fr_offset, 1,
15365 reloc_type);
fddf5b5b
AM
15366 break;
15367 }
15368 /* Fall through. */
15369
15370 case COND_JUMP:
412167cb
AM
15371 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
15372 {
15373 fragP->fr_fix += 1;
3e02c1cc
AM
15374 fixP = fix_new (fragP, old_fr_fix, 1,
15375 fragP->fr_symbol,
15376 fragP->fr_offset, 1,
15377 BFD_RELOC_8_PCREL);
15378 fixP->fx_signed = 1;
412167cb
AM
15379 break;
15380 }
93c2a809 15381
24eab124 15382 /* This changes the byte-displacement jump 0x7N
fddf5b5b 15383 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 15384 opcode[1] = opcode[0] + 0x10;
f6af82bd 15385 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
15386 /* We've added an opcode byte. */
15387 fragP->fr_fix += 1 + size;
eb19308f
JB
15388 fixP = fix_new (fragP, old_fr_fix + 1, size,
15389 fragP->fr_symbol,
15390 fragP->fr_offset, 1,
15391 reloc_type);
252b5132 15392 break;
fddf5b5b
AM
15393
15394 default:
15395 BAD_CASE (fragP->fr_subtype);
15396 break;
252b5132 15397 }
eb19308f
JB
15398
15399 /* All jumps handled here are signed, but don't unconditionally use a
15400 signed limit check for 32 and 16 bit jumps as we want to allow wrap
15401 around at 4G (outside of 64-bit mode) and 64k. */
15402 if (size == 4 && flag_code == CODE_64BIT)
15403 fixP->fx_signed = 1;
15404
252b5132 15405 frag_wane (fragP);
ee7fcc42 15406 return fragP->fr_fix - old_fr_fix;
252b5132 15407 }
93c2a809 15408
93c2a809
AM
15409 /* Guess size depending on current relax state. Initially the relax
15410 state will correspond to a short jump and we return 1, because
15411 the variable part of the frag (the branch offset) is one byte
15412 long. However, we can relax a section more than once and in that
15413 case we must either set fr_subtype back to the unrelaxed state,
15414 or return the value for the appropriate branch. */
15415 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
15416}
15417
47926f60
KH
15418/* Called after relax() is finished.
15419
15420 In: Address of frag.
15421 fr_type == rs_machine_dependent.
15422 fr_subtype is what the address relaxed to.
15423
15424 Out: Any fixSs and constants are set up.
15425 Caller will turn frag into a ".space 0". */
15426
252b5132 15427void
7016a5d5
TG
15428md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
15429 fragS *fragP)
252b5132 15430{
29b0f896 15431 unsigned char *opcode;
252b5132 15432 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
15433 offsetT target_address;
15434 offsetT opcode_address;
252b5132 15435 unsigned int extension = 0;
847f7ad4 15436 offsetT displacement_from_opcode_start;
252b5132 15437
e379e5f3
L
15438 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
15439 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
15440 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
15441 {
15442 /* Generate nop padding. */
15443 unsigned int size = fragP->tc_frag_data.length;
15444 if (size)
15445 {
15446 if (size > fragP->tc_frag_data.max_bytes)
15447 abort ();
15448
15449 if (flag_debug)
15450 {
15451 const char *msg;
15452 const char *branch = "branch";
15453 const char *prefix = "";
15454 fragS *padding_fragP;
15455 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
15456 == BRANCH_PREFIX)
15457 {
15458 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
15459 switch (fragP->tc_frag_data.default_prefix)
15460 {
15461 default:
15462 abort ();
15463 break;
15464 case CS_PREFIX_OPCODE:
15465 prefix = " cs";
15466 break;
15467 case DS_PREFIX_OPCODE:
15468 prefix = " ds";
15469 break;
15470 case ES_PREFIX_OPCODE:
15471 prefix = " es";
15472 break;
15473 case FS_PREFIX_OPCODE:
15474 prefix = " fs";
15475 break;
15476 case GS_PREFIX_OPCODE:
15477 prefix = " gs";
15478 break;
15479 case SS_PREFIX_OPCODE:
15480 prefix = " ss";
15481 break;
15482 }
15483 if (padding_fragP)
15484 msg = _("%s:%u: add %d%s at 0x%llx to align "
15485 "%s within %d-byte boundary\n");
15486 else
15487 msg = _("%s:%u: add additional %d%s at 0x%llx to "
15488 "align %s within %d-byte boundary\n");
15489 }
15490 else
15491 {
15492 padding_fragP = fragP;
15493 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
15494 "%s within %d-byte boundary\n");
15495 }
15496
15497 if (padding_fragP)
15498 switch (padding_fragP->tc_frag_data.branch_type)
15499 {
15500 case align_branch_jcc:
15501 branch = "jcc";
15502 break;
15503 case align_branch_fused:
15504 branch = "fused jcc";
15505 break;
15506 case align_branch_jmp:
15507 branch = "jmp";
15508 break;
15509 case align_branch_call:
15510 branch = "call";
15511 break;
15512 case align_branch_indirect:
15513 branch = "indiret branch";
15514 break;
15515 case align_branch_ret:
15516 branch = "ret";
15517 break;
15518 default:
15519 break;
15520 }
15521
15522 fprintf (stdout, msg,
15523 fragP->fr_file, fragP->fr_line, size, prefix,
15524 (long long) fragP->fr_address, branch,
15525 1 << align_branch_power);
15526 }
15527 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
15528 memset (fragP->fr_opcode,
15529 fragP->tc_frag_data.default_prefix, size);
15530 else
15531 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
15532 size, 0);
15533 fragP->fr_fix += size;
15534 }
15535 return;
15536 }
15537
252b5132
RH
15538 opcode = (unsigned char *) fragP->fr_opcode;
15539
47926f60 15540 /* Address we want to reach in file space. */
252b5132 15541 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 15542
47926f60 15543 /* Address opcode resides at in file space. */
252b5132
RH
15544 opcode_address = fragP->fr_address + fragP->fr_fix;
15545
47926f60 15546 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
15547 displacement_from_opcode_start = target_address - opcode_address;
15548
fddf5b5b 15549 if ((fragP->fr_subtype & BIG) == 0)
252b5132 15550 {
47926f60
KH
15551 /* Don't have to change opcode. */
15552 extension = 1; /* 1 opcode + 1 displacement */
252b5132 15553 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
15554 }
15555 else
15556 {
15557 if (no_cond_jump_promotion
15558 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
15559 as_warn_where (fragP->fr_file, fragP->fr_line,
15560 _("long jump required"));
252b5132 15561
fddf5b5b
AM
15562 switch (fragP->fr_subtype)
15563 {
15564 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
15565 extension = 4; /* 1 opcode + 4 displacement */
15566 opcode[0] = 0xe9;
15567 where_to_put_displacement = &opcode[1];
15568 break;
252b5132 15569
fddf5b5b
AM
15570 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
15571 extension = 2; /* 1 opcode + 2 displacement */
15572 opcode[0] = 0xe9;
15573 where_to_put_displacement = &opcode[1];
15574 break;
252b5132 15575
fddf5b5b
AM
15576 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
15577 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
15578 extension = 5; /* 2 opcode + 4 displacement */
15579 opcode[1] = opcode[0] + 0x10;
15580 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
15581 where_to_put_displacement = &opcode[2];
15582 break;
252b5132 15583
fddf5b5b
AM
15584 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
15585 extension = 3; /* 2 opcode + 2 displacement */
15586 opcode[1] = opcode[0] + 0x10;
15587 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
15588 where_to_put_displacement = &opcode[2];
15589 break;
252b5132 15590
fddf5b5b
AM
15591 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
15592 extension = 4;
15593 opcode[0] ^= 1;
15594 opcode[1] = 3;
15595 opcode[2] = 0xe9;
15596 where_to_put_displacement = &opcode[3];
15597 break;
15598
15599 default:
15600 BAD_CASE (fragP->fr_subtype);
15601 break;
15602 }
252b5132 15603 }
fddf5b5b 15604
7b81dfbb
AJ
15605 /* If size if less then four we are sure that the operand fits,
15606 but if it's 4, then it could be that the displacement is larger
15607 then -/+ 2GB. */
15608 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
15609 && object_64bit
15610 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
15611 + ((addressT) 1 << 31))
15612 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
15613 {
15614 as_bad_where (fragP->fr_file, fragP->fr_line,
15615 _("jump target out of range"));
15616 /* Make us emit 0. */
15617 displacement_from_opcode_start = extension;
15618 }
47926f60 15619 /* Now put displacement after opcode. */
252b5132
RH
15620 md_number_to_chars ((char *) where_to_put_displacement,
15621 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 15622 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
15623 fragP->fr_fix += extension;
15624}
15625\f
7016a5d5 15626/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
15627 by our caller that we have all the info we need to fix it up.
15628
7016a5d5
TG
15629 Parameter valP is the pointer to the value of the bits.
15630
252b5132
RH
15631 On the 386, immediates, displacements, and data pointers are all in
15632 the same (little-endian) format, so we don't need to care about which
15633 we are handling. */
15634
94f592af 15635void
7016a5d5 15636md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 15637{
94f592af 15638 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 15639 valueT value = *valP;
252b5132 15640
f86103b7 15641#if !defined (TE_Mach)
93382f6d
AM
15642 if (fixP->fx_pcrel)
15643 {
15644 switch (fixP->fx_r_type)
15645 {
5865bb77
ILT
15646 default:
15647 break;
15648
d6ab8113
JB
15649 case BFD_RELOC_64:
15650 fixP->fx_r_type = BFD_RELOC_64_PCREL;
15651 break;
93382f6d 15652 case BFD_RELOC_32:
ae8887b5 15653 case BFD_RELOC_X86_64_32S:
93382f6d
AM
15654 fixP->fx_r_type = BFD_RELOC_32_PCREL;
15655 break;
15656 case BFD_RELOC_16:
15657 fixP->fx_r_type = BFD_RELOC_16_PCREL;
15658 break;
15659 case BFD_RELOC_8:
15660 fixP->fx_r_type = BFD_RELOC_8_PCREL;
15661 break;
15662 }
15663 }
252b5132 15664
a161fe53 15665 if (fixP->fx_addsy != NULL
31312f95 15666 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 15667 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 15668 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 15669 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 15670 && !use_rela_relocations)
252b5132 15671 {
31312f95
AM
15672 /* This is a hack. There should be a better way to handle this.
15673 This covers for the fact that bfd_install_relocation will
15674 subtract the current location (for partial_inplace, PC relative
15675 relocations); see more below. */
252b5132 15676#ifndef OBJ_AOUT
718ddfc0 15677 if (IS_ELF
252b5132
RH
15678#ifdef TE_PE
15679 || OUTPUT_FLAVOR == bfd_target_coff_flavour
15680#endif
15681 )
15682 value += fixP->fx_where + fixP->fx_frag->fr_address;
15683#endif
15684#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 15685 if (IS_ELF)
252b5132 15686 {
6539b54b 15687 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 15688
6539b54b 15689 if ((sym_seg == seg
2f66722d 15690 || (symbol_section_p (fixP->fx_addsy)
6539b54b 15691 && sym_seg != absolute_section))
af65af87 15692 && !generic_force_reloc (fixP))
2f66722d
AM
15693 {
15694 /* Yes, we add the values in twice. This is because
6539b54b
AM
15695 bfd_install_relocation subtracts them out again. I think
15696 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
15697 it. FIXME. */
15698 value += fixP->fx_where + fixP->fx_frag->fr_address;
15699 }
252b5132
RH
15700 }
15701#endif
15702#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
15703 /* For some reason, the PE format does not store a
15704 section address offset for a PC relative symbol. */
15705 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 15706 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
15707 value += md_pcrel_from (fixP);
15708#endif
15709 }
fbeb56a4 15710#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
15711 if (fixP->fx_addsy != NULL
15712 && S_IS_WEAK (fixP->fx_addsy)
15713 /* PR 16858: Do not modify weak function references. */
15714 && ! fixP->fx_pcrel)
fbeb56a4 15715 {
296a8689
NC
15716#if !defined (TE_PEP)
15717 /* For x86 PE weak function symbols are neither PC-relative
15718 nor do they set S_IS_FUNCTION. So the only reliable way
15719 to detect them is to check the flags of their containing
15720 section. */
15721 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
15722 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
15723 ;
15724 else
15725#endif
fbeb56a4
DK
15726 value -= S_GET_VALUE (fixP->fx_addsy);
15727 }
15728#endif
252b5132
RH
15729
15730 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 15731 and we must not disappoint it. */
252b5132 15732#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 15733 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
15734 switch (fixP->fx_r_type)
15735 {
15736 case BFD_RELOC_386_PLT32:
3e73aa7c 15737 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
15738 /* Make the jump instruction point to the address of the operand.
15739 At runtime we merely add the offset to the actual PLT entry.
15740 NB: Subtract the offset size only for jump instructions. */
15741 if (fixP->fx_pcrel)
15742 value = -4;
47926f60 15743 break;
31312f95 15744
13ae64f3
JJ
15745 case BFD_RELOC_386_TLS_GD:
15746 case BFD_RELOC_386_TLS_LDM:
13ae64f3 15747 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
15748 case BFD_RELOC_386_TLS_IE:
15749 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 15750 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
15751 case BFD_RELOC_X86_64_TLSGD:
15752 case BFD_RELOC_X86_64_TLSLD:
15753 case BFD_RELOC_X86_64_GOTTPOFF:
a533c8df 15754 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF:
5bc71c2a 15755 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF:
67a4f2b7 15756 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
a533c8df 15757 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC:
00f7efb6
JJ
15758 value = 0; /* Fully resolved at runtime. No addend. */
15759 /* Fallthrough */
15760 case BFD_RELOC_386_TLS_LE:
15761 case BFD_RELOC_386_TLS_LDO_32:
15762 case BFD_RELOC_386_TLS_LE_32:
15763 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 15764 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 15765 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 15766 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
15767 S_SET_THREAD_LOCAL (fixP->fx_addsy);
15768 break;
15769
67a4f2b7
AO
15770 case BFD_RELOC_386_TLS_DESC_CALL:
15771 case BFD_RELOC_X86_64_TLSDESC_CALL:
15772 value = 0; /* Fully resolved at runtime. No addend. */
15773 S_SET_THREAD_LOCAL (fixP->fx_addsy);
15774 fixP->fx_done = 0;
15775 return;
15776
47926f60
KH
15777 case BFD_RELOC_VTABLE_INHERIT:
15778 case BFD_RELOC_VTABLE_ENTRY:
15779 fixP->fx_done = 0;
94f592af 15780 return;
47926f60
KH
15781
15782 default:
15783 break;
15784 }
15785#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
a442cac5
JB
15786
15787 /* If not 64bit, massage value, to account for wraparound when !BFD64. */
15788 if (!object_64bit)
15789 value = extend_to_32bit_address (value);
15790
c6682705 15791 *valP = value;
f86103b7 15792#endif /* !defined (TE_Mach) */
3e73aa7c 15793
3e73aa7c 15794 /* Are we finished with this relocation now? */
c6682705 15795 if (fixP->fx_addsy == NULL)
b8188555
JB
15796 {
15797 fixP->fx_done = 1;
15798 switch (fixP->fx_r_type)
15799 {
15800 case BFD_RELOC_X86_64_32S:
15801 fixP->fx_signed = 1;
15802 break;
15803
15804 default:
15805 break;
15806 }
15807 }
fbeb56a4
DK
15808#if defined (OBJ_COFF) && defined (TE_PE)
15809 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
15810 {
15811 fixP->fx_done = 0;
15812 /* Remember value for tc_gen_reloc. */
15813 fixP->fx_addnumber = value;
15814 /* Clear out the frag for now. */
15815 value = 0;
15816 }
15817#endif
3e73aa7c
JH
15818 else if (use_rela_relocations)
15819 {
46fb6d5a
JB
15820 if (!disallow_64bit_reloc || fixP->fx_r_type == NO_RELOC)
15821 fixP->fx_no_overflow = 1;
062cd5e7
AS
15822 /* Remember value for tc_gen_reloc. */
15823 fixP->fx_addnumber = value;
3e73aa7c
JH
15824 value = 0;
15825 }
f86103b7 15826
94f592af 15827 md_number_to_chars (p, value, fixP->fx_size);
252b5132 15828}
252b5132 15829\f
6d4af3c2 15830const char *
499ac353 15831md_atof (int type, char *litP, int *sizeP)
252b5132 15832{
499ac353
NC
15833 /* This outputs the LITTLENUMs in REVERSE order;
15834 in accord with the bigendian 386. */
5b7c81bd 15835 return ieee_md_atof (type, litP, sizeP, false);
252b5132
RH
15836}
15837\f
2d545b82 15838static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 15839
252b5132 15840static char *
e3bb37b5 15841output_invalid (int c)
252b5132 15842{
3882b010 15843 if (ISPRINT (c))
f9f21a03
L
15844 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
15845 "'%c'", c);
252b5132 15846 else
f9f21a03 15847 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 15848 "(0x%x)", (unsigned char) c);
252b5132
RH
15849 return output_invalid_buf;
15850}
15851
8a6fb3f9
JB
15852/* Verify that @r can be used in the current context. */
15853
5b7c81bd 15854static bool check_register (const reg_entry *r)
8a6fb3f9
JB
15855{
15856 if (allow_pseudo_reg)
5b7c81bd 15857 return true;
8a6fb3f9
JB
15858
15859 if (operand_type_all_zero (&r->reg_type))
5b7c81bd 15860 return false;
8a6fb3f9
JB
15861
15862 if ((r->reg_type.bitfield.dword
15863 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
15864 || r->reg_type.bitfield.class == RegCR
22e00a3f 15865 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9 15866 && !cpu_arch_flags.bitfield.cpui386)
5b7c81bd 15867 return false;
8a6fb3f9 15868
22e00a3f
JB
15869 if (r->reg_type.bitfield.class == RegTR
15870 && (flag_code == CODE_64BIT
15871 || !cpu_arch_flags.bitfield.cpui386
15872 || cpu_arch_isa_flags.bitfield.cpui586
15873 || cpu_arch_isa_flags.bitfield.cpui686))
5b7c81bd 15874 return false;
22e00a3f 15875
8a6fb3f9 15876 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
5b7c81bd 15877 return false;
8a6fb3f9
JB
15878
15879 if (!cpu_arch_flags.bitfield.cpuavx512f)
15880 {
15881 if (r->reg_type.bitfield.zmmword
15882 || r->reg_type.bitfield.class == RegMask)
5b7c81bd 15883 return false;
8a6fb3f9
JB
15884
15885 if (!cpu_arch_flags.bitfield.cpuavx)
15886 {
15887 if (r->reg_type.bitfield.ymmword)
5b7c81bd 15888 return false;
8a6fb3f9
JB
15889
15890 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
5b7c81bd 15891 return false;
8a6fb3f9
JB
15892 }
15893 }
15894
a6f3add0
JB
15895 if (r->reg_type.bitfield.zmmword)
15896 {
15897 if (vector_size < VSZ512)
15898 return false;
15899
eb3f3841
JB
15900 switch (i.encoding)
15901 {
15902 case encoding_default:
15903 case encoding_egpr:
15904 i.encoding = encoding_evex512;
15905 break;
15906 case encoding_evex:
15907 case encoding_evex512:
15908 break;
15909 default:
15910 i.encoding = encoding_error;
15911 break;
15912 }
a6f3add0 15913 }
4fc85f37
JB
15914
15915 if (vector_size < VSZ256 && r->reg_type.bitfield.ymmword)
15916 return false;
15917
260cd341
LC
15918 if (r->reg_type.bitfield.tmmword
15919 && (!cpu_arch_flags.bitfield.cpuamx_tile
15920 || flag_code != CODE_64BIT))
5b7c81bd 15921 return false;
260cd341 15922
8a6fb3f9 15923 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
5b7c81bd 15924 return false;
8a6fb3f9
JB
15925
15926 /* Don't allow fake index register unless allow_index_reg isn't 0. */
15927 if (!allow_index_reg && r->reg_num == RegIZ)
5b7c81bd 15928 return false;
8a6fb3f9
JB
15929
15930 /* Upper 16 vector registers are only available with VREX in 64bit
15931 mode, and require EVEX encoding. */
15932 if (r->reg_flags & RegVRex)
15933 {
15934 if (!cpu_arch_flags.bitfield.cpuavx512f
15935 || flag_code != CODE_64BIT)
5b7c81bd 15936 return false;
8a6fb3f9 15937
eb3f3841
JB
15938 switch (i.encoding)
15939 {
15940 case encoding_default:
15941 case encoding_egpr:
15942 case encoding_evex512:
15943 i.encoding = encoding_evex;
15944 break;
15945 case encoding_evex:
15946 break;
15947 default:
15948 i.encoding = encoding_error;
15949 break;
15950 }
8a6fb3f9
JB
15951 }
15952
80d61d8d
CL
15953 if (r->reg_flags & RegRex2)
15954 {
15955 if (!cpu_arch_flags.bitfield.cpuapx_f
15956 || flag_code != CODE_64BIT)
15957 return false;
6177c84d 15958
eb3f3841
JB
15959 switch (i.encoding)
15960 {
15961 case encoding_default:
15962 i.encoding = encoding_egpr;
15963 break;
15964 case encoding_egpr:
15965 case encoding_evex:
15966 case encoding_evex512:
15967 break;
15968 default:
15969 i.encoding = encoding_error;
15970 break;
15971 }
80d61d8d
CL
15972 }
15973
8a6fb3f9 15974 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
da5f9eb4 15975 && (!cpu_arch_flags.bitfield.cpu64
0ff3b7d0
JB
15976 || r->reg_type.bitfield.class != RegCR
15977 || dot_insn ())
8a6fb3f9 15978 && flag_code != CODE_64BIT)
5b7c81bd 15979 return false;
8a6fb3f9
JB
15980
15981 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
15982 && !intel_syntax)
5b7c81bd 15983 return false;
8a6fb3f9 15984
5b7c81bd 15985 return true;
8a6fb3f9
JB
15986}
15987
af6bdddf 15988/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
15989
15990static const reg_entry *
74e05e01 15991parse_real_register (const char *reg_string, char **end_op)
252b5132 15992{
74e05e01 15993 const char *s = reg_string;
af6bdddf 15994 char *p;
252b5132
RH
15995 char reg_name_given[MAX_REG_NAME_SIZE + 1];
15996 const reg_entry *r;
15997
15998 /* Skip possible REGISTER_PREFIX and possible whitespace. */
15999 if (*s == REGISTER_PREFIX)
16000 ++s;
16001
16002 if (is_space_char (*s))
16003 ++s;
16004
16005 p = reg_name_given;
af6bdddf 16006 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
16007 {
16008 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
16009 return (const reg_entry *) NULL;
16010 s++;
252b5132
RH
16011 }
16012
4795cd4a 16013 if (is_part_of_name (*s))
6588847e
DN
16014 return (const reg_entry *) NULL;
16015
74e05e01 16016 *end_op = (char *) s;
252b5132 16017
629310ab 16018 r = (const reg_entry *) str_hash_find (reg_hash, reg_name_given);
252b5132 16019
5f47d35b 16020 /* Handle floating point regs, allowing spaces in the (i) part. */
6288d05f 16021 if (r == reg_st0)
5f47d35b 16022 {
0e0eea78
JB
16023 if (!cpu_arch_flags.bitfield.cpu8087
16024 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
16025 && !cpu_arch_flags.bitfield.cpu387
16026 && !allow_pseudo_reg)
0e0eea78
JB
16027 return (const reg_entry *) NULL;
16028
5f47d35b
AM
16029 if (is_space_char (*s))
16030 ++s;
16031 if (*s == '(')
16032 {
af6bdddf 16033 ++s;
5f47d35b
AM
16034 if (is_space_char (*s))
16035 ++s;
16036 if (*s >= '0' && *s <= '7')
16037 {
db557034 16038 int fpr = *s - '0';
af6bdddf 16039 ++s;
5f47d35b
AM
16040 if (is_space_char (*s))
16041 ++s;
16042 if (*s == ')')
16043 {
74e05e01 16044 *end_op = (char *) s + 1;
6288d05f 16045 know (r[fpr].reg_num == fpr);
db557034 16046 return r + fpr;
5f47d35b 16047 }
5f47d35b 16048 }
47926f60 16049 /* We have "%st(" then garbage. */
5f47d35b
AM
16050 return (const reg_entry *) NULL;
16051 }
16052 }
16053
8a6fb3f9 16054 return r && check_register (r) ? r : NULL;
252b5132 16055}
4d1bb795
JB
16056
16057/* REG_STRING starts *before* REGISTER_PREFIX. */
16058
16059static const reg_entry *
4f081312 16060parse_register (const char *reg_string, char **end_op)
4d1bb795
JB
16061{
16062 const reg_entry *r;
16063
16064 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
16065 r = parse_real_register (reg_string, end_op);
16066 else
16067 r = NULL;
16068 if (!r)
16069 {
16070 char *save = input_line_pointer;
4f081312 16071 char *buf = xstrdup (reg_string), *name;
4d1bb795
JB
16072 symbolS *symbolP;
16073
4f081312
JB
16074 input_line_pointer = buf;
16075 get_symbol_name (&name);
16076 symbolP = symbol_find (name);
d50c498a 16077 while (symbolP && symbol_equated_p (symbolP))
64d23078
JB
16078 {
16079 const expressionS *e = symbol_get_value_expression(symbolP);
16080
d50c498a 16081 if (e->X_add_number)
64d23078
JB
16082 break;
16083 symbolP = e->X_add_symbol;
16084 }
4d1bb795
JB
16085 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
16086 {
16087 const expressionS *e = symbol_get_value_expression (symbolP);
16088
0ccade1a
JB
16089 if (e->X_op == O_register)
16090 {
16091 know (e->X_add_number >= 0
16092 && (valueT) e->X_add_number < i386_regtab_size);
16093 r = i386_regtab + e->X_add_number;
4f081312 16094 *end_op = (char *) reg_string + (input_line_pointer - buf);
0ccade1a
JB
16095 }
16096 if (r && !check_register (r))
8a6fb3f9 16097 {
3b55a1d0
JB
16098 as_bad (_("register '%s%s' cannot be used here"),
16099 register_prefix, r->reg_name);
16100 r = &bad_reg;
8a6fb3f9 16101 }
4d1bb795 16102 }
4d1bb795 16103 input_line_pointer = save;
4f081312 16104 free (buf);
4d1bb795
JB
16105 }
16106 return r;
16107}
16108
16109int
16110i386_parse_name (char *name, expressionS *e, char *nextcharP)
16111{
4faaa10f 16112 const reg_entry *r = NULL;
4d1bb795
JB
16113 char *end = input_line_pointer;
16114
6acf9130
JB
16115 /* We only know the terminating character here. It being double quote could
16116 be the closing one of a quoted symbol name, or an opening one from a
16117 following string (or another quoted symbol name). Since the latter can't
16118 be valid syntax for anything, bailing in either case is good enough. */
16119 if (*nextcharP == '"')
16120 return 0;
16121
4d1bb795 16122 *end = *nextcharP;
4faaa10f
JB
16123 if (*name == REGISTER_PREFIX || allow_naked_reg)
16124 r = parse_real_register (name, &input_line_pointer);
4d1bb795
JB
16125 if (r && end <= input_line_pointer)
16126 {
16127 *nextcharP = *input_line_pointer;
16128 *input_line_pointer = 0;
f847749a
JB
16129 e->X_op = O_register;
16130 e->X_add_number = r - i386_regtab;
4d1bb795
JB
16131 return 1;
16132 }
16133 input_line_pointer = end;
16134 *end = 0;
ee86248c 16135 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
16136}
16137
16138void
16139md_operand (expressionS *e)
16140{
ee86248c
JB
16141 char *end;
16142 const reg_entry *r;
4d1bb795 16143
ee86248c
JB
16144 switch (*input_line_pointer)
16145 {
16146 case REGISTER_PREFIX:
16147 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
16148 if (r)
16149 {
16150 e->X_op = O_register;
16151 e->X_add_number = r - i386_regtab;
16152 input_line_pointer = end;
16153 }
ee86248c
JB
16154 break;
16155
16156 case '[':
9c2799c2 16157 gas_assert (intel_syntax);
ee86248c
JB
16158 end = input_line_pointer++;
16159 expression (e);
16160 if (*input_line_pointer == ']')
16161 {
16162 ++input_line_pointer;
16163 e->X_op_symbol = make_expr_symbol (e);
16164 e->X_add_symbol = NULL;
16165 e->X_add_number = 0;
16166 e->X_op = O_index;
16167 }
16168 else
16169 {
16170 e->X_op = O_absent;
16171 input_line_pointer = end;
16172 }
16173 break;
4d1bb795
JB
16174 }
16175}
16176
5cc00775
JB
16177#ifdef BFD64
16178/* To maintain consistency with !BFD64 builds of gas record, whether any
16179 (binary) operator was involved in an expression. As expressions are
16180 evaluated in only 32 bits when !BFD64, we use this to decide whether to
16181 truncate results. */
16182bool i386_record_operator (operatorT op,
16183 const expressionS *left,
16184 const expressionS *right)
16185{
16186 if (op == O_absent)
16187 return false;
16188
16189 if (!left)
16190 {
16191 /* Since the expression parser applies unary operators fine to bignum
16192 operands, we don't need to be concerned of respective operands not
16193 fitting in 32 bits. */
16194 if (right->X_op == O_constant && right->X_unsigned
16195 && !fits_in_unsigned_long (right->X_add_number))
16196 return false;
16197 }
16198 /* This isn't entirely right: The pattern can also result when constant
16199 expressions are folded (e.g. 0xffffffff + 1). */
16200 else if ((left->X_op == O_constant && left->X_unsigned
16201 && !fits_in_unsigned_long (left->X_add_number))
16202 || (right->X_op == O_constant && right->X_unsigned
16203 && !fits_in_unsigned_long (right->X_add_number)))
16204 expr_mode = expr_large_value;
16205
16206 if (expr_mode != expr_large_value)
16207 expr_mode = expr_operator_present;
16208
16209 return false;
16210}
16211#endif
252b5132 16212\f
4cc782b5 16213#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 16214const char *md_shortopts = "kVQ:sqnO::";
252b5132 16215#else
b6f8c7c4 16216const char *md_shortopts = "qnO::";
252b5132 16217#endif
6e0b89ee 16218
3e73aa7c 16219#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
16220#define OPTION_64 (OPTION_MD_BASE + 1)
16221#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
16222#define OPTION_MARCH (OPTION_MD_BASE + 3)
16223#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
16224#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
16225#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
16226#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
16227#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 16228#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 16229#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 16230#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
16231#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
16232#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
16233#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 16234#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
16235#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
16236#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 16237#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 16238#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 16239#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 16240#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
16241#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
16242#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 16243#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 16244#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 16245#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
16246#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
16247#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
16248#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 16249#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
16250#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
16251#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
16252#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
c8480b58 16253#define OPTION_MUSE_UNALIGNED_VECTOR_MOVE (OPTION_MD_BASE + 34)
b3b91714 16254
99ad8390
NC
16255struct option md_longopts[] =
16256{
3e73aa7c 16257 {"32", no_argument, NULL, OPTION_32},
321098a5 16258#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 16259 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 16260 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
16261#endif
16262#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 16263 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 16264 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 16265 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 16266#endif
b3b91714 16267 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
16268 {"march", required_argument, NULL, OPTION_MARCH},
16269 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
16270 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
16271 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
16272 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
16273 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 16274 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
c8480b58 16275 {"muse-unaligned-vector-move", no_argument, NULL, OPTION_MUSE_UNALIGNED_VECTOR_MOVE},
daf50ae7 16276 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 16277 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 16278 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 16279 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 16280 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
16281 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
16282 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
16283# if defined (TE_PE) || defined (TE_PEP)
16284 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
16285#endif
d1982f93 16286 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 16287 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 16288 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 16289 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
16290 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
16291 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
16292 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 16293 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
16294 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
16295 {"mlfence-before-indirect-branch", required_argument, NULL,
16296 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
16297 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
16298 {"mamd64", no_argument, NULL, OPTION_MAMD64},
16299 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
16300 {NULL, no_argument, NULL, 0}
16301};
16302size_t md_longopts_size = sizeof (md_longopts);
16303
16304int
17b9d67d 16305md_parse_option (int c, const char *arg)
252b5132 16306{
91d6fa6a 16307 unsigned int j;
e379e5f3 16308 char *arch, *next, *saved, *type;
9103f4f4 16309
252b5132
RH
16310 switch (c)
16311 {
12b55ccc
L
16312 case 'n':
16313 optimize_align_code = 0;
16314 break;
16315
a38cf1db
AM
16316 case 'q':
16317 quiet_warnings = 1;
252b5132
RH
16318 break;
16319
16320#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
16321 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
16322 should be emitted or not. FIXME: Not implemented. */
16323 case 'Q':
d4693039
JB
16324 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
16325 return 0;
252b5132
RH
16326 break;
16327
16328 /* -V: SVR4 argument to print version ID. */
16329 case 'V':
16330 print_version_id ();
16331 break;
16332
a38cf1db
AM
16333 /* -k: Ignore for FreeBSD compatibility. */
16334 case 'k':
252b5132 16335 break;
4cc782b5
ILT
16336
16337 case 's':
16338 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 16339 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 16340 break;
8dcea932
L
16341
16342 case OPTION_MSHARED:
16343 shared = 1;
16344 break;
b4a3a7b4
L
16345
16346 case OPTION_X86_USED_NOTE:
16347 if (strcasecmp (arg, "yes") == 0)
16348 x86_used_note = 1;
16349 else if (strcasecmp (arg, "no") == 0)
16350 x86_used_note = 0;
16351 else
16352 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
16353 break;
16354
16355
99ad8390 16356#endif
321098a5 16357#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 16358 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
16359 case OPTION_64:
16360 {
16361 const char **list, **l;
16362
3e73aa7c
JH
16363 list = bfd_target_list ();
16364 for (l = list; *l != NULL; l++)
08dedd66 16365 if (startswith (*l, "elf64-x86-64")
99ad8390
NC
16366 || strcmp (*l, "coff-x86-64") == 0
16367 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
16368 || strcmp (*l, "pei-x86-64") == 0
16369 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
16370 {
16371 default_arch = "x86_64";
16372 break;
16373 }
3e73aa7c 16374 if (*l == NULL)
2b5d6a91 16375 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
16376 free (list);
16377 }
16378 break;
16379#endif
252b5132 16380
351f65ca 16381#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 16382 case OPTION_X32:
351f65ca
L
16383 if (IS_ELF)
16384 {
16385 const char **list, **l;
16386
16387 list = bfd_target_list ();
16388 for (l = list; *l != NULL; l++)
08dedd66 16389 if (startswith (*l, "elf32-x86-64"))
351f65ca
L
16390 {
16391 default_arch = "x86_64:32";
16392 break;
16393 }
16394 if (*l == NULL)
2b5d6a91 16395 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
16396 free (list);
16397 }
16398 else
16399 as_fatal (_("32bit x86_64 is only supported for ELF"));
16400 break;
16401#endif
16402
6e0b89ee 16403 case OPTION_32:
590a0fed
JB
16404 {
16405 const char **list, **l;
16406
16407 list = bfd_target_list ();
16408 for (l = list; *l != NULL; l++)
16409 if (strstr (*l, "-i386")
16410 || strstr (*l, "-go32"))
16411 {
16412 default_arch = "i386";
16413 break;
16414 }
16415 if (*l == NULL)
16416 as_fatal (_("no compiled in support for ix86"));
16417 free (list);
16418 }
6e0b89ee
AM
16419 break;
16420
b3b91714
AM
16421 case OPTION_DIVIDE:
16422#ifdef SVR4_COMMENT_CHARS
16423 {
16424 char *n, *t;
16425 const char *s;
16426
add39d23 16427 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
16428 t = n;
16429 for (s = i386_comment_chars; *s != '\0'; s++)
16430 if (*s != '/')
16431 *t++ = *s;
16432 *t = '\0';
16433 i386_comment_chars = n;
16434 }
16435#endif
16436 break;
16437
9103f4f4 16438 case OPTION_MARCH:
293f5f65
L
16439 saved = xstrdup (arg);
16440 arch = saved;
16441 /* Allow -march=+nosse. */
16442 if (*arch == '+')
16443 arch++;
6305a203 16444 do
9103f4f4 16445 {
4fc85f37
JB
16446 char *vsz;
16447
6305a203 16448 if (*arch == '.')
2b5d6a91 16449 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
16450 next = strchr (arch, '+');
16451 if (next)
16452 *next++ = '\0';
4fc85f37
JB
16453 vsz = strchr (arch, '/');
16454 if (vsz)
16455 *vsz++ = '\0';
91d6fa6a 16456 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 16457 {
4fc85f37
JB
16458 if (vsz && cpu_arch[j].vsz != vsz_set)
16459 continue;
16460
ae89daec
JB
16461 if (arch == saved && cpu_arch[j].type != PROCESSOR_NONE
16462 && strcmp (arch, cpu_arch[j].name) == 0)
ccc9c027 16463 {
6305a203 16464 /* Processor. */
ae89daec 16465 if (! cpu_arch[j].enable.bitfield.cpui386)
1ded5609
JB
16466 continue;
16467
91d6fa6a 16468 cpu_arch_name = cpu_arch[j].name;
d92c7521 16469 free (cpu_sub_arch_name);
6305a203 16470 cpu_sub_arch_name = NULL;
ae89daec 16471 cpu_arch_flags = cpu_arch[j].enable;
91d6fa6a 16472 cpu_arch_isa = cpu_arch[j].type;
ae89daec 16473 cpu_arch_isa_flags = cpu_arch[j].enable;
6305a203 16474 if (!cpu_arch_tune_set)
fb263707 16475 cpu_arch_tune = cpu_arch_isa;
4fc85f37 16476 vector_size = VSZ_DEFAULT;
6305a203
L
16477 break;
16478 }
ae89daec
JB
16479 else if (cpu_arch[j].type == PROCESSOR_NONE
16480 && strcmp (arch, cpu_arch[j].name) == 0
16481 && !cpu_flags_all_zero (&cpu_arch[j].enable))
6305a203 16482 {
33eaf5de 16483 /* ISA extension. */
bd483d21 16484 isa_enable (j);
4fc85f37
JB
16485
16486 switch (cpu_arch[j].vsz)
16487 {
16488 default:
16489 break;
16490
16491 case vsz_set:
16492 if (vsz)
16493 {
16494 char *end;
16495 unsigned long val = strtoul (vsz, &end, 0);
16496
16497 if (*end)
16498 val = 0;
16499 switch (val)
16500 {
16501 case 512: vector_size = VSZ512; break;
16502 case 256: vector_size = VSZ256; break;
16503 case 128: vector_size = VSZ128; break;
16504 default:
16505 as_warn (_("Unrecognized vector size specifier ignored"));
16506 break;
16507 }
16508 break;
16509 }
16510 /* Fall through. */
16511 case vsz_reset:
16512 vector_size = VSZ_DEFAULT;
16513 break;
16514 }
16515
6305a203 16516 break;
ccc9c027 16517 }
9103f4f4 16518 }
6305a203 16519
ae89daec 16520 if (j >= ARRAY_SIZE (cpu_arch) && startswith (arch, "no"))
293f5f65 16521 {
33eaf5de 16522 /* Disable an ISA extension. */
ae89daec
JB
16523 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
16524 if (cpu_arch[j].type == PROCESSOR_NONE
16525 && strcmp (arch + 2, cpu_arch[j].name) == 0)
293f5f65 16526 {
bd483d21 16527 isa_disable (j);
4fc85f37
JB
16528 if (cpu_arch[j].vsz == vsz_set)
16529 vector_size = VSZ_DEFAULT;
293f5f65
L
16530 break;
16531 }
293f5f65
L
16532 }
16533
91d6fa6a 16534 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 16535 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
16536
16537 arch = next;
9103f4f4 16538 }
293f5f65
L
16539 while (next != NULL);
16540 free (saved);
9103f4f4
L
16541 break;
16542
16543 case OPTION_MTUNE:
16544 if (*arg == '.')
2b5d6a91 16545 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 16546 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 16547 {
ae89daec
JB
16548 if (cpu_arch[j].type != PROCESSOR_NONE
16549 && strcmp (arg, cpu_arch[j].name) == 0)
9103f4f4 16550 {
ccc9c027 16551 cpu_arch_tune_set = 1;
91d6fa6a 16552 cpu_arch_tune = cpu_arch [j].type;
9103f4f4
L
16553 break;
16554 }
16555 }
91d6fa6a 16556 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 16557 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
16558 break;
16559
1efbbeb4
L
16560 case OPTION_MMNEMONIC:
16561 if (strcasecmp (arg, "att") == 0)
16562 intel_mnemonic = 0;
16563 else if (strcasecmp (arg, "intel") == 0)
16564 intel_mnemonic = 1;
16565 else
2b5d6a91 16566 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
16567 break;
16568
16569 case OPTION_MSYNTAX:
16570 if (strcasecmp (arg, "att") == 0)
213f15cf 16571 _set_intel_syntax (0);
1efbbeb4 16572 else if (strcasecmp (arg, "intel") == 0)
213f15cf 16573 _set_intel_syntax (1);
1efbbeb4 16574 else
2b5d6a91 16575 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
16576 break;
16577
16578 case OPTION_MINDEX_REG:
16579 allow_index_reg = 1;
16580 break;
16581
16582 case OPTION_MNAKED_REG:
16583 allow_naked_reg = 1;
213f15cf 16584 register_prefix = "";
1efbbeb4
L
16585 break;
16586
c0f3af97
L
16587 case OPTION_MSSE2AVX:
16588 sse2avx = 1;
16589 break;
16590
c8480b58
L
16591 case OPTION_MUSE_UNALIGNED_VECTOR_MOVE:
16592 use_unaligned_vector_move = 1;
16593 break;
16594
daf50ae7
L
16595 case OPTION_MSSE_CHECK:
16596 if (strcasecmp (arg, "error") == 0)
7bab8ab5 16597 sse_check = check_error;
daf50ae7 16598 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 16599 sse_check = check_warning;
daf50ae7 16600 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 16601 sse_check = check_none;
daf50ae7 16602 else
2b5d6a91 16603 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
16604 break;
16605
7bab8ab5
JB
16606 case OPTION_MOPERAND_CHECK:
16607 if (strcasecmp (arg, "error") == 0)
16608 operand_check = check_error;
16609 else if (strcasecmp (arg, "warning") == 0)
16610 operand_check = check_warning;
16611 else if (strcasecmp (arg, "none") == 0)
16612 operand_check = check_none;
16613 else
16614 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
16615 break;
16616
539f890d
L
16617 case OPTION_MAVXSCALAR:
16618 if (strcasecmp (arg, "128") == 0)
16619 avxscalar = vex128;
16620 else if (strcasecmp (arg, "256") == 0)
16621 avxscalar = vex256;
16622 else
2b5d6a91 16623 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
16624 break;
16625
03751133
L
16626 case OPTION_MVEXWIG:
16627 if (strcmp (arg, "0") == 0)
40c9c8de 16628 vexwig = vexw0;
03751133 16629 else if (strcmp (arg, "1") == 0)
40c9c8de 16630 vexwig = vexw1;
03751133
L
16631 else
16632 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
16633 break;
16634
7e8b059b
L
16635 case OPTION_MADD_BND_PREFIX:
16636 add_bnd_prefix = 1;
16637 break;
16638
43234a1e
L
16639 case OPTION_MEVEXLIG:
16640 if (strcmp (arg, "128") == 0)
16641 evexlig = evexl128;
16642 else if (strcmp (arg, "256") == 0)
16643 evexlig = evexl256;
16644 else if (strcmp (arg, "512") == 0)
16645 evexlig = evexl512;
16646 else
16647 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
16648 break;
16649
d3d3c6db
IT
16650 case OPTION_MEVEXRCIG:
16651 if (strcmp (arg, "rne") == 0)
16652 evexrcig = rne;
16653 else if (strcmp (arg, "rd") == 0)
16654 evexrcig = rd;
16655 else if (strcmp (arg, "ru") == 0)
16656 evexrcig = ru;
16657 else if (strcmp (arg, "rz") == 0)
16658 evexrcig = rz;
16659 else
16660 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
16661 break;
16662
43234a1e
L
16663 case OPTION_MEVEXWIG:
16664 if (strcmp (arg, "0") == 0)
16665 evexwig = evexw0;
16666 else if (strcmp (arg, "1") == 0)
16667 evexwig = evexw1;
16668 else
16669 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
16670 break;
16671
167ad85b
TG
16672# if defined (TE_PE) || defined (TE_PEP)
16673 case OPTION_MBIG_OBJ:
16674 use_big_obj = 1;
16675 break;
16676#endif
16677
d1982f93 16678 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
16679 if (strcasecmp (arg, "yes") == 0)
16680 omit_lock_prefix = 1;
16681 else if (strcasecmp (arg, "no") == 0)
16682 omit_lock_prefix = 0;
16683 else
16684 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
16685 break;
16686
e4e00185
AS
16687 case OPTION_MFENCE_AS_LOCK_ADD:
16688 if (strcasecmp (arg, "yes") == 0)
16689 avoid_fence = 1;
16690 else if (strcasecmp (arg, "no") == 0)
16691 avoid_fence = 0;
16692 else
16693 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
16694 break;
16695
ae531041
L
16696 case OPTION_MLFENCE_AFTER_LOAD:
16697 if (strcasecmp (arg, "yes") == 0)
16698 lfence_after_load = 1;
16699 else if (strcasecmp (arg, "no") == 0)
16700 lfence_after_load = 0;
16701 else
16702 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
16703 break;
16704
16705 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
16706 if (strcasecmp (arg, "all") == 0)
a09f656b 16707 {
16708 lfence_before_indirect_branch = lfence_branch_all;
16709 if (lfence_before_ret == lfence_before_ret_none)
16710 lfence_before_ret = lfence_before_ret_shl;
16711 }
ae531041
L
16712 else if (strcasecmp (arg, "memory") == 0)
16713 lfence_before_indirect_branch = lfence_branch_memory;
16714 else if (strcasecmp (arg, "register") == 0)
16715 lfence_before_indirect_branch = lfence_branch_register;
16716 else if (strcasecmp (arg, "none") == 0)
16717 lfence_before_indirect_branch = lfence_branch_none;
16718 else
16719 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
16720 arg);
16721 break;
16722
16723 case OPTION_MLFENCE_BEFORE_RET:
16724 if (strcasecmp (arg, "or") == 0)
16725 lfence_before_ret = lfence_before_ret_or;
16726 else if (strcasecmp (arg, "not") == 0)
16727 lfence_before_ret = lfence_before_ret_not;
a09f656b 16728 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
16729 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
16730 else if (strcasecmp (arg, "none") == 0)
16731 lfence_before_ret = lfence_before_ret_none;
16732 else
16733 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
16734 arg);
16735 break;
16736
0cb4071e
L
16737 case OPTION_MRELAX_RELOCATIONS:
16738 if (strcasecmp (arg, "yes") == 0)
16739 generate_relax_relocations = 1;
16740 else if (strcasecmp (arg, "no") == 0)
16741 generate_relax_relocations = 0;
16742 else
16743 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
16744 break;
16745
e379e5f3
L
16746 case OPTION_MALIGN_BRANCH_BOUNDARY:
16747 {
16748 char *end;
16749 long int align = strtoul (arg, &end, 0);
16750 if (*end == '\0')
16751 {
16752 if (align == 0)
16753 {
16754 align_branch_power = 0;
16755 break;
16756 }
16757 else if (align >= 16)
16758 {
16759 int align_power;
16760 for (align_power = 0;
16761 (align & 1) == 0;
16762 align >>= 1, align_power++)
16763 continue;
16764 /* Limit alignment power to 31. */
16765 if (align == 1 && align_power < 32)
16766 {
16767 align_branch_power = align_power;
16768 break;
16769 }
16770 }
16771 }
16772 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
16773 }
16774 break;
16775
16776 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
16777 {
16778 char *end;
16779 int align = strtoul (arg, &end, 0);
16780 /* Some processors only support 5 prefixes. */
16781 if (*end == '\0' && align >= 0 && align < 6)
16782 {
16783 align_branch_prefix_size = align;
16784 break;
16785 }
16786 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
16787 arg);
16788 }
16789 break;
16790
16791 case OPTION_MALIGN_BRANCH:
16792 align_branch = 0;
16793 saved = xstrdup (arg);
16794 type = saved;
16795 do
16796 {
16797 next = strchr (type, '+');
16798 if (next)
16799 *next++ = '\0';
16800 if (strcasecmp (type, "jcc") == 0)
16801 align_branch |= align_branch_jcc_bit;
16802 else if (strcasecmp (type, "fused") == 0)
16803 align_branch |= align_branch_fused_bit;
16804 else if (strcasecmp (type, "jmp") == 0)
16805 align_branch |= align_branch_jmp_bit;
16806 else if (strcasecmp (type, "call") == 0)
16807 align_branch |= align_branch_call_bit;
16808 else if (strcasecmp (type, "ret") == 0)
16809 align_branch |= align_branch_ret_bit;
16810 else if (strcasecmp (type, "indirect") == 0)
16811 align_branch |= align_branch_indirect_bit;
16812 else
16813 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
16814 type = next;
16815 }
16816 while (next != NULL);
16817 free (saved);
16818 break;
16819
76cf450b
L
16820 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
16821 align_branch_power = 5;
16822 align_branch_prefix_size = 5;
16823 align_branch = (align_branch_jcc_bit
16824 | align_branch_fused_bit
16825 | align_branch_jmp_bit);
16826 break;
16827
5db04b09 16828 case OPTION_MAMD64:
4b5aaf5f 16829 isa64 = amd64;
5db04b09
L
16830 break;
16831
16832 case OPTION_MINTEL64:
4b5aaf5f 16833 isa64 = intel64;
5db04b09
L
16834 break;
16835
b6f8c7c4
L
16836 case 'O':
16837 if (arg == NULL)
16838 {
16839 optimize = 1;
16840 /* Turn off -Os. */
16841 optimize_for_space = 0;
16842 }
16843 else if (*arg == 's')
16844 {
16845 optimize_for_space = 1;
16846 /* Turn on all encoding optimizations. */
41fd2579 16847 optimize = INT_MAX;
b6f8c7c4
L
16848 }
16849 else
16850 {
16851 optimize = atoi (arg);
16852 /* Turn off -Os. */
16853 optimize_for_space = 0;
16854 }
16855 break;
16856
252b5132
RH
16857 default:
16858 return 0;
16859 }
16860 return 1;
16861}
16862
8a2c8fef
L
16863#define MESSAGE_TEMPLATE \
16864" "
16865
293f5f65
L
16866static char *
16867output_message (FILE *stream, char *p, char *message, char *start,
16868 int *left_p, const char *name, int len)
16869{
16870 int size = sizeof (MESSAGE_TEMPLATE);
16871 int left = *left_p;
16872
16873 /* Reserve 2 spaces for ", " or ",\0" */
16874 left -= len + 2;
16875
16876 /* Check if there is any room. */
16877 if (left >= 0)
16878 {
16879 if (p != start)
16880 {
16881 *p++ = ',';
16882 *p++ = ' ';
16883 }
16884 p = mempcpy (p, name, len);
16885 }
16886 else
16887 {
16888 /* Output the current message now and start a new one. */
16889 *p++ = ',';
16890 *p = '\0';
16891 fprintf (stream, "%s\n", message);
16892 p = start;
16893 left = size - (start - message) - len - 2;
16894
16895 gas_assert (left >= 0);
16896
16897 p = mempcpy (p, name, len);
16898 }
16899
16900 *left_p = left;
16901 return p;
16902}
16903
8a2c8fef 16904static void
1ded5609 16905show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
16906{
16907 static char message[] = MESSAGE_TEMPLATE;
16908 char *start = message + 27;
16909 char *p;
16910 int size = sizeof (MESSAGE_TEMPLATE);
16911 int left;
16912 const char *name;
16913 int len;
16914 unsigned int j;
16915
16916 p = start;
16917 left = size - (start - message);
3ce2ebcf
JB
16918
16919 if (!ext && check)
16920 {
16921 p = output_message (stream, p, message, start, &left,
16922 STRING_COMMA_LEN ("default"));
f68697e8
JB
16923 p = output_message (stream, p, message, start, &left,
16924 STRING_COMMA_LEN ("push"));
16925 p = output_message (stream, p, message, start, &left,
16926 STRING_COMMA_LEN ("pop"));
3ce2ebcf
JB
16927 }
16928
8a2c8fef
L
16929 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
16930 {
16931 /* Should it be skipped? */
16932 if (cpu_arch [j].skip)
16933 continue;
16934
16935 name = cpu_arch [j].name;
16936 len = cpu_arch [j].len;
ae89daec 16937 if (cpu_arch[j].type == PROCESSOR_NONE)
8a2c8fef
L
16938 {
16939 /* It is an extension. Skip if we aren't asked to show it. */
ae89daec 16940 if (!ext || cpu_flags_all_zero (&cpu_arch[j].enable))
8a2c8fef
L
16941 continue;
16942 }
16943 else if (ext)
16944 {
16945 /* It is an processor. Skip if we show only extension. */
16946 continue;
16947 }
ae89daec 16948 else if (check && ! cpu_arch[j].enable.bitfield.cpui386)
1ded5609
JB
16949 {
16950 /* It is an impossible processor - skip. */
16951 continue;
16952 }
8a2c8fef 16953
293f5f65 16954 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
16955 }
16956
293f5f65
L
16957 /* Display disabled extensions. */
16958 if (ext)
ae89daec 16959 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
293f5f65 16960 {
ae89daec
JB
16961 char *str;
16962
16963 if (cpu_arch[j].type != PROCESSOR_NONE
16964 || !cpu_flags_all_zero (&cpu_arch[j].enable))
16965 continue;
16966 str = xasprintf ("no%s", cpu_arch[j].name);
16967 p = output_message (stream, p, message, start, &left, str,
16968 strlen (str));
16969 free (str);
293f5f65
L
16970 }
16971
8a2c8fef
L
16972 *p = '\0';
16973 fprintf (stream, "%s\n", message);
16974}
16975
252b5132 16976void
8a2c8fef 16977md_show_usage (FILE *stream)
252b5132 16978{
4cc782b5
ILT
16979#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16980 fprintf (stream, _("\
d4693039 16981 -Qy, -Qn ignored\n\
a38cf1db 16982 -V print assembler version number\n\
b3b91714
AM
16983 -k ignored\n"));
16984#endif
16985 fprintf (stream, _("\
7ebd68d1
NC
16986 -n do not optimize code alignment\n\
16987 -O{012s} attempt some code optimizations\n\
b3b91714
AM
16988 -q quieten some warnings\n"));
16989#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16990 fprintf (stream, _("\
a38cf1db 16991 -s ignored\n"));
b3b91714 16992#endif
b00af7c8
JB
16993#ifdef BFD64
16994# if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
16995 fprintf (stream, _("\
16996 --32/--64/--x32 generate 32bit/64bit/x32 object\n"));
16997# elif defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O)
751d281c 16998 fprintf (stream, _("\
b00af7c8
JB
16999 --32/--64 generate 32bit/64bit object\n"));
17000# endif
751d281c 17001#endif
b3b91714
AM
17002#ifdef SVR4_COMMENT_CHARS
17003 fprintf (stream, _("\
17004 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
17005#else
17006 fprintf (stream, _("\
b3b91714 17007 --divide ignored\n"));
4cc782b5 17008#endif
9103f4f4 17009 fprintf (stream, _("\
6305a203 17010 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 17011 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 17012 show_arch (stream, 0, 1);
8a2c8fef 17013 fprintf (stream, _("\
ae89daec 17014 EXTENSION is combination of (possibly \"no\"-prefixed):\n"));
1ded5609 17015 show_arch (stream, 1, 0);
6305a203 17016 fprintf (stream, _("\
8a2c8fef 17017 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 17018 show_arch (stream, 0, 0);
ba104c83 17019 fprintf (stream, _("\
c0f3af97
L
17020 -msse2avx encode SSE instructions with VEX prefix\n"));
17021 fprintf (stream, _("\
c8480b58
L
17022 -muse-unaligned-vector-move\n\
17023 encode aligned vector move as unaligned vector move\n"));
17024 fprintf (stream, _("\
7a6a03c4 17025 -msse-check=[none|error|warning] (default: none)\n\
daf50ae7
L
17026 check SSE instructions\n"));
17027 fprintf (stream, _("\
7c5c05ef 17028 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
17029 check operand combinations for validity\n"));
17030 fprintf (stream, _("\
7c5c05ef
L
17031 -mavxscalar=[128|256] (default: 128)\n\
17032 encode scalar AVX instructions with specific vector\n\
539f890d
L
17033 length\n"));
17034 fprintf (stream, _("\
03751133
L
17035 -mvexwig=[0|1] (default: 0)\n\
17036 encode VEX instructions with specific VEX.W value\n\
17037 for VEX.W bit ignored instructions\n"));
17038 fprintf (stream, _("\
7c5c05ef
L
17039 -mevexlig=[128|256|512] (default: 128)\n\
17040 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
17041 length\n"));
17042 fprintf (stream, _("\
7c5c05ef
L
17043 -mevexwig=[0|1] (default: 0)\n\
17044 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
17045 for EVEX.W bit ignored instructions\n"));
17046 fprintf (stream, _("\
7c5c05ef 17047 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
17048 encode EVEX instructions with specific EVEX.RC value\n\
17049 for SAE-only ignored instructions\n"));
17050 fprintf (stream, _("\
7c5c05ef
L
17051 -mmnemonic=[att|intel] "));
17052 if (SYSV386_COMPAT)
17053 fprintf (stream, _("(default: att)\n"));
17054 else
17055 fprintf (stream, _("(default: intel)\n"));
17056 fprintf (stream, _("\
7d3182d6 17057 use AT&T/Intel mnemonic (AT&T syntax only)\n"));
ba104c83 17058 fprintf (stream, _("\
7c5c05ef
L
17059 -msyntax=[att|intel] (default: att)\n\
17060 use AT&T/Intel syntax\n"));
ba104c83
L
17061 fprintf (stream, _("\
17062 -mindex-reg support pseudo index registers\n"));
17063 fprintf (stream, _("\
17064 -mnaked-reg don't require `%%' prefix for registers\n"));
17065 fprintf (stream, _("\
7e8b059b 17066 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 17067#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
17068 fprintf (stream, _("\
17069 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
17070 fprintf (stream, _("\
17071 -mx86-used-note=[no|yes] "));
17072 if (DEFAULT_X86_USED_NOTE)
17073 fprintf (stream, _("(default: yes)\n"));
17074 else
17075 fprintf (stream, _("(default: no)\n"));
17076 fprintf (stream, _("\
17077 generate x86 used ISA and feature properties\n"));
17078#endif
17079#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
17080 fprintf (stream, _("\
17081 -mbig-obj generate big object files\n"));
17082#endif
d022bddd 17083 fprintf (stream, _("\
7c5c05ef 17084 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 17085 strip all lock prefixes\n"));
5db04b09 17086 fprintf (stream, _("\
7c5c05ef 17087 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
17088 encode lfence, mfence and sfence as\n\
17089 lock addl $0x0, (%%{re}sp)\n"));
17090 fprintf (stream, _("\
7c5c05ef
L
17091 -mrelax-relocations=[no|yes] "));
17092 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
17093 fprintf (stream, _("(default: yes)\n"));
17094 else
17095 fprintf (stream, _("(default: no)\n"));
17096 fprintf (stream, _("\
0cb4071e
L
17097 generate relax relocations\n"));
17098 fprintf (stream, _("\
e379e5f3
L
17099 -malign-branch-boundary=NUM (default: 0)\n\
17100 align branches within NUM byte boundary\n"));
17101 fprintf (stream, _("\
17102 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
17103 TYPE is combination of jcc, fused, jmp, call, ret,\n\
17104 indirect\n\
17105 specify types of branches to align\n"));
17106 fprintf (stream, _("\
17107 -malign-branch-prefix-size=NUM (default: 5)\n\
17108 align branches with NUM prefixes per instruction\n"));
17109 fprintf (stream, _("\
76cf450b
L
17110 -mbranches-within-32B-boundaries\n\
17111 align branches within 32 byte boundary\n"));
17112 fprintf (stream, _("\
ae531041
L
17113 -mlfence-after-load=[no|yes] (default: no)\n\
17114 generate lfence after load\n"));
17115 fprintf (stream, _("\
17116 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
17117 generate lfence before indirect near branch\n"));
17118 fprintf (stream, _("\
a09f656b 17119 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
17120 generate lfence before ret\n"));
17121 fprintf (stream, _("\
7c5c05ef 17122 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
17123 fprintf (stream, _("\
17124 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
17125}
17126
3e73aa7c 17127#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 17128 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 17129 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
17130
17131/* Pick the target format to use. */
17132
47926f60 17133const char *
e3bb37b5 17134i386_target_format (void)
252b5132 17135{
d34049e8 17136 if (startswith (default_arch, "x86_64"))
351f65ca
L
17137 {
17138 update_code_flag (CODE_64BIT, 1);
071c5d81 17139#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
351f65ca 17140 if (default_arch[6] == '\0')
7f56bc95 17141 x86_elf_abi = X86_64_ABI;
351f65ca 17142 else
7f56bc95 17143 x86_elf_abi = X86_64_X32_ABI;
071c5d81 17144#endif
351f65ca 17145 }
3e73aa7c 17146 else if (!strcmp (default_arch, "i386"))
78f12dd3 17147 update_code_flag (CODE_32BIT, 1);
5197d474
L
17148 else if (!strcmp (default_arch, "iamcu"))
17149 {
17150 update_code_flag (CODE_32BIT, 1);
17151 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
17152 {
17153 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
17154 cpu_arch_name = "iamcu";
d92c7521 17155 free (cpu_sub_arch_name);
5197d474
L
17156 cpu_sub_arch_name = NULL;
17157 cpu_arch_flags = iamcu_flags;
17158 cpu_arch_isa = PROCESSOR_IAMCU;
17159 cpu_arch_isa_flags = iamcu_flags;
17160 if (!cpu_arch_tune_set)
fb263707 17161 cpu_arch_tune = PROCESSOR_IAMCU;
5197d474 17162 }
8d471ec1 17163 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
17164 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
17165 cpu_arch_name);
17166 }
3e73aa7c 17167 else
2b5d6a91 17168 as_fatal (_("unknown architecture"));
89507696 17169
c7defc53
IB
17170#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17171 if (IS_ELF && flag_synth_cfi && x86_elf_abi != X86_64_ABI)
17172 as_fatal (_("SCFI is not supported for this ABI"));
17173#endif
17174
89507696 17175 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
ae89daec 17176 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].enable;
89507696 17177
252b5132
RH
17178 switch (OUTPUT_FLAVOR)
17179 {
9384f2ff 17180#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 17181 case bfd_target_aout_flavour:
47926f60 17182 return AOUT_TARGET_FORMAT;
4c63da97 17183#endif
9384f2ff
AM
17184#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
17185# if defined (TE_PE) || defined (TE_PEP)
17186 case bfd_target_coff_flavour:
167ad85b 17187 if (flag_code == CODE_64BIT)
eb19308f
JB
17188 {
17189 object_64bit = 1;
17190 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
17191 }
17192 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 17193# elif defined (TE_GO32)
0561d57c
JK
17194 case bfd_target_coff_flavour:
17195 return "coff-go32";
9384f2ff 17196# else
252b5132
RH
17197 case bfd_target_coff_flavour:
17198 return "coff-i386";
9384f2ff 17199# endif
4c63da97 17200#endif
3e73aa7c 17201#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 17202 case bfd_target_elf_flavour:
3e73aa7c 17203 {
351f65ca
L
17204 const char *format;
17205
17206 switch (x86_elf_abi)
4fa24527 17207 {
351f65ca
L
17208 default:
17209 format = ELF_TARGET_FORMAT;
e379e5f3
L
17210#ifndef TE_SOLARIS
17211 tls_get_addr = "___tls_get_addr";
17212#endif
351f65ca 17213 break;
7f56bc95 17214 case X86_64_ABI:
351f65ca 17215 use_rela_relocations = 1;
4fa24527 17216 object_64bit = 1;
e379e5f3
L
17217#ifndef TE_SOLARIS
17218 tls_get_addr = "__tls_get_addr";
17219#endif
351f65ca
L
17220 format = ELF_TARGET_FORMAT64;
17221 break;
7f56bc95 17222 case X86_64_X32_ABI:
4fa24527 17223 use_rela_relocations = 1;
351f65ca 17224 object_64bit = 1;
e379e5f3
L
17225#ifndef TE_SOLARIS
17226 tls_get_addr = "__tls_get_addr";
17227#endif
862be3fb 17228 disallow_64bit_reloc = 1;
351f65ca
L
17229 format = ELF_TARGET_FORMAT32;
17230 break;
4fa24527 17231 }
c085ab00 17232 if (cpu_arch_isa == PROCESSOR_IAMCU)
81486035
L
17233 {
17234 if (x86_elf_abi != I386_ABI)
17235 as_fatal (_("Intel MCU is 32bit only"));
17236 return ELF_TARGET_IAMCU_FORMAT;
17237 }
8a9036a4 17238 else
351f65ca 17239 return format;
3e73aa7c 17240 }
e57f8c65
TG
17241#endif
17242#if defined (OBJ_MACH_O)
17243 case bfd_target_mach_o_flavour:
d382c579
TG
17244 if (flag_code == CODE_64BIT)
17245 {
17246 use_rela_relocations = 1;
17247 object_64bit = 1;
17248 return "mach-o-x86-64";
17249 }
17250 else
17251 return "mach-o-i386";
4c63da97 17252#endif
252b5132
RH
17253 default:
17254 abort ();
17255 return NULL;
17256 }
17257}
17258
47926f60 17259#endif /* OBJ_MAYBE_ more than one */
252b5132 17260\f
252b5132 17261symbolS *
7016a5d5 17262md_undefined_symbol (char *name)
252b5132 17263{
18dc2407
ILT
17264 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
17265 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
17266 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
17267 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
17268 {
17269 if (!GOT_symbol)
17270 {
17271 if (symbol_find (name))
17272 as_bad (_("GOT already in symbol table"));
17273 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 17274 &zero_address_frag, 0);
24eab124
AM
17275 };
17276 return GOT_symbol;
17277 }
252b5132
RH
17278 return 0;
17279}
17280
071c5d81 17281#if defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT)
252b5132 17282/* Round up a section size to the appropriate boundary. */
47926f60 17283
252b5132 17284valueT
071c5d81 17285md_section_align (segT segment, valueT size)
252b5132 17286{
4c63da97
AM
17287 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
17288 {
17289 /* For a.out, force the section size to be aligned. If we don't do
17290 this, BFD will align it for us, but it will not write out the
17291 final bytes of the section. This may be a bug in BFD, but it is
17292 easier to fix it here since that is how the other a.out targets
17293 work. */
17294 int align;
17295
fd361982 17296 align = bfd_section_alignment (segment);
8d3842cd 17297 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 17298 }
252b5132
RH
17299
17300 return size;
17301}
071c5d81 17302#endif
252b5132
RH
17303
17304/* On the i386, PC-relative offsets are relative to the start of the
17305 next instruction. That is, the address of the offset, plus its
17306 size, since the offset is always the last part of the insn. */
17307
17308long
e3bb37b5 17309md_pcrel_from (fixS *fixP)
252b5132
RH
17310{
17311 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
17312}
17313
d4064aad 17314#ifdef OBJ_AOUT
252b5132
RH
17315
17316static void
e3bb37b5 17317s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 17318{
29b0f896 17319 int temp;
252b5132
RH
17320
17321 temp = get_absolute_expression ();
17322 subseg_set (bss_section, (subsegT) temp);
17323 demand_empty_rest_of_line ();
17324}
17325
17326#endif
17327
e379e5f3
L
17328/* Remember constant directive. */
17329
17330void
17331i386_cons_align (int ignore ATTRIBUTE_UNUSED)
17332{
b5482fe5
JB
17333 struct last_insn *last_insn
17334 = &seg_info(now_seg)->tc_segment_info_data.last_insn;
17335
ce69d081 17336 if (bfd_section_flags (now_seg) & SEC_CODE)
e379e5f3 17337 {
b5482fe5
JB
17338 last_insn->kind = last_insn_directive;
17339 last_insn->name = "constant directive";
17340 last_insn->file = as_where (&last_insn->line);
e379e5f3
L
17341 }
17342}
17343
3abbafc2 17344int
e3bb37b5 17345i386_validate_fix (fixS *fixp)
252b5132 17346{
e52a16f2
JB
17347 if (fixp->fx_addsy && S_GET_SEGMENT(fixp->fx_addsy) == reg_section)
17348 {
17349 reloc_howto_type *howto;
17350
17351 howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
17352 as_bad_where (fixp->fx_file, fixp->fx_line,
17353 _("invalid %s relocation against register"),
17354 howto ? howto->name : "<unknown>");
17355 return 0;
17356 }
17357
3abbafc2
JB
17358#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
17359 if (fixp->fx_r_type == BFD_RELOC_SIZE32
17360 || fixp->fx_r_type == BFD_RELOC_SIZE64)
17361 return IS_ELF && fixp->fx_addsy
17362 && (!S_IS_DEFINED (fixp->fx_addsy)
17363 || S_IS_EXTERNAL (fixp->fx_addsy));
a533c8df 17364
5bc71c2a
L
17365 /* BFD_RELOC_X86_64_GOTTPOFF:
17366 1. fx_tcbit -> BFD_RELOC_X86_64_CODE_4_GOTTPOFF
17367 2. fx_tcbit2 -> BFD_RELOC_X86_64_CODE_6_GOTTPOFF
17368 BFD_RELOC_X86_64_GOTPC32_TLSDESC:
17369 1. fx_tcbit -> BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
17370 BFD_RELOC_32_PCREL:
17371 1. fx_tcbit -> BFD_RELOC_X86_64_GOTPCRELX
17372 2. fx_tcbit2 -> BFD_RELOC_X86_64_REX_GOTPCRELX
17373 3. fx_tcbit3 -> BFD_RELOC_X86_64_CODE_4_GOTPCRELX
17374 4. else -> BFD_RELOC_X86_64_GOTPCREL
17375 */
17376 if (fixp->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF)
a533c8df 17377 {
5bc71c2a 17378 if (fixp->fx_tcbit)
a533c8df 17379 fixp->fx_r_type = BFD_RELOC_X86_64_CODE_4_GOTTPOFF;
5bc71c2a
L
17380 else if (fixp->fx_tcbit2)
17381 fixp->fx_r_type = BFD_RELOC_X86_64_CODE_6_GOTTPOFF;
a533c8df 17382 }
5bc71c2a
L
17383 else if (fixp->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
17384 && fixp->fx_tcbit)
17385 fixp->fx_r_type = BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC;
3abbafc2
JB
17386#endif
17387
02a86693 17388 if (fixp->fx_subsy)
252b5132 17389 {
02a86693 17390 if (fixp->fx_subsy == GOT_symbol)
23df1078 17391 {
02a86693
L
17392 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
17393 {
17394 if (!object_64bit)
17395 abort ();
17396#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5bc71c2a
L
17397 if (fixp->fx_tcbit)
17398 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCRELX;
17399 else if (fixp->fx_tcbit2)
17400 fixp->fx_r_type = BFD_RELOC_X86_64_REX_GOTPCRELX;
17401 else if (fixp->fx_tcbit3)
17402 fixp->fx_r_type = BFD_RELOC_X86_64_CODE_4_GOTPCRELX;
02a86693
L
17403 else
17404#endif
17405 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
17406 }
d6ab8113 17407 else
02a86693
L
17408 {
17409 if (!object_64bit)
17410 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
17411 else
17412 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
17413 }
17414 fixp->fx_subsy = 0;
23df1078 17415 }
252b5132 17416 }
02a86693 17417#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 17418 else
02a86693 17419 {
2585b7a5
L
17420 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
17421 to section. Since PLT32 relocation must be against symbols,
17422 turn such PLT32 relocation into PC32 relocation. */
17423 if (fixp->fx_addsy
17424 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
17425 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
17426 && symbol_section_p (fixp->fx_addsy))
17427 fixp->fx_r_type = BFD_RELOC_32_PCREL;
17428 if (!object_64bit)
17429 {
17430 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
17431 && fixp->fx_tcbit2)
17432 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
17433 }
02a86693
L
17434 }
17435#endif
3abbafc2
JB
17436
17437 return 1;
252b5132
RH
17438}
17439
252b5132 17440arelent *
7016a5d5 17441tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
17442{
17443 arelent *rel;
17444 bfd_reloc_code_real_type code;
17445
17446 switch (fixp->fx_r_type)
17447 {
8ce3d284 17448#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3abbafc2
JB
17449 symbolS *sym;
17450
8fd4256d
L
17451 case BFD_RELOC_SIZE32:
17452 case BFD_RELOC_SIZE64:
3abbafc2
JB
17453 if (fixp->fx_addsy
17454 && !bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_addsy))
17455 && (!fixp->fx_subsy
17456 || bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_subsy))))
17457 sym = fixp->fx_addsy;
17458 else if (fixp->fx_subsy
17459 && !bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_subsy))
17460 && (!fixp->fx_addsy
17461 || bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_addsy))))
17462 sym = fixp->fx_subsy;
17463 else
17464 sym = NULL;
17465 if (IS_ELF && sym && S_IS_DEFINED (sym) && !S_IS_EXTERNAL (sym))
8fd4256d
L
17466 {
17467 /* Resolve size relocation against local symbol to size of
17468 the symbol plus addend. */
3abbafc2 17469 valueT value = S_GET_SIZE (sym);
44f87162 17470
3abbafc2
JB
17471 if (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM)
17472 value = bfd_section_size (S_GET_SEGMENT (sym));
17473 if (sym == fixp->fx_subsy)
17474 {
17475 value = -value;
17476 if (fixp->fx_addsy)
17477 value += S_GET_VALUE (fixp->fx_addsy);
17478 }
17479 else if (fixp->fx_subsy)
17480 value -= S_GET_VALUE (fixp->fx_subsy);
44f87162 17481 value += fixp->fx_offset;
8fd4256d 17482 if (fixp->fx_r_type == BFD_RELOC_SIZE32
d965814f 17483 && object_64bit
8fd4256d
L
17484 && !fits_in_unsigned_long (value))
17485 as_bad_where (fixp->fx_file, fixp->fx_line,
17486 _("symbol size computation overflow"));
17487 fixp->fx_addsy = NULL;
17488 fixp->fx_subsy = NULL;
17489 md_apply_fix (fixp, (valueT *) &value, NULL);
17490 return NULL;
17491 }
3abbafc2
JB
17492 if (!fixp->fx_addsy || fixp->fx_subsy)
17493 {
17494 as_bad_where (fixp->fx_file, fixp->fx_line,
17495 "unsupported expression involving @size");
17496 return NULL;
17497 }
8ce3d284 17498#endif
1a0670f3 17499 /* Fall through. */
8fd4256d 17500
3e73aa7c
JH
17501 case BFD_RELOC_X86_64_PLT32:
17502 case BFD_RELOC_X86_64_GOT32:
17503 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
17504 case BFD_RELOC_X86_64_GOTPCRELX:
17505 case BFD_RELOC_X86_64_REX_GOTPCRELX:
3d5a60de 17506 case BFD_RELOC_X86_64_CODE_4_GOTPCRELX:
252b5132
RH
17507 case BFD_RELOC_386_PLT32:
17508 case BFD_RELOC_386_GOT32:
02a86693 17509 case BFD_RELOC_386_GOT32X:
252b5132
RH
17510 case BFD_RELOC_386_GOTOFF:
17511 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
17512 case BFD_RELOC_386_TLS_GD:
17513 case BFD_RELOC_386_TLS_LDM:
17514 case BFD_RELOC_386_TLS_LDO_32:
17515 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
17516 case BFD_RELOC_386_TLS_IE:
17517 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
17518 case BFD_RELOC_386_TLS_LE_32:
17519 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
17520 case BFD_RELOC_386_TLS_GOTDESC:
17521 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
17522 case BFD_RELOC_X86_64_TLSGD:
17523 case BFD_RELOC_X86_64_TLSLD:
17524 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 17525 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940 17526 case BFD_RELOC_X86_64_GOTTPOFF:
a533c8df 17527 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF:
5bc71c2a 17528 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF:
bffbf940 17529 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
17530 case BFD_RELOC_X86_64_TPOFF64:
17531 case BFD_RELOC_X86_64_GOTOFF64:
17532 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
17533 case BFD_RELOC_X86_64_GOT64:
17534 case BFD_RELOC_X86_64_GOTPCREL64:
17535 case BFD_RELOC_X86_64_GOTPC64:
17536 case BFD_RELOC_X86_64_GOTPLT64:
17537 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7 17538 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
a533c8df 17539 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC:
67a4f2b7 17540 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
17541 case BFD_RELOC_RVA:
17542 case BFD_RELOC_VTABLE_ENTRY:
17543 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
17544#ifdef TE_PE
17545 case BFD_RELOC_32_SECREL:
145667f8 17546 case BFD_RELOC_16_SECIDX:
6482c264 17547#endif
252b5132
RH
17548 code = fixp->fx_r_type;
17549 break;
dbbaec26
L
17550 case BFD_RELOC_X86_64_32S:
17551 if (!fixp->fx_pcrel)
17552 {
17553 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
17554 code = fixp->fx_r_type;
17555 break;
17556 }
1a0670f3 17557 /* Fall through. */
252b5132 17558 default:
93382f6d 17559 if (fixp->fx_pcrel)
252b5132 17560 {
93382f6d
AM
17561 switch (fixp->fx_size)
17562 {
17563 default:
b091f402
AM
17564 as_bad_where (fixp->fx_file, fixp->fx_line,
17565 _("can not do %d byte pc-relative relocation"),
17566 fixp->fx_size);
93382f6d
AM
17567 code = BFD_RELOC_32_PCREL;
17568 break;
17569 case 1: code = BFD_RELOC_8_PCREL; break;
17570 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 17571 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
17572#ifdef BFD64
17573 case 8: code = BFD_RELOC_64_PCREL; break;
17574#endif
93382f6d
AM
17575 }
17576 }
17577 else
17578 {
17579 switch (fixp->fx_size)
17580 {
17581 default:
b091f402
AM
17582 as_bad_where (fixp->fx_file, fixp->fx_line,
17583 _("can not do %d byte relocation"),
17584 fixp->fx_size);
93382f6d
AM
17585 code = BFD_RELOC_32;
17586 break;
17587 case 1: code = BFD_RELOC_8; break;
17588 case 2: code = BFD_RELOC_16; break;
17589 case 4: code = BFD_RELOC_32; break;
937149dd 17590#ifdef BFD64
3e73aa7c 17591 case 8: code = BFD_RELOC_64; break;
937149dd 17592#endif
93382f6d 17593 }
252b5132
RH
17594 }
17595 break;
17596 }
252b5132 17597
d182319b
JB
17598 if ((code == BFD_RELOC_32
17599 || code == BFD_RELOC_32_PCREL
17600 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
17601 && GOT_symbol
17602 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 17603 {
4fa24527 17604 if (!object_64bit)
d6ab8113
JB
17605 code = BFD_RELOC_386_GOTPC;
17606 else
17607 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 17608 }
7b81dfbb
AJ
17609 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
17610 && GOT_symbol
17611 && fixp->fx_addsy == GOT_symbol)
17612 {
17613 code = BFD_RELOC_X86_64_GOTPC64;
17614 }
252b5132 17615
add39d23
TS
17616 rel = XNEW (arelent);
17617 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 17618 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
17619
17620 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 17621
3e73aa7c
JH
17622 if (!use_rela_relocations)
17623 {
17624 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
17625 vtable entry to be used in the relocation's section offset. */
17626 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17627 rel->address = fixp->fx_offset;
fbeb56a4
DK
17628#if defined (OBJ_COFF) && defined (TE_PE)
17629 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
17630 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
17631 else
17632#endif
c6682705 17633 rel->addend = 0;
3e73aa7c
JH
17634 }
17635 /* Use the rela in 64bit mode. */
252b5132 17636 else
3e73aa7c 17637 {
862be3fb
L
17638 if (disallow_64bit_reloc)
17639 switch (code)
17640 {
862be3fb
L
17641 case BFD_RELOC_X86_64_DTPOFF64:
17642 case BFD_RELOC_X86_64_TPOFF64:
17643 case BFD_RELOC_64_PCREL:
17644 case BFD_RELOC_X86_64_GOTOFF64:
17645 case BFD_RELOC_X86_64_GOT64:
17646 case BFD_RELOC_X86_64_GOTPCREL64:
17647 case BFD_RELOC_X86_64_GOTPC64:
17648 case BFD_RELOC_X86_64_GOTPLT64:
17649 case BFD_RELOC_X86_64_PLTOFF64:
17650 as_bad_where (fixp->fx_file, fixp->fx_line,
17651 _("cannot represent relocation type %s in x32 mode"),
17652 bfd_get_reloc_code_name (code));
17653 break;
17654 default:
17655 break;
17656 }
17657
062cd5e7
AS
17658 if (!fixp->fx_pcrel)
17659 rel->addend = fixp->fx_offset;
17660 else
17661 switch (code)
17662 {
17663 case BFD_RELOC_X86_64_PLT32:
17664 case BFD_RELOC_X86_64_GOT32:
17665 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
17666 case BFD_RELOC_X86_64_GOTPCRELX:
17667 case BFD_RELOC_X86_64_REX_GOTPCRELX:
3d5a60de 17668 case BFD_RELOC_X86_64_CODE_4_GOTPCRELX:
bffbf940
JJ
17669 case BFD_RELOC_X86_64_TLSGD:
17670 case BFD_RELOC_X86_64_TLSLD:
17671 case BFD_RELOC_X86_64_GOTTPOFF:
a533c8df 17672 case BFD_RELOC_X86_64_CODE_4_GOTTPOFF:
5bc71c2a 17673 case BFD_RELOC_X86_64_CODE_6_GOTTPOFF:
67a4f2b7 17674 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
a533c8df 17675 case BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC:
67a4f2b7 17676 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
17677 rel->addend = fixp->fx_offset - fixp->fx_size;
17678 break;
17679 default:
17680 rel->addend = (section->vma
17681 - fixp->fx_size
17682 + fixp->fx_addnumber
17683 + md_pcrel_from (fixp));
17684 break;
17685 }
3e73aa7c
JH
17686 }
17687
252b5132
RH
17688 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
17689 if (rel->howto == NULL)
17690 {
17691 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 17692 _("cannot represent relocation type %s"),
252b5132
RH
17693 bfd_get_reloc_code_name (code));
17694 /* Set howto to a garbage value so that we can keep going. */
17695 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 17696 gas_assert (rel->howto != NULL);
252b5132
RH
17697 }
17698
17699 return rel;
17700}
17701
ee86248c 17702#include "tc-i386-intel.c"
54cfded0 17703
a60de03c
JB
17704void
17705tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 17706{
a60de03c
JB
17707 int saved_naked_reg;
17708 char saved_register_dot;
54cfded0 17709
a60de03c
JB
17710 saved_naked_reg = allow_naked_reg;
17711 allow_naked_reg = 1;
17712 saved_register_dot = register_chars['.'];
17713 register_chars['.'] = '.';
17714 allow_pseudo_reg = 1;
17715 expression_and_evaluate (exp);
17716 allow_pseudo_reg = 0;
17717 register_chars['.'] = saved_register_dot;
17718 allow_naked_reg = saved_naked_reg;
17719
e96d56a1 17720 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 17721 {
066673f6 17722 exp->X_op = O_illegal;
a60de03c
JB
17723 if ((addressT) exp->X_add_number < i386_regtab_size)
17724 {
a60de03c 17725 exp->X_add_number = i386_regtab[exp->X_add_number]
fabb73d1 17726 .dw2_regnum[object_64bit];
066673f6
JB
17727 if (exp->X_add_number != Dw2Inval)
17728 exp->X_op = O_constant;
a60de03c 17729 }
54cfded0 17730 }
54cfded0
AM
17731}
17732
17733void
17734tc_x86_frame_initial_instructions (void)
17735{
fabb73d1 17736 cfi_add_CFA_def_cfa (object_64bit ? REG_SP : 4, -x86_cie_data_alignment);
61ff971f 17737 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 17738}
d2b2c203 17739
d7921315
L
17740int
17741x86_dwarf2_addr_size (void)
17742{
17743#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
17744 if (x86_elf_abi == X86_64_X32_ABI)
17745 return 4;
17746#endif
17747 return bfd_arch_bits_per_address (stdoutput) / 8;
17748}
17749
071c5d81
JB
17750#ifdef TE_PE
17751void
17752tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
17753{
17754 expressionS exp;
17755
17756 exp.X_op = O_secrel;
17757 exp.X_add_symbol = symbol;
17758 exp.X_add_number = 0;
17759 emit_expr (&exp, size);
17760}
17761#endif
17762
17763#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
d2b2c203
DJ
17764int
17765i386_elf_section_type (const char *str, size_t len)
17766{
17767 if (flag_code == CODE_64BIT
17768 && len == sizeof ("unwind") - 1
d34049e8 17769 && startswith (str, "unwind"))
d2b2c203
DJ
17770 return SHT_X86_64_UNWIND;
17771
17772 return -1;
17773}
bb41ade5 17774
da374e94
JB
17775void
17776i386_elf_section_change_hook (void)
17777{
17778 struct i386_segment_info *info = &seg_info(now_seg)->tc_segment_info_data;
17779 struct i386_segment_info *curr, *prev;
17780
17781 if (info->subseg == now_subseg)
17782 return;
17783
17784 /* Find the (or make a) list entry to save state into. */
17785 for (prev = info; (curr = prev->next) != NULL; prev = curr)
17786 if (curr->subseg == info->subseg)
17787 break;
17788 if (!curr)
17789 {
fddee222 17790 curr = notes_alloc (sizeof (*curr));
da374e94
JB
17791 curr->subseg = info->subseg;
17792 curr->next = NULL;
17793 prev->next = curr;
17794 }
17795 curr->last_insn = info->last_insn;
17796
17797 /* Find the list entry to load state from. */
17798 for (curr = info->next; curr; curr = curr->next)
17799 if (curr->subseg == now_subseg)
17800 break;
17801 if (curr)
17802 info->last_insn = curr->last_insn;
17803 else
17804 memset (&info->last_insn, 0, sizeof (info->last_insn));
17805 info->subseg = now_subseg;
17806}
17807
ad5fec3b
EB
17808#ifdef TE_SOLARIS
17809void
17810i386_solaris_fix_up_eh_frame (segT sec)
17811{
17812 if (flag_code == CODE_64BIT)
17813 elf_section_type (sec) = SHT_X86_64_UNWIND;
17814}
17815#endif
17816
3b22753a
L
17817/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
17818
01e1a5bc 17819bfd_vma
6d4af3c2 17820x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
17821{
17822 if (flag_code == CODE_64BIT)
17823 {
17824 if (letter == 'l')
17825 return SHF_X86_64_LARGE;
17826
8f3bae45 17827 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 17828 }
3b22753a 17829 else
8f3bae45 17830 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
17831 return -1;
17832}
17833
3b22753a
L
17834static void
17835handle_large_common (int small ATTRIBUTE_UNUSED)
17836{
17837 if (flag_code != CODE_64BIT)
17838 {
17839 s_comm_internal (0, elf_common_parse);
17840 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
17841 }
17842 else
17843 {
17844 static segT lbss_section;
17845 asection *saved_com_section_ptr = elf_com_section_ptr;
17846 asection *saved_bss_section = bss_section;
17847
17848 if (lbss_section == NULL)
17849 {
17850 flagword applicable;
17851 segT seg = now_seg;
17852 subsegT subseg = now_subseg;
17853
17854 /* The .lbss section is for local .largecomm symbols. */
17855 lbss_section = subseg_new (".lbss", 0);
17856 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 17857 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
17858 seg_info (lbss_section)->bss = 1;
17859
17860 subseg_set (seg, subseg);
17861 }
17862
17863 elf_com_section_ptr = &_bfd_elf_large_com_section;
17864 bss_section = lbss_section;
17865
17866 s_comm_internal (0, elf_common_parse);
17867
17868 elf_com_section_ptr = saved_com_section_ptr;
17869 bss_section = saved_bss_section;
17870 }
17871}
17872#endif /* OBJ_ELF || OBJ_MAYBE_ELF */