x86: Rename VexOpcode to OpcodePrefix
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
b3adc24a 2 Copyright (C) 1989-2020 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
c3332e24 47#ifndef INFER_ADDR_PREFIX
eecb386c 48#define INFER_ADDR_PREFIX 1
c3332e24
AM
49#endif
50
29b0f896
AM
51#ifndef DEFAULT_ARCH
52#define DEFAULT_ARCH "i386"
246fcdee 53#endif
252b5132 54
edde18a5
AM
55#ifndef INLINE
56#if __GNUC__ >= 2
57#define INLINE __inline__
58#else
59#define INLINE
60#endif
61#endif
62
6305a203
L
63/* Prefixes will be emitted in the order defined below.
64 WAIT_PREFIX must be the first prefix since FWAIT is really is an
65 instruction, and so must come before any prefixes.
66 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 67 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
68#define WAIT_PREFIX 0
69#define SEG_PREFIX 1
70#define ADDR_PREFIX 2
71#define DATA_PREFIX 3
c32fa91d 72#define REP_PREFIX 4
42164a71 73#define HLE_PREFIX REP_PREFIX
7e8b059b 74#define BND_PREFIX REP_PREFIX
c32fa91d 75#define LOCK_PREFIX 5
4e9ac44a
L
76#define REX_PREFIX 6 /* must come last. */
77#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
78
79/* we define the syntax here (modulo base,index,scale syntax) */
80#define REGISTER_PREFIX '%'
81#define IMMEDIATE_PREFIX '$'
82#define ABSOLUTE_PREFIX '*'
83
84/* these are the instruction mnemonic suffixes in AT&T syntax or
85 memory operand size in Intel syntax. */
86#define WORD_MNEM_SUFFIX 'w'
87#define BYTE_MNEM_SUFFIX 'b'
88#define SHORT_MNEM_SUFFIX 's'
89#define LONG_MNEM_SUFFIX 'l'
90#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
91/* Intel Syntax. Use a non-ascii letter since since it never appears
92 in instructions. */
93#define LONG_DOUBLE_MNEM_SUFFIX '\1'
94
95#define END_OF_INSN '\0'
96
79dec6b7
JB
97/* This matches the C -> StaticRounding alias in the opcode table. */
98#define commutative staticrounding
99
6305a203
L
100/*
101 'templates' is for grouping together 'template' structures for opcodes
102 of the same name. This is only used for storing the insns in the grand
103 ole hash table of insns.
104 The templates themselves start at START and range up to (but not including)
105 END.
106 */
107typedef struct
108{
d3ce72d0
NC
109 const insn_template *start;
110 const insn_template *end;
6305a203
L
111}
112templates;
113
114/* 386 operand encoding bytes: see 386 book for details of this. */
115typedef struct
116{
117 unsigned int regmem; /* codes register or memory operand */
118 unsigned int reg; /* codes register operand (or extended opcode) */
119 unsigned int mode; /* how to interpret regmem & reg */
120}
121modrm_byte;
122
123/* x86-64 extension prefix. */
124typedef int rex_byte;
125
6305a203
L
126/* 386 opcode byte to code indirect addressing. */
127typedef struct
128{
129 unsigned base;
130 unsigned index;
131 unsigned scale;
132}
133sib_byte;
134
6305a203
L
135/* x86 arch names, types and features */
136typedef struct
137{
138 const char *name; /* arch name */
8a2c8fef 139 unsigned int len; /* arch string length */
6305a203
L
140 enum processor_type type; /* arch type */
141 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 142 unsigned int skip; /* show_arch should skip this. */
6305a203
L
143}
144arch_entry;
145
293f5f65
L
146/* Used to turn off indicated flags. */
147typedef struct
148{
149 const char *name; /* arch name */
150 unsigned int len; /* arch string length */
151 i386_cpu_flags flags; /* cpu feature flags */
152}
153noarch_entry;
154
78f12dd3 155static void update_code_flag (int, int);
e3bb37b5
L
156static void set_code_flag (int);
157static void set_16bit_gcc_code_flag (int);
158static void set_intel_syntax (int);
1efbbeb4 159static void set_intel_mnemonic (int);
db51cc60 160static void set_allow_index_reg (int);
7bab8ab5 161static void set_check (int);
e3bb37b5 162static void set_cpu_arch (int);
6482c264 163#ifdef TE_PE
e3bb37b5 164static void pe_directive_secrel (int);
6482c264 165#endif
e3bb37b5
L
166static void signed_cons (int);
167static char *output_invalid (int c);
ee86248c
JB
168static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
169 const char *);
170static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
171 const char *);
a7619375 172static int i386_att_operand (char *);
e3bb37b5 173static int i386_intel_operand (char *, int);
ee86248c
JB
174static int i386_intel_simplify (expressionS *);
175static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
176static const reg_entry *parse_register (char *, char **);
177static char *parse_insn (char *, char *);
178static char *parse_operands (char *, const char *);
179static void swap_operands (void);
4d456e3d 180static void swap_2_operands (int, int);
48bcea9f 181static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
8a6fb3f9
JB
213/* parse_register() returns this when a register alias cannot be used. */
214static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
215 { Dw2Inval, Dw2Inval } };
216
43234a1e
L
217/* This struct describes rounding control and SAE in the instruction. */
218struct RC_Operation
219{
220 enum rc_type
221 {
222 rne = 0,
223 rd,
224 ru,
225 rz,
226 saeonly
227 } type;
228 int operand;
229};
230
231static struct RC_Operation rc_op;
232
233/* The struct describes masking, applied to OPERAND in the instruction.
234 MASK is a pointer to the corresponding mask register. ZEROING tells
235 whether merging or zeroing mask is used. */
236struct Mask_Operation
237{
238 const reg_entry *mask;
239 unsigned int zeroing;
240 /* The operand where this operation is associated. */
241 int operand;
242};
243
244static struct Mask_Operation mask_op;
245
246/* The struct describes broadcasting, applied to OPERAND. FACTOR is
247 broadcast factor. */
248struct Broadcast_Operation
249{
8e6e0792 250 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
251 int type;
252
253 /* Index of broadcasted operand. */
254 int operand;
4a1b91ea
L
255
256 /* Number of bytes to broadcast. */
257 int bytes;
43234a1e
L
258};
259
260static struct Broadcast_Operation broadcast_op;
261
c0f3af97
L
262/* VEX prefix. */
263typedef struct
264{
43234a1e
L
265 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
266 unsigned char bytes[4];
c0f3af97
L
267 unsigned int length;
268 /* Destination or source register specifier. */
269 const reg_entry *register_specifier;
270} vex_prefix;
271
252b5132 272/* 'md_assemble ()' gathers together information and puts it into a
47926f60 273 i386_insn. */
252b5132 274
520dc8e8
AM
275union i386_op
276 {
277 expressionS *disps;
278 expressionS *imms;
279 const reg_entry *regs;
280 };
281
a65babc9
L
282enum i386_error
283 {
86e026a4 284 operand_size_mismatch,
a65babc9
L
285 operand_type_mismatch,
286 register_type_mismatch,
287 number_of_operands_mismatch,
288 invalid_instruction_suffix,
289 bad_imm4,
a65babc9
L
290 unsupported_with_intel_mnemonic,
291 unsupported_syntax,
6c30d220 292 unsupported,
260cd341 293 invalid_sib_address,
6c30d220 294 invalid_vsib_address,
7bab8ab5 295 invalid_vector_register_set,
260cd341 296 invalid_tmm_register_set,
43234a1e
L
297 unsupported_vector_index_register,
298 unsupported_broadcast,
43234a1e
L
299 broadcast_needed,
300 unsupported_masking,
301 mask_not_on_destination,
302 no_default_mask,
303 unsupported_rc_sae,
304 rc_sae_operand_not_last_imm,
305 invalid_register_operand,
a65babc9
L
306 };
307
252b5132
RH
308struct _i386_insn
309 {
47926f60 310 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 311 insn_template tm;
252b5132 312
7d5e4556
L
313 /* SUFFIX holds the instruction size suffix for byte, word, dword
314 or qword, if given. */
252b5132
RH
315 char suffix;
316
47926f60 317 /* OPERANDS gives the number of given operands. */
252b5132
RH
318 unsigned int operands;
319
320 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
321 of given register, displacement, memory operands and immediate
47926f60 322 operands. */
252b5132
RH
323 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
324
325 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 326 use OP[i] for the corresponding operand. */
40fb9820 327 i386_operand_type types[MAX_OPERANDS];
252b5132 328
520dc8e8
AM
329 /* Displacement expression, immediate expression, or register for each
330 operand. */
331 union i386_op op[MAX_OPERANDS];
252b5132 332
3e73aa7c
JH
333 /* Flags for operands. */
334 unsigned int flags[MAX_OPERANDS];
335#define Operand_PCrel 1
c48dadc9 336#define Operand_Mem 2
3e73aa7c 337
252b5132 338 /* Relocation type for operand */
f86103b7 339 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 340
252b5132
RH
341 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
342 the base index byte below. */
343 const reg_entry *base_reg;
344 const reg_entry *index_reg;
345 unsigned int log2_scale_factor;
346
347 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 348 explicit segment overrides are given. */
ce8a8b2f 349 const seg_entry *seg[2];
252b5132 350
8325cc63
JB
351 /* Copied first memory operand string, for re-checking. */
352 char *memop1_string;
353
252b5132
RH
354 /* PREFIX holds all the given prefix opcodes (usually null).
355 PREFIXES is the number of prefix opcodes. */
356 unsigned int prefixes;
357 unsigned char prefix[MAX_PREFIXES];
358
50128d0c
JB
359 /* Register is in low 3 bits of opcode. */
360 bfd_boolean short_form;
361
6f2f06be
JB
362 /* The operand to a branch insn indicates an absolute branch. */
363 bfd_boolean jumpabsolute;
364
921eafea
L
365 /* Extended states. */
366 enum
367 {
368 /* Use MMX state. */
369 xstate_mmx = 1 << 0,
370 /* Use XMM state. */
371 xstate_xmm = 1 << 1,
372 /* Use YMM state. */
373 xstate_ymm = 1 << 2 | xstate_xmm,
374 /* Use ZMM state. */
375 xstate_zmm = 1 << 3 | xstate_ymm,
376 /* Use TMM state. */
32930e4e
L
377 xstate_tmm = 1 << 4,
378 /* Use MASK state. */
379 xstate_mask = 1 << 5
921eafea 380 } xstate;
260cd341 381
e379e5f3
L
382 /* Has GOTPC or TLS relocation. */
383 bfd_boolean has_gotpc_tls_reloc;
384
252b5132 385 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 386 addressing modes of this insn are encoded. */
252b5132 387 modrm_byte rm;
3e73aa7c 388 rex_byte rex;
43234a1e 389 rex_byte vrex;
252b5132 390 sib_byte sib;
c0f3af97 391 vex_prefix vex;
b6169b20 392
43234a1e
L
393 /* Masking attributes. */
394 struct Mask_Operation *mask;
395
396 /* Rounding control and SAE attributes. */
397 struct RC_Operation *rounding;
398
399 /* Broadcasting attributes. */
400 struct Broadcast_Operation *broadcast;
401
402 /* Compressed disp8*N attribute. */
403 unsigned int memshift;
404
86fa6981
L
405 /* Prefer load or store in encoding. */
406 enum
407 {
408 dir_encoding_default = 0,
409 dir_encoding_load,
64c49ab3
JB
410 dir_encoding_store,
411 dir_encoding_swap
86fa6981 412 } dir_encoding;
891edac4 413
41eb8e88 414 /* Prefer 8bit, 16bit, 32bit displacement in encoding. */
a501d77e
L
415 enum
416 {
417 disp_encoding_default = 0,
418 disp_encoding_8bit,
41eb8e88 419 disp_encoding_16bit,
a501d77e
L
420 disp_encoding_32bit
421 } disp_encoding;
f8a5c266 422
6b6b6807
L
423 /* Prefer the REX byte in encoding. */
424 bfd_boolean rex_encoding;
425
b6f8c7c4
L
426 /* Disable instruction size optimization. */
427 bfd_boolean no_optimize;
428
86fa6981
L
429 /* How to encode vector instructions. */
430 enum
431 {
432 vex_encoding_default = 0,
42e04b36 433 vex_encoding_vex,
86fa6981 434 vex_encoding_vex3,
da4977e0
JB
435 vex_encoding_evex,
436 vex_encoding_error
86fa6981
L
437 } vec_encoding;
438
d5de92cf
L
439 /* REP prefix. */
440 const char *rep_prefix;
441
165de32a
L
442 /* HLE prefix. */
443 const char *hle_prefix;
42164a71 444
7e8b059b
L
445 /* Have BND prefix. */
446 const char *bnd_prefix;
447
04ef582a
L
448 /* Have NOTRACK prefix. */
449 const char *notrack_prefix;
450
891edac4 451 /* Error message. */
a65babc9 452 enum i386_error error;
252b5132
RH
453 };
454
455typedef struct _i386_insn i386_insn;
456
43234a1e
L
457/* Link RC type with corresponding string, that'll be looked for in
458 asm. */
459struct RC_name
460{
461 enum rc_type type;
462 const char *name;
463 unsigned int len;
464};
465
466static const struct RC_name RC_NamesTable[] =
467{
468 { rne, STRING_COMMA_LEN ("rn-sae") },
469 { rd, STRING_COMMA_LEN ("rd-sae") },
470 { ru, STRING_COMMA_LEN ("ru-sae") },
471 { rz, STRING_COMMA_LEN ("rz-sae") },
472 { saeonly, STRING_COMMA_LEN ("sae") },
473};
474
252b5132
RH
475/* List of chars besides those in app.c:symbol_chars that can start an
476 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 477const char extra_symbol_chars[] = "*%-([{}"
252b5132 478#ifdef LEX_AT
32137342
NC
479 "@"
480#endif
481#ifdef LEX_QM
482 "?"
252b5132 483#endif
32137342 484 ;
252b5132 485
b3983e5f
JB
486#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
487 && !defined (TE_GNU) \
488 && !defined (TE_LINUX) \
489 && !defined (TE_FreeBSD) \
490 && !defined (TE_DragonFly) \
491 && !defined (TE_NetBSD))
252b5132 492/* This array holds the chars that always start a comment. If the
b3b91714
AM
493 pre-processor is disabled, these aren't very useful. The option
494 --divide will remove '/' from this list. */
495const char *i386_comment_chars = "#/";
496#define SVR4_COMMENT_CHARS 1
252b5132 497#define PREFIX_SEPARATOR '\\'
252b5132 498
b3b91714
AM
499#else
500const char *i386_comment_chars = "#";
501#define PREFIX_SEPARATOR '/'
502#endif
503
252b5132
RH
504/* This array holds the chars that only start a comment at the beginning of
505 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
506 .line and .file directives will appear in the pre-processed output.
507 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 508 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
509 #NO_APP at the beginning of its output.
510 Also note that comments started like this one will always work if
252b5132 511 '/' isn't otherwise defined. */
b3b91714 512const char line_comment_chars[] = "#/";
252b5132 513
63a0b638 514const char line_separator_chars[] = ";";
252b5132 515
ce8a8b2f
AM
516/* Chars that can be used to separate mant from exp in floating point
517 nums. */
252b5132
RH
518const char EXP_CHARS[] = "eE";
519
ce8a8b2f
AM
520/* Chars that mean this number is a floating point constant
521 As in 0f12.456
522 or 0d1.2345e12. */
252b5132
RH
523const char FLT_CHARS[] = "fFdDxX";
524
ce8a8b2f 525/* Tables for lexical analysis. */
252b5132
RH
526static char mnemonic_chars[256];
527static char register_chars[256];
528static char operand_chars[256];
529static char identifier_chars[256];
530static char digit_chars[256];
531
ce8a8b2f 532/* Lexical macros. */
252b5132
RH
533#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
534#define is_operand_char(x) (operand_chars[(unsigned char) x])
535#define is_register_char(x) (register_chars[(unsigned char) x])
536#define is_space_char(x) ((x) == ' ')
537#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
538#define is_digit_char(x) (digit_chars[(unsigned char) x])
539
0234cb7c 540/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
541static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
542
543/* md_assemble() always leaves the strings it's passed unaltered. To
544 effect this we maintain a stack of saved characters that we've smashed
545 with '\0's (indicating end of strings for various sub-fields of the
47926f60 546 assembler instruction). */
252b5132 547static char save_stack[32];
ce8a8b2f 548static char *save_stack_p;
252b5132
RH
549#define END_STRING_AND_SAVE(s) \
550 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
551#define RESTORE_END_STRING(s) \
552 do { *(s) = *--save_stack_p; } while (0)
553
47926f60 554/* The instruction we're assembling. */
252b5132
RH
555static i386_insn i;
556
557/* Possible templates for current insn. */
558static const templates *current_templates;
559
31b2323c
L
560/* Per instruction expressionS buffers: max displacements & immediates. */
561static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
562static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 563
47926f60 564/* Current operand we are working on. */
ee86248c 565static int this_operand = -1;
252b5132 566
3e73aa7c
JH
567/* We support four different modes. FLAG_CODE variable is used to distinguish
568 these. */
569
570enum flag_code {
571 CODE_32BIT,
572 CODE_16BIT,
573 CODE_64BIT };
574
575static enum flag_code flag_code;
4fa24527 576static unsigned int object_64bit;
862be3fb 577static unsigned int disallow_64bit_reloc;
3e73aa7c 578static int use_rela_relocations = 0;
e379e5f3
L
579/* __tls_get_addr/___tls_get_addr symbol for TLS. */
580static const char *tls_get_addr;
3e73aa7c 581
7af8ed2d
NC
582#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
583 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
584 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
585
351f65ca
L
586/* The ELF ABI to use. */
587enum x86_elf_abi
588{
589 I386_ABI,
7f56bc95
L
590 X86_64_ABI,
591 X86_64_X32_ABI
351f65ca
L
592};
593
594static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 595#endif
351f65ca 596
167ad85b
TG
597#if defined (TE_PE) || defined (TE_PEP)
598/* Use big object file format. */
599static int use_big_obj = 0;
600#endif
601
8dcea932
L
602#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
603/* 1 if generating code for a shared library. */
604static int shared = 0;
605#endif
606
47926f60
KH
607/* 1 for intel syntax,
608 0 if att syntax. */
609static int intel_syntax = 0;
252b5132 610
4b5aaf5f
L
611static enum x86_64_isa
612{
613 amd64 = 1, /* AMD64 ISA. */
614 intel64 /* Intel64 ISA. */
615} isa64;
e89c5eaa 616
1efbbeb4
L
617/* 1 for intel mnemonic,
618 0 if att mnemonic. */
619static int intel_mnemonic = !SYSV386_COMPAT;
620
a60de03c
JB
621/* 1 if pseudo registers are permitted. */
622static int allow_pseudo_reg = 0;
623
47926f60
KH
624/* 1 if register prefix % not required. */
625static int allow_naked_reg = 0;
252b5132 626
33eaf5de 627/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
628 instructions supporting it, even if this prefix wasn't specified
629 explicitly. */
630static int add_bnd_prefix = 0;
631
ba104c83 632/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
633static int allow_index_reg = 0;
634
d022bddd
IT
635/* 1 if the assembler should ignore LOCK prefix, even if it was
636 specified explicitly. */
637static int omit_lock_prefix = 0;
638
e4e00185
AS
639/* 1 if the assembler should encode lfence, mfence, and sfence as
640 "lock addl $0, (%{re}sp)". */
641static int avoid_fence = 0;
642
ae531041
L
643/* 1 if lfence should be inserted after every load. */
644static int lfence_after_load = 0;
645
646/* Non-zero if lfence should be inserted before indirect branch. */
647static enum lfence_before_indirect_branch_kind
648 {
649 lfence_branch_none = 0,
650 lfence_branch_register,
651 lfence_branch_memory,
652 lfence_branch_all
653 }
654lfence_before_indirect_branch;
655
656/* Non-zero if lfence should be inserted before ret. */
657static enum lfence_before_ret_kind
658 {
659 lfence_before_ret_none = 0,
660 lfence_before_ret_not,
a09f656b 661 lfence_before_ret_or,
662 lfence_before_ret_shl
ae531041
L
663 }
664lfence_before_ret;
665
666/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
667static struct
668 {
669 segT seg;
670 const char *file;
671 const char *name;
672 unsigned int line;
673 enum last_insn_kind
674 {
675 last_insn_other = 0,
676 last_insn_directive,
677 last_insn_prefix
678 } kind;
679 } last_insn;
680
0cb4071e
L
681/* 1 if the assembler should generate relax relocations. */
682
683static int generate_relax_relocations
684 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
685
7bab8ab5 686static enum check_kind
daf50ae7 687 {
7bab8ab5
JB
688 check_none = 0,
689 check_warning,
690 check_error
daf50ae7 691 }
7bab8ab5 692sse_check, operand_check = check_warning;
daf50ae7 693
e379e5f3
L
694/* Non-zero if branches should be aligned within power of 2 boundary. */
695static int align_branch_power = 0;
696
697/* Types of branches to align. */
698enum align_branch_kind
699 {
700 align_branch_none = 0,
701 align_branch_jcc = 1,
702 align_branch_fused = 2,
703 align_branch_jmp = 3,
704 align_branch_call = 4,
705 align_branch_indirect = 5,
706 align_branch_ret = 6
707 };
708
709/* Type bits of branches to align. */
710enum align_branch_bit
711 {
712 align_branch_jcc_bit = 1 << align_branch_jcc,
713 align_branch_fused_bit = 1 << align_branch_fused,
714 align_branch_jmp_bit = 1 << align_branch_jmp,
715 align_branch_call_bit = 1 << align_branch_call,
716 align_branch_indirect_bit = 1 << align_branch_indirect,
717 align_branch_ret_bit = 1 << align_branch_ret
718 };
719
720static unsigned int align_branch = (align_branch_jcc_bit
721 | align_branch_fused_bit
722 | align_branch_jmp_bit);
723
79d72f45
HL
724/* Types of condition jump used by macro-fusion. */
725enum mf_jcc_kind
726 {
727 mf_jcc_jo = 0, /* base opcode 0x70 */
728 mf_jcc_jc, /* base opcode 0x72 */
729 mf_jcc_je, /* base opcode 0x74 */
730 mf_jcc_jna, /* base opcode 0x76 */
731 mf_jcc_js, /* base opcode 0x78 */
732 mf_jcc_jp, /* base opcode 0x7a */
733 mf_jcc_jl, /* base opcode 0x7c */
734 mf_jcc_jle, /* base opcode 0x7e */
735 };
736
737/* Types of compare flag-modifying insntructions used by macro-fusion. */
738enum mf_cmp_kind
739 {
740 mf_cmp_test_and, /* test/cmp */
741 mf_cmp_alu_cmp, /* add/sub/cmp */
742 mf_cmp_incdec /* inc/dec */
743 };
744
e379e5f3
L
745/* The maximum padding size for fused jcc. CMP like instruction can
746 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
747 prefixes. */
748#define MAX_FUSED_JCC_PADDING_SIZE 20
749
750/* The maximum number of prefixes added for an instruction. */
751static unsigned int align_branch_prefix_size = 5;
752
b6f8c7c4
L
753/* Optimization:
754 1. Clear the REX_W bit with register operand if possible.
755 2. Above plus use 128bit vector instruction to clear the full vector
756 register.
757 */
758static int optimize = 0;
759
760/* Optimization:
761 1. Clear the REX_W bit with register operand if possible.
762 2. Above plus use 128bit vector instruction to clear the full vector
763 register.
764 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
765 "testb $imm7,%r8".
766 */
767static int optimize_for_space = 0;
768
2ca3ace5
L
769/* Register prefix used for error message. */
770static const char *register_prefix = "%";
771
47926f60
KH
772/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
773 leave, push, and pop instructions so that gcc has the same stack
774 frame as in 32 bit mode. */
775static char stackop_size = '\0';
eecb386c 776
12b55ccc
L
777/* Non-zero to optimize code alignment. */
778int optimize_align_code = 1;
779
47926f60
KH
780/* Non-zero to quieten some warnings. */
781static int quiet_warnings = 0;
a38cf1db 782
47926f60
KH
783/* CPU name. */
784static const char *cpu_arch_name = NULL;
6305a203 785static char *cpu_sub_arch_name = NULL;
a38cf1db 786
47926f60 787/* CPU feature flags. */
40fb9820
L
788static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
789
ccc9c027
L
790/* If we have selected a cpu we are generating instructions for. */
791static int cpu_arch_tune_set = 0;
792
9103f4f4 793/* Cpu we are generating instructions for. */
fbf3f584 794enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
795
796/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 797static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 798
ccc9c027 799/* CPU instruction set architecture used. */
fbf3f584 800enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 801
9103f4f4 802/* CPU feature flags of instruction set architecture used. */
fbf3f584 803i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 804
fddf5b5b
AM
805/* If set, conditional jumps are not automatically promoted to handle
806 larger than a byte offset. */
807static unsigned int no_cond_jump_promotion = 0;
808
c0f3af97
L
809/* Encode SSE instructions with VEX prefix. */
810static unsigned int sse2avx;
811
539f890d
L
812/* Encode scalar AVX instructions with specific vector length. */
813static enum
814 {
815 vex128 = 0,
816 vex256
817 } avxscalar;
818
03751133
L
819/* Encode VEX WIG instructions with specific vex.w. */
820static enum
821 {
822 vexw0 = 0,
823 vexw1
824 } vexwig;
825
43234a1e
L
826/* Encode scalar EVEX LIG instructions with specific vector length. */
827static enum
828 {
829 evexl128 = 0,
830 evexl256,
831 evexl512
832 } evexlig;
833
834/* Encode EVEX WIG instructions with specific evex.w. */
835static enum
836 {
837 evexw0 = 0,
838 evexw1
839 } evexwig;
840
d3d3c6db
IT
841/* Value to encode in EVEX RC bits, for SAE-only instructions. */
842static enum rc_type evexrcig = rne;
843
29b0f896 844/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 845static symbolS *GOT_symbol;
29b0f896 846
a4447b93
RH
847/* The dwarf2 return column, adjusted for 32 or 64 bit. */
848unsigned int x86_dwarf2_return_column;
849
850/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
851int x86_cie_data_alignment;
852
252b5132 853/* Interface to relax_segment.
fddf5b5b
AM
854 There are 3 major relax states for 386 jump insns because the
855 different types of jumps add different sizes to frags when we're
e379e5f3
L
856 figuring out what sort of jump to choose to reach a given label.
857
858 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
859 branches which are handled by md_estimate_size_before_relax() and
860 i386_generic_table_relax_frag(). */
252b5132 861
47926f60 862/* Types. */
93c2a809
AM
863#define UNCOND_JUMP 0
864#define COND_JUMP 1
865#define COND_JUMP86 2
e379e5f3
L
866#define BRANCH_PADDING 3
867#define BRANCH_PREFIX 4
868#define FUSED_JCC_PADDING 5
fddf5b5b 869
47926f60 870/* Sizes. */
252b5132
RH
871#define CODE16 1
872#define SMALL 0
29b0f896 873#define SMALL16 (SMALL | CODE16)
252b5132 874#define BIG 2
29b0f896 875#define BIG16 (BIG | CODE16)
252b5132
RH
876
877#ifndef INLINE
878#ifdef __GNUC__
879#define INLINE __inline__
880#else
881#define INLINE
882#endif
883#endif
884
fddf5b5b
AM
885#define ENCODE_RELAX_STATE(type, size) \
886 ((relax_substateT) (((type) << 2) | (size)))
887#define TYPE_FROM_RELAX_STATE(s) \
888 ((s) >> 2)
889#define DISP_SIZE_FROM_RELAX_STATE(s) \
890 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
891
892/* This table is used by relax_frag to promote short jumps to long
893 ones where necessary. SMALL (short) jumps may be promoted to BIG
894 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
895 don't allow a short jump in a 32 bit code segment to be promoted to
896 a 16 bit offset jump because it's slower (requires data size
897 prefix), and doesn't work, unless the destination is in the bottom
898 64k of the code segment (The top 16 bits of eip are zeroed). */
899
900const relax_typeS md_relax_table[] =
901{
24eab124
AM
902 /* The fields are:
903 1) most positive reach of this state,
904 2) most negative reach of this state,
93c2a809 905 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 906 4) which index into the table to try if we can't fit into this one. */
252b5132 907
fddf5b5b 908 /* UNCOND_JUMP states. */
93c2a809
AM
909 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
910 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
911 /* dword jmp adds 4 bytes to frag:
912 0 extra opcode bytes, 4 displacement bytes. */
252b5132 913 {0, 0, 4, 0},
93c2a809
AM
914 /* word jmp adds 2 byte2 to frag:
915 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
916 {0, 0, 2, 0},
917
93c2a809
AM
918 /* COND_JUMP states. */
919 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
920 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
921 /* dword conditionals adds 5 bytes to frag:
922 1 extra opcode byte, 4 displacement bytes. */
923 {0, 0, 5, 0},
fddf5b5b 924 /* word conditionals add 3 bytes to frag:
93c2a809
AM
925 1 extra opcode byte, 2 displacement bytes. */
926 {0, 0, 3, 0},
927
928 /* COND_JUMP86 states. */
929 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
930 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
931 /* dword conditionals adds 5 bytes to frag:
932 1 extra opcode byte, 4 displacement bytes. */
933 {0, 0, 5, 0},
934 /* word conditionals add 4 bytes to frag:
935 1 displacement byte and a 3 byte long branch insn. */
936 {0, 0, 4, 0}
252b5132
RH
937};
938
9103f4f4
L
939static const arch_entry cpu_arch[] =
940{
89507696
JB
941 /* Do not replace the first two entries - i386_target_format()
942 relies on them being there in this order. */
8a2c8fef 943 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 944 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 945 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 946 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 947 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 948 CPU_NONE_FLAGS, 0 },
8a2c8fef 949 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 950 CPU_I186_FLAGS, 0 },
8a2c8fef 951 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 952 CPU_I286_FLAGS, 0 },
8a2c8fef 953 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 954 CPU_I386_FLAGS, 0 },
8a2c8fef 955 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 956 CPU_I486_FLAGS, 0 },
8a2c8fef 957 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 958 CPU_I586_FLAGS, 0 },
8a2c8fef 959 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 960 CPU_I686_FLAGS, 0 },
8a2c8fef 961 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 962 CPU_I586_FLAGS, 0 },
8a2c8fef 963 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 964 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 965 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 966 CPU_P2_FLAGS, 0 },
8a2c8fef 967 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 968 CPU_P3_FLAGS, 0 },
8a2c8fef 969 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 970 CPU_P4_FLAGS, 0 },
8a2c8fef 971 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 972 CPU_CORE_FLAGS, 0 },
8a2c8fef 973 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 974 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 975 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 976 CPU_CORE_FLAGS, 1 },
8a2c8fef 977 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 978 CPU_CORE_FLAGS, 0 },
8a2c8fef 979 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 980 CPU_CORE2_FLAGS, 1 },
8a2c8fef 981 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 982 CPU_CORE2_FLAGS, 0 },
8a2c8fef 983 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 984 CPU_COREI7_FLAGS, 0 },
8a2c8fef 985 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 986 CPU_L1OM_FLAGS, 0 },
7a9068fe 987 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 988 CPU_K1OM_FLAGS, 0 },
81486035 989 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 990 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 991 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 992 CPU_K6_FLAGS, 0 },
8a2c8fef 993 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 994 CPU_K6_2_FLAGS, 0 },
8a2c8fef 995 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 996 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 997 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 998 CPU_K8_FLAGS, 1 },
8a2c8fef 999 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 1000 CPU_K8_FLAGS, 0 },
8a2c8fef 1001 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 1002 CPU_K8_FLAGS, 0 },
8a2c8fef 1003 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 1004 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 1005 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 1006 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 1007 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 1008 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1009 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1010 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1011 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1012 CPU_BDVER4_FLAGS, 0 },
029f3522 1013 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1014 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1015 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1016 CPU_ZNVER2_FLAGS, 0 },
7b458c12 1017 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1018 CPU_BTVER1_FLAGS, 0 },
7b458c12 1019 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1020 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1021 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1022 CPU_8087_FLAGS, 0 },
8a2c8fef 1023 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1024 CPU_287_FLAGS, 0 },
8a2c8fef 1025 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1026 CPU_387_FLAGS, 0 },
1848e567
L
1027 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1028 CPU_687_FLAGS, 0 },
d871f3f4
L
1029 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1030 CPU_CMOV_FLAGS, 0 },
1031 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1032 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1033 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1034 CPU_MMX_FLAGS, 0 },
8a2c8fef 1035 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1036 CPU_SSE_FLAGS, 0 },
8a2c8fef 1037 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1038 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1039 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1040 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1041 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1042 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1043 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1044 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1045 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1046 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1047 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1048 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1049 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1050 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1051 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1052 CPU_AVX_FLAGS, 0 },
6c30d220 1053 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1054 CPU_AVX2_FLAGS, 0 },
43234a1e 1055 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1056 CPU_AVX512F_FLAGS, 0 },
43234a1e 1057 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1058 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1059 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1060 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1061 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1062 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1063 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1064 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1065 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1066 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1067 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1068 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1069 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1070 CPU_VMX_FLAGS, 0 },
8729a6f6 1071 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1072 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1073 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1074 CPU_SMX_FLAGS, 0 },
8a2c8fef 1075 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1076 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1077 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1078 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1079 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1080 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1081 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1082 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1083 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1084 CPU_AES_FLAGS, 0 },
8a2c8fef 1085 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1086 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1087 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1088 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1089 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1090 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1091 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1092 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1093 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1094 CPU_F16C_FLAGS, 0 },
6c30d220 1095 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1096 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1097 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1098 CPU_FMA_FLAGS, 0 },
8a2c8fef 1099 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1100 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1101 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1102 CPU_XOP_FLAGS, 0 },
8a2c8fef 1103 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1104 CPU_LWP_FLAGS, 0 },
8a2c8fef 1105 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1106 CPU_MOVBE_FLAGS, 0 },
60aa667e 1107 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1108 CPU_CX16_FLAGS, 0 },
8a2c8fef 1109 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1110 CPU_EPT_FLAGS, 0 },
6c30d220 1111 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1112 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1113 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1114 CPU_POPCNT_FLAGS, 0 },
42164a71 1115 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1116 CPU_HLE_FLAGS, 0 },
42164a71 1117 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1118 CPU_RTM_FLAGS, 0 },
6c30d220 1119 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1120 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1121 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1122 CPU_CLFLUSH_FLAGS, 0 },
22109423 1123 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1124 CPU_NOP_FLAGS, 0 },
8a2c8fef 1125 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1126 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1127 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1128 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1129 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1130 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1131 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1132 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1133 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1134 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1135 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1136 CPU_SVME_FLAGS, 1 },
8a2c8fef 1137 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1138 CPU_SVME_FLAGS, 0 },
8a2c8fef 1139 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1140 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1141 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1142 CPU_ABM_FLAGS, 0 },
87973e9f 1143 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1144 CPU_BMI_FLAGS, 0 },
2a2a0f38 1145 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1146 CPU_TBM_FLAGS, 0 },
e2e1fcde 1147 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1148 CPU_ADX_FLAGS, 0 },
e2e1fcde 1149 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1150 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1151 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1152 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1153 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1154 CPU_SMAP_FLAGS, 0 },
7e8b059b 1155 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1156 CPU_MPX_FLAGS, 0 },
a0046408 1157 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1158 CPU_SHA_FLAGS, 0 },
963f3586 1159 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1160 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1161 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1162 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1163 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1164 CPU_SE1_FLAGS, 0 },
c5e7287a 1165 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1166 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1167 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1168 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1169 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1170 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1171 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1172 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1173 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1174 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1175 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1176 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1177 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1178 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1179 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1180 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1181 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1182 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1183 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1184 CPU_CLZERO_FLAGS, 0 },
9916071f 1185 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1186 CPU_MWAITX_FLAGS, 0 },
8eab4136 1187 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1188 CPU_OSPKE_FLAGS, 0 },
8bc52696 1189 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1190 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1191 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1192 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1193 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1194 CPU_IBT_FLAGS, 0 },
1195 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1196 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1197 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1198 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1199 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1200 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1201 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1202 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1203 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1204 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1205 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1206 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1207 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1208 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1209 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1210 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1211 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1212 CPU_AMX_INT8_FLAGS, 0 },
1213 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1214 CPU_AMX_BF16_FLAGS, 0 },
1215 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1216 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1217 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1218 CPU_MOVDIRI_FLAGS, 0 },
1219 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1220 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1221 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1222 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1223 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1224 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
81d54bb7
CL
1225 { STRING_COMMA_LEN (".tdx"), PROCESSOR_UNKNOWN,
1226 CPU_TDX_FLAGS, 0 },
dd455cf5
L
1227 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1228 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1229 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1230 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1231 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1232 CPU_RDPRU_FLAGS, 0 },
1233 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1234 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1235 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1236 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1237 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1238 CPU_TSXLDTRK_FLAGS, 0 },
c4694f17
TG
1239 { STRING_COMMA_LEN (".kl"), PROCESSOR_UNKNOWN,
1240 CPU_KL_FLAGS, 0 },
1241 { STRING_COMMA_LEN (".widekl"), PROCESSOR_UNKNOWN,
1242 CPU_WIDEKL_FLAGS, 0 },
293f5f65
L
1243};
1244
1245static const noarch_entry cpu_noarch[] =
1246{
1247 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1248 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1249 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1250 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1251 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1252 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1253 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1254 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1255 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1256 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1257 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1258 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1259 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1260 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1261 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1262 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1263 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1264 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1265 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1266 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1267 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1268 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1269 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1270 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1271 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1272 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1273 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1274 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1275 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1276 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1277 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1278 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1279 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1280 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1281 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1282 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1283 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1284 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1285 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1286 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1287 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1288 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
81d54bb7 1289 { STRING_COMMA_LEN ("notdx"), CPU_ANY_TDX_FLAGS },
dd455cf5 1290 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1291 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1292 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
c4694f17
TG
1293 { STRING_COMMA_LEN ("nokl"), CPU_ANY_KL_FLAGS },
1294 { STRING_COMMA_LEN ("nowidekl"), CPU_ANY_WIDEKL_FLAGS },
e413e4e9
AM
1295};
1296
704209c0 1297#ifdef I386COFF
a6c24e68
NC
1298/* Like s_lcomm_internal in gas/read.c but the alignment string
1299 is allowed to be optional. */
1300
1301static symbolS *
1302pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1303{
1304 addressT align = 0;
1305
1306 SKIP_WHITESPACE ();
1307
7ab9ffdd 1308 if (needs_align
a6c24e68
NC
1309 && *input_line_pointer == ',')
1310 {
1311 align = parse_align (needs_align - 1);
7ab9ffdd 1312
a6c24e68
NC
1313 if (align == (addressT) -1)
1314 return NULL;
1315 }
1316 else
1317 {
1318 if (size >= 8)
1319 align = 3;
1320 else if (size >= 4)
1321 align = 2;
1322 else if (size >= 2)
1323 align = 1;
1324 else
1325 align = 0;
1326 }
1327
1328 bss_alloc (symbolP, size, align);
1329 return symbolP;
1330}
1331
704209c0 1332static void
a6c24e68
NC
1333pe_lcomm (int needs_align)
1334{
1335 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1336}
704209c0 1337#endif
a6c24e68 1338
29b0f896
AM
1339const pseudo_typeS md_pseudo_table[] =
1340{
1341#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1342 {"align", s_align_bytes, 0},
1343#else
1344 {"align", s_align_ptwo, 0},
1345#endif
1346 {"arch", set_cpu_arch, 0},
1347#ifndef I386COFF
1348 {"bss", s_bss, 0},
a6c24e68
NC
1349#else
1350 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1351#endif
1352 {"ffloat", float_cons, 'f'},
1353 {"dfloat", float_cons, 'd'},
1354 {"tfloat", float_cons, 'x'},
1355 {"value", cons, 2},
d182319b 1356 {"slong", signed_cons, 4},
29b0f896
AM
1357 {"noopt", s_ignore, 0},
1358 {"optim", s_ignore, 0},
1359 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1360 {"code16", set_code_flag, CODE_16BIT},
1361 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1362#ifdef BFD64
29b0f896 1363 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1364#endif
29b0f896
AM
1365 {"intel_syntax", set_intel_syntax, 1},
1366 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1367 {"intel_mnemonic", set_intel_mnemonic, 1},
1368 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1369 {"allow_index_reg", set_allow_index_reg, 1},
1370 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1371 {"sse_check", set_check, 0},
1372 {"operand_check", set_check, 1},
3b22753a
L
1373#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1374 {"largecomm", handle_large_common, 0},
07a53e5c 1375#else
68d20676 1376 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1377 {"loc", dwarf2_directive_loc, 0},
1378 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1379#endif
6482c264
NC
1380#ifdef TE_PE
1381 {"secrel32", pe_directive_secrel, 0},
1382#endif
29b0f896
AM
1383 {0, 0, 0}
1384};
1385
1386/* For interface with expression (). */
1387extern char *input_line_pointer;
1388
1389/* Hash table for instruction mnemonic lookup. */
629310ab 1390static htab_t op_hash;
29b0f896
AM
1391
1392/* Hash table for register lookup. */
629310ab 1393static htab_t reg_hash;
29b0f896 1394\f
ce8a8b2f
AM
1395 /* Various efficient no-op patterns for aligning code labels.
1396 Note: Don't try to assemble the instructions in the comments.
1397 0L and 0w are not legal. */
62a02d25
L
1398static const unsigned char f32_1[] =
1399 {0x90}; /* nop */
1400static const unsigned char f32_2[] =
1401 {0x66,0x90}; /* xchg %ax,%ax */
1402static const unsigned char f32_3[] =
1403 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1404static const unsigned char f32_4[] =
1405 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1406static const unsigned char f32_6[] =
1407 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1408static const unsigned char f32_7[] =
1409 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1410static const unsigned char f16_3[] =
3ae729d5 1411 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1412static const unsigned char f16_4[] =
3ae729d5
L
1413 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1414static const unsigned char jump_disp8[] =
1415 {0xeb}; /* jmp disp8 */
1416static const unsigned char jump32_disp32[] =
1417 {0xe9}; /* jmp disp32 */
1418static const unsigned char jump16_disp32[] =
1419 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1420/* 32-bit NOPs patterns. */
1421static const unsigned char *const f32_patt[] = {
3ae729d5 1422 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1423};
1424/* 16-bit NOPs patterns. */
1425static const unsigned char *const f16_patt[] = {
3ae729d5 1426 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1427};
1428/* nopl (%[re]ax) */
1429static const unsigned char alt_3[] =
1430 {0x0f,0x1f,0x00};
1431/* nopl 0(%[re]ax) */
1432static const unsigned char alt_4[] =
1433 {0x0f,0x1f,0x40,0x00};
1434/* nopl 0(%[re]ax,%[re]ax,1) */
1435static const unsigned char alt_5[] =
1436 {0x0f,0x1f,0x44,0x00,0x00};
1437/* nopw 0(%[re]ax,%[re]ax,1) */
1438static const unsigned char alt_6[] =
1439 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1440/* nopl 0L(%[re]ax) */
1441static const unsigned char alt_7[] =
1442 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1443/* nopl 0L(%[re]ax,%[re]ax,1) */
1444static const unsigned char alt_8[] =
1445 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1446/* nopw 0L(%[re]ax,%[re]ax,1) */
1447static const unsigned char alt_9[] =
1448 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1449/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1450static const unsigned char alt_10[] =
1451 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1452/* data16 nopw %cs:0L(%eax,%eax,1) */
1453static const unsigned char alt_11[] =
1454 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1455/* 32-bit and 64-bit NOPs patterns. */
1456static const unsigned char *const alt_patt[] = {
1457 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1458 alt_9, alt_10, alt_11
62a02d25
L
1459};
1460
1461/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1462 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1463
1464static void
1465i386_output_nops (char *where, const unsigned char *const *patt,
1466 int count, int max_single_nop_size)
1467
1468{
3ae729d5
L
1469 /* Place the longer NOP first. */
1470 int last;
1471 int offset;
3076e594
NC
1472 const unsigned char *nops;
1473
1474 if (max_single_nop_size < 1)
1475 {
1476 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1477 max_single_nop_size);
1478 return;
1479 }
1480
1481 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1482
1483 /* Use the smaller one if the requsted one isn't available. */
1484 if (nops == NULL)
62a02d25 1485 {
3ae729d5
L
1486 max_single_nop_size--;
1487 nops = patt[max_single_nop_size - 1];
62a02d25
L
1488 }
1489
3ae729d5
L
1490 last = count % max_single_nop_size;
1491
1492 count -= last;
1493 for (offset = 0; offset < count; offset += max_single_nop_size)
1494 memcpy (where + offset, nops, max_single_nop_size);
1495
1496 if (last)
1497 {
1498 nops = patt[last - 1];
1499 if (nops == NULL)
1500 {
1501 /* Use the smaller one plus one-byte NOP if the needed one
1502 isn't available. */
1503 last--;
1504 nops = patt[last - 1];
1505 memcpy (where + offset, nops, last);
1506 where[offset + last] = *patt[0];
1507 }
1508 else
1509 memcpy (where + offset, nops, last);
1510 }
62a02d25
L
1511}
1512
3ae729d5
L
1513static INLINE int
1514fits_in_imm7 (offsetT num)
1515{
1516 return (num & 0x7f) == num;
1517}
1518
1519static INLINE int
1520fits_in_imm31 (offsetT num)
1521{
1522 return (num & 0x7fffffff) == num;
1523}
62a02d25
L
1524
1525/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1526 single NOP instruction LIMIT. */
1527
1528void
3ae729d5 1529i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1530{
3ae729d5 1531 const unsigned char *const *patt = NULL;
62a02d25 1532 int max_single_nop_size;
3ae729d5
L
1533 /* Maximum number of NOPs before switching to jump over NOPs. */
1534 int max_number_of_nops;
62a02d25 1535
3ae729d5 1536 switch (fragP->fr_type)
62a02d25 1537 {
3ae729d5
L
1538 case rs_fill_nop:
1539 case rs_align_code:
1540 break;
e379e5f3
L
1541 case rs_machine_dependent:
1542 /* Allow NOP padding for jumps and calls. */
1543 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1544 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1545 break;
1546 /* Fall through. */
3ae729d5 1547 default:
62a02d25
L
1548 return;
1549 }
1550
ccc9c027
L
1551 /* We need to decide which NOP sequence to use for 32bit and
1552 64bit. When -mtune= is used:
4eed87de 1553
76bc74dc
L
1554 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1555 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1556 2. For the rest, alt_patt will be used.
1557
1558 When -mtune= isn't used, alt_patt will be used if
22109423 1559 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1560 be used.
ccc9c027
L
1561
1562 When -march= or .arch is used, we can't use anything beyond
1563 cpu_arch_isa_flags. */
1564
1565 if (flag_code == CODE_16BIT)
1566 {
3ae729d5
L
1567 patt = f16_patt;
1568 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1569 /* Limit number of NOPs to 2 in 16-bit mode. */
1570 max_number_of_nops = 2;
252b5132 1571 }
33fef721 1572 else
ccc9c027 1573 {
fbf3f584 1574 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1575 {
1576 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1577 switch (cpu_arch_tune)
1578 {
1579 case PROCESSOR_UNKNOWN:
1580 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1581 optimize with nops. */
1582 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1583 patt = alt_patt;
ccc9c027
L
1584 else
1585 patt = f32_patt;
1586 break;
ccc9c027
L
1587 case PROCESSOR_PENTIUM4:
1588 case PROCESSOR_NOCONA:
ef05d495 1589 case PROCESSOR_CORE:
76bc74dc 1590 case PROCESSOR_CORE2:
bd5295b2 1591 case PROCESSOR_COREI7:
3632d14b 1592 case PROCESSOR_L1OM:
7a9068fe 1593 case PROCESSOR_K1OM:
76bc74dc 1594 case PROCESSOR_GENERIC64:
ccc9c027
L
1595 case PROCESSOR_K6:
1596 case PROCESSOR_ATHLON:
1597 case PROCESSOR_K8:
4eed87de 1598 case PROCESSOR_AMDFAM10:
8aedb9fe 1599 case PROCESSOR_BD:
029f3522 1600 case PROCESSOR_ZNVER:
7b458c12 1601 case PROCESSOR_BT:
80b8656c 1602 patt = alt_patt;
ccc9c027 1603 break;
76bc74dc 1604 case PROCESSOR_I386:
ccc9c027
L
1605 case PROCESSOR_I486:
1606 case PROCESSOR_PENTIUM:
2dde1948 1607 case PROCESSOR_PENTIUMPRO:
81486035 1608 case PROCESSOR_IAMCU:
ccc9c027
L
1609 case PROCESSOR_GENERIC32:
1610 patt = f32_patt;
1611 break;
4eed87de 1612 }
ccc9c027
L
1613 }
1614 else
1615 {
fbf3f584 1616 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1617 {
1618 case PROCESSOR_UNKNOWN:
e6a14101 1619 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1620 PROCESSOR_UNKNOWN. */
1621 abort ();
1622 break;
1623
76bc74dc 1624 case PROCESSOR_I386:
ccc9c027
L
1625 case PROCESSOR_I486:
1626 case PROCESSOR_PENTIUM:
81486035 1627 case PROCESSOR_IAMCU:
ccc9c027
L
1628 case PROCESSOR_K6:
1629 case PROCESSOR_ATHLON:
1630 case PROCESSOR_K8:
4eed87de 1631 case PROCESSOR_AMDFAM10:
8aedb9fe 1632 case PROCESSOR_BD:
029f3522 1633 case PROCESSOR_ZNVER:
7b458c12 1634 case PROCESSOR_BT:
ccc9c027
L
1635 case PROCESSOR_GENERIC32:
1636 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1637 with nops. */
1638 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1639 patt = alt_patt;
ccc9c027
L
1640 else
1641 patt = f32_patt;
1642 break;
76bc74dc
L
1643 case PROCESSOR_PENTIUMPRO:
1644 case PROCESSOR_PENTIUM4:
1645 case PROCESSOR_NOCONA:
1646 case PROCESSOR_CORE:
ef05d495 1647 case PROCESSOR_CORE2:
bd5295b2 1648 case PROCESSOR_COREI7:
3632d14b 1649 case PROCESSOR_L1OM:
7a9068fe 1650 case PROCESSOR_K1OM:
22109423 1651 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1652 patt = alt_patt;
ccc9c027
L
1653 else
1654 patt = f32_patt;
1655 break;
1656 case PROCESSOR_GENERIC64:
80b8656c 1657 patt = alt_patt;
ccc9c027 1658 break;
4eed87de 1659 }
ccc9c027
L
1660 }
1661
76bc74dc
L
1662 if (patt == f32_patt)
1663 {
3ae729d5
L
1664 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1665 /* Limit number of NOPs to 2 for older processors. */
1666 max_number_of_nops = 2;
76bc74dc
L
1667 }
1668 else
1669 {
3ae729d5
L
1670 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1671 /* Limit number of NOPs to 7 for newer processors. */
1672 max_number_of_nops = 7;
1673 }
1674 }
1675
1676 if (limit == 0)
1677 limit = max_single_nop_size;
1678
1679 if (fragP->fr_type == rs_fill_nop)
1680 {
1681 /* Output NOPs for .nop directive. */
1682 if (limit > max_single_nop_size)
1683 {
1684 as_bad_where (fragP->fr_file, fragP->fr_line,
1685 _("invalid single nop size: %d "
1686 "(expect within [0, %d])"),
1687 limit, max_single_nop_size);
1688 return;
1689 }
1690 }
e379e5f3 1691 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1692 fragP->fr_var = count;
1693
1694 if ((count / max_single_nop_size) > max_number_of_nops)
1695 {
1696 /* Generate jump over NOPs. */
1697 offsetT disp = count - 2;
1698 if (fits_in_imm7 (disp))
1699 {
1700 /* Use "jmp disp8" if possible. */
1701 count = disp;
1702 where[0] = jump_disp8[0];
1703 where[1] = count;
1704 where += 2;
1705 }
1706 else
1707 {
1708 unsigned int size_of_jump;
1709
1710 if (flag_code == CODE_16BIT)
1711 {
1712 where[0] = jump16_disp32[0];
1713 where[1] = jump16_disp32[1];
1714 size_of_jump = 2;
1715 }
1716 else
1717 {
1718 where[0] = jump32_disp32[0];
1719 size_of_jump = 1;
1720 }
1721
1722 count -= size_of_jump + 4;
1723 if (!fits_in_imm31 (count))
1724 {
1725 as_bad_where (fragP->fr_file, fragP->fr_line,
1726 _("jump over nop padding out of range"));
1727 return;
1728 }
1729
1730 md_number_to_chars (where + size_of_jump, count, 4);
1731 where += size_of_jump + 4;
76bc74dc 1732 }
ccc9c027 1733 }
3ae729d5
L
1734
1735 /* Generate multiple NOPs. */
1736 i386_output_nops (where, patt, count, limit);
252b5132
RH
1737}
1738
c6fb90c8 1739static INLINE int
0dfbf9d7 1740operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1741{
0dfbf9d7 1742 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1743 {
1744 case 3:
0dfbf9d7 1745 if (x->array[2])
c6fb90c8 1746 return 0;
1a0670f3 1747 /* Fall through. */
c6fb90c8 1748 case 2:
0dfbf9d7 1749 if (x->array[1])
c6fb90c8 1750 return 0;
1a0670f3 1751 /* Fall through. */
c6fb90c8 1752 case 1:
0dfbf9d7 1753 return !x->array[0];
c6fb90c8
L
1754 default:
1755 abort ();
1756 }
40fb9820
L
1757}
1758
c6fb90c8 1759static INLINE void
0dfbf9d7 1760operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1761{
0dfbf9d7 1762 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1763 {
1764 case 3:
0dfbf9d7 1765 x->array[2] = v;
1a0670f3 1766 /* Fall through. */
c6fb90c8 1767 case 2:
0dfbf9d7 1768 x->array[1] = v;
1a0670f3 1769 /* Fall through. */
c6fb90c8 1770 case 1:
0dfbf9d7 1771 x->array[0] = v;
1a0670f3 1772 /* Fall through. */
c6fb90c8
L
1773 break;
1774 default:
1775 abort ();
1776 }
bab6aec1
JB
1777
1778 x->bitfield.class = ClassNone;
75e5731b 1779 x->bitfield.instance = InstanceNone;
c6fb90c8 1780}
40fb9820 1781
c6fb90c8 1782static INLINE int
0dfbf9d7
L
1783operand_type_equal (const union i386_operand_type *x,
1784 const union i386_operand_type *y)
c6fb90c8 1785{
0dfbf9d7 1786 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1787 {
1788 case 3:
0dfbf9d7 1789 if (x->array[2] != y->array[2])
c6fb90c8 1790 return 0;
1a0670f3 1791 /* Fall through. */
c6fb90c8 1792 case 2:
0dfbf9d7 1793 if (x->array[1] != y->array[1])
c6fb90c8 1794 return 0;
1a0670f3 1795 /* Fall through. */
c6fb90c8 1796 case 1:
0dfbf9d7 1797 return x->array[0] == y->array[0];
c6fb90c8
L
1798 break;
1799 default:
1800 abort ();
1801 }
1802}
40fb9820 1803
0dfbf9d7
L
1804static INLINE int
1805cpu_flags_all_zero (const union i386_cpu_flags *x)
1806{
1807 switch (ARRAY_SIZE(x->array))
1808 {
53467f57
IT
1809 case 4:
1810 if (x->array[3])
1811 return 0;
1812 /* Fall through. */
0dfbf9d7
L
1813 case 3:
1814 if (x->array[2])
1815 return 0;
1a0670f3 1816 /* Fall through. */
0dfbf9d7
L
1817 case 2:
1818 if (x->array[1])
1819 return 0;
1a0670f3 1820 /* Fall through. */
0dfbf9d7
L
1821 case 1:
1822 return !x->array[0];
1823 default:
1824 abort ();
1825 }
1826}
1827
0dfbf9d7
L
1828static INLINE int
1829cpu_flags_equal (const union i386_cpu_flags *x,
1830 const union i386_cpu_flags *y)
1831{
1832 switch (ARRAY_SIZE(x->array))
1833 {
53467f57
IT
1834 case 4:
1835 if (x->array[3] != y->array[3])
1836 return 0;
1837 /* Fall through. */
0dfbf9d7
L
1838 case 3:
1839 if (x->array[2] != y->array[2])
1840 return 0;
1a0670f3 1841 /* Fall through. */
0dfbf9d7
L
1842 case 2:
1843 if (x->array[1] != y->array[1])
1844 return 0;
1a0670f3 1845 /* Fall through. */
0dfbf9d7
L
1846 case 1:
1847 return x->array[0] == y->array[0];
1848 break;
1849 default:
1850 abort ();
1851 }
1852}
c6fb90c8
L
1853
1854static INLINE int
1855cpu_flags_check_cpu64 (i386_cpu_flags f)
1856{
1857 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1858 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1859}
1860
c6fb90c8
L
1861static INLINE i386_cpu_flags
1862cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1863{
c6fb90c8
L
1864 switch (ARRAY_SIZE (x.array))
1865 {
53467f57
IT
1866 case 4:
1867 x.array [3] &= y.array [3];
1868 /* Fall through. */
c6fb90c8
L
1869 case 3:
1870 x.array [2] &= y.array [2];
1a0670f3 1871 /* Fall through. */
c6fb90c8
L
1872 case 2:
1873 x.array [1] &= y.array [1];
1a0670f3 1874 /* Fall through. */
c6fb90c8
L
1875 case 1:
1876 x.array [0] &= y.array [0];
1877 break;
1878 default:
1879 abort ();
1880 }
1881 return x;
1882}
40fb9820 1883
c6fb90c8
L
1884static INLINE i386_cpu_flags
1885cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1886{
c6fb90c8 1887 switch (ARRAY_SIZE (x.array))
40fb9820 1888 {
53467f57
IT
1889 case 4:
1890 x.array [3] |= y.array [3];
1891 /* Fall through. */
c6fb90c8
L
1892 case 3:
1893 x.array [2] |= y.array [2];
1a0670f3 1894 /* Fall through. */
c6fb90c8
L
1895 case 2:
1896 x.array [1] |= y.array [1];
1a0670f3 1897 /* Fall through. */
c6fb90c8
L
1898 case 1:
1899 x.array [0] |= y.array [0];
40fb9820
L
1900 break;
1901 default:
1902 abort ();
1903 }
40fb9820
L
1904 return x;
1905}
1906
309d3373
JB
1907static INLINE i386_cpu_flags
1908cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1909{
1910 switch (ARRAY_SIZE (x.array))
1911 {
53467f57
IT
1912 case 4:
1913 x.array [3] &= ~y.array [3];
1914 /* Fall through. */
309d3373
JB
1915 case 3:
1916 x.array [2] &= ~y.array [2];
1a0670f3 1917 /* Fall through. */
309d3373
JB
1918 case 2:
1919 x.array [1] &= ~y.array [1];
1a0670f3 1920 /* Fall through. */
309d3373
JB
1921 case 1:
1922 x.array [0] &= ~y.array [0];
1923 break;
1924 default:
1925 abort ();
1926 }
1927 return x;
1928}
1929
6c0946d0
JB
1930static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1931
c0f3af97
L
1932#define CPU_FLAGS_ARCH_MATCH 0x1
1933#define CPU_FLAGS_64BIT_MATCH 0x2
1934
c0f3af97 1935#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1936 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1937
1938/* Return CPU flags match bits. */
3629bb00 1939
40fb9820 1940static int
d3ce72d0 1941cpu_flags_match (const insn_template *t)
40fb9820 1942{
c0f3af97
L
1943 i386_cpu_flags x = t->cpu_flags;
1944 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1945
1946 x.bitfield.cpu64 = 0;
1947 x.bitfield.cpuno64 = 0;
1948
0dfbf9d7 1949 if (cpu_flags_all_zero (&x))
c0f3af97
L
1950 {
1951 /* This instruction is available on all archs. */
db12e14e 1952 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1953 }
3629bb00
L
1954 else
1955 {
c0f3af97 1956 /* This instruction is available only on some archs. */
3629bb00
L
1957 i386_cpu_flags cpu = cpu_arch_flags;
1958
ab592e75
JB
1959 /* AVX512VL is no standalone feature - match it and then strip it. */
1960 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1961 return match;
1962 x.bitfield.cpuavx512vl = 0;
1963
3629bb00 1964 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1965 if (!cpu_flags_all_zero (&cpu))
1966 {
a5ff0eb2
L
1967 if (x.bitfield.cpuavx)
1968 {
929f69fa 1969 /* We need to check a few extra flags with AVX. */
b9d49817 1970 if (cpu.bitfield.cpuavx
40d231b4
JB
1971 && (!t->opcode_modifier.sse2avx
1972 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1973 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1974 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1975 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1976 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1977 }
929f69fa
JB
1978 else if (x.bitfield.cpuavx512f)
1979 {
1980 /* We need to check a few extra flags with AVX512F. */
1981 if (cpu.bitfield.cpuavx512f
1982 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1983 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1984 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1985 match |= CPU_FLAGS_ARCH_MATCH;
1986 }
a5ff0eb2 1987 else
db12e14e 1988 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1989 }
3629bb00 1990 }
c0f3af97 1991 return match;
40fb9820
L
1992}
1993
c6fb90c8
L
1994static INLINE i386_operand_type
1995operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1996{
bab6aec1
JB
1997 if (x.bitfield.class != y.bitfield.class)
1998 x.bitfield.class = ClassNone;
75e5731b
JB
1999 if (x.bitfield.instance != y.bitfield.instance)
2000 x.bitfield.instance = InstanceNone;
bab6aec1 2001
c6fb90c8
L
2002 switch (ARRAY_SIZE (x.array))
2003 {
2004 case 3:
2005 x.array [2] &= y.array [2];
1a0670f3 2006 /* Fall through. */
c6fb90c8
L
2007 case 2:
2008 x.array [1] &= y.array [1];
1a0670f3 2009 /* Fall through. */
c6fb90c8
L
2010 case 1:
2011 x.array [0] &= y.array [0];
2012 break;
2013 default:
2014 abort ();
2015 }
2016 return x;
40fb9820
L
2017}
2018
73053c1f
JB
2019static INLINE i386_operand_type
2020operand_type_and_not (i386_operand_type x, i386_operand_type y)
2021{
bab6aec1 2022 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2023 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2024
73053c1f
JB
2025 switch (ARRAY_SIZE (x.array))
2026 {
2027 case 3:
2028 x.array [2] &= ~y.array [2];
2029 /* Fall through. */
2030 case 2:
2031 x.array [1] &= ~y.array [1];
2032 /* Fall through. */
2033 case 1:
2034 x.array [0] &= ~y.array [0];
2035 break;
2036 default:
2037 abort ();
2038 }
2039 return x;
2040}
2041
c6fb90c8
L
2042static INLINE i386_operand_type
2043operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2044{
bab6aec1
JB
2045 gas_assert (x.bitfield.class == ClassNone ||
2046 y.bitfield.class == ClassNone ||
2047 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2048 gas_assert (x.bitfield.instance == InstanceNone ||
2049 y.bitfield.instance == InstanceNone ||
2050 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2051
c6fb90c8 2052 switch (ARRAY_SIZE (x.array))
40fb9820 2053 {
c6fb90c8
L
2054 case 3:
2055 x.array [2] |= y.array [2];
1a0670f3 2056 /* Fall through. */
c6fb90c8
L
2057 case 2:
2058 x.array [1] |= y.array [1];
1a0670f3 2059 /* Fall through. */
c6fb90c8
L
2060 case 1:
2061 x.array [0] |= y.array [0];
40fb9820
L
2062 break;
2063 default:
2064 abort ();
2065 }
c6fb90c8
L
2066 return x;
2067}
40fb9820 2068
c6fb90c8
L
2069static INLINE i386_operand_type
2070operand_type_xor (i386_operand_type x, i386_operand_type y)
2071{
bab6aec1 2072 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2073 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2074
c6fb90c8
L
2075 switch (ARRAY_SIZE (x.array))
2076 {
2077 case 3:
2078 x.array [2] ^= y.array [2];
1a0670f3 2079 /* Fall through. */
c6fb90c8
L
2080 case 2:
2081 x.array [1] ^= y.array [1];
1a0670f3 2082 /* Fall through. */
c6fb90c8
L
2083 case 1:
2084 x.array [0] ^= y.array [0];
2085 break;
2086 default:
2087 abort ();
2088 }
40fb9820
L
2089 return x;
2090}
2091
40fb9820
L
2092static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2093static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2094static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2095static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2096static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2097static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2098static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2099static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2100static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2101static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2102static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2103static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2104static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2105static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2106static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2107static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2108static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2109
2110enum operand_type
2111{
2112 reg,
40fb9820
L
2113 imm,
2114 disp,
2115 anymem
2116};
2117
c6fb90c8 2118static INLINE int
40fb9820
L
2119operand_type_check (i386_operand_type t, enum operand_type c)
2120{
2121 switch (c)
2122 {
2123 case reg:
bab6aec1 2124 return t.bitfield.class == Reg;
40fb9820 2125
40fb9820
L
2126 case imm:
2127 return (t.bitfield.imm8
2128 || t.bitfield.imm8s
2129 || t.bitfield.imm16
2130 || t.bitfield.imm32
2131 || t.bitfield.imm32s
2132 || t.bitfield.imm64);
2133
2134 case disp:
2135 return (t.bitfield.disp8
2136 || t.bitfield.disp16
2137 || t.bitfield.disp32
2138 || t.bitfield.disp32s
2139 || t.bitfield.disp64);
2140
2141 case anymem:
2142 return (t.bitfield.disp8
2143 || t.bitfield.disp16
2144 || t.bitfield.disp32
2145 || t.bitfield.disp32s
2146 || t.bitfield.disp64
2147 || t.bitfield.baseindex);
2148
2149 default:
2150 abort ();
2151 }
2cfe26b6
AM
2152
2153 return 0;
40fb9820
L
2154}
2155
7a54636a
L
2156/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2157 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2158
2159static INLINE int
7a54636a
L
2160match_operand_size (const insn_template *t, unsigned int wanted,
2161 unsigned int given)
5c07affc 2162{
3ac21baa
JB
2163 return !((i.types[given].bitfield.byte
2164 && !t->operand_types[wanted].bitfield.byte)
2165 || (i.types[given].bitfield.word
2166 && !t->operand_types[wanted].bitfield.word)
2167 || (i.types[given].bitfield.dword
2168 && !t->operand_types[wanted].bitfield.dword)
2169 || (i.types[given].bitfield.qword
2170 && !t->operand_types[wanted].bitfield.qword)
2171 || (i.types[given].bitfield.tbyte
2172 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2173}
2174
dd40ce22
L
2175/* Return 1 if there is no conflict in SIMD register between operand
2176 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2177
2178static INLINE int
dd40ce22
L
2179match_simd_size (const insn_template *t, unsigned int wanted,
2180 unsigned int given)
1b54b8d7 2181{
3ac21baa
JB
2182 return !((i.types[given].bitfield.xmmword
2183 && !t->operand_types[wanted].bitfield.xmmword)
2184 || (i.types[given].bitfield.ymmword
2185 && !t->operand_types[wanted].bitfield.ymmword)
2186 || (i.types[given].bitfield.zmmword
260cd341
LC
2187 && !t->operand_types[wanted].bitfield.zmmword)
2188 || (i.types[given].bitfield.tmmword
2189 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2190}
2191
7a54636a
L
2192/* Return 1 if there is no conflict in any size between operand GIVEN
2193 and opeand WANTED for instruction template T. */
5c07affc
L
2194
2195static INLINE int
dd40ce22
L
2196match_mem_size (const insn_template *t, unsigned int wanted,
2197 unsigned int given)
5c07affc 2198{
7a54636a 2199 return (match_operand_size (t, wanted, given)
3ac21baa 2200 && !((i.types[given].bitfield.unspecified
af508cb9 2201 && !i.broadcast
3ac21baa
JB
2202 && !t->operand_types[wanted].bitfield.unspecified)
2203 || (i.types[given].bitfield.fword
2204 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2205 /* For scalar opcode templates to allow register and memory
2206 operands at the same time, some special casing is needed
d6793fa1
JB
2207 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2208 down-conversion vpmov*. */
3528c362 2209 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2210 && t->operand_types[wanted].bitfield.byte
2211 + t->operand_types[wanted].bitfield.word
2212 + t->operand_types[wanted].bitfield.dword
2213 + t->operand_types[wanted].bitfield.qword
2214 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2215 ? (i.types[given].bitfield.xmmword
2216 || i.types[given].bitfield.ymmword
2217 || i.types[given].bitfield.zmmword)
2218 : !match_simd_size(t, wanted, given))));
5c07affc
L
2219}
2220
3ac21baa
JB
2221/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2222 operands for instruction template T, and it has MATCH_REVERSE set if there
2223 is no size conflict on any operands for the template with operands reversed
2224 (and the template allows for reversing in the first place). */
5c07affc 2225
3ac21baa
JB
2226#define MATCH_STRAIGHT 1
2227#define MATCH_REVERSE 2
2228
2229static INLINE unsigned int
d3ce72d0 2230operand_size_match (const insn_template *t)
5c07affc 2231{
3ac21baa 2232 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2233
0cfa3eb3 2234 /* Don't check non-absolute jump instructions. */
5c07affc 2235 if (t->opcode_modifier.jump
0cfa3eb3 2236 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2237 return match;
2238
2239 /* Check memory and accumulator operand size. */
2240 for (j = 0; j < i.operands; j++)
2241 {
3528c362
JB
2242 if (i.types[j].bitfield.class != Reg
2243 && i.types[j].bitfield.class != RegSIMD
601e8564 2244 && t->opcode_modifier.anysize)
5c07affc
L
2245 continue;
2246
bab6aec1 2247 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2248 && !match_operand_size (t, j, j))
5c07affc
L
2249 {
2250 match = 0;
2251 break;
2252 }
2253
3528c362 2254 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2255 && !match_simd_size (t, j, j))
1b54b8d7
JB
2256 {
2257 match = 0;
2258 break;
2259 }
2260
75e5731b 2261 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2262 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2263 {
2264 match = 0;
2265 break;
2266 }
2267
c48dadc9 2268 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2269 {
2270 match = 0;
2271 break;
2272 }
2273 }
2274
3ac21baa 2275 if (!t->opcode_modifier.d)
891edac4 2276 {
dc1e8a47 2277 mismatch:
3ac21baa
JB
2278 if (!match)
2279 i.error = operand_size_mismatch;
2280 return match;
891edac4 2281 }
5c07affc
L
2282
2283 /* Check reverse. */
f5eb1d70 2284 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2285
f5eb1d70 2286 for (j = 0; j < i.operands; j++)
5c07affc 2287 {
f5eb1d70
JB
2288 unsigned int given = i.operands - j - 1;
2289
bab6aec1 2290 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2291 && !match_operand_size (t, j, given))
891edac4 2292 goto mismatch;
5c07affc 2293
3528c362 2294 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2295 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2296 goto mismatch;
2297
75e5731b 2298 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2299 && (!match_operand_size (t, j, given)
2300 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2301 goto mismatch;
2302
f5eb1d70 2303 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2304 goto mismatch;
5c07affc
L
2305 }
2306
3ac21baa 2307 return match | MATCH_REVERSE;
5c07affc
L
2308}
2309
c6fb90c8 2310static INLINE int
40fb9820
L
2311operand_type_match (i386_operand_type overlap,
2312 i386_operand_type given)
2313{
2314 i386_operand_type temp = overlap;
2315
7d5e4556 2316 temp.bitfield.unspecified = 0;
5c07affc
L
2317 temp.bitfield.byte = 0;
2318 temp.bitfield.word = 0;
2319 temp.bitfield.dword = 0;
2320 temp.bitfield.fword = 0;
2321 temp.bitfield.qword = 0;
2322 temp.bitfield.tbyte = 0;
2323 temp.bitfield.xmmword = 0;
c0f3af97 2324 temp.bitfield.ymmword = 0;
43234a1e 2325 temp.bitfield.zmmword = 0;
260cd341 2326 temp.bitfield.tmmword = 0;
0dfbf9d7 2327 if (operand_type_all_zero (&temp))
891edac4 2328 goto mismatch;
40fb9820 2329
6f2f06be 2330 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2331 return 1;
2332
dc1e8a47 2333 mismatch:
a65babc9 2334 i.error = operand_type_mismatch;
891edac4 2335 return 0;
40fb9820
L
2336}
2337
7d5e4556 2338/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2339 unless the expected operand type register overlap is null.
5de4d9ef 2340 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2341
c6fb90c8 2342static INLINE int
dc821c5f 2343operand_type_register_match (i386_operand_type g0,
40fb9820 2344 i386_operand_type t0,
40fb9820
L
2345 i386_operand_type g1,
2346 i386_operand_type t1)
2347{
bab6aec1 2348 if (g0.bitfield.class != Reg
3528c362 2349 && g0.bitfield.class != RegSIMD
10c17abd
JB
2350 && (!operand_type_check (g0, anymem)
2351 || g0.bitfield.unspecified
5de4d9ef
JB
2352 || (t0.bitfield.class != Reg
2353 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2354 return 1;
2355
bab6aec1 2356 if (g1.bitfield.class != Reg
3528c362 2357 && g1.bitfield.class != RegSIMD
10c17abd
JB
2358 && (!operand_type_check (g1, anymem)
2359 || g1.bitfield.unspecified
5de4d9ef
JB
2360 || (t1.bitfield.class != Reg
2361 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2362 return 1;
2363
dc821c5f
JB
2364 if (g0.bitfield.byte == g1.bitfield.byte
2365 && g0.bitfield.word == g1.bitfield.word
2366 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2367 && g0.bitfield.qword == g1.bitfield.qword
2368 && g0.bitfield.xmmword == g1.bitfield.xmmword
2369 && g0.bitfield.ymmword == g1.bitfield.ymmword
2370 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2371 return 1;
2372
dc821c5f
JB
2373 if (!(t0.bitfield.byte & t1.bitfield.byte)
2374 && !(t0.bitfield.word & t1.bitfield.word)
2375 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2376 && !(t0.bitfield.qword & t1.bitfield.qword)
2377 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2378 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2379 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2380 return 1;
2381
a65babc9 2382 i.error = register_type_mismatch;
891edac4
L
2383
2384 return 0;
40fb9820
L
2385}
2386
4c692bc7
JB
2387static INLINE unsigned int
2388register_number (const reg_entry *r)
2389{
2390 unsigned int nr = r->reg_num;
2391
2392 if (r->reg_flags & RegRex)
2393 nr += 8;
2394
200cbe0f
L
2395 if (r->reg_flags & RegVRex)
2396 nr += 16;
2397
4c692bc7
JB
2398 return nr;
2399}
2400
252b5132 2401static INLINE unsigned int
40fb9820 2402mode_from_disp_size (i386_operand_type t)
252b5132 2403{
b5014f7a 2404 if (t.bitfield.disp8)
40fb9820
L
2405 return 1;
2406 else if (t.bitfield.disp16
2407 || t.bitfield.disp32
2408 || t.bitfield.disp32s)
2409 return 2;
2410 else
2411 return 0;
252b5132
RH
2412}
2413
2414static INLINE int
65879393 2415fits_in_signed_byte (addressT num)
252b5132 2416{
65879393 2417 return num + 0x80 <= 0xff;
47926f60 2418}
252b5132
RH
2419
2420static INLINE int
65879393 2421fits_in_unsigned_byte (addressT num)
252b5132 2422{
65879393 2423 return num <= 0xff;
47926f60 2424}
252b5132
RH
2425
2426static INLINE int
65879393 2427fits_in_unsigned_word (addressT num)
252b5132 2428{
65879393 2429 return num <= 0xffff;
47926f60 2430}
252b5132
RH
2431
2432static INLINE int
65879393 2433fits_in_signed_word (addressT num)
252b5132 2434{
65879393 2435 return num + 0x8000 <= 0xffff;
47926f60 2436}
2a962e6d 2437
3e73aa7c 2438static INLINE int
65879393 2439fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2440{
2441#ifndef BFD64
2442 return 1;
2443#else
65879393 2444 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2445#endif
2446} /* fits_in_signed_long() */
2a962e6d 2447
3e73aa7c 2448static INLINE int
65879393 2449fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2450{
2451#ifndef BFD64
2452 return 1;
2453#else
65879393 2454 return num <= 0xffffffff;
3e73aa7c
JH
2455#endif
2456} /* fits_in_unsigned_long() */
252b5132 2457
43234a1e 2458static INLINE int
b5014f7a 2459fits_in_disp8 (offsetT num)
43234a1e
L
2460{
2461 int shift = i.memshift;
2462 unsigned int mask;
2463
2464 if (shift == -1)
2465 abort ();
2466
2467 mask = (1 << shift) - 1;
2468
2469 /* Return 0 if NUM isn't properly aligned. */
2470 if ((num & mask))
2471 return 0;
2472
2473 /* Check if NUM will fit in 8bit after shift. */
2474 return fits_in_signed_byte (num >> shift);
2475}
2476
a683cc34
SP
2477static INLINE int
2478fits_in_imm4 (offsetT num)
2479{
2480 return (num & 0xf) == num;
2481}
2482
40fb9820 2483static i386_operand_type
e3bb37b5 2484smallest_imm_type (offsetT num)
252b5132 2485{
40fb9820 2486 i386_operand_type t;
7ab9ffdd 2487
0dfbf9d7 2488 operand_type_set (&t, 0);
40fb9820
L
2489 t.bitfield.imm64 = 1;
2490
2491 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2492 {
2493 /* This code is disabled on the 486 because all the Imm1 forms
2494 in the opcode table are slower on the i486. They're the
2495 versions with the implicitly specified single-position
2496 displacement, which has another syntax if you really want to
2497 use that form. */
40fb9820
L
2498 t.bitfield.imm1 = 1;
2499 t.bitfield.imm8 = 1;
2500 t.bitfield.imm8s = 1;
2501 t.bitfield.imm16 = 1;
2502 t.bitfield.imm32 = 1;
2503 t.bitfield.imm32s = 1;
2504 }
2505 else if (fits_in_signed_byte (num))
2506 {
2507 t.bitfield.imm8 = 1;
2508 t.bitfield.imm8s = 1;
2509 t.bitfield.imm16 = 1;
2510 t.bitfield.imm32 = 1;
2511 t.bitfield.imm32s = 1;
2512 }
2513 else if (fits_in_unsigned_byte (num))
2514 {
2515 t.bitfield.imm8 = 1;
2516 t.bitfield.imm16 = 1;
2517 t.bitfield.imm32 = 1;
2518 t.bitfield.imm32s = 1;
2519 }
2520 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2521 {
2522 t.bitfield.imm16 = 1;
2523 t.bitfield.imm32 = 1;
2524 t.bitfield.imm32s = 1;
2525 }
2526 else if (fits_in_signed_long (num))
2527 {
2528 t.bitfield.imm32 = 1;
2529 t.bitfield.imm32s = 1;
2530 }
2531 else if (fits_in_unsigned_long (num))
2532 t.bitfield.imm32 = 1;
2533
2534 return t;
47926f60 2535}
252b5132 2536
847f7ad4 2537static offsetT
e3bb37b5 2538offset_in_range (offsetT val, int size)
847f7ad4 2539{
508866be 2540 addressT mask;
ba2adb93 2541
847f7ad4
AM
2542 switch (size)
2543 {
508866be
L
2544 case 1: mask = ((addressT) 1 << 8) - 1; break;
2545 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2546 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2547#ifdef BFD64
2548 case 8: mask = ((addressT) 2 << 63) - 1; break;
2549#endif
47926f60 2550 default: abort ();
847f7ad4
AM
2551 }
2552
47926f60 2553 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2554 {
2555 char buf1[40], buf2[40];
2556
2557 sprint_value (buf1, val);
2558 sprint_value (buf2, val & mask);
2559 as_warn (_("%s shortened to %s"), buf1, buf2);
2560 }
2561 return val & mask;
2562}
2563
c32fa91d
L
2564enum PREFIX_GROUP
2565{
2566 PREFIX_EXIST = 0,
2567 PREFIX_LOCK,
2568 PREFIX_REP,
04ef582a 2569 PREFIX_DS,
c32fa91d
L
2570 PREFIX_OTHER
2571};
2572
2573/* Returns
2574 a. PREFIX_EXIST if attempting to add a prefix where one from the
2575 same class already exists.
2576 b. PREFIX_LOCK if lock prefix is added.
2577 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2578 d. PREFIX_DS if ds prefix is added.
2579 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2580 */
2581
2582static enum PREFIX_GROUP
e3bb37b5 2583add_prefix (unsigned int prefix)
252b5132 2584{
c32fa91d 2585 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2586 unsigned int q;
252b5132 2587
29b0f896
AM
2588 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2589 && flag_code == CODE_64BIT)
b1905489 2590 {
161a04f6 2591 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2592 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2593 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2594 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2595 ret = PREFIX_EXIST;
b1905489
JB
2596 q = REX_PREFIX;
2597 }
3e73aa7c 2598 else
b1905489
JB
2599 {
2600 switch (prefix)
2601 {
2602 default:
2603 abort ();
2604
b1905489 2605 case DS_PREFIX_OPCODE:
04ef582a
L
2606 ret = PREFIX_DS;
2607 /* Fall through. */
2608 case CS_PREFIX_OPCODE:
b1905489
JB
2609 case ES_PREFIX_OPCODE:
2610 case FS_PREFIX_OPCODE:
2611 case GS_PREFIX_OPCODE:
2612 case SS_PREFIX_OPCODE:
2613 q = SEG_PREFIX;
2614 break;
2615
2616 case REPNE_PREFIX_OPCODE:
2617 case REPE_PREFIX_OPCODE:
c32fa91d
L
2618 q = REP_PREFIX;
2619 ret = PREFIX_REP;
2620 break;
2621
b1905489 2622 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2623 q = LOCK_PREFIX;
2624 ret = PREFIX_LOCK;
b1905489
JB
2625 break;
2626
2627 case FWAIT_OPCODE:
2628 q = WAIT_PREFIX;
2629 break;
2630
2631 case ADDR_PREFIX_OPCODE:
2632 q = ADDR_PREFIX;
2633 break;
2634
2635 case DATA_PREFIX_OPCODE:
2636 q = DATA_PREFIX;
2637 break;
2638 }
2639 if (i.prefix[q] != 0)
c32fa91d 2640 ret = PREFIX_EXIST;
b1905489 2641 }
252b5132 2642
b1905489 2643 if (ret)
252b5132 2644 {
b1905489
JB
2645 if (!i.prefix[q])
2646 ++i.prefixes;
2647 i.prefix[q] |= prefix;
252b5132 2648 }
b1905489
JB
2649 else
2650 as_bad (_("same type of prefix used twice"));
252b5132 2651
252b5132
RH
2652 return ret;
2653}
2654
2655static void
78f12dd3 2656update_code_flag (int value, int check)
eecb386c 2657{
78f12dd3
L
2658 PRINTF_LIKE ((*as_error));
2659
1e9cc1c2 2660 flag_code = (enum flag_code) value;
40fb9820
L
2661 if (flag_code == CODE_64BIT)
2662 {
2663 cpu_arch_flags.bitfield.cpu64 = 1;
2664 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2665 }
2666 else
2667 {
2668 cpu_arch_flags.bitfield.cpu64 = 0;
2669 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2670 }
2671 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2672 {
78f12dd3
L
2673 if (check)
2674 as_error = as_fatal;
2675 else
2676 as_error = as_bad;
2677 (*as_error) (_("64bit mode not supported on `%s'."),
2678 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2679 }
40fb9820 2680 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2681 {
78f12dd3
L
2682 if (check)
2683 as_error = as_fatal;
2684 else
2685 as_error = as_bad;
2686 (*as_error) (_("32bit mode not supported on `%s'."),
2687 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2688 }
eecb386c
AM
2689 stackop_size = '\0';
2690}
2691
78f12dd3
L
2692static void
2693set_code_flag (int value)
2694{
2695 update_code_flag (value, 0);
2696}
2697
eecb386c 2698static void
e3bb37b5 2699set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2700{
1e9cc1c2 2701 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2702 if (flag_code != CODE_16BIT)
2703 abort ();
2704 cpu_arch_flags.bitfield.cpu64 = 0;
2705 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2706 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2707}
2708
2709static void
e3bb37b5 2710set_intel_syntax (int syntax_flag)
252b5132
RH
2711{
2712 /* Find out if register prefixing is specified. */
2713 int ask_naked_reg = 0;
2714
2715 SKIP_WHITESPACE ();
29b0f896 2716 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2717 {
d02603dc
NC
2718 char *string;
2719 int e = get_symbol_name (&string);
252b5132 2720
47926f60 2721 if (strcmp (string, "prefix") == 0)
252b5132 2722 ask_naked_reg = 1;
47926f60 2723 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2724 ask_naked_reg = -1;
2725 else
d0b47220 2726 as_bad (_("bad argument to syntax directive."));
d02603dc 2727 (void) restore_line_pointer (e);
252b5132
RH
2728 }
2729 demand_empty_rest_of_line ();
c3332e24 2730
252b5132
RH
2731 intel_syntax = syntax_flag;
2732
2733 if (ask_naked_reg == 0)
f86103b7
AM
2734 allow_naked_reg = (intel_syntax
2735 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2736 else
2737 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2738
ee86248c 2739 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2740
e4a3b5a4 2741 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2742 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2743 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2744}
2745
1efbbeb4
L
2746static void
2747set_intel_mnemonic (int mnemonic_flag)
2748{
e1d4d893 2749 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2750}
2751
db51cc60
L
2752static void
2753set_allow_index_reg (int flag)
2754{
2755 allow_index_reg = flag;
2756}
2757
cb19c032 2758static void
7bab8ab5 2759set_check (int what)
cb19c032 2760{
7bab8ab5
JB
2761 enum check_kind *kind;
2762 const char *str;
2763
2764 if (what)
2765 {
2766 kind = &operand_check;
2767 str = "operand";
2768 }
2769 else
2770 {
2771 kind = &sse_check;
2772 str = "sse";
2773 }
2774
cb19c032
L
2775 SKIP_WHITESPACE ();
2776
2777 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2778 {
d02603dc
NC
2779 char *string;
2780 int e = get_symbol_name (&string);
cb19c032
L
2781
2782 if (strcmp (string, "none") == 0)
7bab8ab5 2783 *kind = check_none;
cb19c032 2784 else if (strcmp (string, "warning") == 0)
7bab8ab5 2785 *kind = check_warning;
cb19c032 2786 else if (strcmp (string, "error") == 0)
7bab8ab5 2787 *kind = check_error;
cb19c032 2788 else
7bab8ab5 2789 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2790 (void) restore_line_pointer (e);
cb19c032
L
2791 }
2792 else
7bab8ab5 2793 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2794
2795 demand_empty_rest_of_line ();
2796}
2797
8a9036a4
L
2798static void
2799check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2800 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2801{
2802#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2803 static const char *arch;
2804
2805 /* Intel LIOM is only supported on ELF. */
2806 if (!IS_ELF)
2807 return;
2808
2809 if (!arch)
2810 {
2811 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2812 use default_arch. */
2813 arch = cpu_arch_name;
2814 if (!arch)
2815 arch = default_arch;
2816 }
2817
81486035
L
2818 /* If we are targeting Intel MCU, we must enable it. */
2819 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2820 || new_flag.bitfield.cpuiamcu)
2821 return;
2822
3632d14b 2823 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2824 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2825 || new_flag.bitfield.cpul1om)
8a9036a4 2826 return;
76ba9986 2827
7a9068fe
L
2828 /* If we are targeting Intel K1OM, we must enable it. */
2829 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2830 || new_flag.bitfield.cpuk1om)
2831 return;
2832
8a9036a4
L
2833 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2834#endif
2835}
2836
e413e4e9 2837static void
e3bb37b5 2838set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2839{
47926f60 2840 SKIP_WHITESPACE ();
e413e4e9 2841
29b0f896 2842 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2843 {
d02603dc
NC
2844 char *string;
2845 int e = get_symbol_name (&string);
91d6fa6a 2846 unsigned int j;
40fb9820 2847 i386_cpu_flags flags;
e413e4e9 2848
91d6fa6a 2849 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2850 {
91d6fa6a 2851 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2852 {
91d6fa6a 2853 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2854
5c6af06e
JB
2855 if (*string != '.')
2856 {
91d6fa6a 2857 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2858 cpu_sub_arch_name = NULL;
91d6fa6a 2859 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2860 if (flag_code == CODE_64BIT)
2861 {
2862 cpu_arch_flags.bitfield.cpu64 = 1;
2863 cpu_arch_flags.bitfield.cpuno64 = 0;
2864 }
2865 else
2866 {
2867 cpu_arch_flags.bitfield.cpu64 = 0;
2868 cpu_arch_flags.bitfield.cpuno64 = 1;
2869 }
91d6fa6a
NC
2870 cpu_arch_isa = cpu_arch[j].type;
2871 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2872 if (!cpu_arch_tune_set)
2873 {
2874 cpu_arch_tune = cpu_arch_isa;
2875 cpu_arch_tune_flags = cpu_arch_isa_flags;
2876 }
5c6af06e
JB
2877 break;
2878 }
40fb9820 2879
293f5f65
L
2880 flags = cpu_flags_or (cpu_arch_flags,
2881 cpu_arch[j].flags);
81486035 2882
5b64d091 2883 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2884 {
6305a203
L
2885 if (cpu_sub_arch_name)
2886 {
2887 char *name = cpu_sub_arch_name;
2888 cpu_sub_arch_name = concat (name,
91d6fa6a 2889 cpu_arch[j].name,
1bf57e9f 2890 (const char *) NULL);
6305a203
L
2891 free (name);
2892 }
2893 else
91d6fa6a 2894 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2895 cpu_arch_flags = flags;
a586129e 2896 cpu_arch_isa_flags = flags;
5c6af06e 2897 }
0089dace
L
2898 else
2899 cpu_arch_isa_flags
2900 = cpu_flags_or (cpu_arch_isa_flags,
2901 cpu_arch[j].flags);
d02603dc 2902 (void) restore_line_pointer (e);
5c6af06e
JB
2903 demand_empty_rest_of_line ();
2904 return;
e413e4e9
AM
2905 }
2906 }
293f5f65
L
2907
2908 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2909 {
33eaf5de 2910 /* Disable an ISA extension. */
293f5f65
L
2911 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2912 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2913 {
2914 flags = cpu_flags_and_not (cpu_arch_flags,
2915 cpu_noarch[j].flags);
2916 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2917 {
2918 if (cpu_sub_arch_name)
2919 {
2920 char *name = cpu_sub_arch_name;
2921 cpu_sub_arch_name = concat (name, string,
2922 (const char *) NULL);
2923 free (name);
2924 }
2925 else
2926 cpu_sub_arch_name = xstrdup (string);
2927 cpu_arch_flags = flags;
2928 cpu_arch_isa_flags = flags;
2929 }
2930 (void) restore_line_pointer (e);
2931 demand_empty_rest_of_line ();
2932 return;
2933 }
2934
2935 j = ARRAY_SIZE (cpu_arch);
2936 }
2937
91d6fa6a 2938 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2939 as_bad (_("no such architecture: `%s'"), string);
2940
2941 *input_line_pointer = e;
2942 }
2943 else
2944 as_bad (_("missing cpu architecture"));
2945
fddf5b5b
AM
2946 no_cond_jump_promotion = 0;
2947 if (*input_line_pointer == ','
29b0f896 2948 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2949 {
d02603dc
NC
2950 char *string;
2951 char e;
2952
2953 ++input_line_pointer;
2954 e = get_symbol_name (&string);
fddf5b5b
AM
2955
2956 if (strcmp (string, "nojumps") == 0)
2957 no_cond_jump_promotion = 1;
2958 else if (strcmp (string, "jumps") == 0)
2959 ;
2960 else
2961 as_bad (_("no such architecture modifier: `%s'"), string);
2962
d02603dc 2963 (void) restore_line_pointer (e);
fddf5b5b
AM
2964 }
2965
e413e4e9
AM
2966 demand_empty_rest_of_line ();
2967}
2968
8a9036a4
L
2969enum bfd_architecture
2970i386_arch (void)
2971{
3632d14b 2972 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2973 {
2974 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2975 || flag_code != CODE_64BIT)
2976 as_fatal (_("Intel L1OM is 64bit ELF only"));
2977 return bfd_arch_l1om;
2978 }
7a9068fe
L
2979 else if (cpu_arch_isa == PROCESSOR_K1OM)
2980 {
2981 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2982 || flag_code != CODE_64BIT)
2983 as_fatal (_("Intel K1OM is 64bit ELF only"));
2984 return bfd_arch_k1om;
2985 }
81486035
L
2986 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2987 {
2988 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2989 || flag_code == CODE_64BIT)
2990 as_fatal (_("Intel MCU is 32bit ELF only"));
2991 return bfd_arch_iamcu;
2992 }
8a9036a4
L
2993 else
2994 return bfd_arch_i386;
2995}
2996
b9d79e03 2997unsigned long
7016a5d5 2998i386_mach (void)
b9d79e03 2999{
351f65ca 3000 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 3001 {
3632d14b 3002 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 3003 {
351f65ca
L
3004 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3005 || default_arch[6] != '\0')
8a9036a4
L
3006 as_fatal (_("Intel L1OM is 64bit ELF only"));
3007 return bfd_mach_l1om;
3008 }
7a9068fe
L
3009 else if (cpu_arch_isa == PROCESSOR_K1OM)
3010 {
3011 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3012 || default_arch[6] != '\0')
3013 as_fatal (_("Intel K1OM is 64bit ELF only"));
3014 return bfd_mach_k1om;
3015 }
351f65ca 3016 else if (default_arch[6] == '\0')
8a9036a4 3017 return bfd_mach_x86_64;
351f65ca
L
3018 else
3019 return bfd_mach_x64_32;
8a9036a4 3020 }
5197d474
L
3021 else if (!strcmp (default_arch, "i386")
3022 || !strcmp (default_arch, "iamcu"))
81486035
L
3023 {
3024 if (cpu_arch_isa == PROCESSOR_IAMCU)
3025 {
3026 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3027 as_fatal (_("Intel MCU is 32bit ELF only"));
3028 return bfd_mach_i386_iamcu;
3029 }
3030 else
3031 return bfd_mach_i386_i386;
3032 }
b9d79e03 3033 else
2b5d6a91 3034 as_fatal (_("unknown architecture"));
b9d79e03 3035}
b9d79e03 3036\f
252b5132 3037void
7016a5d5 3038md_begin (void)
252b5132 3039{
86fa6981
L
3040 /* Support pseudo prefixes like {disp32}. */
3041 lex_type ['{'] = LEX_BEGIN_NAME;
3042
47926f60 3043 /* Initialize op_hash hash table. */
629310ab 3044 op_hash = str_htab_create ();
252b5132
RH
3045
3046 {
d3ce72d0 3047 const insn_template *optab;
29b0f896 3048 templates *core_optab;
252b5132 3049
47926f60
KH
3050 /* Setup for loop. */
3051 optab = i386_optab;
add39d23 3052 core_optab = XNEW (templates);
252b5132
RH
3053 core_optab->start = optab;
3054
3055 while (1)
3056 {
3057 ++optab;
3058 if (optab->name == NULL
3059 || strcmp (optab->name, (optab - 1)->name) != 0)
3060 {
3061 /* different name --> ship out current template list;
47926f60 3062 add to hash table; & begin anew. */
252b5132 3063 core_optab->end = optab;
fe0e921f
AM
3064 if (str_hash_insert (op_hash, (optab - 1)->name, core_optab, 0))
3065 as_fatal (_("duplicate %s"), (optab - 1)->name);
3066
252b5132
RH
3067 if (optab->name == NULL)
3068 break;
add39d23 3069 core_optab = XNEW (templates);
252b5132
RH
3070 core_optab->start = optab;
3071 }
3072 }
3073 }
3074
47926f60 3075 /* Initialize reg_hash hash table. */
629310ab 3076 reg_hash = str_htab_create ();
252b5132 3077 {
29b0f896 3078 const reg_entry *regtab;
c3fe08fa 3079 unsigned int regtab_size = i386_regtab_size;
252b5132 3080
c3fe08fa 3081 for (regtab = i386_regtab; regtab_size--; regtab++)
fe0e921f
AM
3082 if (str_hash_insert (reg_hash, regtab->reg_name, regtab, 0) != NULL)
3083 as_fatal (_("duplicate %s"), regtab->reg_name);
252b5132
RH
3084 }
3085
47926f60 3086 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3087 {
29b0f896
AM
3088 int c;
3089 char *p;
252b5132
RH
3090
3091 for (c = 0; c < 256; c++)
3092 {
3882b010 3093 if (ISDIGIT (c))
252b5132
RH
3094 {
3095 digit_chars[c] = c;
3096 mnemonic_chars[c] = c;
3097 register_chars[c] = c;
3098 operand_chars[c] = c;
3099 }
3882b010 3100 else if (ISLOWER (c))
252b5132
RH
3101 {
3102 mnemonic_chars[c] = c;
3103 register_chars[c] = c;
3104 operand_chars[c] = c;
3105 }
3882b010 3106 else if (ISUPPER (c))
252b5132 3107 {
3882b010 3108 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3109 register_chars[c] = mnemonic_chars[c];
3110 operand_chars[c] = c;
3111 }
43234a1e 3112 else if (c == '{' || c == '}')
86fa6981
L
3113 {
3114 mnemonic_chars[c] = c;
3115 operand_chars[c] = c;
3116 }
b3983e5f
JB
3117#ifdef SVR4_COMMENT_CHARS
3118 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3119 operand_chars[c] = c;
3120#endif
252b5132 3121
3882b010 3122 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3123 identifier_chars[c] = c;
3124 else if (c >= 128)
3125 {
3126 identifier_chars[c] = c;
3127 operand_chars[c] = c;
3128 }
3129 }
3130
3131#ifdef LEX_AT
3132 identifier_chars['@'] = '@';
32137342
NC
3133#endif
3134#ifdef LEX_QM
3135 identifier_chars['?'] = '?';
3136 operand_chars['?'] = '?';
252b5132 3137#endif
252b5132 3138 digit_chars['-'] = '-';
c0f3af97 3139 mnemonic_chars['_'] = '_';
791fe849 3140 mnemonic_chars['-'] = '-';
0003779b 3141 mnemonic_chars['.'] = '.';
252b5132
RH
3142 identifier_chars['_'] = '_';
3143 identifier_chars['.'] = '.';
3144
3145 for (p = operand_special_chars; *p != '\0'; p++)
3146 operand_chars[(unsigned char) *p] = *p;
3147 }
3148
a4447b93
RH
3149 if (flag_code == CODE_64BIT)
3150 {
ca19b261
KT
3151#if defined (OBJ_COFF) && defined (TE_PE)
3152 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3153 ? 32 : 16);
3154#else
a4447b93 3155 x86_dwarf2_return_column = 16;
ca19b261 3156#endif
61ff971f 3157 x86_cie_data_alignment = -8;
a4447b93
RH
3158 }
3159 else
3160 {
3161 x86_dwarf2_return_column = 8;
3162 x86_cie_data_alignment = -4;
3163 }
e379e5f3
L
3164
3165 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3166 can be turned into BRANCH_PREFIX frag. */
3167 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3168 abort ();
252b5132
RH
3169}
3170
3171void
e3bb37b5 3172i386_print_statistics (FILE *file)
252b5132 3173{
629310ab
ML
3174 htab_print_statistics (file, "i386 opcode", op_hash);
3175 htab_print_statistics (file, "i386 register", reg_hash);
252b5132
RH
3176}
3177\f
252b5132
RH
3178#ifdef DEBUG386
3179
ce8a8b2f 3180/* Debugging routines for md_assemble. */
d3ce72d0 3181static void pte (insn_template *);
40fb9820 3182static void pt (i386_operand_type);
e3bb37b5
L
3183static void pe (expressionS *);
3184static void ps (symbolS *);
252b5132
RH
3185
3186static void
2c703856 3187pi (const char *line, i386_insn *x)
252b5132 3188{
09137c09 3189 unsigned int j;
252b5132
RH
3190
3191 fprintf (stdout, "%s: template ", line);
3192 pte (&x->tm);
09f131f2
JH
3193 fprintf (stdout, " address: base %s index %s scale %x\n",
3194 x->base_reg ? x->base_reg->reg_name : "none",
3195 x->index_reg ? x->index_reg->reg_name : "none",
3196 x->log2_scale_factor);
3197 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3198 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3199 fprintf (stdout, " sib: base %x index %x scale %x\n",
3200 x->sib.base, x->sib.index, x->sib.scale);
3201 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3202 (x->rex & REX_W) != 0,
3203 (x->rex & REX_R) != 0,
3204 (x->rex & REX_X) != 0,
3205 (x->rex & REX_B) != 0);
09137c09 3206 for (j = 0; j < x->operands; j++)
252b5132 3207 {
09137c09
SP
3208 fprintf (stdout, " #%d: ", j + 1);
3209 pt (x->types[j]);
252b5132 3210 fprintf (stdout, "\n");
bab6aec1 3211 if (x->types[j].bitfield.class == Reg
3528c362
JB
3212 || x->types[j].bitfield.class == RegMMX
3213 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3214 || x->types[j].bitfield.class == RegMask
00cee14f 3215 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3216 || x->types[j].bitfield.class == RegCR
3217 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3218 || x->types[j].bitfield.class == RegTR
3219 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3220 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3221 if (operand_type_check (x->types[j], imm))
3222 pe (x->op[j].imms);
3223 if (operand_type_check (x->types[j], disp))
3224 pe (x->op[j].disps);
252b5132
RH
3225 }
3226}
3227
3228static void
d3ce72d0 3229pte (insn_template *t)
252b5132 3230{
09137c09 3231 unsigned int j;
252b5132 3232 fprintf (stdout, " %d operands ", t->operands);
47926f60 3233 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3234 if (t->extension_opcode != None)
3235 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3236 if (t->opcode_modifier.d)
252b5132 3237 fprintf (stdout, "D");
40fb9820 3238 if (t->opcode_modifier.w)
252b5132
RH
3239 fprintf (stdout, "W");
3240 fprintf (stdout, "\n");
09137c09 3241 for (j = 0; j < t->operands; j++)
252b5132 3242 {
09137c09
SP
3243 fprintf (stdout, " #%d type ", j + 1);
3244 pt (t->operand_types[j]);
252b5132
RH
3245 fprintf (stdout, "\n");
3246 }
3247}
3248
3249static void
e3bb37b5 3250pe (expressionS *e)
252b5132 3251{
24eab124 3252 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3253 fprintf (stdout, " add_number %ld (%lx)\n",
3254 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3255 if (e->X_add_symbol)
3256 {
3257 fprintf (stdout, " add_symbol ");
3258 ps (e->X_add_symbol);
3259 fprintf (stdout, "\n");
3260 }
3261 if (e->X_op_symbol)
3262 {
3263 fprintf (stdout, " op_symbol ");
3264 ps (e->X_op_symbol);
3265 fprintf (stdout, "\n");
3266 }
3267}
3268
3269static void
e3bb37b5 3270ps (symbolS *s)
252b5132
RH
3271{
3272 fprintf (stdout, "%s type %s%s",
3273 S_GET_NAME (s),
3274 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3275 segment_name (S_GET_SEGMENT (s)));
3276}
3277
7b81dfbb 3278static struct type_name
252b5132 3279 {
40fb9820
L
3280 i386_operand_type mask;
3281 const char *name;
252b5132 3282 }
7b81dfbb 3283const type_names[] =
252b5132 3284{
40fb9820
L
3285 { OPERAND_TYPE_REG8, "r8" },
3286 { OPERAND_TYPE_REG16, "r16" },
3287 { OPERAND_TYPE_REG32, "r32" },
3288 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3289 { OPERAND_TYPE_ACC8, "acc8" },
3290 { OPERAND_TYPE_ACC16, "acc16" },
3291 { OPERAND_TYPE_ACC32, "acc32" },
3292 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3293 { OPERAND_TYPE_IMM8, "i8" },
3294 { OPERAND_TYPE_IMM8, "i8s" },
3295 { OPERAND_TYPE_IMM16, "i16" },
3296 { OPERAND_TYPE_IMM32, "i32" },
3297 { OPERAND_TYPE_IMM32S, "i32s" },
3298 { OPERAND_TYPE_IMM64, "i64" },
3299 { OPERAND_TYPE_IMM1, "i1" },
3300 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3301 { OPERAND_TYPE_DISP8, "d8" },
3302 { OPERAND_TYPE_DISP16, "d16" },
3303 { OPERAND_TYPE_DISP32, "d32" },
3304 { OPERAND_TYPE_DISP32S, "d32s" },
3305 { OPERAND_TYPE_DISP64, "d64" },
3306 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3307 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3308 { OPERAND_TYPE_CONTROL, "control reg" },
3309 { OPERAND_TYPE_TEST, "test reg" },
3310 { OPERAND_TYPE_DEBUG, "debug reg" },
3311 { OPERAND_TYPE_FLOATREG, "FReg" },
3312 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3313 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3314 { OPERAND_TYPE_REGMMX, "rMMX" },
3315 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3316 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3317 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3318 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3319 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3320};
3321
3322static void
40fb9820 3323pt (i386_operand_type t)
252b5132 3324{
40fb9820 3325 unsigned int j;
c6fb90c8 3326 i386_operand_type a;
252b5132 3327
40fb9820 3328 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3329 {
3330 a = operand_type_and (t, type_names[j].mask);
2c703856 3331 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3332 fprintf (stdout, "%s, ", type_names[j].name);
3333 }
252b5132
RH
3334 fflush (stdout);
3335}
3336
3337#endif /* DEBUG386 */
3338\f
252b5132 3339static bfd_reloc_code_real_type
3956db08 3340reloc (unsigned int size,
64e74474
AM
3341 int pcrel,
3342 int sign,
3343 bfd_reloc_code_real_type other)
252b5132 3344{
47926f60 3345 if (other != NO_RELOC)
3956db08 3346 {
91d6fa6a 3347 reloc_howto_type *rel;
3956db08
JB
3348
3349 if (size == 8)
3350 switch (other)
3351 {
64e74474
AM
3352 case BFD_RELOC_X86_64_GOT32:
3353 return BFD_RELOC_X86_64_GOT64;
3354 break;
553d1284
L
3355 case BFD_RELOC_X86_64_GOTPLT64:
3356 return BFD_RELOC_X86_64_GOTPLT64;
3357 break;
64e74474
AM
3358 case BFD_RELOC_X86_64_PLTOFF64:
3359 return BFD_RELOC_X86_64_PLTOFF64;
3360 break;
3361 case BFD_RELOC_X86_64_GOTPC32:
3362 other = BFD_RELOC_X86_64_GOTPC64;
3363 break;
3364 case BFD_RELOC_X86_64_GOTPCREL:
3365 other = BFD_RELOC_X86_64_GOTPCREL64;
3366 break;
3367 case BFD_RELOC_X86_64_TPOFF32:
3368 other = BFD_RELOC_X86_64_TPOFF64;
3369 break;
3370 case BFD_RELOC_X86_64_DTPOFF32:
3371 other = BFD_RELOC_X86_64_DTPOFF64;
3372 break;
3373 default:
3374 break;
3956db08 3375 }
e05278af 3376
8ce3d284 3377#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3378 if (other == BFD_RELOC_SIZE32)
3379 {
3380 if (size == 8)
1ab668bf 3381 other = BFD_RELOC_SIZE64;
8fd4256d 3382 if (pcrel)
1ab668bf
AM
3383 {
3384 as_bad (_("there are no pc-relative size relocations"));
3385 return NO_RELOC;
3386 }
8fd4256d 3387 }
8ce3d284 3388#endif
8fd4256d 3389
e05278af 3390 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3391 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3392 sign = -1;
3393
91d6fa6a
NC
3394 rel = bfd_reloc_type_lookup (stdoutput, other);
3395 if (!rel)
3956db08 3396 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3397 else if (size != bfd_get_reloc_size (rel))
3956db08 3398 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3399 bfd_get_reloc_size (rel),
3956db08 3400 size);
91d6fa6a 3401 else if (pcrel && !rel->pc_relative)
3956db08 3402 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3403 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3404 && !sign)
91d6fa6a 3405 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3406 && sign > 0))
3956db08
JB
3407 as_bad (_("relocated field and relocation type differ in signedness"));
3408 else
3409 return other;
3410 return NO_RELOC;
3411 }
252b5132
RH
3412
3413 if (pcrel)
3414 {
3e73aa7c 3415 if (!sign)
3956db08 3416 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3417 switch (size)
3418 {
3419 case 1: return BFD_RELOC_8_PCREL;
3420 case 2: return BFD_RELOC_16_PCREL;
d258b828 3421 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3422 case 8: return BFD_RELOC_64_PCREL;
252b5132 3423 }
3956db08 3424 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3425 }
3426 else
3427 {
3956db08 3428 if (sign > 0)
e5cb08ac 3429 switch (size)
3e73aa7c
JH
3430 {
3431 case 4: return BFD_RELOC_X86_64_32S;
3432 }
3433 else
3434 switch (size)
3435 {
3436 case 1: return BFD_RELOC_8;
3437 case 2: return BFD_RELOC_16;
3438 case 4: return BFD_RELOC_32;
3439 case 8: return BFD_RELOC_64;
3440 }
3956db08
JB
3441 as_bad (_("cannot do %s %u byte relocation"),
3442 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3443 }
3444
0cc9e1d3 3445 return NO_RELOC;
252b5132
RH
3446}
3447
47926f60
KH
3448/* Here we decide which fixups can be adjusted to make them relative to
3449 the beginning of the section instead of the symbol. Basically we need
3450 to make sure that the dynamic relocations are done correctly, so in
3451 some cases we force the original symbol to be used. */
3452
252b5132 3453int
e3bb37b5 3454tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3455{
6d249963 3456#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3457 if (!IS_ELF)
31312f95
AM
3458 return 1;
3459
a161fe53
AM
3460 /* Don't adjust pc-relative references to merge sections in 64-bit
3461 mode. */
3462 if (use_rela_relocations
3463 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3464 && fixP->fx_pcrel)
252b5132 3465 return 0;
31312f95 3466
8d01d9a9
AJ
3467 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3468 and changed later by validate_fix. */
3469 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3470 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3471 return 0;
3472
8fd4256d
L
3473 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3474 for size relocations. */
3475 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3476 || fixP->fx_r_type == BFD_RELOC_SIZE64
3477 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3478 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3479 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3480 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3481 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3482 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3483 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3484 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3485 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3486 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3487 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3488 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3489 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3490 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3491 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3492 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3493 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3494 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3495 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3496 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3497 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3498 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3499 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3500 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3501 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3502 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3503 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3504 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3505 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3506 return 0;
31312f95 3507#endif
252b5132
RH
3508 return 1;
3509}
252b5132 3510
b4cac588 3511static int
e3bb37b5 3512intel_float_operand (const char *mnemonic)
252b5132 3513{
9306ca4a
JB
3514 /* Note that the value returned is meaningful only for opcodes with (memory)
3515 operands, hence the code here is free to improperly handle opcodes that
3516 have no operands (for better performance and smaller code). */
3517
3518 if (mnemonic[0] != 'f')
3519 return 0; /* non-math */
3520
3521 switch (mnemonic[1])
3522 {
3523 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3524 the fs segment override prefix not currently handled because no
3525 call path can make opcodes without operands get here */
3526 case 'i':
3527 return 2 /* integer op */;
3528 case 'l':
3529 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3530 return 3; /* fldcw/fldenv */
3531 break;
3532 case 'n':
3533 if (mnemonic[2] != 'o' /* fnop */)
3534 return 3; /* non-waiting control op */
3535 break;
3536 case 'r':
3537 if (mnemonic[2] == 's')
3538 return 3; /* frstor/frstpm */
3539 break;
3540 case 's':
3541 if (mnemonic[2] == 'a')
3542 return 3; /* fsave */
3543 if (mnemonic[2] == 't')
3544 {
3545 switch (mnemonic[3])
3546 {
3547 case 'c': /* fstcw */
3548 case 'd': /* fstdw */
3549 case 'e': /* fstenv */
3550 case 's': /* fsts[gw] */
3551 return 3;
3552 }
3553 }
3554 break;
3555 case 'x':
3556 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3557 return 0; /* fxsave/fxrstor are not really math ops */
3558 break;
3559 }
252b5132 3560
9306ca4a 3561 return 1;
252b5132
RH
3562}
3563
c0f3af97
L
3564/* Build the VEX prefix. */
3565
3566static void
d3ce72d0 3567build_vex_prefix (const insn_template *t)
c0f3af97
L
3568{
3569 unsigned int register_specifier;
3570 unsigned int implied_prefix;
3571 unsigned int vector_length;
03751133 3572 unsigned int w;
c0f3af97
L
3573
3574 /* Check register specifier. */
3575 if (i.vex.register_specifier)
43234a1e
L
3576 {
3577 register_specifier =
3578 ~register_number (i.vex.register_specifier) & 0xf;
3579 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3580 }
c0f3af97
L
3581 else
3582 register_specifier = 0xf;
3583
79f0fa25
L
3584 /* Use 2-byte VEX prefix by swapping destination and source operand
3585 if there are more than 1 register operand. */
3586 if (i.reg_operands > 1
3587 && i.vec_encoding != vex_encoding_vex3
86fa6981 3588 && i.dir_encoding == dir_encoding_default
fa99fab2 3589 && i.operands == i.reg_operands
dbbc8b7e 3590 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7b47a312 3591 && i.tm.opcode_modifier.opcodeprefix == VEX0F
dbbc8b7e 3592 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3593 && i.rex == REX_B)
3594 {
3595 unsigned int xchg = i.operands - 1;
3596 union i386_op temp_op;
3597 i386_operand_type temp_type;
3598
3599 temp_type = i.types[xchg];
3600 i.types[xchg] = i.types[0];
3601 i.types[0] = temp_type;
3602 temp_op = i.op[xchg];
3603 i.op[xchg] = i.op[0];
3604 i.op[0] = temp_op;
3605
9c2799c2 3606 gas_assert (i.rm.mode == 3);
fa99fab2
L
3607
3608 i.rex = REX_R;
3609 xchg = i.rm.regmem;
3610 i.rm.regmem = i.rm.reg;
3611 i.rm.reg = xchg;
3612
dbbc8b7e
JB
3613 if (i.tm.opcode_modifier.d)
3614 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3615 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3616 else /* Use the next insn. */
3617 i.tm = t[1];
fa99fab2
L
3618 }
3619
79dec6b7
JB
3620 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3621 are no memory operands and at least 3 register ones. */
3622 if (i.reg_operands >= 3
3623 && i.vec_encoding != vex_encoding_vex3
3624 && i.reg_operands == i.operands - i.imm_operands
3625 && i.tm.opcode_modifier.vex
3626 && i.tm.opcode_modifier.commutative
3627 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3628 && i.rex == REX_B
3629 && i.vex.register_specifier
3630 && !(i.vex.register_specifier->reg_flags & RegRex))
3631 {
3632 unsigned int xchg = i.operands - i.reg_operands;
3633 union i386_op temp_op;
3634 i386_operand_type temp_type;
3635
7b47a312 3636 gas_assert (i.tm.opcode_modifier.opcodeprefix == VEX0F);
79dec6b7
JB
3637 gas_assert (!i.tm.opcode_modifier.sae);
3638 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3639 &i.types[i.operands - 3]));
3640 gas_assert (i.rm.mode == 3);
3641
3642 temp_type = i.types[xchg];
3643 i.types[xchg] = i.types[xchg + 1];
3644 i.types[xchg + 1] = temp_type;
3645 temp_op = i.op[xchg];
3646 i.op[xchg] = i.op[xchg + 1];
3647 i.op[xchg + 1] = temp_op;
3648
3649 i.rex = 0;
3650 xchg = i.rm.regmem | 8;
3651 i.rm.regmem = ~register_specifier & 0xf;
3652 gas_assert (!(i.rm.regmem & 8));
3653 i.vex.register_specifier += xchg - i.rm.regmem;
3654 register_specifier = ~xchg & 0xf;
3655 }
3656
539f890d
L
3657 if (i.tm.opcode_modifier.vex == VEXScalar)
3658 vector_length = avxscalar;
10c17abd
JB
3659 else if (i.tm.opcode_modifier.vex == VEX256)
3660 vector_length = 1;
539f890d 3661 else
10c17abd 3662 {
56522fc5 3663 unsigned int op;
10c17abd 3664
c7213af9
L
3665 /* Determine vector length from the last multi-length vector
3666 operand. */
10c17abd 3667 vector_length = 0;
56522fc5 3668 for (op = t->operands; op--;)
10c17abd
JB
3669 if (t->operand_types[op].bitfield.xmmword
3670 && t->operand_types[op].bitfield.ymmword
3671 && i.types[op].bitfield.ymmword)
3672 {
3673 vector_length = 1;
3674 break;
3675 }
3676 }
c0f3af97 3677
8c190ce0 3678 switch ((i.tm.base_opcode >> (i.tm.opcode_length << 3)) & 0xff)
c0f3af97
L
3679 {
3680 case 0:
3681 implied_prefix = 0;
3682 break;
3683 case DATA_PREFIX_OPCODE:
3684 implied_prefix = 1;
3685 break;
3686 case REPE_PREFIX_OPCODE:
3687 implied_prefix = 2;
3688 break;
3689 case REPNE_PREFIX_OPCODE:
3690 implied_prefix = 3;
3691 break;
3692 default:
3693 abort ();
3694 }
3695
03751133
L
3696 /* Check the REX.W bit and VEXW. */
3697 if (i.tm.opcode_modifier.vexw == VEXWIG)
3698 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3699 else if (i.tm.opcode_modifier.vexw)
3700 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3701 else
931d03b7 3702 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3703
c0f3af97 3704 /* Use 2-byte VEX prefix if possible. */
03751133
L
3705 if (w == 0
3706 && i.vec_encoding != vex_encoding_vex3
7b47a312 3707 && i.tm.opcode_modifier.opcodeprefix == VEX0F
c0f3af97
L
3708 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3709 {
3710 /* 2-byte VEX prefix. */
3711 unsigned int r;
3712
3713 i.vex.length = 2;
3714 i.vex.bytes[0] = 0xc5;
3715
3716 /* Check the REX.R bit. */
3717 r = (i.rex & REX_R) ? 0 : 1;
3718 i.vex.bytes[1] = (r << 7
3719 | register_specifier << 3
3720 | vector_length << 2
3721 | implied_prefix);
3722 }
3723 else
3724 {
3725 /* 3-byte VEX prefix. */
03751133 3726 unsigned int m;
c0f3af97 3727
f88c9eb0 3728 i.vex.length = 3;
f88c9eb0 3729
7b47a312 3730 switch (i.tm.opcode_modifier.opcodeprefix)
5dd85c99 3731 {
7f399153
L
3732 case VEX0F:
3733 m = 0x1;
80de6e00 3734 i.vex.bytes[0] = 0xc4;
7f399153
L
3735 break;
3736 case VEX0F38:
3737 m = 0x2;
80de6e00 3738 i.vex.bytes[0] = 0xc4;
7f399153
L
3739 break;
3740 case VEX0F3A:
3741 m = 0x3;
80de6e00 3742 i.vex.bytes[0] = 0xc4;
7f399153
L
3743 break;
3744 case XOP08:
5dd85c99
SP
3745 m = 0x8;
3746 i.vex.bytes[0] = 0x8f;
7f399153
L
3747 break;
3748 case XOP09:
f88c9eb0
SP
3749 m = 0x9;
3750 i.vex.bytes[0] = 0x8f;
7f399153
L
3751 break;
3752 case XOP0A:
f88c9eb0
SP
3753 m = 0xa;
3754 i.vex.bytes[0] = 0x8f;
7f399153
L
3755 break;
3756 default:
3757 abort ();
f88c9eb0 3758 }
c0f3af97 3759
c0f3af97
L
3760 /* The high 3 bits of the second VEX byte are 1's compliment
3761 of RXB bits from REX. */
3762 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3763
c0f3af97
L
3764 i.vex.bytes[2] = (w << 7
3765 | register_specifier << 3
3766 | vector_length << 2
3767 | implied_prefix);
3768 }
3769}
3770
e771e7c9
JB
3771static INLINE bfd_boolean
3772is_evex_encoding (const insn_template *t)
3773{
7091c612 3774 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3775 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3776 || t->opcode_modifier.sae;
e771e7c9
JB
3777}
3778
7a8655d2
JB
3779static INLINE bfd_boolean
3780is_any_vex_encoding (const insn_template *t)
3781{
7b47a312 3782 return t->opcode_modifier.vex || is_evex_encoding (t);
7a8655d2
JB
3783}
3784
43234a1e
L
3785/* Build the EVEX prefix. */
3786
3787static void
3788build_evex_prefix (void)
3789{
3790 unsigned int register_specifier;
3791 unsigned int implied_prefix;
3792 unsigned int m, w;
3793 rex_byte vrex_used = 0;
3794
3795 /* Check register specifier. */
3796 if (i.vex.register_specifier)
3797 {
3798 gas_assert ((i.vrex & REX_X) == 0);
3799
3800 register_specifier = i.vex.register_specifier->reg_num;
3801 if ((i.vex.register_specifier->reg_flags & RegRex))
3802 register_specifier += 8;
3803 /* The upper 16 registers are encoded in the fourth byte of the
3804 EVEX prefix. */
3805 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3806 i.vex.bytes[3] = 0x8;
3807 register_specifier = ~register_specifier & 0xf;
3808 }
3809 else
3810 {
3811 register_specifier = 0xf;
3812
3813 /* Encode upper 16 vector index register in the fourth byte of
3814 the EVEX prefix. */
3815 if (!(i.vrex & REX_X))
3816 i.vex.bytes[3] = 0x8;
3817 else
3818 vrex_used |= REX_X;
3819 }
3820
3821 switch ((i.tm.base_opcode >> 8) & 0xff)
3822 {
3823 case 0:
3824 implied_prefix = 0;
3825 break;
3826 case DATA_PREFIX_OPCODE:
3827 implied_prefix = 1;
3828 break;
3829 case REPE_PREFIX_OPCODE:
3830 implied_prefix = 2;
3831 break;
3832 case REPNE_PREFIX_OPCODE:
3833 implied_prefix = 3;
3834 break;
3835 default:
3836 abort ();
3837 }
3838
3839 /* 4 byte EVEX prefix. */
3840 i.vex.length = 4;
3841 i.vex.bytes[0] = 0x62;
3842
3843 /* mmmm bits. */
7b47a312 3844 switch (i.tm.opcode_modifier.opcodeprefix)
43234a1e
L
3845 {
3846 case VEX0F:
3847 m = 1;
3848 break;
3849 case VEX0F38:
3850 m = 2;
3851 break;
3852 case VEX0F3A:
3853 m = 3;
3854 break;
3855 default:
3856 abort ();
3857 break;
3858 }
3859
3860 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3861 bits from REX. */
3862 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3863
3864 /* The fifth bit of the second EVEX byte is 1's compliment of the
3865 REX_R bit in VREX. */
3866 if (!(i.vrex & REX_R))
3867 i.vex.bytes[1] |= 0x10;
3868 else
3869 vrex_used |= REX_R;
3870
3871 if ((i.reg_operands + i.imm_operands) == i.operands)
3872 {
3873 /* When all operands are registers, the REX_X bit in REX is not
3874 used. We reuse it to encode the upper 16 registers, which is
3875 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3876 as 1's compliment. */
3877 if ((i.vrex & REX_B))
3878 {
3879 vrex_used |= REX_B;
3880 i.vex.bytes[1] &= ~0x40;
3881 }
3882 }
3883
3884 /* EVEX instructions shouldn't need the REX prefix. */
3885 i.vrex &= ~vrex_used;
3886 gas_assert (i.vrex == 0);
3887
6865c043
L
3888 /* Check the REX.W bit and VEXW. */
3889 if (i.tm.opcode_modifier.vexw == VEXWIG)
3890 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3891 else if (i.tm.opcode_modifier.vexw)
3892 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3893 else
931d03b7 3894 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3895
3896 /* Encode the U bit. */
3897 implied_prefix |= 0x4;
3898
3899 /* The third byte of the EVEX prefix. */
3900 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3901
3902 /* The fourth byte of the EVEX prefix. */
3903 /* The zeroing-masking bit. */
3904 if (i.mask && i.mask->zeroing)
3905 i.vex.bytes[3] |= 0x80;
3906
3907 /* Don't always set the broadcast bit if there is no RC. */
3908 if (!i.rounding)
3909 {
3910 /* Encode the vector length. */
3911 unsigned int vec_length;
3912
e771e7c9
JB
3913 if (!i.tm.opcode_modifier.evex
3914 || i.tm.opcode_modifier.evex == EVEXDYN)
3915 {
56522fc5 3916 unsigned int op;
e771e7c9 3917
c7213af9
L
3918 /* Determine vector length from the last multi-length vector
3919 operand. */
56522fc5 3920 for (op = i.operands; op--;)
e771e7c9
JB
3921 if (i.tm.operand_types[op].bitfield.xmmword
3922 + i.tm.operand_types[op].bitfield.ymmword
3923 + i.tm.operand_types[op].bitfield.zmmword > 1)
3924 {
3925 if (i.types[op].bitfield.zmmword)
c7213af9
L
3926 {
3927 i.tm.opcode_modifier.evex = EVEX512;
3928 break;
3929 }
e771e7c9 3930 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3931 {
3932 i.tm.opcode_modifier.evex = EVEX256;
3933 break;
3934 }
e771e7c9 3935 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3936 {
3937 i.tm.opcode_modifier.evex = EVEX128;
3938 break;
3939 }
625cbd7a
JB
3940 else if (i.broadcast && (int) op == i.broadcast->operand)
3941 {
4a1b91ea 3942 switch (i.broadcast->bytes)
625cbd7a
JB
3943 {
3944 case 64:
3945 i.tm.opcode_modifier.evex = EVEX512;
3946 break;
3947 case 32:
3948 i.tm.opcode_modifier.evex = EVEX256;
3949 break;
3950 case 16:
3951 i.tm.opcode_modifier.evex = EVEX128;
3952 break;
3953 default:
c7213af9 3954 abort ();
625cbd7a 3955 }
c7213af9 3956 break;
625cbd7a 3957 }
e771e7c9 3958 }
c7213af9 3959
56522fc5 3960 if (op >= MAX_OPERANDS)
c7213af9 3961 abort ();
e771e7c9
JB
3962 }
3963
43234a1e
L
3964 switch (i.tm.opcode_modifier.evex)
3965 {
3966 case EVEXLIG: /* LL' is ignored */
3967 vec_length = evexlig << 5;
3968 break;
3969 case EVEX128:
3970 vec_length = 0 << 5;
3971 break;
3972 case EVEX256:
3973 vec_length = 1 << 5;
3974 break;
3975 case EVEX512:
3976 vec_length = 2 << 5;
3977 break;
3978 default:
3979 abort ();
3980 break;
3981 }
3982 i.vex.bytes[3] |= vec_length;
3983 /* Encode the broadcast bit. */
3984 if (i.broadcast)
3985 i.vex.bytes[3] |= 0x10;
3986 }
3987 else
3988 {
3989 if (i.rounding->type != saeonly)
3990 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3991 else
d3d3c6db 3992 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3993 }
3994
3995 if (i.mask && i.mask->mask)
3996 i.vex.bytes[3] |= i.mask->mask->reg_num;
3997}
3998
65da13b5
L
3999static void
4000process_immext (void)
4001{
4002 expressionS *exp;
4003
c0f3af97 4004 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
4005 which is coded in the same place as an 8-bit immediate field
4006 would be. Here we fake an 8-bit immediate operand from the
4007 opcode suffix stored in tm.extension_opcode.
4008
c1e679ec 4009 AVX instructions also use this encoding, for some of
c0f3af97 4010 3 argument instructions. */
65da13b5 4011
43234a1e 4012 gas_assert (i.imm_operands <= 1
7ab9ffdd 4013 && (i.operands <= 2
7a8655d2 4014 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4015 && i.operands <= 4)));
65da13b5
L
4016
4017 exp = &im_expressions[i.imm_operands++];
4018 i.op[i.operands].imms = exp;
4019 i.types[i.operands] = imm8;
4020 i.operands++;
4021 exp->X_op = O_constant;
4022 exp->X_add_number = i.tm.extension_opcode;
4023 i.tm.extension_opcode = None;
4024}
4025
42164a71
L
4026
4027static int
4028check_hle (void)
4029{
4030 switch (i.tm.opcode_modifier.hleprefixok)
4031 {
4032 default:
4033 abort ();
82c2def5 4034 case HLEPrefixNone:
165de32a
L
4035 as_bad (_("invalid instruction `%s' after `%s'"),
4036 i.tm.name, i.hle_prefix);
42164a71 4037 return 0;
82c2def5 4038 case HLEPrefixLock:
42164a71
L
4039 if (i.prefix[LOCK_PREFIX])
4040 return 1;
165de32a 4041 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4042 return 0;
82c2def5 4043 case HLEPrefixAny:
42164a71 4044 return 1;
82c2def5 4045 case HLEPrefixRelease:
42164a71
L
4046 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4047 {
4048 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4049 i.tm.name);
4050 return 0;
4051 }
8dc0818e 4052 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4053 {
4054 as_bad (_("memory destination needed for instruction `%s'"
4055 " after `xrelease'"), i.tm.name);
4056 return 0;
4057 }
4058 return 1;
4059 }
4060}
4061
b6f8c7c4
L
4062/* Try the shortest encoding by shortening operand size. */
4063
4064static void
4065optimize_encoding (void)
4066{
a0a1771e 4067 unsigned int j;
b6f8c7c4
L
4068
4069 if (optimize_for_space
72aea328 4070 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
4071 && i.reg_operands == 1
4072 && i.imm_operands == 1
4073 && !i.types[1].bitfield.byte
4074 && i.op[0].imms->X_op == O_constant
4075 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4076 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4077 || (i.tm.base_opcode == 0xf6
4078 && i.tm.extension_opcode == 0x0)))
4079 {
4080 /* Optimize: -Os:
4081 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4082 */
4083 unsigned int base_regnum = i.op[1].regs->reg_num;
4084 if (flag_code == CODE_64BIT || base_regnum < 4)
4085 {
4086 i.types[1].bitfield.byte = 1;
4087 /* Ignore the suffix. */
4088 i.suffix = 0;
7697afb6
JB
4089 /* Convert to byte registers. */
4090 if (i.types[1].bitfield.word)
4091 j = 16;
4092 else if (i.types[1].bitfield.dword)
4093 j = 32;
4094 else
4095 j = 48;
4096 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4097 j += 8;
4098 i.op[1].regs -= j;
b6f8c7c4
L
4099 }
4100 }
4101 else if (flag_code == CODE_64BIT
72aea328 4102 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4103 && ((i.types[1].bitfield.qword
4104 && i.reg_operands == 1
b6f8c7c4
L
4105 && i.imm_operands == 1
4106 && i.op[0].imms->X_op == O_constant
507916b8 4107 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4108 && i.tm.extension_opcode == None
4109 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4110 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4111 && ((i.tm.base_opcode == 0x24
4112 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4113 || (i.tm.base_opcode == 0x80
4114 && i.tm.extension_opcode == 0x4)
4115 || ((i.tm.base_opcode == 0xf6
507916b8 4116 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4117 && i.tm.extension_opcode == 0x0)))
4118 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4119 && i.tm.base_opcode == 0x83
4120 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4121 || (i.types[0].bitfield.qword
4122 && ((i.reg_operands == 2
4123 && i.op[0].regs == i.op[1].regs
72aea328
JB
4124 && (i.tm.base_opcode == 0x30
4125 || i.tm.base_opcode == 0x28))
d3d50934
L
4126 || (i.reg_operands == 1
4127 && i.operands == 1
72aea328 4128 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4129 {
4130 /* Optimize: -O:
4131 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4132 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4133 testq $imm31, %r64 -> testl $imm31, %r32
4134 xorq %r64, %r64 -> xorl %r32, %r32
4135 subq %r64, %r64 -> subl %r32, %r32
4136 movq $imm31, %r64 -> movl $imm31, %r32
4137 movq $imm32, %r64 -> movl $imm32, %r32
4138 */
4139 i.tm.opcode_modifier.norex64 = 1;
507916b8 4140 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4141 {
4142 /* Handle
4143 movq $imm31, %r64 -> movl $imm31, %r32
4144 movq $imm32, %r64 -> movl $imm32, %r32
4145 */
4146 i.tm.operand_types[0].bitfield.imm32 = 1;
4147 i.tm.operand_types[0].bitfield.imm32s = 0;
4148 i.tm.operand_types[0].bitfield.imm64 = 0;
4149 i.types[0].bitfield.imm32 = 1;
4150 i.types[0].bitfield.imm32s = 0;
4151 i.types[0].bitfield.imm64 = 0;
4152 i.types[1].bitfield.dword = 1;
4153 i.types[1].bitfield.qword = 0;
507916b8 4154 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4155 {
4156 /* Handle
4157 movq $imm31, %r64 -> movl $imm31, %r32
4158 */
507916b8 4159 i.tm.base_opcode = 0xb8;
b6f8c7c4 4160 i.tm.extension_opcode = None;
507916b8 4161 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4162 i.tm.opcode_modifier.modrm = 0;
4163 }
4164 }
4165 }
5641ec01
JB
4166 else if (optimize > 1
4167 && !optimize_for_space
72aea328 4168 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4169 && i.reg_operands == 2
4170 && i.op[0].regs == i.op[1].regs
4171 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4172 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4173 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4174 {
4175 /* Optimize: -O2:
4176 andb %rN, %rN -> testb %rN, %rN
4177 andw %rN, %rN -> testw %rN, %rN
4178 andq %rN, %rN -> testq %rN, %rN
4179 orb %rN, %rN -> testb %rN, %rN
4180 orw %rN, %rN -> testw %rN, %rN
4181 orq %rN, %rN -> testq %rN, %rN
4182
4183 and outside of 64-bit mode
4184
4185 andl %rN, %rN -> testl %rN, %rN
4186 orl %rN, %rN -> testl %rN, %rN
4187 */
4188 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4189 }
99112332 4190 else if (i.reg_operands == 3
b6f8c7c4
L
4191 && i.op[0].regs == i.op[1].regs
4192 && !i.types[2].bitfield.xmmword
4193 && (i.tm.opcode_modifier.vex
7a69eac3 4194 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4195 && !i.rounding
e771e7c9 4196 && is_evex_encoding (&i.tm)
80c34c38 4197 && (i.vec_encoding != vex_encoding_evex
dd22218c 4198 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4199 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4200 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4201 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4202 && ((i.tm.base_opcode == 0x55
4203 || i.tm.base_opcode == 0x6655
4204 || i.tm.base_opcode == 0x66df
4205 || i.tm.base_opcode == 0x57
4206 || i.tm.base_opcode == 0x6657
8305403a
L
4207 || i.tm.base_opcode == 0x66ef
4208 || i.tm.base_opcode == 0x66f8
4209 || i.tm.base_opcode == 0x66f9
4210 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4211 || i.tm.base_opcode == 0x66fb
4212 || i.tm.base_opcode == 0x42
4213 || i.tm.base_opcode == 0x6642
4214 || i.tm.base_opcode == 0x47
4215 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4216 && i.tm.extension_opcode == None))
4217 {
99112332 4218 /* Optimize: -O1:
8305403a
L
4219 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4220 vpsubq and vpsubw:
b6f8c7c4
L
4221 EVEX VOP %zmmM, %zmmM, %zmmN
4222 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4223 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4224 EVEX VOP %ymmM, %ymmM, %ymmN
4225 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4226 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4227 VEX VOP %ymmM, %ymmM, %ymmN
4228 -> VEX VOP %xmmM, %xmmM, %xmmN
4229 VOP, one of vpandn and vpxor:
4230 VEX VOP %ymmM, %ymmM, %ymmN
4231 -> VEX VOP %xmmM, %xmmM, %xmmN
4232 VOP, one of vpandnd and vpandnq:
4233 EVEX VOP %zmmM, %zmmM, %zmmN
4234 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4235 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4236 EVEX VOP %ymmM, %ymmM, %ymmN
4237 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4238 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4239 VOP, one of vpxord and vpxorq:
4240 EVEX VOP %zmmM, %zmmM, %zmmN
4241 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4242 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4243 EVEX VOP %ymmM, %ymmM, %ymmN
4244 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4245 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4246 VOP, one of kxord and kxorq:
4247 VEX VOP %kM, %kM, %kN
4248 -> VEX kxorw %kM, %kM, %kN
4249 VOP, one of kandnd and kandnq:
4250 VEX VOP %kM, %kM, %kN
4251 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4252 */
e771e7c9 4253 if (is_evex_encoding (&i.tm))
b6f8c7c4 4254 {
7b1d7ca1 4255 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4256 {
4257 i.tm.opcode_modifier.vex = VEX128;
4258 i.tm.opcode_modifier.vexw = VEXW0;
4259 i.tm.opcode_modifier.evex = 0;
4260 }
7b1d7ca1 4261 else if (optimize > 1)
dd22218c
L
4262 i.tm.opcode_modifier.evex = EVEX128;
4263 else
4264 return;
b6f8c7c4 4265 }
f74a6307 4266 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4267 {
4268 i.tm.base_opcode &= 0xff;
4269 i.tm.opcode_modifier.vexw = VEXW0;
4270 }
b6f8c7c4
L
4271 else
4272 i.tm.opcode_modifier.vex = VEX128;
4273
4274 if (i.tm.opcode_modifier.vex)
4275 for (j = 0; j < 3; j++)
4276 {
4277 i.types[j].bitfield.xmmword = 1;
4278 i.types[j].bitfield.ymmword = 0;
4279 }
4280 }
392a5972 4281 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4282 && !i.types[0].bitfield.zmmword
392a5972 4283 && !i.types[1].bitfield.zmmword
97ed31ae 4284 && !i.mask
a0a1771e 4285 && !i.broadcast
97ed31ae 4286 && is_evex_encoding (&i.tm)
392a5972
L
4287 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4288 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4289 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4290 || (i.tm.base_opcode & ~4) == 0x66db
4291 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4292 && i.tm.extension_opcode == None)
4293 {
4294 /* Optimize: -O1:
4295 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4296 vmovdqu32 and vmovdqu64:
4297 EVEX VOP %xmmM, %xmmN
4298 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4299 EVEX VOP %ymmM, %ymmN
4300 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4301 EVEX VOP %xmmM, mem
4302 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4303 EVEX VOP %ymmM, mem
4304 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4305 EVEX VOP mem, %xmmN
4306 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4307 EVEX VOP mem, %ymmN
4308 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4309 VOP, one of vpand, vpandn, vpor, vpxor:
4310 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4311 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4312 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4313 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4314 EVEX VOP{d,q} mem, %xmmM, %xmmN
4315 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4316 EVEX VOP{d,q} mem, %ymmM, %ymmN
4317 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4318 */
a0a1771e 4319 for (j = 0; j < i.operands; j++)
392a5972
L
4320 if (operand_type_check (i.types[j], disp)
4321 && i.op[j].disps->X_op == O_constant)
4322 {
4323 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4324 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4325 bytes, we choose EVEX Disp8 over VEX Disp32. */
4326 int evex_disp8, vex_disp8;
4327 unsigned int memshift = i.memshift;
4328 offsetT n = i.op[j].disps->X_add_number;
4329
4330 evex_disp8 = fits_in_disp8 (n);
4331 i.memshift = 0;
4332 vex_disp8 = fits_in_disp8 (n);
4333 if (evex_disp8 != vex_disp8)
4334 {
4335 i.memshift = memshift;
4336 return;
4337 }
4338
4339 i.types[j].bitfield.disp8 = vex_disp8;
4340 break;
4341 }
4342 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4343 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4344 i.tm.opcode_modifier.vex
4345 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4346 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4347 /* VPAND, VPOR, and VPXOR are commutative. */
4348 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4349 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4350 i.tm.opcode_modifier.evex = 0;
4351 i.tm.opcode_modifier.masking = 0;
a0a1771e 4352 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4353 i.tm.opcode_modifier.disp8memshift = 0;
4354 i.memshift = 0;
a0a1771e
JB
4355 if (j < i.operands)
4356 i.types[j].bitfield.disp8
4357 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4358 }
b6f8c7c4
L
4359}
4360
ae531041
L
4361/* Return non-zero for load instruction. */
4362
4363static int
4364load_insn_p (void)
4365{
4366 unsigned int dest;
4367 int any_vex_p = is_any_vex_encoding (&i.tm);
4368 unsigned int base_opcode = i.tm.base_opcode | 1;
4369
4370 if (!any_vex_p)
4371 {
a09f656b 4372 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4373 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4374 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4375 if (i.tm.opcode_modifier.anysize)
ae531041
L
4376 return 0;
4377
a09f656b 4378 /* pop, popf, popa. */
4379 if (strcmp (i.tm.name, "pop") == 0
4380 || i.tm.base_opcode == 0x9d
4381 || i.tm.base_opcode == 0x61)
ae531041
L
4382 return 1;
4383
4384 /* movs, cmps, lods, scas. */
4385 if ((i.tm.base_opcode | 0xb) == 0xaf)
4386 return 1;
4387
a09f656b 4388 /* outs, xlatb. */
4389 if (base_opcode == 0x6f
4390 || i.tm.base_opcode == 0xd7)
ae531041 4391 return 1;
a09f656b 4392 /* NB: For AMD-specific insns with implicit memory operands,
4393 they're intentionally not covered. */
ae531041
L
4394 }
4395
4396 /* No memory operand. */
4397 if (!i.mem_operands)
4398 return 0;
4399
4400 if (any_vex_p)
4401 {
4402 /* vldmxcsr. */
4403 if (i.tm.base_opcode == 0xae
4404 && i.tm.opcode_modifier.vex
7b47a312 4405 && i.tm.opcode_modifier.opcodeprefix == VEX0F
ae531041
L
4406 && i.tm.extension_opcode == 2)
4407 return 1;
4408 }
4409 else
4410 {
4411 /* test, not, neg, mul, imul, div, idiv. */
4412 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4413 && i.tm.extension_opcode != 1)
4414 return 1;
4415
4416 /* inc, dec. */
4417 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4418 return 1;
4419
4420 /* add, or, adc, sbb, and, sub, xor, cmp. */
4421 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4422 return 1;
4423
4424 /* bt, bts, btr, btc. */
4425 if (i.tm.base_opcode == 0xfba
4426 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4427 return 1;
4428
4429 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4430 if ((base_opcode == 0xc1
4431 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4432 && i.tm.extension_opcode != 6)
4433 return 1;
4434
4435 /* cmpxchg8b, cmpxchg16b, xrstors. */
4436 if (i.tm.base_opcode == 0xfc7
4437 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3))
4438 return 1;
4439
4440 /* fxrstor, ldmxcsr, xrstor. */
4441 if (i.tm.base_opcode == 0xfae
4442 && (i.tm.extension_opcode == 1
4443 || i.tm.extension_opcode == 2
4444 || i.tm.extension_opcode == 5))
4445 return 1;
4446
4447 /* lgdt, lidt, lmsw. */
4448 if (i.tm.base_opcode == 0xf01
4449 && (i.tm.extension_opcode == 2
4450 || i.tm.extension_opcode == 3
4451 || i.tm.extension_opcode == 6))
4452 return 1;
4453
4454 /* vmptrld */
4455 if (i.tm.base_opcode == 0xfc7
4456 && i.tm.extension_opcode == 6)
4457 return 1;
4458
4459 /* Check for x87 instructions. */
4460 if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf)
4461 {
4462 /* Skip fst, fstp, fstenv, fstcw. */
4463 if (i.tm.base_opcode == 0xd9
4464 && (i.tm.extension_opcode == 2
4465 || i.tm.extension_opcode == 3
4466 || i.tm.extension_opcode == 6
4467 || i.tm.extension_opcode == 7))
4468 return 0;
4469
4470 /* Skip fisttp, fist, fistp, fstp. */
4471 if (i.tm.base_opcode == 0xdb
4472 && (i.tm.extension_opcode == 1
4473 || i.tm.extension_opcode == 2
4474 || i.tm.extension_opcode == 3
4475 || i.tm.extension_opcode == 7))
4476 return 0;
4477
4478 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4479 if (i.tm.base_opcode == 0xdd
4480 && (i.tm.extension_opcode == 1
4481 || i.tm.extension_opcode == 2
4482 || i.tm.extension_opcode == 3
4483 || i.tm.extension_opcode == 6
4484 || i.tm.extension_opcode == 7))
4485 return 0;
4486
4487 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4488 if (i.tm.base_opcode == 0xdf
4489 && (i.tm.extension_opcode == 1
4490 || i.tm.extension_opcode == 2
4491 || i.tm.extension_opcode == 3
4492 || i.tm.extension_opcode == 6
4493 || i.tm.extension_opcode == 7))
4494 return 0;
4495
4496 return 1;
4497 }
4498 }
4499
4500 dest = i.operands - 1;
4501
4502 /* Check fake imm8 operand and 3 source operands. */
4503 if ((i.tm.opcode_modifier.immext
4504 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4505 && i.types[dest].bitfield.imm8)
4506 dest--;
4507
4508 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */
4509 if (!any_vex_p
4510 && (base_opcode == 0x1
4511 || base_opcode == 0x9
4512 || base_opcode == 0x11
4513 || base_opcode == 0x19
4514 || base_opcode == 0x21
4515 || base_opcode == 0x29
4516 || base_opcode == 0x31
4517 || base_opcode == 0x39
4518 || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87)
4519 || base_opcode == 0xfc1))
4520 return 1;
4521
4522 /* Check for load instruction. */
4523 return (i.types[dest].bitfield.class != ClassNone
4524 || i.types[dest].bitfield.instance == Accum);
4525}
4526
4527/* Output lfence, 0xfaee8, after instruction. */
4528
4529static void
4530insert_lfence_after (void)
4531{
4532 if (lfence_after_load && load_insn_p ())
4533 {
a09f656b 4534 /* There are also two REP string instructions that require
4535 special treatment. Specifically, the compare string (CMPS)
4536 and scan string (SCAS) instructions set EFLAGS in a manner
4537 that depends on the data being compared/scanned. When used
4538 with a REP prefix, the number of iterations may therefore
4539 vary depending on this data. If the data is a program secret
4540 chosen by the adversary using an LVI method,
4541 then this data-dependent behavior may leak some aspect
4542 of the secret. */
4543 if (((i.tm.base_opcode | 0x1) == 0xa7
4544 || (i.tm.base_opcode | 0x1) == 0xaf)
4545 && i.prefix[REP_PREFIX])
4546 {
4547 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4548 i.tm.name);
4549 }
ae531041
L
4550 char *p = frag_more (3);
4551 *p++ = 0xf;
4552 *p++ = 0xae;
4553 *p = 0xe8;
4554 }
4555}
4556
4557/* Output lfence, 0xfaee8, before instruction. */
4558
4559static void
4560insert_lfence_before (void)
4561{
4562 char *p;
4563
4564 if (is_any_vex_encoding (&i.tm))
4565 return;
4566
4567 if (i.tm.base_opcode == 0xff
4568 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4569 {
4570 /* Insert lfence before indirect branch if needed. */
4571
4572 if (lfence_before_indirect_branch == lfence_branch_none)
4573 return;
4574
4575 if (i.operands != 1)
4576 abort ();
4577
4578 if (i.reg_operands == 1)
4579 {
4580 /* Indirect branch via register. Don't insert lfence with
4581 -mlfence-after-load=yes. */
4582 if (lfence_after_load
4583 || lfence_before_indirect_branch == lfence_branch_memory)
4584 return;
4585 }
4586 else if (i.mem_operands == 1
4587 && lfence_before_indirect_branch != lfence_branch_register)
4588 {
4589 as_warn (_("indirect `%s` with memory operand should be avoided"),
4590 i.tm.name);
4591 return;
4592 }
4593 else
4594 return;
4595
4596 if (last_insn.kind != last_insn_other
4597 && last_insn.seg == now_seg)
4598 {
4599 as_warn_where (last_insn.file, last_insn.line,
4600 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4601 last_insn.name, i.tm.name);
4602 return;
4603 }
4604
4605 p = frag_more (3);
4606 *p++ = 0xf;
4607 *p++ = 0xae;
4608 *p = 0xe8;
4609 return;
4610 }
4611
503648e4 4612 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4613 if (lfence_before_ret != lfence_before_ret_none
4614 && (i.tm.base_opcode == 0xc2
503648e4 4615 || i.tm.base_opcode == 0xc3))
ae531041
L
4616 {
4617 if (last_insn.kind != last_insn_other
4618 && last_insn.seg == now_seg)
4619 {
4620 as_warn_where (last_insn.file, last_insn.line,
4621 _("`%s` skips -mlfence-before-ret on `%s`"),
4622 last_insn.name, i.tm.name);
4623 return;
4624 }
a09f656b 4625
a09f656b 4626 /* Near ret ingore operand size override under CPU64. */
503648e4 4627 char prefix = flag_code == CODE_64BIT
4628 ? 0x48
4629 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4630
4631 if (lfence_before_ret == lfence_before_ret_not)
4632 {
4633 /* not: 0xf71424, may add prefix
4634 for operand size override or 64-bit code. */
4635 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4636 if (prefix)
4637 *p++ = prefix;
ae531041
L
4638 *p++ = 0xf7;
4639 *p++ = 0x14;
4640 *p++ = 0x24;
a09f656b 4641 if (prefix)
4642 *p++ = prefix;
ae531041
L
4643 *p++ = 0xf7;
4644 *p++ = 0x14;
4645 *p++ = 0x24;
4646 }
a09f656b 4647 else
4648 {
4649 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4650 if (prefix)
4651 *p++ = prefix;
4652 if (lfence_before_ret == lfence_before_ret_or)
4653 {
4654 /* or: 0x830c2400, may add prefix
4655 for operand size override or 64-bit code. */
4656 *p++ = 0x83;
4657 *p++ = 0x0c;
4658 }
4659 else
4660 {
4661 /* shl: 0xc1242400, may add prefix
4662 for operand size override or 64-bit code. */
4663 *p++ = 0xc1;
4664 *p++ = 0x24;
4665 }
4666
4667 *p++ = 0x24;
4668 *p++ = 0x0;
4669 }
4670
ae531041
L
4671 *p++ = 0xf;
4672 *p++ = 0xae;
4673 *p = 0xe8;
4674 }
4675}
4676
252b5132
RH
4677/* This is the guts of the machine-dependent assembler. LINE points to a
4678 machine dependent instruction. This function is supposed to emit
4679 the frags/bytes it assembles to. */
4680
4681void
65da13b5 4682md_assemble (char *line)
252b5132 4683{
40fb9820 4684 unsigned int j;
83b16ac6 4685 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4686 const insn_template *t;
252b5132 4687
47926f60 4688 /* Initialize globals. */
252b5132
RH
4689 memset (&i, '\0', sizeof (i));
4690 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4691 i.reloc[j] = NO_RELOC;
252b5132
RH
4692 memset (disp_expressions, '\0', sizeof (disp_expressions));
4693 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4694 save_stack_p = save_stack;
252b5132
RH
4695
4696 /* First parse an instruction mnemonic & call i386_operand for the operands.
4697 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4698 start of a (possibly prefixed) mnemonic. */
252b5132 4699
29b0f896
AM
4700 line = parse_insn (line, mnemonic);
4701 if (line == NULL)
4702 return;
83b16ac6 4703 mnem_suffix = i.suffix;
252b5132 4704
29b0f896 4705 line = parse_operands (line, mnemonic);
ee86248c 4706 this_operand = -1;
8325cc63
JB
4707 xfree (i.memop1_string);
4708 i.memop1_string = NULL;
29b0f896
AM
4709 if (line == NULL)
4710 return;
252b5132 4711
29b0f896
AM
4712 /* Now we've parsed the mnemonic into a set of templates, and have the
4713 operands at hand. */
4714
b630c145
JB
4715 /* All Intel opcodes have reversed operands except for "bound", "enter",
4716 "monitor*", "mwait*", "tpause", and "umwait". We also don't reverse
4717 intersegment "jmp" and "call" instructions with 2 immediate operands so
4718 that the immediate segment precedes the offset, as it does when in AT&T
4719 mode. */
4d456e3d
L
4720 if (intel_syntax
4721 && i.operands > 1
29b0f896 4722 && (strcmp (mnemonic, "bound") != 0)
30123838 4723 && (strcmp (mnemonic, "invlpga") != 0)
eedb0f2c
JB
4724 && (strncmp (mnemonic, "monitor", 7) != 0)
4725 && (strncmp (mnemonic, "mwait", 5) != 0)
b630c145
JB
4726 && (strcmp (mnemonic, "tpause") != 0)
4727 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4728 && !(operand_type_check (i.types[0], imm)
4729 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4730 swap_operands ();
4731
ec56d5c0
JB
4732 /* The order of the immediates should be reversed
4733 for 2 immediates extrq and insertq instructions */
4734 if (i.imm_operands == 2
4735 && (strcmp (mnemonic, "extrq") == 0
4736 || strcmp (mnemonic, "insertq") == 0))
4737 swap_2_operands (0, 1);
4738
29b0f896
AM
4739 if (i.imm_operands)
4740 optimize_imm ();
4741
b300c311
L
4742 /* Don't optimize displacement for movabs since it only takes 64bit
4743 displacement. */
4744 if (i.disp_operands
a501d77e 4745 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4746 && (flag_code != CODE_64BIT
4747 || strcmp (mnemonic, "movabs") != 0))
4748 optimize_disp ();
29b0f896
AM
4749
4750 /* Next, we find a template that matches the given insn,
4751 making sure the overlap of the given operands types is consistent
4752 with the template operand types. */
252b5132 4753
83b16ac6 4754 if (!(t = match_template (mnem_suffix)))
29b0f896 4755 return;
252b5132 4756
7bab8ab5 4757 if (sse_check != check_none
81f8a913 4758 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4759 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4760 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4761 && (i.tm.cpu_flags.bitfield.cpusse
4762 || i.tm.cpu_flags.bitfield.cpusse2
4763 || i.tm.cpu_flags.bitfield.cpusse3
4764 || i.tm.cpu_flags.bitfield.cpussse3
4765 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4766 || i.tm.cpu_flags.bitfield.cpusse4_2
4767 || i.tm.cpu_flags.bitfield.cpupclmul
4768 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4769 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4770 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4771 {
7bab8ab5 4772 (sse_check == check_warning
daf50ae7
L
4773 ? as_warn
4774 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4775 }
4776
40fb9820 4777 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4778 if (!add_prefix (FWAIT_OPCODE))
4779 return;
252b5132 4780
d5de92cf
L
4781 /* Check if REP prefix is OK. */
4782 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4783 {
4784 as_bad (_("invalid instruction `%s' after `%s'"),
4785 i.tm.name, i.rep_prefix);
4786 return;
4787 }
4788
c1ba0266
L
4789 /* Check for lock without a lockable instruction. Destination operand
4790 must be memory unless it is xchg (0x86). */
c32fa91d
L
4791 if (i.prefix[LOCK_PREFIX]
4792 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4793 || i.mem_operands == 0
4794 || (i.tm.base_opcode != 0x86
8dc0818e 4795 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4796 {
4797 as_bad (_("expecting lockable instruction after `lock'"));
4798 return;
4799 }
4800
40d231b4
JB
4801 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4802 if (i.prefix[DATA_PREFIX]
4803 && (is_any_vex_encoding (&i.tm)
4804 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4805 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4806 {
4807 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4808 return;
4809 }
4810
42164a71 4811 /* Check if HLE prefix is OK. */
165de32a 4812 if (i.hle_prefix && !check_hle ())
42164a71
L
4813 return;
4814
7e8b059b
L
4815 /* Check BND prefix. */
4816 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4817 as_bad (_("expecting valid branch instruction after `bnd'"));
4818
04ef582a 4819 /* Check NOTRACK prefix. */
9fef80d6
L
4820 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4821 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4822
327e8c42
JB
4823 if (i.tm.cpu_flags.bitfield.cpumpx)
4824 {
4825 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4826 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4827 else if (flag_code != CODE_16BIT
4828 ? i.prefix[ADDR_PREFIX]
4829 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4830 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4831 }
7e8b059b
L
4832
4833 /* Insert BND prefix. */
76d3a78a
JB
4834 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4835 {
4836 if (!i.prefix[BND_PREFIX])
4837 add_prefix (BND_PREFIX_OPCODE);
4838 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4839 {
4840 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4841 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4842 }
4843 }
7e8b059b 4844
29b0f896 4845 /* Check string instruction segment overrides. */
51c8edf6 4846 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4847 {
51c8edf6 4848 gas_assert (i.mem_operands);
29b0f896 4849 if (!check_string ())
5dd0794d 4850 return;
fc0763e6 4851 i.disp_operands = 0;
29b0f896 4852 }
5dd0794d 4853
b6f8c7c4
L
4854 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4855 optimize_encoding ();
4856
29b0f896
AM
4857 if (!process_suffix ())
4858 return;
e413e4e9 4859
921eafea 4860 /* Update operand types and check extended states. */
bc0844ae 4861 for (j = 0; j < i.operands; j++)
921eafea
L
4862 {
4863 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
32930e4e 4864 switch (i.types[j].bitfield.class)
921eafea
L
4865 {
4866 default:
4867 break;
4868 case RegMMX:
4869 i.xstate |= xstate_mmx;
4870 break;
4871 case RegMask:
32930e4e 4872 i.xstate |= xstate_mask;
921eafea
L
4873 break;
4874 case RegSIMD:
32930e4e 4875 if (i.types[j].bitfield.tmmword)
921eafea 4876 i.xstate |= xstate_tmm;
32930e4e 4877 else if (i.types[j].bitfield.zmmword)
921eafea 4878 i.xstate |= xstate_zmm;
32930e4e 4879 else if (i.types[j].bitfield.ymmword)
921eafea 4880 i.xstate |= xstate_ymm;
32930e4e 4881 else if (i.types[j].bitfield.xmmword)
921eafea
L
4882 i.xstate |= xstate_xmm;
4883 break;
4884 }
4885 }
bc0844ae 4886
29b0f896
AM
4887 /* Make still unresolved immediate matches conform to size of immediate
4888 given in i.suffix. */
4889 if (!finalize_imm ())
4890 return;
252b5132 4891
40fb9820 4892 if (i.types[0].bitfield.imm1)
29b0f896 4893 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4894
9afe6eb8
L
4895 /* We only need to check those implicit registers for instructions
4896 with 3 operands or less. */
4897 if (i.operands <= 3)
4898 for (j = 0; j < i.operands; j++)
75e5731b
JB
4899 if (i.types[j].bitfield.instance != InstanceNone
4900 && !i.types[j].bitfield.xmmword)
9afe6eb8 4901 i.reg_operands--;
40fb9820 4902
29b0f896
AM
4903 /* For insns with operands there are more diddles to do to the opcode. */
4904 if (i.operands)
4905 {
4906 if (!process_operands ())
4907 return;
4908 }
8c190ce0 4909 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4910 {
4911 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4912 as_warn (_("translating to `%sp'"), i.tm.name);
4913 }
252b5132 4914
7a8655d2 4915 if (is_any_vex_encoding (&i.tm))
9e5e5283 4916 {
c1dc7af5 4917 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4918 {
c1dc7af5 4919 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4920 i.tm.name);
4921 return;
4922 }
c0f3af97 4923
0b9404fd
JB
4924 /* Check for explicit REX prefix. */
4925 if (i.prefix[REX_PREFIX] || i.rex_encoding)
4926 {
4927 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
4928 return;
4929 }
4930
9e5e5283
L
4931 if (i.tm.opcode_modifier.vex)
4932 build_vex_prefix (t);
4933 else
4934 build_evex_prefix ();
0b9404fd
JB
4935
4936 /* The individual REX.RXBW bits got consumed. */
4937 i.rex &= REX_OPCODE;
9e5e5283 4938 }
43234a1e 4939
5dd85c99
SP
4940 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4941 instructions may define INT_OPCODE as well, so avoid this corner
4942 case for those instructions that use MODRM. */
4943 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4944 && !i.tm.opcode_modifier.modrm
4945 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4946 {
4947 i.tm.base_opcode = INT3_OPCODE;
4948 i.imm_operands = 0;
4949 }
252b5132 4950
0cfa3eb3
JB
4951 if ((i.tm.opcode_modifier.jump == JUMP
4952 || i.tm.opcode_modifier.jump == JUMP_BYTE
4953 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4954 && i.op[0].disps->X_op == O_constant)
4955 {
4956 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4957 the absolute address given by the constant. Since ix86 jumps and
4958 calls are pc relative, we need to generate a reloc. */
4959 i.op[0].disps->X_add_symbol = &abs_symbol;
4960 i.op[0].disps->X_op = O_symbol;
4961 }
252b5132 4962
29b0f896
AM
4963 /* For 8 bit registers we need an empty rex prefix. Also if the
4964 instruction already has a prefix, we need to convert old
4965 registers to new ones. */
773f551c 4966
bab6aec1 4967 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4968 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4969 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4970 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4971 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4972 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4973 && i.rex != 0))
4974 {
4975 int x;
726c5dcd 4976
29b0f896
AM
4977 i.rex |= REX_OPCODE;
4978 for (x = 0; x < 2; x++)
4979 {
4980 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4981 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4982 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4983 {
3f93af61 4984 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4985 /* In case it is "hi" register, give up. */
4986 if (i.op[x].regs->reg_num > 3)
a540244d 4987 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4988 "instruction requiring REX prefix."),
a540244d 4989 register_prefix, i.op[x].regs->reg_name);
773f551c 4990
29b0f896
AM
4991 /* Otherwise it is equivalent to the extended register.
4992 Since the encoding doesn't change this is merely
4993 cosmetic cleanup for debug output. */
4994
4995 i.op[x].regs = i.op[x].regs + 8;
773f551c 4996 }
29b0f896
AM
4997 }
4998 }
773f551c 4999
6b6b6807
L
5000 if (i.rex == 0 && i.rex_encoding)
5001 {
5002 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 5003 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
5004 the REX_OPCODE byte. */
5005 int x;
5006 for (x = 0; x < 2; x++)
bab6aec1 5007 if (i.types[x].bitfield.class == Reg
6b6b6807
L
5008 && i.types[x].bitfield.byte
5009 && (i.op[x].regs->reg_flags & RegRex64) == 0
5010 && i.op[x].regs->reg_num > 3)
5011 {
3f93af61 5012 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
5013 i.rex_encoding = FALSE;
5014 break;
5015 }
5016
5017 if (i.rex_encoding)
5018 i.rex = REX_OPCODE;
5019 }
5020
7ab9ffdd 5021 if (i.rex != 0)
29b0f896
AM
5022 add_prefix (REX_OPCODE | i.rex);
5023
ae531041
L
5024 insert_lfence_before ();
5025
29b0f896
AM
5026 /* We are ready to output the insn. */
5027 output_insn ();
e379e5f3 5028
ae531041
L
5029 insert_lfence_after ();
5030
e379e5f3
L
5031 last_insn.seg = now_seg;
5032
5033 if (i.tm.opcode_modifier.isprefix)
5034 {
5035 last_insn.kind = last_insn_prefix;
5036 last_insn.name = i.tm.name;
5037 last_insn.file = as_where (&last_insn.line);
5038 }
5039 else
5040 last_insn.kind = last_insn_other;
29b0f896
AM
5041}
5042
5043static char *
e3bb37b5 5044parse_insn (char *line, char *mnemonic)
29b0f896
AM
5045{
5046 char *l = line;
5047 char *token_start = l;
5048 char *mnem_p;
5c6af06e 5049 int supported;
d3ce72d0 5050 const insn_template *t;
b6169b20 5051 char *dot_p = NULL;
29b0f896 5052
29b0f896
AM
5053 while (1)
5054 {
5055 mnem_p = mnemonic;
5056 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5057 {
b6169b20
L
5058 if (*mnem_p == '.')
5059 dot_p = mnem_p;
29b0f896
AM
5060 mnem_p++;
5061 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5062 {
29b0f896
AM
5063 as_bad (_("no such instruction: `%s'"), token_start);
5064 return NULL;
5065 }
5066 l++;
5067 }
5068 if (!is_space_char (*l)
5069 && *l != END_OF_INSN
e44823cf
JB
5070 && (intel_syntax
5071 || (*l != PREFIX_SEPARATOR
5072 && *l != ',')))
29b0f896
AM
5073 {
5074 as_bad (_("invalid character %s in mnemonic"),
5075 output_invalid (*l));
5076 return NULL;
5077 }
5078 if (token_start == l)
5079 {
e44823cf 5080 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5081 as_bad (_("expecting prefix; got nothing"));
5082 else
5083 as_bad (_("expecting mnemonic; got nothing"));
5084 return NULL;
5085 }
45288df1 5086
29b0f896 5087 /* Look up instruction (or prefix) via hash table. */
629310ab 5088 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
47926f60 5089
29b0f896
AM
5090 if (*l != END_OF_INSN
5091 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5092 && current_templates
40fb9820 5093 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5094 {
c6fb90c8 5095 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5096 {
5097 as_bad ((flag_code != CODE_64BIT
5098 ? _("`%s' is only supported in 64-bit mode")
5099 : _("`%s' is not supported in 64-bit mode")),
5100 current_templates->start->name);
5101 return NULL;
5102 }
29b0f896
AM
5103 /* If we are in 16-bit mode, do not allow addr16 or data16.
5104 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5105 if ((current_templates->start->opcode_modifier.size == SIZE16
5106 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5107 && flag_code != CODE_64BIT
673fe0f0 5108 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5109 ^ (flag_code == CODE_16BIT)))
5110 {
5111 as_bad (_("redundant %s prefix"),
5112 current_templates->start->name);
5113 return NULL;
45288df1 5114 }
86fa6981 5115 if (current_templates->start->opcode_length == 0)
29b0f896 5116 {
86fa6981
L
5117 /* Handle pseudo prefixes. */
5118 switch (current_templates->start->base_opcode)
5119 {
41eb8e88 5120 case Prefix_Disp8:
86fa6981
L
5121 /* {disp8} */
5122 i.disp_encoding = disp_encoding_8bit;
5123 break;
41eb8e88
L
5124 case Prefix_Disp16:
5125 /* {disp16} */
5126 i.disp_encoding = disp_encoding_16bit;
5127 break;
5128 case Prefix_Disp32:
86fa6981
L
5129 /* {disp32} */
5130 i.disp_encoding = disp_encoding_32bit;
5131 break;
41eb8e88 5132 case Prefix_Load:
86fa6981
L
5133 /* {load} */
5134 i.dir_encoding = dir_encoding_load;
5135 break;
41eb8e88 5136 case Prefix_Store:
86fa6981
L
5137 /* {store} */
5138 i.dir_encoding = dir_encoding_store;
5139 break;
41eb8e88 5140 case Prefix_VEX:
42e04b36
L
5141 /* {vex} */
5142 i.vec_encoding = vex_encoding_vex;
86fa6981 5143 break;
41eb8e88 5144 case Prefix_VEX3:
86fa6981
L
5145 /* {vex3} */
5146 i.vec_encoding = vex_encoding_vex3;
5147 break;
41eb8e88 5148 case Prefix_EVEX:
86fa6981
L
5149 /* {evex} */
5150 i.vec_encoding = vex_encoding_evex;
5151 break;
41eb8e88 5152 case Prefix_REX:
6b6b6807
L
5153 /* {rex} */
5154 i.rex_encoding = TRUE;
5155 break;
41eb8e88 5156 case Prefix_NoOptimize:
b6f8c7c4
L
5157 /* {nooptimize} */
5158 i.no_optimize = TRUE;
5159 break;
86fa6981
L
5160 default:
5161 abort ();
5162 }
5163 }
5164 else
5165 {
5166 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5167 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5168 {
4e9ac44a
L
5169 case PREFIX_EXIST:
5170 return NULL;
5171 case PREFIX_DS:
d777820b 5172 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5173 i.notrack_prefix = current_templates->start->name;
5174 break;
5175 case PREFIX_REP:
5176 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5177 i.hle_prefix = current_templates->start->name;
5178 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5179 i.bnd_prefix = current_templates->start->name;
5180 else
5181 i.rep_prefix = current_templates->start->name;
5182 break;
5183 default:
5184 break;
86fa6981 5185 }
29b0f896
AM
5186 }
5187 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5188 token_start = ++l;
5189 }
5190 else
5191 break;
5192 }
45288df1 5193
30a55f88 5194 if (!current_templates)
b6169b20 5195 {
07d5e953
JB
5196 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5197 Check if we should swap operand or force 32bit displacement in
f8a5c266 5198 encoding. */
30a55f88 5199 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5200 i.dir_encoding = dir_encoding_swap;
8d63c93e 5201 else if (mnem_p - 3 == dot_p
a501d77e
L
5202 && dot_p[1] == 'd'
5203 && dot_p[2] == '8')
5204 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5205 else if (mnem_p - 4 == dot_p
f8a5c266
L
5206 && dot_p[1] == 'd'
5207 && dot_p[2] == '3'
5208 && dot_p[3] == '2')
a501d77e 5209 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5210 else
5211 goto check_suffix;
5212 mnem_p = dot_p;
5213 *dot_p = '\0';
629310ab 5214 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
b6169b20
L
5215 }
5216
29b0f896
AM
5217 if (!current_templates)
5218 {
dc1e8a47 5219 check_suffix:
1c529385 5220 if (mnem_p > mnemonic)
29b0f896 5221 {
1c529385
LH
5222 /* See if we can get a match by trimming off a suffix. */
5223 switch (mnem_p[-1])
29b0f896 5224 {
1c529385
LH
5225 case WORD_MNEM_SUFFIX:
5226 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5227 i.suffix = SHORT_MNEM_SUFFIX;
5228 else
1c529385
LH
5229 /* Fall through. */
5230 case BYTE_MNEM_SUFFIX:
5231 case QWORD_MNEM_SUFFIX:
5232 i.suffix = mnem_p[-1];
29b0f896 5233 mnem_p[-1] = '\0';
fe0e921f
AM
5234 current_templates
5235 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5236 break;
5237 case SHORT_MNEM_SUFFIX:
5238 case LONG_MNEM_SUFFIX:
5239 if (!intel_syntax)
5240 {
5241 i.suffix = mnem_p[-1];
5242 mnem_p[-1] = '\0';
fe0e921f
AM
5243 current_templates
5244 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5245 }
5246 break;
5247
5248 /* Intel Syntax. */
5249 case 'd':
5250 if (intel_syntax)
5251 {
5252 if (intel_float_operand (mnemonic) == 1)
5253 i.suffix = SHORT_MNEM_SUFFIX;
5254 else
5255 i.suffix = LONG_MNEM_SUFFIX;
5256 mnem_p[-1] = '\0';
fe0e921f
AM
5257 current_templates
5258 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5259 }
5260 break;
29b0f896 5261 }
29b0f896 5262 }
1c529385 5263
29b0f896
AM
5264 if (!current_templates)
5265 {
5266 as_bad (_("no such instruction: `%s'"), token_start);
5267 return NULL;
5268 }
5269 }
252b5132 5270
0cfa3eb3
JB
5271 if (current_templates->start->opcode_modifier.jump == JUMP
5272 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5273 {
5274 /* Check for a branch hint. We allow ",pt" and ",pn" for
5275 predict taken and predict not taken respectively.
5276 I'm not sure that branch hints actually do anything on loop
5277 and jcxz insns (JumpByte) for current Pentium4 chips. They
5278 may work in the future and it doesn't hurt to accept them
5279 now. */
5280 if (l[0] == ',' && l[1] == 'p')
5281 {
5282 if (l[2] == 't')
5283 {
5284 if (!add_prefix (DS_PREFIX_OPCODE))
5285 return NULL;
5286 l += 3;
5287 }
5288 else if (l[2] == 'n')
5289 {
5290 if (!add_prefix (CS_PREFIX_OPCODE))
5291 return NULL;
5292 l += 3;
5293 }
5294 }
5295 }
5296 /* Any other comma loses. */
5297 if (*l == ',')
5298 {
5299 as_bad (_("invalid character %s in mnemonic"),
5300 output_invalid (*l));
5301 return NULL;
5302 }
252b5132 5303
29b0f896 5304 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5305 supported = 0;
5306 for (t = current_templates->start; t < current_templates->end; ++t)
5307 {
c0f3af97
L
5308 supported |= cpu_flags_match (t);
5309 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5310 {
5311 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5312 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5313
548d0ee6
JB
5314 return l;
5315 }
29b0f896 5316 }
3629bb00 5317
548d0ee6
JB
5318 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5319 as_bad (flag_code == CODE_64BIT
5320 ? _("`%s' is not supported in 64-bit mode")
5321 : _("`%s' is only supported in 64-bit mode"),
5322 current_templates->start->name);
5323 else
5324 as_bad (_("`%s' is not supported on `%s%s'"),
5325 current_templates->start->name,
5326 cpu_arch_name ? cpu_arch_name : default_arch,
5327 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5328
548d0ee6 5329 return NULL;
29b0f896 5330}
252b5132 5331
29b0f896 5332static char *
e3bb37b5 5333parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5334{
5335 char *token_start;
3138f287 5336
29b0f896
AM
5337 /* 1 if operand is pending after ','. */
5338 unsigned int expecting_operand = 0;
252b5132 5339
29b0f896
AM
5340 /* Non-zero if operand parens not balanced. */
5341 unsigned int paren_not_balanced;
5342
5343 while (*l != END_OF_INSN)
5344 {
5345 /* Skip optional white space before operand. */
5346 if (is_space_char (*l))
5347 ++l;
d02603dc 5348 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5349 {
5350 as_bad (_("invalid character %s before operand %d"),
5351 output_invalid (*l),
5352 i.operands + 1);
5353 return NULL;
5354 }
d02603dc 5355 token_start = l; /* After white space. */
29b0f896
AM
5356 paren_not_balanced = 0;
5357 while (paren_not_balanced || *l != ',')
5358 {
5359 if (*l == END_OF_INSN)
5360 {
5361 if (paren_not_balanced)
5362 {
5363 if (!intel_syntax)
5364 as_bad (_("unbalanced parenthesis in operand %d."),
5365 i.operands + 1);
5366 else
5367 as_bad (_("unbalanced brackets in operand %d."),
5368 i.operands + 1);
5369 return NULL;
5370 }
5371 else
5372 break; /* we are done */
5373 }
d02603dc 5374 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5375 {
5376 as_bad (_("invalid character %s in operand %d"),
5377 output_invalid (*l),
5378 i.operands + 1);
5379 return NULL;
5380 }
5381 if (!intel_syntax)
5382 {
5383 if (*l == '(')
5384 ++paren_not_balanced;
5385 if (*l == ')')
5386 --paren_not_balanced;
5387 }
5388 else
5389 {
5390 if (*l == '[')
5391 ++paren_not_balanced;
5392 if (*l == ']')
5393 --paren_not_balanced;
5394 }
5395 l++;
5396 }
5397 if (l != token_start)
5398 { /* Yes, we've read in another operand. */
5399 unsigned int operand_ok;
5400 this_operand = i.operands++;
5401 if (i.operands > MAX_OPERANDS)
5402 {
5403 as_bad (_("spurious operands; (%d operands/instruction max)"),
5404 MAX_OPERANDS);
5405 return NULL;
5406 }
9d46ce34 5407 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5408 /* Now parse operand adding info to 'i' as we go along. */
5409 END_STRING_AND_SAVE (l);
5410
1286ab78
L
5411 if (i.mem_operands > 1)
5412 {
5413 as_bad (_("too many memory references for `%s'"),
5414 mnemonic);
5415 return 0;
5416 }
5417
29b0f896
AM
5418 if (intel_syntax)
5419 operand_ok =
5420 i386_intel_operand (token_start,
5421 intel_float_operand (mnemonic));
5422 else
a7619375 5423 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5424
5425 RESTORE_END_STRING (l);
5426 if (!operand_ok)
5427 return NULL;
5428 }
5429 else
5430 {
5431 if (expecting_operand)
5432 {
5433 expecting_operand_after_comma:
5434 as_bad (_("expecting operand after ','; got nothing"));
5435 return NULL;
5436 }
5437 if (*l == ',')
5438 {
5439 as_bad (_("expecting operand before ','; got nothing"));
5440 return NULL;
5441 }
5442 }
7f3f1ea2 5443
29b0f896
AM
5444 /* Now *l must be either ',' or END_OF_INSN. */
5445 if (*l == ',')
5446 {
5447 if (*++l == END_OF_INSN)
5448 {
5449 /* Just skip it, if it's \n complain. */
5450 goto expecting_operand_after_comma;
5451 }
5452 expecting_operand = 1;
5453 }
5454 }
5455 return l;
5456}
7f3f1ea2 5457
050dfa73 5458static void
4d456e3d 5459swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5460{
5461 union i386_op temp_op;
40fb9820 5462 i386_operand_type temp_type;
c48dadc9 5463 unsigned int temp_flags;
050dfa73 5464 enum bfd_reloc_code_real temp_reloc;
4eed87de 5465
050dfa73
MM
5466 temp_type = i.types[xchg2];
5467 i.types[xchg2] = i.types[xchg1];
5468 i.types[xchg1] = temp_type;
c48dadc9
JB
5469
5470 temp_flags = i.flags[xchg2];
5471 i.flags[xchg2] = i.flags[xchg1];
5472 i.flags[xchg1] = temp_flags;
5473
050dfa73
MM
5474 temp_op = i.op[xchg2];
5475 i.op[xchg2] = i.op[xchg1];
5476 i.op[xchg1] = temp_op;
c48dadc9 5477
050dfa73
MM
5478 temp_reloc = i.reloc[xchg2];
5479 i.reloc[xchg2] = i.reloc[xchg1];
5480 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5481
5482 if (i.mask)
5483 {
5484 if (i.mask->operand == xchg1)
5485 i.mask->operand = xchg2;
5486 else if (i.mask->operand == xchg2)
5487 i.mask->operand = xchg1;
5488 }
5489 if (i.broadcast)
5490 {
5491 if (i.broadcast->operand == xchg1)
5492 i.broadcast->operand = xchg2;
5493 else if (i.broadcast->operand == xchg2)
5494 i.broadcast->operand = xchg1;
5495 }
5496 if (i.rounding)
5497 {
5498 if (i.rounding->operand == xchg1)
5499 i.rounding->operand = xchg2;
5500 else if (i.rounding->operand == xchg2)
5501 i.rounding->operand = xchg1;
5502 }
050dfa73
MM
5503}
5504
29b0f896 5505static void
e3bb37b5 5506swap_operands (void)
29b0f896 5507{
b7c61d9a 5508 switch (i.operands)
050dfa73 5509 {
c0f3af97 5510 case 5:
b7c61d9a 5511 case 4:
4d456e3d 5512 swap_2_operands (1, i.operands - 2);
1a0670f3 5513 /* Fall through. */
b7c61d9a
L
5514 case 3:
5515 case 2:
4d456e3d 5516 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5517 break;
5518 default:
5519 abort ();
29b0f896 5520 }
29b0f896
AM
5521
5522 if (i.mem_operands == 2)
5523 {
5524 const seg_entry *temp_seg;
5525 temp_seg = i.seg[0];
5526 i.seg[0] = i.seg[1];
5527 i.seg[1] = temp_seg;
5528 }
5529}
252b5132 5530
29b0f896
AM
5531/* Try to ensure constant immediates are represented in the smallest
5532 opcode possible. */
5533static void
e3bb37b5 5534optimize_imm (void)
29b0f896
AM
5535{
5536 char guess_suffix = 0;
5537 int op;
252b5132 5538
29b0f896
AM
5539 if (i.suffix)
5540 guess_suffix = i.suffix;
5541 else if (i.reg_operands)
5542 {
5543 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5544 We can't do this properly yet, i.e. excluding special register
5545 instances, but the following works for instructions with
5546 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5547 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5548 if (i.types[op].bitfield.class != Reg)
5549 continue;
5550 else if (i.types[op].bitfield.byte)
7ab9ffdd 5551 {
40fb9820
L
5552 guess_suffix = BYTE_MNEM_SUFFIX;
5553 break;
5554 }
bab6aec1 5555 else if (i.types[op].bitfield.word)
252b5132 5556 {
40fb9820
L
5557 guess_suffix = WORD_MNEM_SUFFIX;
5558 break;
5559 }
bab6aec1 5560 else if (i.types[op].bitfield.dword)
40fb9820
L
5561 {
5562 guess_suffix = LONG_MNEM_SUFFIX;
5563 break;
5564 }
bab6aec1 5565 else if (i.types[op].bitfield.qword)
40fb9820
L
5566 {
5567 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5568 break;
252b5132 5569 }
29b0f896
AM
5570 }
5571 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5572 guess_suffix = WORD_MNEM_SUFFIX;
5573
5574 for (op = i.operands; --op >= 0;)
40fb9820 5575 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5576 {
5577 switch (i.op[op].imms->X_op)
252b5132 5578 {
29b0f896
AM
5579 case O_constant:
5580 /* If a suffix is given, this operand may be shortened. */
5581 switch (guess_suffix)
252b5132 5582 {
29b0f896 5583 case LONG_MNEM_SUFFIX:
40fb9820
L
5584 i.types[op].bitfield.imm32 = 1;
5585 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5586 break;
5587 case WORD_MNEM_SUFFIX:
40fb9820
L
5588 i.types[op].bitfield.imm16 = 1;
5589 i.types[op].bitfield.imm32 = 1;
5590 i.types[op].bitfield.imm32s = 1;
5591 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5592 break;
5593 case BYTE_MNEM_SUFFIX:
40fb9820
L
5594 i.types[op].bitfield.imm8 = 1;
5595 i.types[op].bitfield.imm8s = 1;
5596 i.types[op].bitfield.imm16 = 1;
5597 i.types[op].bitfield.imm32 = 1;
5598 i.types[op].bitfield.imm32s = 1;
5599 i.types[op].bitfield.imm64 = 1;
29b0f896 5600 break;
252b5132 5601 }
252b5132 5602
29b0f896
AM
5603 /* If this operand is at most 16 bits, convert it
5604 to a signed 16 bit number before trying to see
5605 whether it will fit in an even smaller size.
5606 This allows a 16-bit operand such as $0xffe0 to
5607 be recognised as within Imm8S range. */
40fb9820 5608 if ((i.types[op].bitfield.imm16)
29b0f896 5609 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5610 {
29b0f896
AM
5611 i.op[op].imms->X_add_number =
5612 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5613 }
a28def75
L
5614#ifdef BFD64
5615 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5616 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5617 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5618 == 0))
5619 {
5620 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5621 ^ ((offsetT) 1 << 31))
5622 - ((offsetT) 1 << 31));
5623 }
a28def75 5624#endif
40fb9820 5625 i.types[op]
c6fb90c8
L
5626 = operand_type_or (i.types[op],
5627 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5628
29b0f896
AM
5629 /* We must avoid matching of Imm32 templates when 64bit
5630 only immediate is available. */
5631 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5632 i.types[op].bitfield.imm32 = 0;
29b0f896 5633 break;
252b5132 5634
29b0f896
AM
5635 case O_absent:
5636 case O_register:
5637 abort ();
5638
5639 /* Symbols and expressions. */
5640 default:
9cd96992
JB
5641 /* Convert symbolic operand to proper sizes for matching, but don't
5642 prevent matching a set of insns that only supports sizes other
5643 than those matching the insn suffix. */
5644 {
40fb9820 5645 i386_operand_type mask, allowed;
d3ce72d0 5646 const insn_template *t;
9cd96992 5647
0dfbf9d7
L
5648 operand_type_set (&mask, 0);
5649 operand_type_set (&allowed, 0);
40fb9820 5650
4eed87de
AM
5651 for (t = current_templates->start;
5652 t < current_templates->end;
5653 ++t)
bab6aec1
JB
5654 {
5655 allowed = operand_type_or (allowed, t->operand_types[op]);
5656 allowed = operand_type_and (allowed, anyimm);
5657 }
9cd96992
JB
5658 switch (guess_suffix)
5659 {
5660 case QWORD_MNEM_SUFFIX:
40fb9820
L
5661 mask.bitfield.imm64 = 1;
5662 mask.bitfield.imm32s = 1;
9cd96992
JB
5663 break;
5664 case LONG_MNEM_SUFFIX:
40fb9820 5665 mask.bitfield.imm32 = 1;
9cd96992
JB
5666 break;
5667 case WORD_MNEM_SUFFIX:
40fb9820 5668 mask.bitfield.imm16 = 1;
9cd96992
JB
5669 break;
5670 case BYTE_MNEM_SUFFIX:
40fb9820 5671 mask.bitfield.imm8 = 1;
9cd96992
JB
5672 break;
5673 default:
9cd96992
JB
5674 break;
5675 }
c6fb90c8 5676 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5677 if (!operand_type_all_zero (&allowed))
c6fb90c8 5678 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5679 }
29b0f896 5680 break;
252b5132 5681 }
29b0f896
AM
5682 }
5683}
47926f60 5684
29b0f896
AM
5685/* Try to use the smallest displacement type too. */
5686static void
e3bb37b5 5687optimize_disp (void)
29b0f896
AM
5688{
5689 int op;
3e73aa7c 5690
29b0f896 5691 for (op = i.operands; --op >= 0;)
40fb9820 5692 if (operand_type_check (i.types[op], disp))
252b5132 5693 {
b300c311 5694 if (i.op[op].disps->X_op == O_constant)
252b5132 5695 {
91d6fa6a 5696 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5697
40fb9820 5698 if (i.types[op].bitfield.disp16
91d6fa6a 5699 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5700 {
5701 /* If this operand is at most 16 bits, convert
5702 to a signed 16 bit number and don't use 64bit
5703 displacement. */
91d6fa6a 5704 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5705 i.types[op].bitfield.disp64 = 0;
b300c311 5706 }
a28def75
L
5707#ifdef BFD64
5708 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5709 if (i.types[op].bitfield.disp32
91d6fa6a 5710 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5711 {
5712 /* If this operand is at most 32 bits, convert
5713 to a signed 32 bit number and don't use 64bit
5714 displacement. */
91d6fa6a
NC
5715 op_disp &= (((offsetT) 2 << 31) - 1);
5716 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5717 i.types[op].bitfield.disp64 = 0;
b300c311 5718 }
a28def75 5719#endif
91d6fa6a 5720 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5721 {
40fb9820
L
5722 i.types[op].bitfield.disp8 = 0;
5723 i.types[op].bitfield.disp16 = 0;
5724 i.types[op].bitfield.disp32 = 0;
5725 i.types[op].bitfield.disp32s = 0;
5726 i.types[op].bitfield.disp64 = 0;
b300c311
L
5727 i.op[op].disps = 0;
5728 i.disp_operands--;
5729 }
5730 else if (flag_code == CODE_64BIT)
5731 {
91d6fa6a 5732 if (fits_in_signed_long (op_disp))
28a9d8f5 5733 {
40fb9820
L
5734 i.types[op].bitfield.disp64 = 0;
5735 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5736 }
0e1147d9 5737 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5738 && fits_in_unsigned_long (op_disp))
40fb9820 5739 i.types[op].bitfield.disp32 = 1;
b300c311 5740 }
40fb9820
L
5741 if ((i.types[op].bitfield.disp32
5742 || i.types[op].bitfield.disp32s
5743 || i.types[op].bitfield.disp16)
b5014f7a 5744 && fits_in_disp8 (op_disp))
40fb9820 5745 i.types[op].bitfield.disp8 = 1;
252b5132 5746 }
67a4f2b7
AO
5747 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5748 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5749 {
5750 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5751 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5752 i.types[op].bitfield.disp8 = 0;
5753 i.types[op].bitfield.disp16 = 0;
5754 i.types[op].bitfield.disp32 = 0;
5755 i.types[op].bitfield.disp32s = 0;
5756 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5757 }
5758 else
b300c311 5759 /* We only support 64bit displacement on constants. */
40fb9820 5760 i.types[op].bitfield.disp64 = 0;
252b5132 5761 }
29b0f896
AM
5762}
5763
4a1b91ea
L
5764/* Return 1 if there is a match in broadcast bytes between operand
5765 GIVEN and instruction template T. */
5766
5767static INLINE int
5768match_broadcast_size (const insn_template *t, unsigned int given)
5769{
5770 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5771 && i.types[given].bitfield.byte)
5772 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5773 && i.types[given].bitfield.word)
5774 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5775 && i.types[given].bitfield.dword)
5776 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5777 && i.types[given].bitfield.qword));
5778}
5779
6c30d220
L
5780/* Check if operands are valid for the instruction. */
5781
5782static int
5783check_VecOperands (const insn_template *t)
5784{
43234a1e 5785 unsigned int op;
e2195274 5786 i386_cpu_flags cpu;
e2195274
JB
5787
5788 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5789 any one operand are implicity requiring AVX512VL support if the actual
5790 operand size is YMMword or XMMword. Since this function runs after
5791 template matching, there's no need to check for YMMword/XMMword in
5792 the template. */
5793 cpu = cpu_flags_and (t->cpu_flags, avx512);
5794 if (!cpu_flags_all_zero (&cpu)
5795 && !t->cpu_flags.bitfield.cpuavx512vl
5796 && !cpu_arch_flags.bitfield.cpuavx512vl)
5797 {
5798 for (op = 0; op < t->operands; ++op)
5799 {
5800 if (t->operand_types[op].bitfield.zmmword
5801 && (i.types[op].bitfield.ymmword
5802 || i.types[op].bitfield.xmmword))
5803 {
5804 i.error = unsupported;
5805 return 1;
5806 }
5807 }
5808 }
43234a1e 5809
6c30d220 5810 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 5811 if (!t->opcode_modifier.sib
6c30d220 5812 && i.index_reg
1b54b8d7
JB
5813 && (i.index_reg->reg_type.bitfield.xmmword
5814 || i.index_reg->reg_type.bitfield.ymmword
5815 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5816 {
5817 i.error = unsupported_vector_index_register;
5818 return 1;
5819 }
5820
ad8ecc81
MZ
5821 /* Check if default mask is allowed. */
5822 if (t->opcode_modifier.nodefmask
5823 && (!i.mask || i.mask->mask->reg_num == 0))
5824 {
5825 i.error = no_default_mask;
5826 return 1;
5827 }
5828
7bab8ab5
JB
5829 /* For VSIB byte, we need a vector register for index, and all vector
5830 registers must be distinct. */
260cd341 5831 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
5832 {
5833 if (!i.index_reg
63112cd6 5834 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 5835 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 5836 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 5837 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 5838 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 5839 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5840 {
5841 i.error = invalid_vsib_address;
5842 return 1;
5843 }
5844
43234a1e
L
5845 gas_assert (i.reg_operands == 2 || i.mask);
5846 if (i.reg_operands == 2 && !i.mask)
5847 {
3528c362 5848 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5849 gas_assert (i.types[0].bitfield.xmmword
5850 || i.types[0].bitfield.ymmword);
3528c362 5851 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5852 gas_assert (i.types[2].bitfield.xmmword
5853 || i.types[2].bitfield.ymmword);
43234a1e
L
5854 if (operand_check == check_none)
5855 return 0;
5856 if (register_number (i.op[0].regs)
5857 != register_number (i.index_reg)
5858 && register_number (i.op[2].regs)
5859 != register_number (i.index_reg)
5860 && register_number (i.op[0].regs)
5861 != register_number (i.op[2].regs))
5862 return 0;
5863 if (operand_check == check_error)
5864 {
5865 i.error = invalid_vector_register_set;
5866 return 1;
5867 }
5868 as_warn (_("mask, index, and destination registers should be distinct"));
5869 }
8444f82a
MZ
5870 else if (i.reg_operands == 1 && i.mask)
5871 {
3528c362 5872 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5873 && (i.types[1].bitfield.xmmword
5874 || i.types[1].bitfield.ymmword
5875 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5876 && (register_number (i.op[1].regs)
5877 == register_number (i.index_reg)))
5878 {
5879 if (operand_check == check_error)
5880 {
5881 i.error = invalid_vector_register_set;
5882 return 1;
5883 }
5884 if (operand_check != check_none)
5885 as_warn (_("index and destination registers should be distinct"));
5886 }
5887 }
43234a1e 5888 }
7bab8ab5 5889
260cd341
LC
5890 /* For AMX instructions with three tmmword operands, all tmmword operand must be
5891 distinct */
5892 if (t->operand_types[0].bitfield.tmmword
5893 && i.reg_operands == 3)
5894 {
5895 if (register_number (i.op[0].regs)
5896 == register_number (i.op[1].regs)
5897 || register_number (i.op[0].regs)
5898 == register_number (i.op[2].regs)
5899 || register_number (i.op[1].regs)
5900 == register_number (i.op[2].regs))
5901 {
5902 i.error = invalid_tmm_register_set;
5903 return 1;
5904 }
5905 }
5906
43234a1e
L
5907 /* Check if broadcast is supported by the instruction and is applied
5908 to the memory operand. */
5909 if (i.broadcast)
5910 {
8e6e0792 5911 i386_operand_type type, overlap;
43234a1e
L
5912
5913 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5914 and its broadcast bytes match the memory operand. */
32546502 5915 op = i.broadcast->operand;
8e6e0792 5916 if (!t->opcode_modifier.broadcast
c48dadc9 5917 || !(i.flags[op] & Operand_Mem)
c39e5b26 5918 || (!i.types[op].bitfield.unspecified
4a1b91ea 5919 && !match_broadcast_size (t, op)))
43234a1e
L
5920 {
5921 bad_broadcast:
5922 i.error = unsupported_broadcast;
5923 return 1;
5924 }
8e6e0792 5925
4a1b91ea
L
5926 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5927 * i.broadcast->type);
8e6e0792 5928 operand_type_set (&type, 0);
4a1b91ea 5929 switch (i.broadcast->bytes)
8e6e0792 5930 {
4a1b91ea
L
5931 case 2:
5932 type.bitfield.word = 1;
5933 break;
5934 case 4:
5935 type.bitfield.dword = 1;
5936 break;
8e6e0792
JB
5937 case 8:
5938 type.bitfield.qword = 1;
5939 break;
5940 case 16:
5941 type.bitfield.xmmword = 1;
5942 break;
5943 case 32:
5944 type.bitfield.ymmword = 1;
5945 break;
5946 case 64:
5947 type.bitfield.zmmword = 1;
5948 break;
5949 default:
5950 goto bad_broadcast;
5951 }
5952
5953 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5954 if (t->operand_types[op].bitfield.class == RegSIMD
5955 && t->operand_types[op].bitfield.byte
5956 + t->operand_types[op].bitfield.word
5957 + t->operand_types[op].bitfield.dword
5958 + t->operand_types[op].bitfield.qword > 1)
5959 {
5960 overlap.bitfield.xmmword = 0;
5961 overlap.bitfield.ymmword = 0;
5962 overlap.bitfield.zmmword = 0;
5963 }
8e6e0792
JB
5964 if (operand_type_all_zero (&overlap))
5965 goto bad_broadcast;
5966
5967 if (t->opcode_modifier.checkregsize)
5968 {
5969 unsigned int j;
5970
e2195274 5971 type.bitfield.baseindex = 1;
8e6e0792
JB
5972 for (j = 0; j < i.operands; ++j)
5973 {
5974 if (j != op
5975 && !operand_type_register_match(i.types[j],
5976 t->operand_types[j],
5977 type,
5978 t->operand_types[op]))
5979 goto bad_broadcast;
5980 }
5981 }
43234a1e
L
5982 }
5983 /* If broadcast is supported in this instruction, we need to check if
5984 operand of one-element size isn't specified without broadcast. */
5985 else if (t->opcode_modifier.broadcast && i.mem_operands)
5986 {
5987 /* Find memory operand. */
5988 for (op = 0; op < i.operands; op++)
8dc0818e 5989 if (i.flags[op] & Operand_Mem)
43234a1e
L
5990 break;
5991 gas_assert (op < i.operands);
5992 /* Check size of the memory operand. */
4a1b91ea 5993 if (match_broadcast_size (t, op))
43234a1e
L
5994 {
5995 i.error = broadcast_needed;
5996 return 1;
5997 }
5998 }
c39e5b26
JB
5999 else
6000 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
6001
6002 /* Check if requested masking is supported. */
ae2387fe 6003 if (i.mask)
43234a1e 6004 {
ae2387fe
JB
6005 switch (t->opcode_modifier.masking)
6006 {
6007 case BOTH_MASKING:
6008 break;
6009 case MERGING_MASKING:
6010 if (i.mask->zeroing)
6011 {
6012 case 0:
6013 i.error = unsupported_masking;
6014 return 1;
6015 }
6016 break;
6017 case DYNAMIC_MASKING:
6018 /* Memory destinations allow only merging masking. */
6019 if (i.mask->zeroing && i.mem_operands)
6020 {
6021 /* Find memory operand. */
6022 for (op = 0; op < i.operands; op++)
c48dadc9 6023 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6024 break;
6025 gas_assert (op < i.operands);
6026 if (op == i.operands - 1)
6027 {
6028 i.error = unsupported_masking;
6029 return 1;
6030 }
6031 }
6032 break;
6033 default:
6034 abort ();
6035 }
43234a1e
L
6036 }
6037
6038 /* Check if masking is applied to dest operand. */
6039 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
6040 {
6041 i.error = mask_not_on_destination;
6042 return 1;
6043 }
6044
43234a1e
L
6045 /* Check RC/SAE. */
6046 if (i.rounding)
6047 {
a80195f1
JB
6048 if (!t->opcode_modifier.sae
6049 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6050 {
6051 i.error = unsupported_rc_sae;
6052 return 1;
6053 }
6054 /* If the instruction has several immediate operands and one of
6055 them is rounding, the rounding operand should be the last
6056 immediate operand. */
6057 if (i.imm_operands > 1
6058 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 6059 {
43234a1e 6060 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6061 return 1;
6062 }
6c30d220
L
6063 }
6064
da4977e0
JB
6065 /* Check the special Imm4 cases; must be the first operand. */
6066 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6067 {
6068 if (i.op[0].imms->X_op != O_constant
6069 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6070 {
6071 i.error = bad_imm4;
6072 return 1;
6073 }
6074
6075 /* Turn off Imm<N> so that update_imm won't complain. */
6076 operand_type_set (&i.types[0], 0);
6077 }
6078
43234a1e 6079 /* Check vector Disp8 operand. */
b5014f7a
JB
6080 if (t->opcode_modifier.disp8memshift
6081 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6082 {
6083 if (i.broadcast)
4a1b91ea 6084 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6085 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6086 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6087 else
6088 {
6089 const i386_operand_type *type = NULL;
6090
6091 i.memshift = 0;
6092 for (op = 0; op < i.operands; op++)
8dc0818e 6093 if (i.flags[op] & Operand_Mem)
7091c612 6094 {
4174bfff
JB
6095 if (t->opcode_modifier.evex == EVEXLIG)
6096 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6097 else if (t->operand_types[op].bitfield.xmmword
6098 + t->operand_types[op].bitfield.ymmword
6099 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6100 type = &t->operand_types[op];
6101 else if (!i.types[op].bitfield.unspecified)
6102 type = &i.types[op];
6103 }
3528c362 6104 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6105 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6106 {
6107 if (i.types[op].bitfield.zmmword)
6108 i.memshift = 6;
6109 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6110 i.memshift = 5;
6111 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6112 i.memshift = 4;
6113 }
6114
6115 if (type)
6116 {
6117 if (type->bitfield.zmmword)
6118 i.memshift = 6;
6119 else if (type->bitfield.ymmword)
6120 i.memshift = 5;
6121 else if (type->bitfield.xmmword)
6122 i.memshift = 4;
6123 }
6124
6125 /* For the check in fits_in_disp8(). */
6126 if (i.memshift == 0)
6127 i.memshift = -1;
6128 }
43234a1e
L
6129
6130 for (op = 0; op < i.operands; op++)
6131 if (operand_type_check (i.types[op], disp)
6132 && i.op[op].disps->X_op == O_constant)
6133 {
b5014f7a 6134 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6135 {
b5014f7a
JB
6136 i.types[op].bitfield.disp8 = 1;
6137 return 0;
43234a1e 6138 }
b5014f7a 6139 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6140 }
6141 }
b5014f7a
JB
6142
6143 i.memshift = 0;
43234a1e 6144
6c30d220
L
6145 return 0;
6146}
6147
da4977e0 6148/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6149
6150static int
da4977e0 6151VEX_check_encoding (const insn_template *t)
a683cc34 6152{
da4977e0
JB
6153 if (i.vec_encoding == vex_encoding_error)
6154 {
6155 i.error = unsupported;
6156 return 1;
6157 }
6158
86fa6981 6159 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6160 {
86fa6981 6161 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6162 if (!is_evex_encoding (t))
86fa6981
L
6163 {
6164 i.error = unsupported;
6165 return 1;
6166 }
6167 return 0;
43234a1e
L
6168 }
6169
a683cc34 6170 if (!t->opcode_modifier.vex)
86fa6981
L
6171 {
6172 /* This instruction template doesn't have VEX prefix. */
6173 if (i.vec_encoding != vex_encoding_default)
6174 {
6175 i.error = unsupported;
6176 return 1;
6177 }
6178 return 0;
6179 }
a683cc34 6180
a683cc34
SP
6181 return 0;
6182}
6183
d3ce72d0 6184static const insn_template *
83b16ac6 6185match_template (char mnem_suffix)
29b0f896
AM
6186{
6187 /* Points to template once we've found it. */
d3ce72d0 6188 const insn_template *t;
40fb9820 6189 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6190 i386_operand_type overlap4;
29b0f896 6191 unsigned int found_reverse_match;
dc2be329 6192 i386_opcode_modifier suffix_check;
40fb9820 6193 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6194 int addr_prefix_disp;
45a4bb20 6195 unsigned int j, size_match, check_register;
5614d22c 6196 enum i386_error specific_error = 0;
29b0f896 6197
c0f3af97
L
6198#if MAX_OPERANDS != 5
6199# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6200#endif
6201
29b0f896 6202 found_reverse_match = 0;
539e75ad 6203 addr_prefix_disp = -1;
40fb9820 6204
dc2be329 6205 /* Prepare for mnemonic suffix check. */
40fb9820 6206 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6207 switch (mnem_suffix)
6208 {
6209 case BYTE_MNEM_SUFFIX:
6210 suffix_check.no_bsuf = 1;
6211 break;
6212 case WORD_MNEM_SUFFIX:
6213 suffix_check.no_wsuf = 1;
6214 break;
6215 case SHORT_MNEM_SUFFIX:
6216 suffix_check.no_ssuf = 1;
6217 break;
6218 case LONG_MNEM_SUFFIX:
6219 suffix_check.no_lsuf = 1;
6220 break;
6221 case QWORD_MNEM_SUFFIX:
6222 suffix_check.no_qsuf = 1;
6223 break;
6224 default:
6225 /* NB: In Intel syntax, normally we can check for memory operand
6226 size when there is no mnemonic suffix. But jmp and call have
6227 2 different encodings with Dword memory operand size, one with
6228 No_ldSuf and the other without. i.suffix is set to
6229 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6230 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6231 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6232 }
6233
01559ecc
L
6234 /* Must have right number of operands. */
6235 i.error = number_of_operands_mismatch;
6236
45aa61fe 6237 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6238 {
539e75ad 6239 addr_prefix_disp = -1;
dbbc8b7e 6240 found_reverse_match = 0;
539e75ad 6241
29b0f896
AM
6242 if (i.operands != t->operands)
6243 continue;
6244
50aecf8c 6245 /* Check processor support. */
a65babc9 6246 i.error = unsupported;
45a4bb20 6247 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6248 continue;
6249
e1d4d893 6250 /* Check AT&T mnemonic. */
a65babc9 6251 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6252 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6253 continue;
6254
4b5aaf5f 6255 /* Check AT&T/Intel syntax. */
a65babc9 6256 i.error = unsupported_syntax;
5c07affc 6257 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6258 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6259 continue;
6260
4b5aaf5f
L
6261 /* Check Intel64/AMD64 ISA. */
6262 switch (isa64)
6263 {
6264 default:
6265 /* Default: Don't accept Intel64. */
6266 if (t->opcode_modifier.isa64 == INTEL64)
6267 continue;
6268 break;
6269 case amd64:
6270 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6271 if (t->opcode_modifier.isa64 >= INTEL64)
6272 continue;
6273 break;
6274 case intel64:
6275 /* -mintel64: Don't accept AMD64. */
5990e377 6276 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6277 continue;
6278 break;
6279 }
6280
dc2be329 6281 /* Check the suffix. */
a65babc9 6282 i.error = invalid_instruction_suffix;
dc2be329
L
6283 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6284 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6285 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6286 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6287 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6288 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6289 continue;
29b0f896 6290
3ac21baa
JB
6291 size_match = operand_size_match (t);
6292 if (!size_match)
7d5e4556 6293 continue;
539e75ad 6294
6f2f06be
JB
6295 /* This is intentionally not
6296
0cfa3eb3 6297 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6298
6299 as the case of a missing * on the operand is accepted (perhaps with
6300 a warning, issued further down). */
0cfa3eb3 6301 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6302 {
6303 i.error = operand_type_mismatch;
6304 continue;
6305 }
6306
5c07affc
L
6307 for (j = 0; j < MAX_OPERANDS; j++)
6308 operand_types[j] = t->operand_types[j];
6309
e365e234
JB
6310 /* In general, don't allow
6311 - 64-bit operands outside of 64-bit mode,
6312 - 32-bit operands on pre-386. */
4873e243 6313 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6314 if (((i.suffix == QWORD_MNEM_SUFFIX
6315 && flag_code != CODE_64BIT
6316 && (t->base_opcode != 0x0fc7
6317 || t->extension_opcode != 1 /* cmpxchg8b */))
6318 || (i.suffix == LONG_MNEM_SUFFIX
6319 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6320 && (intel_syntax
3cd7f3e3 6321 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6322 && !intel_float_operand (t->name))
6323 : intel_float_operand (t->name) != 2)
4873e243
JB
6324 && (t->operands == i.imm_operands
6325 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6326 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6327 && operand_types[i.imm_operands].bitfield.class != RegMask)
6328 || (operand_types[j].bitfield.class != RegMMX
6329 && operand_types[j].bitfield.class != RegSIMD
6330 && operand_types[j].bitfield.class != RegMask))
63112cd6 6331 && !t->opcode_modifier.sib)
192dc9c6
JB
6332 continue;
6333
29b0f896 6334 /* Do not verify operands when there are none. */
e365e234 6335 if (!t->operands)
da4977e0
JB
6336 {
6337 if (VEX_check_encoding (t))
6338 {
6339 specific_error = i.error;
6340 continue;
6341 }
6342
6343 /* We've found a match; break out of loop. */
6344 break;
6345 }
252b5132 6346
48bcea9f
JB
6347 if (!t->opcode_modifier.jump
6348 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6349 {
6350 /* There should be only one Disp operand. */
6351 for (j = 0; j < MAX_OPERANDS; j++)
6352 if (operand_type_check (operand_types[j], disp))
539e75ad 6353 break;
48bcea9f
JB
6354 if (j < MAX_OPERANDS)
6355 {
6356 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6357
6358 addr_prefix_disp = j;
6359
6360 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6361 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6362 switch (flag_code)
40fb9820 6363 {
48bcea9f
JB
6364 case CODE_16BIT:
6365 override = !override;
6366 /* Fall through. */
6367 case CODE_32BIT:
6368 if (operand_types[j].bitfield.disp32
6369 && operand_types[j].bitfield.disp16)
40fb9820 6370 {
48bcea9f
JB
6371 operand_types[j].bitfield.disp16 = override;
6372 operand_types[j].bitfield.disp32 = !override;
40fb9820 6373 }
48bcea9f
JB
6374 operand_types[j].bitfield.disp32s = 0;
6375 operand_types[j].bitfield.disp64 = 0;
6376 break;
6377
6378 case CODE_64BIT:
6379 if (operand_types[j].bitfield.disp32s
6380 || operand_types[j].bitfield.disp64)
40fb9820 6381 {
48bcea9f
JB
6382 operand_types[j].bitfield.disp64 &= !override;
6383 operand_types[j].bitfield.disp32s &= !override;
6384 operand_types[j].bitfield.disp32 = override;
40fb9820 6385 }
48bcea9f
JB
6386 operand_types[j].bitfield.disp16 = 0;
6387 break;
40fb9820 6388 }
539e75ad 6389 }
48bcea9f 6390 }
539e75ad 6391
02a86693
L
6392 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6393 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6394 continue;
6395
56ffb741 6396 /* We check register size if needed. */
e2195274
JB
6397 if (t->opcode_modifier.checkregsize)
6398 {
6399 check_register = (1 << t->operands) - 1;
6400 if (i.broadcast)
6401 check_register &= ~(1 << i.broadcast->operand);
6402 }
6403 else
6404 check_register = 0;
6405
c6fb90c8 6406 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6407 switch (t->operands)
6408 {
6409 case 1:
40fb9820 6410 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6411 continue;
6412 break;
6413 case 2:
33eaf5de 6414 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6415 only in 32bit mode and we can use opcode 0x90. In 64bit
6416 mode, we can't use 0x90 for xchg %eax, %eax since it should
6417 zero-extend %eax to %rax. */
6418 if (flag_code == CODE_64BIT
6419 && t->base_opcode == 0x90
75e5731b
JB
6420 && i.types[0].bitfield.instance == Accum
6421 && i.types[0].bitfield.dword
6422 && i.types[1].bitfield.instance == Accum
6423 && i.types[1].bitfield.dword)
8b38ad71 6424 continue;
1212781b
JB
6425 /* xrelease mov %eax, <disp> is another special case. It must not
6426 match the accumulator-only encoding of mov. */
6427 if (flag_code != CODE_64BIT
6428 && i.hle_prefix
6429 && t->base_opcode == 0xa0
75e5731b 6430 && i.types[0].bitfield.instance == Accum
8dc0818e 6431 && (i.flags[1] & Operand_Mem))
1212781b 6432 continue;
f5eb1d70
JB
6433 /* Fall through. */
6434
6435 case 3:
3ac21baa
JB
6436 if (!(size_match & MATCH_STRAIGHT))
6437 goto check_reverse;
64c49ab3
JB
6438 /* Reverse direction of operands if swapping is possible in the first
6439 place (operands need to be symmetric) and
6440 - the load form is requested, and the template is a store form,
6441 - the store form is requested, and the template is a load form,
6442 - the non-default (swapped) form is requested. */
6443 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6444 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6445 && !operand_type_all_zero (&overlap1))
6446 switch (i.dir_encoding)
6447 {
6448 case dir_encoding_load:
6449 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6450 || t->opcode_modifier.regmem)
64c49ab3
JB
6451 goto check_reverse;
6452 break;
6453
6454 case dir_encoding_store:
6455 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6456 && !t->opcode_modifier.regmem)
64c49ab3
JB
6457 goto check_reverse;
6458 break;
6459
6460 case dir_encoding_swap:
6461 goto check_reverse;
6462
6463 case dir_encoding_default:
6464 break;
6465 }
86fa6981 6466 /* If we want store form, we skip the current load. */
64c49ab3
JB
6467 if ((i.dir_encoding == dir_encoding_store
6468 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6469 && i.mem_operands == 0
6470 && t->opcode_modifier.load)
fa99fab2 6471 continue;
1a0670f3 6472 /* Fall through. */
f48ff2ae 6473 case 4:
c0f3af97 6474 case 5:
c6fb90c8 6475 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6476 if (!operand_type_match (overlap0, i.types[0])
6477 || !operand_type_match (overlap1, i.types[1])
e2195274 6478 || ((check_register & 3) == 3
dc821c5f 6479 && !operand_type_register_match (i.types[0],
40fb9820 6480 operand_types[0],
dc821c5f 6481 i.types[1],
40fb9820 6482 operand_types[1])))
29b0f896
AM
6483 {
6484 /* Check if other direction is valid ... */
38e314eb 6485 if (!t->opcode_modifier.d)
29b0f896
AM
6486 continue;
6487
dc1e8a47 6488 check_reverse:
3ac21baa
JB
6489 if (!(size_match & MATCH_REVERSE))
6490 continue;
29b0f896 6491 /* Try reversing direction of operands. */
f5eb1d70
JB
6492 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6493 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6494 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6495 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6496 || (check_register
dc821c5f 6497 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6498 operand_types[i.operands - 1],
6499 i.types[i.operands - 1],
45664ddb 6500 operand_types[0])))
29b0f896
AM
6501 {
6502 /* Does not match either direction. */
6503 continue;
6504 }
38e314eb 6505 /* found_reverse_match holds which of D or FloatR
29b0f896 6506 we've found. */
38e314eb
JB
6507 if (!t->opcode_modifier.d)
6508 found_reverse_match = 0;
6509 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6510 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6511 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6512 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6513 || operand_types[0].bitfield.class == RegMMX
6514 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6515 || is_any_vex_encoding(t))
6516 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6517 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6518 else
38e314eb 6519 found_reverse_match = Opcode_D;
40fb9820 6520 if (t->opcode_modifier.floatr)
8a2ed489 6521 found_reverse_match |= Opcode_FloatR;
29b0f896 6522 }
f48ff2ae 6523 else
29b0f896 6524 {
f48ff2ae 6525 /* Found a forward 2 operand match here. */
d1cbb4db
L
6526 switch (t->operands)
6527 {
c0f3af97
L
6528 case 5:
6529 overlap4 = operand_type_and (i.types[4],
6530 operand_types[4]);
1a0670f3 6531 /* Fall through. */
d1cbb4db 6532 case 4:
c6fb90c8
L
6533 overlap3 = operand_type_and (i.types[3],
6534 operand_types[3]);
1a0670f3 6535 /* Fall through. */
d1cbb4db 6536 case 3:
c6fb90c8
L
6537 overlap2 = operand_type_and (i.types[2],
6538 operand_types[2]);
d1cbb4db
L
6539 break;
6540 }
29b0f896 6541
f48ff2ae
L
6542 switch (t->operands)
6543 {
c0f3af97
L
6544 case 5:
6545 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6546 || !operand_type_register_match (i.types[3],
c0f3af97 6547 operand_types[3],
c0f3af97
L
6548 i.types[4],
6549 operand_types[4]))
6550 continue;
1a0670f3 6551 /* Fall through. */
f48ff2ae 6552 case 4:
40fb9820 6553 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6554 || ((check_register & 0xa) == 0xa
6555 && !operand_type_register_match (i.types[1],
f7768225
JB
6556 operand_types[1],
6557 i.types[3],
e2195274
JB
6558 operand_types[3]))
6559 || ((check_register & 0xc) == 0xc
6560 && !operand_type_register_match (i.types[2],
6561 operand_types[2],
6562 i.types[3],
6563 operand_types[3])))
f48ff2ae 6564 continue;
1a0670f3 6565 /* Fall through. */
f48ff2ae
L
6566 case 3:
6567 /* Here we make use of the fact that there are no
23e42951 6568 reverse match 3 operand instructions. */
40fb9820 6569 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6570 || ((check_register & 5) == 5
6571 && !operand_type_register_match (i.types[0],
23e42951
JB
6572 operand_types[0],
6573 i.types[2],
e2195274
JB
6574 operand_types[2]))
6575 || ((check_register & 6) == 6
6576 && !operand_type_register_match (i.types[1],
6577 operand_types[1],
6578 i.types[2],
6579 operand_types[2])))
f48ff2ae
L
6580 continue;
6581 break;
6582 }
29b0f896 6583 }
f48ff2ae 6584 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6585 slip through to break. */
6586 }
c0f3af97 6587
da4977e0
JB
6588 /* Check if vector operands are valid. */
6589 if (check_VecOperands (t))
6590 {
6591 specific_error = i.error;
6592 continue;
6593 }
6594
6595 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6596 if (VEX_check_encoding (t))
5614d22c
JB
6597 {
6598 specific_error = i.error;
6599 continue;
6600 }
a683cc34 6601
29b0f896
AM
6602 /* We've found a match; break out of loop. */
6603 break;
6604 }
6605
6606 if (t == current_templates->end)
6607 {
6608 /* We found no match. */
a65babc9 6609 const char *err_msg;
5614d22c 6610 switch (specific_error ? specific_error : i.error)
a65babc9
L
6611 {
6612 default:
6613 abort ();
86e026a4 6614 case operand_size_mismatch:
a65babc9
L
6615 err_msg = _("operand size mismatch");
6616 break;
6617 case operand_type_mismatch:
6618 err_msg = _("operand type mismatch");
6619 break;
6620 case register_type_mismatch:
6621 err_msg = _("register type mismatch");
6622 break;
6623 case number_of_operands_mismatch:
6624 err_msg = _("number of operands mismatch");
6625 break;
6626 case invalid_instruction_suffix:
6627 err_msg = _("invalid instruction suffix");
6628 break;
6629 case bad_imm4:
4a2608e3 6630 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6631 break;
a65babc9
L
6632 case unsupported_with_intel_mnemonic:
6633 err_msg = _("unsupported with Intel mnemonic");
6634 break;
6635 case unsupported_syntax:
6636 err_msg = _("unsupported syntax");
6637 break;
6638 case unsupported:
35262a23 6639 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6640 current_templates->start->name);
6641 return NULL;
260cd341
LC
6642 case invalid_sib_address:
6643 err_msg = _("invalid SIB address");
6644 break;
6c30d220
L
6645 case invalid_vsib_address:
6646 err_msg = _("invalid VSIB address");
6647 break;
7bab8ab5
JB
6648 case invalid_vector_register_set:
6649 err_msg = _("mask, index, and destination registers must be distinct");
6650 break;
260cd341
LC
6651 case invalid_tmm_register_set:
6652 err_msg = _("all tmm registers must be distinct");
6653 break;
6c30d220
L
6654 case unsupported_vector_index_register:
6655 err_msg = _("unsupported vector index register");
6656 break;
43234a1e
L
6657 case unsupported_broadcast:
6658 err_msg = _("unsupported broadcast");
6659 break;
43234a1e
L
6660 case broadcast_needed:
6661 err_msg = _("broadcast is needed for operand of such type");
6662 break;
6663 case unsupported_masking:
6664 err_msg = _("unsupported masking");
6665 break;
6666 case mask_not_on_destination:
6667 err_msg = _("mask not on destination operand");
6668 break;
6669 case no_default_mask:
6670 err_msg = _("default mask isn't allowed");
6671 break;
6672 case unsupported_rc_sae:
6673 err_msg = _("unsupported static rounding/sae");
6674 break;
6675 case rc_sae_operand_not_last_imm:
6676 if (intel_syntax)
6677 err_msg = _("RC/SAE operand must precede immediate operands");
6678 else
6679 err_msg = _("RC/SAE operand must follow immediate operands");
6680 break;
6681 case invalid_register_operand:
6682 err_msg = _("invalid register operand");
6683 break;
a65babc9
L
6684 }
6685 as_bad (_("%s for `%s'"), err_msg,
891edac4 6686 current_templates->start->name);
fa99fab2 6687 return NULL;
29b0f896 6688 }
252b5132 6689
29b0f896
AM
6690 if (!quiet_warnings)
6691 {
6692 if (!intel_syntax
0cfa3eb3 6693 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6694 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6695
40fb9820 6696 if (t->opcode_modifier.isprefix
3cd7f3e3 6697 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6698 {
6699 /* Warn them that a data or address size prefix doesn't
6700 affect assembly of the next line of code. */
6701 as_warn (_("stand-alone `%s' prefix"), t->name);
6702 }
6703 }
6704
6705 /* Copy the template we found. */
6706 i.tm = *t;
539e75ad
L
6707
6708 if (addr_prefix_disp != -1)
6709 i.tm.operand_types[addr_prefix_disp]
6710 = operand_types[addr_prefix_disp];
6711
29b0f896
AM
6712 if (found_reverse_match)
6713 {
dfd69174
JB
6714 /* If we found a reverse match we must alter the opcode direction
6715 bit and clear/flip the regmem modifier one. found_reverse_match
6716 holds bits to change (different for int & float insns). */
29b0f896
AM
6717
6718 i.tm.base_opcode ^= found_reverse_match;
6719
f5eb1d70
JB
6720 i.tm.operand_types[0] = operand_types[i.operands - 1];
6721 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6722
6723 /* Certain SIMD insns have their load forms specified in the opcode
6724 table, and hence we need to _set_ RegMem instead of clearing it.
6725 We need to avoid setting the bit though on insns like KMOVW. */
6726 i.tm.opcode_modifier.regmem
6727 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6728 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6729 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6730 }
6731
fa99fab2 6732 return t;
29b0f896
AM
6733}
6734
6735static int
e3bb37b5 6736check_string (void)
29b0f896 6737{
51c8edf6
JB
6738 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6739 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6740
51c8edf6 6741 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6742 {
51c8edf6
JB
6743 as_bad (_("`%s' operand %u must use `%ses' segment"),
6744 i.tm.name,
6745 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6746 register_prefix);
6747 return 0;
29b0f896 6748 }
51c8edf6
JB
6749
6750 /* There's only ever one segment override allowed per instruction.
6751 This instruction possibly has a legal segment override on the
6752 second operand, so copy the segment to where non-string
6753 instructions store it, allowing common code. */
6754 i.seg[op] = i.seg[1];
6755
29b0f896
AM
6756 return 1;
6757}
6758
6759static int
543613e9 6760process_suffix (void)
29b0f896
AM
6761{
6762 /* If matched instruction specifies an explicit instruction mnemonic
6763 suffix, use it. */
673fe0f0 6764 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6765 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6766 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6767 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6768 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6769 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6770 else if (i.reg_operands
c8f8eebc
JB
6771 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6772 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6773 {
65fca059
JB
6774 unsigned int numop = i.operands;
6775
6776 /* movsx/movzx want only their source operand considered here, for the
6777 ambiguity checking below. The suffix will be replaced afterwards
6778 to represent the destination (register). */
6779 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6780 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6781 --i.operands;
6782
643bb870
JB
6783 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6784 if (i.tm.base_opcode == 0xf20f38f0
6785 && i.tm.operand_types[1].bitfield.qword)
6786 i.rex |= REX_W;
6787
29b0f896 6788 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6789 based on GPR operands. */
29b0f896
AM
6790 if (!i.suffix)
6791 {
6792 /* We take i.suffix from the last register operand specified,
6793 Destination register type is more significant than source
381d071f
L
6794 register type. crc32 in SSE4.2 prefers source register
6795 type. */
1a035124 6796 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6797
1a035124
JB
6798 while (op--)
6799 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6800 || i.tm.operand_types[op].bitfield.instance == Accum)
6801 {
6802 if (i.types[op].bitfield.class != Reg)
6803 continue;
6804 if (i.types[op].bitfield.byte)
6805 i.suffix = BYTE_MNEM_SUFFIX;
6806 else if (i.types[op].bitfield.word)
6807 i.suffix = WORD_MNEM_SUFFIX;
6808 else if (i.types[op].bitfield.dword)
6809 i.suffix = LONG_MNEM_SUFFIX;
6810 else if (i.types[op].bitfield.qword)
6811 i.suffix = QWORD_MNEM_SUFFIX;
6812 else
6813 continue;
6814 break;
6815 }
65fca059
JB
6816
6817 /* As an exception, movsx/movzx silently default to a byte source
6818 in AT&T mode. */
6819 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6820 && !i.suffix && !intel_syntax)
6821 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6822 }
6823 else if (i.suffix == BYTE_MNEM_SUFFIX)
6824 {
2eb952a4 6825 if (intel_syntax
3cd7f3e3 6826 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6827 && i.tm.opcode_modifier.no_bsuf)
6828 i.suffix = 0;
6829 else if (!check_byte_reg ())
29b0f896
AM
6830 return 0;
6831 }
6832 else if (i.suffix == LONG_MNEM_SUFFIX)
6833 {
2eb952a4 6834 if (intel_syntax
3cd7f3e3 6835 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6836 && i.tm.opcode_modifier.no_lsuf
6837 && !i.tm.opcode_modifier.todword
6838 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6839 i.suffix = 0;
6840 else if (!check_long_reg ())
29b0f896
AM
6841 return 0;
6842 }
6843 else if (i.suffix == QWORD_MNEM_SUFFIX)
6844 {
955e1e6a 6845 if (intel_syntax
3cd7f3e3 6846 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6847 && i.tm.opcode_modifier.no_qsuf
6848 && !i.tm.opcode_modifier.todword
6849 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6850 i.suffix = 0;
6851 else if (!check_qword_reg ())
29b0f896
AM
6852 return 0;
6853 }
6854 else if (i.suffix == WORD_MNEM_SUFFIX)
6855 {
2eb952a4 6856 if (intel_syntax
3cd7f3e3 6857 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6858 && i.tm.opcode_modifier.no_wsuf)
6859 i.suffix = 0;
6860 else if (!check_word_reg ())
29b0f896
AM
6861 return 0;
6862 }
3cd7f3e3
L
6863 else if (intel_syntax
6864 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6865 /* Do nothing if the instruction is going to ignore the prefix. */
6866 ;
6867 else
6868 abort ();
65fca059
JB
6869
6870 /* Undo the movsx/movzx change done above. */
6871 i.operands = numop;
29b0f896 6872 }
3cd7f3e3
L
6873 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6874 && !i.suffix)
29b0f896 6875 {
13e600d0
JB
6876 i.suffix = stackop_size;
6877 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6878 {
6879 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6880 .code16gcc directive to support 16-bit mode with
6881 32-bit address. For IRET without a suffix, generate
6882 16-bit IRET (opcode 0xcf) to return from an interrupt
6883 handler. */
13e600d0
JB
6884 if (i.tm.base_opcode == 0xcf)
6885 {
6886 i.suffix = WORD_MNEM_SUFFIX;
6887 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6888 }
6889 /* Warn about changed behavior for segment register push/pop. */
6890 else if ((i.tm.base_opcode | 1) == 0x07)
6891 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6892 i.tm.name);
06f74c5c 6893 }
29b0f896 6894 }
c006a730 6895 else if (!i.suffix
0cfa3eb3
JB
6896 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6897 || i.tm.opcode_modifier.jump == JUMP_BYTE
6898 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6899 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6900 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6901 {
6902 switch (flag_code)
6903 {
6904 case CODE_64BIT:
40fb9820 6905 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6906 {
828c2a25
JB
6907 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6908 || i.tm.opcode_modifier.no_lsuf)
6909 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6910 break;
6911 }
1a0670f3 6912 /* Fall through. */
9306ca4a 6913 case CODE_32BIT:
40fb9820 6914 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6915 i.suffix = LONG_MNEM_SUFFIX;
6916 break;
6917 case CODE_16BIT:
40fb9820 6918 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6919 i.suffix = WORD_MNEM_SUFFIX;
6920 break;
6921 }
6922 }
252b5132 6923
c006a730 6924 if (!i.suffix
3cd7f3e3 6925 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6926 /* Also cover lret/retf/iret in 64-bit mode. */
6927 || (flag_code == CODE_64BIT
6928 && !i.tm.opcode_modifier.no_lsuf
6929 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6930 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
6931 /* Explicit sizing prefixes are assumed to disambiguate insns. */
6932 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
6933 /* Accept FLDENV et al without suffix. */
6934 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6935 {
6c0946d0 6936 unsigned int suffixes, evex = 0;
c006a730
JB
6937
6938 suffixes = !i.tm.opcode_modifier.no_bsuf;
6939 if (!i.tm.opcode_modifier.no_wsuf)
6940 suffixes |= 1 << 1;
6941 if (!i.tm.opcode_modifier.no_lsuf)
6942 suffixes |= 1 << 2;
6943 if (!i.tm.opcode_modifier.no_ldsuf)
6944 suffixes |= 1 << 3;
6945 if (!i.tm.opcode_modifier.no_ssuf)
6946 suffixes |= 1 << 4;
6947 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6948 suffixes |= 1 << 5;
6949
6c0946d0
JB
6950 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6951 also suitable for AT&T syntax mode, it was requested that this be
6952 restricted to just Intel syntax. */
b9915cbc 6953 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6954 {
b9915cbc 6955 unsigned int op;
6c0946d0 6956
b9915cbc 6957 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6958 {
b9915cbc
JB
6959 if (is_evex_encoding (&i.tm)
6960 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6961 {
b9915cbc
JB
6962 if (i.tm.operand_types[op].bitfield.ymmword)
6963 i.tm.operand_types[op].bitfield.xmmword = 0;
6964 if (i.tm.operand_types[op].bitfield.zmmword)
6965 i.tm.operand_types[op].bitfield.ymmword = 0;
6966 if (!i.tm.opcode_modifier.evex
6967 || i.tm.opcode_modifier.evex == EVEXDYN)
6968 i.tm.opcode_modifier.evex = EVEX512;
6969 }
6c0946d0 6970
b9915cbc
JB
6971 if (i.tm.operand_types[op].bitfield.xmmword
6972 + i.tm.operand_types[op].bitfield.ymmword
6973 + i.tm.operand_types[op].bitfield.zmmword < 2)
6974 continue;
6c0946d0 6975
b9915cbc
JB
6976 /* Any properly sized operand disambiguates the insn. */
6977 if (i.types[op].bitfield.xmmword
6978 || i.types[op].bitfield.ymmword
6979 || i.types[op].bitfield.zmmword)
6980 {
6981 suffixes &= ~(7 << 6);
6982 evex = 0;
6983 break;
6984 }
6c0946d0 6985
b9915cbc
JB
6986 if ((i.flags[op] & Operand_Mem)
6987 && i.tm.operand_types[op].bitfield.unspecified)
6988 {
6989 if (i.tm.operand_types[op].bitfield.xmmword)
6990 suffixes |= 1 << 6;
6991 if (i.tm.operand_types[op].bitfield.ymmword)
6992 suffixes |= 1 << 7;
6993 if (i.tm.operand_types[op].bitfield.zmmword)
6994 suffixes |= 1 << 8;
6995 if (is_evex_encoding (&i.tm))
6996 evex = EVEX512;
6c0946d0
JB
6997 }
6998 }
6999 }
7000
7001 /* Are multiple suffixes / operand sizes allowed? */
c006a730 7002 if (suffixes & (suffixes - 1))
9306ca4a 7003 {
873494c8 7004 if (intel_syntax
3cd7f3e3 7005 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 7006 || operand_check == check_error))
9306ca4a 7007 {
c006a730 7008 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
7009 return 0;
7010 }
c006a730 7011 if (operand_check == check_error)
9306ca4a 7012 {
c006a730
JB
7013 as_bad (_("no instruction mnemonic suffix given and "
7014 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
7015 return 0;
7016 }
c006a730 7017 if (operand_check == check_warning)
873494c8
JB
7018 as_warn (_("%s; using default for `%s'"),
7019 intel_syntax
7020 ? _("ambiguous operand size")
7021 : _("no instruction mnemonic suffix given and "
7022 "no register operands"),
7023 i.tm.name);
c006a730
JB
7024
7025 if (i.tm.opcode_modifier.floatmf)
7026 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
7027 else if ((i.tm.base_opcode | 8) == 0xfbe
7028 || (i.tm.base_opcode == 0x63
7029 && i.tm.cpu_flags.bitfield.cpu64))
7030 /* handled below */;
6c0946d0
JB
7031 else if (evex)
7032 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7033 else if (flag_code == CODE_16BIT)
7034 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7035 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7036 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7037 else
7038 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7039 }
29b0f896 7040 }
252b5132 7041
65fca059
JB
7042 if ((i.tm.base_opcode | 8) == 0xfbe
7043 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
7044 {
7045 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7046 In AT&T syntax, if there is no suffix (warned about above), the default
7047 will be byte extension. */
7048 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7049 i.tm.base_opcode |= 1;
7050
7051 /* For further processing, the suffix should represent the destination
7052 (register). This is already the case when one was used with
7053 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7054 no suffix to begin with. */
7055 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7056 {
7057 if (i.types[1].bitfield.word)
7058 i.suffix = WORD_MNEM_SUFFIX;
7059 else if (i.types[1].bitfield.qword)
7060 i.suffix = QWORD_MNEM_SUFFIX;
7061 else
7062 i.suffix = LONG_MNEM_SUFFIX;
7063
7064 i.tm.opcode_modifier.w = 0;
7065 }
7066 }
7067
50128d0c
JB
7068 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7069 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7070 != (i.tm.operand_types[1].bitfield.class == Reg);
7071
d2224064
JB
7072 /* Change the opcode based on the operand size given by i.suffix. */
7073 switch (i.suffix)
29b0f896 7074 {
d2224064
JB
7075 /* Size floating point instruction. */
7076 case LONG_MNEM_SUFFIX:
7077 if (i.tm.opcode_modifier.floatmf)
7078 {
7079 i.tm.base_opcode ^= 4;
7080 break;
7081 }
7082 /* fall through */
7083 case WORD_MNEM_SUFFIX:
7084 case QWORD_MNEM_SUFFIX:
29b0f896 7085 /* It's not a byte, select word/dword operation. */
40fb9820 7086 if (i.tm.opcode_modifier.w)
29b0f896 7087 {
50128d0c 7088 if (i.short_form)
29b0f896
AM
7089 i.tm.base_opcode |= 8;
7090 else
7091 i.tm.base_opcode |= 1;
7092 }
d2224064
JB
7093 /* fall through */
7094 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7095 /* Now select between word & dword operations via the operand
7096 size prefix, except for instructions that will ignore this
7097 prefix anyway. */
c8f8eebc 7098 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7099 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7100 && !i.tm.opcode_modifier.floatmf
7101 && !is_any_vex_encoding (&i.tm)
7102 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7103 || (flag_code == CODE_64BIT
7104 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7105 {
7106 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7107
0cfa3eb3 7108 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7109 prefix = ADDR_PREFIX_OPCODE;
252b5132 7110
29b0f896
AM
7111 if (!add_prefix (prefix))
7112 return 0;
24eab124 7113 }
252b5132 7114
29b0f896
AM
7115 /* Set mode64 for an operand. */
7116 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7117 && flag_code == CODE_64BIT
d2224064 7118 && !i.tm.opcode_modifier.norex64
4ed21b58 7119 && !i.tm.opcode_modifier.vexw
46e883c5 7120 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7121 need rex64. */
7122 && ! (i.operands == 2
7123 && i.tm.base_opcode == 0x90
7124 && i.tm.extension_opcode == None
75e5731b
JB
7125 && i.types[0].bitfield.instance == Accum
7126 && i.types[0].bitfield.qword
7127 && i.types[1].bitfield.instance == Accum
7128 && i.types[1].bitfield.qword))
d2224064 7129 i.rex |= REX_W;
3e73aa7c 7130
d2224064 7131 break;
8bbb3ad8
JB
7132
7133 case 0:
7134 /* Select word/dword/qword operation with explict data sizing prefix
7135 when there are no suitable register operands. */
7136 if (i.tm.opcode_modifier.w
7137 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7138 && (!i.reg_operands
7139 || (i.reg_operands == 1
7140 /* ShiftCount */
7141 && (i.tm.operand_types[0].bitfield.instance == RegC
7142 /* InOutPortReg */
7143 || i.tm.operand_types[0].bitfield.instance == RegD
7144 || i.tm.operand_types[1].bitfield.instance == RegD
7145 /* CRC32 */
7146 || i.tm.base_opcode == 0xf20f38f0))))
7147 i.tm.base_opcode |= 1;
7148 break;
29b0f896 7149 }
7ecd2f8b 7150
c8f8eebc 7151 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7152 {
c8f8eebc
JB
7153 gas_assert (!i.suffix);
7154 gas_assert (i.reg_operands);
c0a30a9f 7155
c8f8eebc
JB
7156 if (i.tm.operand_types[0].bitfield.instance == Accum
7157 || i.operands == 1)
7158 {
7159 /* The address size override prefix changes the size of the
7160 first operand. */
7161 if (flag_code == CODE_64BIT
7162 && i.op[0].regs->reg_type.bitfield.word)
7163 {
7164 as_bad (_("16-bit addressing unavailable for `%s'"),
7165 i.tm.name);
7166 return 0;
7167 }
7168
7169 if ((flag_code == CODE_32BIT
7170 ? i.op[0].regs->reg_type.bitfield.word
7171 : i.op[0].regs->reg_type.bitfield.dword)
7172 && !add_prefix (ADDR_PREFIX_OPCODE))
7173 return 0;
7174 }
c0a30a9f
L
7175 else
7176 {
c8f8eebc
JB
7177 /* Check invalid register operand when the address size override
7178 prefix changes the size of register operands. */
7179 unsigned int op;
7180 enum { need_word, need_dword, need_qword } need;
7181
27f13469 7182 /* Check the register operand for the address size prefix if
b3a3496f
L
7183 the memory operand has no real registers, like symbol, DISP
7184 or symbol(%rip). */
27f13469
L
7185 if (i.mem_operands == 1
7186 && i.reg_operands == 1
7187 && i.operands == 2
27f13469 7188 && i.types[1].bitfield.class == Reg
b3a3496f
L
7189 && (flag_code == CODE_32BIT
7190 ? i.op[1].regs->reg_type.bitfield.word
7191 : i.op[1].regs->reg_type.bitfield.dword)
7192 && ((i.base_reg == NULL && i.index_reg == NULL)
7193 || (i.base_reg
7194 && i.base_reg->reg_num == RegIP
7195 && i.base_reg->reg_type.bitfield.qword))
27f13469
L
7196 && !add_prefix (ADDR_PREFIX_OPCODE))
7197 return 0;
7198
c8f8eebc
JB
7199 if (flag_code == CODE_32BIT)
7200 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7201 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7202 need = need_dword;
7203 else
7204 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7205
c8f8eebc
JB
7206 for (op = 0; op < i.operands; op++)
7207 {
7208 if (i.types[op].bitfield.class != Reg)
7209 continue;
7210
7211 switch (need)
7212 {
7213 case need_word:
7214 if (i.op[op].regs->reg_type.bitfield.word)
7215 continue;
7216 break;
7217 case need_dword:
7218 if (i.op[op].regs->reg_type.bitfield.dword)
7219 continue;
7220 break;
7221 case need_qword:
7222 if (i.op[op].regs->reg_type.bitfield.qword)
7223 continue;
7224 break;
7225 }
7226
7227 as_bad (_("invalid register operand size for `%s'"),
7228 i.tm.name);
7229 return 0;
7230 }
7231 }
c0a30a9f
L
7232 }
7233
29b0f896
AM
7234 return 1;
7235}
3e73aa7c 7236
29b0f896 7237static int
543613e9 7238check_byte_reg (void)
29b0f896
AM
7239{
7240 int op;
543613e9 7241
29b0f896
AM
7242 for (op = i.operands; --op >= 0;)
7243 {
dc821c5f 7244 /* Skip non-register operands. */
bab6aec1 7245 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7246 continue;
7247
29b0f896
AM
7248 /* If this is an eight bit register, it's OK. If it's the 16 or
7249 32 bit version of an eight bit register, we will just use the
7250 low portion, and that's OK too. */
dc821c5f 7251 if (i.types[op].bitfield.byte)
29b0f896
AM
7252 continue;
7253
5a819eb9 7254 /* I/O port address operands are OK too. */
75e5731b
JB
7255 if (i.tm.operand_types[op].bitfield.instance == RegD
7256 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7257 continue;
7258
9706160a
JB
7259 /* crc32 only wants its source operand checked here. */
7260 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7261 continue;
7262
29b0f896 7263 /* Any other register is bad. */
73c76375
JB
7264 as_bad (_("`%s%s' not allowed with `%s%c'"),
7265 register_prefix, i.op[op].regs->reg_name,
7266 i.tm.name, i.suffix);
7267 return 0;
29b0f896
AM
7268 }
7269 return 1;
7270}
7271
7272static int
e3bb37b5 7273check_long_reg (void)
29b0f896
AM
7274{
7275 int op;
7276
7277 for (op = i.operands; --op >= 0;)
dc821c5f 7278 /* Skip non-register operands. */
bab6aec1 7279 if (i.types[op].bitfield.class != Reg)
dc821c5f 7280 continue;
29b0f896
AM
7281 /* Reject eight bit registers, except where the template requires
7282 them. (eg. movzb) */
dc821c5f 7283 else if (i.types[op].bitfield.byte
bab6aec1 7284 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7285 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7286 && (i.tm.operand_types[op].bitfield.word
7287 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7288 {
a540244d
L
7289 as_bad (_("`%s%s' not allowed with `%s%c'"),
7290 register_prefix,
29b0f896
AM
7291 i.op[op].regs->reg_name,
7292 i.tm.name,
7293 i.suffix);
7294 return 0;
7295 }
be4c5e58
L
7296 /* Error if the e prefix on a general reg is missing. */
7297 else if (i.types[op].bitfield.word
bab6aec1 7298 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7299 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7300 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7301 {
be4c5e58
L
7302 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7303 register_prefix, i.op[op].regs->reg_name,
7304 i.suffix);
7305 return 0;
252b5132 7306 }
e4630f71 7307 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7308 else if (i.types[op].bitfield.qword
bab6aec1 7309 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7310 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7311 && i.tm.operand_types[op].bitfield.dword)
252b5132 7312 {
34828aad 7313 if (intel_syntax
65fca059 7314 && i.tm.opcode_modifier.toqword
3528c362 7315 && i.types[0].bitfield.class != RegSIMD)
34828aad 7316 {
ca61edf2 7317 /* Convert to QWORD. We want REX byte. */
34828aad
L
7318 i.suffix = QWORD_MNEM_SUFFIX;
7319 }
7320 else
7321 {
2b5d6a91 7322 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7323 register_prefix, i.op[op].regs->reg_name,
7324 i.suffix);
7325 return 0;
7326 }
29b0f896
AM
7327 }
7328 return 1;
7329}
252b5132 7330
29b0f896 7331static int
e3bb37b5 7332check_qword_reg (void)
29b0f896
AM
7333{
7334 int op;
252b5132 7335
29b0f896 7336 for (op = i.operands; --op >= 0; )
dc821c5f 7337 /* Skip non-register operands. */
bab6aec1 7338 if (i.types[op].bitfield.class != Reg)
dc821c5f 7339 continue;
29b0f896
AM
7340 /* Reject eight bit registers, except where the template requires
7341 them. (eg. movzb) */
dc821c5f 7342 else if (i.types[op].bitfield.byte
bab6aec1 7343 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7344 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7345 && (i.tm.operand_types[op].bitfield.word
7346 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7347 {
a540244d
L
7348 as_bad (_("`%s%s' not allowed with `%s%c'"),
7349 register_prefix,
29b0f896
AM
7350 i.op[op].regs->reg_name,
7351 i.tm.name,
7352 i.suffix);
7353 return 0;
7354 }
e4630f71 7355 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7356 else if ((i.types[op].bitfield.word
7357 || i.types[op].bitfield.dword)
bab6aec1 7358 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7359 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7360 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7361 {
7362 /* Prohibit these changes in the 64bit mode, since the
7363 lowering is more complicated. */
34828aad 7364 if (intel_syntax
ca61edf2 7365 && i.tm.opcode_modifier.todword
3528c362 7366 && i.types[0].bitfield.class != RegSIMD)
34828aad 7367 {
ca61edf2 7368 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7369 i.suffix = LONG_MNEM_SUFFIX;
7370 }
7371 else
7372 {
2b5d6a91 7373 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7374 register_prefix, i.op[op].regs->reg_name,
7375 i.suffix);
7376 return 0;
7377 }
252b5132 7378 }
29b0f896
AM
7379 return 1;
7380}
252b5132 7381
29b0f896 7382static int
e3bb37b5 7383check_word_reg (void)
29b0f896
AM
7384{
7385 int op;
7386 for (op = i.operands; --op >= 0;)
dc821c5f 7387 /* Skip non-register operands. */
bab6aec1 7388 if (i.types[op].bitfield.class != Reg)
dc821c5f 7389 continue;
29b0f896
AM
7390 /* Reject eight bit registers, except where the template requires
7391 them. (eg. movzb) */
dc821c5f 7392 else if (i.types[op].bitfield.byte
bab6aec1 7393 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7394 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7395 && (i.tm.operand_types[op].bitfield.word
7396 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7397 {
a540244d
L
7398 as_bad (_("`%s%s' not allowed with `%s%c'"),
7399 register_prefix,
29b0f896
AM
7400 i.op[op].regs->reg_name,
7401 i.tm.name,
7402 i.suffix);
7403 return 0;
7404 }
9706160a
JB
7405 /* Error if the e or r prefix on a general reg is present. */
7406 else if ((i.types[op].bitfield.dword
dc821c5f 7407 || i.types[op].bitfield.qword)
bab6aec1 7408 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7409 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7410 && i.tm.operand_types[op].bitfield.word)
252b5132 7411 {
9706160a
JB
7412 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7413 register_prefix, i.op[op].regs->reg_name,
7414 i.suffix);
7415 return 0;
29b0f896
AM
7416 }
7417 return 1;
7418}
252b5132 7419
29b0f896 7420static int
40fb9820 7421update_imm (unsigned int j)
29b0f896 7422{
bc0844ae 7423 i386_operand_type overlap = i.types[j];
40fb9820
L
7424 if ((overlap.bitfield.imm8
7425 || overlap.bitfield.imm8s
7426 || overlap.bitfield.imm16
7427 || overlap.bitfield.imm32
7428 || overlap.bitfield.imm32s
7429 || overlap.bitfield.imm64)
0dfbf9d7
L
7430 && !operand_type_equal (&overlap, &imm8)
7431 && !operand_type_equal (&overlap, &imm8s)
7432 && !operand_type_equal (&overlap, &imm16)
7433 && !operand_type_equal (&overlap, &imm32)
7434 && !operand_type_equal (&overlap, &imm32s)
7435 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7436 {
7437 if (i.suffix)
7438 {
40fb9820
L
7439 i386_operand_type temp;
7440
0dfbf9d7 7441 operand_type_set (&temp, 0);
7ab9ffdd 7442 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7443 {
7444 temp.bitfield.imm8 = overlap.bitfield.imm8;
7445 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7446 }
7447 else if (i.suffix == WORD_MNEM_SUFFIX)
7448 temp.bitfield.imm16 = overlap.bitfield.imm16;
7449 else if (i.suffix == QWORD_MNEM_SUFFIX)
7450 {
7451 temp.bitfield.imm64 = overlap.bitfield.imm64;
7452 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7453 }
7454 else
7455 temp.bitfield.imm32 = overlap.bitfield.imm32;
7456 overlap = temp;
29b0f896 7457 }
0dfbf9d7
L
7458 else if (operand_type_equal (&overlap, &imm16_32_32s)
7459 || operand_type_equal (&overlap, &imm16_32)
7460 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7461 {
40fb9820 7462 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7463 overlap = imm16;
40fb9820 7464 else
65da13b5 7465 overlap = imm32s;
29b0f896 7466 }
8bbb3ad8
JB
7467 else if (i.prefix[REX_PREFIX] & REX_W)
7468 overlap = operand_type_and (overlap, imm32s);
7469 else if (i.prefix[DATA_PREFIX])
7470 overlap = operand_type_and (overlap,
7471 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7472 if (!operand_type_equal (&overlap, &imm8)
7473 && !operand_type_equal (&overlap, &imm8s)
7474 && !operand_type_equal (&overlap, &imm16)
7475 && !operand_type_equal (&overlap, &imm32)
7476 && !operand_type_equal (&overlap, &imm32s)
7477 && !operand_type_equal (&overlap, &imm64))
29b0f896 7478 {
4eed87de
AM
7479 as_bad (_("no instruction mnemonic suffix given; "
7480 "can't determine immediate size"));
29b0f896
AM
7481 return 0;
7482 }
7483 }
40fb9820 7484 i.types[j] = overlap;
29b0f896 7485
40fb9820
L
7486 return 1;
7487}
7488
7489static int
7490finalize_imm (void)
7491{
bc0844ae 7492 unsigned int j, n;
29b0f896 7493
bc0844ae
L
7494 /* Update the first 2 immediate operands. */
7495 n = i.operands > 2 ? 2 : i.operands;
7496 if (n)
7497 {
7498 for (j = 0; j < n; j++)
7499 if (update_imm (j) == 0)
7500 return 0;
40fb9820 7501
bc0844ae
L
7502 /* The 3rd operand can't be immediate operand. */
7503 gas_assert (operand_type_check (i.types[2], imm) == 0);
7504 }
29b0f896
AM
7505
7506 return 1;
7507}
7508
7509static int
e3bb37b5 7510process_operands (void)
29b0f896
AM
7511{
7512 /* Default segment register this instruction will use for memory
7513 accesses. 0 means unknown. This is only for optimizing out
7514 unnecessary segment overrides. */
7515 const seg_entry *default_seg = 0;
7516
a5aeccd9
JB
7517 if (i.tm.opcode_modifier.sse2avx)
7518 {
7519 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7520 need converting. */
7521 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7522 i.prefix[REX_PREFIX] = 0;
7523 i.rex_encoding = 0;
7524 }
c423d21a
JB
7525 /* ImmExt should be processed after SSE2AVX. */
7526 else if (i.tm.opcode_modifier.immext)
7527 process_immext ();
a5aeccd9 7528
2426c15f 7529 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7530 {
91d6fa6a
NC
7531 unsigned int dupl = i.operands;
7532 unsigned int dest = dupl - 1;
9fcfb3d7
L
7533 unsigned int j;
7534
c0f3af97 7535 /* The destination must be an xmm register. */
9c2799c2 7536 gas_assert (i.reg_operands
91d6fa6a 7537 && MAX_OPERANDS > dupl
7ab9ffdd 7538 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7539
75e5731b 7540 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7541 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7542 {
8cd7925b 7543 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7544 {
7545 /* Keep xmm0 for instructions with VEX prefix and 3
7546 sources. */
75e5731b 7547 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7548 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7549 goto duplicate;
7550 }
e2ec9d29 7551 else
c0f3af97
L
7552 {
7553 /* We remove the first xmm0 and keep the number of
7554 operands unchanged, which in fact duplicates the
7555 destination. */
7556 for (j = 1; j < i.operands; j++)
7557 {
7558 i.op[j - 1] = i.op[j];
7559 i.types[j - 1] = i.types[j];
7560 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7561 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7562 }
7563 }
7564 }
7565 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7566 {
91d6fa6a 7567 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7568 && (i.tm.opcode_modifier.vexsources
7569 == VEX3SOURCES));
c0f3af97
L
7570
7571 /* Add the implicit xmm0 for instructions with VEX prefix
7572 and 3 sources. */
7573 for (j = i.operands; j > 0; j--)
7574 {
7575 i.op[j] = i.op[j - 1];
7576 i.types[j] = i.types[j - 1];
7577 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7578 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7579 }
7580 i.op[0].regs
629310ab 7581 = (const reg_entry *) str_hash_find (reg_hash, "xmm0");
7ab9ffdd 7582 i.types[0] = regxmm;
c0f3af97
L
7583 i.tm.operand_types[0] = regxmm;
7584
7585 i.operands += 2;
7586 i.reg_operands += 2;
7587 i.tm.operands += 2;
7588
91d6fa6a 7589 dupl++;
c0f3af97 7590 dest++;
91d6fa6a
NC
7591 i.op[dupl] = i.op[dest];
7592 i.types[dupl] = i.types[dest];
7593 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7594 i.flags[dupl] = i.flags[dest];
e2ec9d29 7595 }
c0f3af97
L
7596 else
7597 {
dc1e8a47 7598 duplicate:
c0f3af97
L
7599 i.operands++;
7600 i.reg_operands++;
7601 i.tm.operands++;
7602
91d6fa6a
NC
7603 i.op[dupl] = i.op[dest];
7604 i.types[dupl] = i.types[dest];
7605 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7606 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7607 }
7608
7609 if (i.tm.opcode_modifier.immext)
7610 process_immext ();
7611 }
75e5731b 7612 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7613 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7614 {
7615 unsigned int j;
7616
9fcfb3d7
L
7617 for (j = 1; j < i.operands; j++)
7618 {
7619 i.op[j - 1] = i.op[j];
7620 i.types[j - 1] = i.types[j];
7621
7622 /* We need to adjust fields in i.tm since they are used by
7623 build_modrm_byte. */
7624 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7625
7626 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7627 }
7628
e2ec9d29
L
7629 i.operands--;
7630 i.reg_operands--;
e2ec9d29
L
7631 i.tm.operands--;
7632 }
920d2ddc
IT
7633 else if (i.tm.opcode_modifier.implicitquadgroup)
7634 {
a477a8c4
JB
7635 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7636
920d2ddc 7637 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7638 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7639 regnum = register_number (i.op[1].regs);
7640 first_reg_in_group = regnum & ~3;
7641 last_reg_in_group = first_reg_in_group + 3;
7642 if (regnum != first_reg_in_group)
7643 as_warn (_("source register `%s%s' implicitly denotes"
7644 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7645 register_prefix, i.op[1].regs->reg_name,
7646 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7647 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7648 i.tm.name);
7649 }
e2ec9d29
L
7650 else if (i.tm.opcode_modifier.regkludge)
7651 {
7652 /* The imul $imm, %reg instruction is converted into
7653 imul $imm, %reg, %reg, and the clr %reg instruction
7654 is converted into xor %reg, %reg. */
7655
7656 unsigned int first_reg_op;
7657
7658 if (operand_type_check (i.types[0], reg))
7659 first_reg_op = 0;
7660 else
7661 first_reg_op = 1;
7662 /* Pretend we saw the extra register operand. */
9c2799c2 7663 gas_assert (i.reg_operands == 1
7ab9ffdd 7664 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7665 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7666 i.types[first_reg_op + 1] = i.types[first_reg_op];
7667 i.operands++;
7668 i.reg_operands++;
29b0f896
AM
7669 }
7670
85b80b0f 7671 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7672 {
7673 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7674 must be put into the modrm byte). Now, we make the modrm and
7675 index base bytes based on all the info we've collected. */
29b0f896
AM
7676
7677 default_seg = build_modrm_byte ();
7678 }
00cee14f 7679 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7680 {
7681 if (flag_code != CODE_64BIT
7682 ? i.tm.base_opcode == POP_SEG_SHORT
7683 && i.op[0].regs->reg_num == 1
7684 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7685 && i.op[0].regs->reg_num < 4)
7686 {
7687 as_bad (_("you can't `%s %s%s'"),
7688 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7689 return 0;
7690 }
7691 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7692 {
7693 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7694 i.tm.opcode_length = 2;
7695 }
7696 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7697 }
8a2ed489 7698 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7699 {
7700 default_seg = &ds;
7701 }
40fb9820 7702 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7703 {
7704 /* For the string instructions that allow a segment override
7705 on one of their operands, the default segment is ds. */
7706 default_seg = &ds;
7707 }
50128d0c 7708 else if (i.short_form)
85b80b0f
JB
7709 {
7710 /* The register or float register operand is in operand
7711 0 or 1. */
bab6aec1 7712 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7713
7714 /* Register goes in low 3 bits of opcode. */
7715 i.tm.base_opcode |= i.op[op].regs->reg_num;
7716 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7717 i.rex |= REX_B;
7718 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7719 {
7720 /* Warn about some common errors, but press on regardless.
7721 The first case can be generated by gcc (<= 2.8.1). */
7722 if (i.operands == 2)
7723 {
7724 /* Reversed arguments on faddp, fsubp, etc. */
7725 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7726 register_prefix, i.op[!intel_syntax].regs->reg_name,
7727 register_prefix, i.op[intel_syntax].regs->reg_name);
7728 }
7729 else
7730 {
7731 /* Extraneous `l' suffix on fp insn. */
7732 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7733 register_prefix, i.op[0].regs->reg_name);
7734 }
7735 }
7736 }
29b0f896 7737
514a8bb0 7738 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7739 && i.tm.base_opcode == 0x8d /* lea */
7740 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7741 {
7742 if (!quiet_warnings)
7743 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7744 if (optimize)
7745 {
7746 i.seg[0] = NULL;
7747 i.prefix[SEG_PREFIX] = 0;
7748 }
7749 }
52271982
AM
7750
7751 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7752 is neither the default nor the one already recorded from a prefix,
7753 use an opcode prefix to select it. If we never figured out what
7754 the default segment is, then default_seg will be zero at this
7755 point, and the specified segment prefix will always be used. */
7756 if (i.seg[0]
7757 && i.seg[0] != default_seg
7758 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7759 {
7760 if (!add_prefix (i.seg[0]->seg_prefix))
7761 return 0;
7762 }
7763 return 1;
7764}
7765
a5aeccd9
JB
7766static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
7767 bfd_boolean do_sse2avx)
7768{
7769 if (r->reg_flags & RegRex)
7770 {
7771 if (i.rex & rex_bit)
7772 as_bad (_("same type of prefix used twice"));
7773 i.rex |= rex_bit;
7774 }
7775 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7776 {
7777 gas_assert (i.vex.register_specifier == r);
7778 i.vex.register_specifier += 8;
7779 }
7780
7781 if (r->reg_flags & RegVRex)
7782 i.vrex |= rex_bit;
7783}
7784
29b0f896 7785static const seg_entry *
e3bb37b5 7786build_modrm_byte (void)
29b0f896
AM
7787{
7788 const seg_entry *default_seg = 0;
c0f3af97 7789 unsigned int source, dest;
8cd7925b 7790 int vex_3_sources;
c0f3af97 7791
8cd7925b 7792 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7793 if (vex_3_sources)
7794 {
91d6fa6a 7795 unsigned int nds, reg_slot;
4c2c6516 7796 expressionS *exp;
c0f3af97 7797
6b8d3588 7798 dest = i.operands - 1;
c0f3af97 7799 nds = dest - 1;
922d8de8 7800
a683cc34 7801 /* There are 2 kinds of instructions:
bed3d976 7802 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7803 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7804 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7805 ZMM register.
bed3d976 7806 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7807 plus 1 memory operand, with VexXDS. */
922d8de8 7808 gas_assert ((i.reg_operands == 4
bed3d976
JB
7809 || (i.reg_operands == 3 && i.mem_operands == 1))
7810 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7811 && i.tm.opcode_modifier.vexw
3528c362 7812 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7813
48db9223
JB
7814 /* If VexW1 is set, the first non-immediate operand is the source and
7815 the second non-immediate one is encoded in the immediate operand. */
7816 if (i.tm.opcode_modifier.vexw == VEXW1)
7817 {
7818 source = i.imm_operands;
7819 reg_slot = i.imm_operands + 1;
7820 }
7821 else
7822 {
7823 source = i.imm_operands + 1;
7824 reg_slot = i.imm_operands;
7825 }
7826
a683cc34 7827 if (i.imm_operands == 0)
bed3d976
JB
7828 {
7829 /* When there is no immediate operand, generate an 8bit
7830 immediate operand to encode the first operand. */
7831 exp = &im_expressions[i.imm_operands++];
7832 i.op[i.operands].imms = exp;
7833 i.types[i.operands] = imm8;
7834 i.operands++;
7835
3528c362 7836 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7837 exp->X_op = O_constant;
7838 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7839 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7840 }
922d8de8 7841 else
bed3d976 7842 {
9d3bf266
JB
7843 gas_assert (i.imm_operands == 1);
7844 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7845 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7846
9d3bf266
JB
7847 /* Turn on Imm8 again so that output_imm will generate it. */
7848 i.types[0].bitfield.imm8 = 1;
bed3d976 7849
3528c362 7850 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7851 i.op[0].imms->X_add_number
bed3d976 7852 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7853 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7854 }
a683cc34 7855
3528c362 7856 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7857 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7858 }
7859 else
7860 source = dest = 0;
29b0f896
AM
7861
7862 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7863 implicit registers do not count. If there are 3 register
7864 operands, it must be a instruction with VexNDS. For a
7865 instruction with VexNDD, the destination register is encoded
7866 in VEX prefix. If there are 4 register operands, it must be
7867 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7868 if (i.mem_operands == 0
7869 && ((i.reg_operands == 2
2426c15f 7870 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7871 || (i.reg_operands == 3
2426c15f 7872 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7873 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7874 {
cab737b9
L
7875 switch (i.operands)
7876 {
7877 case 2:
7878 source = 0;
7879 break;
7880 case 3:
c81128dc
L
7881 /* When there are 3 operands, one of them may be immediate,
7882 which may be the first or the last operand. Otherwise,
c0f3af97
L
7883 the first operand must be shift count register (cl) or it
7884 is an instruction with VexNDS. */
9c2799c2 7885 gas_assert (i.imm_operands == 1
7ab9ffdd 7886 || (i.imm_operands == 0
2426c15f 7887 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7888 || (i.types[0].bitfield.instance == RegC
7889 && i.types[0].bitfield.byte))));
40fb9820 7890 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7891 || (i.types[0].bitfield.instance == RegC
7892 && i.types[0].bitfield.byte))
40fb9820
L
7893 source = 1;
7894 else
7895 source = 0;
cab737b9
L
7896 break;
7897 case 4:
368d64cc
L
7898 /* When there are 4 operands, the first two must be 8bit
7899 immediate operands. The source operand will be the 3rd
c0f3af97
L
7900 one.
7901
7902 For instructions with VexNDS, if the first operand
7903 an imm8, the source operand is the 2nd one. If the last
7904 operand is imm8, the source operand is the first one. */
9c2799c2 7905 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7906 && i.types[0].bitfield.imm8
7907 && i.types[1].bitfield.imm8)
2426c15f 7908 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7909 && i.imm_operands == 1
7910 && (i.types[0].bitfield.imm8
43234a1e
L
7911 || i.types[i.operands - 1].bitfield.imm8
7912 || i.rounding)));
9f2670f2
L
7913 if (i.imm_operands == 2)
7914 source = 2;
7915 else
c0f3af97
L
7916 {
7917 if (i.types[0].bitfield.imm8)
7918 source = 1;
7919 else
7920 source = 0;
7921 }
c0f3af97
L
7922 break;
7923 case 5:
e771e7c9 7924 if (is_evex_encoding (&i.tm))
43234a1e
L
7925 {
7926 /* For EVEX instructions, when there are 5 operands, the
7927 first one must be immediate operand. If the second one
7928 is immediate operand, the source operand is the 3th
7929 one. If the last one is immediate operand, the source
7930 operand is the 2nd one. */
7931 gas_assert (i.imm_operands == 2
7932 && i.tm.opcode_modifier.sae
7933 && operand_type_check (i.types[0], imm));
7934 if (operand_type_check (i.types[1], imm))
7935 source = 2;
7936 else if (operand_type_check (i.types[4], imm))
7937 source = 1;
7938 else
7939 abort ();
7940 }
cab737b9
L
7941 break;
7942 default:
7943 abort ();
7944 }
7945
c0f3af97
L
7946 if (!vex_3_sources)
7947 {
7948 dest = source + 1;
7949
43234a1e
L
7950 /* RC/SAE operand could be between DEST and SRC. That happens
7951 when one operand is GPR and the other one is XMM/YMM/ZMM
7952 register. */
7953 if (i.rounding && i.rounding->operand == (int) dest)
7954 dest++;
7955
2426c15f 7956 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7957 {
43234a1e 7958 /* For instructions with VexNDS, the register-only source
c5d0745b 7959 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7960 register. It is encoded in VEX prefix. */
f12dc422
L
7961
7962 i386_operand_type op;
7963 unsigned int vvvv;
7964
c2ecccb3
L
7965 /* Swap two source operands if needed. */
7966 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
7967 {
7968 vvvv = source;
7969 source = dest;
7970 }
7971 else
7972 vvvv = dest;
7973
7974 op = i.tm.operand_types[vvvv];
c0f3af97 7975 if ((dest + 1) >= i.operands
bab6aec1 7976 || ((op.bitfield.class != Reg
dc821c5f 7977 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7978 && op.bitfield.class != RegSIMD
43234a1e 7979 && !operand_type_equal (&op, &regmask)))
c0f3af97 7980 abort ();
f12dc422 7981 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7982 dest++;
7983 }
7984 }
29b0f896
AM
7985
7986 i.rm.mode = 3;
dfd69174
JB
7987 /* One of the register operands will be encoded in the i.rm.reg
7988 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7989 fields. If no form of this instruction supports a memory
7990 destination operand, then we assume the source operand may
7991 sometimes be a memory operand and so we need to store the
7992 destination in the i.rm.reg field. */
dfd69174 7993 if (!i.tm.opcode_modifier.regmem
40fb9820 7994 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7995 {
7996 i.rm.reg = i.op[dest].regs->reg_num;
7997 i.rm.regmem = i.op[source].regs->reg_num;
a5aeccd9
JB
7998 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
7999 set_rex_vrex (i.op[source].regs, REX_B, FALSE);
29b0f896
AM
8000 }
8001 else
8002 {
8003 i.rm.reg = i.op[source].regs->reg_num;
8004 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9
JB
8005 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
8006 set_rex_vrex (i.op[source].regs, REX_R, FALSE);
29b0f896 8007 }
e0c7f900 8008 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 8009 {
4a5c67ed 8010 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 8011 abort ();
e0c7f900 8012 i.rex &= ~REX_R;
c4a530c5
JB
8013 add_prefix (LOCK_PREFIX_OPCODE);
8014 }
29b0f896
AM
8015 }
8016 else
8017 { /* If it's not 2 reg operands... */
c0f3af97
L
8018 unsigned int mem;
8019
29b0f896
AM
8020 if (i.mem_operands)
8021 {
8022 unsigned int fake_zero_displacement = 0;
99018f42 8023 unsigned int op;
4eed87de 8024
7ab9ffdd 8025 for (op = 0; op < i.operands; op++)
8dc0818e 8026 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8027 break;
7ab9ffdd 8028 gas_assert (op < i.operands);
29b0f896 8029
63112cd6 8030 if (i.tm.opcode_modifier.sib)
6c30d220 8031 {
260cd341
LC
8032 /* The index register of VSIB shouldn't be RegIZ. */
8033 if (i.tm.opcode_modifier.sib != SIBMEM
8034 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8035 abort ();
8036
8037 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8038 if (!i.base_reg)
8039 {
8040 i.sib.base = NO_BASE_REGISTER;
8041 i.sib.scale = i.log2_scale_factor;
8042 i.types[op].bitfield.disp8 = 0;
8043 i.types[op].bitfield.disp16 = 0;
8044 i.types[op].bitfield.disp64 = 0;
43083a50 8045 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
8046 {
8047 /* Must be 32 bit */
8048 i.types[op].bitfield.disp32 = 1;
8049 i.types[op].bitfield.disp32s = 0;
8050 }
8051 else
8052 {
8053 i.types[op].bitfield.disp32 = 0;
8054 i.types[op].bitfield.disp32s = 1;
8055 }
8056 }
260cd341
LC
8057
8058 /* Since the mandatory SIB always has index register, so
8059 the code logic remains unchanged. The non-mandatory SIB
8060 without index register is allowed and will be handled
8061 later. */
8062 if (i.index_reg)
8063 {
8064 if (i.index_reg->reg_num == RegIZ)
8065 i.sib.index = NO_INDEX_REGISTER;
8066 else
8067 i.sib.index = i.index_reg->reg_num;
8068 set_rex_vrex (i.index_reg, REX_X, FALSE);
8069 }
6c30d220
L
8070 }
8071
29b0f896
AM
8072 default_seg = &ds;
8073
8074 if (i.base_reg == 0)
8075 {
8076 i.rm.mode = 0;
8077 if (!i.disp_operands)
9bb129e8 8078 fake_zero_displacement = 1;
29b0f896
AM
8079 if (i.index_reg == 0)
8080 {
73053c1f
JB
8081 i386_operand_type newdisp;
8082
260cd341
LC
8083 /* Both check for VSIB and mandatory non-vector SIB. */
8084 gas_assert (!i.tm.opcode_modifier.sib
8085 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8086 /* Operand is just <disp> */
20f0a1fc 8087 if (flag_code == CODE_64BIT)
29b0f896
AM
8088 {
8089 /* 64bit mode overwrites the 32bit absolute
8090 addressing by RIP relative addressing and
8091 absolute addressing is encoded by one of the
8092 redundant SIB forms. */
8093 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8094 i.sib.base = NO_BASE_REGISTER;
8095 i.sib.index = NO_INDEX_REGISTER;
73053c1f 8096 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 8097 }
fc225355
L
8098 else if ((flag_code == CODE_16BIT)
8099 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8100 {
8101 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8102 newdisp = disp16;
20f0a1fc
NC
8103 }
8104 else
8105 {
8106 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8107 newdisp = disp32;
29b0f896 8108 }
73053c1f
JB
8109 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8110 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8111 }
63112cd6 8112 else if (!i.tm.opcode_modifier.sib)
29b0f896 8113 {
6c30d220 8114 /* !i.base_reg && i.index_reg */
e968fc9b 8115 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8116 i.sib.index = NO_INDEX_REGISTER;
8117 else
8118 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8119 i.sib.base = NO_BASE_REGISTER;
8120 i.sib.scale = i.log2_scale_factor;
8121 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8122 i.types[op].bitfield.disp8 = 0;
8123 i.types[op].bitfield.disp16 = 0;
8124 i.types[op].bitfield.disp64 = 0;
43083a50 8125 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8126 {
8127 /* Must be 32 bit */
8128 i.types[op].bitfield.disp32 = 1;
8129 i.types[op].bitfield.disp32s = 0;
8130 }
29b0f896 8131 else
40fb9820
L
8132 {
8133 i.types[op].bitfield.disp32 = 0;
8134 i.types[op].bitfield.disp32s = 1;
8135 }
29b0f896 8136 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8137 i.rex |= REX_X;
29b0f896
AM
8138 }
8139 }
8140 /* RIP addressing for 64bit mode. */
e968fc9b 8141 else if (i.base_reg->reg_num == RegIP)
29b0f896 8142 {
63112cd6 8143 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8144 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8145 i.types[op].bitfield.disp8 = 0;
8146 i.types[op].bitfield.disp16 = 0;
8147 i.types[op].bitfield.disp32 = 0;
8148 i.types[op].bitfield.disp32s = 1;
8149 i.types[op].bitfield.disp64 = 0;
71903a11 8150 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8151 if (! i.disp_operands)
8152 fake_zero_displacement = 1;
29b0f896 8153 }
dc821c5f 8154 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8155 {
63112cd6 8156 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8157 switch (i.base_reg->reg_num)
8158 {
8159 case 3: /* (%bx) */
8160 if (i.index_reg == 0)
8161 i.rm.regmem = 7;
8162 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8163 i.rm.regmem = i.index_reg->reg_num - 6;
8164 break;
8165 case 5: /* (%bp) */
8166 default_seg = &ss;
8167 if (i.index_reg == 0)
8168 {
8169 i.rm.regmem = 6;
40fb9820 8170 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8171 {
8172 /* fake (%bp) into 0(%bp) */
41eb8e88 8173 if (i.disp_encoding == disp_encoding_16bit)
1a02d6b0
L
8174 i.types[op].bitfield.disp16 = 1;
8175 else
8176 i.types[op].bitfield.disp8 = 1;
252b5132 8177 fake_zero_displacement = 1;
29b0f896
AM
8178 }
8179 }
8180 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8181 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8182 break;
8183 default: /* (%si) -> 4 or (%di) -> 5 */
8184 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8185 }
41eb8e88
L
8186 if (!fake_zero_displacement
8187 && !i.disp_operands
8188 && i.disp_encoding)
8189 {
8190 fake_zero_displacement = 1;
8191 if (i.disp_encoding == disp_encoding_8bit)
8192 i.types[op].bitfield.disp8 = 1;
8193 else
8194 i.types[op].bitfield.disp16 = 1;
8195 }
29b0f896
AM
8196 i.rm.mode = mode_from_disp_size (i.types[op]);
8197 }
8198 else /* i.base_reg and 32/64 bit mode */
8199 {
8200 if (flag_code == CODE_64BIT
40fb9820
L
8201 && operand_type_check (i.types[op], disp))
8202 {
73053c1f
JB
8203 i.types[op].bitfield.disp16 = 0;
8204 i.types[op].bitfield.disp64 = 0;
40fb9820 8205 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8206 {
8207 i.types[op].bitfield.disp32 = 0;
8208 i.types[op].bitfield.disp32s = 1;
8209 }
40fb9820 8210 else
73053c1f
JB
8211 {
8212 i.types[op].bitfield.disp32 = 1;
8213 i.types[op].bitfield.disp32s = 0;
8214 }
40fb9820 8215 }
20f0a1fc 8216
63112cd6 8217 if (!i.tm.opcode_modifier.sib)
6c30d220 8218 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8219 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8220 i.rex |= REX_B;
29b0f896
AM
8221 i.sib.base = i.base_reg->reg_num;
8222 /* x86-64 ignores REX prefix bit here to avoid decoder
8223 complications. */
848930b2
JB
8224 if (!(i.base_reg->reg_flags & RegRex)
8225 && (i.base_reg->reg_num == EBP_REG_NUM
8226 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8227 default_seg = &ss;
848930b2 8228 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8229 {
848930b2 8230 fake_zero_displacement = 1;
1a02d6b0
L
8231 if (i.disp_encoding == disp_encoding_32bit)
8232 i.types[op].bitfield.disp32 = 1;
8233 else
8234 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8235 }
8236 i.sib.scale = i.log2_scale_factor;
8237 if (i.index_reg == 0)
8238 {
260cd341
LC
8239 /* Only check for VSIB. */
8240 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8241 && i.tm.opcode_modifier.sib != VECSIB256
8242 && i.tm.opcode_modifier.sib != VECSIB512);
8243
29b0f896
AM
8244 /* <disp>(%esp) becomes two byte modrm with no index
8245 register. We've already stored the code for esp
8246 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8247 Any base register besides %esp will not use the
8248 extra modrm byte. */
8249 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8250 }
63112cd6 8251 else if (!i.tm.opcode_modifier.sib)
29b0f896 8252 {
e968fc9b 8253 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8254 i.sib.index = NO_INDEX_REGISTER;
8255 else
8256 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8257 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8258 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8259 i.rex |= REX_X;
29b0f896 8260 }
67a4f2b7
AO
8261
8262 if (i.disp_operands
8263 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8264 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8265 i.rm.mode = 0;
8266 else
a501d77e
L
8267 {
8268 if (!fake_zero_displacement
8269 && !i.disp_operands
8270 && i.disp_encoding)
8271 {
8272 fake_zero_displacement = 1;
8273 if (i.disp_encoding == disp_encoding_8bit)
8274 i.types[op].bitfield.disp8 = 1;
8275 else
8276 i.types[op].bitfield.disp32 = 1;
8277 }
8278 i.rm.mode = mode_from_disp_size (i.types[op]);
8279 }
29b0f896 8280 }
252b5132 8281
29b0f896
AM
8282 if (fake_zero_displacement)
8283 {
8284 /* Fakes a zero displacement assuming that i.types[op]
8285 holds the correct displacement size. */
8286 expressionS *exp;
8287
9c2799c2 8288 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8289 exp = &disp_expressions[i.disp_operands++];
8290 i.op[op].disps = exp;
8291 exp->X_op = O_constant;
8292 exp->X_add_number = 0;
8293 exp->X_add_symbol = (symbolS *) 0;
8294 exp->X_op_symbol = (symbolS *) 0;
8295 }
c0f3af97
L
8296
8297 mem = op;
29b0f896 8298 }
c0f3af97
L
8299 else
8300 mem = ~0;
252b5132 8301
8c43a48b 8302 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8303 {
8304 if (operand_type_check (i.types[0], imm))
8305 i.vex.register_specifier = NULL;
8306 else
8307 {
8308 /* VEX.vvvv encodes one of the sources when the first
8309 operand is not an immediate. */
1ef99a7b 8310 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8311 i.vex.register_specifier = i.op[0].regs;
8312 else
8313 i.vex.register_specifier = i.op[1].regs;
8314 }
8315
8316 /* Destination is a XMM register encoded in the ModRM.reg
8317 and VEX.R bit. */
8318 i.rm.reg = i.op[2].regs->reg_num;
8319 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8320 i.rex |= REX_R;
8321
8322 /* ModRM.rm and VEX.B encodes the other source. */
8323 if (!i.mem_operands)
8324 {
8325 i.rm.mode = 3;
8326
1ef99a7b 8327 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8328 i.rm.regmem = i.op[1].regs->reg_num;
8329 else
8330 i.rm.regmem = i.op[0].regs->reg_num;
8331
8332 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8333 i.rex |= REX_B;
8334 }
8335 }
2426c15f 8336 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8337 {
8338 i.vex.register_specifier = i.op[2].regs;
8339 if (!i.mem_operands)
8340 {
8341 i.rm.mode = 3;
8342 i.rm.regmem = i.op[1].regs->reg_num;
8343 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8344 i.rex |= REX_B;
8345 }
8346 }
29b0f896
AM
8347 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8348 (if any) based on i.tm.extension_opcode. Again, we must be
8349 careful to make sure that segment/control/debug/test/MMX
8350 registers are coded into the i.rm.reg field. */
f88c9eb0 8351 else if (i.reg_operands)
29b0f896 8352 {
99018f42 8353 unsigned int op;
7ab9ffdd
L
8354 unsigned int vex_reg = ~0;
8355
8356 for (op = 0; op < i.operands; op++)
921eafea
L
8357 if (i.types[op].bitfield.class == Reg
8358 || i.types[op].bitfield.class == RegBND
8359 || i.types[op].bitfield.class == RegMask
8360 || i.types[op].bitfield.class == SReg
8361 || i.types[op].bitfield.class == RegCR
8362 || i.types[op].bitfield.class == RegDR
8363 || i.types[op].bitfield.class == RegTR
8364 || i.types[op].bitfield.class == RegSIMD
8365 || i.types[op].bitfield.class == RegMMX)
8366 break;
c0209578 8367
7ab9ffdd
L
8368 if (vex_3_sources)
8369 op = dest;
2426c15f 8370 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8371 {
8372 /* For instructions with VexNDS, the register-only
8373 source operand is encoded in VEX prefix. */
8374 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8375
7ab9ffdd 8376 if (op > mem)
c0f3af97 8377 {
7ab9ffdd
L
8378 vex_reg = op++;
8379 gas_assert (op < i.operands);
c0f3af97
L
8380 }
8381 else
c0f3af97 8382 {
f12dc422
L
8383 /* Check register-only source operand when two source
8384 operands are swapped. */
8385 if (!i.tm.operand_types[op].bitfield.baseindex
8386 && i.tm.operand_types[op + 1].bitfield.baseindex)
8387 {
8388 vex_reg = op;
8389 op += 2;
8390 gas_assert (mem == (vex_reg + 1)
8391 && op < i.operands);
8392 }
8393 else
8394 {
8395 vex_reg = op + 1;
8396 gas_assert (vex_reg < i.operands);
8397 }
c0f3af97 8398 }
7ab9ffdd 8399 }
2426c15f 8400 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8401 {
f12dc422 8402 /* For instructions with VexNDD, the register destination
7ab9ffdd 8403 is encoded in VEX prefix. */
f12dc422
L
8404 if (i.mem_operands == 0)
8405 {
8406 /* There is no memory operand. */
8407 gas_assert ((op + 2) == i.operands);
8408 vex_reg = op + 1;
8409 }
8410 else
8d63c93e 8411 {
ed438a93
JB
8412 /* There are only 2 non-immediate operands. */
8413 gas_assert (op < i.imm_operands + 2
8414 && i.operands == i.imm_operands + 2);
8415 vex_reg = i.imm_operands + 1;
f12dc422 8416 }
7ab9ffdd
L
8417 }
8418 else
8419 gas_assert (op < i.operands);
99018f42 8420
7ab9ffdd
L
8421 if (vex_reg != (unsigned int) ~0)
8422 {
f12dc422 8423 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8424
bab6aec1 8425 if ((type->bitfield.class != Reg
dc821c5f 8426 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8427 && type->bitfield.class != RegSIMD
43234a1e 8428 && !operand_type_equal (type, &regmask))
7ab9ffdd 8429 abort ();
f88c9eb0 8430
7ab9ffdd
L
8431 i.vex.register_specifier = i.op[vex_reg].regs;
8432 }
8433
1b9f0c97
L
8434 /* Don't set OP operand twice. */
8435 if (vex_reg != op)
7ab9ffdd 8436 {
1b9f0c97
L
8437 /* If there is an extension opcode to put here, the
8438 register number must be put into the regmem field. */
8439 if (i.tm.extension_opcode != None)
8440 {
8441 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8442 set_rex_vrex (i.op[op].regs, REX_B,
8443 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8444 }
8445 else
8446 {
8447 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8448 set_rex_vrex (i.op[op].regs, REX_R,
8449 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8450 }
7ab9ffdd 8451 }
252b5132 8452
29b0f896
AM
8453 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8454 must set it to 3 to indicate this is a register operand
8455 in the regmem field. */
8456 if (!i.mem_operands)
8457 i.rm.mode = 3;
8458 }
252b5132 8459
29b0f896 8460 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8461 if (i.tm.extension_opcode != None)
29b0f896
AM
8462 i.rm.reg = i.tm.extension_opcode;
8463 }
8464 return default_seg;
8465}
252b5132 8466
48ef937e
JB
8467static INLINE void
8468frag_opcode_byte (unsigned char byte)
8469{
8470 if (now_seg != absolute_section)
8471 FRAG_APPEND_1_CHAR (byte);
8472 else
8473 ++abs_section_offset;
8474}
8475
376cd056
JB
8476static unsigned int
8477flip_code16 (unsigned int code16)
8478{
8479 gas_assert (i.tm.operands == 1);
8480
8481 return !(i.prefix[REX_PREFIX] & REX_W)
8482 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8483 || i.tm.operand_types[0].bitfield.disp32s
8484 : i.tm.operand_types[0].bitfield.disp16)
8485 ? CODE16 : 0;
8486}
8487
29b0f896 8488static void
e3bb37b5 8489output_branch (void)
29b0f896
AM
8490{
8491 char *p;
f8a5c266 8492 int size;
29b0f896
AM
8493 int code16;
8494 int prefix;
8495 relax_substateT subtype;
8496 symbolS *sym;
8497 offsetT off;
8498
48ef937e
JB
8499 if (now_seg == absolute_section)
8500 {
8501 as_bad (_("relaxable branches not supported in absolute section"));
8502 return;
8503 }
8504
f8a5c266 8505 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8506 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8507
8508 prefix = 0;
8509 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8510 {
29b0f896
AM
8511 prefix = 1;
8512 i.prefixes -= 1;
376cd056 8513 code16 ^= flip_code16(code16);
252b5132 8514 }
29b0f896
AM
8515 /* Pentium4 branch hints. */
8516 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8517 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8518 {
29b0f896
AM
8519 prefix++;
8520 i.prefixes--;
8521 }
8522 if (i.prefix[REX_PREFIX] != 0)
8523 {
8524 prefix++;
8525 i.prefixes--;
2f66722d
AM
8526 }
8527
7e8b059b
L
8528 /* BND prefixed jump. */
8529 if (i.prefix[BND_PREFIX] != 0)
8530 {
6cb0a70e
JB
8531 prefix++;
8532 i.prefixes--;
7e8b059b
L
8533 }
8534
f2810fe0
JB
8535 if (i.prefixes != 0)
8536 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8537
8538 /* It's always a symbol; End frag & setup for relax.
8539 Make sure there is enough room in this frag for the largest
8540 instruction we may generate in md_convert_frag. This is 2
8541 bytes for the opcode and room for the prefix and largest
8542 displacement. */
8543 frag_grow (prefix + 2 + 4);
8544 /* Prefix and 1 opcode byte go in fr_fix. */
8545 p = frag_more (prefix + 1);
8546 if (i.prefix[DATA_PREFIX] != 0)
8547 *p++ = DATA_PREFIX_OPCODE;
8548 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8549 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8550 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8551 if (i.prefix[BND_PREFIX] != 0)
8552 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8553 if (i.prefix[REX_PREFIX] != 0)
8554 *p++ = i.prefix[REX_PREFIX];
8555 *p = i.tm.base_opcode;
8556
8557 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8558 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8559 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8560 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8561 else
f8a5c266 8562 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8563 subtype |= code16;
3e73aa7c 8564
29b0f896
AM
8565 sym = i.op[0].disps->X_add_symbol;
8566 off = i.op[0].disps->X_add_number;
3e73aa7c 8567
29b0f896
AM
8568 if (i.op[0].disps->X_op != O_constant
8569 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8570 {
29b0f896
AM
8571 /* Handle complex expressions. */
8572 sym = make_expr_symbol (i.op[0].disps);
8573 off = 0;
8574 }
3e73aa7c 8575
29b0f896
AM
8576 /* 1 possible extra opcode + 4 byte displacement go in var part.
8577 Pass reloc in fr_var. */
d258b828 8578 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8579}
3e73aa7c 8580
bd7ab16b
L
8581#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8582/* Return TRUE iff PLT32 relocation should be used for branching to
8583 symbol S. */
8584
8585static bfd_boolean
8586need_plt32_p (symbolS *s)
8587{
8588 /* PLT32 relocation is ELF only. */
8589 if (!IS_ELF)
8590 return FALSE;
8591
a5def729
RO
8592#ifdef TE_SOLARIS
8593 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8594 krtld support it. */
8595 return FALSE;
8596#endif
8597
bd7ab16b
L
8598 /* Since there is no need to prepare for PLT branch on x86-64, we
8599 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8600 be used as a marker for 32-bit PC-relative branches. */
8601 if (!object_64bit)
8602 return FALSE;
8603
8604 /* Weak or undefined symbol need PLT32 relocation. */
8605 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8606 return TRUE;
8607
8608 /* Non-global symbol doesn't need PLT32 relocation. */
8609 if (! S_IS_EXTERNAL (s))
8610 return FALSE;
8611
8612 /* Other global symbols need PLT32 relocation. NB: Symbol with
8613 non-default visibilities are treated as normal global symbol
8614 so that PLT32 relocation can be used as a marker for 32-bit
8615 PC-relative branches. It is useful for linker relaxation. */
8616 return TRUE;
8617}
8618#endif
8619
29b0f896 8620static void
e3bb37b5 8621output_jump (void)
29b0f896
AM
8622{
8623 char *p;
8624 int size;
3e02c1cc 8625 fixS *fixP;
bd7ab16b 8626 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8627
0cfa3eb3 8628 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8629 {
8630 /* This is a loop or jecxz type instruction. */
8631 size = 1;
8632 if (i.prefix[ADDR_PREFIX] != 0)
8633 {
48ef937e 8634 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
8635 i.prefixes -= 1;
8636 }
8637 /* Pentium4 branch hints. */
8638 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8639 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8640 {
48ef937e 8641 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 8642 i.prefixes--;
3e73aa7c
JH
8643 }
8644 }
29b0f896
AM
8645 else
8646 {
8647 int code16;
3e73aa7c 8648
29b0f896
AM
8649 code16 = 0;
8650 if (flag_code == CODE_16BIT)
8651 code16 = CODE16;
3e73aa7c 8652
29b0f896
AM
8653 if (i.prefix[DATA_PREFIX] != 0)
8654 {
48ef937e 8655 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 8656 i.prefixes -= 1;
376cd056 8657 code16 ^= flip_code16(code16);
29b0f896 8658 }
252b5132 8659
29b0f896
AM
8660 size = 4;
8661 if (code16)
8662 size = 2;
8663 }
9fcc94b6 8664
6cb0a70e
JB
8665 /* BND prefixed jump. */
8666 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8667 {
48ef937e 8668 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
8669 i.prefixes -= 1;
8670 }
252b5132 8671
6cb0a70e 8672 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8673 {
48ef937e 8674 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
8675 i.prefixes -= 1;
8676 }
8677
f2810fe0
JB
8678 if (i.prefixes != 0)
8679 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8680
48ef937e
JB
8681 if (now_seg == absolute_section)
8682 {
8683 abs_section_offset += i.tm.opcode_length + size;
8684 return;
8685 }
8686
42164a71
L
8687 p = frag_more (i.tm.opcode_length + size);
8688 switch (i.tm.opcode_length)
8689 {
8690 case 2:
8691 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8692 /* Fall through. */
42164a71
L
8693 case 1:
8694 *p++ = i.tm.base_opcode;
8695 break;
8696 default:
8697 abort ();
8698 }
e0890092 8699
bd7ab16b
L
8700#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8701 if (size == 4
8702 && jump_reloc == NO_RELOC
8703 && need_plt32_p (i.op[0].disps->X_add_symbol))
8704 jump_reloc = BFD_RELOC_X86_64_PLT32;
8705#endif
8706
8707 jump_reloc = reloc (size, 1, 1, jump_reloc);
8708
3e02c1cc 8709 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8710 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8711
8712 /* All jumps handled here are signed, but don't use a signed limit
8713 check for 32 and 16 bit jumps as we want to allow wrap around at
8714 4G and 64k respectively. */
8715 if (size == 1)
8716 fixP->fx_signed = 1;
29b0f896 8717}
e0890092 8718
29b0f896 8719static void
e3bb37b5 8720output_interseg_jump (void)
29b0f896
AM
8721{
8722 char *p;
8723 int size;
8724 int prefix;
8725 int code16;
252b5132 8726
29b0f896
AM
8727 code16 = 0;
8728 if (flag_code == CODE_16BIT)
8729 code16 = CODE16;
a217f122 8730
29b0f896
AM
8731 prefix = 0;
8732 if (i.prefix[DATA_PREFIX] != 0)
8733 {
8734 prefix = 1;
8735 i.prefixes -= 1;
8736 code16 ^= CODE16;
8737 }
6cb0a70e
JB
8738
8739 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8740
29b0f896
AM
8741 size = 4;
8742 if (code16)
8743 size = 2;
252b5132 8744
f2810fe0
JB
8745 if (i.prefixes != 0)
8746 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8747
48ef937e
JB
8748 if (now_seg == absolute_section)
8749 {
8750 abs_section_offset += prefix + 1 + 2 + size;
8751 return;
8752 }
8753
29b0f896
AM
8754 /* 1 opcode; 2 segment; offset */
8755 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8756
29b0f896
AM
8757 if (i.prefix[DATA_PREFIX] != 0)
8758 *p++ = DATA_PREFIX_OPCODE;
252b5132 8759
29b0f896
AM
8760 if (i.prefix[REX_PREFIX] != 0)
8761 *p++ = i.prefix[REX_PREFIX];
252b5132 8762
29b0f896
AM
8763 *p++ = i.tm.base_opcode;
8764 if (i.op[1].imms->X_op == O_constant)
8765 {
8766 offsetT n = i.op[1].imms->X_add_number;
252b5132 8767
29b0f896
AM
8768 if (size == 2
8769 && !fits_in_unsigned_word (n)
8770 && !fits_in_signed_word (n))
8771 {
8772 as_bad (_("16-bit jump out of range"));
8773 return;
8774 }
8775 md_number_to_chars (p, n, size);
8776 }
8777 else
8778 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8779 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
6d96a594
C
8780
8781 p += size;
8782 if (i.op[0].imms->X_op == O_constant)
8783 md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2);
8784 else
8785 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
8786 i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0]));
29b0f896 8787}
a217f122 8788
b4a3a7b4
L
8789#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8790void
8791x86_cleanup (void)
8792{
8793 char *p;
8794 asection *seg = now_seg;
8795 subsegT subseg = now_subseg;
8796 asection *sec;
8797 unsigned int alignment, align_size_1;
8798 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8799 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8800 unsigned int padding;
8801
8802 if (!IS_ELF || !x86_used_note)
8803 return;
8804
b4a3a7b4
L
8805 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8806
8807 /* The .note.gnu.property section layout:
8808
8809 Field Length Contents
8810 ---- ---- ----
8811 n_namsz 4 4
8812 n_descsz 4 The note descriptor size
8813 n_type 4 NT_GNU_PROPERTY_TYPE_0
8814 n_name 4 "GNU"
8815 n_desc n_descsz The program property array
8816 .... .... ....
8817 */
8818
8819 /* Create the .note.gnu.property section. */
8820 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8821 bfd_set_section_flags (sec,
b4a3a7b4
L
8822 (SEC_ALLOC
8823 | SEC_LOAD
8824 | SEC_DATA
8825 | SEC_HAS_CONTENTS
8826 | SEC_READONLY));
8827
8828 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8829 {
8830 align_size_1 = 7;
8831 alignment = 3;
8832 }
8833 else
8834 {
8835 align_size_1 = 3;
8836 alignment = 2;
8837 }
8838
fd361982 8839 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8840 elf_section_type (sec) = SHT_NOTE;
8841
8842 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8843 + 4-byte data */
8844 isa_1_descsz_raw = 4 + 4 + 4;
8845 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8846 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8847
8848 feature_2_descsz_raw = isa_1_descsz;
8849 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8850 + 4-byte data */
8851 feature_2_descsz_raw += 4 + 4 + 4;
8852 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8853 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8854 & ~align_size_1);
8855
8856 descsz = feature_2_descsz;
8857 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8858 p = frag_more (4 + 4 + 4 + 4 + descsz);
8859
8860 /* Write n_namsz. */
8861 md_number_to_chars (p, (valueT) 4, 4);
8862
8863 /* Write n_descsz. */
8864 md_number_to_chars (p + 4, (valueT) descsz, 4);
8865
8866 /* Write n_type. */
8867 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8868
8869 /* Write n_name. */
8870 memcpy (p + 4 * 3, "GNU", 4);
8871
8872 /* Write 4-byte type. */
8873 md_number_to_chars (p + 4 * 4,
8874 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8875
8876 /* Write 4-byte data size. */
8877 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8878
8879 /* Write 4-byte data. */
8880 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8881
8882 /* Zero out paddings. */
8883 padding = isa_1_descsz - isa_1_descsz_raw;
8884 if (padding)
8885 memset (p + 4 * 7, 0, padding);
8886
8887 /* Write 4-byte type. */
8888 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8889 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8890
8891 /* Write 4-byte data size. */
8892 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8893
8894 /* Write 4-byte data. */
8895 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8896 (valueT) x86_feature_2_used, 4);
8897
8898 /* Zero out paddings. */
8899 padding = feature_2_descsz - feature_2_descsz_raw;
8900 if (padding)
8901 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8902
8903 /* We probably can't restore the current segment, for there likely
8904 isn't one yet... */
8905 if (seg && subseg)
8906 subseg_set (seg, subseg);
8907}
8908#endif
8909
9c33702b
JB
8910static unsigned int
8911encoding_length (const fragS *start_frag, offsetT start_off,
8912 const char *frag_now_ptr)
8913{
8914 unsigned int len = 0;
8915
8916 if (start_frag != frag_now)
8917 {
8918 const fragS *fr = start_frag;
8919
8920 do {
8921 len += fr->fr_fix;
8922 fr = fr->fr_next;
8923 } while (fr && fr != frag_now);
8924 }
8925
8926 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8927}
8928
e379e5f3 8929/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8930 be macro-fused with conditional jumps.
8931 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8932 or is one of the following format:
8933
8934 cmp m, imm
8935 add m, imm
8936 sub m, imm
8937 test m, imm
8938 and m, imm
8939 inc m
8940 dec m
8941
8942 it is unfusible. */
e379e5f3
L
8943
8944static int
79d72f45 8945maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8946{
8947 /* No RIP address. */
8948 if (i.base_reg && i.base_reg->reg_num == RegIP)
8949 return 0;
8950
8951 /* No VEX/EVEX encoding. */
8952 if (is_any_vex_encoding (&i.tm))
8953 return 0;
8954
79d72f45
HL
8955 /* add, sub without add/sub m, imm. */
8956 if (i.tm.base_opcode <= 5
e379e5f3
L
8957 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8958 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8959 && (i.tm.extension_opcode == 0x5
e379e5f3 8960 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8961 {
8962 *mf_cmp_p = mf_cmp_alu_cmp;
8963 return !(i.mem_operands && i.imm_operands);
8964 }
e379e5f3 8965
79d72f45
HL
8966 /* and without and m, imm. */
8967 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8968 || ((i.tm.base_opcode | 3) == 0x83
8969 && i.tm.extension_opcode == 0x4))
8970 {
8971 *mf_cmp_p = mf_cmp_test_and;
8972 return !(i.mem_operands && i.imm_operands);
8973 }
8974
8975 /* test without test m imm. */
e379e5f3
L
8976 if ((i.tm.base_opcode | 1) == 0x85
8977 || (i.tm.base_opcode | 1) == 0xa9
8978 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8979 && i.tm.extension_opcode == 0))
8980 {
8981 *mf_cmp_p = mf_cmp_test_and;
8982 return !(i.mem_operands && i.imm_operands);
8983 }
8984
8985 /* cmp without cmp m, imm. */
8986 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8987 || ((i.tm.base_opcode | 3) == 0x83
8988 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8989 {
8990 *mf_cmp_p = mf_cmp_alu_cmp;
8991 return !(i.mem_operands && i.imm_operands);
8992 }
e379e5f3 8993
79d72f45 8994 /* inc, dec without inc/dec m. */
e379e5f3
L
8995 if ((i.tm.cpu_flags.bitfield.cpuno64
8996 && (i.tm.base_opcode | 0xf) == 0x4f)
8997 || ((i.tm.base_opcode | 1) == 0xff
8998 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8999 {
9000 *mf_cmp_p = mf_cmp_incdec;
9001 return !i.mem_operands;
9002 }
e379e5f3
L
9003
9004 return 0;
9005}
9006
9007/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
9008
9009static int
79d72f45 9010add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9011{
9012 /* NB: Don't work with COND_JUMP86 without i386. */
9013 if (!align_branch_power
9014 || now_seg == absolute_section
9015 || !cpu_arch_flags.bitfield.cpui386
9016 || !(align_branch & align_branch_fused_bit))
9017 return 0;
9018
79d72f45 9019 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
9020 {
9021 if (last_insn.kind == last_insn_other
9022 || last_insn.seg != now_seg)
9023 return 1;
9024 if (flag_debug)
9025 as_warn_where (last_insn.file, last_insn.line,
9026 _("`%s` skips -malign-branch-boundary on `%s`"),
9027 last_insn.name, i.tm.name);
9028 }
9029
9030 return 0;
9031}
9032
9033/* Return 1 if a BRANCH_PREFIX frag should be generated. */
9034
9035static int
9036add_branch_prefix_frag_p (void)
9037{
9038 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
9039 to PadLock instructions since they include prefixes in opcode. */
9040 if (!align_branch_power
9041 || !align_branch_prefix_size
9042 || now_seg == absolute_section
9043 || i.tm.cpu_flags.bitfield.cpupadlock
9044 || !cpu_arch_flags.bitfield.cpui386)
9045 return 0;
9046
9047 /* Don't add prefix if it is a prefix or there is no operand in case
9048 that segment prefix is special. */
9049 if (!i.operands || i.tm.opcode_modifier.isprefix)
9050 return 0;
9051
9052 if (last_insn.kind == last_insn_other
9053 || last_insn.seg != now_seg)
9054 return 1;
9055
9056 if (flag_debug)
9057 as_warn_where (last_insn.file, last_insn.line,
9058 _("`%s` skips -malign-branch-boundary on `%s`"),
9059 last_insn.name, i.tm.name);
9060
9061 return 0;
9062}
9063
9064/* Return 1 if a BRANCH_PADDING frag should be generated. */
9065
9066static int
79d72f45
HL
9067add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9068 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9069{
9070 int add_padding;
9071
9072 /* NB: Don't work with COND_JUMP86 without i386. */
9073 if (!align_branch_power
9074 || now_seg == absolute_section
9075 || !cpu_arch_flags.bitfield.cpui386)
9076 return 0;
9077
9078 add_padding = 0;
9079
9080 /* Check for jcc and direct jmp. */
9081 if (i.tm.opcode_modifier.jump == JUMP)
9082 {
9083 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9084 {
9085 *branch_p = align_branch_jmp;
9086 add_padding = align_branch & align_branch_jmp_bit;
9087 }
9088 else
9089 {
79d72f45
HL
9090 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9091 igore the lowest bit. */
9092 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9093 *branch_p = align_branch_jcc;
9094 if ((align_branch & align_branch_jcc_bit))
9095 add_padding = 1;
9096 }
9097 }
9098 else if (is_any_vex_encoding (&i.tm))
9099 return 0;
9100 else if ((i.tm.base_opcode | 1) == 0xc3)
9101 {
9102 /* Near ret. */
9103 *branch_p = align_branch_ret;
9104 if ((align_branch & align_branch_ret_bit))
9105 add_padding = 1;
9106 }
9107 else
9108 {
9109 /* Check for indirect jmp, direct and indirect calls. */
9110 if (i.tm.base_opcode == 0xe8)
9111 {
9112 /* Direct call. */
9113 *branch_p = align_branch_call;
9114 if ((align_branch & align_branch_call_bit))
9115 add_padding = 1;
9116 }
9117 else if (i.tm.base_opcode == 0xff
9118 && (i.tm.extension_opcode == 2
9119 || i.tm.extension_opcode == 4))
9120 {
9121 /* Indirect call and jmp. */
9122 *branch_p = align_branch_indirect;
9123 if ((align_branch & align_branch_indirect_bit))
9124 add_padding = 1;
9125 }
9126
9127 if (add_padding
9128 && i.disp_operands
9129 && tls_get_addr
9130 && (i.op[0].disps->X_op == O_symbol
9131 || (i.op[0].disps->X_op == O_subtract
9132 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9133 {
9134 symbolS *s = i.op[0].disps->X_add_symbol;
9135 /* No padding to call to global or undefined tls_get_addr. */
9136 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9137 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9138 return 0;
9139 }
9140 }
9141
9142 if (add_padding
9143 && last_insn.kind != last_insn_other
9144 && last_insn.seg == now_seg)
9145 {
9146 if (flag_debug)
9147 as_warn_where (last_insn.file, last_insn.line,
9148 _("`%s` skips -malign-branch-boundary on `%s`"),
9149 last_insn.name, i.tm.name);
9150 return 0;
9151 }
9152
9153 return add_padding;
9154}
9155
29b0f896 9156static void
e3bb37b5 9157output_insn (void)
29b0f896 9158{
2bbd9c25
JJ
9159 fragS *insn_start_frag;
9160 offsetT insn_start_off;
e379e5f3
L
9161 fragS *fragP = NULL;
9162 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9163 /* The initializer is arbitrary just to avoid uninitialized error.
9164 it's actually either assigned in add_branch_padding_frag_p
9165 or never be used. */
9166 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9167
b4a3a7b4 9168#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 9169 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4 9170 {
32930e4e
L
9171 if ((i.xstate & xstate_tmm) == xstate_tmm
9172 || i.tm.cpu_flags.bitfield.cpuamx_tile)
9173 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
9174
9175 if (i.tm.cpu_flags.bitfield.cpusse3
9176 || i.tm.cpu_flags.bitfield.cpussse3
9177 || i.tm.cpu_flags.bitfield.cpusse4_1
9178 || i.tm.cpu_flags.bitfield.cpusse4_2
9179 || i.tm.cpu_flags.bitfield.cpucx16
9180 || i.tm.cpu_flags.bitfield.cpupopcnt
9181 /* LAHF-SAHF insns in 64-bit mode. */
9182 || (flag_code == CODE_64BIT
9183 && (i.tm.base_opcode | 1) == 0x9f))
9184 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2;
9185 if (i.tm.cpu_flags.bitfield.cpuavx
9186 || i.tm.cpu_flags.bitfield.cpuavx2
9187 /* Any VEX encoded insns execpt for CpuAVX512F, CpuAVX512BW,
9188 CpuAVX512DQ, LPW, TBM and AMX. */
9189 || (i.tm.opcode_modifier.vex
9190 && !i.tm.cpu_flags.bitfield.cpuavx512f
9191 && !i.tm.cpu_flags.bitfield.cpuavx512bw
9192 && !i.tm.cpu_flags.bitfield.cpuavx512dq
9193 && !i.tm.cpu_flags.bitfield.cpulwp
9194 && !i.tm.cpu_flags.bitfield.cputbm
9195 && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM))
9196 || i.tm.cpu_flags.bitfield.cpuf16c
9197 || i.tm.cpu_flags.bitfield.cpufma
9198 || i.tm.cpu_flags.bitfield.cpulzcnt
9199 || i.tm.cpu_flags.bitfield.cpumovbe
9200 || i.tm.cpu_flags.bitfield.cpuxsave
9201 || i.tm.cpu_flags.bitfield.cpuxsavec
9202 || i.tm.cpu_flags.bitfield.cpuxsaveopt
9203 || i.tm.cpu_flags.bitfield.cpuxsaves)
9204 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V3;
9205 if (i.tm.cpu_flags.bitfield.cpuavx512f
9206 || i.tm.cpu_flags.bitfield.cpuavx512bw
9207 || i.tm.cpu_flags.bitfield.cpuavx512dq
9208 || i.tm.cpu_flags.bitfield.cpuavx512vl
9209 /* Any EVEX encoded insns except for AVX512ER, AVX512PF and
9210 VNNIW. */
9211 || (i.tm.opcode_modifier.evex
9212 && !i.tm.cpu_flags.bitfield.cpuavx512er
9213 && !i.tm.cpu_flags.bitfield.cpuavx512pf
9214 && !i.tm.cpu_flags.bitfield.cpuavx512_4vnniw))
9215 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V4;
b4a3a7b4
L
9216
9217 if (i.tm.cpu_flags.bitfield.cpu8087
9218 || i.tm.cpu_flags.bitfield.cpu287
9219 || i.tm.cpu_flags.bitfield.cpu387
9220 || i.tm.cpu_flags.bitfield.cpu687
9221 || i.tm.cpu_flags.bitfield.cpufisttp)
9222 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
921eafea 9223 if ((i.xstate & xstate_mmx)
319ff62c 9224 || i.tm.base_opcode == 0xf77 /* emms */
921eafea 9225 || i.tm.base_opcode == 0xf0e /* femms */)
b4a3a7b4 9226 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
32930e4e
L
9227 if (i.index_reg)
9228 {
9229 if (i.index_reg->reg_type.bitfield.zmmword)
9230 i.xstate |= xstate_zmm;
9231 else if (i.index_reg->reg_type.bitfield.ymmword)
9232 i.xstate |= xstate_ymm;
9233 else if (i.index_reg->reg_type.bitfield.xmmword)
9234 i.xstate |= xstate_xmm;
9235 }
c4694f17
TG
9236 if ((i.xstate & xstate_xmm)
9237 || i.tm.cpu_flags.bitfield.cpuwidekl
9238 || i.tm.cpu_flags.bitfield.cpukl)
b4a3a7b4 9239 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
921eafea 9240 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 9241 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 9242 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4 9243 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
32930e4e
L
9244 if (i.mask || (i.xstate & xstate_mask) == xstate_mask)
9245 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK;
b4a3a7b4
L
9246 if (i.tm.cpu_flags.bitfield.cpufxsr)
9247 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9248 if (i.tm.cpu_flags.bitfield.cpuxsave)
9249 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9250 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9251 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9252 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9253 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
9254 }
9255#endif
9256
29b0f896
AM
9257 /* Tie dwarf2 debug info to the address at the start of the insn.
9258 We can't do this after the insn has been output as the current
9259 frag may have been closed off. eg. by frag_var. */
9260 dwarf2_emit_insn (0);
9261
2bbd9c25
JJ
9262 insn_start_frag = frag_now;
9263 insn_start_off = frag_now_fix ();
9264
79d72f45 9265 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9266 {
9267 char *p;
9268 /* Branch can be 8 bytes. Leave some room for prefixes. */
9269 unsigned int max_branch_padding_size = 14;
9270
9271 /* Align section to boundary. */
9272 record_alignment (now_seg, align_branch_power);
9273
9274 /* Make room for padding. */
9275 frag_grow (max_branch_padding_size);
9276
9277 /* Start of the padding. */
9278 p = frag_more (0);
9279
9280 fragP = frag_now;
9281
9282 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9283 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9284 NULL, 0, p);
9285
79d72f45 9286 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9287 fragP->tc_frag_data.branch_type = branch;
9288 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9289 }
9290
29b0f896 9291 /* Output jumps. */
0cfa3eb3 9292 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9293 output_branch ();
0cfa3eb3
JB
9294 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9295 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9296 output_jump ();
0cfa3eb3 9297 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9298 output_interseg_jump ();
9299 else
9300 {
9301 /* Output normal instructions here. */
9302 char *p;
9303 unsigned char *q;
47465058 9304 unsigned int j;
331d2d0d 9305 unsigned int prefix;
79d72f45 9306 enum mf_cmp_kind mf_cmp;
4dffcebc 9307
e4e00185 9308 if (avoid_fence
c3949f43
JB
9309 && (i.tm.base_opcode == 0xfaee8
9310 || i.tm.base_opcode == 0xfaef0
9311 || i.tm.base_opcode == 0xfaef8))
48ef937e
JB
9312 {
9313 /* Encode lfence, mfence, and sfence as
9314 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9315 if (now_seg != absolute_section)
9316 {
9317 offsetT val = 0x240483f0ULL;
9318
9319 p = frag_more (5);
9320 md_number_to_chars (p, val, 5);
9321 }
9322 else
9323 abs_section_offset += 5;
9324 return;
9325 }
e4e00185 9326
d022bddd
IT
9327 /* Some processors fail on LOCK prefix. This options makes
9328 assembler ignore LOCK prefix and serves as a workaround. */
9329 if (omit_lock_prefix)
9330 {
9331 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9332 return;
9333 i.prefix[LOCK_PREFIX] = 0;
9334 }
9335
e379e5f3
L
9336 if (branch)
9337 /* Skip if this is a branch. */
9338 ;
79d72f45 9339 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9340 {
9341 /* Make room for padding. */
9342 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9343 p = frag_more (0);
9344
9345 fragP = frag_now;
9346
9347 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9348 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9349 NULL, 0, p);
9350
79d72f45 9351 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9352 fragP->tc_frag_data.branch_type = align_branch_fused;
9353 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9354 }
9355 else if (add_branch_prefix_frag_p ())
9356 {
9357 unsigned int max_prefix_size = align_branch_prefix_size;
9358
9359 /* Make room for padding. */
9360 frag_grow (max_prefix_size);
9361 p = frag_more (0);
9362
9363 fragP = frag_now;
9364
9365 frag_var (rs_machine_dependent, max_prefix_size, 0,
9366 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9367 NULL, 0, p);
9368
9369 fragP->tc_frag_data.max_bytes = max_prefix_size;
9370 }
9371
43234a1e
L
9372 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9373 don't need the explicit prefix. */
9374 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9375 {
7b47a312 9376 switch (i.tm.opcode_modifier.opcodeprefix)
bc4bd9ab 9377 {
7b47a312
L
9378 case PREFIX_0X66:
9379 add_prefix (0x66);
9380 break;
9381 case PREFIX_0XF2:
9382 add_prefix (0xf2);
9383 break;
9384 case PREFIX_0XF3:
9385 add_prefix (0xf3);
c0f3af97 9386 break;
7b47a312
L
9387 case PREFIX_NONE:
9388 switch (i.tm.opcode_length)
c0f3af97 9389 {
7b47a312
L
9390 case 3:
9391 if (i.tm.base_opcode & 0xff000000)
9392 {
9393 prefix = (i.tm.base_opcode >> 24) & 0xff;
9394 if (!i.tm.cpu_flags.bitfield.cpupadlock
9395 || prefix != REPE_PREFIX_OPCODE
9396 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9397 add_prefix (prefix);
9398 }
9399 break;
9400 case 2:
9401 if ((i.tm.base_opcode & 0xff0000) != 0)
9402 {
9403 prefix = (i.tm.base_opcode >> 16) & 0xff;
9404 add_prefix (prefix);
9405 }
9406 break;
9407 case 1:
9408 break;
9409 case 0:
9410 /* Check for pseudo prefixes. */
9411 as_bad_where (insn_start_frag->fr_file,
9412 insn_start_frag->fr_line,
9413 _("pseudo prefix without instruction"));
9414 return;
9415 default:
9416 abort ();
4dffcebc 9417 }
c0f3af97 9418 break;
c0f3af97
L
9419 default:
9420 abort ();
bc4bd9ab 9421 }
c0f3af97 9422
6d19a37a 9423#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9424 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9425 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9426 perform IE->LE optimization. A dummy REX_OPCODE prefix
9427 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9428 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9429 if (x86_elf_abi == X86_64_X32_ABI
9430 && i.operands == 2
14470f07
L
9431 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9432 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9433 && i.prefix[REX_PREFIX] == 0)
9434 add_prefix (REX_OPCODE);
6d19a37a 9435#endif
cf61b747 9436
c0f3af97
L
9437 /* The prefix bytes. */
9438 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9439 if (*q)
48ef937e 9440 frag_opcode_byte (*q);
0f10071e 9441 }
ae5c1c7b 9442 else
c0f3af97
L
9443 {
9444 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9445 if (*q)
9446 switch (j)
9447 {
c0f3af97
L
9448 case SEG_PREFIX:
9449 case ADDR_PREFIX:
48ef937e 9450 frag_opcode_byte (*q);
c0f3af97
L
9451 break;
9452 default:
9453 /* There should be no other prefixes for instructions
9454 with VEX prefix. */
9455 abort ();
9456 }
9457
43234a1e
L
9458 /* For EVEX instructions i.vrex should become 0 after
9459 build_evex_prefix. For VEX instructions upper 16 registers
9460 aren't available, so VREX should be 0. */
9461 if (i.vrex)
9462 abort ();
c0f3af97 9463 /* Now the VEX prefix. */
48ef937e
JB
9464 if (now_seg != absolute_section)
9465 {
9466 p = frag_more (i.vex.length);
9467 for (j = 0; j < i.vex.length; j++)
9468 p[j] = i.vex.bytes[j];
9469 }
9470 else
9471 abs_section_offset += i.vex.length;
c0f3af97 9472 }
252b5132 9473
29b0f896 9474 /* Now the opcode; be careful about word order here! */
48ef937e
JB
9475 if (now_seg == absolute_section)
9476 abs_section_offset += i.tm.opcode_length;
9477 else if (i.tm.opcode_length == 1)
29b0f896
AM
9478 {
9479 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9480 }
9481 else
9482 {
4dffcebc 9483 switch (i.tm.opcode_length)
331d2d0d 9484 {
43234a1e
L
9485 case 4:
9486 p = frag_more (4);
9487 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9488 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9489 break;
4dffcebc 9490 case 3:
331d2d0d
L
9491 p = frag_more (3);
9492 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9493 break;
9494 case 2:
9495 p = frag_more (2);
9496 break;
9497 default:
9498 abort ();
9499 break;
331d2d0d 9500 }
0f10071e 9501
29b0f896
AM
9502 /* Put out high byte first: can't use md_number_to_chars! */
9503 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9504 *p = i.tm.base_opcode & 0xff;
9505 }
3e73aa7c 9506
29b0f896 9507 /* Now the modrm byte and sib byte (if present). */
40fb9820 9508 if (i.tm.opcode_modifier.modrm)
29b0f896 9509 {
48ef937e
JB
9510 frag_opcode_byte ((i.rm.regmem << 0)
9511 | (i.rm.reg << 3)
9512 | (i.rm.mode << 6));
29b0f896
AM
9513 /* If i.rm.regmem == ESP (4)
9514 && i.rm.mode != (Register mode)
9515 && not 16 bit
9516 ==> need second modrm byte. */
9517 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9518 && i.rm.mode != 3
dc821c5f 9519 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
9520 frag_opcode_byte ((i.sib.base << 0)
9521 | (i.sib.index << 3)
9522 | (i.sib.scale << 6));
29b0f896 9523 }
3e73aa7c 9524
29b0f896 9525 if (i.disp_operands)
2bbd9c25 9526 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9527
29b0f896 9528 if (i.imm_operands)
2bbd9c25 9529 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9530
9531 /*
9532 * frag_now_fix () returning plain abs_section_offset when we're in the
9533 * absolute section, and abs_section_offset not getting updated as data
9534 * gets added to the frag breaks the logic below.
9535 */
9536 if (now_seg != absolute_section)
9537 {
9538 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9539 if (j > 15)
9540 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9541 j);
e379e5f3
L
9542 else if (fragP)
9543 {
9544 /* NB: Don't add prefix with GOTPC relocation since
9545 output_disp() above depends on the fixed encoding
9546 length. Can't add prefix with TLS relocation since
9547 it breaks TLS linker optimization. */
9548 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9549 /* Prefix count on the current instruction. */
9550 unsigned int count = i.vex.length;
9551 unsigned int k;
9552 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9553 /* REX byte is encoded in VEX/EVEX prefix. */
9554 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9555 count++;
9556
9557 /* Count prefixes for extended opcode maps. */
9558 if (!i.vex.length)
9559 switch (i.tm.opcode_length)
9560 {
9561 case 3:
9562 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9563 {
9564 count++;
9565 switch ((i.tm.base_opcode >> 8) & 0xff)
9566 {
9567 case 0x38:
9568 case 0x3a:
9569 count++;
9570 break;
9571 default:
9572 break;
9573 }
9574 }
9575 break;
9576 case 2:
9577 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9578 count++;
9579 break;
9580 case 1:
9581 break;
9582 default:
9583 abort ();
9584 }
9585
9586 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9587 == BRANCH_PREFIX)
9588 {
9589 /* Set the maximum prefix size in BRANCH_PREFIX
9590 frag. */
9591 if (fragP->tc_frag_data.max_bytes > max)
9592 fragP->tc_frag_data.max_bytes = max;
9593 if (fragP->tc_frag_data.max_bytes > count)
9594 fragP->tc_frag_data.max_bytes -= count;
9595 else
9596 fragP->tc_frag_data.max_bytes = 0;
9597 }
9598 else
9599 {
9600 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9601 frag. */
9602 unsigned int max_prefix_size;
9603 if (align_branch_prefix_size > max)
9604 max_prefix_size = max;
9605 else
9606 max_prefix_size = align_branch_prefix_size;
9607 if (max_prefix_size > count)
9608 fragP->tc_frag_data.max_prefix_length
9609 = max_prefix_size - count;
9610 }
9611
9612 /* Use existing segment prefix if possible. Use CS
9613 segment prefix in 64-bit mode. In 32-bit mode, use SS
9614 segment prefix with ESP/EBP base register and use DS
9615 segment prefix without ESP/EBP base register. */
9616 if (i.prefix[SEG_PREFIX])
9617 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9618 else if (flag_code == CODE_64BIT)
9619 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9620 else if (i.base_reg
9621 && (i.base_reg->reg_num == 4
9622 || i.base_reg->reg_num == 5))
9623 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9624 else
9625 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9626 }
9c33702b 9627 }
29b0f896 9628 }
252b5132 9629
e379e5f3
L
9630 /* NB: Don't work with COND_JUMP86 without i386. */
9631 if (align_branch_power
9632 && now_seg != absolute_section
9633 && cpu_arch_flags.bitfield.cpui386)
9634 {
9635 /* Terminate each frag so that we can add prefix and check for
9636 fused jcc. */
9637 frag_wane (frag_now);
9638 frag_new (0);
9639 }
9640
29b0f896
AM
9641#ifdef DEBUG386
9642 if (flag_debug)
9643 {
7b81dfbb 9644 pi ("" /*line*/, &i);
29b0f896
AM
9645 }
9646#endif /* DEBUG386 */
9647}
252b5132 9648
e205caa7
L
9649/* Return the size of the displacement operand N. */
9650
9651static int
9652disp_size (unsigned int n)
9653{
9654 int size = 4;
43234a1e 9655
b5014f7a 9656 if (i.types[n].bitfield.disp64)
40fb9820
L
9657 size = 8;
9658 else if (i.types[n].bitfield.disp8)
9659 size = 1;
9660 else if (i.types[n].bitfield.disp16)
9661 size = 2;
e205caa7
L
9662 return size;
9663}
9664
9665/* Return the size of the immediate operand N. */
9666
9667static int
9668imm_size (unsigned int n)
9669{
9670 int size = 4;
40fb9820
L
9671 if (i.types[n].bitfield.imm64)
9672 size = 8;
9673 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9674 size = 1;
9675 else if (i.types[n].bitfield.imm16)
9676 size = 2;
e205caa7
L
9677 return size;
9678}
9679
29b0f896 9680static void
64e74474 9681output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9682{
9683 char *p;
9684 unsigned int n;
252b5132 9685
29b0f896
AM
9686 for (n = 0; n < i.operands; n++)
9687 {
b5014f7a 9688 if (operand_type_check (i.types[n], disp))
29b0f896 9689 {
48ef937e
JB
9690 int size = disp_size (n);
9691
9692 if (now_seg == absolute_section)
9693 abs_section_offset += size;
9694 else if (i.op[n].disps->X_op == O_constant)
29b0f896 9695 {
43234a1e 9696 offsetT val = i.op[n].disps->X_add_number;
252b5132 9697
629cfaf1
JB
9698 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9699 size);
29b0f896
AM
9700 p = frag_more (size);
9701 md_number_to_chars (p, val, size);
9702 }
9703 else
9704 {
f86103b7 9705 enum bfd_reloc_code_real reloc_type;
40fb9820 9706 int sign = i.types[n].bitfield.disp32s;
29b0f896 9707 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9708 fixS *fixP;
29b0f896 9709
e205caa7 9710 /* We can't have 8 bit displacement here. */
9c2799c2 9711 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9712
29b0f896
AM
9713 /* The PC relative address is computed relative
9714 to the instruction boundary, so in case immediate
9715 fields follows, we need to adjust the value. */
9716 if (pcrel && i.imm_operands)
9717 {
29b0f896 9718 unsigned int n1;
e205caa7 9719 int sz = 0;
252b5132 9720
29b0f896 9721 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9722 if (operand_type_check (i.types[n1], imm))
252b5132 9723 {
e205caa7
L
9724 /* Only one immediate is allowed for PC
9725 relative address. */
9c2799c2 9726 gas_assert (sz == 0);
e205caa7
L
9727 sz = imm_size (n1);
9728 i.op[n].disps->X_add_number -= sz;
252b5132 9729 }
29b0f896 9730 /* We should find the immediate. */
9c2799c2 9731 gas_assert (sz != 0);
29b0f896 9732 }
520dc8e8 9733
29b0f896 9734 p = frag_more (size);
d258b828 9735 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9736 if (GOT_symbol
2bbd9c25 9737 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9738 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9739 || reloc_type == BFD_RELOC_X86_64_32S
9740 || (reloc_type == BFD_RELOC_64
9741 && object_64bit))
d6ab8113
JB
9742 && (i.op[n].disps->X_op == O_symbol
9743 || (i.op[n].disps->X_op == O_add
9744 && ((symbol_get_value_expression
9745 (i.op[n].disps->X_op_symbol)->X_op)
9746 == O_subtract))))
9747 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9748 {
4fa24527 9749 if (!object_64bit)
7b81dfbb
AJ
9750 {
9751 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9752 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9753 i.op[n].imms->X_add_number +=
9754 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9755 }
9756 else if (reloc_type == BFD_RELOC_64)
9757 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9758 else
7b81dfbb
AJ
9759 /* Don't do the adjustment for x86-64, as there
9760 the pcrel addressing is relative to the _next_
9761 insn, and that is taken care of in other code. */
d6ab8113 9762 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9763 }
e379e5f3
L
9764 else if (align_branch_power)
9765 {
9766 switch (reloc_type)
9767 {
9768 case BFD_RELOC_386_TLS_GD:
9769 case BFD_RELOC_386_TLS_LDM:
9770 case BFD_RELOC_386_TLS_IE:
9771 case BFD_RELOC_386_TLS_IE_32:
9772 case BFD_RELOC_386_TLS_GOTIE:
9773 case BFD_RELOC_386_TLS_GOTDESC:
9774 case BFD_RELOC_386_TLS_DESC_CALL:
9775 case BFD_RELOC_X86_64_TLSGD:
9776 case BFD_RELOC_X86_64_TLSLD:
9777 case BFD_RELOC_X86_64_GOTTPOFF:
9778 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9779 case BFD_RELOC_X86_64_TLSDESC_CALL:
9780 i.has_gotpc_tls_reloc = TRUE;
9781 default:
9782 break;
9783 }
9784 }
02a86693
L
9785 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9786 size, i.op[n].disps, pcrel,
9787 reloc_type);
9788 /* Check for "call/jmp *mem", "mov mem, %reg",
9789 "test %reg, mem" and "binop mem, %reg" where binop
9790 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9791 instructions without data prefix. Always generate
9792 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9793 if (i.prefix[DATA_PREFIX] == 0
9794 && (generate_relax_relocations
9795 || (!object_64bit
9796 && i.rm.mode == 0
9797 && i.rm.regmem == 5))
0cb4071e
L
9798 && (i.rm.mode == 2
9799 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9800 && !is_any_vex_encoding(&i.tm)
02a86693
L
9801 && ((i.operands == 1
9802 && i.tm.base_opcode == 0xff
9803 && (i.rm.reg == 2 || i.rm.reg == 4))
9804 || (i.operands == 2
9805 && (i.tm.base_opcode == 0x8b
9806 || i.tm.base_opcode == 0x85
2ae4c703 9807 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9808 {
9809 if (object_64bit)
9810 {
9811 fixP->fx_tcbit = i.rex != 0;
9812 if (i.base_reg
e968fc9b 9813 && (i.base_reg->reg_num == RegIP))
02a86693
L
9814 fixP->fx_tcbit2 = 1;
9815 }
9816 else
9817 fixP->fx_tcbit2 = 1;
9818 }
29b0f896
AM
9819 }
9820 }
9821 }
9822}
252b5132 9823
29b0f896 9824static void
64e74474 9825output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9826{
9827 char *p;
9828 unsigned int n;
252b5132 9829
29b0f896
AM
9830 for (n = 0; n < i.operands; n++)
9831 {
43234a1e
L
9832 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9833 if (i.rounding && (int) n == i.rounding->operand)
9834 continue;
9835
40fb9820 9836 if (operand_type_check (i.types[n], imm))
29b0f896 9837 {
48ef937e
JB
9838 int size = imm_size (n);
9839
9840 if (now_seg == absolute_section)
9841 abs_section_offset += size;
9842 else if (i.op[n].imms->X_op == O_constant)
29b0f896 9843 {
29b0f896 9844 offsetT val;
b4cac588 9845
29b0f896
AM
9846 val = offset_in_range (i.op[n].imms->X_add_number,
9847 size);
9848 p = frag_more (size);
9849 md_number_to_chars (p, val, size);
9850 }
9851 else
9852 {
9853 /* Not absolute_section.
9854 Need a 32-bit fixup (don't support 8bit
9855 non-absolute imms). Try to support other
9856 sizes ... */
f86103b7 9857 enum bfd_reloc_code_real reloc_type;
e205caa7 9858 int sign;
29b0f896 9859
40fb9820 9860 if (i.types[n].bitfield.imm32s
a7d61044 9861 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9862 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9863 sign = 1;
e205caa7
L
9864 else
9865 sign = 0;
520dc8e8 9866
29b0f896 9867 p = frag_more (size);
d258b828 9868 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9869
2bbd9c25
JJ
9870 /* This is tough to explain. We end up with this one if we
9871 * have operands that look like
9872 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9873 * obtain the absolute address of the GOT, and it is strongly
9874 * preferable from a performance point of view to avoid using
9875 * a runtime relocation for this. The actual sequence of
9876 * instructions often look something like:
9877 *
9878 * call .L66
9879 * .L66:
9880 * popl %ebx
9881 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9882 *
9883 * The call and pop essentially return the absolute address
9884 * of the label .L66 and store it in %ebx. The linker itself
9885 * will ultimately change the first operand of the addl so
9886 * that %ebx points to the GOT, but to keep things simple, the
9887 * .o file must have this operand set so that it generates not
9888 * the absolute address of .L66, but the absolute address of
9889 * itself. This allows the linker itself simply treat a GOTPC
9890 * relocation as asking for a pcrel offset to the GOT to be
9891 * added in, and the addend of the relocation is stored in the
9892 * operand field for the instruction itself.
9893 *
9894 * Our job here is to fix the operand so that it would add
9895 * the correct offset so that %ebx would point to itself. The
9896 * thing that is tricky is that .-.L66 will point to the
9897 * beginning of the instruction, so we need to further modify
9898 * the operand so that it will point to itself. There are
9899 * other cases where you have something like:
9900 *
9901 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9902 *
9903 * and here no correction would be required. Internally in
9904 * the assembler we treat operands of this form as not being
9905 * pcrel since the '.' is explicitly mentioned, and I wonder
9906 * whether it would simplify matters to do it this way. Who
9907 * knows. In earlier versions of the PIC patches, the
9908 * pcrel_adjust field was used to store the correction, but
9909 * since the expression is not pcrel, I felt it would be
9910 * confusing to do it this way. */
9911
d6ab8113 9912 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9913 || reloc_type == BFD_RELOC_X86_64_32S
9914 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9915 && GOT_symbol
9916 && GOT_symbol == i.op[n].imms->X_add_symbol
9917 && (i.op[n].imms->X_op == O_symbol
9918 || (i.op[n].imms->X_op == O_add
9919 && ((symbol_get_value_expression
9920 (i.op[n].imms->X_op_symbol)->X_op)
9921 == O_subtract))))
9922 {
4fa24527 9923 if (!object_64bit)
d6ab8113 9924 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9925 else if (size == 4)
d6ab8113 9926 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9927 else if (size == 8)
9928 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9929 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9930 i.op[n].imms->X_add_number +=
9931 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9932 }
29b0f896
AM
9933 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9934 i.op[n].imms, 0, reloc_type);
9935 }
9936 }
9937 }
252b5132
RH
9938}
9939\f
d182319b
JB
9940/* x86_cons_fix_new is called via the expression parsing code when a
9941 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9942static int cons_sign = -1;
9943
9944void
e3bb37b5 9945x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9946 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9947{
d258b828 9948 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9949
9950#ifdef TE_PE
9951 if (exp->X_op == O_secrel)
9952 {
9953 exp->X_op = O_symbol;
9954 r = BFD_RELOC_32_SECREL;
9955 }
9956#endif
9957
9958 fix_new_exp (frag, off, len, exp, 0, r);
9959}
9960
357d1bd8
L
9961/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9962 purpose of the `.dc.a' internal pseudo-op. */
9963
9964int
9965x86_address_bytes (void)
9966{
9967 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9968 return 4;
9969 return stdoutput->arch_info->bits_per_address / 8;
9970}
9971
d382c579
TG
9972#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9973 || defined (LEX_AT)
d258b828 9974# define lex_got(reloc, adjust, types) NULL
718ddfc0 9975#else
f3c180ae
AM
9976/* Parse operands of the form
9977 <symbol>@GOTOFF+<nnn>
9978 and similar .plt or .got references.
9979
9980 If we find one, set up the correct relocation in RELOC and copy the
9981 input string, minus the `@GOTOFF' into a malloc'd buffer for
9982 parsing by the calling routine. Return this buffer, and if ADJUST
9983 is non-null set it to the length of the string we removed from the
9984 input line. Otherwise return NULL. */
9985static char *
91d6fa6a 9986lex_got (enum bfd_reloc_code_real *rel,
64e74474 9987 int *adjust,
d258b828 9988 i386_operand_type *types)
f3c180ae 9989{
7b81dfbb
AJ
9990 /* Some of the relocations depend on the size of what field is to
9991 be relocated. But in our callers i386_immediate and i386_displacement
9992 we don't yet know the operand size (this will be set by insn
9993 matching). Hence we record the word32 relocation here,
9994 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9995 static const struct {
9996 const char *str;
cff8d58a 9997 int len;
4fa24527 9998 const enum bfd_reloc_code_real rel[2];
40fb9820 9999 const i386_operand_type types64;
f3c180ae 10000 } gotrel[] = {
8ce3d284 10001#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
10002 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
10003 BFD_RELOC_SIZE32 },
10004 OPERAND_TYPE_IMM32_64 },
8ce3d284 10005#endif
cff8d58a
L
10006 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
10007 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 10008 OPERAND_TYPE_IMM64 },
cff8d58a
L
10009 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
10010 BFD_RELOC_X86_64_PLT32 },
40fb9820 10011 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10012 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
10013 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 10014 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
10015 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
10016 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 10017 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
10018 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
10019 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 10020 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10021 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
10022 BFD_RELOC_X86_64_TLSGD },
40fb9820 10023 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10024 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
10025 _dummy_first_bfd_reloc_code_real },
40fb9820 10026 OPERAND_TYPE_NONE },
cff8d58a
L
10027 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
10028 BFD_RELOC_X86_64_TLSLD },
40fb9820 10029 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10030 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
10031 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 10032 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10033 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
10034 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 10035 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
10036 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
10037 _dummy_first_bfd_reloc_code_real },
40fb9820 10038 OPERAND_TYPE_NONE },
cff8d58a
L
10039 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
10040 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 10041 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
10042 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
10043 _dummy_first_bfd_reloc_code_real },
40fb9820 10044 OPERAND_TYPE_NONE },
cff8d58a
L
10045 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
10046 _dummy_first_bfd_reloc_code_real },
40fb9820 10047 OPERAND_TYPE_NONE },
cff8d58a
L
10048 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
10049 BFD_RELOC_X86_64_GOT32 },
40fb9820 10050 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
10051 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
10052 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 10053 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10054 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
10055 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 10056 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
10057 };
10058 char *cp;
10059 unsigned int j;
10060
d382c579 10061#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
10062 if (!IS_ELF)
10063 return NULL;
d382c579 10064#endif
718ddfc0 10065
f3c180ae 10066 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 10067 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
10068 return NULL;
10069
47465058 10070 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 10071 {
cff8d58a 10072 int len = gotrel[j].len;
28f81592 10073 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 10074 {
4fa24527 10075 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 10076 {
28f81592
AM
10077 int first, second;
10078 char *tmpbuf, *past_reloc;
f3c180ae 10079
91d6fa6a 10080 *rel = gotrel[j].rel[object_64bit];
f3c180ae 10081
3956db08
JB
10082 if (types)
10083 {
10084 if (flag_code != CODE_64BIT)
40fb9820
L
10085 {
10086 types->bitfield.imm32 = 1;
10087 types->bitfield.disp32 = 1;
10088 }
3956db08
JB
10089 else
10090 *types = gotrel[j].types64;
10091 }
10092
8fd4256d 10093 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
10094 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10095
28f81592 10096 /* The length of the first part of our input line. */
f3c180ae 10097 first = cp - input_line_pointer;
28f81592
AM
10098
10099 /* The second part goes from after the reloc token until
67c11a9b 10100 (and including) an end_of_line char or comma. */
28f81592 10101 past_reloc = cp + 1 + len;
67c11a9b
AM
10102 cp = past_reloc;
10103 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10104 ++cp;
10105 second = cp + 1 - past_reloc;
28f81592
AM
10106
10107 /* Allocate and copy string. The trailing NUL shouldn't
10108 be necessary, but be safe. */
add39d23 10109 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10110 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10111 if (second != 0 && *past_reloc != ' ')
10112 /* Replace the relocation token with ' ', so that
10113 errors like foo@GOTOFF1 will be detected. */
10114 tmpbuf[first++] = ' ';
af89796a
L
10115 else
10116 /* Increment length by 1 if the relocation token is
10117 removed. */
10118 len++;
10119 if (adjust)
10120 *adjust = len;
0787a12d
AM
10121 memcpy (tmpbuf + first, past_reloc, second);
10122 tmpbuf[first + second] = '\0';
f3c180ae
AM
10123 return tmpbuf;
10124 }
10125
4fa24527
JB
10126 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10127 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10128 return NULL;
10129 }
10130 }
10131
10132 /* Might be a symbol version string. Don't as_bad here. */
10133 return NULL;
10134}
4e4f7c87 10135#endif
f3c180ae 10136
a988325c
NC
10137#ifdef TE_PE
10138#ifdef lex_got
10139#undef lex_got
10140#endif
10141/* Parse operands of the form
10142 <symbol>@SECREL32+<nnn>
10143
10144 If we find one, set up the correct relocation in RELOC and copy the
10145 input string, minus the `@SECREL32' into a malloc'd buffer for
10146 parsing by the calling routine. Return this buffer, and if ADJUST
10147 is non-null set it to the length of the string we removed from the
34bca508
L
10148 input line. Otherwise return NULL.
10149
a988325c
NC
10150 This function is copied from the ELF version above adjusted for PE targets. */
10151
10152static char *
10153lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10154 int *adjust ATTRIBUTE_UNUSED,
d258b828 10155 i386_operand_type *types)
a988325c
NC
10156{
10157 static const struct
10158 {
10159 const char *str;
10160 int len;
10161 const enum bfd_reloc_code_real rel[2];
10162 const i386_operand_type types64;
10163 }
10164 gotrel[] =
10165 {
10166 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10167 BFD_RELOC_32_SECREL },
10168 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10169 };
10170
10171 char *cp;
10172 unsigned j;
10173
10174 for (cp = input_line_pointer; *cp != '@'; cp++)
10175 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10176 return NULL;
10177
10178 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10179 {
10180 int len = gotrel[j].len;
10181
10182 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10183 {
10184 if (gotrel[j].rel[object_64bit] != 0)
10185 {
10186 int first, second;
10187 char *tmpbuf, *past_reloc;
10188
10189 *rel = gotrel[j].rel[object_64bit];
10190 if (adjust)
10191 *adjust = len;
10192
10193 if (types)
10194 {
10195 if (flag_code != CODE_64BIT)
10196 {
10197 types->bitfield.imm32 = 1;
10198 types->bitfield.disp32 = 1;
10199 }
10200 else
10201 *types = gotrel[j].types64;
10202 }
10203
10204 /* The length of the first part of our input line. */
10205 first = cp - input_line_pointer;
10206
10207 /* The second part goes from after the reloc token until
10208 (and including) an end_of_line char or comma. */
10209 past_reloc = cp + 1 + len;
10210 cp = past_reloc;
10211 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10212 ++cp;
10213 second = cp + 1 - past_reloc;
10214
10215 /* Allocate and copy string. The trailing NUL shouldn't
10216 be necessary, but be safe. */
add39d23 10217 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10218 memcpy (tmpbuf, input_line_pointer, first);
10219 if (second != 0 && *past_reloc != ' ')
10220 /* Replace the relocation token with ' ', so that
10221 errors like foo@SECLREL321 will be detected. */
10222 tmpbuf[first++] = ' ';
10223 memcpy (tmpbuf + first, past_reloc, second);
10224 tmpbuf[first + second] = '\0';
10225 return tmpbuf;
10226 }
10227
10228 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10229 gotrel[j].str, 1 << (5 + object_64bit));
10230 return NULL;
10231 }
10232 }
10233
10234 /* Might be a symbol version string. Don't as_bad here. */
10235 return NULL;
10236}
10237
10238#endif /* TE_PE */
10239
62ebcb5c 10240bfd_reloc_code_real_type
e3bb37b5 10241x86_cons (expressionS *exp, int size)
f3c180ae 10242{
62ebcb5c
AM
10243 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10244
ee86248c
JB
10245 intel_syntax = -intel_syntax;
10246
3c7b9c2c 10247 exp->X_md = 0;
4fa24527 10248 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10249 {
10250 /* Handle @GOTOFF and the like in an expression. */
10251 char *save;
10252 char *gotfree_input_line;
4a57f2cf 10253 int adjust = 0;
f3c180ae
AM
10254
10255 save = input_line_pointer;
d258b828 10256 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10257 if (gotfree_input_line)
10258 input_line_pointer = gotfree_input_line;
10259
10260 expression (exp);
10261
10262 if (gotfree_input_line)
10263 {
10264 /* expression () has merrily parsed up to the end of line,
10265 or a comma - in the wrong buffer. Transfer how far
10266 input_line_pointer has moved to the right buffer. */
10267 input_line_pointer = (save
10268 + (input_line_pointer - gotfree_input_line)
10269 + adjust);
10270 free (gotfree_input_line);
3992d3b7
AM
10271 if (exp->X_op == O_constant
10272 || exp->X_op == O_absent
10273 || exp->X_op == O_illegal
0398aac5 10274 || exp->X_op == O_register
3992d3b7
AM
10275 || exp->X_op == O_big)
10276 {
10277 char c = *input_line_pointer;
10278 *input_line_pointer = 0;
10279 as_bad (_("missing or invalid expression `%s'"), save);
10280 *input_line_pointer = c;
10281 }
b9519cfe
L
10282 else if ((got_reloc == BFD_RELOC_386_PLT32
10283 || got_reloc == BFD_RELOC_X86_64_PLT32)
10284 && exp->X_op != O_symbol)
10285 {
10286 char c = *input_line_pointer;
10287 *input_line_pointer = 0;
10288 as_bad (_("invalid PLT expression `%s'"), save);
10289 *input_line_pointer = c;
10290 }
f3c180ae
AM
10291 }
10292 }
10293 else
10294 expression (exp);
ee86248c
JB
10295
10296 intel_syntax = -intel_syntax;
10297
10298 if (intel_syntax)
10299 i386_intel_simplify (exp);
62ebcb5c
AM
10300
10301 return got_reloc;
f3c180ae 10302}
f3c180ae 10303
9f32dd5b
L
10304static void
10305signed_cons (int size)
6482c264 10306{
d182319b
JB
10307 if (flag_code == CODE_64BIT)
10308 cons_sign = 1;
10309 cons (size);
10310 cons_sign = -1;
6482c264
NC
10311}
10312
d182319b 10313#ifdef TE_PE
6482c264 10314static void
7016a5d5 10315pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10316{
10317 expressionS exp;
10318
10319 do
10320 {
10321 expression (&exp);
10322 if (exp.X_op == O_symbol)
10323 exp.X_op = O_secrel;
10324
10325 emit_expr (&exp, 4);
10326 }
10327 while (*input_line_pointer++ == ',');
10328
10329 input_line_pointer--;
10330 demand_empty_rest_of_line ();
10331}
6482c264
NC
10332#endif
10333
43234a1e
L
10334/* Handle Vector operations. */
10335
10336static char *
10337check_VecOperations (char *op_string, char *op_end)
10338{
10339 const reg_entry *mask;
10340 const char *saved;
10341 char *end_op;
10342
10343 while (*op_string
10344 && (op_end == NULL || op_string < op_end))
10345 {
10346 saved = op_string;
10347 if (*op_string == '{')
10348 {
10349 op_string++;
10350
10351 /* Check broadcasts. */
10352 if (strncmp (op_string, "1to", 3) == 0)
10353 {
10354 int bcst_type;
10355
10356 if (i.broadcast)
10357 goto duplicated_vec_op;
10358
10359 op_string += 3;
10360 if (*op_string == '8')
8e6e0792 10361 bcst_type = 8;
b28d1bda 10362 else if (*op_string == '4')
8e6e0792 10363 bcst_type = 4;
b28d1bda 10364 else if (*op_string == '2')
8e6e0792 10365 bcst_type = 2;
43234a1e
L
10366 else if (*op_string == '1'
10367 && *(op_string+1) == '6')
10368 {
8e6e0792 10369 bcst_type = 16;
43234a1e
L
10370 op_string++;
10371 }
10372 else
10373 {
10374 as_bad (_("Unsupported broadcast: `%s'"), saved);
10375 return NULL;
10376 }
10377 op_string++;
10378
10379 broadcast_op.type = bcst_type;
10380 broadcast_op.operand = this_operand;
1f75763a 10381 broadcast_op.bytes = 0;
43234a1e
L
10382 i.broadcast = &broadcast_op;
10383 }
10384 /* Check masking operation. */
10385 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10386 {
8a6fb3f9
JB
10387 if (mask == &bad_reg)
10388 return NULL;
10389
43234a1e 10390 /* k0 can't be used for write mask. */
f74a6307 10391 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10392 {
6d2cd6b2
JB
10393 as_bad (_("`%s%s' can't be used for write mask"),
10394 register_prefix, mask->reg_name);
43234a1e
L
10395 return NULL;
10396 }
10397
10398 if (!i.mask)
10399 {
10400 mask_op.mask = mask;
10401 mask_op.zeroing = 0;
10402 mask_op.operand = this_operand;
10403 i.mask = &mask_op;
10404 }
10405 else
10406 {
10407 if (i.mask->mask)
10408 goto duplicated_vec_op;
10409
10410 i.mask->mask = mask;
10411
10412 /* Only "{z}" is allowed here. No need to check
10413 zeroing mask explicitly. */
10414 if (i.mask->operand != this_operand)
10415 {
10416 as_bad (_("invalid write mask `%s'"), saved);
10417 return NULL;
10418 }
10419 }
10420
10421 op_string = end_op;
10422 }
10423 /* Check zeroing-flag for masking operation. */
10424 else if (*op_string == 'z')
10425 {
10426 if (!i.mask)
10427 {
10428 mask_op.mask = NULL;
10429 mask_op.zeroing = 1;
10430 mask_op.operand = this_operand;
10431 i.mask = &mask_op;
10432 }
10433 else
10434 {
10435 if (i.mask->zeroing)
10436 {
10437 duplicated_vec_op:
10438 as_bad (_("duplicated `%s'"), saved);
10439 return NULL;
10440 }
10441
10442 i.mask->zeroing = 1;
10443
10444 /* Only "{%k}" is allowed here. No need to check mask
10445 register explicitly. */
10446 if (i.mask->operand != this_operand)
10447 {
10448 as_bad (_("invalid zeroing-masking `%s'"),
10449 saved);
10450 return NULL;
10451 }
10452 }
10453
10454 op_string++;
10455 }
10456 else
10457 goto unknown_vec_op;
10458
10459 if (*op_string != '}')
10460 {
10461 as_bad (_("missing `}' in `%s'"), saved);
10462 return NULL;
10463 }
10464 op_string++;
0ba3a731
L
10465
10466 /* Strip whitespace since the addition of pseudo prefixes
10467 changed how the scrubber treats '{'. */
10468 if (is_space_char (*op_string))
10469 ++op_string;
10470
43234a1e
L
10471 continue;
10472 }
10473 unknown_vec_op:
10474 /* We don't know this one. */
10475 as_bad (_("unknown vector operation: `%s'"), saved);
10476 return NULL;
10477 }
10478
6d2cd6b2
JB
10479 if (i.mask && i.mask->zeroing && !i.mask->mask)
10480 {
10481 as_bad (_("zeroing-masking only allowed with write mask"));
10482 return NULL;
10483 }
10484
43234a1e
L
10485 return op_string;
10486}
10487
252b5132 10488static int
70e41ade 10489i386_immediate (char *imm_start)
252b5132
RH
10490{
10491 char *save_input_line_pointer;
f3c180ae 10492 char *gotfree_input_line;
252b5132 10493 segT exp_seg = 0;
47926f60 10494 expressionS *exp;
40fb9820
L
10495 i386_operand_type types;
10496
0dfbf9d7 10497 operand_type_set (&types, ~0);
252b5132
RH
10498
10499 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10500 {
31b2323c
L
10501 as_bad (_("at most %d immediate operands are allowed"),
10502 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10503 return 0;
10504 }
10505
10506 exp = &im_expressions[i.imm_operands++];
520dc8e8 10507 i.op[this_operand].imms = exp;
252b5132
RH
10508
10509 if (is_space_char (*imm_start))
10510 ++imm_start;
10511
10512 save_input_line_pointer = input_line_pointer;
10513 input_line_pointer = imm_start;
10514
d258b828 10515 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10516 if (gotfree_input_line)
10517 input_line_pointer = gotfree_input_line;
252b5132
RH
10518
10519 exp_seg = expression (exp);
10520
83183c0c 10521 SKIP_WHITESPACE ();
43234a1e
L
10522
10523 /* Handle vector operations. */
10524 if (*input_line_pointer == '{')
10525 {
10526 input_line_pointer = check_VecOperations (input_line_pointer,
10527 NULL);
10528 if (input_line_pointer == NULL)
10529 return 0;
10530 }
10531
252b5132 10532 if (*input_line_pointer)
f3c180ae 10533 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10534
10535 input_line_pointer = save_input_line_pointer;
f3c180ae 10536 if (gotfree_input_line)
ee86248c
JB
10537 {
10538 free (gotfree_input_line);
10539
10540 if (exp->X_op == O_constant || exp->X_op == O_register)
10541 exp->X_op = O_illegal;
10542 }
10543
10544 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10545}
252b5132 10546
ee86248c
JB
10547static int
10548i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10549 i386_operand_type types, const char *imm_start)
10550{
10551 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10552 {
313c53d1
L
10553 if (imm_start)
10554 as_bad (_("missing or invalid immediate expression `%s'"),
10555 imm_start);
3992d3b7 10556 return 0;
252b5132 10557 }
3e73aa7c 10558 else if (exp->X_op == O_constant)
252b5132 10559 {
47926f60 10560 /* Size it properly later. */
40fb9820 10561 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10562 /* If not 64bit, sign extend val. */
10563 if (flag_code != CODE_64BIT
4eed87de
AM
10564 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10565 exp->X_add_number
10566 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10567 }
4c63da97 10568#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10569 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10570 && exp_seg != absolute_section
47926f60 10571 && exp_seg != text_section
24eab124
AM
10572 && exp_seg != data_section
10573 && exp_seg != bss_section
10574 && exp_seg != undefined_section
f86103b7 10575 && !bfd_is_com_section (exp_seg))
252b5132 10576 {
d0b47220 10577 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10578 return 0;
10579 }
10580#endif
a841bdf5 10581 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10582 {
313c53d1
L
10583 if (imm_start)
10584 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10585 return 0;
10586 }
252b5132
RH
10587 else
10588 {
10589 /* This is an address. The size of the address will be
24eab124 10590 determined later, depending on destination register,
3e73aa7c 10591 suffix, or the default for the section. */
40fb9820
L
10592 i.types[this_operand].bitfield.imm8 = 1;
10593 i.types[this_operand].bitfield.imm16 = 1;
10594 i.types[this_operand].bitfield.imm32 = 1;
10595 i.types[this_operand].bitfield.imm32s = 1;
10596 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10597 i.types[this_operand] = operand_type_and (i.types[this_operand],
10598 types);
252b5132
RH
10599 }
10600
10601 return 1;
10602}
10603
551c1ca1 10604static char *
e3bb37b5 10605i386_scale (char *scale)
252b5132 10606{
551c1ca1
AM
10607 offsetT val;
10608 char *save = input_line_pointer;
252b5132 10609
551c1ca1
AM
10610 input_line_pointer = scale;
10611 val = get_absolute_expression ();
10612
10613 switch (val)
252b5132 10614 {
551c1ca1 10615 case 1:
252b5132
RH
10616 i.log2_scale_factor = 0;
10617 break;
551c1ca1 10618 case 2:
252b5132
RH
10619 i.log2_scale_factor = 1;
10620 break;
551c1ca1 10621 case 4:
252b5132
RH
10622 i.log2_scale_factor = 2;
10623 break;
551c1ca1 10624 case 8:
252b5132
RH
10625 i.log2_scale_factor = 3;
10626 break;
10627 default:
a724f0f4
JB
10628 {
10629 char sep = *input_line_pointer;
10630
10631 *input_line_pointer = '\0';
10632 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10633 scale);
10634 *input_line_pointer = sep;
10635 input_line_pointer = save;
10636 return NULL;
10637 }
252b5132 10638 }
29b0f896 10639 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10640 {
10641 as_warn (_("scale factor of %d without an index register"),
24eab124 10642 1 << i.log2_scale_factor);
252b5132 10643 i.log2_scale_factor = 0;
252b5132 10644 }
551c1ca1
AM
10645 scale = input_line_pointer;
10646 input_line_pointer = save;
10647 return scale;
252b5132
RH
10648}
10649
252b5132 10650static int
e3bb37b5 10651i386_displacement (char *disp_start, char *disp_end)
252b5132 10652{
29b0f896 10653 expressionS *exp;
252b5132
RH
10654 segT exp_seg = 0;
10655 char *save_input_line_pointer;
f3c180ae 10656 char *gotfree_input_line;
40fb9820
L
10657 int override;
10658 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10659 int ret;
252b5132 10660
31b2323c
L
10661 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10662 {
10663 as_bad (_("at most %d displacement operands are allowed"),
10664 MAX_MEMORY_OPERANDS);
10665 return 0;
10666 }
10667
0dfbf9d7 10668 operand_type_set (&bigdisp, 0);
6f2f06be 10669 if (i.jumpabsolute
48bcea9f 10670 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10671 || (current_templates->start->opcode_modifier.jump != JUMP
10672 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10673 {
48bcea9f 10674 i386_addressing_mode ();
e05278af 10675 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10676 if (flag_code == CODE_64BIT)
10677 {
10678 if (!override)
10679 {
10680 bigdisp.bitfield.disp32s = 1;
10681 bigdisp.bitfield.disp64 = 1;
10682 }
48bcea9f
JB
10683 else
10684 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10685 }
10686 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10687 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10688 else
10689 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10690 }
10691 else
10692 {
376cd056
JB
10693 /* For PC-relative branches, the width of the displacement may be
10694 dependent upon data size, but is never dependent upon address size.
10695 Also make sure to not unintentionally match against a non-PC-relative
10696 branch template. */
10697 static templates aux_templates;
10698 const insn_template *t = current_templates->start;
10699 bfd_boolean has_intel64 = FALSE;
10700
10701 aux_templates.start = t;
10702 while (++t < current_templates->end)
10703 {
10704 if (t->opcode_modifier.jump
10705 != current_templates->start->opcode_modifier.jump)
10706 break;
4b5aaf5f 10707 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10708 has_intel64 = TRUE;
10709 }
10710 if (t < current_templates->end)
10711 {
10712 aux_templates.end = t;
10713 current_templates = &aux_templates;
10714 }
10715
e05278af 10716 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10717 if (flag_code == CODE_64BIT)
10718 {
376cd056
JB
10719 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10720 && (!intel64 || !has_intel64))
40fb9820
L
10721 bigdisp.bitfield.disp16 = 1;
10722 else
48bcea9f 10723 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10724 }
10725 else
e05278af
JB
10726 {
10727 if (!override)
10728 override = (i.suffix == (flag_code != CODE_16BIT
10729 ? WORD_MNEM_SUFFIX
10730 : LONG_MNEM_SUFFIX));
40fb9820
L
10731 bigdisp.bitfield.disp32 = 1;
10732 if ((flag_code == CODE_16BIT) ^ override)
10733 {
10734 bigdisp.bitfield.disp32 = 0;
10735 bigdisp.bitfield.disp16 = 1;
10736 }
e05278af 10737 }
e05278af 10738 }
c6fb90c8
L
10739 i.types[this_operand] = operand_type_or (i.types[this_operand],
10740 bigdisp);
252b5132
RH
10741
10742 exp = &disp_expressions[i.disp_operands];
520dc8e8 10743 i.op[this_operand].disps = exp;
252b5132
RH
10744 i.disp_operands++;
10745 save_input_line_pointer = input_line_pointer;
10746 input_line_pointer = disp_start;
10747 END_STRING_AND_SAVE (disp_end);
10748
10749#ifndef GCC_ASM_O_HACK
10750#define GCC_ASM_O_HACK 0
10751#endif
10752#if GCC_ASM_O_HACK
10753 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10754 if (i.types[this_operand].bitfield.baseIndex
24eab124 10755 && displacement_string_end[-1] == '+')
252b5132
RH
10756 {
10757 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10758 constraint within gcc asm statements.
10759 For instance:
10760
10761 #define _set_tssldt_desc(n,addr,limit,type) \
10762 __asm__ __volatile__ ( \
10763 "movw %w2,%0\n\t" \
10764 "movw %w1,2+%0\n\t" \
10765 "rorl $16,%1\n\t" \
10766 "movb %b1,4+%0\n\t" \
10767 "movb %4,5+%0\n\t" \
10768 "movb $0,6+%0\n\t" \
10769 "movb %h1,7+%0\n\t" \
10770 "rorl $16,%1" \
10771 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10772
10773 This works great except that the output assembler ends
10774 up looking a bit weird if it turns out that there is
10775 no offset. You end up producing code that looks like:
10776
10777 #APP
10778 movw $235,(%eax)
10779 movw %dx,2+(%eax)
10780 rorl $16,%edx
10781 movb %dl,4+(%eax)
10782 movb $137,5+(%eax)
10783 movb $0,6+(%eax)
10784 movb %dh,7+(%eax)
10785 rorl $16,%edx
10786 #NO_APP
10787
47926f60 10788 So here we provide the missing zero. */
24eab124
AM
10789
10790 *displacement_string_end = '0';
252b5132
RH
10791 }
10792#endif
d258b828 10793 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10794 if (gotfree_input_line)
10795 input_line_pointer = gotfree_input_line;
252b5132 10796
24eab124 10797 exp_seg = expression (exp);
252b5132 10798
636c26b0
AM
10799 SKIP_WHITESPACE ();
10800 if (*input_line_pointer)
10801 as_bad (_("junk `%s' after expression"), input_line_pointer);
10802#if GCC_ASM_O_HACK
10803 RESTORE_END_STRING (disp_end + 1);
10804#endif
636c26b0 10805 input_line_pointer = save_input_line_pointer;
636c26b0 10806 if (gotfree_input_line)
ee86248c
JB
10807 {
10808 free (gotfree_input_line);
10809
10810 if (exp->X_op == O_constant || exp->X_op == O_register)
10811 exp->X_op = O_illegal;
10812 }
10813
10814 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10815
10816 RESTORE_END_STRING (disp_end);
10817
10818 return ret;
10819}
10820
10821static int
10822i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10823 i386_operand_type types, const char *disp_start)
10824{
10825 i386_operand_type bigdisp;
10826 int ret = 1;
636c26b0 10827
24eab124
AM
10828 /* We do this to make sure that the section symbol is in
10829 the symbol table. We will ultimately change the relocation
47926f60 10830 to be relative to the beginning of the section. */
1ae12ab7 10831 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10832 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10833 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10834 {
636c26b0 10835 if (exp->X_op != O_symbol)
3992d3b7 10836 goto inv_disp;
636c26b0 10837
e5cb08ac 10838 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10839 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10840 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10841 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10842 exp->X_op = O_subtract;
10843 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10844 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10845 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10846 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10847 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10848 else
29b0f896 10849 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10850 }
252b5132 10851
3992d3b7
AM
10852 else if (exp->X_op == O_absent
10853 || exp->X_op == O_illegal
ee86248c 10854 || exp->X_op == O_big)
2daf4fd8 10855 {
3992d3b7
AM
10856 inv_disp:
10857 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10858 disp_start);
3992d3b7 10859 ret = 0;
2daf4fd8
AM
10860 }
10861
0e1147d9
L
10862 else if (flag_code == CODE_64BIT
10863 && !i.prefix[ADDR_PREFIX]
10864 && exp->X_op == O_constant)
10865 {
10866 /* Since displacement is signed extended to 64bit, don't allow
10867 disp32 and turn off disp32s if they are out of range. */
10868 i.types[this_operand].bitfield.disp32 = 0;
10869 if (!fits_in_signed_long (exp->X_add_number))
10870 {
10871 i.types[this_operand].bitfield.disp32s = 0;
10872 if (i.types[this_operand].bitfield.baseindex)
10873 {
10874 as_bad (_("0x%lx out range of signed 32bit displacement"),
10875 (long) exp->X_add_number);
10876 ret = 0;
10877 }
10878 }
10879 }
10880
4c63da97 10881#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10882 else if (exp->X_op != O_constant
10883 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10884 && exp_seg != absolute_section
10885 && exp_seg != text_section
10886 && exp_seg != data_section
10887 && exp_seg != bss_section
10888 && exp_seg != undefined_section
10889 && !bfd_is_com_section (exp_seg))
24eab124 10890 {
d0b47220 10891 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10892 ret = 0;
24eab124 10893 }
252b5132 10894#endif
3956db08 10895
48bcea9f
JB
10896 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10897 /* Constants get taken care of by optimize_disp(). */
10898 && exp->X_op != O_constant)
10899 i.types[this_operand].bitfield.disp8 = 1;
10900
40fb9820
L
10901 /* Check if this is a displacement only operand. */
10902 bigdisp = i.types[this_operand];
10903 bigdisp.bitfield.disp8 = 0;
10904 bigdisp.bitfield.disp16 = 0;
10905 bigdisp.bitfield.disp32 = 0;
10906 bigdisp.bitfield.disp32s = 0;
10907 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10908 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10909 i.types[this_operand] = operand_type_and (i.types[this_operand],
10910 types);
3956db08 10911
3992d3b7 10912 return ret;
252b5132
RH
10913}
10914
2abc2bec
JB
10915/* Return the active addressing mode, taking address override and
10916 registers forming the address into consideration. Update the
10917 address override prefix if necessary. */
47926f60 10918
2abc2bec
JB
10919static enum flag_code
10920i386_addressing_mode (void)
252b5132 10921{
be05d201
L
10922 enum flag_code addr_mode;
10923
10924 if (i.prefix[ADDR_PREFIX])
10925 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10926 else if (flag_code == CODE_16BIT
10927 && current_templates->start->cpu_flags.bitfield.cpumpx
10928 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10929 from md_assemble() by "is not a valid base/index expression"
10930 when there is a base and/or index. */
10931 && !i.types[this_operand].bitfield.baseindex)
10932 {
10933 /* MPX insn memory operands with neither base nor index must be forced
10934 to use 32-bit addressing in 16-bit mode. */
10935 addr_mode = CODE_32BIT;
10936 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10937 ++i.prefixes;
10938 gas_assert (!i.types[this_operand].bitfield.disp16);
10939 gas_assert (!i.types[this_operand].bitfield.disp32);
10940 }
be05d201
L
10941 else
10942 {
10943 addr_mode = flag_code;
10944
24eab124 10945#if INFER_ADDR_PREFIX
be05d201
L
10946 if (i.mem_operands == 0)
10947 {
10948 /* Infer address prefix from the first memory operand. */
10949 const reg_entry *addr_reg = i.base_reg;
10950
10951 if (addr_reg == NULL)
10952 addr_reg = i.index_reg;
eecb386c 10953
be05d201
L
10954 if (addr_reg)
10955 {
e968fc9b 10956 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10957 addr_mode = CODE_32BIT;
10958 else if (flag_code != CODE_64BIT
dc821c5f 10959 && addr_reg->reg_type.bitfield.word)
be05d201
L
10960 addr_mode = CODE_16BIT;
10961
10962 if (addr_mode != flag_code)
10963 {
10964 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10965 i.prefixes += 1;
10966 /* Change the size of any displacement too. At most one
10967 of Disp16 or Disp32 is set.
10968 FIXME. There doesn't seem to be any real need for
10969 separate Disp16 and Disp32 flags. The same goes for
10970 Imm16 and Imm32. Removing them would probably clean
10971 up the code quite a lot. */
10972 if (flag_code != CODE_64BIT
10973 && (i.types[this_operand].bitfield.disp16
10974 || i.types[this_operand].bitfield.disp32))
10975 i.types[this_operand]
10976 = operand_type_xor (i.types[this_operand], disp16_32);
10977 }
10978 }
10979 }
24eab124 10980#endif
be05d201
L
10981 }
10982
2abc2bec
JB
10983 return addr_mode;
10984}
10985
10986/* Make sure the memory operand we've been dealt is valid.
10987 Return 1 on success, 0 on a failure. */
10988
10989static int
10990i386_index_check (const char *operand_string)
10991{
10992 const char *kind = "base/index";
10993 enum flag_code addr_mode = i386_addressing_mode ();
10994
fc0763e6 10995 if (current_templates->start->opcode_modifier.isstring
c3949f43 10996 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10997 && (current_templates->end[-1].opcode_modifier.isstring
10998 || i.mem_operands))
10999 {
11000 /* Memory operands of string insns are special in that they only allow
11001 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
11002 const reg_entry *expected_reg;
11003 static const char *di_si[][2] =
11004 {
11005 { "esi", "edi" },
11006 { "si", "di" },
11007 { "rsi", "rdi" }
11008 };
11009 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
11010
11011 kind = "string address";
11012
8325cc63 11013 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 11014 {
51c8edf6
JB
11015 int es_op = current_templates->end[-1].opcode_modifier.isstring
11016 - IS_STRING_ES_OP0;
11017 int op = 0;
fc0763e6 11018
51c8edf6 11019 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
11020 || ((!i.mem_operands != !intel_syntax)
11021 && current_templates->end[-1].operand_types[1]
11022 .bitfield.baseindex))
51c8edf6 11023 op = 1;
fe0e921f
AM
11024 expected_reg
11025 = (const reg_entry *) str_hash_find (reg_hash,
11026 di_si[addr_mode][op == es_op]);
fc0763e6
JB
11027 }
11028 else
fe0e921f
AM
11029 expected_reg
11030 = (const reg_entry *)str_hash_find (reg_hash, bx[addr_mode]);
fc0763e6 11031
be05d201
L
11032 if (i.base_reg != expected_reg
11033 || i.index_reg
fc0763e6 11034 || operand_type_check (i.types[this_operand], disp))
fc0763e6 11035 {
be05d201
L
11036 /* The second memory operand must have the same size as
11037 the first one. */
11038 if (i.mem_operands
11039 && i.base_reg
11040 && !((addr_mode == CODE_64BIT
dc821c5f 11041 && i.base_reg->reg_type.bitfield.qword)
be05d201 11042 || (addr_mode == CODE_32BIT
dc821c5f
JB
11043 ? i.base_reg->reg_type.bitfield.dword
11044 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
11045 goto bad_address;
11046
fc0763e6
JB
11047 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
11048 operand_string,
11049 intel_syntax ? '[' : '(',
11050 register_prefix,
be05d201 11051 expected_reg->reg_name,
fc0763e6 11052 intel_syntax ? ']' : ')');
be05d201 11053 return 1;
fc0763e6 11054 }
be05d201
L
11055 else
11056 return 1;
11057
dc1e8a47 11058 bad_address:
be05d201
L
11059 as_bad (_("`%s' is not a valid %s expression"),
11060 operand_string, kind);
11061 return 0;
3e73aa7c
JH
11062 }
11063 else
11064 {
be05d201
L
11065 if (addr_mode != CODE_16BIT)
11066 {
11067 /* 32-bit/64-bit checks. */
41eb8e88
L
11068 if (i.disp_encoding == disp_encoding_16bit)
11069 {
11070 bad_disp:
11071 as_bad (_("invalid `%s' prefix"),
11072 addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}");
11073 return 0;
11074 }
11075
be05d201 11076 if ((i.base_reg
e968fc9b
JB
11077 && ((addr_mode == CODE_64BIT
11078 ? !i.base_reg->reg_type.bitfield.qword
11079 : !i.base_reg->reg_type.bitfield.dword)
11080 || (i.index_reg && i.base_reg->reg_num == RegIP)
11081 || i.base_reg->reg_num == RegIZ))
be05d201 11082 || (i.index_reg
1b54b8d7
JB
11083 && !i.index_reg->reg_type.bitfield.xmmword
11084 && !i.index_reg->reg_type.bitfield.ymmword
11085 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 11086 && ((addr_mode == CODE_64BIT
e968fc9b
JB
11087 ? !i.index_reg->reg_type.bitfield.qword
11088 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
11089 || !i.index_reg->reg_type.bitfield.baseindex)))
11090 goto bad_address;
8178be5b 11091
260cd341 11092 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
8178be5b 11093 if (current_templates->start->base_opcode == 0xf30f1b
260cd341
LC
11094 || (current_templates->start->base_opcode & ~1) == 0x0f1a
11095 || current_templates->start->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11096 {
11097 /* They cannot use RIP-relative addressing. */
e968fc9b 11098 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11099 {
11100 as_bad (_("`%s' cannot be used here"), operand_string);
11101 return 0;
11102 }
11103
11104 /* bndldx and bndstx ignore their scale factor. */
260cd341 11105 if ((current_templates->start->base_opcode & ~1) == 0x0f1a
8178be5b
JB
11106 && i.log2_scale_factor)
11107 as_warn (_("register scaling is being ignored here"));
11108 }
be05d201
L
11109 }
11110 else
3e73aa7c 11111 {
be05d201 11112 /* 16-bit checks. */
41eb8e88
L
11113 if (i.disp_encoding == disp_encoding_32bit)
11114 goto bad_disp;
11115
3e73aa7c 11116 if ((i.base_reg
dc821c5f 11117 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11118 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11119 || (i.index_reg
dc821c5f 11120 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11121 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11122 || !(i.base_reg
11123 && i.base_reg->reg_num < 6
11124 && i.index_reg->reg_num >= 6
11125 && i.log2_scale_factor == 0))))
be05d201 11126 goto bad_address;
3e73aa7c
JH
11127 }
11128 }
be05d201 11129 return 1;
24eab124 11130}
252b5132 11131
43234a1e
L
11132/* Handle vector immediates. */
11133
11134static int
11135RC_SAE_immediate (const char *imm_start)
11136{
11137 unsigned int match_found, j;
11138 const char *pstr = imm_start;
11139 expressionS *exp;
11140
11141 if (*pstr != '{')
11142 return 0;
11143
11144 pstr++;
11145 match_found = 0;
11146 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11147 {
11148 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11149 {
11150 if (!i.rounding)
11151 {
11152 rc_op.type = RC_NamesTable[j].type;
11153 rc_op.operand = this_operand;
11154 i.rounding = &rc_op;
11155 }
11156 else
11157 {
11158 as_bad (_("duplicated `%s'"), imm_start);
11159 return 0;
11160 }
11161 pstr += RC_NamesTable[j].len;
11162 match_found = 1;
11163 break;
11164 }
11165 }
11166 if (!match_found)
11167 return 0;
11168
11169 if (*pstr++ != '}')
11170 {
11171 as_bad (_("Missing '}': '%s'"), imm_start);
11172 return 0;
11173 }
11174 /* RC/SAE immediate string should contain nothing more. */;
11175 if (*pstr != 0)
11176 {
11177 as_bad (_("Junk after '}': '%s'"), imm_start);
11178 return 0;
11179 }
11180
11181 exp = &im_expressions[i.imm_operands++];
11182 i.op[this_operand].imms = exp;
11183
11184 exp->X_op = O_constant;
11185 exp->X_add_number = 0;
11186 exp->X_add_symbol = (symbolS *) 0;
11187 exp->X_op_symbol = (symbolS *) 0;
11188
11189 i.types[this_operand].bitfield.imm8 = 1;
11190 return 1;
11191}
11192
8325cc63
JB
11193/* Only string instructions can have a second memory operand, so
11194 reduce current_templates to just those if it contains any. */
11195static int
11196maybe_adjust_templates (void)
11197{
11198 const insn_template *t;
11199
11200 gas_assert (i.mem_operands == 1);
11201
11202 for (t = current_templates->start; t < current_templates->end; ++t)
11203 if (t->opcode_modifier.isstring)
11204 break;
11205
11206 if (t < current_templates->end)
11207 {
11208 static templates aux_templates;
11209 bfd_boolean recheck;
11210
11211 aux_templates.start = t;
11212 for (; t < current_templates->end; ++t)
11213 if (!t->opcode_modifier.isstring)
11214 break;
11215 aux_templates.end = t;
11216
11217 /* Determine whether to re-check the first memory operand. */
11218 recheck = (aux_templates.start != current_templates->start
11219 || t != current_templates->end);
11220
11221 current_templates = &aux_templates;
11222
11223 if (recheck)
11224 {
11225 i.mem_operands = 0;
11226 if (i.memop1_string != NULL
11227 && i386_index_check (i.memop1_string) == 0)
11228 return 0;
11229 i.mem_operands = 1;
11230 }
11231 }
11232
11233 return 1;
11234}
11235
fc0763e6 11236/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11237 on error. */
252b5132 11238
252b5132 11239static int
a7619375 11240i386_att_operand (char *operand_string)
252b5132 11241{
af6bdddf
AM
11242 const reg_entry *r;
11243 char *end_op;
24eab124 11244 char *op_string = operand_string;
252b5132 11245
24eab124 11246 if (is_space_char (*op_string))
252b5132
RH
11247 ++op_string;
11248
24eab124 11249 /* We check for an absolute prefix (differentiating,
47926f60 11250 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11251 if (*op_string == ABSOLUTE_PREFIX)
11252 {
11253 ++op_string;
11254 if (is_space_char (*op_string))
11255 ++op_string;
6f2f06be 11256 i.jumpabsolute = TRUE;
24eab124 11257 }
252b5132 11258
47926f60 11259 /* Check if operand is a register. */
4d1bb795 11260 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11261 {
40fb9820
L
11262 i386_operand_type temp;
11263
8a6fb3f9
JB
11264 if (r == &bad_reg)
11265 return 0;
11266
24eab124
AM
11267 /* Check for a segment override by searching for ':' after a
11268 segment register. */
11269 op_string = end_op;
11270 if (is_space_char (*op_string))
11271 ++op_string;
00cee14f 11272 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11273 {
11274 switch (r->reg_num)
11275 {
11276 case 0:
11277 i.seg[i.mem_operands] = &es;
11278 break;
11279 case 1:
11280 i.seg[i.mem_operands] = &cs;
11281 break;
11282 case 2:
11283 i.seg[i.mem_operands] = &ss;
11284 break;
11285 case 3:
11286 i.seg[i.mem_operands] = &ds;
11287 break;
11288 case 4:
11289 i.seg[i.mem_operands] = &fs;
11290 break;
11291 case 5:
11292 i.seg[i.mem_operands] = &gs;
11293 break;
11294 }
252b5132 11295
24eab124 11296 /* Skip the ':' and whitespace. */
252b5132
RH
11297 ++op_string;
11298 if (is_space_char (*op_string))
24eab124 11299 ++op_string;
252b5132 11300
24eab124
AM
11301 if (!is_digit_char (*op_string)
11302 && !is_identifier_char (*op_string)
11303 && *op_string != '('
11304 && *op_string != ABSOLUTE_PREFIX)
11305 {
11306 as_bad (_("bad memory operand `%s'"), op_string);
11307 return 0;
11308 }
47926f60 11309 /* Handle case of %es:*foo. */
24eab124
AM
11310 if (*op_string == ABSOLUTE_PREFIX)
11311 {
11312 ++op_string;
11313 if (is_space_char (*op_string))
11314 ++op_string;
6f2f06be 11315 i.jumpabsolute = TRUE;
24eab124
AM
11316 }
11317 goto do_memory_reference;
11318 }
43234a1e
L
11319
11320 /* Handle vector operations. */
11321 if (*op_string == '{')
11322 {
11323 op_string = check_VecOperations (op_string, NULL);
11324 if (op_string == NULL)
11325 return 0;
11326 }
11327
24eab124
AM
11328 if (*op_string)
11329 {
d0b47220 11330 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11331 return 0;
11332 }
40fb9820
L
11333 temp = r->reg_type;
11334 temp.bitfield.baseindex = 0;
c6fb90c8
L
11335 i.types[this_operand] = operand_type_or (i.types[this_operand],
11336 temp);
7d5e4556 11337 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11338 i.op[this_operand].regs = r;
24eab124
AM
11339 i.reg_operands++;
11340 }
af6bdddf
AM
11341 else if (*op_string == REGISTER_PREFIX)
11342 {
11343 as_bad (_("bad register name `%s'"), op_string);
11344 return 0;
11345 }
24eab124 11346 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11347 {
24eab124 11348 ++op_string;
6f2f06be 11349 if (i.jumpabsolute)
24eab124 11350 {
d0b47220 11351 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11352 return 0;
11353 }
11354 if (!i386_immediate (op_string))
11355 return 0;
11356 }
43234a1e
L
11357 else if (RC_SAE_immediate (operand_string))
11358 {
11359 /* If it is a RC or SAE immediate, do nothing. */
11360 ;
11361 }
24eab124
AM
11362 else if (is_digit_char (*op_string)
11363 || is_identifier_char (*op_string)
d02603dc 11364 || *op_string == '"'
e5cb08ac 11365 || *op_string == '(')
24eab124 11366 {
47926f60 11367 /* This is a memory reference of some sort. */
af6bdddf 11368 char *base_string;
252b5132 11369
47926f60 11370 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11371 char *displacement_string_start;
11372 char *displacement_string_end;
43234a1e 11373 char *vop_start;
252b5132 11374
24eab124 11375 do_memory_reference:
8325cc63
JB
11376 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11377 return 0;
24eab124 11378 if ((i.mem_operands == 1
40fb9820 11379 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11380 || i.mem_operands == 2)
11381 {
11382 as_bad (_("too many memory references for `%s'"),
11383 current_templates->start->name);
11384 return 0;
11385 }
252b5132 11386
24eab124
AM
11387 /* Check for base index form. We detect the base index form by
11388 looking for an ')' at the end of the operand, searching
11389 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11390 after the '('. */
af6bdddf 11391 base_string = op_string + strlen (op_string);
c3332e24 11392
43234a1e
L
11393 /* Handle vector operations. */
11394 vop_start = strchr (op_string, '{');
11395 if (vop_start && vop_start < base_string)
11396 {
11397 if (check_VecOperations (vop_start, base_string) == NULL)
11398 return 0;
11399 base_string = vop_start;
11400 }
11401
af6bdddf
AM
11402 --base_string;
11403 if (is_space_char (*base_string))
11404 --base_string;
252b5132 11405
47926f60 11406 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11407 displacement_string_start = op_string;
11408 displacement_string_end = base_string + 1;
252b5132 11409
24eab124
AM
11410 if (*base_string == ')')
11411 {
af6bdddf 11412 char *temp_string;
24eab124
AM
11413 unsigned int parens_balanced = 1;
11414 /* We've already checked that the number of left & right ()'s are
47926f60 11415 equal, so this loop will not be infinite. */
24eab124
AM
11416 do
11417 {
11418 base_string--;
11419 if (*base_string == ')')
11420 parens_balanced++;
11421 if (*base_string == '(')
11422 parens_balanced--;
11423 }
11424 while (parens_balanced);
c3332e24 11425
af6bdddf 11426 temp_string = base_string;
c3332e24 11427
24eab124 11428 /* Skip past '(' and whitespace. */
252b5132
RH
11429 ++base_string;
11430 if (is_space_char (*base_string))
24eab124 11431 ++base_string;
252b5132 11432
af6bdddf 11433 if (*base_string == ','
4eed87de
AM
11434 || ((i.base_reg = parse_register (base_string, &end_op))
11435 != NULL))
252b5132 11436 {
af6bdddf 11437 displacement_string_end = temp_string;
252b5132 11438
40fb9820 11439 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11440
af6bdddf 11441 if (i.base_reg)
24eab124 11442 {
8a6fb3f9
JB
11443 if (i.base_reg == &bad_reg)
11444 return 0;
24eab124
AM
11445 base_string = end_op;
11446 if (is_space_char (*base_string))
11447 ++base_string;
af6bdddf
AM
11448 }
11449
11450 /* There may be an index reg or scale factor here. */
11451 if (*base_string == ',')
11452 {
11453 ++base_string;
11454 if (is_space_char (*base_string))
11455 ++base_string;
11456
4eed87de
AM
11457 if ((i.index_reg = parse_register (base_string, &end_op))
11458 != NULL)
24eab124 11459 {
8a6fb3f9
JB
11460 if (i.index_reg == &bad_reg)
11461 return 0;
af6bdddf 11462 base_string = end_op;
24eab124
AM
11463 if (is_space_char (*base_string))
11464 ++base_string;
af6bdddf
AM
11465 if (*base_string == ',')
11466 {
11467 ++base_string;
11468 if (is_space_char (*base_string))
11469 ++base_string;
11470 }
e5cb08ac 11471 else if (*base_string != ')')
af6bdddf 11472 {
4eed87de
AM
11473 as_bad (_("expecting `,' or `)' "
11474 "after index register in `%s'"),
af6bdddf
AM
11475 operand_string);
11476 return 0;
11477 }
24eab124 11478 }
af6bdddf 11479 else if (*base_string == REGISTER_PREFIX)
24eab124 11480 {
f76bf5e0
L
11481 end_op = strchr (base_string, ',');
11482 if (end_op)
11483 *end_op = '\0';
af6bdddf 11484 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11485 return 0;
11486 }
252b5132 11487
47926f60 11488 /* Check for scale factor. */
551c1ca1 11489 if (*base_string != ')')
af6bdddf 11490 {
551c1ca1
AM
11491 char *end_scale = i386_scale (base_string);
11492
11493 if (!end_scale)
af6bdddf 11494 return 0;
24eab124 11495
551c1ca1 11496 base_string = end_scale;
af6bdddf
AM
11497 if (is_space_char (*base_string))
11498 ++base_string;
11499 if (*base_string != ')')
11500 {
4eed87de
AM
11501 as_bad (_("expecting `)' "
11502 "after scale factor in `%s'"),
af6bdddf
AM
11503 operand_string);
11504 return 0;
11505 }
11506 }
11507 else if (!i.index_reg)
24eab124 11508 {
4eed87de
AM
11509 as_bad (_("expecting index register or scale factor "
11510 "after `,'; got '%c'"),
af6bdddf 11511 *base_string);
24eab124
AM
11512 return 0;
11513 }
11514 }
af6bdddf 11515 else if (*base_string != ')')
24eab124 11516 {
4eed87de
AM
11517 as_bad (_("expecting `,' or `)' "
11518 "after base register in `%s'"),
af6bdddf 11519 operand_string);
24eab124
AM
11520 return 0;
11521 }
c3332e24 11522 }
af6bdddf 11523 else if (*base_string == REGISTER_PREFIX)
c3332e24 11524 {
f76bf5e0
L
11525 end_op = strchr (base_string, ',');
11526 if (end_op)
11527 *end_op = '\0';
af6bdddf 11528 as_bad (_("bad register name `%s'"), base_string);
24eab124 11529 return 0;
c3332e24 11530 }
24eab124
AM
11531 }
11532
11533 /* If there's an expression beginning the operand, parse it,
11534 assuming displacement_string_start and
11535 displacement_string_end are meaningful. */
11536 if (displacement_string_start != displacement_string_end)
11537 {
11538 if (!i386_displacement (displacement_string_start,
11539 displacement_string_end))
11540 return 0;
11541 }
11542
11543 /* Special case for (%dx) while doing input/output op. */
11544 if (i.base_reg
75e5731b
JB
11545 && i.base_reg->reg_type.bitfield.instance == RegD
11546 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11547 && i.index_reg == 0
11548 && i.log2_scale_factor == 0
11549 && i.seg[i.mem_operands] == 0
40fb9820 11550 && !operand_type_check (i.types[this_operand], disp))
24eab124 11551 {
2fb5be8d 11552 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11553 return 1;
11554 }
11555
eecb386c
AM
11556 if (i386_index_check (operand_string) == 0)
11557 return 0;
c48dadc9 11558 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11559 if (i.mem_operands == 0)
11560 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11561 i.mem_operands++;
11562 }
11563 else
ce8a8b2f
AM
11564 {
11565 /* It's not a memory operand; argh! */
24eab124
AM
11566 as_bad (_("invalid char %s beginning operand %d `%s'"),
11567 output_invalid (*op_string),
11568 this_operand + 1,
11569 op_string);
11570 return 0;
11571 }
47926f60 11572 return 1; /* Normal return. */
252b5132
RH
11573}
11574\f
fa94de6b
RM
11575/* Calculate the maximum variable size (i.e., excluding fr_fix)
11576 that an rs_machine_dependent frag may reach. */
11577
11578unsigned int
11579i386_frag_max_var (fragS *frag)
11580{
11581 /* The only relaxable frags are for jumps.
11582 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11583 gas_assert (frag->fr_type == rs_machine_dependent);
11584 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11585}
11586
b084df0b
L
11587#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11588static int
8dcea932 11589elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11590{
11591 /* STT_GNU_IFUNC symbol must go through PLT. */
11592 if ((symbol_get_bfdsym (fr_symbol)->flags
11593 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11594 return 0;
11595
11596 if (!S_IS_EXTERNAL (fr_symbol))
11597 /* Symbol may be weak or local. */
11598 return !S_IS_WEAK (fr_symbol);
11599
8dcea932
L
11600 /* Global symbols with non-default visibility can't be preempted. */
11601 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11602 return 1;
11603
11604 if (fr_var != NO_RELOC)
11605 switch ((enum bfd_reloc_code_real) fr_var)
11606 {
11607 case BFD_RELOC_386_PLT32:
11608 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11609 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11610 return 0;
11611 default:
11612 abort ();
11613 }
11614
b084df0b
L
11615 /* Global symbols with default visibility in a shared library may be
11616 preempted by another definition. */
8dcea932 11617 return !shared;
b084df0b
L
11618}
11619#endif
11620
79d72f45
HL
11621/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11622 Note also work for Skylake and Cascadelake.
11623---------------------------------------------------------------------
11624| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11625| ------ | ----------- | ------- | -------- |
11626| Jo | N | N | Y |
11627| Jno | N | N | Y |
11628| Jc/Jb | Y | N | Y |
11629| Jae/Jnb | Y | N | Y |
11630| Je/Jz | Y | Y | Y |
11631| Jne/Jnz | Y | Y | Y |
11632| Jna/Jbe | Y | N | Y |
11633| Ja/Jnbe | Y | N | Y |
11634| Js | N | N | Y |
11635| Jns | N | N | Y |
11636| Jp/Jpe | N | N | Y |
11637| Jnp/Jpo | N | N | Y |
11638| Jl/Jnge | Y | Y | Y |
11639| Jge/Jnl | Y | Y | Y |
11640| Jle/Jng | Y | Y | Y |
11641| Jg/Jnle | Y | Y | Y |
11642--------------------------------------------------------------------- */
11643static int
11644i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11645{
11646 if (mf_cmp == mf_cmp_alu_cmp)
11647 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11648 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11649 if (mf_cmp == mf_cmp_incdec)
11650 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11651 || mf_jcc == mf_jcc_jle);
11652 if (mf_cmp == mf_cmp_test_and)
11653 return 1;
11654 return 0;
11655}
11656
e379e5f3
L
11657/* Return the next non-empty frag. */
11658
11659static fragS *
11660i386_next_non_empty_frag (fragS *fragP)
11661{
11662 /* There may be a frag with a ".fill 0" when there is no room in
11663 the current frag for frag_grow in output_insn. */
11664 for (fragP = fragP->fr_next;
11665 (fragP != NULL
11666 && fragP->fr_type == rs_fill
11667 && fragP->fr_fix == 0);
11668 fragP = fragP->fr_next)
11669 ;
11670 return fragP;
11671}
11672
11673/* Return the next jcc frag after BRANCH_PADDING. */
11674
11675static fragS *
79d72f45 11676i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11677{
79d72f45
HL
11678 fragS *branch_fragP;
11679 if (!pad_fragP)
e379e5f3
L
11680 return NULL;
11681
79d72f45
HL
11682 if (pad_fragP->fr_type == rs_machine_dependent
11683 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11684 == BRANCH_PADDING))
11685 {
79d72f45
HL
11686 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11687 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11688 return NULL;
79d72f45
HL
11689 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11690 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11691 pad_fragP->tc_frag_data.mf_type))
11692 return branch_fragP;
e379e5f3
L
11693 }
11694
11695 return NULL;
11696}
11697
11698/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11699
11700static void
11701i386_classify_machine_dependent_frag (fragS *fragP)
11702{
11703 fragS *cmp_fragP;
11704 fragS *pad_fragP;
11705 fragS *branch_fragP;
11706 fragS *next_fragP;
11707 unsigned int max_prefix_length;
11708
11709 if (fragP->tc_frag_data.classified)
11710 return;
11711
11712 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11713 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11714 for (next_fragP = fragP;
11715 next_fragP != NULL;
11716 next_fragP = next_fragP->fr_next)
11717 {
11718 next_fragP->tc_frag_data.classified = 1;
11719 if (next_fragP->fr_type == rs_machine_dependent)
11720 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11721 {
11722 case BRANCH_PADDING:
11723 /* The BRANCH_PADDING frag must be followed by a branch
11724 frag. */
11725 branch_fragP = i386_next_non_empty_frag (next_fragP);
11726 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11727 break;
11728 case FUSED_JCC_PADDING:
11729 /* Check if this is a fused jcc:
11730 FUSED_JCC_PADDING
11731 CMP like instruction
11732 BRANCH_PADDING
11733 COND_JUMP
11734 */
11735 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11736 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11737 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11738 if (branch_fragP)
11739 {
11740 /* The BRANCH_PADDING frag is merged with the
11741 FUSED_JCC_PADDING frag. */
11742 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11743 /* CMP like instruction size. */
11744 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11745 frag_wane (pad_fragP);
11746 /* Skip to branch_fragP. */
11747 next_fragP = branch_fragP;
11748 }
11749 else if (next_fragP->tc_frag_data.max_prefix_length)
11750 {
11751 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11752 a fused jcc. */
11753 next_fragP->fr_subtype
11754 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11755 next_fragP->tc_frag_data.max_bytes
11756 = next_fragP->tc_frag_data.max_prefix_length;
11757 /* This will be updated in the BRANCH_PREFIX scan. */
11758 next_fragP->tc_frag_data.max_prefix_length = 0;
11759 }
11760 else
11761 frag_wane (next_fragP);
11762 break;
11763 }
11764 }
11765
11766 /* Stop if there is no BRANCH_PREFIX. */
11767 if (!align_branch_prefix_size)
11768 return;
11769
11770 /* Scan for BRANCH_PREFIX. */
11771 for (; fragP != NULL; fragP = fragP->fr_next)
11772 {
11773 if (fragP->fr_type != rs_machine_dependent
11774 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11775 != BRANCH_PREFIX))
11776 continue;
11777
11778 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11779 COND_JUMP_PREFIX. */
11780 max_prefix_length = 0;
11781 for (next_fragP = fragP;
11782 next_fragP != NULL;
11783 next_fragP = next_fragP->fr_next)
11784 {
11785 if (next_fragP->fr_type == rs_fill)
11786 /* Skip rs_fill frags. */
11787 continue;
11788 else if (next_fragP->fr_type != rs_machine_dependent)
11789 /* Stop for all other frags. */
11790 break;
11791
11792 /* rs_machine_dependent frags. */
11793 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11794 == BRANCH_PREFIX)
11795 {
11796 /* Count BRANCH_PREFIX frags. */
11797 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11798 {
11799 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11800 frag_wane (next_fragP);
11801 }
11802 else
11803 max_prefix_length
11804 += next_fragP->tc_frag_data.max_bytes;
11805 }
11806 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11807 == BRANCH_PADDING)
11808 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11809 == FUSED_JCC_PADDING))
11810 {
11811 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11812 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11813 break;
11814 }
11815 else
11816 /* Stop for other rs_machine_dependent frags. */
11817 break;
11818 }
11819
11820 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11821
11822 /* Skip to the next frag. */
11823 fragP = next_fragP;
11824 }
11825}
11826
11827/* Compute padding size for
11828
11829 FUSED_JCC_PADDING
11830 CMP like instruction
11831 BRANCH_PADDING
11832 COND_JUMP/UNCOND_JUMP
11833
11834 or
11835
11836 BRANCH_PADDING
11837 COND_JUMP/UNCOND_JUMP
11838 */
11839
11840static int
11841i386_branch_padding_size (fragS *fragP, offsetT address)
11842{
11843 unsigned int offset, size, padding_size;
11844 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11845
11846 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11847 if (!address)
11848 address = fragP->fr_address;
11849 address += fragP->fr_fix;
11850
11851 /* CMP like instrunction size. */
11852 size = fragP->tc_frag_data.cmp_size;
11853
11854 /* The base size of the branch frag. */
11855 size += branch_fragP->fr_fix;
11856
11857 /* Add opcode and displacement bytes for the rs_machine_dependent
11858 branch frag. */
11859 if (branch_fragP->fr_type == rs_machine_dependent)
11860 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11861
11862 /* Check if branch is within boundary and doesn't end at the last
11863 byte. */
11864 offset = address & ((1U << align_branch_power) - 1);
11865 if ((offset + size) >= (1U << align_branch_power))
11866 /* Padding needed to avoid crossing boundary. */
11867 padding_size = (1U << align_branch_power) - offset;
11868 else
11869 /* No padding needed. */
11870 padding_size = 0;
11871
11872 /* The return value may be saved in tc_frag_data.length which is
11873 unsigned byte. */
11874 if (!fits_in_unsigned_byte (padding_size))
11875 abort ();
11876
11877 return padding_size;
11878}
11879
11880/* i386_generic_table_relax_frag()
11881
11882 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11883 grow/shrink padding to align branch frags. Hand others to
11884 relax_frag(). */
11885
11886long
11887i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11888{
11889 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11890 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11891 {
11892 long padding_size = i386_branch_padding_size (fragP, 0);
11893 long grow = padding_size - fragP->tc_frag_data.length;
11894
11895 /* When the BRANCH_PREFIX frag is used, the computed address
11896 must match the actual address and there should be no padding. */
11897 if (fragP->tc_frag_data.padding_address
11898 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11899 || padding_size))
11900 abort ();
11901
11902 /* Update the padding size. */
11903 if (grow)
11904 fragP->tc_frag_data.length = padding_size;
11905
11906 return grow;
11907 }
11908 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11909 {
11910 fragS *padding_fragP, *next_fragP;
11911 long padding_size, left_size, last_size;
11912
11913 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11914 if (!padding_fragP)
11915 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11916 return (fragP->tc_frag_data.length
11917 - fragP->tc_frag_data.last_length);
11918
11919 /* Compute the relative address of the padding frag in the very
11920 first time where the BRANCH_PREFIX frag sizes are zero. */
11921 if (!fragP->tc_frag_data.padding_address)
11922 fragP->tc_frag_data.padding_address
11923 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11924
11925 /* First update the last length from the previous interation. */
11926 left_size = fragP->tc_frag_data.prefix_length;
11927 for (next_fragP = fragP;
11928 next_fragP != padding_fragP;
11929 next_fragP = next_fragP->fr_next)
11930 if (next_fragP->fr_type == rs_machine_dependent
11931 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11932 == BRANCH_PREFIX))
11933 {
11934 if (left_size)
11935 {
11936 int max = next_fragP->tc_frag_data.max_bytes;
11937 if (max)
11938 {
11939 int size;
11940 if (max > left_size)
11941 size = left_size;
11942 else
11943 size = max;
11944 left_size -= size;
11945 next_fragP->tc_frag_data.last_length = size;
11946 }
11947 }
11948 else
11949 next_fragP->tc_frag_data.last_length = 0;
11950 }
11951
11952 /* Check the padding size for the padding frag. */
11953 padding_size = i386_branch_padding_size
11954 (padding_fragP, (fragP->fr_address
11955 + fragP->tc_frag_data.padding_address));
11956
11957 last_size = fragP->tc_frag_data.prefix_length;
11958 /* Check if there is change from the last interation. */
11959 if (padding_size == last_size)
11960 {
11961 /* Update the expected address of the padding frag. */
11962 padding_fragP->tc_frag_data.padding_address
11963 = (fragP->fr_address + padding_size
11964 + fragP->tc_frag_data.padding_address);
11965 return 0;
11966 }
11967
11968 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11969 {
11970 /* No padding if there is no sufficient room. Clear the
11971 expected address of the padding frag. */
11972 padding_fragP->tc_frag_data.padding_address = 0;
11973 padding_size = 0;
11974 }
11975 else
11976 /* Store the expected address of the padding frag. */
11977 padding_fragP->tc_frag_data.padding_address
11978 = (fragP->fr_address + padding_size
11979 + fragP->tc_frag_data.padding_address);
11980
11981 fragP->tc_frag_data.prefix_length = padding_size;
11982
11983 /* Update the length for the current interation. */
11984 left_size = padding_size;
11985 for (next_fragP = fragP;
11986 next_fragP != padding_fragP;
11987 next_fragP = next_fragP->fr_next)
11988 if (next_fragP->fr_type == rs_machine_dependent
11989 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11990 == BRANCH_PREFIX))
11991 {
11992 if (left_size)
11993 {
11994 int max = next_fragP->tc_frag_data.max_bytes;
11995 if (max)
11996 {
11997 int size;
11998 if (max > left_size)
11999 size = left_size;
12000 else
12001 size = max;
12002 left_size -= size;
12003 next_fragP->tc_frag_data.length = size;
12004 }
12005 }
12006 else
12007 next_fragP->tc_frag_data.length = 0;
12008 }
12009
12010 return (fragP->tc_frag_data.length
12011 - fragP->tc_frag_data.last_length);
12012 }
12013 return relax_frag (segment, fragP, stretch);
12014}
12015
ee7fcc42
AM
12016/* md_estimate_size_before_relax()
12017
12018 Called just before relax() for rs_machine_dependent frags. The x86
12019 assembler uses these frags to handle variable size jump
12020 instructions.
12021
12022 Any symbol that is now undefined will not become defined.
12023 Return the correct fr_subtype in the frag.
12024 Return the initial "guess for variable size of frag" to caller.
12025 The guess is actually the growth beyond the fixed part. Whatever
12026 we do to grow the fixed or variable part contributes to our
12027 returned value. */
12028
252b5132 12029int
7016a5d5 12030md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 12031{
e379e5f3
L
12032 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12033 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
12034 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12035 {
12036 i386_classify_machine_dependent_frag (fragP);
12037 return fragP->tc_frag_data.length;
12038 }
12039
252b5132 12040 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
12041 check for un-relaxable symbols. On an ELF system, we can't relax
12042 an externally visible symbol, because it may be overridden by a
12043 shared library. */
12044 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 12045#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12046 || (IS_ELF
8dcea932
L
12047 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
12048 fragP->fr_var))
fbeb56a4
DK
12049#endif
12050#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 12051 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 12052 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
12053#endif
12054 )
252b5132 12055 {
b98ef147
AM
12056 /* Symbol is undefined in this segment, or we need to keep a
12057 reloc so that weak symbols can be overridden. */
12058 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 12059 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
12060 unsigned char *opcode;
12061 int old_fr_fix;
f6af82bd 12062
ee7fcc42 12063 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 12064 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 12065 else if (size == 2)
f6af82bd 12066 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
12067#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12068 else if (need_plt32_p (fragP->fr_symbol))
12069 reloc_type = BFD_RELOC_X86_64_PLT32;
12070#endif
f6af82bd
AM
12071 else
12072 reloc_type = BFD_RELOC_32_PCREL;
252b5132 12073
ee7fcc42
AM
12074 old_fr_fix = fragP->fr_fix;
12075 opcode = (unsigned char *) fragP->fr_opcode;
12076
fddf5b5b 12077 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 12078 {
fddf5b5b
AM
12079 case UNCOND_JUMP:
12080 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 12081 opcode[0] = 0xe9;
252b5132 12082 fragP->fr_fix += size;
062cd5e7
AS
12083 fix_new (fragP, old_fr_fix, size,
12084 fragP->fr_symbol,
12085 fragP->fr_offset, 1,
12086 reloc_type);
252b5132
RH
12087 break;
12088
fddf5b5b 12089 case COND_JUMP86:
412167cb
AM
12090 if (size == 2
12091 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
12092 {
12093 /* Negate the condition, and branch past an
12094 unconditional jump. */
12095 opcode[0] ^= 1;
12096 opcode[1] = 3;
12097 /* Insert an unconditional jump. */
12098 opcode[2] = 0xe9;
12099 /* We added two extra opcode bytes, and have a two byte
12100 offset. */
12101 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12102 fix_new (fragP, old_fr_fix + 2, 2,
12103 fragP->fr_symbol,
12104 fragP->fr_offset, 1,
12105 reloc_type);
fddf5b5b
AM
12106 break;
12107 }
12108 /* Fall through. */
12109
12110 case COND_JUMP:
412167cb
AM
12111 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12112 {
3e02c1cc
AM
12113 fixS *fixP;
12114
412167cb 12115 fragP->fr_fix += 1;
3e02c1cc
AM
12116 fixP = fix_new (fragP, old_fr_fix, 1,
12117 fragP->fr_symbol,
12118 fragP->fr_offset, 1,
12119 BFD_RELOC_8_PCREL);
12120 fixP->fx_signed = 1;
412167cb
AM
12121 break;
12122 }
93c2a809 12123
24eab124 12124 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12125 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12126 opcode[1] = opcode[0] + 0x10;
f6af82bd 12127 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12128 /* We've added an opcode byte. */
12129 fragP->fr_fix += 1 + size;
062cd5e7
AS
12130 fix_new (fragP, old_fr_fix + 1, size,
12131 fragP->fr_symbol,
12132 fragP->fr_offset, 1,
12133 reloc_type);
252b5132 12134 break;
fddf5b5b
AM
12135
12136 default:
12137 BAD_CASE (fragP->fr_subtype);
12138 break;
252b5132
RH
12139 }
12140 frag_wane (fragP);
ee7fcc42 12141 return fragP->fr_fix - old_fr_fix;
252b5132 12142 }
93c2a809 12143
93c2a809
AM
12144 /* Guess size depending on current relax state. Initially the relax
12145 state will correspond to a short jump and we return 1, because
12146 the variable part of the frag (the branch offset) is one byte
12147 long. However, we can relax a section more than once and in that
12148 case we must either set fr_subtype back to the unrelaxed state,
12149 or return the value for the appropriate branch. */
12150 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12151}
12152
47926f60
KH
12153/* Called after relax() is finished.
12154
12155 In: Address of frag.
12156 fr_type == rs_machine_dependent.
12157 fr_subtype is what the address relaxed to.
12158
12159 Out: Any fixSs and constants are set up.
12160 Caller will turn frag into a ".space 0". */
12161
252b5132 12162void
7016a5d5
TG
12163md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12164 fragS *fragP)
252b5132 12165{
29b0f896 12166 unsigned char *opcode;
252b5132 12167 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12168 offsetT target_address;
12169 offsetT opcode_address;
252b5132 12170 unsigned int extension = 0;
847f7ad4 12171 offsetT displacement_from_opcode_start;
252b5132 12172
e379e5f3
L
12173 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12174 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12175 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12176 {
12177 /* Generate nop padding. */
12178 unsigned int size = fragP->tc_frag_data.length;
12179 if (size)
12180 {
12181 if (size > fragP->tc_frag_data.max_bytes)
12182 abort ();
12183
12184 if (flag_debug)
12185 {
12186 const char *msg;
12187 const char *branch = "branch";
12188 const char *prefix = "";
12189 fragS *padding_fragP;
12190 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12191 == BRANCH_PREFIX)
12192 {
12193 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12194 switch (fragP->tc_frag_data.default_prefix)
12195 {
12196 default:
12197 abort ();
12198 break;
12199 case CS_PREFIX_OPCODE:
12200 prefix = " cs";
12201 break;
12202 case DS_PREFIX_OPCODE:
12203 prefix = " ds";
12204 break;
12205 case ES_PREFIX_OPCODE:
12206 prefix = " es";
12207 break;
12208 case FS_PREFIX_OPCODE:
12209 prefix = " fs";
12210 break;
12211 case GS_PREFIX_OPCODE:
12212 prefix = " gs";
12213 break;
12214 case SS_PREFIX_OPCODE:
12215 prefix = " ss";
12216 break;
12217 }
12218 if (padding_fragP)
12219 msg = _("%s:%u: add %d%s at 0x%llx to align "
12220 "%s within %d-byte boundary\n");
12221 else
12222 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12223 "align %s within %d-byte boundary\n");
12224 }
12225 else
12226 {
12227 padding_fragP = fragP;
12228 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12229 "%s within %d-byte boundary\n");
12230 }
12231
12232 if (padding_fragP)
12233 switch (padding_fragP->tc_frag_data.branch_type)
12234 {
12235 case align_branch_jcc:
12236 branch = "jcc";
12237 break;
12238 case align_branch_fused:
12239 branch = "fused jcc";
12240 break;
12241 case align_branch_jmp:
12242 branch = "jmp";
12243 break;
12244 case align_branch_call:
12245 branch = "call";
12246 break;
12247 case align_branch_indirect:
12248 branch = "indiret branch";
12249 break;
12250 case align_branch_ret:
12251 branch = "ret";
12252 break;
12253 default:
12254 break;
12255 }
12256
12257 fprintf (stdout, msg,
12258 fragP->fr_file, fragP->fr_line, size, prefix,
12259 (long long) fragP->fr_address, branch,
12260 1 << align_branch_power);
12261 }
12262 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12263 memset (fragP->fr_opcode,
12264 fragP->tc_frag_data.default_prefix, size);
12265 else
12266 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12267 size, 0);
12268 fragP->fr_fix += size;
12269 }
12270 return;
12271 }
12272
252b5132
RH
12273 opcode = (unsigned char *) fragP->fr_opcode;
12274
47926f60 12275 /* Address we want to reach in file space. */
252b5132 12276 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12277
47926f60 12278 /* Address opcode resides at in file space. */
252b5132
RH
12279 opcode_address = fragP->fr_address + fragP->fr_fix;
12280
47926f60 12281 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12282 displacement_from_opcode_start = target_address - opcode_address;
12283
fddf5b5b 12284 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12285 {
47926f60
KH
12286 /* Don't have to change opcode. */
12287 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12288 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12289 }
12290 else
12291 {
12292 if (no_cond_jump_promotion
12293 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12294 as_warn_where (fragP->fr_file, fragP->fr_line,
12295 _("long jump required"));
252b5132 12296
fddf5b5b
AM
12297 switch (fragP->fr_subtype)
12298 {
12299 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12300 extension = 4; /* 1 opcode + 4 displacement */
12301 opcode[0] = 0xe9;
12302 where_to_put_displacement = &opcode[1];
12303 break;
252b5132 12304
fddf5b5b
AM
12305 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12306 extension = 2; /* 1 opcode + 2 displacement */
12307 opcode[0] = 0xe9;
12308 where_to_put_displacement = &opcode[1];
12309 break;
252b5132 12310
fddf5b5b
AM
12311 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12312 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12313 extension = 5; /* 2 opcode + 4 displacement */
12314 opcode[1] = opcode[0] + 0x10;
12315 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12316 where_to_put_displacement = &opcode[2];
12317 break;
252b5132 12318
fddf5b5b
AM
12319 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12320 extension = 3; /* 2 opcode + 2 displacement */
12321 opcode[1] = opcode[0] + 0x10;
12322 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12323 where_to_put_displacement = &opcode[2];
12324 break;
252b5132 12325
fddf5b5b
AM
12326 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12327 extension = 4;
12328 opcode[0] ^= 1;
12329 opcode[1] = 3;
12330 opcode[2] = 0xe9;
12331 where_to_put_displacement = &opcode[3];
12332 break;
12333
12334 default:
12335 BAD_CASE (fragP->fr_subtype);
12336 break;
12337 }
252b5132 12338 }
fddf5b5b 12339
7b81dfbb
AJ
12340 /* If size if less then four we are sure that the operand fits,
12341 but if it's 4, then it could be that the displacement is larger
12342 then -/+ 2GB. */
12343 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12344 && object_64bit
12345 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12346 + ((addressT) 1 << 31))
12347 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12348 {
12349 as_bad_where (fragP->fr_file, fragP->fr_line,
12350 _("jump target out of range"));
12351 /* Make us emit 0. */
12352 displacement_from_opcode_start = extension;
12353 }
47926f60 12354 /* Now put displacement after opcode. */
252b5132
RH
12355 md_number_to_chars ((char *) where_to_put_displacement,
12356 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12357 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12358 fragP->fr_fix += extension;
12359}
12360\f
7016a5d5 12361/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12362 by our caller that we have all the info we need to fix it up.
12363
7016a5d5
TG
12364 Parameter valP is the pointer to the value of the bits.
12365
252b5132
RH
12366 On the 386, immediates, displacements, and data pointers are all in
12367 the same (little-endian) format, so we don't need to care about which
12368 we are handling. */
12369
94f592af 12370void
7016a5d5 12371md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12372{
94f592af 12373 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12374 valueT value = *valP;
252b5132 12375
f86103b7 12376#if !defined (TE_Mach)
93382f6d
AM
12377 if (fixP->fx_pcrel)
12378 {
12379 switch (fixP->fx_r_type)
12380 {
5865bb77
ILT
12381 default:
12382 break;
12383
d6ab8113
JB
12384 case BFD_RELOC_64:
12385 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12386 break;
93382f6d 12387 case BFD_RELOC_32:
ae8887b5 12388 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12389 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12390 break;
12391 case BFD_RELOC_16:
12392 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12393 break;
12394 case BFD_RELOC_8:
12395 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12396 break;
12397 }
12398 }
252b5132 12399
a161fe53 12400 if (fixP->fx_addsy != NULL
31312f95 12401 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12402 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12403 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12404 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12405 && !use_rela_relocations)
252b5132 12406 {
31312f95
AM
12407 /* This is a hack. There should be a better way to handle this.
12408 This covers for the fact that bfd_install_relocation will
12409 subtract the current location (for partial_inplace, PC relative
12410 relocations); see more below. */
252b5132 12411#ifndef OBJ_AOUT
718ddfc0 12412 if (IS_ELF
252b5132
RH
12413#ifdef TE_PE
12414 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12415#endif
12416 )
12417 value += fixP->fx_where + fixP->fx_frag->fr_address;
12418#endif
12419#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12420 if (IS_ELF)
252b5132 12421 {
6539b54b 12422 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12423
6539b54b 12424 if ((sym_seg == seg
2f66722d 12425 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12426 && sym_seg != absolute_section))
af65af87 12427 && !generic_force_reloc (fixP))
2f66722d
AM
12428 {
12429 /* Yes, we add the values in twice. This is because
6539b54b
AM
12430 bfd_install_relocation subtracts them out again. I think
12431 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12432 it. FIXME. */
12433 value += fixP->fx_where + fixP->fx_frag->fr_address;
12434 }
252b5132
RH
12435 }
12436#endif
12437#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12438 /* For some reason, the PE format does not store a
12439 section address offset for a PC relative symbol. */
12440 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12441 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12442 value += md_pcrel_from (fixP);
12443#endif
12444 }
fbeb56a4 12445#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12446 if (fixP->fx_addsy != NULL
12447 && S_IS_WEAK (fixP->fx_addsy)
12448 /* PR 16858: Do not modify weak function references. */
12449 && ! fixP->fx_pcrel)
fbeb56a4 12450 {
296a8689
NC
12451#if !defined (TE_PEP)
12452 /* For x86 PE weak function symbols are neither PC-relative
12453 nor do they set S_IS_FUNCTION. So the only reliable way
12454 to detect them is to check the flags of their containing
12455 section. */
12456 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12457 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12458 ;
12459 else
12460#endif
fbeb56a4
DK
12461 value -= S_GET_VALUE (fixP->fx_addsy);
12462 }
12463#endif
252b5132
RH
12464
12465 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12466 and we must not disappoint it. */
252b5132 12467#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12468 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12469 switch (fixP->fx_r_type)
12470 {
12471 case BFD_RELOC_386_PLT32:
3e73aa7c 12472 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12473 /* Make the jump instruction point to the address of the operand.
12474 At runtime we merely add the offset to the actual PLT entry.
12475 NB: Subtract the offset size only for jump instructions. */
12476 if (fixP->fx_pcrel)
12477 value = -4;
47926f60 12478 break;
31312f95 12479
13ae64f3
JJ
12480 case BFD_RELOC_386_TLS_GD:
12481 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12482 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12483 case BFD_RELOC_386_TLS_IE:
12484 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12485 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12486 case BFD_RELOC_X86_64_TLSGD:
12487 case BFD_RELOC_X86_64_TLSLD:
12488 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12489 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12490 value = 0; /* Fully resolved at runtime. No addend. */
12491 /* Fallthrough */
12492 case BFD_RELOC_386_TLS_LE:
12493 case BFD_RELOC_386_TLS_LDO_32:
12494 case BFD_RELOC_386_TLS_LE_32:
12495 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12496 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12497 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12498 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12499 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12500 break;
12501
67a4f2b7
AO
12502 case BFD_RELOC_386_TLS_DESC_CALL:
12503 case BFD_RELOC_X86_64_TLSDESC_CALL:
12504 value = 0; /* Fully resolved at runtime. No addend. */
12505 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12506 fixP->fx_done = 0;
12507 return;
12508
47926f60
KH
12509 case BFD_RELOC_VTABLE_INHERIT:
12510 case BFD_RELOC_VTABLE_ENTRY:
12511 fixP->fx_done = 0;
94f592af 12512 return;
47926f60
KH
12513
12514 default:
12515 break;
12516 }
12517#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12518 *valP = value;
f86103b7 12519#endif /* !defined (TE_Mach) */
3e73aa7c 12520
3e73aa7c 12521 /* Are we finished with this relocation now? */
c6682705 12522 if (fixP->fx_addsy == NULL)
3e73aa7c 12523 fixP->fx_done = 1;
fbeb56a4
DK
12524#if defined (OBJ_COFF) && defined (TE_PE)
12525 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12526 {
12527 fixP->fx_done = 0;
12528 /* Remember value for tc_gen_reloc. */
12529 fixP->fx_addnumber = value;
12530 /* Clear out the frag for now. */
12531 value = 0;
12532 }
12533#endif
3e73aa7c
JH
12534 else if (use_rela_relocations)
12535 {
12536 fixP->fx_no_overflow = 1;
062cd5e7
AS
12537 /* Remember value for tc_gen_reloc. */
12538 fixP->fx_addnumber = value;
3e73aa7c
JH
12539 value = 0;
12540 }
f86103b7 12541
94f592af 12542 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12543}
252b5132 12544\f
6d4af3c2 12545const char *
499ac353 12546md_atof (int type, char *litP, int *sizeP)
252b5132 12547{
499ac353
NC
12548 /* This outputs the LITTLENUMs in REVERSE order;
12549 in accord with the bigendian 386. */
12550 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12551}
12552\f
2d545b82 12553static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12554
252b5132 12555static char *
e3bb37b5 12556output_invalid (int c)
252b5132 12557{
3882b010 12558 if (ISPRINT (c))
f9f21a03
L
12559 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12560 "'%c'", c);
252b5132 12561 else
f9f21a03 12562 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12563 "(0x%x)", (unsigned char) c);
252b5132
RH
12564 return output_invalid_buf;
12565}
12566
8a6fb3f9
JB
12567/* Verify that @r can be used in the current context. */
12568
12569static bfd_boolean check_register (const reg_entry *r)
12570{
12571 if (allow_pseudo_reg)
12572 return TRUE;
12573
12574 if (operand_type_all_zero (&r->reg_type))
12575 return FALSE;
12576
12577 if ((r->reg_type.bitfield.dword
12578 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12579 || r->reg_type.bitfield.class == RegCR
22e00a3f 12580 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9
JB
12581 && !cpu_arch_flags.bitfield.cpui386)
12582 return FALSE;
12583
22e00a3f
JB
12584 if (r->reg_type.bitfield.class == RegTR
12585 && (flag_code == CODE_64BIT
12586 || !cpu_arch_flags.bitfield.cpui386
12587 || cpu_arch_isa_flags.bitfield.cpui586
12588 || cpu_arch_isa_flags.bitfield.cpui686))
12589 return FALSE;
12590
8a6fb3f9
JB
12591 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12592 return FALSE;
12593
12594 if (!cpu_arch_flags.bitfield.cpuavx512f)
12595 {
12596 if (r->reg_type.bitfield.zmmword
12597 || r->reg_type.bitfield.class == RegMask)
12598 return FALSE;
12599
12600 if (!cpu_arch_flags.bitfield.cpuavx)
12601 {
12602 if (r->reg_type.bitfield.ymmword)
12603 return FALSE;
12604
12605 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12606 return FALSE;
12607 }
12608 }
12609
260cd341
LC
12610 if (r->reg_type.bitfield.tmmword
12611 && (!cpu_arch_flags.bitfield.cpuamx_tile
12612 || flag_code != CODE_64BIT))
12613 return FALSE;
12614
8a6fb3f9
JB
12615 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12616 return FALSE;
12617
12618 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12619 if (!allow_index_reg && r->reg_num == RegIZ)
12620 return FALSE;
12621
12622 /* Upper 16 vector registers are only available with VREX in 64bit
12623 mode, and require EVEX encoding. */
12624 if (r->reg_flags & RegVRex)
12625 {
12626 if (!cpu_arch_flags.bitfield.cpuavx512f
12627 || flag_code != CODE_64BIT)
12628 return FALSE;
12629
da4977e0
JB
12630 if (i.vec_encoding == vex_encoding_default)
12631 i.vec_encoding = vex_encoding_evex;
12632 else if (i.vec_encoding != vex_encoding_evex)
12633 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12634 }
12635
12636 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12637 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12638 && flag_code != CODE_64BIT)
12639 return FALSE;
12640
12641 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12642 && !intel_syntax)
12643 return FALSE;
12644
12645 return TRUE;
12646}
12647
af6bdddf 12648/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12649
12650static const reg_entry *
4d1bb795 12651parse_real_register (char *reg_string, char **end_op)
252b5132 12652{
af6bdddf
AM
12653 char *s = reg_string;
12654 char *p;
252b5132
RH
12655 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12656 const reg_entry *r;
12657
12658 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12659 if (*s == REGISTER_PREFIX)
12660 ++s;
12661
12662 if (is_space_char (*s))
12663 ++s;
12664
12665 p = reg_name_given;
af6bdddf 12666 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12667 {
12668 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12669 return (const reg_entry *) NULL;
12670 s++;
252b5132
RH
12671 }
12672
6588847e
DN
12673 /* For naked regs, make sure that we are not dealing with an identifier.
12674 This prevents confusing an identifier like `eax_var' with register
12675 `eax'. */
12676 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12677 return (const reg_entry *) NULL;
12678
af6bdddf 12679 *end_op = s;
252b5132 12680
629310ab 12681 r = (const reg_entry *) str_hash_find (reg_hash, reg_name_given);
252b5132 12682
5f47d35b 12683 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12684 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12685 {
0e0eea78
JB
12686 if (!cpu_arch_flags.bitfield.cpu8087
12687 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12688 && !cpu_arch_flags.bitfield.cpu387
12689 && !allow_pseudo_reg)
0e0eea78
JB
12690 return (const reg_entry *) NULL;
12691
5f47d35b
AM
12692 if (is_space_char (*s))
12693 ++s;
12694 if (*s == '(')
12695 {
af6bdddf 12696 ++s;
5f47d35b
AM
12697 if (is_space_char (*s))
12698 ++s;
12699 if (*s >= '0' && *s <= '7')
12700 {
db557034 12701 int fpr = *s - '0';
af6bdddf 12702 ++s;
5f47d35b
AM
12703 if (is_space_char (*s))
12704 ++s;
12705 if (*s == ')')
12706 {
12707 *end_op = s + 1;
629310ab 12708 r = (const reg_entry *) str_hash_find (reg_hash, "st(0)");
db557034
AM
12709 know (r);
12710 return r + fpr;
5f47d35b 12711 }
5f47d35b 12712 }
47926f60 12713 /* We have "%st(" then garbage. */
5f47d35b
AM
12714 return (const reg_entry *) NULL;
12715 }
12716 }
12717
8a6fb3f9 12718 return r && check_register (r) ? r : NULL;
252b5132 12719}
4d1bb795
JB
12720
12721/* REG_STRING starts *before* REGISTER_PREFIX. */
12722
12723static const reg_entry *
12724parse_register (char *reg_string, char **end_op)
12725{
12726 const reg_entry *r;
12727
12728 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12729 r = parse_real_register (reg_string, end_op);
12730 else
12731 r = NULL;
12732 if (!r)
12733 {
12734 char *save = input_line_pointer;
12735 char c;
12736 symbolS *symbolP;
12737
12738 input_line_pointer = reg_string;
d02603dc 12739 c = get_symbol_name (&reg_string);
4d1bb795
JB
12740 symbolP = symbol_find (reg_string);
12741 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12742 {
12743 const expressionS *e = symbol_get_value_expression (symbolP);
12744
0398aac5 12745 know (e->X_op == O_register);
4eed87de 12746 know (e->X_add_number >= 0
c3fe08fa 12747 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12748 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12749 if (!check_register (r))
12750 {
12751 as_bad (_("register '%s%s' cannot be used here"),
12752 register_prefix, r->reg_name);
12753 r = &bad_reg;
12754 }
4d1bb795
JB
12755 *end_op = input_line_pointer;
12756 }
12757 *input_line_pointer = c;
12758 input_line_pointer = save;
12759 }
12760 return r;
12761}
12762
12763int
12764i386_parse_name (char *name, expressionS *e, char *nextcharP)
12765{
12766 const reg_entry *r;
12767 char *end = input_line_pointer;
12768
12769 *end = *nextcharP;
12770 r = parse_register (name, &input_line_pointer);
12771 if (r && end <= input_line_pointer)
12772 {
12773 *nextcharP = *input_line_pointer;
12774 *input_line_pointer = 0;
8a6fb3f9
JB
12775 if (r != &bad_reg)
12776 {
12777 e->X_op = O_register;
12778 e->X_add_number = r - i386_regtab;
12779 }
12780 else
12781 e->X_op = O_illegal;
4d1bb795
JB
12782 return 1;
12783 }
12784 input_line_pointer = end;
12785 *end = 0;
ee86248c 12786 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12787}
12788
12789void
12790md_operand (expressionS *e)
12791{
ee86248c
JB
12792 char *end;
12793 const reg_entry *r;
4d1bb795 12794
ee86248c
JB
12795 switch (*input_line_pointer)
12796 {
12797 case REGISTER_PREFIX:
12798 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12799 if (r)
12800 {
12801 e->X_op = O_register;
12802 e->X_add_number = r - i386_regtab;
12803 input_line_pointer = end;
12804 }
ee86248c
JB
12805 break;
12806
12807 case '[':
9c2799c2 12808 gas_assert (intel_syntax);
ee86248c
JB
12809 end = input_line_pointer++;
12810 expression (e);
12811 if (*input_line_pointer == ']')
12812 {
12813 ++input_line_pointer;
12814 e->X_op_symbol = make_expr_symbol (e);
12815 e->X_add_symbol = NULL;
12816 e->X_add_number = 0;
12817 e->X_op = O_index;
12818 }
12819 else
12820 {
12821 e->X_op = O_absent;
12822 input_line_pointer = end;
12823 }
12824 break;
4d1bb795
JB
12825 }
12826}
12827
252b5132 12828\f
4cc782b5 12829#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12830const char *md_shortopts = "kVQ:sqnO::";
252b5132 12831#else
b6f8c7c4 12832const char *md_shortopts = "qnO::";
252b5132 12833#endif
6e0b89ee 12834
3e73aa7c 12835#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12836#define OPTION_64 (OPTION_MD_BASE + 1)
12837#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12838#define OPTION_MARCH (OPTION_MD_BASE + 3)
12839#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12840#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12841#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12842#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12843#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12844#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12845#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12846#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12847#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12848#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12849#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12850#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12851#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12852#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12853#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12854#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12855#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12856#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12857#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12858#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12859#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12860#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12861#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12862#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12863#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12864#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12865#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12866#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12867#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12868#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12869
99ad8390
NC
12870struct option md_longopts[] =
12871{
3e73aa7c 12872 {"32", no_argument, NULL, OPTION_32},
321098a5 12873#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12874 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12875 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12876#endif
12877#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12878 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12879 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12880 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12881#endif
b3b91714 12882 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12883 {"march", required_argument, NULL, OPTION_MARCH},
12884 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12885 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12886 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12887 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12888 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12889 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12890 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12891 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12892 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12893 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12894 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12895 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12896 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12897# if defined (TE_PE) || defined (TE_PEP)
12898 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12899#endif
d1982f93 12900 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12901 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12902 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12903 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12904 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12905 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12906 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12907 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12908 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12909 {"mlfence-before-indirect-branch", required_argument, NULL,
12910 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12911 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12912 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12913 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12914 {NULL, no_argument, NULL, 0}
12915};
12916size_t md_longopts_size = sizeof (md_longopts);
12917
12918int
17b9d67d 12919md_parse_option (int c, const char *arg)
252b5132 12920{
91d6fa6a 12921 unsigned int j;
e379e5f3 12922 char *arch, *next, *saved, *type;
9103f4f4 12923
252b5132
RH
12924 switch (c)
12925 {
12b55ccc
L
12926 case 'n':
12927 optimize_align_code = 0;
12928 break;
12929
a38cf1db
AM
12930 case 'q':
12931 quiet_warnings = 1;
252b5132
RH
12932 break;
12933
12934#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12935 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12936 should be emitted or not. FIXME: Not implemented. */
12937 case 'Q':
d4693039
JB
12938 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12939 return 0;
252b5132
RH
12940 break;
12941
12942 /* -V: SVR4 argument to print version ID. */
12943 case 'V':
12944 print_version_id ();
12945 break;
12946
a38cf1db
AM
12947 /* -k: Ignore for FreeBSD compatibility. */
12948 case 'k':
252b5132 12949 break;
4cc782b5
ILT
12950
12951 case 's':
12952 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12953 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12954 break;
8dcea932
L
12955
12956 case OPTION_MSHARED:
12957 shared = 1;
12958 break;
b4a3a7b4
L
12959
12960 case OPTION_X86_USED_NOTE:
12961 if (strcasecmp (arg, "yes") == 0)
12962 x86_used_note = 1;
12963 else if (strcasecmp (arg, "no") == 0)
12964 x86_used_note = 0;
12965 else
12966 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12967 break;
12968
12969
99ad8390 12970#endif
321098a5 12971#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12972 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12973 case OPTION_64:
12974 {
12975 const char **list, **l;
12976
3e73aa7c
JH
12977 list = bfd_target_list ();
12978 for (l = list; *l != NULL; l++)
8620418b 12979 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12980 || strcmp (*l, "coff-x86-64") == 0
12981 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12982 || strcmp (*l, "pei-x86-64") == 0
12983 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12984 {
12985 default_arch = "x86_64";
12986 break;
12987 }
3e73aa7c 12988 if (*l == NULL)
2b5d6a91 12989 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12990 free (list);
12991 }
12992 break;
12993#endif
252b5132 12994
351f65ca 12995#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12996 case OPTION_X32:
351f65ca
L
12997 if (IS_ELF)
12998 {
12999 const char **list, **l;
13000
13001 list = bfd_target_list ();
13002 for (l = list; *l != NULL; l++)
13003 if (CONST_STRNEQ (*l, "elf32-x86-64"))
13004 {
13005 default_arch = "x86_64:32";
13006 break;
13007 }
13008 if (*l == NULL)
2b5d6a91 13009 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
13010 free (list);
13011 }
13012 else
13013 as_fatal (_("32bit x86_64 is only supported for ELF"));
13014 break;
13015#endif
13016
6e0b89ee
AM
13017 case OPTION_32:
13018 default_arch = "i386";
13019 break;
13020
b3b91714
AM
13021 case OPTION_DIVIDE:
13022#ifdef SVR4_COMMENT_CHARS
13023 {
13024 char *n, *t;
13025 const char *s;
13026
add39d23 13027 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
13028 t = n;
13029 for (s = i386_comment_chars; *s != '\0'; s++)
13030 if (*s != '/')
13031 *t++ = *s;
13032 *t = '\0';
13033 i386_comment_chars = n;
13034 }
13035#endif
13036 break;
13037
9103f4f4 13038 case OPTION_MARCH:
293f5f65
L
13039 saved = xstrdup (arg);
13040 arch = saved;
13041 /* Allow -march=+nosse. */
13042 if (*arch == '+')
13043 arch++;
6305a203 13044 do
9103f4f4 13045 {
6305a203 13046 if (*arch == '.')
2b5d6a91 13047 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13048 next = strchr (arch, '+');
13049 if (next)
13050 *next++ = '\0';
91d6fa6a 13051 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13052 {
91d6fa6a 13053 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 13054 {
6305a203 13055 /* Processor. */
1ded5609
JB
13056 if (! cpu_arch[j].flags.bitfield.cpui386)
13057 continue;
13058
91d6fa6a 13059 cpu_arch_name = cpu_arch[j].name;
6305a203 13060 cpu_sub_arch_name = NULL;
91d6fa6a
NC
13061 cpu_arch_flags = cpu_arch[j].flags;
13062 cpu_arch_isa = cpu_arch[j].type;
13063 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
13064 if (!cpu_arch_tune_set)
13065 {
13066 cpu_arch_tune = cpu_arch_isa;
13067 cpu_arch_tune_flags = cpu_arch_isa_flags;
13068 }
13069 break;
13070 }
91d6fa6a
NC
13071 else if (*cpu_arch [j].name == '.'
13072 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 13073 {
33eaf5de 13074 /* ISA extension. */
6305a203 13075 i386_cpu_flags flags;
309d3373 13076
293f5f65
L
13077 flags = cpu_flags_or (cpu_arch_flags,
13078 cpu_arch[j].flags);
81486035 13079
5b64d091 13080 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
13081 {
13082 if (cpu_sub_arch_name)
13083 {
13084 char *name = cpu_sub_arch_name;
13085 cpu_sub_arch_name = concat (name,
91d6fa6a 13086 cpu_arch[j].name,
1bf57e9f 13087 (const char *) NULL);
6305a203
L
13088 free (name);
13089 }
13090 else
91d6fa6a 13091 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 13092 cpu_arch_flags = flags;
a586129e 13093 cpu_arch_isa_flags = flags;
6305a203 13094 }
0089dace
L
13095 else
13096 cpu_arch_isa_flags
13097 = cpu_flags_or (cpu_arch_isa_flags,
13098 cpu_arch[j].flags);
6305a203 13099 break;
ccc9c027 13100 }
9103f4f4 13101 }
6305a203 13102
293f5f65
L
13103 if (j >= ARRAY_SIZE (cpu_arch))
13104 {
33eaf5de 13105 /* Disable an ISA extension. */
293f5f65
L
13106 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13107 if (strcmp (arch, cpu_noarch [j].name) == 0)
13108 {
13109 i386_cpu_flags flags;
13110
13111 flags = cpu_flags_and_not (cpu_arch_flags,
13112 cpu_noarch[j].flags);
13113 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13114 {
13115 if (cpu_sub_arch_name)
13116 {
13117 char *name = cpu_sub_arch_name;
13118 cpu_sub_arch_name = concat (arch,
13119 (const char *) NULL);
13120 free (name);
13121 }
13122 else
13123 cpu_sub_arch_name = xstrdup (arch);
13124 cpu_arch_flags = flags;
13125 cpu_arch_isa_flags = flags;
13126 }
13127 break;
13128 }
13129
13130 if (j >= ARRAY_SIZE (cpu_noarch))
13131 j = ARRAY_SIZE (cpu_arch);
13132 }
13133
91d6fa6a 13134 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13135 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13136
13137 arch = next;
9103f4f4 13138 }
293f5f65
L
13139 while (next != NULL);
13140 free (saved);
9103f4f4
L
13141 break;
13142
13143 case OPTION_MTUNE:
13144 if (*arg == '.')
2b5d6a91 13145 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13146 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13147 {
91d6fa6a 13148 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13149 {
ccc9c027 13150 cpu_arch_tune_set = 1;
91d6fa6a
NC
13151 cpu_arch_tune = cpu_arch [j].type;
13152 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13153 break;
13154 }
13155 }
91d6fa6a 13156 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13157 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13158 break;
13159
1efbbeb4
L
13160 case OPTION_MMNEMONIC:
13161 if (strcasecmp (arg, "att") == 0)
13162 intel_mnemonic = 0;
13163 else if (strcasecmp (arg, "intel") == 0)
13164 intel_mnemonic = 1;
13165 else
2b5d6a91 13166 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13167 break;
13168
13169 case OPTION_MSYNTAX:
13170 if (strcasecmp (arg, "att") == 0)
13171 intel_syntax = 0;
13172 else if (strcasecmp (arg, "intel") == 0)
13173 intel_syntax = 1;
13174 else
2b5d6a91 13175 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13176 break;
13177
13178 case OPTION_MINDEX_REG:
13179 allow_index_reg = 1;
13180 break;
13181
13182 case OPTION_MNAKED_REG:
13183 allow_naked_reg = 1;
13184 break;
13185
c0f3af97
L
13186 case OPTION_MSSE2AVX:
13187 sse2avx = 1;
13188 break;
13189
daf50ae7
L
13190 case OPTION_MSSE_CHECK:
13191 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13192 sse_check = check_error;
daf50ae7 13193 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13194 sse_check = check_warning;
daf50ae7 13195 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13196 sse_check = check_none;
daf50ae7 13197 else
2b5d6a91 13198 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13199 break;
13200
7bab8ab5
JB
13201 case OPTION_MOPERAND_CHECK:
13202 if (strcasecmp (arg, "error") == 0)
13203 operand_check = check_error;
13204 else if (strcasecmp (arg, "warning") == 0)
13205 operand_check = check_warning;
13206 else if (strcasecmp (arg, "none") == 0)
13207 operand_check = check_none;
13208 else
13209 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13210 break;
13211
539f890d
L
13212 case OPTION_MAVXSCALAR:
13213 if (strcasecmp (arg, "128") == 0)
13214 avxscalar = vex128;
13215 else if (strcasecmp (arg, "256") == 0)
13216 avxscalar = vex256;
13217 else
2b5d6a91 13218 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13219 break;
13220
03751133
L
13221 case OPTION_MVEXWIG:
13222 if (strcmp (arg, "0") == 0)
40c9c8de 13223 vexwig = vexw0;
03751133 13224 else if (strcmp (arg, "1") == 0)
40c9c8de 13225 vexwig = vexw1;
03751133
L
13226 else
13227 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13228 break;
13229
7e8b059b
L
13230 case OPTION_MADD_BND_PREFIX:
13231 add_bnd_prefix = 1;
13232 break;
13233
43234a1e
L
13234 case OPTION_MEVEXLIG:
13235 if (strcmp (arg, "128") == 0)
13236 evexlig = evexl128;
13237 else if (strcmp (arg, "256") == 0)
13238 evexlig = evexl256;
13239 else if (strcmp (arg, "512") == 0)
13240 evexlig = evexl512;
13241 else
13242 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13243 break;
13244
d3d3c6db
IT
13245 case OPTION_MEVEXRCIG:
13246 if (strcmp (arg, "rne") == 0)
13247 evexrcig = rne;
13248 else if (strcmp (arg, "rd") == 0)
13249 evexrcig = rd;
13250 else if (strcmp (arg, "ru") == 0)
13251 evexrcig = ru;
13252 else if (strcmp (arg, "rz") == 0)
13253 evexrcig = rz;
13254 else
13255 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13256 break;
13257
43234a1e
L
13258 case OPTION_MEVEXWIG:
13259 if (strcmp (arg, "0") == 0)
13260 evexwig = evexw0;
13261 else if (strcmp (arg, "1") == 0)
13262 evexwig = evexw1;
13263 else
13264 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13265 break;
13266
167ad85b
TG
13267# if defined (TE_PE) || defined (TE_PEP)
13268 case OPTION_MBIG_OBJ:
13269 use_big_obj = 1;
13270 break;
13271#endif
13272
d1982f93 13273 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13274 if (strcasecmp (arg, "yes") == 0)
13275 omit_lock_prefix = 1;
13276 else if (strcasecmp (arg, "no") == 0)
13277 omit_lock_prefix = 0;
13278 else
13279 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13280 break;
13281
e4e00185
AS
13282 case OPTION_MFENCE_AS_LOCK_ADD:
13283 if (strcasecmp (arg, "yes") == 0)
13284 avoid_fence = 1;
13285 else if (strcasecmp (arg, "no") == 0)
13286 avoid_fence = 0;
13287 else
13288 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13289 break;
13290
ae531041
L
13291 case OPTION_MLFENCE_AFTER_LOAD:
13292 if (strcasecmp (arg, "yes") == 0)
13293 lfence_after_load = 1;
13294 else if (strcasecmp (arg, "no") == 0)
13295 lfence_after_load = 0;
13296 else
13297 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13298 break;
13299
13300 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13301 if (strcasecmp (arg, "all") == 0)
a09f656b 13302 {
13303 lfence_before_indirect_branch = lfence_branch_all;
13304 if (lfence_before_ret == lfence_before_ret_none)
13305 lfence_before_ret = lfence_before_ret_shl;
13306 }
ae531041
L
13307 else if (strcasecmp (arg, "memory") == 0)
13308 lfence_before_indirect_branch = lfence_branch_memory;
13309 else if (strcasecmp (arg, "register") == 0)
13310 lfence_before_indirect_branch = lfence_branch_register;
13311 else if (strcasecmp (arg, "none") == 0)
13312 lfence_before_indirect_branch = lfence_branch_none;
13313 else
13314 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13315 arg);
13316 break;
13317
13318 case OPTION_MLFENCE_BEFORE_RET:
13319 if (strcasecmp (arg, "or") == 0)
13320 lfence_before_ret = lfence_before_ret_or;
13321 else if (strcasecmp (arg, "not") == 0)
13322 lfence_before_ret = lfence_before_ret_not;
a09f656b 13323 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13324 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13325 else if (strcasecmp (arg, "none") == 0)
13326 lfence_before_ret = lfence_before_ret_none;
13327 else
13328 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13329 arg);
13330 break;
13331
0cb4071e
L
13332 case OPTION_MRELAX_RELOCATIONS:
13333 if (strcasecmp (arg, "yes") == 0)
13334 generate_relax_relocations = 1;
13335 else if (strcasecmp (arg, "no") == 0)
13336 generate_relax_relocations = 0;
13337 else
13338 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13339 break;
13340
e379e5f3
L
13341 case OPTION_MALIGN_BRANCH_BOUNDARY:
13342 {
13343 char *end;
13344 long int align = strtoul (arg, &end, 0);
13345 if (*end == '\0')
13346 {
13347 if (align == 0)
13348 {
13349 align_branch_power = 0;
13350 break;
13351 }
13352 else if (align >= 16)
13353 {
13354 int align_power;
13355 for (align_power = 0;
13356 (align & 1) == 0;
13357 align >>= 1, align_power++)
13358 continue;
13359 /* Limit alignment power to 31. */
13360 if (align == 1 && align_power < 32)
13361 {
13362 align_branch_power = align_power;
13363 break;
13364 }
13365 }
13366 }
13367 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13368 }
13369 break;
13370
13371 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13372 {
13373 char *end;
13374 int align = strtoul (arg, &end, 0);
13375 /* Some processors only support 5 prefixes. */
13376 if (*end == '\0' && align >= 0 && align < 6)
13377 {
13378 align_branch_prefix_size = align;
13379 break;
13380 }
13381 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13382 arg);
13383 }
13384 break;
13385
13386 case OPTION_MALIGN_BRANCH:
13387 align_branch = 0;
13388 saved = xstrdup (arg);
13389 type = saved;
13390 do
13391 {
13392 next = strchr (type, '+');
13393 if (next)
13394 *next++ = '\0';
13395 if (strcasecmp (type, "jcc") == 0)
13396 align_branch |= align_branch_jcc_bit;
13397 else if (strcasecmp (type, "fused") == 0)
13398 align_branch |= align_branch_fused_bit;
13399 else if (strcasecmp (type, "jmp") == 0)
13400 align_branch |= align_branch_jmp_bit;
13401 else if (strcasecmp (type, "call") == 0)
13402 align_branch |= align_branch_call_bit;
13403 else if (strcasecmp (type, "ret") == 0)
13404 align_branch |= align_branch_ret_bit;
13405 else if (strcasecmp (type, "indirect") == 0)
13406 align_branch |= align_branch_indirect_bit;
13407 else
13408 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13409 type = next;
13410 }
13411 while (next != NULL);
13412 free (saved);
13413 break;
13414
76cf450b
L
13415 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13416 align_branch_power = 5;
13417 align_branch_prefix_size = 5;
13418 align_branch = (align_branch_jcc_bit
13419 | align_branch_fused_bit
13420 | align_branch_jmp_bit);
13421 break;
13422
5db04b09 13423 case OPTION_MAMD64:
4b5aaf5f 13424 isa64 = amd64;
5db04b09
L
13425 break;
13426
13427 case OPTION_MINTEL64:
4b5aaf5f 13428 isa64 = intel64;
5db04b09
L
13429 break;
13430
b6f8c7c4
L
13431 case 'O':
13432 if (arg == NULL)
13433 {
13434 optimize = 1;
13435 /* Turn off -Os. */
13436 optimize_for_space = 0;
13437 }
13438 else if (*arg == 's')
13439 {
13440 optimize_for_space = 1;
13441 /* Turn on all encoding optimizations. */
41fd2579 13442 optimize = INT_MAX;
b6f8c7c4
L
13443 }
13444 else
13445 {
13446 optimize = atoi (arg);
13447 /* Turn off -Os. */
13448 optimize_for_space = 0;
13449 }
13450 break;
13451
252b5132
RH
13452 default:
13453 return 0;
13454 }
13455 return 1;
13456}
13457
8a2c8fef
L
13458#define MESSAGE_TEMPLATE \
13459" "
13460
293f5f65
L
13461static char *
13462output_message (FILE *stream, char *p, char *message, char *start,
13463 int *left_p, const char *name, int len)
13464{
13465 int size = sizeof (MESSAGE_TEMPLATE);
13466 int left = *left_p;
13467
13468 /* Reserve 2 spaces for ", " or ",\0" */
13469 left -= len + 2;
13470
13471 /* Check if there is any room. */
13472 if (left >= 0)
13473 {
13474 if (p != start)
13475 {
13476 *p++ = ',';
13477 *p++ = ' ';
13478 }
13479 p = mempcpy (p, name, len);
13480 }
13481 else
13482 {
13483 /* Output the current message now and start a new one. */
13484 *p++ = ',';
13485 *p = '\0';
13486 fprintf (stream, "%s\n", message);
13487 p = start;
13488 left = size - (start - message) - len - 2;
13489
13490 gas_assert (left >= 0);
13491
13492 p = mempcpy (p, name, len);
13493 }
13494
13495 *left_p = left;
13496 return p;
13497}
13498
8a2c8fef 13499static void
1ded5609 13500show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13501{
13502 static char message[] = MESSAGE_TEMPLATE;
13503 char *start = message + 27;
13504 char *p;
13505 int size = sizeof (MESSAGE_TEMPLATE);
13506 int left;
13507 const char *name;
13508 int len;
13509 unsigned int j;
13510
13511 p = start;
13512 left = size - (start - message);
13513 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13514 {
13515 /* Should it be skipped? */
13516 if (cpu_arch [j].skip)
13517 continue;
13518
13519 name = cpu_arch [j].name;
13520 len = cpu_arch [j].len;
13521 if (*name == '.')
13522 {
13523 /* It is an extension. Skip if we aren't asked to show it. */
13524 if (ext)
13525 {
13526 name++;
13527 len--;
13528 }
13529 else
13530 continue;
13531 }
13532 else if (ext)
13533 {
13534 /* It is an processor. Skip if we show only extension. */
13535 continue;
13536 }
1ded5609
JB
13537 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13538 {
13539 /* It is an impossible processor - skip. */
13540 continue;
13541 }
8a2c8fef 13542
293f5f65 13543 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13544 }
13545
293f5f65
L
13546 /* Display disabled extensions. */
13547 if (ext)
13548 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13549 {
13550 name = cpu_noarch [j].name;
13551 len = cpu_noarch [j].len;
13552 p = output_message (stream, p, message, start, &left, name,
13553 len);
13554 }
13555
8a2c8fef
L
13556 *p = '\0';
13557 fprintf (stream, "%s\n", message);
13558}
13559
252b5132 13560void
8a2c8fef 13561md_show_usage (FILE *stream)
252b5132 13562{
4cc782b5
ILT
13563#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13564 fprintf (stream, _("\
d4693039 13565 -Qy, -Qn ignored\n\
a38cf1db 13566 -V print assembler version number\n\
b3b91714
AM
13567 -k ignored\n"));
13568#endif
13569 fprintf (stream, _("\
12b55ccc 13570 -n Do not optimize code alignment\n\
b3b91714
AM
13571 -q quieten some warnings\n"));
13572#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13573 fprintf (stream, _("\
a38cf1db 13574 -s ignored\n"));
b3b91714 13575#endif
d7f449c0
L
13576#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13577 || defined (TE_PE) || defined (TE_PEP))
751d281c 13578 fprintf (stream, _("\
570561f7 13579 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13580#endif
b3b91714
AM
13581#ifdef SVR4_COMMENT_CHARS
13582 fprintf (stream, _("\
13583 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13584#else
13585 fprintf (stream, _("\
b3b91714 13586 --divide ignored\n"));
4cc782b5 13587#endif
9103f4f4 13588 fprintf (stream, _("\
6305a203 13589 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13590 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13591 show_arch (stream, 0, 1);
8a2c8fef
L
13592 fprintf (stream, _("\
13593 EXTENSION is combination of:\n"));
1ded5609 13594 show_arch (stream, 1, 0);
6305a203 13595 fprintf (stream, _("\
8a2c8fef 13596 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13597 show_arch (stream, 0, 0);
ba104c83 13598 fprintf (stream, _("\
c0f3af97
L
13599 -msse2avx encode SSE instructions with VEX prefix\n"));
13600 fprintf (stream, _("\
7c5c05ef 13601 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13602 check SSE instructions\n"));
13603 fprintf (stream, _("\
7c5c05ef 13604 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13605 check operand combinations for validity\n"));
13606 fprintf (stream, _("\
7c5c05ef
L
13607 -mavxscalar=[128|256] (default: 128)\n\
13608 encode scalar AVX instructions with specific vector\n\
539f890d
L
13609 length\n"));
13610 fprintf (stream, _("\
03751133
L
13611 -mvexwig=[0|1] (default: 0)\n\
13612 encode VEX instructions with specific VEX.W value\n\
13613 for VEX.W bit ignored instructions\n"));
13614 fprintf (stream, _("\
7c5c05ef
L
13615 -mevexlig=[128|256|512] (default: 128)\n\
13616 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13617 length\n"));
13618 fprintf (stream, _("\
7c5c05ef
L
13619 -mevexwig=[0|1] (default: 0)\n\
13620 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13621 for EVEX.W bit ignored instructions\n"));
13622 fprintf (stream, _("\
7c5c05ef 13623 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13624 encode EVEX instructions with specific EVEX.RC value\n\
13625 for SAE-only ignored instructions\n"));
13626 fprintf (stream, _("\
7c5c05ef
L
13627 -mmnemonic=[att|intel] "));
13628 if (SYSV386_COMPAT)
13629 fprintf (stream, _("(default: att)\n"));
13630 else
13631 fprintf (stream, _("(default: intel)\n"));
13632 fprintf (stream, _("\
13633 use AT&T/Intel mnemonic\n"));
ba104c83 13634 fprintf (stream, _("\
7c5c05ef
L
13635 -msyntax=[att|intel] (default: att)\n\
13636 use AT&T/Intel syntax\n"));
ba104c83
L
13637 fprintf (stream, _("\
13638 -mindex-reg support pseudo index registers\n"));
13639 fprintf (stream, _("\
13640 -mnaked-reg don't require `%%' prefix for registers\n"));
13641 fprintf (stream, _("\
7e8b059b 13642 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13643#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13644 fprintf (stream, _("\
13645 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13646 fprintf (stream, _("\
13647 -mx86-used-note=[no|yes] "));
13648 if (DEFAULT_X86_USED_NOTE)
13649 fprintf (stream, _("(default: yes)\n"));
13650 else
13651 fprintf (stream, _("(default: no)\n"));
13652 fprintf (stream, _("\
13653 generate x86 used ISA and feature properties\n"));
13654#endif
13655#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13656 fprintf (stream, _("\
13657 -mbig-obj generate big object files\n"));
13658#endif
d022bddd 13659 fprintf (stream, _("\
7c5c05ef 13660 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13661 strip all lock prefixes\n"));
5db04b09 13662 fprintf (stream, _("\
7c5c05ef 13663 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13664 encode lfence, mfence and sfence as\n\
13665 lock addl $0x0, (%%{re}sp)\n"));
13666 fprintf (stream, _("\
7c5c05ef
L
13667 -mrelax-relocations=[no|yes] "));
13668 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13669 fprintf (stream, _("(default: yes)\n"));
13670 else
13671 fprintf (stream, _("(default: no)\n"));
13672 fprintf (stream, _("\
0cb4071e
L
13673 generate relax relocations\n"));
13674 fprintf (stream, _("\
e379e5f3
L
13675 -malign-branch-boundary=NUM (default: 0)\n\
13676 align branches within NUM byte boundary\n"));
13677 fprintf (stream, _("\
13678 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13679 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13680 indirect\n\
13681 specify types of branches to align\n"));
13682 fprintf (stream, _("\
13683 -malign-branch-prefix-size=NUM (default: 5)\n\
13684 align branches with NUM prefixes per instruction\n"));
13685 fprintf (stream, _("\
76cf450b
L
13686 -mbranches-within-32B-boundaries\n\
13687 align branches within 32 byte boundary\n"));
13688 fprintf (stream, _("\
ae531041
L
13689 -mlfence-after-load=[no|yes] (default: no)\n\
13690 generate lfence after load\n"));
13691 fprintf (stream, _("\
13692 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13693 generate lfence before indirect near branch\n"));
13694 fprintf (stream, _("\
a09f656b 13695 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13696 generate lfence before ret\n"));
13697 fprintf (stream, _("\
7c5c05ef 13698 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13699 fprintf (stream, _("\
13700 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13701}
13702
3e73aa7c 13703#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13704 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13705 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13706
13707/* Pick the target format to use. */
13708
47926f60 13709const char *
e3bb37b5 13710i386_target_format (void)
252b5132 13711{
351f65ca
L
13712 if (!strncmp (default_arch, "x86_64", 6))
13713 {
13714 update_code_flag (CODE_64BIT, 1);
13715 if (default_arch[6] == '\0')
7f56bc95 13716 x86_elf_abi = X86_64_ABI;
351f65ca 13717 else
7f56bc95 13718 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13719 }
3e73aa7c 13720 else if (!strcmp (default_arch, "i386"))
78f12dd3 13721 update_code_flag (CODE_32BIT, 1);
5197d474
L
13722 else if (!strcmp (default_arch, "iamcu"))
13723 {
13724 update_code_flag (CODE_32BIT, 1);
13725 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13726 {
13727 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13728 cpu_arch_name = "iamcu";
13729 cpu_sub_arch_name = NULL;
13730 cpu_arch_flags = iamcu_flags;
13731 cpu_arch_isa = PROCESSOR_IAMCU;
13732 cpu_arch_isa_flags = iamcu_flags;
13733 if (!cpu_arch_tune_set)
13734 {
13735 cpu_arch_tune = cpu_arch_isa;
13736 cpu_arch_tune_flags = cpu_arch_isa_flags;
13737 }
13738 }
8d471ec1 13739 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13740 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13741 cpu_arch_name);
13742 }
3e73aa7c 13743 else
2b5d6a91 13744 as_fatal (_("unknown architecture"));
89507696
JB
13745
13746 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13747 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13748 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13749 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13750
252b5132
RH
13751 switch (OUTPUT_FLAVOR)
13752 {
9384f2ff 13753#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13754 case bfd_target_aout_flavour:
47926f60 13755 return AOUT_TARGET_FORMAT;
4c63da97 13756#endif
9384f2ff
AM
13757#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13758# if defined (TE_PE) || defined (TE_PEP)
13759 case bfd_target_coff_flavour:
167ad85b
TG
13760 if (flag_code == CODE_64BIT)
13761 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13762 else
251dae91 13763 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13764# elif defined (TE_GO32)
0561d57c
JK
13765 case bfd_target_coff_flavour:
13766 return "coff-go32";
9384f2ff 13767# else
252b5132
RH
13768 case bfd_target_coff_flavour:
13769 return "coff-i386";
9384f2ff 13770# endif
4c63da97 13771#endif
3e73aa7c 13772#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13773 case bfd_target_elf_flavour:
3e73aa7c 13774 {
351f65ca
L
13775 const char *format;
13776
13777 switch (x86_elf_abi)
4fa24527 13778 {
351f65ca
L
13779 default:
13780 format = ELF_TARGET_FORMAT;
e379e5f3
L
13781#ifndef TE_SOLARIS
13782 tls_get_addr = "___tls_get_addr";
13783#endif
351f65ca 13784 break;
7f56bc95 13785 case X86_64_ABI:
351f65ca 13786 use_rela_relocations = 1;
4fa24527 13787 object_64bit = 1;
e379e5f3
L
13788#ifndef TE_SOLARIS
13789 tls_get_addr = "__tls_get_addr";
13790#endif
351f65ca
L
13791 format = ELF_TARGET_FORMAT64;
13792 break;
7f56bc95 13793 case X86_64_X32_ABI:
4fa24527 13794 use_rela_relocations = 1;
351f65ca 13795 object_64bit = 1;
e379e5f3
L
13796#ifndef TE_SOLARIS
13797 tls_get_addr = "__tls_get_addr";
13798#endif
862be3fb 13799 disallow_64bit_reloc = 1;
351f65ca
L
13800 format = ELF_TARGET_FORMAT32;
13801 break;
4fa24527 13802 }
3632d14b 13803 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13804 {
7f56bc95 13805 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13806 as_fatal (_("Intel L1OM is 64bit only"));
13807 return ELF_TARGET_L1OM_FORMAT;
13808 }
b49f93f6 13809 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13810 {
13811 if (x86_elf_abi != X86_64_ABI)
13812 as_fatal (_("Intel K1OM is 64bit only"));
13813 return ELF_TARGET_K1OM_FORMAT;
13814 }
81486035
L
13815 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13816 {
13817 if (x86_elf_abi != I386_ABI)
13818 as_fatal (_("Intel MCU is 32bit only"));
13819 return ELF_TARGET_IAMCU_FORMAT;
13820 }
8a9036a4 13821 else
351f65ca 13822 return format;
3e73aa7c 13823 }
e57f8c65
TG
13824#endif
13825#if defined (OBJ_MACH_O)
13826 case bfd_target_mach_o_flavour:
d382c579
TG
13827 if (flag_code == CODE_64BIT)
13828 {
13829 use_rela_relocations = 1;
13830 object_64bit = 1;
13831 return "mach-o-x86-64";
13832 }
13833 else
13834 return "mach-o-i386";
4c63da97 13835#endif
252b5132
RH
13836 default:
13837 abort ();
13838 return NULL;
13839 }
13840}
13841
47926f60 13842#endif /* OBJ_MAYBE_ more than one */
252b5132 13843\f
252b5132 13844symbolS *
7016a5d5 13845md_undefined_symbol (char *name)
252b5132 13846{
18dc2407
ILT
13847 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13848 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13849 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13850 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13851 {
13852 if (!GOT_symbol)
13853 {
13854 if (symbol_find (name))
13855 as_bad (_("GOT already in symbol table"));
13856 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 13857 &zero_address_frag, 0);
24eab124
AM
13858 };
13859 return GOT_symbol;
13860 }
252b5132
RH
13861 return 0;
13862}
13863
13864/* Round up a section size to the appropriate boundary. */
47926f60 13865
252b5132 13866valueT
7016a5d5 13867md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13868{
4c63da97
AM
13869#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13870 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13871 {
13872 /* For a.out, force the section size to be aligned. If we don't do
13873 this, BFD will align it for us, but it will not write out the
13874 final bytes of the section. This may be a bug in BFD, but it is
13875 easier to fix it here since that is how the other a.out targets
13876 work. */
13877 int align;
13878
fd361982 13879 align = bfd_section_alignment (segment);
8d3842cd 13880 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13881 }
252b5132
RH
13882#endif
13883
13884 return size;
13885}
13886
13887/* On the i386, PC-relative offsets are relative to the start of the
13888 next instruction. That is, the address of the offset, plus its
13889 size, since the offset is always the last part of the insn. */
13890
13891long
e3bb37b5 13892md_pcrel_from (fixS *fixP)
252b5132
RH
13893{
13894 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13895}
13896
13897#ifndef I386COFF
13898
13899static void
e3bb37b5 13900s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13901{
29b0f896 13902 int temp;
252b5132 13903
8a75718c
JB
13904#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13905 if (IS_ELF)
13906 obj_elf_section_change_hook ();
13907#endif
252b5132
RH
13908 temp = get_absolute_expression ();
13909 subseg_set (bss_section, (subsegT) temp);
13910 demand_empty_rest_of_line ();
13911}
13912
13913#endif
13914
e379e5f3
L
13915/* Remember constant directive. */
13916
13917void
13918i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13919{
13920 if (last_insn.kind != last_insn_directive
13921 && (bfd_section_flags (now_seg) & SEC_CODE))
13922 {
13923 last_insn.seg = now_seg;
13924 last_insn.kind = last_insn_directive;
13925 last_insn.name = "constant directive";
13926 last_insn.file = as_where (&last_insn.line);
ae531041
L
13927 if (lfence_before_ret != lfence_before_ret_none)
13928 {
13929 if (lfence_before_indirect_branch != lfence_branch_none)
13930 as_warn (_("constant directive skips -mlfence-before-ret "
13931 "and -mlfence-before-indirect-branch"));
13932 else
13933 as_warn (_("constant directive skips -mlfence-before-ret"));
13934 }
13935 else if (lfence_before_indirect_branch != lfence_branch_none)
13936 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13937 }
13938}
13939
252b5132 13940void
e3bb37b5 13941i386_validate_fix (fixS *fixp)
252b5132 13942{
02a86693 13943 if (fixp->fx_subsy)
252b5132 13944 {
02a86693 13945 if (fixp->fx_subsy == GOT_symbol)
23df1078 13946 {
02a86693
L
13947 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13948 {
13949 if (!object_64bit)
13950 abort ();
13951#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13952 if (fixp->fx_tcbit2)
56ceb5b5
L
13953 fixp->fx_r_type = (fixp->fx_tcbit
13954 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13955 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13956 else
13957#endif
13958 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13959 }
d6ab8113 13960 else
02a86693
L
13961 {
13962 if (!object_64bit)
13963 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13964 else
13965 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13966 }
13967 fixp->fx_subsy = 0;
23df1078 13968 }
252b5132 13969 }
02a86693 13970#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 13971 else
02a86693 13972 {
2585b7a5
L
13973 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
13974 to section. Since PLT32 relocation must be against symbols,
13975 turn such PLT32 relocation into PC32 relocation. */
13976 if (fixp->fx_addsy
13977 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
13978 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
13979 && symbol_section_p (fixp->fx_addsy))
13980 fixp->fx_r_type = BFD_RELOC_32_PCREL;
13981 if (!object_64bit)
13982 {
13983 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13984 && fixp->fx_tcbit2)
13985 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13986 }
02a86693
L
13987 }
13988#endif
252b5132
RH
13989}
13990
252b5132 13991arelent *
7016a5d5 13992tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13993{
13994 arelent *rel;
13995 bfd_reloc_code_real_type code;
13996
13997 switch (fixp->fx_r_type)
13998 {
8ce3d284 13999#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
14000 case BFD_RELOC_SIZE32:
14001 case BFD_RELOC_SIZE64:
14002 if (S_IS_DEFINED (fixp->fx_addsy)
14003 && !S_IS_EXTERNAL (fixp->fx_addsy))
14004 {
14005 /* Resolve size relocation against local symbol to size of
14006 the symbol plus addend. */
14007 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
14008 if (fixp->fx_r_type == BFD_RELOC_SIZE32
14009 && !fits_in_unsigned_long (value))
14010 as_bad_where (fixp->fx_file, fixp->fx_line,
14011 _("symbol size computation overflow"));
14012 fixp->fx_addsy = NULL;
14013 fixp->fx_subsy = NULL;
14014 md_apply_fix (fixp, (valueT *) &value, NULL);
14015 return NULL;
14016 }
8ce3d284 14017#endif
1a0670f3 14018 /* Fall through. */
8fd4256d 14019
3e73aa7c
JH
14020 case BFD_RELOC_X86_64_PLT32:
14021 case BFD_RELOC_X86_64_GOT32:
14022 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14023 case BFD_RELOC_X86_64_GOTPCRELX:
14024 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
14025 case BFD_RELOC_386_PLT32:
14026 case BFD_RELOC_386_GOT32:
02a86693 14027 case BFD_RELOC_386_GOT32X:
252b5132
RH
14028 case BFD_RELOC_386_GOTOFF:
14029 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
14030 case BFD_RELOC_386_TLS_GD:
14031 case BFD_RELOC_386_TLS_LDM:
14032 case BFD_RELOC_386_TLS_LDO_32:
14033 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
14034 case BFD_RELOC_386_TLS_IE:
14035 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
14036 case BFD_RELOC_386_TLS_LE_32:
14037 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
14038 case BFD_RELOC_386_TLS_GOTDESC:
14039 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
14040 case BFD_RELOC_X86_64_TLSGD:
14041 case BFD_RELOC_X86_64_TLSLD:
14042 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 14043 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
14044 case BFD_RELOC_X86_64_GOTTPOFF:
14045 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
14046 case BFD_RELOC_X86_64_TPOFF64:
14047 case BFD_RELOC_X86_64_GOTOFF64:
14048 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
14049 case BFD_RELOC_X86_64_GOT64:
14050 case BFD_RELOC_X86_64_GOTPCREL64:
14051 case BFD_RELOC_X86_64_GOTPC64:
14052 case BFD_RELOC_X86_64_GOTPLT64:
14053 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
14054 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14055 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
14056 case BFD_RELOC_RVA:
14057 case BFD_RELOC_VTABLE_ENTRY:
14058 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
14059#ifdef TE_PE
14060 case BFD_RELOC_32_SECREL:
14061#endif
252b5132
RH
14062 code = fixp->fx_r_type;
14063 break;
dbbaec26
L
14064 case BFD_RELOC_X86_64_32S:
14065 if (!fixp->fx_pcrel)
14066 {
14067 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
14068 code = fixp->fx_r_type;
14069 break;
14070 }
1a0670f3 14071 /* Fall through. */
252b5132 14072 default:
93382f6d 14073 if (fixp->fx_pcrel)
252b5132 14074 {
93382f6d
AM
14075 switch (fixp->fx_size)
14076 {
14077 default:
b091f402
AM
14078 as_bad_where (fixp->fx_file, fixp->fx_line,
14079 _("can not do %d byte pc-relative relocation"),
14080 fixp->fx_size);
93382f6d
AM
14081 code = BFD_RELOC_32_PCREL;
14082 break;
14083 case 1: code = BFD_RELOC_8_PCREL; break;
14084 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 14085 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
14086#ifdef BFD64
14087 case 8: code = BFD_RELOC_64_PCREL; break;
14088#endif
93382f6d
AM
14089 }
14090 }
14091 else
14092 {
14093 switch (fixp->fx_size)
14094 {
14095 default:
b091f402
AM
14096 as_bad_where (fixp->fx_file, fixp->fx_line,
14097 _("can not do %d byte relocation"),
14098 fixp->fx_size);
93382f6d
AM
14099 code = BFD_RELOC_32;
14100 break;
14101 case 1: code = BFD_RELOC_8; break;
14102 case 2: code = BFD_RELOC_16; break;
14103 case 4: code = BFD_RELOC_32; break;
937149dd 14104#ifdef BFD64
3e73aa7c 14105 case 8: code = BFD_RELOC_64; break;
937149dd 14106#endif
93382f6d 14107 }
252b5132
RH
14108 }
14109 break;
14110 }
252b5132 14111
d182319b
JB
14112 if ((code == BFD_RELOC_32
14113 || code == BFD_RELOC_32_PCREL
14114 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14115 && GOT_symbol
14116 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14117 {
4fa24527 14118 if (!object_64bit)
d6ab8113
JB
14119 code = BFD_RELOC_386_GOTPC;
14120 else
14121 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14122 }
7b81dfbb
AJ
14123 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14124 && GOT_symbol
14125 && fixp->fx_addsy == GOT_symbol)
14126 {
14127 code = BFD_RELOC_X86_64_GOTPC64;
14128 }
252b5132 14129
add39d23
TS
14130 rel = XNEW (arelent);
14131 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14132 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14133
14134 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14135
3e73aa7c
JH
14136 if (!use_rela_relocations)
14137 {
14138 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14139 vtable entry to be used in the relocation's section offset. */
14140 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14141 rel->address = fixp->fx_offset;
fbeb56a4
DK
14142#if defined (OBJ_COFF) && defined (TE_PE)
14143 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14144 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14145 else
14146#endif
c6682705 14147 rel->addend = 0;
3e73aa7c
JH
14148 }
14149 /* Use the rela in 64bit mode. */
252b5132 14150 else
3e73aa7c 14151 {
862be3fb
L
14152 if (disallow_64bit_reloc)
14153 switch (code)
14154 {
862be3fb
L
14155 case BFD_RELOC_X86_64_DTPOFF64:
14156 case BFD_RELOC_X86_64_TPOFF64:
14157 case BFD_RELOC_64_PCREL:
14158 case BFD_RELOC_X86_64_GOTOFF64:
14159 case BFD_RELOC_X86_64_GOT64:
14160 case BFD_RELOC_X86_64_GOTPCREL64:
14161 case BFD_RELOC_X86_64_GOTPC64:
14162 case BFD_RELOC_X86_64_GOTPLT64:
14163 case BFD_RELOC_X86_64_PLTOFF64:
14164 as_bad_where (fixp->fx_file, fixp->fx_line,
14165 _("cannot represent relocation type %s in x32 mode"),
14166 bfd_get_reloc_code_name (code));
14167 break;
14168 default:
14169 break;
14170 }
14171
062cd5e7
AS
14172 if (!fixp->fx_pcrel)
14173 rel->addend = fixp->fx_offset;
14174 else
14175 switch (code)
14176 {
14177 case BFD_RELOC_X86_64_PLT32:
14178 case BFD_RELOC_X86_64_GOT32:
14179 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14180 case BFD_RELOC_X86_64_GOTPCRELX:
14181 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14182 case BFD_RELOC_X86_64_TLSGD:
14183 case BFD_RELOC_X86_64_TLSLD:
14184 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14185 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14186 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14187 rel->addend = fixp->fx_offset - fixp->fx_size;
14188 break;
14189 default:
14190 rel->addend = (section->vma
14191 - fixp->fx_size
14192 + fixp->fx_addnumber
14193 + md_pcrel_from (fixp));
14194 break;
14195 }
3e73aa7c
JH
14196 }
14197
252b5132
RH
14198 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14199 if (rel->howto == NULL)
14200 {
14201 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14202 _("cannot represent relocation type %s"),
252b5132
RH
14203 bfd_get_reloc_code_name (code));
14204 /* Set howto to a garbage value so that we can keep going. */
14205 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14206 gas_assert (rel->howto != NULL);
252b5132
RH
14207 }
14208
14209 return rel;
14210}
14211
ee86248c 14212#include "tc-i386-intel.c"
54cfded0 14213
a60de03c
JB
14214void
14215tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14216{
a60de03c
JB
14217 int saved_naked_reg;
14218 char saved_register_dot;
54cfded0 14219
a60de03c
JB
14220 saved_naked_reg = allow_naked_reg;
14221 allow_naked_reg = 1;
14222 saved_register_dot = register_chars['.'];
14223 register_chars['.'] = '.';
14224 allow_pseudo_reg = 1;
14225 expression_and_evaluate (exp);
14226 allow_pseudo_reg = 0;
14227 register_chars['.'] = saved_register_dot;
14228 allow_naked_reg = saved_naked_reg;
14229
e96d56a1 14230 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14231 {
a60de03c
JB
14232 if ((addressT) exp->X_add_number < i386_regtab_size)
14233 {
14234 exp->X_op = O_constant;
14235 exp->X_add_number = i386_regtab[exp->X_add_number]
14236 .dw2_regnum[flag_code >> 1];
14237 }
14238 else
14239 exp->X_op = O_illegal;
54cfded0 14240 }
54cfded0
AM
14241}
14242
14243void
14244tc_x86_frame_initial_instructions (void)
14245{
a60de03c
JB
14246 static unsigned int sp_regno[2];
14247
14248 if (!sp_regno[flag_code >> 1])
14249 {
14250 char *saved_input = input_line_pointer;
14251 char sp[][4] = {"esp", "rsp"};
14252 expressionS exp;
a4447b93 14253
a60de03c
JB
14254 input_line_pointer = sp[flag_code >> 1];
14255 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14256 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14257 sp_regno[flag_code >> 1] = exp.X_add_number;
14258 input_line_pointer = saved_input;
14259 }
a4447b93 14260
61ff971f
L
14261 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14262 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14263}
d2b2c203 14264
d7921315
L
14265int
14266x86_dwarf2_addr_size (void)
14267{
14268#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14269 if (x86_elf_abi == X86_64_X32_ABI)
14270 return 4;
14271#endif
14272 return bfd_arch_bits_per_address (stdoutput) / 8;
14273}
14274
d2b2c203
DJ
14275int
14276i386_elf_section_type (const char *str, size_t len)
14277{
14278 if (flag_code == CODE_64BIT
14279 && len == sizeof ("unwind") - 1
14280 && strncmp (str, "unwind", 6) == 0)
14281 return SHT_X86_64_UNWIND;
14282
14283 return -1;
14284}
bb41ade5 14285
ad5fec3b
EB
14286#ifdef TE_SOLARIS
14287void
14288i386_solaris_fix_up_eh_frame (segT sec)
14289{
14290 if (flag_code == CODE_64BIT)
14291 elf_section_type (sec) = SHT_X86_64_UNWIND;
14292}
14293#endif
14294
bb41ade5
AM
14295#ifdef TE_PE
14296void
14297tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14298{
91d6fa6a 14299 expressionS exp;
bb41ade5 14300
91d6fa6a
NC
14301 exp.X_op = O_secrel;
14302 exp.X_add_symbol = symbol;
14303 exp.X_add_number = 0;
14304 emit_expr (&exp, size);
bb41ade5
AM
14305}
14306#endif
3b22753a
L
14307
14308#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14309/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14310
01e1a5bc 14311bfd_vma
6d4af3c2 14312x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14313{
14314 if (flag_code == CODE_64BIT)
14315 {
14316 if (letter == 'l')
14317 return SHF_X86_64_LARGE;
14318
8f3bae45 14319 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14320 }
3b22753a 14321 else
8f3bae45 14322 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14323 return -1;
14324}
14325
01e1a5bc 14326bfd_vma
3b22753a
L
14327x86_64_section_word (char *str, size_t len)
14328{
8620418b 14329 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14330 return SHF_X86_64_LARGE;
14331
14332 return -1;
14333}
14334
14335static void
14336handle_large_common (int small ATTRIBUTE_UNUSED)
14337{
14338 if (flag_code != CODE_64BIT)
14339 {
14340 s_comm_internal (0, elf_common_parse);
14341 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14342 }
14343 else
14344 {
14345 static segT lbss_section;
14346 asection *saved_com_section_ptr = elf_com_section_ptr;
14347 asection *saved_bss_section = bss_section;
14348
14349 if (lbss_section == NULL)
14350 {
14351 flagword applicable;
14352 segT seg = now_seg;
14353 subsegT subseg = now_subseg;
14354
14355 /* The .lbss section is for local .largecomm symbols. */
14356 lbss_section = subseg_new (".lbss", 0);
14357 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14358 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14359 seg_info (lbss_section)->bss = 1;
14360
14361 subseg_set (seg, subseg);
14362 }
14363
14364 elf_com_section_ptr = &_bfd_elf_large_com_section;
14365 bss_section = lbss_section;
14366
14367 s_comm_internal (0, elf_common_parse);
14368
14369 elf_com_section_ptr = saved_com_section_ptr;
14370 bss_section = saved_bss_section;
14371 }
14372}
14373#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 3.162583 seconds and 4 git commands to generate.