]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-i386.c
x86: operand sizing prefixes can disambiguate insns
[thirdparty/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
L
292 unsupported,
293 invalid_vsib_address,
7bab8ab5 294 invalid_vector_register_set,
43234a1e
L
295 unsupported_vector_index_register,
296 unsupported_broadcast,
43234a1e
L
297 broadcast_needed,
298 unsupported_masking,
299 mask_not_on_destination,
300 no_default_mask,
301 unsupported_rc_sae,
302 rc_sae_operand_not_last_imm,
303 invalid_register_operand,
a65babc9
L
304 };
305
252b5132
RH
306struct _i386_insn
307 {
47926f60 308 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 309 insn_template tm;
252b5132 310
7d5e4556
L
311 /* SUFFIX holds the instruction size suffix for byte, word, dword
312 or qword, if given. */
252b5132
RH
313 char suffix;
314
47926f60 315 /* OPERANDS gives the number of given operands. */
252b5132
RH
316 unsigned int operands;
317
318 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
319 of given register, displacement, memory operands and immediate
47926f60 320 operands. */
252b5132
RH
321 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
322
323 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 324 use OP[i] for the corresponding operand. */
40fb9820 325 i386_operand_type types[MAX_OPERANDS];
252b5132 326
520dc8e8
AM
327 /* Displacement expression, immediate expression, or register for each
328 operand. */
329 union i386_op op[MAX_OPERANDS];
252b5132 330
3e73aa7c
JH
331 /* Flags for operands. */
332 unsigned int flags[MAX_OPERANDS];
333#define Operand_PCrel 1
c48dadc9 334#define Operand_Mem 2
3e73aa7c 335
252b5132 336 /* Relocation type for operand */
f86103b7 337 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 338
252b5132
RH
339 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
340 the base index byte below. */
341 const reg_entry *base_reg;
342 const reg_entry *index_reg;
343 unsigned int log2_scale_factor;
344
345 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 346 explicit segment overrides are given. */
ce8a8b2f 347 const seg_entry *seg[2];
252b5132 348
8325cc63
JB
349 /* Copied first memory operand string, for re-checking. */
350 char *memop1_string;
351
252b5132
RH
352 /* PREFIX holds all the given prefix opcodes (usually null).
353 PREFIXES is the number of prefix opcodes. */
354 unsigned int prefixes;
355 unsigned char prefix[MAX_PREFIXES];
356
50128d0c
JB
357 /* Register is in low 3 bits of opcode. */
358 bfd_boolean short_form;
359
6f2f06be
JB
360 /* The operand to a branch insn indicates an absolute branch. */
361 bfd_boolean jumpabsolute;
362
b4a3a7b4
L
363 /* Has MMX register operands. */
364 bfd_boolean has_regmmx;
365
366 /* Has XMM register operands. */
367 bfd_boolean has_regxmm;
368
369 /* Has YMM register operands. */
370 bfd_boolean has_regymm;
371
372 /* Has ZMM register operands. */
373 bfd_boolean has_regzmm;
374
e379e5f3
L
375 /* Has GOTPC or TLS relocation. */
376 bfd_boolean has_gotpc_tls_reloc;
377
252b5132 378 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 379 addressing modes of this insn are encoded. */
252b5132 380 modrm_byte rm;
3e73aa7c 381 rex_byte rex;
43234a1e 382 rex_byte vrex;
252b5132 383 sib_byte sib;
c0f3af97 384 vex_prefix vex;
b6169b20 385
43234a1e
L
386 /* Masking attributes. */
387 struct Mask_Operation *mask;
388
389 /* Rounding control and SAE attributes. */
390 struct RC_Operation *rounding;
391
392 /* Broadcasting attributes. */
393 struct Broadcast_Operation *broadcast;
394
395 /* Compressed disp8*N attribute. */
396 unsigned int memshift;
397
86fa6981
L
398 /* Prefer load or store in encoding. */
399 enum
400 {
401 dir_encoding_default = 0,
402 dir_encoding_load,
64c49ab3
JB
403 dir_encoding_store,
404 dir_encoding_swap
86fa6981 405 } dir_encoding;
891edac4 406
a501d77e
L
407 /* Prefer 8bit or 32bit displacement in encoding. */
408 enum
409 {
410 disp_encoding_default = 0,
411 disp_encoding_8bit,
412 disp_encoding_32bit
413 } disp_encoding;
f8a5c266 414
6b6b6807
L
415 /* Prefer the REX byte in encoding. */
416 bfd_boolean rex_encoding;
417
b6f8c7c4
L
418 /* Disable instruction size optimization. */
419 bfd_boolean no_optimize;
420
86fa6981
L
421 /* How to encode vector instructions. */
422 enum
423 {
424 vex_encoding_default = 0,
42e04b36 425 vex_encoding_vex,
86fa6981 426 vex_encoding_vex3,
da4977e0
JB
427 vex_encoding_evex,
428 vex_encoding_error
86fa6981
L
429 } vec_encoding;
430
d5de92cf
L
431 /* REP prefix. */
432 const char *rep_prefix;
433
165de32a
L
434 /* HLE prefix. */
435 const char *hle_prefix;
42164a71 436
7e8b059b
L
437 /* Have BND prefix. */
438 const char *bnd_prefix;
439
04ef582a
L
440 /* Have NOTRACK prefix. */
441 const char *notrack_prefix;
442
891edac4 443 /* Error message. */
a65babc9 444 enum i386_error error;
252b5132
RH
445 };
446
447typedef struct _i386_insn i386_insn;
448
43234a1e
L
449/* Link RC type with corresponding string, that'll be looked for in
450 asm. */
451struct RC_name
452{
453 enum rc_type type;
454 const char *name;
455 unsigned int len;
456};
457
458static const struct RC_name RC_NamesTable[] =
459{
460 { rne, STRING_COMMA_LEN ("rn-sae") },
461 { rd, STRING_COMMA_LEN ("rd-sae") },
462 { ru, STRING_COMMA_LEN ("ru-sae") },
463 { rz, STRING_COMMA_LEN ("rz-sae") },
464 { saeonly, STRING_COMMA_LEN ("sae") },
465};
466
252b5132
RH
467/* List of chars besides those in app.c:symbol_chars that can start an
468 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 469const char extra_symbol_chars[] = "*%-([{}"
252b5132 470#ifdef LEX_AT
32137342
NC
471 "@"
472#endif
473#ifdef LEX_QM
474 "?"
252b5132 475#endif
32137342 476 ;
252b5132 477
29b0f896
AM
478#if (defined (TE_I386AIX) \
479 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 480 && !defined (TE_GNU) \
29b0f896 481 && !defined (TE_LINUX) \
8d63c93e 482 && !defined (TE_NACL) \
29b0f896 483 && !defined (TE_FreeBSD) \
5b806d27 484 && !defined (TE_DragonFly) \
29b0f896 485 && !defined (TE_NetBSD)))
252b5132 486/* This array holds the chars that always start a comment. If the
b3b91714
AM
487 pre-processor is disabled, these aren't very useful. The option
488 --divide will remove '/' from this list. */
489const char *i386_comment_chars = "#/";
490#define SVR4_COMMENT_CHARS 1
252b5132 491#define PREFIX_SEPARATOR '\\'
252b5132 492
b3b91714
AM
493#else
494const char *i386_comment_chars = "#";
495#define PREFIX_SEPARATOR '/'
496#endif
497
252b5132
RH
498/* This array holds the chars that only start a comment at the beginning of
499 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
500 .line and .file directives will appear in the pre-processed output.
501 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 502 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
503 #NO_APP at the beginning of its output.
504 Also note that comments started like this one will always work if
252b5132 505 '/' isn't otherwise defined. */
b3b91714 506const char line_comment_chars[] = "#/";
252b5132 507
63a0b638 508const char line_separator_chars[] = ";";
252b5132 509
ce8a8b2f
AM
510/* Chars that can be used to separate mant from exp in floating point
511 nums. */
252b5132
RH
512const char EXP_CHARS[] = "eE";
513
ce8a8b2f
AM
514/* Chars that mean this number is a floating point constant
515 As in 0f12.456
516 or 0d1.2345e12. */
252b5132
RH
517const char FLT_CHARS[] = "fFdDxX";
518
ce8a8b2f 519/* Tables for lexical analysis. */
252b5132
RH
520static char mnemonic_chars[256];
521static char register_chars[256];
522static char operand_chars[256];
523static char identifier_chars[256];
524static char digit_chars[256];
525
ce8a8b2f 526/* Lexical macros. */
252b5132
RH
527#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
528#define is_operand_char(x) (operand_chars[(unsigned char) x])
529#define is_register_char(x) (register_chars[(unsigned char) x])
530#define is_space_char(x) ((x) == ' ')
531#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
532#define is_digit_char(x) (digit_chars[(unsigned char) x])
533
0234cb7c 534/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
535static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
536
537/* md_assemble() always leaves the strings it's passed unaltered. To
538 effect this we maintain a stack of saved characters that we've smashed
539 with '\0's (indicating end of strings for various sub-fields of the
47926f60 540 assembler instruction). */
252b5132 541static char save_stack[32];
ce8a8b2f 542static char *save_stack_p;
252b5132
RH
543#define END_STRING_AND_SAVE(s) \
544 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
545#define RESTORE_END_STRING(s) \
546 do { *(s) = *--save_stack_p; } while (0)
547
47926f60 548/* The instruction we're assembling. */
252b5132
RH
549static i386_insn i;
550
551/* Possible templates for current insn. */
552static const templates *current_templates;
553
31b2323c
L
554/* Per instruction expressionS buffers: max displacements & immediates. */
555static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
556static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 557
47926f60 558/* Current operand we are working on. */
ee86248c 559static int this_operand = -1;
252b5132 560
3e73aa7c
JH
561/* We support four different modes. FLAG_CODE variable is used to distinguish
562 these. */
563
564enum flag_code {
565 CODE_32BIT,
566 CODE_16BIT,
567 CODE_64BIT };
568
569static enum flag_code flag_code;
4fa24527 570static unsigned int object_64bit;
862be3fb 571static unsigned int disallow_64bit_reloc;
3e73aa7c 572static int use_rela_relocations = 0;
e379e5f3
L
573/* __tls_get_addr/___tls_get_addr symbol for TLS. */
574static const char *tls_get_addr;
3e73aa7c 575
7af8ed2d
NC
576#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
577 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
578 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
579
351f65ca
L
580/* The ELF ABI to use. */
581enum x86_elf_abi
582{
583 I386_ABI,
7f56bc95
L
584 X86_64_ABI,
585 X86_64_X32_ABI
351f65ca
L
586};
587
588static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 589#endif
351f65ca 590
167ad85b
TG
591#if defined (TE_PE) || defined (TE_PEP)
592/* Use big object file format. */
593static int use_big_obj = 0;
594#endif
595
8dcea932
L
596#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
597/* 1 if generating code for a shared library. */
598static int shared = 0;
599#endif
600
47926f60
KH
601/* 1 for intel syntax,
602 0 if att syntax. */
603static int intel_syntax = 0;
252b5132 604
4b5aaf5f
L
605static enum x86_64_isa
606{
607 amd64 = 1, /* AMD64 ISA. */
608 intel64 /* Intel64 ISA. */
609} isa64;
e89c5eaa 610
1efbbeb4
L
611/* 1 for intel mnemonic,
612 0 if att mnemonic. */
613static int intel_mnemonic = !SYSV386_COMPAT;
614
a60de03c
JB
615/* 1 if pseudo registers are permitted. */
616static int allow_pseudo_reg = 0;
617
47926f60
KH
618/* 1 if register prefix % not required. */
619static int allow_naked_reg = 0;
252b5132 620
33eaf5de 621/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
622 instructions supporting it, even if this prefix wasn't specified
623 explicitly. */
624static int add_bnd_prefix = 0;
625
ba104c83 626/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
627static int allow_index_reg = 0;
628
d022bddd
IT
629/* 1 if the assembler should ignore LOCK prefix, even if it was
630 specified explicitly. */
631static int omit_lock_prefix = 0;
632
e4e00185
AS
633/* 1 if the assembler should encode lfence, mfence, and sfence as
634 "lock addl $0, (%{re}sp)". */
635static int avoid_fence = 0;
636
ae531041
L
637/* 1 if lfence should be inserted after every load. */
638static int lfence_after_load = 0;
639
640/* Non-zero if lfence should be inserted before indirect branch. */
641static enum lfence_before_indirect_branch_kind
642 {
643 lfence_branch_none = 0,
644 lfence_branch_register,
645 lfence_branch_memory,
646 lfence_branch_all
647 }
648lfence_before_indirect_branch;
649
650/* Non-zero if lfence should be inserted before ret. */
651static enum lfence_before_ret_kind
652 {
653 lfence_before_ret_none = 0,
654 lfence_before_ret_not,
a09f656b 655 lfence_before_ret_or,
656 lfence_before_ret_shl
ae531041
L
657 }
658lfence_before_ret;
659
660/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
661static struct
662 {
663 segT seg;
664 const char *file;
665 const char *name;
666 unsigned int line;
667 enum last_insn_kind
668 {
669 last_insn_other = 0,
670 last_insn_directive,
671 last_insn_prefix
672 } kind;
673 } last_insn;
674
0cb4071e
L
675/* 1 if the assembler should generate relax relocations. */
676
677static int generate_relax_relocations
678 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
679
7bab8ab5 680static enum check_kind
daf50ae7 681 {
7bab8ab5
JB
682 check_none = 0,
683 check_warning,
684 check_error
daf50ae7 685 }
7bab8ab5 686sse_check, operand_check = check_warning;
daf50ae7 687
e379e5f3
L
688/* Non-zero if branches should be aligned within power of 2 boundary. */
689static int align_branch_power = 0;
690
691/* Types of branches to align. */
692enum align_branch_kind
693 {
694 align_branch_none = 0,
695 align_branch_jcc = 1,
696 align_branch_fused = 2,
697 align_branch_jmp = 3,
698 align_branch_call = 4,
699 align_branch_indirect = 5,
700 align_branch_ret = 6
701 };
702
703/* Type bits of branches to align. */
704enum align_branch_bit
705 {
706 align_branch_jcc_bit = 1 << align_branch_jcc,
707 align_branch_fused_bit = 1 << align_branch_fused,
708 align_branch_jmp_bit = 1 << align_branch_jmp,
709 align_branch_call_bit = 1 << align_branch_call,
710 align_branch_indirect_bit = 1 << align_branch_indirect,
711 align_branch_ret_bit = 1 << align_branch_ret
712 };
713
714static unsigned int align_branch = (align_branch_jcc_bit
715 | align_branch_fused_bit
716 | align_branch_jmp_bit);
717
79d72f45
HL
718/* Types of condition jump used by macro-fusion. */
719enum mf_jcc_kind
720 {
721 mf_jcc_jo = 0, /* base opcode 0x70 */
722 mf_jcc_jc, /* base opcode 0x72 */
723 mf_jcc_je, /* base opcode 0x74 */
724 mf_jcc_jna, /* base opcode 0x76 */
725 mf_jcc_js, /* base opcode 0x78 */
726 mf_jcc_jp, /* base opcode 0x7a */
727 mf_jcc_jl, /* base opcode 0x7c */
728 mf_jcc_jle, /* base opcode 0x7e */
729 };
730
731/* Types of compare flag-modifying insntructions used by macro-fusion. */
732enum mf_cmp_kind
733 {
734 mf_cmp_test_and, /* test/cmp */
735 mf_cmp_alu_cmp, /* add/sub/cmp */
736 mf_cmp_incdec /* inc/dec */
737 };
738
e379e5f3
L
739/* The maximum padding size for fused jcc. CMP like instruction can
740 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
741 prefixes. */
742#define MAX_FUSED_JCC_PADDING_SIZE 20
743
744/* The maximum number of prefixes added for an instruction. */
745static unsigned int align_branch_prefix_size = 5;
746
b6f8c7c4
L
747/* Optimization:
748 1. Clear the REX_W bit with register operand if possible.
749 2. Above plus use 128bit vector instruction to clear the full vector
750 register.
751 */
752static int optimize = 0;
753
754/* Optimization:
755 1. Clear the REX_W bit with register operand if possible.
756 2. Above plus use 128bit vector instruction to clear the full vector
757 register.
758 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
759 "testb $imm7,%r8".
760 */
761static int optimize_for_space = 0;
762
2ca3ace5
L
763/* Register prefix used for error message. */
764static const char *register_prefix = "%";
765
47926f60
KH
766/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
767 leave, push, and pop instructions so that gcc has the same stack
768 frame as in 32 bit mode. */
769static char stackop_size = '\0';
eecb386c 770
12b55ccc
L
771/* Non-zero to optimize code alignment. */
772int optimize_align_code = 1;
773
47926f60
KH
774/* Non-zero to quieten some warnings. */
775static int quiet_warnings = 0;
a38cf1db 776
47926f60
KH
777/* CPU name. */
778static const char *cpu_arch_name = NULL;
6305a203 779static char *cpu_sub_arch_name = NULL;
a38cf1db 780
47926f60 781/* CPU feature flags. */
40fb9820
L
782static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
783
ccc9c027
L
784/* If we have selected a cpu we are generating instructions for. */
785static int cpu_arch_tune_set = 0;
786
9103f4f4 787/* Cpu we are generating instructions for. */
fbf3f584 788enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
789
790/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 791static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 792
ccc9c027 793/* CPU instruction set architecture used. */
fbf3f584 794enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 795
9103f4f4 796/* CPU feature flags of instruction set architecture used. */
fbf3f584 797i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 798
fddf5b5b
AM
799/* If set, conditional jumps are not automatically promoted to handle
800 larger than a byte offset. */
801static unsigned int no_cond_jump_promotion = 0;
802
c0f3af97
L
803/* Encode SSE instructions with VEX prefix. */
804static unsigned int sse2avx;
805
539f890d
L
806/* Encode scalar AVX instructions with specific vector length. */
807static enum
808 {
809 vex128 = 0,
810 vex256
811 } avxscalar;
812
03751133
L
813/* Encode VEX WIG instructions with specific vex.w. */
814static enum
815 {
816 vexw0 = 0,
817 vexw1
818 } vexwig;
819
43234a1e
L
820/* Encode scalar EVEX LIG instructions with specific vector length. */
821static enum
822 {
823 evexl128 = 0,
824 evexl256,
825 evexl512
826 } evexlig;
827
828/* Encode EVEX WIG instructions with specific evex.w. */
829static enum
830 {
831 evexw0 = 0,
832 evexw1
833 } evexwig;
834
d3d3c6db
IT
835/* Value to encode in EVEX RC bits, for SAE-only instructions. */
836static enum rc_type evexrcig = rne;
837
29b0f896 838/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 839static symbolS *GOT_symbol;
29b0f896 840
a4447b93
RH
841/* The dwarf2 return column, adjusted for 32 or 64 bit. */
842unsigned int x86_dwarf2_return_column;
843
844/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
845int x86_cie_data_alignment;
846
252b5132 847/* Interface to relax_segment.
fddf5b5b
AM
848 There are 3 major relax states for 386 jump insns because the
849 different types of jumps add different sizes to frags when we're
e379e5f3
L
850 figuring out what sort of jump to choose to reach a given label.
851
852 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
853 branches which are handled by md_estimate_size_before_relax() and
854 i386_generic_table_relax_frag(). */
252b5132 855
47926f60 856/* Types. */
93c2a809
AM
857#define UNCOND_JUMP 0
858#define COND_JUMP 1
859#define COND_JUMP86 2
e379e5f3
L
860#define BRANCH_PADDING 3
861#define BRANCH_PREFIX 4
862#define FUSED_JCC_PADDING 5
fddf5b5b 863
47926f60 864/* Sizes. */
252b5132
RH
865#define CODE16 1
866#define SMALL 0
29b0f896 867#define SMALL16 (SMALL | CODE16)
252b5132 868#define BIG 2
29b0f896 869#define BIG16 (BIG | CODE16)
252b5132
RH
870
871#ifndef INLINE
872#ifdef __GNUC__
873#define INLINE __inline__
874#else
875#define INLINE
876#endif
877#endif
878
fddf5b5b
AM
879#define ENCODE_RELAX_STATE(type, size) \
880 ((relax_substateT) (((type) << 2) | (size)))
881#define TYPE_FROM_RELAX_STATE(s) \
882 ((s) >> 2)
883#define DISP_SIZE_FROM_RELAX_STATE(s) \
884 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
885
886/* This table is used by relax_frag to promote short jumps to long
887 ones where necessary. SMALL (short) jumps may be promoted to BIG
888 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
889 don't allow a short jump in a 32 bit code segment to be promoted to
890 a 16 bit offset jump because it's slower (requires data size
891 prefix), and doesn't work, unless the destination is in the bottom
892 64k of the code segment (The top 16 bits of eip are zeroed). */
893
894const relax_typeS md_relax_table[] =
895{
24eab124
AM
896 /* The fields are:
897 1) most positive reach of this state,
898 2) most negative reach of this state,
93c2a809 899 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 900 4) which index into the table to try if we can't fit into this one. */
252b5132 901
fddf5b5b 902 /* UNCOND_JUMP states. */
93c2a809
AM
903 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
904 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
905 /* dword jmp adds 4 bytes to frag:
906 0 extra opcode bytes, 4 displacement bytes. */
252b5132 907 {0, 0, 4, 0},
93c2a809
AM
908 /* word jmp adds 2 byte2 to frag:
909 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
910 {0, 0, 2, 0},
911
93c2a809
AM
912 /* COND_JUMP states. */
913 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
914 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
915 /* dword conditionals adds 5 bytes to frag:
916 1 extra opcode byte, 4 displacement bytes. */
917 {0, 0, 5, 0},
fddf5b5b 918 /* word conditionals add 3 bytes to frag:
93c2a809
AM
919 1 extra opcode byte, 2 displacement bytes. */
920 {0, 0, 3, 0},
921
922 /* COND_JUMP86 states. */
923 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
924 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
925 /* dword conditionals adds 5 bytes to frag:
926 1 extra opcode byte, 4 displacement bytes. */
927 {0, 0, 5, 0},
928 /* word conditionals add 4 bytes to frag:
929 1 displacement byte and a 3 byte long branch insn. */
930 {0, 0, 4, 0}
252b5132
RH
931};
932
9103f4f4
L
933static const arch_entry cpu_arch[] =
934{
89507696
JB
935 /* Do not replace the first two entries - i386_target_format()
936 relies on them being there in this order. */
8a2c8fef 937 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 938 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 939 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 940 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 941 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 942 CPU_NONE_FLAGS, 0 },
8a2c8fef 943 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 944 CPU_I186_FLAGS, 0 },
8a2c8fef 945 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 946 CPU_I286_FLAGS, 0 },
8a2c8fef 947 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 948 CPU_I386_FLAGS, 0 },
8a2c8fef 949 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 950 CPU_I486_FLAGS, 0 },
8a2c8fef 951 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 952 CPU_I586_FLAGS, 0 },
8a2c8fef 953 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 954 CPU_I686_FLAGS, 0 },
8a2c8fef 955 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 956 CPU_I586_FLAGS, 0 },
8a2c8fef 957 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 958 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 959 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 960 CPU_P2_FLAGS, 0 },
8a2c8fef 961 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 962 CPU_P3_FLAGS, 0 },
8a2c8fef 963 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 964 CPU_P4_FLAGS, 0 },
8a2c8fef 965 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 966 CPU_CORE_FLAGS, 0 },
8a2c8fef 967 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 968 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 969 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 970 CPU_CORE_FLAGS, 1 },
8a2c8fef 971 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 972 CPU_CORE_FLAGS, 0 },
8a2c8fef 973 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 974 CPU_CORE2_FLAGS, 1 },
8a2c8fef 975 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 976 CPU_CORE2_FLAGS, 0 },
8a2c8fef 977 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 978 CPU_COREI7_FLAGS, 0 },
8a2c8fef 979 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 980 CPU_L1OM_FLAGS, 0 },
7a9068fe 981 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 982 CPU_K1OM_FLAGS, 0 },
81486035 983 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 984 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 985 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 986 CPU_K6_FLAGS, 0 },
8a2c8fef 987 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 988 CPU_K6_2_FLAGS, 0 },
8a2c8fef 989 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 990 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 991 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 992 CPU_K8_FLAGS, 1 },
8a2c8fef 993 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 994 CPU_K8_FLAGS, 0 },
8a2c8fef 995 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 996 CPU_K8_FLAGS, 0 },
8a2c8fef 997 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 998 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 999 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 1000 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 1001 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 1002 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1003 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1004 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1005 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1006 CPU_BDVER4_FLAGS, 0 },
029f3522 1007 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1008 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1009 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1010 CPU_ZNVER2_FLAGS, 0 },
7b458c12 1011 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1012 CPU_BTVER1_FLAGS, 0 },
7b458c12 1013 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1014 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1015 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1016 CPU_8087_FLAGS, 0 },
8a2c8fef 1017 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1018 CPU_287_FLAGS, 0 },
8a2c8fef 1019 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1020 CPU_387_FLAGS, 0 },
1848e567
L
1021 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1022 CPU_687_FLAGS, 0 },
d871f3f4
L
1023 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1024 CPU_CMOV_FLAGS, 0 },
1025 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1026 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1027 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1028 CPU_MMX_FLAGS, 0 },
8a2c8fef 1029 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1030 CPU_SSE_FLAGS, 0 },
8a2c8fef 1031 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1032 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1033 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1034 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1035 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1036 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1037 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1038 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1039 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1040 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1041 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1042 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1043 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1044 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1045 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1046 CPU_AVX_FLAGS, 0 },
6c30d220 1047 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1048 CPU_AVX2_FLAGS, 0 },
43234a1e 1049 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1050 CPU_AVX512F_FLAGS, 0 },
43234a1e 1051 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1052 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1053 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1054 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1055 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1056 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1057 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1058 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1059 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1060 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1061 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1062 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1063 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1064 CPU_VMX_FLAGS, 0 },
8729a6f6 1065 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1066 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1067 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1068 CPU_SMX_FLAGS, 0 },
8a2c8fef 1069 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1070 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1071 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1072 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1073 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1074 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1075 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1076 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1077 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1078 CPU_AES_FLAGS, 0 },
8a2c8fef 1079 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1080 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1081 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1082 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1083 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1084 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1085 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1086 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1087 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1088 CPU_F16C_FLAGS, 0 },
6c30d220 1089 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1090 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1091 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1092 CPU_FMA_FLAGS, 0 },
8a2c8fef 1093 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1094 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1095 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1096 CPU_XOP_FLAGS, 0 },
8a2c8fef 1097 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1098 CPU_LWP_FLAGS, 0 },
8a2c8fef 1099 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1100 CPU_MOVBE_FLAGS, 0 },
60aa667e 1101 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1102 CPU_CX16_FLAGS, 0 },
8a2c8fef 1103 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1104 CPU_EPT_FLAGS, 0 },
6c30d220 1105 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1106 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1107 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1108 CPU_POPCNT_FLAGS, 0 },
42164a71 1109 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1110 CPU_HLE_FLAGS, 0 },
42164a71 1111 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1112 CPU_RTM_FLAGS, 0 },
6c30d220 1113 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1114 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1115 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1116 CPU_CLFLUSH_FLAGS, 0 },
22109423 1117 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1118 CPU_NOP_FLAGS, 0 },
8a2c8fef 1119 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1120 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1121 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1122 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1123 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1124 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1125 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1126 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1127 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1128 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1129 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1130 CPU_SVME_FLAGS, 1 },
8a2c8fef 1131 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1132 CPU_SVME_FLAGS, 0 },
8a2c8fef 1133 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1134 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1135 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1136 CPU_ABM_FLAGS, 0 },
87973e9f 1137 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1138 CPU_BMI_FLAGS, 0 },
2a2a0f38 1139 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1140 CPU_TBM_FLAGS, 0 },
e2e1fcde 1141 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1142 CPU_ADX_FLAGS, 0 },
e2e1fcde 1143 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1144 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1145 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1146 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1147 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1148 CPU_SMAP_FLAGS, 0 },
7e8b059b 1149 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1150 CPU_MPX_FLAGS, 0 },
a0046408 1151 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1152 CPU_SHA_FLAGS, 0 },
963f3586 1153 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1154 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1155 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1156 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1157 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1158 CPU_SE1_FLAGS, 0 },
c5e7287a 1159 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1160 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1161 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1162 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1163 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1164 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1165 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1166 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1167 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1168 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1169 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1170 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1171 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1172 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1173 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1174 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1175 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1176 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1177 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1178 CPU_CLZERO_FLAGS, 0 },
9916071f 1179 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1180 CPU_MWAITX_FLAGS, 0 },
8eab4136 1181 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1182 CPU_OSPKE_FLAGS, 0 },
8bc52696 1183 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1184 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1185 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1186 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1187 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1188 CPU_IBT_FLAGS, 0 },
1189 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1190 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1191 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1192 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1193 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1194 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1195 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1196 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1197 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1198 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1199 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1200 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1201 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1202 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1203 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1204 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1205 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1206 CPU_MOVDIRI_FLAGS, 0 },
1207 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1208 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1209 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1210 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1211 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1212 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1213 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1214 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1215 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1216 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1217 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1218 CPU_RDPRU_FLAGS, 0 },
1219 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1220 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1221 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1222 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1223 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1224 CPU_TSXLDTRK_FLAGS, 0 },
293f5f65
L
1225};
1226
1227static const noarch_entry cpu_noarch[] =
1228{
1229 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1230 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1231 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1232 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1233 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1234 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1235 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1236 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1237 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1238 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1239 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1240 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1241 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1242 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1243 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1244 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1245 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1246 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1247 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1248 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1249 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1250 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1251 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1252 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1253 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1254 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1255 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1256 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1257 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1258 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1259 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1260 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1261 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1262 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1263 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1264 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1265 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1266 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1267 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
dd455cf5 1268 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1269 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1270 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
e413e4e9
AM
1271};
1272
704209c0 1273#ifdef I386COFF
a6c24e68
NC
1274/* Like s_lcomm_internal in gas/read.c but the alignment string
1275 is allowed to be optional. */
1276
1277static symbolS *
1278pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1279{
1280 addressT align = 0;
1281
1282 SKIP_WHITESPACE ();
1283
7ab9ffdd 1284 if (needs_align
a6c24e68
NC
1285 && *input_line_pointer == ',')
1286 {
1287 align = parse_align (needs_align - 1);
7ab9ffdd 1288
a6c24e68
NC
1289 if (align == (addressT) -1)
1290 return NULL;
1291 }
1292 else
1293 {
1294 if (size >= 8)
1295 align = 3;
1296 else if (size >= 4)
1297 align = 2;
1298 else if (size >= 2)
1299 align = 1;
1300 else
1301 align = 0;
1302 }
1303
1304 bss_alloc (symbolP, size, align);
1305 return symbolP;
1306}
1307
704209c0 1308static void
a6c24e68
NC
1309pe_lcomm (int needs_align)
1310{
1311 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1312}
704209c0 1313#endif
a6c24e68 1314
29b0f896
AM
1315const pseudo_typeS md_pseudo_table[] =
1316{
1317#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1318 {"align", s_align_bytes, 0},
1319#else
1320 {"align", s_align_ptwo, 0},
1321#endif
1322 {"arch", set_cpu_arch, 0},
1323#ifndef I386COFF
1324 {"bss", s_bss, 0},
a6c24e68
NC
1325#else
1326 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1327#endif
1328 {"ffloat", float_cons, 'f'},
1329 {"dfloat", float_cons, 'd'},
1330 {"tfloat", float_cons, 'x'},
1331 {"value", cons, 2},
d182319b 1332 {"slong", signed_cons, 4},
29b0f896
AM
1333 {"noopt", s_ignore, 0},
1334 {"optim", s_ignore, 0},
1335 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1336 {"code16", set_code_flag, CODE_16BIT},
1337 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1338#ifdef BFD64
29b0f896 1339 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1340#endif
29b0f896
AM
1341 {"intel_syntax", set_intel_syntax, 1},
1342 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1343 {"intel_mnemonic", set_intel_mnemonic, 1},
1344 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1345 {"allow_index_reg", set_allow_index_reg, 1},
1346 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1347 {"sse_check", set_check, 0},
1348 {"operand_check", set_check, 1},
3b22753a
L
1349#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1350 {"largecomm", handle_large_common, 0},
07a53e5c 1351#else
68d20676 1352 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1353 {"loc", dwarf2_directive_loc, 0},
1354 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1355#endif
6482c264
NC
1356#ifdef TE_PE
1357 {"secrel32", pe_directive_secrel, 0},
1358#endif
29b0f896
AM
1359 {0, 0, 0}
1360};
1361
1362/* For interface with expression (). */
1363extern char *input_line_pointer;
1364
1365/* Hash table for instruction mnemonic lookup. */
1366static struct hash_control *op_hash;
1367
1368/* Hash table for register lookup. */
1369static struct hash_control *reg_hash;
1370\f
ce8a8b2f
AM
1371 /* Various efficient no-op patterns for aligning code labels.
1372 Note: Don't try to assemble the instructions in the comments.
1373 0L and 0w are not legal. */
62a02d25
L
1374static const unsigned char f32_1[] =
1375 {0x90}; /* nop */
1376static const unsigned char f32_2[] =
1377 {0x66,0x90}; /* xchg %ax,%ax */
1378static const unsigned char f32_3[] =
1379 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1380static const unsigned char f32_4[] =
1381 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1382static const unsigned char f32_6[] =
1383 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1384static const unsigned char f32_7[] =
1385 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1386static const unsigned char f16_3[] =
3ae729d5 1387 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1388static const unsigned char f16_4[] =
3ae729d5
L
1389 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1390static const unsigned char jump_disp8[] =
1391 {0xeb}; /* jmp disp8 */
1392static const unsigned char jump32_disp32[] =
1393 {0xe9}; /* jmp disp32 */
1394static const unsigned char jump16_disp32[] =
1395 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1396/* 32-bit NOPs patterns. */
1397static const unsigned char *const f32_patt[] = {
3ae729d5 1398 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1399};
1400/* 16-bit NOPs patterns. */
1401static const unsigned char *const f16_patt[] = {
3ae729d5 1402 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1403};
1404/* nopl (%[re]ax) */
1405static const unsigned char alt_3[] =
1406 {0x0f,0x1f,0x00};
1407/* nopl 0(%[re]ax) */
1408static const unsigned char alt_4[] =
1409 {0x0f,0x1f,0x40,0x00};
1410/* nopl 0(%[re]ax,%[re]ax,1) */
1411static const unsigned char alt_5[] =
1412 {0x0f,0x1f,0x44,0x00,0x00};
1413/* nopw 0(%[re]ax,%[re]ax,1) */
1414static const unsigned char alt_6[] =
1415 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1416/* nopl 0L(%[re]ax) */
1417static const unsigned char alt_7[] =
1418 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1419/* nopl 0L(%[re]ax,%[re]ax,1) */
1420static const unsigned char alt_8[] =
1421 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1422/* nopw 0L(%[re]ax,%[re]ax,1) */
1423static const unsigned char alt_9[] =
1424 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1425/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1426static const unsigned char alt_10[] =
1427 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1428/* data16 nopw %cs:0L(%eax,%eax,1) */
1429static const unsigned char alt_11[] =
1430 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1431/* 32-bit and 64-bit NOPs patterns. */
1432static const unsigned char *const alt_patt[] = {
1433 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1434 alt_9, alt_10, alt_11
62a02d25
L
1435};
1436
1437/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1438 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1439
1440static void
1441i386_output_nops (char *where, const unsigned char *const *patt,
1442 int count, int max_single_nop_size)
1443
1444{
3ae729d5
L
1445 /* Place the longer NOP first. */
1446 int last;
1447 int offset;
3076e594
NC
1448 const unsigned char *nops;
1449
1450 if (max_single_nop_size < 1)
1451 {
1452 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1453 max_single_nop_size);
1454 return;
1455 }
1456
1457 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1458
1459 /* Use the smaller one if the requsted one isn't available. */
1460 if (nops == NULL)
62a02d25 1461 {
3ae729d5
L
1462 max_single_nop_size--;
1463 nops = patt[max_single_nop_size - 1];
62a02d25
L
1464 }
1465
3ae729d5
L
1466 last = count % max_single_nop_size;
1467
1468 count -= last;
1469 for (offset = 0; offset < count; offset += max_single_nop_size)
1470 memcpy (where + offset, nops, max_single_nop_size);
1471
1472 if (last)
1473 {
1474 nops = patt[last - 1];
1475 if (nops == NULL)
1476 {
1477 /* Use the smaller one plus one-byte NOP if the needed one
1478 isn't available. */
1479 last--;
1480 nops = patt[last - 1];
1481 memcpy (where + offset, nops, last);
1482 where[offset + last] = *patt[0];
1483 }
1484 else
1485 memcpy (where + offset, nops, last);
1486 }
62a02d25
L
1487}
1488
3ae729d5
L
1489static INLINE int
1490fits_in_imm7 (offsetT num)
1491{
1492 return (num & 0x7f) == num;
1493}
1494
1495static INLINE int
1496fits_in_imm31 (offsetT num)
1497{
1498 return (num & 0x7fffffff) == num;
1499}
62a02d25
L
1500
1501/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1502 single NOP instruction LIMIT. */
1503
1504void
3ae729d5 1505i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1506{
3ae729d5 1507 const unsigned char *const *patt = NULL;
62a02d25 1508 int max_single_nop_size;
3ae729d5
L
1509 /* Maximum number of NOPs before switching to jump over NOPs. */
1510 int max_number_of_nops;
62a02d25 1511
3ae729d5 1512 switch (fragP->fr_type)
62a02d25 1513 {
3ae729d5
L
1514 case rs_fill_nop:
1515 case rs_align_code:
1516 break;
e379e5f3
L
1517 case rs_machine_dependent:
1518 /* Allow NOP padding for jumps and calls. */
1519 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1520 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1521 break;
1522 /* Fall through. */
3ae729d5 1523 default:
62a02d25
L
1524 return;
1525 }
1526
ccc9c027
L
1527 /* We need to decide which NOP sequence to use for 32bit and
1528 64bit. When -mtune= is used:
4eed87de 1529
76bc74dc
L
1530 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1531 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1532 2. For the rest, alt_patt will be used.
1533
1534 When -mtune= isn't used, alt_patt will be used if
22109423 1535 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1536 be used.
ccc9c027
L
1537
1538 When -march= or .arch is used, we can't use anything beyond
1539 cpu_arch_isa_flags. */
1540
1541 if (flag_code == CODE_16BIT)
1542 {
3ae729d5
L
1543 patt = f16_patt;
1544 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1545 /* Limit number of NOPs to 2 in 16-bit mode. */
1546 max_number_of_nops = 2;
252b5132 1547 }
33fef721 1548 else
ccc9c027 1549 {
fbf3f584 1550 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1551 {
1552 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1553 switch (cpu_arch_tune)
1554 {
1555 case PROCESSOR_UNKNOWN:
1556 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1557 optimize with nops. */
1558 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1559 patt = alt_patt;
ccc9c027
L
1560 else
1561 patt = f32_patt;
1562 break;
ccc9c027
L
1563 case PROCESSOR_PENTIUM4:
1564 case PROCESSOR_NOCONA:
ef05d495 1565 case PROCESSOR_CORE:
76bc74dc 1566 case PROCESSOR_CORE2:
bd5295b2 1567 case PROCESSOR_COREI7:
3632d14b 1568 case PROCESSOR_L1OM:
7a9068fe 1569 case PROCESSOR_K1OM:
76bc74dc 1570 case PROCESSOR_GENERIC64:
ccc9c027
L
1571 case PROCESSOR_K6:
1572 case PROCESSOR_ATHLON:
1573 case PROCESSOR_K8:
4eed87de 1574 case PROCESSOR_AMDFAM10:
8aedb9fe 1575 case PROCESSOR_BD:
029f3522 1576 case PROCESSOR_ZNVER:
7b458c12 1577 case PROCESSOR_BT:
80b8656c 1578 patt = alt_patt;
ccc9c027 1579 break;
76bc74dc 1580 case PROCESSOR_I386:
ccc9c027
L
1581 case PROCESSOR_I486:
1582 case PROCESSOR_PENTIUM:
2dde1948 1583 case PROCESSOR_PENTIUMPRO:
81486035 1584 case PROCESSOR_IAMCU:
ccc9c027
L
1585 case PROCESSOR_GENERIC32:
1586 patt = f32_patt;
1587 break;
4eed87de 1588 }
ccc9c027
L
1589 }
1590 else
1591 {
fbf3f584 1592 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1593 {
1594 case PROCESSOR_UNKNOWN:
e6a14101 1595 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1596 PROCESSOR_UNKNOWN. */
1597 abort ();
1598 break;
1599
76bc74dc 1600 case PROCESSOR_I386:
ccc9c027
L
1601 case PROCESSOR_I486:
1602 case PROCESSOR_PENTIUM:
81486035 1603 case PROCESSOR_IAMCU:
ccc9c027
L
1604 case PROCESSOR_K6:
1605 case PROCESSOR_ATHLON:
1606 case PROCESSOR_K8:
4eed87de 1607 case PROCESSOR_AMDFAM10:
8aedb9fe 1608 case PROCESSOR_BD:
029f3522 1609 case PROCESSOR_ZNVER:
7b458c12 1610 case PROCESSOR_BT:
ccc9c027
L
1611 case PROCESSOR_GENERIC32:
1612 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1613 with nops. */
1614 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1615 patt = alt_patt;
ccc9c027
L
1616 else
1617 patt = f32_patt;
1618 break;
76bc74dc
L
1619 case PROCESSOR_PENTIUMPRO:
1620 case PROCESSOR_PENTIUM4:
1621 case PROCESSOR_NOCONA:
1622 case PROCESSOR_CORE:
ef05d495 1623 case PROCESSOR_CORE2:
bd5295b2 1624 case PROCESSOR_COREI7:
3632d14b 1625 case PROCESSOR_L1OM:
7a9068fe 1626 case PROCESSOR_K1OM:
22109423 1627 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1628 patt = alt_patt;
ccc9c027
L
1629 else
1630 patt = f32_patt;
1631 break;
1632 case PROCESSOR_GENERIC64:
80b8656c 1633 patt = alt_patt;
ccc9c027 1634 break;
4eed87de 1635 }
ccc9c027
L
1636 }
1637
76bc74dc
L
1638 if (patt == f32_patt)
1639 {
3ae729d5
L
1640 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1641 /* Limit number of NOPs to 2 for older processors. */
1642 max_number_of_nops = 2;
76bc74dc
L
1643 }
1644 else
1645 {
3ae729d5
L
1646 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1647 /* Limit number of NOPs to 7 for newer processors. */
1648 max_number_of_nops = 7;
1649 }
1650 }
1651
1652 if (limit == 0)
1653 limit = max_single_nop_size;
1654
1655 if (fragP->fr_type == rs_fill_nop)
1656 {
1657 /* Output NOPs for .nop directive. */
1658 if (limit > max_single_nop_size)
1659 {
1660 as_bad_where (fragP->fr_file, fragP->fr_line,
1661 _("invalid single nop size: %d "
1662 "(expect within [0, %d])"),
1663 limit, max_single_nop_size);
1664 return;
1665 }
1666 }
e379e5f3 1667 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1668 fragP->fr_var = count;
1669
1670 if ((count / max_single_nop_size) > max_number_of_nops)
1671 {
1672 /* Generate jump over NOPs. */
1673 offsetT disp = count - 2;
1674 if (fits_in_imm7 (disp))
1675 {
1676 /* Use "jmp disp8" if possible. */
1677 count = disp;
1678 where[0] = jump_disp8[0];
1679 where[1] = count;
1680 where += 2;
1681 }
1682 else
1683 {
1684 unsigned int size_of_jump;
1685
1686 if (flag_code == CODE_16BIT)
1687 {
1688 where[0] = jump16_disp32[0];
1689 where[1] = jump16_disp32[1];
1690 size_of_jump = 2;
1691 }
1692 else
1693 {
1694 where[0] = jump32_disp32[0];
1695 size_of_jump = 1;
1696 }
1697
1698 count -= size_of_jump + 4;
1699 if (!fits_in_imm31 (count))
1700 {
1701 as_bad_where (fragP->fr_file, fragP->fr_line,
1702 _("jump over nop padding out of range"));
1703 return;
1704 }
1705
1706 md_number_to_chars (where + size_of_jump, count, 4);
1707 where += size_of_jump + 4;
76bc74dc 1708 }
ccc9c027 1709 }
3ae729d5
L
1710
1711 /* Generate multiple NOPs. */
1712 i386_output_nops (where, patt, count, limit);
252b5132
RH
1713}
1714
c6fb90c8 1715static INLINE int
0dfbf9d7 1716operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1717{
0dfbf9d7 1718 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1719 {
1720 case 3:
0dfbf9d7 1721 if (x->array[2])
c6fb90c8 1722 return 0;
1a0670f3 1723 /* Fall through. */
c6fb90c8 1724 case 2:
0dfbf9d7 1725 if (x->array[1])
c6fb90c8 1726 return 0;
1a0670f3 1727 /* Fall through. */
c6fb90c8 1728 case 1:
0dfbf9d7 1729 return !x->array[0];
c6fb90c8
L
1730 default:
1731 abort ();
1732 }
40fb9820
L
1733}
1734
c6fb90c8 1735static INLINE void
0dfbf9d7 1736operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1737{
0dfbf9d7 1738 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1739 {
1740 case 3:
0dfbf9d7 1741 x->array[2] = v;
1a0670f3 1742 /* Fall through. */
c6fb90c8 1743 case 2:
0dfbf9d7 1744 x->array[1] = v;
1a0670f3 1745 /* Fall through. */
c6fb90c8 1746 case 1:
0dfbf9d7 1747 x->array[0] = v;
1a0670f3 1748 /* Fall through. */
c6fb90c8
L
1749 break;
1750 default:
1751 abort ();
1752 }
bab6aec1
JB
1753
1754 x->bitfield.class = ClassNone;
75e5731b 1755 x->bitfield.instance = InstanceNone;
c6fb90c8 1756}
40fb9820 1757
c6fb90c8 1758static INLINE int
0dfbf9d7
L
1759operand_type_equal (const union i386_operand_type *x,
1760 const union i386_operand_type *y)
c6fb90c8 1761{
0dfbf9d7 1762 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1763 {
1764 case 3:
0dfbf9d7 1765 if (x->array[2] != y->array[2])
c6fb90c8 1766 return 0;
1a0670f3 1767 /* Fall through. */
c6fb90c8 1768 case 2:
0dfbf9d7 1769 if (x->array[1] != y->array[1])
c6fb90c8 1770 return 0;
1a0670f3 1771 /* Fall through. */
c6fb90c8 1772 case 1:
0dfbf9d7 1773 return x->array[0] == y->array[0];
c6fb90c8
L
1774 break;
1775 default:
1776 abort ();
1777 }
1778}
40fb9820 1779
0dfbf9d7
L
1780static INLINE int
1781cpu_flags_all_zero (const union i386_cpu_flags *x)
1782{
1783 switch (ARRAY_SIZE(x->array))
1784 {
53467f57
IT
1785 case 4:
1786 if (x->array[3])
1787 return 0;
1788 /* Fall through. */
0dfbf9d7
L
1789 case 3:
1790 if (x->array[2])
1791 return 0;
1a0670f3 1792 /* Fall through. */
0dfbf9d7
L
1793 case 2:
1794 if (x->array[1])
1795 return 0;
1a0670f3 1796 /* Fall through. */
0dfbf9d7
L
1797 case 1:
1798 return !x->array[0];
1799 default:
1800 abort ();
1801 }
1802}
1803
0dfbf9d7
L
1804static INLINE int
1805cpu_flags_equal (const union i386_cpu_flags *x,
1806 const union i386_cpu_flags *y)
1807{
1808 switch (ARRAY_SIZE(x->array))
1809 {
53467f57
IT
1810 case 4:
1811 if (x->array[3] != y->array[3])
1812 return 0;
1813 /* Fall through. */
0dfbf9d7
L
1814 case 3:
1815 if (x->array[2] != y->array[2])
1816 return 0;
1a0670f3 1817 /* Fall through. */
0dfbf9d7
L
1818 case 2:
1819 if (x->array[1] != y->array[1])
1820 return 0;
1a0670f3 1821 /* Fall through. */
0dfbf9d7
L
1822 case 1:
1823 return x->array[0] == y->array[0];
1824 break;
1825 default:
1826 abort ();
1827 }
1828}
c6fb90c8
L
1829
1830static INLINE int
1831cpu_flags_check_cpu64 (i386_cpu_flags f)
1832{
1833 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1834 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1835}
1836
c6fb90c8
L
1837static INLINE i386_cpu_flags
1838cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1839{
c6fb90c8
L
1840 switch (ARRAY_SIZE (x.array))
1841 {
53467f57
IT
1842 case 4:
1843 x.array [3] &= y.array [3];
1844 /* Fall through. */
c6fb90c8
L
1845 case 3:
1846 x.array [2] &= y.array [2];
1a0670f3 1847 /* Fall through. */
c6fb90c8
L
1848 case 2:
1849 x.array [1] &= y.array [1];
1a0670f3 1850 /* Fall through. */
c6fb90c8
L
1851 case 1:
1852 x.array [0] &= y.array [0];
1853 break;
1854 default:
1855 abort ();
1856 }
1857 return x;
1858}
40fb9820 1859
c6fb90c8
L
1860static INLINE i386_cpu_flags
1861cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1862{
c6fb90c8 1863 switch (ARRAY_SIZE (x.array))
40fb9820 1864 {
53467f57
IT
1865 case 4:
1866 x.array [3] |= y.array [3];
1867 /* Fall through. */
c6fb90c8
L
1868 case 3:
1869 x.array [2] |= y.array [2];
1a0670f3 1870 /* Fall through. */
c6fb90c8
L
1871 case 2:
1872 x.array [1] |= y.array [1];
1a0670f3 1873 /* Fall through. */
c6fb90c8
L
1874 case 1:
1875 x.array [0] |= y.array [0];
40fb9820
L
1876 break;
1877 default:
1878 abort ();
1879 }
40fb9820
L
1880 return x;
1881}
1882
309d3373
JB
1883static INLINE i386_cpu_flags
1884cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1885{
1886 switch (ARRAY_SIZE (x.array))
1887 {
53467f57
IT
1888 case 4:
1889 x.array [3] &= ~y.array [3];
1890 /* Fall through. */
309d3373
JB
1891 case 3:
1892 x.array [2] &= ~y.array [2];
1a0670f3 1893 /* Fall through. */
309d3373
JB
1894 case 2:
1895 x.array [1] &= ~y.array [1];
1a0670f3 1896 /* Fall through. */
309d3373
JB
1897 case 1:
1898 x.array [0] &= ~y.array [0];
1899 break;
1900 default:
1901 abort ();
1902 }
1903 return x;
1904}
1905
6c0946d0
JB
1906static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1907
c0f3af97
L
1908#define CPU_FLAGS_ARCH_MATCH 0x1
1909#define CPU_FLAGS_64BIT_MATCH 0x2
1910
c0f3af97 1911#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1912 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1913
1914/* Return CPU flags match bits. */
3629bb00 1915
40fb9820 1916static int
d3ce72d0 1917cpu_flags_match (const insn_template *t)
40fb9820 1918{
c0f3af97
L
1919 i386_cpu_flags x = t->cpu_flags;
1920 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1921
1922 x.bitfield.cpu64 = 0;
1923 x.bitfield.cpuno64 = 0;
1924
0dfbf9d7 1925 if (cpu_flags_all_zero (&x))
c0f3af97
L
1926 {
1927 /* This instruction is available on all archs. */
db12e14e 1928 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1929 }
3629bb00
L
1930 else
1931 {
c0f3af97 1932 /* This instruction is available only on some archs. */
3629bb00
L
1933 i386_cpu_flags cpu = cpu_arch_flags;
1934
ab592e75
JB
1935 /* AVX512VL is no standalone feature - match it and then strip it. */
1936 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1937 return match;
1938 x.bitfield.cpuavx512vl = 0;
1939
3629bb00 1940 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1941 if (!cpu_flags_all_zero (&cpu))
1942 {
a5ff0eb2
L
1943 if (x.bitfield.cpuavx)
1944 {
929f69fa 1945 /* We need to check a few extra flags with AVX. */
b9d49817 1946 if (cpu.bitfield.cpuavx
40d231b4
JB
1947 && (!t->opcode_modifier.sse2avx
1948 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1949 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1950 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1951 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1952 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1953 }
929f69fa
JB
1954 else if (x.bitfield.cpuavx512f)
1955 {
1956 /* We need to check a few extra flags with AVX512F. */
1957 if (cpu.bitfield.cpuavx512f
1958 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1959 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1960 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1961 match |= CPU_FLAGS_ARCH_MATCH;
1962 }
a5ff0eb2 1963 else
db12e14e 1964 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1965 }
3629bb00 1966 }
c0f3af97 1967 return match;
40fb9820
L
1968}
1969
c6fb90c8
L
1970static INLINE i386_operand_type
1971operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1972{
bab6aec1
JB
1973 if (x.bitfield.class != y.bitfield.class)
1974 x.bitfield.class = ClassNone;
75e5731b
JB
1975 if (x.bitfield.instance != y.bitfield.instance)
1976 x.bitfield.instance = InstanceNone;
bab6aec1 1977
c6fb90c8
L
1978 switch (ARRAY_SIZE (x.array))
1979 {
1980 case 3:
1981 x.array [2] &= y.array [2];
1a0670f3 1982 /* Fall through. */
c6fb90c8
L
1983 case 2:
1984 x.array [1] &= y.array [1];
1a0670f3 1985 /* Fall through. */
c6fb90c8
L
1986 case 1:
1987 x.array [0] &= y.array [0];
1988 break;
1989 default:
1990 abort ();
1991 }
1992 return x;
40fb9820
L
1993}
1994
73053c1f
JB
1995static INLINE i386_operand_type
1996operand_type_and_not (i386_operand_type x, i386_operand_type y)
1997{
bab6aec1 1998 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1999 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2000
73053c1f
JB
2001 switch (ARRAY_SIZE (x.array))
2002 {
2003 case 3:
2004 x.array [2] &= ~y.array [2];
2005 /* Fall through. */
2006 case 2:
2007 x.array [1] &= ~y.array [1];
2008 /* Fall through. */
2009 case 1:
2010 x.array [0] &= ~y.array [0];
2011 break;
2012 default:
2013 abort ();
2014 }
2015 return x;
2016}
2017
c6fb90c8
L
2018static INLINE i386_operand_type
2019operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2020{
bab6aec1
JB
2021 gas_assert (x.bitfield.class == ClassNone ||
2022 y.bitfield.class == ClassNone ||
2023 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2024 gas_assert (x.bitfield.instance == InstanceNone ||
2025 y.bitfield.instance == InstanceNone ||
2026 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2027
c6fb90c8 2028 switch (ARRAY_SIZE (x.array))
40fb9820 2029 {
c6fb90c8
L
2030 case 3:
2031 x.array [2] |= y.array [2];
1a0670f3 2032 /* Fall through. */
c6fb90c8
L
2033 case 2:
2034 x.array [1] |= y.array [1];
1a0670f3 2035 /* Fall through. */
c6fb90c8
L
2036 case 1:
2037 x.array [0] |= y.array [0];
40fb9820
L
2038 break;
2039 default:
2040 abort ();
2041 }
c6fb90c8
L
2042 return x;
2043}
40fb9820 2044
c6fb90c8
L
2045static INLINE i386_operand_type
2046operand_type_xor (i386_operand_type x, i386_operand_type y)
2047{
bab6aec1 2048 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2049 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2050
c6fb90c8
L
2051 switch (ARRAY_SIZE (x.array))
2052 {
2053 case 3:
2054 x.array [2] ^= y.array [2];
1a0670f3 2055 /* Fall through. */
c6fb90c8
L
2056 case 2:
2057 x.array [1] ^= y.array [1];
1a0670f3 2058 /* Fall through. */
c6fb90c8
L
2059 case 1:
2060 x.array [0] ^= y.array [0];
2061 break;
2062 default:
2063 abort ();
2064 }
40fb9820
L
2065 return x;
2066}
2067
40fb9820
L
2068static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2069static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2070static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2071static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2072static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2073static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2074static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2075static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2076static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2077static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2078static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2079static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2080static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2081static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2082static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2083static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2084static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2085
2086enum operand_type
2087{
2088 reg,
40fb9820
L
2089 imm,
2090 disp,
2091 anymem
2092};
2093
c6fb90c8 2094static INLINE int
40fb9820
L
2095operand_type_check (i386_operand_type t, enum operand_type c)
2096{
2097 switch (c)
2098 {
2099 case reg:
bab6aec1 2100 return t.bitfield.class == Reg;
40fb9820 2101
40fb9820
L
2102 case imm:
2103 return (t.bitfield.imm8
2104 || t.bitfield.imm8s
2105 || t.bitfield.imm16
2106 || t.bitfield.imm32
2107 || t.bitfield.imm32s
2108 || t.bitfield.imm64);
2109
2110 case disp:
2111 return (t.bitfield.disp8
2112 || t.bitfield.disp16
2113 || t.bitfield.disp32
2114 || t.bitfield.disp32s
2115 || t.bitfield.disp64);
2116
2117 case anymem:
2118 return (t.bitfield.disp8
2119 || t.bitfield.disp16
2120 || t.bitfield.disp32
2121 || t.bitfield.disp32s
2122 || t.bitfield.disp64
2123 || t.bitfield.baseindex);
2124
2125 default:
2126 abort ();
2127 }
2cfe26b6
AM
2128
2129 return 0;
40fb9820
L
2130}
2131
7a54636a
L
2132/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2133 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2134
2135static INLINE int
7a54636a
L
2136match_operand_size (const insn_template *t, unsigned int wanted,
2137 unsigned int given)
5c07affc 2138{
3ac21baa
JB
2139 return !((i.types[given].bitfield.byte
2140 && !t->operand_types[wanted].bitfield.byte)
2141 || (i.types[given].bitfield.word
2142 && !t->operand_types[wanted].bitfield.word)
2143 || (i.types[given].bitfield.dword
2144 && !t->operand_types[wanted].bitfield.dword)
2145 || (i.types[given].bitfield.qword
2146 && !t->operand_types[wanted].bitfield.qword)
2147 || (i.types[given].bitfield.tbyte
2148 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2149}
2150
dd40ce22
L
2151/* Return 1 if there is no conflict in SIMD register between operand
2152 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2153
2154static INLINE int
dd40ce22
L
2155match_simd_size (const insn_template *t, unsigned int wanted,
2156 unsigned int given)
1b54b8d7 2157{
3ac21baa
JB
2158 return !((i.types[given].bitfield.xmmword
2159 && !t->operand_types[wanted].bitfield.xmmword)
2160 || (i.types[given].bitfield.ymmword
2161 && !t->operand_types[wanted].bitfield.ymmword)
2162 || (i.types[given].bitfield.zmmword
2163 && !t->operand_types[wanted].bitfield.zmmword));
1b54b8d7
JB
2164}
2165
7a54636a
L
2166/* Return 1 if there is no conflict in any size between operand GIVEN
2167 and opeand WANTED for instruction template T. */
5c07affc
L
2168
2169static INLINE int
dd40ce22
L
2170match_mem_size (const insn_template *t, unsigned int wanted,
2171 unsigned int given)
5c07affc 2172{
7a54636a 2173 return (match_operand_size (t, wanted, given)
3ac21baa 2174 && !((i.types[given].bitfield.unspecified
af508cb9 2175 && !i.broadcast
3ac21baa
JB
2176 && !t->operand_types[wanted].bitfield.unspecified)
2177 || (i.types[given].bitfield.fword
2178 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2179 /* For scalar opcode templates to allow register and memory
2180 operands at the same time, some special casing is needed
d6793fa1
JB
2181 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2182 down-conversion vpmov*. */
3528c362 2183 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2184 && t->operand_types[wanted].bitfield.byte
2185 + t->operand_types[wanted].bitfield.word
2186 + t->operand_types[wanted].bitfield.dword
2187 + t->operand_types[wanted].bitfield.qword
2188 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2189 ? (i.types[given].bitfield.xmmword
2190 || i.types[given].bitfield.ymmword
2191 || i.types[given].bitfield.zmmword)
2192 : !match_simd_size(t, wanted, given))));
5c07affc
L
2193}
2194
3ac21baa
JB
2195/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2196 operands for instruction template T, and it has MATCH_REVERSE set if there
2197 is no size conflict on any operands for the template with operands reversed
2198 (and the template allows for reversing in the first place). */
5c07affc 2199
3ac21baa
JB
2200#define MATCH_STRAIGHT 1
2201#define MATCH_REVERSE 2
2202
2203static INLINE unsigned int
d3ce72d0 2204operand_size_match (const insn_template *t)
5c07affc 2205{
3ac21baa 2206 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2207
0cfa3eb3 2208 /* Don't check non-absolute jump instructions. */
5c07affc 2209 if (t->opcode_modifier.jump
0cfa3eb3 2210 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2211 return match;
2212
2213 /* Check memory and accumulator operand size. */
2214 for (j = 0; j < i.operands; j++)
2215 {
3528c362
JB
2216 if (i.types[j].bitfield.class != Reg
2217 && i.types[j].bitfield.class != RegSIMD
601e8564 2218 && t->opcode_modifier.anysize)
5c07affc
L
2219 continue;
2220
bab6aec1 2221 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2222 && !match_operand_size (t, j, j))
5c07affc
L
2223 {
2224 match = 0;
2225 break;
2226 }
2227
3528c362 2228 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2229 && !match_simd_size (t, j, j))
1b54b8d7
JB
2230 {
2231 match = 0;
2232 break;
2233 }
2234
75e5731b 2235 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2236 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2237 {
2238 match = 0;
2239 break;
2240 }
2241
c48dadc9 2242 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2243 {
2244 match = 0;
2245 break;
2246 }
2247 }
2248
3ac21baa 2249 if (!t->opcode_modifier.d)
891edac4 2250 {
dc1e8a47 2251 mismatch:
3ac21baa
JB
2252 if (!match)
2253 i.error = operand_size_mismatch;
2254 return match;
891edac4 2255 }
5c07affc
L
2256
2257 /* Check reverse. */
f5eb1d70 2258 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2259
f5eb1d70 2260 for (j = 0; j < i.operands; j++)
5c07affc 2261 {
f5eb1d70
JB
2262 unsigned int given = i.operands - j - 1;
2263
bab6aec1 2264 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2265 && !match_operand_size (t, j, given))
891edac4 2266 goto mismatch;
5c07affc 2267
3528c362 2268 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2269 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2270 goto mismatch;
2271
75e5731b 2272 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2273 && (!match_operand_size (t, j, given)
2274 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2275 goto mismatch;
2276
f5eb1d70 2277 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2278 goto mismatch;
5c07affc
L
2279 }
2280
3ac21baa 2281 return match | MATCH_REVERSE;
5c07affc
L
2282}
2283
c6fb90c8 2284static INLINE int
40fb9820
L
2285operand_type_match (i386_operand_type overlap,
2286 i386_operand_type given)
2287{
2288 i386_operand_type temp = overlap;
2289
7d5e4556 2290 temp.bitfield.unspecified = 0;
5c07affc
L
2291 temp.bitfield.byte = 0;
2292 temp.bitfield.word = 0;
2293 temp.bitfield.dword = 0;
2294 temp.bitfield.fword = 0;
2295 temp.bitfield.qword = 0;
2296 temp.bitfield.tbyte = 0;
2297 temp.bitfield.xmmword = 0;
c0f3af97 2298 temp.bitfield.ymmword = 0;
43234a1e 2299 temp.bitfield.zmmword = 0;
0dfbf9d7 2300 if (operand_type_all_zero (&temp))
891edac4 2301 goto mismatch;
40fb9820 2302
6f2f06be 2303 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2304 return 1;
2305
dc1e8a47 2306 mismatch:
a65babc9 2307 i.error = operand_type_mismatch;
891edac4 2308 return 0;
40fb9820
L
2309}
2310
7d5e4556 2311/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2312 unless the expected operand type register overlap is null.
5de4d9ef 2313 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2314
c6fb90c8 2315static INLINE int
dc821c5f 2316operand_type_register_match (i386_operand_type g0,
40fb9820 2317 i386_operand_type t0,
40fb9820
L
2318 i386_operand_type g1,
2319 i386_operand_type t1)
2320{
bab6aec1 2321 if (g0.bitfield.class != Reg
3528c362 2322 && g0.bitfield.class != RegSIMD
10c17abd
JB
2323 && (!operand_type_check (g0, anymem)
2324 || g0.bitfield.unspecified
5de4d9ef
JB
2325 || (t0.bitfield.class != Reg
2326 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2327 return 1;
2328
bab6aec1 2329 if (g1.bitfield.class != Reg
3528c362 2330 && g1.bitfield.class != RegSIMD
10c17abd
JB
2331 && (!operand_type_check (g1, anymem)
2332 || g1.bitfield.unspecified
5de4d9ef
JB
2333 || (t1.bitfield.class != Reg
2334 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2335 return 1;
2336
dc821c5f
JB
2337 if (g0.bitfield.byte == g1.bitfield.byte
2338 && g0.bitfield.word == g1.bitfield.word
2339 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2340 && g0.bitfield.qword == g1.bitfield.qword
2341 && g0.bitfield.xmmword == g1.bitfield.xmmword
2342 && g0.bitfield.ymmword == g1.bitfield.ymmword
2343 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2344 return 1;
2345
dc821c5f
JB
2346 if (!(t0.bitfield.byte & t1.bitfield.byte)
2347 && !(t0.bitfield.word & t1.bitfield.word)
2348 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2349 && !(t0.bitfield.qword & t1.bitfield.qword)
2350 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2351 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2352 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2353 return 1;
2354
a65babc9 2355 i.error = register_type_mismatch;
891edac4
L
2356
2357 return 0;
40fb9820
L
2358}
2359
4c692bc7
JB
2360static INLINE unsigned int
2361register_number (const reg_entry *r)
2362{
2363 unsigned int nr = r->reg_num;
2364
2365 if (r->reg_flags & RegRex)
2366 nr += 8;
2367
200cbe0f
L
2368 if (r->reg_flags & RegVRex)
2369 nr += 16;
2370
4c692bc7
JB
2371 return nr;
2372}
2373
252b5132 2374static INLINE unsigned int
40fb9820 2375mode_from_disp_size (i386_operand_type t)
252b5132 2376{
b5014f7a 2377 if (t.bitfield.disp8)
40fb9820
L
2378 return 1;
2379 else if (t.bitfield.disp16
2380 || t.bitfield.disp32
2381 || t.bitfield.disp32s)
2382 return 2;
2383 else
2384 return 0;
252b5132
RH
2385}
2386
2387static INLINE int
65879393 2388fits_in_signed_byte (addressT num)
252b5132 2389{
65879393 2390 return num + 0x80 <= 0xff;
47926f60 2391}
252b5132
RH
2392
2393static INLINE int
65879393 2394fits_in_unsigned_byte (addressT num)
252b5132 2395{
65879393 2396 return num <= 0xff;
47926f60 2397}
252b5132
RH
2398
2399static INLINE int
65879393 2400fits_in_unsigned_word (addressT num)
252b5132 2401{
65879393 2402 return num <= 0xffff;
47926f60 2403}
252b5132
RH
2404
2405static INLINE int
65879393 2406fits_in_signed_word (addressT num)
252b5132 2407{
65879393 2408 return num + 0x8000 <= 0xffff;
47926f60 2409}
2a962e6d 2410
3e73aa7c 2411static INLINE int
65879393 2412fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2413{
2414#ifndef BFD64
2415 return 1;
2416#else
65879393 2417 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2418#endif
2419} /* fits_in_signed_long() */
2a962e6d 2420
3e73aa7c 2421static INLINE int
65879393 2422fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2423{
2424#ifndef BFD64
2425 return 1;
2426#else
65879393 2427 return num <= 0xffffffff;
3e73aa7c
JH
2428#endif
2429} /* fits_in_unsigned_long() */
252b5132 2430
43234a1e 2431static INLINE int
b5014f7a 2432fits_in_disp8 (offsetT num)
43234a1e
L
2433{
2434 int shift = i.memshift;
2435 unsigned int mask;
2436
2437 if (shift == -1)
2438 abort ();
2439
2440 mask = (1 << shift) - 1;
2441
2442 /* Return 0 if NUM isn't properly aligned. */
2443 if ((num & mask))
2444 return 0;
2445
2446 /* Check if NUM will fit in 8bit after shift. */
2447 return fits_in_signed_byte (num >> shift);
2448}
2449
a683cc34
SP
2450static INLINE int
2451fits_in_imm4 (offsetT num)
2452{
2453 return (num & 0xf) == num;
2454}
2455
40fb9820 2456static i386_operand_type
e3bb37b5 2457smallest_imm_type (offsetT num)
252b5132 2458{
40fb9820 2459 i386_operand_type t;
7ab9ffdd 2460
0dfbf9d7 2461 operand_type_set (&t, 0);
40fb9820
L
2462 t.bitfield.imm64 = 1;
2463
2464 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2465 {
2466 /* This code is disabled on the 486 because all the Imm1 forms
2467 in the opcode table are slower on the i486. They're the
2468 versions with the implicitly specified single-position
2469 displacement, which has another syntax if you really want to
2470 use that form. */
40fb9820
L
2471 t.bitfield.imm1 = 1;
2472 t.bitfield.imm8 = 1;
2473 t.bitfield.imm8s = 1;
2474 t.bitfield.imm16 = 1;
2475 t.bitfield.imm32 = 1;
2476 t.bitfield.imm32s = 1;
2477 }
2478 else if (fits_in_signed_byte (num))
2479 {
2480 t.bitfield.imm8 = 1;
2481 t.bitfield.imm8s = 1;
2482 t.bitfield.imm16 = 1;
2483 t.bitfield.imm32 = 1;
2484 t.bitfield.imm32s = 1;
2485 }
2486 else if (fits_in_unsigned_byte (num))
2487 {
2488 t.bitfield.imm8 = 1;
2489 t.bitfield.imm16 = 1;
2490 t.bitfield.imm32 = 1;
2491 t.bitfield.imm32s = 1;
2492 }
2493 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2494 {
2495 t.bitfield.imm16 = 1;
2496 t.bitfield.imm32 = 1;
2497 t.bitfield.imm32s = 1;
2498 }
2499 else if (fits_in_signed_long (num))
2500 {
2501 t.bitfield.imm32 = 1;
2502 t.bitfield.imm32s = 1;
2503 }
2504 else if (fits_in_unsigned_long (num))
2505 t.bitfield.imm32 = 1;
2506
2507 return t;
47926f60 2508}
252b5132 2509
847f7ad4 2510static offsetT
e3bb37b5 2511offset_in_range (offsetT val, int size)
847f7ad4 2512{
508866be 2513 addressT mask;
ba2adb93 2514
847f7ad4
AM
2515 switch (size)
2516 {
508866be
L
2517 case 1: mask = ((addressT) 1 << 8) - 1; break;
2518 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2519 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2520#ifdef BFD64
2521 case 8: mask = ((addressT) 2 << 63) - 1; break;
2522#endif
47926f60 2523 default: abort ();
847f7ad4
AM
2524 }
2525
9de868bf
L
2526#ifdef BFD64
2527 /* If BFD64, sign extend val for 32bit address mode. */
2528 if (flag_code != CODE_64BIT
2529 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2530 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2531 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2532#endif
ba2adb93 2533
47926f60 2534 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2535 {
2536 char buf1[40], buf2[40];
2537
2538 sprint_value (buf1, val);
2539 sprint_value (buf2, val & mask);
2540 as_warn (_("%s shortened to %s"), buf1, buf2);
2541 }
2542 return val & mask;
2543}
2544
c32fa91d
L
2545enum PREFIX_GROUP
2546{
2547 PREFIX_EXIST = 0,
2548 PREFIX_LOCK,
2549 PREFIX_REP,
04ef582a 2550 PREFIX_DS,
c32fa91d
L
2551 PREFIX_OTHER
2552};
2553
2554/* Returns
2555 a. PREFIX_EXIST if attempting to add a prefix where one from the
2556 same class already exists.
2557 b. PREFIX_LOCK if lock prefix is added.
2558 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2559 d. PREFIX_DS if ds prefix is added.
2560 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2561 */
2562
2563static enum PREFIX_GROUP
e3bb37b5 2564add_prefix (unsigned int prefix)
252b5132 2565{
c32fa91d 2566 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2567 unsigned int q;
252b5132 2568
29b0f896
AM
2569 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2570 && flag_code == CODE_64BIT)
b1905489 2571 {
161a04f6 2572 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2573 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2574 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2575 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2576 ret = PREFIX_EXIST;
b1905489
JB
2577 q = REX_PREFIX;
2578 }
3e73aa7c 2579 else
b1905489
JB
2580 {
2581 switch (prefix)
2582 {
2583 default:
2584 abort ();
2585
b1905489 2586 case DS_PREFIX_OPCODE:
04ef582a
L
2587 ret = PREFIX_DS;
2588 /* Fall through. */
2589 case CS_PREFIX_OPCODE:
b1905489
JB
2590 case ES_PREFIX_OPCODE:
2591 case FS_PREFIX_OPCODE:
2592 case GS_PREFIX_OPCODE:
2593 case SS_PREFIX_OPCODE:
2594 q = SEG_PREFIX;
2595 break;
2596
2597 case REPNE_PREFIX_OPCODE:
2598 case REPE_PREFIX_OPCODE:
c32fa91d
L
2599 q = REP_PREFIX;
2600 ret = PREFIX_REP;
2601 break;
2602
b1905489 2603 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2604 q = LOCK_PREFIX;
2605 ret = PREFIX_LOCK;
b1905489
JB
2606 break;
2607
2608 case FWAIT_OPCODE:
2609 q = WAIT_PREFIX;
2610 break;
2611
2612 case ADDR_PREFIX_OPCODE:
2613 q = ADDR_PREFIX;
2614 break;
2615
2616 case DATA_PREFIX_OPCODE:
2617 q = DATA_PREFIX;
2618 break;
2619 }
2620 if (i.prefix[q] != 0)
c32fa91d 2621 ret = PREFIX_EXIST;
b1905489 2622 }
252b5132 2623
b1905489 2624 if (ret)
252b5132 2625 {
b1905489
JB
2626 if (!i.prefix[q])
2627 ++i.prefixes;
2628 i.prefix[q] |= prefix;
252b5132 2629 }
b1905489
JB
2630 else
2631 as_bad (_("same type of prefix used twice"));
252b5132 2632
252b5132
RH
2633 return ret;
2634}
2635
2636static void
78f12dd3 2637update_code_flag (int value, int check)
eecb386c 2638{
78f12dd3
L
2639 PRINTF_LIKE ((*as_error));
2640
1e9cc1c2 2641 flag_code = (enum flag_code) value;
40fb9820
L
2642 if (flag_code == CODE_64BIT)
2643 {
2644 cpu_arch_flags.bitfield.cpu64 = 1;
2645 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2646 }
2647 else
2648 {
2649 cpu_arch_flags.bitfield.cpu64 = 0;
2650 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2651 }
2652 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2653 {
78f12dd3
L
2654 if (check)
2655 as_error = as_fatal;
2656 else
2657 as_error = as_bad;
2658 (*as_error) (_("64bit mode not supported on `%s'."),
2659 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2660 }
40fb9820 2661 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2662 {
78f12dd3
L
2663 if (check)
2664 as_error = as_fatal;
2665 else
2666 as_error = as_bad;
2667 (*as_error) (_("32bit mode not supported on `%s'."),
2668 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2669 }
eecb386c
AM
2670 stackop_size = '\0';
2671}
2672
78f12dd3
L
2673static void
2674set_code_flag (int value)
2675{
2676 update_code_flag (value, 0);
2677}
2678
eecb386c 2679static void
e3bb37b5 2680set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2681{
1e9cc1c2 2682 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2683 if (flag_code != CODE_16BIT)
2684 abort ();
2685 cpu_arch_flags.bitfield.cpu64 = 0;
2686 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2687 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2688}
2689
2690static void
e3bb37b5 2691set_intel_syntax (int syntax_flag)
252b5132
RH
2692{
2693 /* Find out if register prefixing is specified. */
2694 int ask_naked_reg = 0;
2695
2696 SKIP_WHITESPACE ();
29b0f896 2697 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2698 {
d02603dc
NC
2699 char *string;
2700 int e = get_symbol_name (&string);
252b5132 2701
47926f60 2702 if (strcmp (string, "prefix") == 0)
252b5132 2703 ask_naked_reg = 1;
47926f60 2704 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2705 ask_naked_reg = -1;
2706 else
d0b47220 2707 as_bad (_("bad argument to syntax directive."));
d02603dc 2708 (void) restore_line_pointer (e);
252b5132
RH
2709 }
2710 demand_empty_rest_of_line ();
c3332e24 2711
252b5132
RH
2712 intel_syntax = syntax_flag;
2713
2714 if (ask_naked_reg == 0)
f86103b7
AM
2715 allow_naked_reg = (intel_syntax
2716 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2717 else
2718 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2719
ee86248c 2720 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2721
e4a3b5a4 2722 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2723 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2724 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2725}
2726
1efbbeb4
L
2727static void
2728set_intel_mnemonic (int mnemonic_flag)
2729{
e1d4d893 2730 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2731}
2732
db51cc60
L
2733static void
2734set_allow_index_reg (int flag)
2735{
2736 allow_index_reg = flag;
2737}
2738
cb19c032 2739static void
7bab8ab5 2740set_check (int what)
cb19c032 2741{
7bab8ab5
JB
2742 enum check_kind *kind;
2743 const char *str;
2744
2745 if (what)
2746 {
2747 kind = &operand_check;
2748 str = "operand";
2749 }
2750 else
2751 {
2752 kind = &sse_check;
2753 str = "sse";
2754 }
2755
cb19c032
L
2756 SKIP_WHITESPACE ();
2757
2758 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2759 {
d02603dc
NC
2760 char *string;
2761 int e = get_symbol_name (&string);
cb19c032
L
2762
2763 if (strcmp (string, "none") == 0)
7bab8ab5 2764 *kind = check_none;
cb19c032 2765 else if (strcmp (string, "warning") == 0)
7bab8ab5 2766 *kind = check_warning;
cb19c032 2767 else if (strcmp (string, "error") == 0)
7bab8ab5 2768 *kind = check_error;
cb19c032 2769 else
7bab8ab5 2770 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2771 (void) restore_line_pointer (e);
cb19c032
L
2772 }
2773 else
7bab8ab5 2774 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2775
2776 demand_empty_rest_of_line ();
2777}
2778
8a9036a4
L
2779static void
2780check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2781 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2782{
2783#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2784 static const char *arch;
2785
2786 /* Intel LIOM is only supported on ELF. */
2787 if (!IS_ELF)
2788 return;
2789
2790 if (!arch)
2791 {
2792 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2793 use default_arch. */
2794 arch = cpu_arch_name;
2795 if (!arch)
2796 arch = default_arch;
2797 }
2798
81486035
L
2799 /* If we are targeting Intel MCU, we must enable it. */
2800 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2801 || new_flag.bitfield.cpuiamcu)
2802 return;
2803
3632d14b 2804 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2805 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2806 || new_flag.bitfield.cpul1om)
8a9036a4 2807 return;
76ba9986 2808
7a9068fe
L
2809 /* If we are targeting Intel K1OM, we must enable it. */
2810 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2811 || new_flag.bitfield.cpuk1om)
2812 return;
2813
8a9036a4
L
2814 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2815#endif
2816}
2817
e413e4e9 2818static void
e3bb37b5 2819set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2820{
47926f60 2821 SKIP_WHITESPACE ();
e413e4e9 2822
29b0f896 2823 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2824 {
d02603dc
NC
2825 char *string;
2826 int e = get_symbol_name (&string);
91d6fa6a 2827 unsigned int j;
40fb9820 2828 i386_cpu_flags flags;
e413e4e9 2829
91d6fa6a 2830 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2831 {
91d6fa6a 2832 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2833 {
91d6fa6a 2834 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2835
5c6af06e
JB
2836 if (*string != '.')
2837 {
91d6fa6a 2838 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2839 cpu_sub_arch_name = NULL;
91d6fa6a 2840 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2841 if (flag_code == CODE_64BIT)
2842 {
2843 cpu_arch_flags.bitfield.cpu64 = 1;
2844 cpu_arch_flags.bitfield.cpuno64 = 0;
2845 }
2846 else
2847 {
2848 cpu_arch_flags.bitfield.cpu64 = 0;
2849 cpu_arch_flags.bitfield.cpuno64 = 1;
2850 }
91d6fa6a
NC
2851 cpu_arch_isa = cpu_arch[j].type;
2852 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2853 if (!cpu_arch_tune_set)
2854 {
2855 cpu_arch_tune = cpu_arch_isa;
2856 cpu_arch_tune_flags = cpu_arch_isa_flags;
2857 }
5c6af06e
JB
2858 break;
2859 }
40fb9820 2860
293f5f65
L
2861 flags = cpu_flags_or (cpu_arch_flags,
2862 cpu_arch[j].flags);
81486035 2863
5b64d091 2864 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2865 {
6305a203
L
2866 if (cpu_sub_arch_name)
2867 {
2868 char *name = cpu_sub_arch_name;
2869 cpu_sub_arch_name = concat (name,
91d6fa6a 2870 cpu_arch[j].name,
1bf57e9f 2871 (const char *) NULL);
6305a203
L
2872 free (name);
2873 }
2874 else
91d6fa6a 2875 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2876 cpu_arch_flags = flags;
a586129e 2877 cpu_arch_isa_flags = flags;
5c6af06e 2878 }
0089dace
L
2879 else
2880 cpu_arch_isa_flags
2881 = cpu_flags_or (cpu_arch_isa_flags,
2882 cpu_arch[j].flags);
d02603dc 2883 (void) restore_line_pointer (e);
5c6af06e
JB
2884 demand_empty_rest_of_line ();
2885 return;
e413e4e9
AM
2886 }
2887 }
293f5f65
L
2888
2889 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2890 {
33eaf5de 2891 /* Disable an ISA extension. */
293f5f65
L
2892 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2893 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2894 {
2895 flags = cpu_flags_and_not (cpu_arch_flags,
2896 cpu_noarch[j].flags);
2897 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2898 {
2899 if (cpu_sub_arch_name)
2900 {
2901 char *name = cpu_sub_arch_name;
2902 cpu_sub_arch_name = concat (name, string,
2903 (const char *) NULL);
2904 free (name);
2905 }
2906 else
2907 cpu_sub_arch_name = xstrdup (string);
2908 cpu_arch_flags = flags;
2909 cpu_arch_isa_flags = flags;
2910 }
2911 (void) restore_line_pointer (e);
2912 demand_empty_rest_of_line ();
2913 return;
2914 }
2915
2916 j = ARRAY_SIZE (cpu_arch);
2917 }
2918
91d6fa6a 2919 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2920 as_bad (_("no such architecture: `%s'"), string);
2921
2922 *input_line_pointer = e;
2923 }
2924 else
2925 as_bad (_("missing cpu architecture"));
2926
fddf5b5b
AM
2927 no_cond_jump_promotion = 0;
2928 if (*input_line_pointer == ','
29b0f896 2929 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2930 {
d02603dc
NC
2931 char *string;
2932 char e;
2933
2934 ++input_line_pointer;
2935 e = get_symbol_name (&string);
fddf5b5b
AM
2936
2937 if (strcmp (string, "nojumps") == 0)
2938 no_cond_jump_promotion = 1;
2939 else if (strcmp (string, "jumps") == 0)
2940 ;
2941 else
2942 as_bad (_("no such architecture modifier: `%s'"), string);
2943
d02603dc 2944 (void) restore_line_pointer (e);
fddf5b5b
AM
2945 }
2946
e413e4e9
AM
2947 demand_empty_rest_of_line ();
2948}
2949
8a9036a4
L
2950enum bfd_architecture
2951i386_arch (void)
2952{
3632d14b 2953 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2954 {
2955 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2956 || flag_code != CODE_64BIT)
2957 as_fatal (_("Intel L1OM is 64bit ELF only"));
2958 return bfd_arch_l1om;
2959 }
7a9068fe
L
2960 else if (cpu_arch_isa == PROCESSOR_K1OM)
2961 {
2962 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2963 || flag_code != CODE_64BIT)
2964 as_fatal (_("Intel K1OM is 64bit ELF only"));
2965 return bfd_arch_k1om;
2966 }
81486035
L
2967 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2968 {
2969 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2970 || flag_code == CODE_64BIT)
2971 as_fatal (_("Intel MCU is 32bit ELF only"));
2972 return bfd_arch_iamcu;
2973 }
8a9036a4
L
2974 else
2975 return bfd_arch_i386;
2976}
2977
b9d79e03 2978unsigned long
7016a5d5 2979i386_mach (void)
b9d79e03 2980{
351f65ca 2981 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2982 {
3632d14b 2983 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2984 {
351f65ca
L
2985 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2986 || default_arch[6] != '\0')
8a9036a4
L
2987 as_fatal (_("Intel L1OM is 64bit ELF only"));
2988 return bfd_mach_l1om;
2989 }
7a9068fe
L
2990 else if (cpu_arch_isa == PROCESSOR_K1OM)
2991 {
2992 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2993 || default_arch[6] != '\0')
2994 as_fatal (_("Intel K1OM is 64bit ELF only"));
2995 return bfd_mach_k1om;
2996 }
351f65ca 2997 else if (default_arch[6] == '\0')
8a9036a4 2998 return bfd_mach_x86_64;
351f65ca
L
2999 else
3000 return bfd_mach_x64_32;
8a9036a4 3001 }
5197d474
L
3002 else if (!strcmp (default_arch, "i386")
3003 || !strcmp (default_arch, "iamcu"))
81486035
L
3004 {
3005 if (cpu_arch_isa == PROCESSOR_IAMCU)
3006 {
3007 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3008 as_fatal (_("Intel MCU is 32bit ELF only"));
3009 return bfd_mach_i386_iamcu;
3010 }
3011 else
3012 return bfd_mach_i386_i386;
3013 }
b9d79e03 3014 else
2b5d6a91 3015 as_fatal (_("unknown architecture"));
b9d79e03 3016}
b9d79e03 3017\f
252b5132 3018void
7016a5d5 3019md_begin (void)
252b5132
RH
3020{
3021 const char *hash_err;
3022
86fa6981
L
3023 /* Support pseudo prefixes like {disp32}. */
3024 lex_type ['{'] = LEX_BEGIN_NAME;
3025
47926f60 3026 /* Initialize op_hash hash table. */
252b5132
RH
3027 op_hash = hash_new ();
3028
3029 {
d3ce72d0 3030 const insn_template *optab;
29b0f896 3031 templates *core_optab;
252b5132 3032
47926f60
KH
3033 /* Setup for loop. */
3034 optab = i386_optab;
add39d23 3035 core_optab = XNEW (templates);
252b5132
RH
3036 core_optab->start = optab;
3037
3038 while (1)
3039 {
3040 ++optab;
3041 if (optab->name == NULL
3042 || strcmp (optab->name, (optab - 1)->name) != 0)
3043 {
3044 /* different name --> ship out current template list;
47926f60 3045 add to hash table; & begin anew. */
252b5132
RH
3046 core_optab->end = optab;
3047 hash_err = hash_insert (op_hash,
3048 (optab - 1)->name,
5a49b8ac 3049 (void *) core_optab);
252b5132
RH
3050 if (hash_err)
3051 {
b37df7c4 3052 as_fatal (_("can't hash %s: %s"),
252b5132
RH
3053 (optab - 1)->name,
3054 hash_err);
3055 }
3056 if (optab->name == NULL)
3057 break;
add39d23 3058 core_optab = XNEW (templates);
252b5132
RH
3059 core_optab->start = optab;
3060 }
3061 }
3062 }
3063
47926f60 3064 /* Initialize reg_hash hash table. */
252b5132
RH
3065 reg_hash = hash_new ();
3066 {
29b0f896 3067 const reg_entry *regtab;
c3fe08fa 3068 unsigned int regtab_size = i386_regtab_size;
252b5132 3069
c3fe08fa 3070 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 3071 {
5a49b8ac 3072 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 3073 if (hash_err)
b37df7c4 3074 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
3075 regtab->reg_name,
3076 hash_err);
252b5132
RH
3077 }
3078 }
3079
47926f60 3080 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3081 {
29b0f896
AM
3082 int c;
3083 char *p;
252b5132
RH
3084
3085 for (c = 0; c < 256; c++)
3086 {
3882b010 3087 if (ISDIGIT (c))
252b5132
RH
3088 {
3089 digit_chars[c] = c;
3090 mnemonic_chars[c] = c;
3091 register_chars[c] = c;
3092 operand_chars[c] = c;
3093 }
3882b010 3094 else if (ISLOWER (c))
252b5132
RH
3095 {
3096 mnemonic_chars[c] = c;
3097 register_chars[c] = c;
3098 operand_chars[c] = c;
3099 }
3882b010 3100 else if (ISUPPER (c))
252b5132 3101 {
3882b010 3102 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3103 register_chars[c] = mnemonic_chars[c];
3104 operand_chars[c] = c;
3105 }
43234a1e 3106 else if (c == '{' || c == '}')
86fa6981
L
3107 {
3108 mnemonic_chars[c] = c;
3109 operand_chars[c] = c;
3110 }
252b5132 3111
3882b010 3112 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3113 identifier_chars[c] = c;
3114 else if (c >= 128)
3115 {
3116 identifier_chars[c] = c;
3117 operand_chars[c] = c;
3118 }
3119 }
3120
3121#ifdef LEX_AT
3122 identifier_chars['@'] = '@';
32137342
NC
3123#endif
3124#ifdef LEX_QM
3125 identifier_chars['?'] = '?';
3126 operand_chars['?'] = '?';
252b5132 3127#endif
252b5132 3128 digit_chars['-'] = '-';
c0f3af97 3129 mnemonic_chars['_'] = '_';
791fe849 3130 mnemonic_chars['-'] = '-';
0003779b 3131 mnemonic_chars['.'] = '.';
252b5132
RH
3132 identifier_chars['_'] = '_';
3133 identifier_chars['.'] = '.';
3134
3135 for (p = operand_special_chars; *p != '\0'; p++)
3136 operand_chars[(unsigned char) *p] = *p;
3137 }
3138
a4447b93
RH
3139 if (flag_code == CODE_64BIT)
3140 {
ca19b261
KT
3141#if defined (OBJ_COFF) && defined (TE_PE)
3142 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3143 ? 32 : 16);
3144#else
a4447b93 3145 x86_dwarf2_return_column = 16;
ca19b261 3146#endif
61ff971f 3147 x86_cie_data_alignment = -8;
a4447b93
RH
3148 }
3149 else
3150 {
3151 x86_dwarf2_return_column = 8;
3152 x86_cie_data_alignment = -4;
3153 }
e379e5f3
L
3154
3155 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3156 can be turned into BRANCH_PREFIX frag. */
3157 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3158 abort ();
252b5132
RH
3159}
3160
3161void
e3bb37b5 3162i386_print_statistics (FILE *file)
252b5132
RH
3163{
3164 hash_print_statistics (file, "i386 opcode", op_hash);
3165 hash_print_statistics (file, "i386 register", reg_hash);
3166}
3167\f
252b5132
RH
3168#ifdef DEBUG386
3169
ce8a8b2f 3170/* Debugging routines for md_assemble. */
d3ce72d0 3171static void pte (insn_template *);
40fb9820 3172static void pt (i386_operand_type);
e3bb37b5
L
3173static void pe (expressionS *);
3174static void ps (symbolS *);
252b5132
RH
3175
3176static void
2c703856 3177pi (const char *line, i386_insn *x)
252b5132 3178{
09137c09 3179 unsigned int j;
252b5132
RH
3180
3181 fprintf (stdout, "%s: template ", line);
3182 pte (&x->tm);
09f131f2
JH
3183 fprintf (stdout, " address: base %s index %s scale %x\n",
3184 x->base_reg ? x->base_reg->reg_name : "none",
3185 x->index_reg ? x->index_reg->reg_name : "none",
3186 x->log2_scale_factor);
3187 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3188 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3189 fprintf (stdout, " sib: base %x index %x scale %x\n",
3190 x->sib.base, x->sib.index, x->sib.scale);
3191 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3192 (x->rex & REX_W) != 0,
3193 (x->rex & REX_R) != 0,
3194 (x->rex & REX_X) != 0,
3195 (x->rex & REX_B) != 0);
09137c09 3196 for (j = 0; j < x->operands; j++)
252b5132 3197 {
09137c09
SP
3198 fprintf (stdout, " #%d: ", j + 1);
3199 pt (x->types[j]);
252b5132 3200 fprintf (stdout, "\n");
bab6aec1 3201 if (x->types[j].bitfield.class == Reg
3528c362
JB
3202 || x->types[j].bitfield.class == RegMMX
3203 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3204 || x->types[j].bitfield.class == RegMask
00cee14f 3205 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3206 || x->types[j].bitfield.class == RegCR
3207 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3208 || x->types[j].bitfield.class == RegTR
3209 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3210 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3211 if (operand_type_check (x->types[j], imm))
3212 pe (x->op[j].imms);
3213 if (operand_type_check (x->types[j], disp))
3214 pe (x->op[j].disps);
252b5132
RH
3215 }
3216}
3217
3218static void
d3ce72d0 3219pte (insn_template *t)
252b5132 3220{
09137c09 3221 unsigned int j;
252b5132 3222 fprintf (stdout, " %d operands ", t->operands);
47926f60 3223 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3224 if (t->extension_opcode != None)
3225 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3226 if (t->opcode_modifier.d)
252b5132 3227 fprintf (stdout, "D");
40fb9820 3228 if (t->opcode_modifier.w)
252b5132
RH
3229 fprintf (stdout, "W");
3230 fprintf (stdout, "\n");
09137c09 3231 for (j = 0; j < t->operands; j++)
252b5132 3232 {
09137c09
SP
3233 fprintf (stdout, " #%d type ", j + 1);
3234 pt (t->operand_types[j]);
252b5132
RH
3235 fprintf (stdout, "\n");
3236 }
3237}
3238
3239static void
e3bb37b5 3240pe (expressionS *e)
252b5132 3241{
24eab124 3242 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3243 fprintf (stdout, " add_number %ld (%lx)\n",
3244 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3245 if (e->X_add_symbol)
3246 {
3247 fprintf (stdout, " add_symbol ");
3248 ps (e->X_add_symbol);
3249 fprintf (stdout, "\n");
3250 }
3251 if (e->X_op_symbol)
3252 {
3253 fprintf (stdout, " op_symbol ");
3254 ps (e->X_op_symbol);
3255 fprintf (stdout, "\n");
3256 }
3257}
3258
3259static void
e3bb37b5 3260ps (symbolS *s)
252b5132
RH
3261{
3262 fprintf (stdout, "%s type %s%s",
3263 S_GET_NAME (s),
3264 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3265 segment_name (S_GET_SEGMENT (s)));
3266}
3267
7b81dfbb 3268static struct type_name
252b5132 3269 {
40fb9820
L
3270 i386_operand_type mask;
3271 const char *name;
252b5132 3272 }
7b81dfbb 3273const type_names[] =
252b5132 3274{
40fb9820
L
3275 { OPERAND_TYPE_REG8, "r8" },
3276 { OPERAND_TYPE_REG16, "r16" },
3277 { OPERAND_TYPE_REG32, "r32" },
3278 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3279 { OPERAND_TYPE_ACC8, "acc8" },
3280 { OPERAND_TYPE_ACC16, "acc16" },
3281 { OPERAND_TYPE_ACC32, "acc32" },
3282 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3283 { OPERAND_TYPE_IMM8, "i8" },
3284 { OPERAND_TYPE_IMM8, "i8s" },
3285 { OPERAND_TYPE_IMM16, "i16" },
3286 { OPERAND_TYPE_IMM32, "i32" },
3287 { OPERAND_TYPE_IMM32S, "i32s" },
3288 { OPERAND_TYPE_IMM64, "i64" },
3289 { OPERAND_TYPE_IMM1, "i1" },
3290 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3291 { OPERAND_TYPE_DISP8, "d8" },
3292 { OPERAND_TYPE_DISP16, "d16" },
3293 { OPERAND_TYPE_DISP32, "d32" },
3294 { OPERAND_TYPE_DISP32S, "d32s" },
3295 { OPERAND_TYPE_DISP64, "d64" },
3296 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3297 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3298 { OPERAND_TYPE_CONTROL, "control reg" },
3299 { OPERAND_TYPE_TEST, "test reg" },
3300 { OPERAND_TYPE_DEBUG, "debug reg" },
3301 { OPERAND_TYPE_FLOATREG, "FReg" },
3302 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3303 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3304 { OPERAND_TYPE_REGMMX, "rMMX" },
3305 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3306 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3307 { OPERAND_TYPE_REGZMM, "rZMM" },
3308 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3309};
3310
3311static void
40fb9820 3312pt (i386_operand_type t)
252b5132 3313{
40fb9820 3314 unsigned int j;
c6fb90c8 3315 i386_operand_type a;
252b5132 3316
40fb9820 3317 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3318 {
3319 a = operand_type_and (t, type_names[j].mask);
2c703856 3320 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3321 fprintf (stdout, "%s, ", type_names[j].name);
3322 }
252b5132
RH
3323 fflush (stdout);
3324}
3325
3326#endif /* DEBUG386 */
3327\f
252b5132 3328static bfd_reloc_code_real_type
3956db08 3329reloc (unsigned int size,
64e74474
AM
3330 int pcrel,
3331 int sign,
3332 bfd_reloc_code_real_type other)
252b5132 3333{
47926f60 3334 if (other != NO_RELOC)
3956db08 3335 {
91d6fa6a 3336 reloc_howto_type *rel;
3956db08
JB
3337
3338 if (size == 8)
3339 switch (other)
3340 {
64e74474
AM
3341 case BFD_RELOC_X86_64_GOT32:
3342 return BFD_RELOC_X86_64_GOT64;
3343 break;
553d1284
L
3344 case BFD_RELOC_X86_64_GOTPLT64:
3345 return BFD_RELOC_X86_64_GOTPLT64;
3346 break;
64e74474
AM
3347 case BFD_RELOC_X86_64_PLTOFF64:
3348 return BFD_RELOC_X86_64_PLTOFF64;
3349 break;
3350 case BFD_RELOC_X86_64_GOTPC32:
3351 other = BFD_RELOC_X86_64_GOTPC64;
3352 break;
3353 case BFD_RELOC_X86_64_GOTPCREL:
3354 other = BFD_RELOC_X86_64_GOTPCREL64;
3355 break;
3356 case BFD_RELOC_X86_64_TPOFF32:
3357 other = BFD_RELOC_X86_64_TPOFF64;
3358 break;
3359 case BFD_RELOC_X86_64_DTPOFF32:
3360 other = BFD_RELOC_X86_64_DTPOFF64;
3361 break;
3362 default:
3363 break;
3956db08 3364 }
e05278af 3365
8ce3d284 3366#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3367 if (other == BFD_RELOC_SIZE32)
3368 {
3369 if (size == 8)
1ab668bf 3370 other = BFD_RELOC_SIZE64;
8fd4256d 3371 if (pcrel)
1ab668bf
AM
3372 {
3373 as_bad (_("there are no pc-relative size relocations"));
3374 return NO_RELOC;
3375 }
8fd4256d 3376 }
8ce3d284 3377#endif
8fd4256d 3378
e05278af 3379 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3380 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3381 sign = -1;
3382
91d6fa6a
NC
3383 rel = bfd_reloc_type_lookup (stdoutput, other);
3384 if (!rel)
3956db08 3385 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3386 else if (size != bfd_get_reloc_size (rel))
3956db08 3387 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3388 bfd_get_reloc_size (rel),
3956db08 3389 size);
91d6fa6a 3390 else if (pcrel && !rel->pc_relative)
3956db08 3391 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3392 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3393 && !sign)
91d6fa6a 3394 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3395 && sign > 0))
3956db08
JB
3396 as_bad (_("relocated field and relocation type differ in signedness"));
3397 else
3398 return other;
3399 return NO_RELOC;
3400 }
252b5132
RH
3401
3402 if (pcrel)
3403 {
3e73aa7c 3404 if (!sign)
3956db08 3405 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3406 switch (size)
3407 {
3408 case 1: return BFD_RELOC_8_PCREL;
3409 case 2: return BFD_RELOC_16_PCREL;
d258b828 3410 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3411 case 8: return BFD_RELOC_64_PCREL;
252b5132 3412 }
3956db08 3413 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3414 }
3415 else
3416 {
3956db08 3417 if (sign > 0)
e5cb08ac 3418 switch (size)
3e73aa7c
JH
3419 {
3420 case 4: return BFD_RELOC_X86_64_32S;
3421 }
3422 else
3423 switch (size)
3424 {
3425 case 1: return BFD_RELOC_8;
3426 case 2: return BFD_RELOC_16;
3427 case 4: return BFD_RELOC_32;
3428 case 8: return BFD_RELOC_64;
3429 }
3956db08
JB
3430 as_bad (_("cannot do %s %u byte relocation"),
3431 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3432 }
3433
0cc9e1d3 3434 return NO_RELOC;
252b5132
RH
3435}
3436
47926f60
KH
3437/* Here we decide which fixups can be adjusted to make them relative to
3438 the beginning of the section instead of the symbol. Basically we need
3439 to make sure that the dynamic relocations are done correctly, so in
3440 some cases we force the original symbol to be used. */
3441
252b5132 3442int
e3bb37b5 3443tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3444{
6d249963 3445#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3446 if (!IS_ELF)
31312f95
AM
3447 return 1;
3448
a161fe53
AM
3449 /* Don't adjust pc-relative references to merge sections in 64-bit
3450 mode. */
3451 if (use_rela_relocations
3452 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3453 && fixP->fx_pcrel)
252b5132 3454 return 0;
31312f95 3455
8d01d9a9
AJ
3456 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3457 and changed later by validate_fix. */
3458 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3459 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3460 return 0;
3461
8fd4256d
L
3462 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3463 for size relocations. */
3464 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3465 || fixP->fx_r_type == BFD_RELOC_SIZE64
3466 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3467 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3468 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3469 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3470 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3471 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3472 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3473 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3474 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3475 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3476 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3477 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3478 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3479 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3480 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3481 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3482 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3483 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3484 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3485 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3486 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3487 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3488 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3489 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3490 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3491 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3492 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3493 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3494 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3495 return 0;
31312f95 3496#endif
252b5132
RH
3497 return 1;
3498}
252b5132 3499
b4cac588 3500static int
e3bb37b5 3501intel_float_operand (const char *mnemonic)
252b5132 3502{
9306ca4a
JB
3503 /* Note that the value returned is meaningful only for opcodes with (memory)
3504 operands, hence the code here is free to improperly handle opcodes that
3505 have no operands (for better performance and smaller code). */
3506
3507 if (mnemonic[0] != 'f')
3508 return 0; /* non-math */
3509
3510 switch (mnemonic[1])
3511 {
3512 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3513 the fs segment override prefix not currently handled because no
3514 call path can make opcodes without operands get here */
3515 case 'i':
3516 return 2 /* integer op */;
3517 case 'l':
3518 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3519 return 3; /* fldcw/fldenv */
3520 break;
3521 case 'n':
3522 if (mnemonic[2] != 'o' /* fnop */)
3523 return 3; /* non-waiting control op */
3524 break;
3525 case 'r':
3526 if (mnemonic[2] == 's')
3527 return 3; /* frstor/frstpm */
3528 break;
3529 case 's':
3530 if (mnemonic[2] == 'a')
3531 return 3; /* fsave */
3532 if (mnemonic[2] == 't')
3533 {
3534 switch (mnemonic[3])
3535 {
3536 case 'c': /* fstcw */
3537 case 'd': /* fstdw */
3538 case 'e': /* fstenv */
3539 case 's': /* fsts[gw] */
3540 return 3;
3541 }
3542 }
3543 break;
3544 case 'x':
3545 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3546 return 0; /* fxsave/fxrstor are not really math ops */
3547 break;
3548 }
252b5132 3549
9306ca4a 3550 return 1;
252b5132
RH
3551}
3552
c0f3af97
L
3553/* Build the VEX prefix. */
3554
3555static void
d3ce72d0 3556build_vex_prefix (const insn_template *t)
c0f3af97
L
3557{
3558 unsigned int register_specifier;
3559 unsigned int implied_prefix;
3560 unsigned int vector_length;
03751133 3561 unsigned int w;
c0f3af97
L
3562
3563 /* Check register specifier. */
3564 if (i.vex.register_specifier)
43234a1e
L
3565 {
3566 register_specifier =
3567 ~register_number (i.vex.register_specifier) & 0xf;
3568 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3569 }
c0f3af97
L
3570 else
3571 register_specifier = 0xf;
3572
79f0fa25
L
3573 /* Use 2-byte VEX prefix by swapping destination and source operand
3574 if there are more than 1 register operand. */
3575 if (i.reg_operands > 1
3576 && i.vec_encoding != vex_encoding_vex3
86fa6981 3577 && i.dir_encoding == dir_encoding_default
fa99fab2 3578 && i.operands == i.reg_operands
dbbc8b7e 3579 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3580 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3581 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3582 && i.rex == REX_B)
3583 {
3584 unsigned int xchg = i.operands - 1;
3585 union i386_op temp_op;
3586 i386_operand_type temp_type;
3587
3588 temp_type = i.types[xchg];
3589 i.types[xchg] = i.types[0];
3590 i.types[0] = temp_type;
3591 temp_op = i.op[xchg];
3592 i.op[xchg] = i.op[0];
3593 i.op[0] = temp_op;
3594
9c2799c2 3595 gas_assert (i.rm.mode == 3);
fa99fab2
L
3596
3597 i.rex = REX_R;
3598 xchg = i.rm.regmem;
3599 i.rm.regmem = i.rm.reg;
3600 i.rm.reg = xchg;
3601
dbbc8b7e
JB
3602 if (i.tm.opcode_modifier.d)
3603 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3604 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3605 else /* Use the next insn. */
3606 i.tm = t[1];
fa99fab2
L
3607 }
3608
79dec6b7
JB
3609 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3610 are no memory operands and at least 3 register ones. */
3611 if (i.reg_operands >= 3
3612 && i.vec_encoding != vex_encoding_vex3
3613 && i.reg_operands == i.operands - i.imm_operands
3614 && i.tm.opcode_modifier.vex
3615 && i.tm.opcode_modifier.commutative
3616 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3617 && i.rex == REX_B
3618 && i.vex.register_specifier
3619 && !(i.vex.register_specifier->reg_flags & RegRex))
3620 {
3621 unsigned int xchg = i.operands - i.reg_operands;
3622 union i386_op temp_op;
3623 i386_operand_type temp_type;
3624
3625 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3626 gas_assert (!i.tm.opcode_modifier.sae);
3627 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3628 &i.types[i.operands - 3]));
3629 gas_assert (i.rm.mode == 3);
3630
3631 temp_type = i.types[xchg];
3632 i.types[xchg] = i.types[xchg + 1];
3633 i.types[xchg + 1] = temp_type;
3634 temp_op = i.op[xchg];
3635 i.op[xchg] = i.op[xchg + 1];
3636 i.op[xchg + 1] = temp_op;
3637
3638 i.rex = 0;
3639 xchg = i.rm.regmem | 8;
3640 i.rm.regmem = ~register_specifier & 0xf;
3641 gas_assert (!(i.rm.regmem & 8));
3642 i.vex.register_specifier += xchg - i.rm.regmem;
3643 register_specifier = ~xchg & 0xf;
3644 }
3645
539f890d
L
3646 if (i.tm.opcode_modifier.vex == VEXScalar)
3647 vector_length = avxscalar;
10c17abd
JB
3648 else if (i.tm.opcode_modifier.vex == VEX256)
3649 vector_length = 1;
539f890d 3650 else
10c17abd 3651 {
56522fc5 3652 unsigned int op;
10c17abd 3653
c7213af9
L
3654 /* Determine vector length from the last multi-length vector
3655 operand. */
10c17abd 3656 vector_length = 0;
56522fc5 3657 for (op = t->operands; op--;)
10c17abd
JB
3658 if (t->operand_types[op].bitfield.xmmword
3659 && t->operand_types[op].bitfield.ymmword
3660 && i.types[op].bitfield.ymmword)
3661 {
3662 vector_length = 1;
3663 break;
3664 }
3665 }
c0f3af97
L
3666
3667 switch ((i.tm.base_opcode >> 8) & 0xff)
3668 {
3669 case 0:
3670 implied_prefix = 0;
3671 break;
3672 case DATA_PREFIX_OPCODE:
3673 implied_prefix = 1;
3674 break;
3675 case REPE_PREFIX_OPCODE:
3676 implied_prefix = 2;
3677 break;
3678 case REPNE_PREFIX_OPCODE:
3679 implied_prefix = 3;
3680 break;
3681 default:
3682 abort ();
3683 }
3684
03751133
L
3685 /* Check the REX.W bit and VEXW. */
3686 if (i.tm.opcode_modifier.vexw == VEXWIG)
3687 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3688 else if (i.tm.opcode_modifier.vexw)
3689 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3690 else
931d03b7 3691 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3692
c0f3af97 3693 /* Use 2-byte VEX prefix if possible. */
03751133
L
3694 if (w == 0
3695 && i.vec_encoding != vex_encoding_vex3
86fa6981 3696 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3697 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3698 {
3699 /* 2-byte VEX prefix. */
3700 unsigned int r;
3701
3702 i.vex.length = 2;
3703 i.vex.bytes[0] = 0xc5;
3704
3705 /* Check the REX.R bit. */
3706 r = (i.rex & REX_R) ? 0 : 1;
3707 i.vex.bytes[1] = (r << 7
3708 | register_specifier << 3
3709 | vector_length << 2
3710 | implied_prefix);
3711 }
3712 else
3713 {
3714 /* 3-byte VEX prefix. */
03751133 3715 unsigned int m;
c0f3af97 3716
f88c9eb0 3717 i.vex.length = 3;
f88c9eb0 3718
7f399153 3719 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3720 {
7f399153
L
3721 case VEX0F:
3722 m = 0x1;
80de6e00 3723 i.vex.bytes[0] = 0xc4;
7f399153
L
3724 break;
3725 case VEX0F38:
3726 m = 0x2;
80de6e00 3727 i.vex.bytes[0] = 0xc4;
7f399153
L
3728 break;
3729 case VEX0F3A:
3730 m = 0x3;
80de6e00 3731 i.vex.bytes[0] = 0xc4;
7f399153
L
3732 break;
3733 case XOP08:
5dd85c99
SP
3734 m = 0x8;
3735 i.vex.bytes[0] = 0x8f;
7f399153
L
3736 break;
3737 case XOP09:
f88c9eb0
SP
3738 m = 0x9;
3739 i.vex.bytes[0] = 0x8f;
7f399153
L
3740 break;
3741 case XOP0A:
f88c9eb0
SP
3742 m = 0xa;
3743 i.vex.bytes[0] = 0x8f;
7f399153
L
3744 break;
3745 default:
3746 abort ();
f88c9eb0 3747 }
c0f3af97 3748
c0f3af97
L
3749 /* The high 3 bits of the second VEX byte are 1's compliment
3750 of RXB bits from REX. */
3751 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3752
c0f3af97
L
3753 i.vex.bytes[2] = (w << 7
3754 | register_specifier << 3
3755 | vector_length << 2
3756 | implied_prefix);
3757 }
3758}
3759
e771e7c9
JB
3760static INLINE bfd_boolean
3761is_evex_encoding (const insn_template *t)
3762{
7091c612 3763 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3764 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3765 || t->opcode_modifier.sae;
e771e7c9
JB
3766}
3767
7a8655d2
JB
3768static INLINE bfd_boolean
3769is_any_vex_encoding (const insn_template *t)
3770{
3771 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3772 || is_evex_encoding (t);
3773}
3774
43234a1e
L
3775/* Build the EVEX prefix. */
3776
3777static void
3778build_evex_prefix (void)
3779{
3780 unsigned int register_specifier;
3781 unsigned int implied_prefix;
3782 unsigned int m, w;
3783 rex_byte vrex_used = 0;
3784
3785 /* Check register specifier. */
3786 if (i.vex.register_specifier)
3787 {
3788 gas_assert ((i.vrex & REX_X) == 0);
3789
3790 register_specifier = i.vex.register_specifier->reg_num;
3791 if ((i.vex.register_specifier->reg_flags & RegRex))
3792 register_specifier += 8;
3793 /* The upper 16 registers are encoded in the fourth byte of the
3794 EVEX prefix. */
3795 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3796 i.vex.bytes[3] = 0x8;
3797 register_specifier = ~register_specifier & 0xf;
3798 }
3799 else
3800 {
3801 register_specifier = 0xf;
3802
3803 /* Encode upper 16 vector index register in the fourth byte of
3804 the EVEX prefix. */
3805 if (!(i.vrex & REX_X))
3806 i.vex.bytes[3] = 0x8;
3807 else
3808 vrex_used |= REX_X;
3809 }
3810
3811 switch ((i.tm.base_opcode >> 8) & 0xff)
3812 {
3813 case 0:
3814 implied_prefix = 0;
3815 break;
3816 case DATA_PREFIX_OPCODE:
3817 implied_prefix = 1;
3818 break;
3819 case REPE_PREFIX_OPCODE:
3820 implied_prefix = 2;
3821 break;
3822 case REPNE_PREFIX_OPCODE:
3823 implied_prefix = 3;
3824 break;
3825 default:
3826 abort ();
3827 }
3828
3829 /* 4 byte EVEX prefix. */
3830 i.vex.length = 4;
3831 i.vex.bytes[0] = 0x62;
3832
3833 /* mmmm bits. */
3834 switch (i.tm.opcode_modifier.vexopcode)
3835 {
3836 case VEX0F:
3837 m = 1;
3838 break;
3839 case VEX0F38:
3840 m = 2;
3841 break;
3842 case VEX0F3A:
3843 m = 3;
3844 break;
3845 default:
3846 abort ();
3847 break;
3848 }
3849
3850 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3851 bits from REX. */
3852 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3853
3854 /* The fifth bit of the second EVEX byte is 1's compliment of the
3855 REX_R bit in VREX. */
3856 if (!(i.vrex & REX_R))
3857 i.vex.bytes[1] |= 0x10;
3858 else
3859 vrex_used |= REX_R;
3860
3861 if ((i.reg_operands + i.imm_operands) == i.operands)
3862 {
3863 /* When all operands are registers, the REX_X bit in REX is not
3864 used. We reuse it to encode the upper 16 registers, which is
3865 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3866 as 1's compliment. */
3867 if ((i.vrex & REX_B))
3868 {
3869 vrex_used |= REX_B;
3870 i.vex.bytes[1] &= ~0x40;
3871 }
3872 }
3873
3874 /* EVEX instructions shouldn't need the REX prefix. */
3875 i.vrex &= ~vrex_used;
3876 gas_assert (i.vrex == 0);
3877
6865c043
L
3878 /* Check the REX.W bit and VEXW. */
3879 if (i.tm.opcode_modifier.vexw == VEXWIG)
3880 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3881 else if (i.tm.opcode_modifier.vexw)
3882 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3883 else
931d03b7 3884 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3885
3886 /* Encode the U bit. */
3887 implied_prefix |= 0x4;
3888
3889 /* The third byte of the EVEX prefix. */
3890 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3891
3892 /* The fourth byte of the EVEX prefix. */
3893 /* The zeroing-masking bit. */
3894 if (i.mask && i.mask->zeroing)
3895 i.vex.bytes[3] |= 0x80;
3896
3897 /* Don't always set the broadcast bit if there is no RC. */
3898 if (!i.rounding)
3899 {
3900 /* Encode the vector length. */
3901 unsigned int vec_length;
3902
e771e7c9
JB
3903 if (!i.tm.opcode_modifier.evex
3904 || i.tm.opcode_modifier.evex == EVEXDYN)
3905 {
56522fc5 3906 unsigned int op;
e771e7c9 3907
c7213af9
L
3908 /* Determine vector length from the last multi-length vector
3909 operand. */
56522fc5 3910 for (op = i.operands; op--;)
e771e7c9
JB
3911 if (i.tm.operand_types[op].bitfield.xmmword
3912 + i.tm.operand_types[op].bitfield.ymmword
3913 + i.tm.operand_types[op].bitfield.zmmword > 1)
3914 {
3915 if (i.types[op].bitfield.zmmword)
c7213af9
L
3916 {
3917 i.tm.opcode_modifier.evex = EVEX512;
3918 break;
3919 }
e771e7c9 3920 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3921 {
3922 i.tm.opcode_modifier.evex = EVEX256;
3923 break;
3924 }
e771e7c9 3925 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3926 {
3927 i.tm.opcode_modifier.evex = EVEX128;
3928 break;
3929 }
625cbd7a
JB
3930 else if (i.broadcast && (int) op == i.broadcast->operand)
3931 {
4a1b91ea 3932 switch (i.broadcast->bytes)
625cbd7a
JB
3933 {
3934 case 64:
3935 i.tm.opcode_modifier.evex = EVEX512;
3936 break;
3937 case 32:
3938 i.tm.opcode_modifier.evex = EVEX256;
3939 break;
3940 case 16:
3941 i.tm.opcode_modifier.evex = EVEX128;
3942 break;
3943 default:
c7213af9 3944 abort ();
625cbd7a 3945 }
c7213af9 3946 break;
625cbd7a 3947 }
e771e7c9 3948 }
c7213af9 3949
56522fc5 3950 if (op >= MAX_OPERANDS)
c7213af9 3951 abort ();
e771e7c9
JB
3952 }
3953
43234a1e
L
3954 switch (i.tm.opcode_modifier.evex)
3955 {
3956 case EVEXLIG: /* LL' is ignored */
3957 vec_length = evexlig << 5;
3958 break;
3959 case EVEX128:
3960 vec_length = 0 << 5;
3961 break;
3962 case EVEX256:
3963 vec_length = 1 << 5;
3964 break;
3965 case EVEX512:
3966 vec_length = 2 << 5;
3967 break;
3968 default:
3969 abort ();
3970 break;
3971 }
3972 i.vex.bytes[3] |= vec_length;
3973 /* Encode the broadcast bit. */
3974 if (i.broadcast)
3975 i.vex.bytes[3] |= 0x10;
3976 }
3977 else
3978 {
3979 if (i.rounding->type != saeonly)
3980 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3981 else
d3d3c6db 3982 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3983 }
3984
3985 if (i.mask && i.mask->mask)
3986 i.vex.bytes[3] |= i.mask->mask->reg_num;
3987}
3988
65da13b5
L
3989static void
3990process_immext (void)
3991{
3992 expressionS *exp;
3993
c0f3af97 3994 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3995 which is coded in the same place as an 8-bit immediate field
3996 would be. Here we fake an 8-bit immediate operand from the
3997 opcode suffix stored in tm.extension_opcode.
3998
c1e679ec 3999 AVX instructions also use this encoding, for some of
c0f3af97 4000 3 argument instructions. */
65da13b5 4001
43234a1e 4002 gas_assert (i.imm_operands <= 1
7ab9ffdd 4003 && (i.operands <= 2
7a8655d2 4004 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4005 && i.operands <= 4)));
65da13b5
L
4006
4007 exp = &im_expressions[i.imm_operands++];
4008 i.op[i.operands].imms = exp;
4009 i.types[i.operands] = imm8;
4010 i.operands++;
4011 exp->X_op = O_constant;
4012 exp->X_add_number = i.tm.extension_opcode;
4013 i.tm.extension_opcode = None;
4014}
4015
42164a71
L
4016
4017static int
4018check_hle (void)
4019{
4020 switch (i.tm.opcode_modifier.hleprefixok)
4021 {
4022 default:
4023 abort ();
82c2def5 4024 case HLEPrefixNone:
165de32a
L
4025 as_bad (_("invalid instruction `%s' after `%s'"),
4026 i.tm.name, i.hle_prefix);
42164a71 4027 return 0;
82c2def5 4028 case HLEPrefixLock:
42164a71
L
4029 if (i.prefix[LOCK_PREFIX])
4030 return 1;
165de32a 4031 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4032 return 0;
82c2def5 4033 case HLEPrefixAny:
42164a71 4034 return 1;
82c2def5 4035 case HLEPrefixRelease:
42164a71
L
4036 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4037 {
4038 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4039 i.tm.name);
4040 return 0;
4041 }
8dc0818e 4042 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4043 {
4044 as_bad (_("memory destination needed for instruction `%s'"
4045 " after `xrelease'"), i.tm.name);
4046 return 0;
4047 }
4048 return 1;
4049 }
4050}
4051
b6f8c7c4
L
4052/* Try the shortest encoding by shortening operand size. */
4053
4054static void
4055optimize_encoding (void)
4056{
a0a1771e 4057 unsigned int j;
b6f8c7c4
L
4058
4059 if (optimize_for_space
72aea328 4060 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
4061 && i.reg_operands == 1
4062 && i.imm_operands == 1
4063 && !i.types[1].bitfield.byte
4064 && i.op[0].imms->X_op == O_constant
4065 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4066 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4067 || (i.tm.base_opcode == 0xf6
4068 && i.tm.extension_opcode == 0x0)))
4069 {
4070 /* Optimize: -Os:
4071 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4072 */
4073 unsigned int base_regnum = i.op[1].regs->reg_num;
4074 if (flag_code == CODE_64BIT || base_regnum < 4)
4075 {
4076 i.types[1].bitfield.byte = 1;
4077 /* Ignore the suffix. */
4078 i.suffix = 0;
7697afb6
JB
4079 /* Convert to byte registers. */
4080 if (i.types[1].bitfield.word)
4081 j = 16;
4082 else if (i.types[1].bitfield.dword)
4083 j = 32;
4084 else
4085 j = 48;
4086 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4087 j += 8;
4088 i.op[1].regs -= j;
b6f8c7c4
L
4089 }
4090 }
4091 else if (flag_code == CODE_64BIT
72aea328 4092 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4093 && ((i.types[1].bitfield.qword
4094 && i.reg_operands == 1
b6f8c7c4
L
4095 && i.imm_operands == 1
4096 && i.op[0].imms->X_op == O_constant
507916b8 4097 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4098 && i.tm.extension_opcode == None
4099 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4100 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4101 && ((i.tm.base_opcode == 0x24
4102 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4103 || (i.tm.base_opcode == 0x80
4104 && i.tm.extension_opcode == 0x4)
4105 || ((i.tm.base_opcode == 0xf6
507916b8 4106 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4107 && i.tm.extension_opcode == 0x0)))
4108 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4109 && i.tm.base_opcode == 0x83
4110 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4111 || (i.types[0].bitfield.qword
4112 && ((i.reg_operands == 2
4113 && i.op[0].regs == i.op[1].regs
72aea328
JB
4114 && (i.tm.base_opcode == 0x30
4115 || i.tm.base_opcode == 0x28))
d3d50934
L
4116 || (i.reg_operands == 1
4117 && i.operands == 1
72aea328 4118 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4119 {
4120 /* Optimize: -O:
4121 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4122 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4123 testq $imm31, %r64 -> testl $imm31, %r32
4124 xorq %r64, %r64 -> xorl %r32, %r32
4125 subq %r64, %r64 -> subl %r32, %r32
4126 movq $imm31, %r64 -> movl $imm31, %r32
4127 movq $imm32, %r64 -> movl $imm32, %r32
4128 */
4129 i.tm.opcode_modifier.norex64 = 1;
507916b8 4130 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4131 {
4132 /* Handle
4133 movq $imm31, %r64 -> movl $imm31, %r32
4134 movq $imm32, %r64 -> movl $imm32, %r32
4135 */
4136 i.tm.operand_types[0].bitfield.imm32 = 1;
4137 i.tm.operand_types[0].bitfield.imm32s = 0;
4138 i.tm.operand_types[0].bitfield.imm64 = 0;
4139 i.types[0].bitfield.imm32 = 1;
4140 i.types[0].bitfield.imm32s = 0;
4141 i.types[0].bitfield.imm64 = 0;
4142 i.types[1].bitfield.dword = 1;
4143 i.types[1].bitfield.qword = 0;
507916b8 4144 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4145 {
4146 /* Handle
4147 movq $imm31, %r64 -> movl $imm31, %r32
4148 */
507916b8 4149 i.tm.base_opcode = 0xb8;
b6f8c7c4 4150 i.tm.extension_opcode = None;
507916b8 4151 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4152 i.tm.opcode_modifier.modrm = 0;
4153 }
4154 }
4155 }
5641ec01
JB
4156 else if (optimize > 1
4157 && !optimize_for_space
72aea328 4158 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4159 && i.reg_operands == 2
4160 && i.op[0].regs == i.op[1].regs
4161 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4162 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4163 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4164 {
4165 /* Optimize: -O2:
4166 andb %rN, %rN -> testb %rN, %rN
4167 andw %rN, %rN -> testw %rN, %rN
4168 andq %rN, %rN -> testq %rN, %rN
4169 orb %rN, %rN -> testb %rN, %rN
4170 orw %rN, %rN -> testw %rN, %rN
4171 orq %rN, %rN -> testq %rN, %rN
4172
4173 and outside of 64-bit mode
4174
4175 andl %rN, %rN -> testl %rN, %rN
4176 orl %rN, %rN -> testl %rN, %rN
4177 */
4178 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4179 }
99112332 4180 else if (i.reg_operands == 3
b6f8c7c4
L
4181 && i.op[0].regs == i.op[1].regs
4182 && !i.types[2].bitfield.xmmword
4183 && (i.tm.opcode_modifier.vex
7a69eac3 4184 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4185 && !i.rounding
e771e7c9 4186 && is_evex_encoding (&i.tm)
80c34c38 4187 && (i.vec_encoding != vex_encoding_evex
dd22218c 4188 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4189 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4190 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4191 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4192 && ((i.tm.base_opcode == 0x55
4193 || i.tm.base_opcode == 0x6655
4194 || i.tm.base_opcode == 0x66df
4195 || i.tm.base_opcode == 0x57
4196 || i.tm.base_opcode == 0x6657
8305403a
L
4197 || i.tm.base_opcode == 0x66ef
4198 || i.tm.base_opcode == 0x66f8
4199 || i.tm.base_opcode == 0x66f9
4200 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4201 || i.tm.base_opcode == 0x66fb
4202 || i.tm.base_opcode == 0x42
4203 || i.tm.base_opcode == 0x6642
4204 || i.tm.base_opcode == 0x47
4205 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4206 && i.tm.extension_opcode == None))
4207 {
99112332 4208 /* Optimize: -O1:
8305403a
L
4209 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4210 vpsubq and vpsubw:
b6f8c7c4
L
4211 EVEX VOP %zmmM, %zmmM, %zmmN
4212 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4213 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4214 EVEX VOP %ymmM, %ymmM, %ymmN
4215 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4216 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4217 VEX VOP %ymmM, %ymmM, %ymmN
4218 -> VEX VOP %xmmM, %xmmM, %xmmN
4219 VOP, one of vpandn and vpxor:
4220 VEX VOP %ymmM, %ymmM, %ymmN
4221 -> VEX VOP %xmmM, %xmmM, %xmmN
4222 VOP, one of vpandnd and vpandnq:
4223 EVEX VOP %zmmM, %zmmM, %zmmN
4224 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4225 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4226 EVEX VOP %ymmM, %ymmM, %ymmN
4227 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4228 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4229 VOP, one of vpxord and vpxorq:
4230 EVEX VOP %zmmM, %zmmM, %zmmN
4231 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4232 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4233 EVEX VOP %ymmM, %ymmM, %ymmN
4234 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4235 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4236 VOP, one of kxord and kxorq:
4237 VEX VOP %kM, %kM, %kN
4238 -> VEX kxorw %kM, %kM, %kN
4239 VOP, one of kandnd and kandnq:
4240 VEX VOP %kM, %kM, %kN
4241 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4242 */
e771e7c9 4243 if (is_evex_encoding (&i.tm))
b6f8c7c4 4244 {
7b1d7ca1 4245 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4246 {
4247 i.tm.opcode_modifier.vex = VEX128;
4248 i.tm.opcode_modifier.vexw = VEXW0;
4249 i.tm.opcode_modifier.evex = 0;
4250 }
7b1d7ca1 4251 else if (optimize > 1)
dd22218c
L
4252 i.tm.opcode_modifier.evex = EVEX128;
4253 else
4254 return;
b6f8c7c4 4255 }
f74a6307 4256 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4257 {
4258 i.tm.base_opcode &= 0xff;
4259 i.tm.opcode_modifier.vexw = VEXW0;
4260 }
b6f8c7c4
L
4261 else
4262 i.tm.opcode_modifier.vex = VEX128;
4263
4264 if (i.tm.opcode_modifier.vex)
4265 for (j = 0; j < 3; j++)
4266 {
4267 i.types[j].bitfield.xmmword = 1;
4268 i.types[j].bitfield.ymmword = 0;
4269 }
4270 }
392a5972 4271 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4272 && !i.types[0].bitfield.zmmword
392a5972 4273 && !i.types[1].bitfield.zmmword
97ed31ae 4274 && !i.mask
a0a1771e 4275 && !i.broadcast
97ed31ae 4276 && is_evex_encoding (&i.tm)
392a5972
L
4277 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4278 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4279 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4280 || (i.tm.base_opcode & ~4) == 0x66db
4281 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4282 && i.tm.extension_opcode == None)
4283 {
4284 /* Optimize: -O1:
4285 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4286 vmovdqu32 and vmovdqu64:
4287 EVEX VOP %xmmM, %xmmN
4288 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4289 EVEX VOP %ymmM, %ymmN
4290 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4291 EVEX VOP %xmmM, mem
4292 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4293 EVEX VOP %ymmM, mem
4294 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4295 EVEX VOP mem, %xmmN
4296 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4297 EVEX VOP mem, %ymmN
4298 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4299 VOP, one of vpand, vpandn, vpor, vpxor:
4300 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4301 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4302 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4303 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4304 EVEX VOP{d,q} mem, %xmmM, %xmmN
4305 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4306 EVEX VOP{d,q} mem, %ymmM, %ymmN
4307 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4308 */
a0a1771e 4309 for (j = 0; j < i.operands; j++)
392a5972
L
4310 if (operand_type_check (i.types[j], disp)
4311 && i.op[j].disps->X_op == O_constant)
4312 {
4313 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4314 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4315 bytes, we choose EVEX Disp8 over VEX Disp32. */
4316 int evex_disp8, vex_disp8;
4317 unsigned int memshift = i.memshift;
4318 offsetT n = i.op[j].disps->X_add_number;
4319
4320 evex_disp8 = fits_in_disp8 (n);
4321 i.memshift = 0;
4322 vex_disp8 = fits_in_disp8 (n);
4323 if (evex_disp8 != vex_disp8)
4324 {
4325 i.memshift = memshift;
4326 return;
4327 }
4328
4329 i.types[j].bitfield.disp8 = vex_disp8;
4330 break;
4331 }
4332 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4333 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4334 i.tm.opcode_modifier.vex
4335 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4336 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4337 /* VPAND, VPOR, and VPXOR are commutative. */
4338 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4339 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4340 i.tm.opcode_modifier.evex = 0;
4341 i.tm.opcode_modifier.masking = 0;
a0a1771e 4342 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4343 i.tm.opcode_modifier.disp8memshift = 0;
4344 i.memshift = 0;
a0a1771e
JB
4345 if (j < i.operands)
4346 i.types[j].bitfield.disp8
4347 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4348 }
b6f8c7c4
L
4349}
4350
ae531041
L
4351/* Return non-zero for load instruction. */
4352
4353static int
4354load_insn_p (void)
4355{
4356 unsigned int dest;
4357 int any_vex_p = is_any_vex_encoding (&i.tm);
4358 unsigned int base_opcode = i.tm.base_opcode | 1;
4359
4360 if (!any_vex_p)
4361 {
a09f656b 4362 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4363 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4364 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4365 if (i.tm.opcode_modifier.anysize)
ae531041
L
4366 return 0;
4367
a09f656b 4368 /* pop, popf, popa. */
4369 if (strcmp (i.tm.name, "pop") == 0
4370 || i.tm.base_opcode == 0x9d
4371 || i.tm.base_opcode == 0x61)
ae531041
L
4372 return 1;
4373
4374 /* movs, cmps, lods, scas. */
4375 if ((i.tm.base_opcode | 0xb) == 0xaf)
4376 return 1;
4377
a09f656b 4378 /* outs, xlatb. */
4379 if (base_opcode == 0x6f
4380 || i.tm.base_opcode == 0xd7)
ae531041 4381 return 1;
a09f656b 4382 /* NB: For AMD-specific insns with implicit memory operands,
4383 they're intentionally not covered. */
ae531041
L
4384 }
4385
4386 /* No memory operand. */
4387 if (!i.mem_operands)
4388 return 0;
4389
4390 if (any_vex_p)
4391 {
4392 /* vldmxcsr. */
4393 if (i.tm.base_opcode == 0xae
4394 && i.tm.opcode_modifier.vex
4395 && i.tm.opcode_modifier.vexopcode == VEX0F
4396 && i.tm.extension_opcode == 2)
4397 return 1;
4398 }
4399 else
4400 {
4401 /* test, not, neg, mul, imul, div, idiv. */
4402 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4403 && i.tm.extension_opcode != 1)
4404 return 1;
4405
4406 /* inc, dec. */
4407 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4408 return 1;
4409
4410 /* add, or, adc, sbb, and, sub, xor, cmp. */
4411 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4412 return 1;
4413
4414 /* bt, bts, btr, btc. */
4415 if (i.tm.base_opcode == 0xfba
4416 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4417 return 1;
4418
4419 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4420 if ((base_opcode == 0xc1
4421 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4422 && i.tm.extension_opcode != 6)
4423 return 1;
4424
4425 /* cmpxchg8b, cmpxchg16b, xrstors. */
4426 if (i.tm.base_opcode == 0xfc7
4427 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3))
4428 return 1;
4429
4430 /* fxrstor, ldmxcsr, xrstor. */
4431 if (i.tm.base_opcode == 0xfae
4432 && (i.tm.extension_opcode == 1
4433 || i.tm.extension_opcode == 2
4434 || i.tm.extension_opcode == 5))
4435 return 1;
4436
4437 /* lgdt, lidt, lmsw. */
4438 if (i.tm.base_opcode == 0xf01
4439 && (i.tm.extension_opcode == 2
4440 || i.tm.extension_opcode == 3
4441 || i.tm.extension_opcode == 6))
4442 return 1;
4443
4444 /* vmptrld */
4445 if (i.tm.base_opcode == 0xfc7
4446 && i.tm.extension_opcode == 6)
4447 return 1;
4448
4449 /* Check for x87 instructions. */
4450 if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf)
4451 {
4452 /* Skip fst, fstp, fstenv, fstcw. */
4453 if (i.tm.base_opcode == 0xd9
4454 && (i.tm.extension_opcode == 2
4455 || i.tm.extension_opcode == 3
4456 || i.tm.extension_opcode == 6
4457 || i.tm.extension_opcode == 7))
4458 return 0;
4459
4460 /* Skip fisttp, fist, fistp, fstp. */
4461 if (i.tm.base_opcode == 0xdb
4462 && (i.tm.extension_opcode == 1
4463 || i.tm.extension_opcode == 2
4464 || i.tm.extension_opcode == 3
4465 || i.tm.extension_opcode == 7))
4466 return 0;
4467
4468 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4469 if (i.tm.base_opcode == 0xdd
4470 && (i.tm.extension_opcode == 1
4471 || i.tm.extension_opcode == 2
4472 || i.tm.extension_opcode == 3
4473 || i.tm.extension_opcode == 6
4474 || i.tm.extension_opcode == 7))
4475 return 0;
4476
4477 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4478 if (i.tm.base_opcode == 0xdf
4479 && (i.tm.extension_opcode == 1
4480 || i.tm.extension_opcode == 2
4481 || i.tm.extension_opcode == 3
4482 || i.tm.extension_opcode == 6
4483 || i.tm.extension_opcode == 7))
4484 return 0;
4485
4486 return 1;
4487 }
4488 }
4489
4490 dest = i.operands - 1;
4491
4492 /* Check fake imm8 operand and 3 source operands. */
4493 if ((i.tm.opcode_modifier.immext
4494 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4495 && i.types[dest].bitfield.imm8)
4496 dest--;
4497
4498 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */
4499 if (!any_vex_p
4500 && (base_opcode == 0x1
4501 || base_opcode == 0x9
4502 || base_opcode == 0x11
4503 || base_opcode == 0x19
4504 || base_opcode == 0x21
4505 || base_opcode == 0x29
4506 || base_opcode == 0x31
4507 || base_opcode == 0x39
4508 || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87)
4509 || base_opcode == 0xfc1))
4510 return 1;
4511
4512 /* Check for load instruction. */
4513 return (i.types[dest].bitfield.class != ClassNone
4514 || i.types[dest].bitfield.instance == Accum);
4515}
4516
4517/* Output lfence, 0xfaee8, after instruction. */
4518
4519static void
4520insert_lfence_after (void)
4521{
4522 if (lfence_after_load && load_insn_p ())
4523 {
a09f656b 4524 /* There are also two REP string instructions that require
4525 special treatment. Specifically, the compare string (CMPS)
4526 and scan string (SCAS) instructions set EFLAGS in a manner
4527 that depends on the data being compared/scanned. When used
4528 with a REP prefix, the number of iterations may therefore
4529 vary depending on this data. If the data is a program secret
4530 chosen by the adversary using an LVI method,
4531 then this data-dependent behavior may leak some aspect
4532 of the secret. */
4533 if (((i.tm.base_opcode | 0x1) == 0xa7
4534 || (i.tm.base_opcode | 0x1) == 0xaf)
4535 && i.prefix[REP_PREFIX])
4536 {
4537 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4538 i.tm.name);
4539 }
ae531041
L
4540 char *p = frag_more (3);
4541 *p++ = 0xf;
4542 *p++ = 0xae;
4543 *p = 0xe8;
4544 }
4545}
4546
4547/* Output lfence, 0xfaee8, before instruction. */
4548
4549static void
4550insert_lfence_before (void)
4551{
4552 char *p;
4553
4554 if (is_any_vex_encoding (&i.tm))
4555 return;
4556
4557 if (i.tm.base_opcode == 0xff
4558 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4559 {
4560 /* Insert lfence before indirect branch if needed. */
4561
4562 if (lfence_before_indirect_branch == lfence_branch_none)
4563 return;
4564
4565 if (i.operands != 1)
4566 abort ();
4567
4568 if (i.reg_operands == 1)
4569 {
4570 /* Indirect branch via register. Don't insert lfence with
4571 -mlfence-after-load=yes. */
4572 if (lfence_after_load
4573 || lfence_before_indirect_branch == lfence_branch_memory)
4574 return;
4575 }
4576 else if (i.mem_operands == 1
4577 && lfence_before_indirect_branch != lfence_branch_register)
4578 {
4579 as_warn (_("indirect `%s` with memory operand should be avoided"),
4580 i.tm.name);
4581 return;
4582 }
4583 else
4584 return;
4585
4586 if (last_insn.kind != last_insn_other
4587 && last_insn.seg == now_seg)
4588 {
4589 as_warn_where (last_insn.file, last_insn.line,
4590 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4591 last_insn.name, i.tm.name);
4592 return;
4593 }
4594
4595 p = frag_more (3);
4596 *p++ = 0xf;
4597 *p++ = 0xae;
4598 *p = 0xe8;
4599 return;
4600 }
4601
503648e4 4602 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4603 if (lfence_before_ret != lfence_before_ret_none
4604 && (i.tm.base_opcode == 0xc2
503648e4 4605 || i.tm.base_opcode == 0xc3))
ae531041
L
4606 {
4607 if (last_insn.kind != last_insn_other
4608 && last_insn.seg == now_seg)
4609 {
4610 as_warn_where (last_insn.file, last_insn.line,
4611 _("`%s` skips -mlfence-before-ret on `%s`"),
4612 last_insn.name, i.tm.name);
4613 return;
4614 }
a09f656b 4615
a09f656b 4616 /* Near ret ingore operand size override under CPU64. */
503648e4 4617 char prefix = flag_code == CODE_64BIT
4618 ? 0x48
4619 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4620
4621 if (lfence_before_ret == lfence_before_ret_not)
4622 {
4623 /* not: 0xf71424, may add prefix
4624 for operand size override or 64-bit code. */
4625 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4626 if (prefix)
4627 *p++ = prefix;
ae531041
L
4628 *p++ = 0xf7;
4629 *p++ = 0x14;
4630 *p++ = 0x24;
a09f656b 4631 if (prefix)
4632 *p++ = prefix;
ae531041
L
4633 *p++ = 0xf7;
4634 *p++ = 0x14;
4635 *p++ = 0x24;
4636 }
a09f656b 4637 else
4638 {
4639 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4640 if (prefix)
4641 *p++ = prefix;
4642 if (lfence_before_ret == lfence_before_ret_or)
4643 {
4644 /* or: 0x830c2400, may add prefix
4645 for operand size override or 64-bit code. */
4646 *p++ = 0x83;
4647 *p++ = 0x0c;
4648 }
4649 else
4650 {
4651 /* shl: 0xc1242400, may add prefix
4652 for operand size override or 64-bit code. */
4653 *p++ = 0xc1;
4654 *p++ = 0x24;
4655 }
4656
4657 *p++ = 0x24;
4658 *p++ = 0x0;
4659 }
4660
ae531041
L
4661 *p++ = 0xf;
4662 *p++ = 0xae;
4663 *p = 0xe8;
4664 }
4665}
4666
252b5132
RH
4667/* This is the guts of the machine-dependent assembler. LINE points to a
4668 machine dependent instruction. This function is supposed to emit
4669 the frags/bytes it assembles to. */
4670
4671void
65da13b5 4672md_assemble (char *line)
252b5132 4673{
40fb9820 4674 unsigned int j;
83b16ac6 4675 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4676 const insn_template *t;
252b5132 4677
47926f60 4678 /* Initialize globals. */
252b5132
RH
4679 memset (&i, '\0', sizeof (i));
4680 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4681 i.reloc[j] = NO_RELOC;
252b5132
RH
4682 memset (disp_expressions, '\0', sizeof (disp_expressions));
4683 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4684 save_stack_p = save_stack;
252b5132
RH
4685
4686 /* First parse an instruction mnemonic & call i386_operand for the operands.
4687 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4688 start of a (possibly prefixed) mnemonic. */
252b5132 4689
29b0f896
AM
4690 line = parse_insn (line, mnemonic);
4691 if (line == NULL)
4692 return;
83b16ac6 4693 mnem_suffix = i.suffix;
252b5132 4694
29b0f896 4695 line = parse_operands (line, mnemonic);
ee86248c 4696 this_operand = -1;
8325cc63
JB
4697 xfree (i.memop1_string);
4698 i.memop1_string = NULL;
29b0f896
AM
4699 if (line == NULL)
4700 return;
252b5132 4701
29b0f896
AM
4702 /* Now we've parsed the mnemonic into a set of templates, and have the
4703 operands at hand. */
4704
b630c145
JB
4705 /* All Intel opcodes have reversed operands except for "bound", "enter",
4706 "monitor*", "mwait*", "tpause", and "umwait". We also don't reverse
4707 intersegment "jmp" and "call" instructions with 2 immediate operands so
4708 that the immediate segment precedes the offset, as it does when in AT&T
4709 mode. */
4d456e3d
L
4710 if (intel_syntax
4711 && i.operands > 1
29b0f896 4712 && (strcmp (mnemonic, "bound") != 0)
30123838 4713 && (strcmp (mnemonic, "invlpga") != 0)
eedb0f2c
JB
4714 && (strncmp (mnemonic, "monitor", 7) != 0)
4715 && (strncmp (mnemonic, "mwait", 5) != 0)
b630c145
JB
4716 && (strcmp (mnemonic, "tpause") != 0)
4717 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4718 && !(operand_type_check (i.types[0], imm)
4719 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4720 swap_operands ();
4721
ec56d5c0
JB
4722 /* The order of the immediates should be reversed
4723 for 2 immediates extrq and insertq instructions */
4724 if (i.imm_operands == 2
4725 && (strcmp (mnemonic, "extrq") == 0
4726 || strcmp (mnemonic, "insertq") == 0))
4727 swap_2_operands (0, 1);
4728
29b0f896
AM
4729 if (i.imm_operands)
4730 optimize_imm ();
4731
b300c311
L
4732 /* Don't optimize displacement for movabs since it only takes 64bit
4733 displacement. */
4734 if (i.disp_operands
a501d77e 4735 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4736 && (flag_code != CODE_64BIT
4737 || strcmp (mnemonic, "movabs") != 0))
4738 optimize_disp ();
29b0f896
AM
4739
4740 /* Next, we find a template that matches the given insn,
4741 making sure the overlap of the given operands types is consistent
4742 with the template operand types. */
252b5132 4743
83b16ac6 4744 if (!(t = match_template (mnem_suffix)))
29b0f896 4745 return;
252b5132 4746
7bab8ab5 4747 if (sse_check != check_none
81f8a913 4748 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4749 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4750 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4751 && (i.tm.cpu_flags.bitfield.cpusse
4752 || i.tm.cpu_flags.bitfield.cpusse2
4753 || i.tm.cpu_flags.bitfield.cpusse3
4754 || i.tm.cpu_flags.bitfield.cpussse3
4755 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4756 || i.tm.cpu_flags.bitfield.cpusse4_2
4757 || i.tm.cpu_flags.bitfield.cpupclmul
4758 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4759 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4760 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4761 {
7bab8ab5 4762 (sse_check == check_warning
daf50ae7
L
4763 ? as_warn
4764 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4765 }
4766
40fb9820 4767 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4768 if (!add_prefix (FWAIT_OPCODE))
4769 return;
252b5132 4770
d5de92cf
L
4771 /* Check if REP prefix is OK. */
4772 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4773 {
4774 as_bad (_("invalid instruction `%s' after `%s'"),
4775 i.tm.name, i.rep_prefix);
4776 return;
4777 }
4778
c1ba0266
L
4779 /* Check for lock without a lockable instruction. Destination operand
4780 must be memory unless it is xchg (0x86). */
c32fa91d
L
4781 if (i.prefix[LOCK_PREFIX]
4782 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4783 || i.mem_operands == 0
4784 || (i.tm.base_opcode != 0x86
8dc0818e 4785 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4786 {
4787 as_bad (_("expecting lockable instruction after `lock'"));
4788 return;
4789 }
4790
40d231b4
JB
4791 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4792 if (i.prefix[DATA_PREFIX]
4793 && (is_any_vex_encoding (&i.tm)
4794 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4795 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4796 {
4797 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4798 return;
4799 }
4800
42164a71 4801 /* Check if HLE prefix is OK. */
165de32a 4802 if (i.hle_prefix && !check_hle ())
42164a71
L
4803 return;
4804
7e8b059b
L
4805 /* Check BND prefix. */
4806 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4807 as_bad (_("expecting valid branch instruction after `bnd'"));
4808
04ef582a 4809 /* Check NOTRACK prefix. */
9fef80d6
L
4810 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4811 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4812
327e8c42
JB
4813 if (i.tm.cpu_flags.bitfield.cpumpx)
4814 {
4815 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4816 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4817 else if (flag_code != CODE_16BIT
4818 ? i.prefix[ADDR_PREFIX]
4819 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4820 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4821 }
7e8b059b
L
4822
4823 /* Insert BND prefix. */
76d3a78a
JB
4824 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4825 {
4826 if (!i.prefix[BND_PREFIX])
4827 add_prefix (BND_PREFIX_OPCODE);
4828 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4829 {
4830 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4831 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4832 }
4833 }
7e8b059b 4834
29b0f896 4835 /* Check string instruction segment overrides. */
51c8edf6 4836 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4837 {
51c8edf6 4838 gas_assert (i.mem_operands);
29b0f896 4839 if (!check_string ())
5dd0794d 4840 return;
fc0763e6 4841 i.disp_operands = 0;
29b0f896 4842 }
5dd0794d 4843
b6f8c7c4
L
4844 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4845 optimize_encoding ();
4846
29b0f896
AM
4847 if (!process_suffix ())
4848 return;
e413e4e9 4849
bc0844ae
L
4850 /* Update operand types. */
4851 for (j = 0; j < i.operands; j++)
4852 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4853
29b0f896
AM
4854 /* Make still unresolved immediate matches conform to size of immediate
4855 given in i.suffix. */
4856 if (!finalize_imm ())
4857 return;
252b5132 4858
40fb9820 4859 if (i.types[0].bitfield.imm1)
29b0f896 4860 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4861
9afe6eb8
L
4862 /* We only need to check those implicit registers for instructions
4863 with 3 operands or less. */
4864 if (i.operands <= 3)
4865 for (j = 0; j < i.operands; j++)
75e5731b
JB
4866 if (i.types[j].bitfield.instance != InstanceNone
4867 && !i.types[j].bitfield.xmmword)
9afe6eb8 4868 i.reg_operands--;
40fb9820 4869
c0f3af97
L
4870 /* ImmExt should be processed after SSE2AVX. */
4871 if (!i.tm.opcode_modifier.sse2avx
4872 && i.tm.opcode_modifier.immext)
65da13b5 4873 process_immext ();
252b5132 4874
29b0f896
AM
4875 /* For insns with operands there are more diddles to do to the opcode. */
4876 if (i.operands)
4877 {
4878 if (!process_operands ())
4879 return;
4880 }
40fb9820 4881 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4882 {
4883 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4884 as_warn (_("translating to `%sp'"), i.tm.name);
4885 }
252b5132 4886
7a8655d2 4887 if (is_any_vex_encoding (&i.tm))
9e5e5283 4888 {
c1dc7af5 4889 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4890 {
c1dc7af5 4891 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4892 i.tm.name);
4893 return;
4894 }
c0f3af97 4895
0b9404fd
JB
4896 /* Check for explicit REX prefix. */
4897 if (i.prefix[REX_PREFIX] || i.rex_encoding)
4898 {
4899 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
4900 return;
4901 }
4902
9e5e5283
L
4903 if (i.tm.opcode_modifier.vex)
4904 build_vex_prefix (t);
4905 else
4906 build_evex_prefix ();
0b9404fd
JB
4907
4908 /* The individual REX.RXBW bits got consumed. */
4909 i.rex &= REX_OPCODE;
9e5e5283 4910 }
43234a1e 4911
5dd85c99
SP
4912 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4913 instructions may define INT_OPCODE as well, so avoid this corner
4914 case for those instructions that use MODRM. */
4915 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4916 && !i.tm.opcode_modifier.modrm
4917 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4918 {
4919 i.tm.base_opcode = INT3_OPCODE;
4920 i.imm_operands = 0;
4921 }
252b5132 4922
0cfa3eb3
JB
4923 if ((i.tm.opcode_modifier.jump == JUMP
4924 || i.tm.opcode_modifier.jump == JUMP_BYTE
4925 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4926 && i.op[0].disps->X_op == O_constant)
4927 {
4928 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4929 the absolute address given by the constant. Since ix86 jumps and
4930 calls are pc relative, we need to generate a reloc. */
4931 i.op[0].disps->X_add_symbol = &abs_symbol;
4932 i.op[0].disps->X_op = O_symbol;
4933 }
252b5132 4934
29b0f896
AM
4935 /* For 8 bit registers we need an empty rex prefix. Also if the
4936 instruction already has a prefix, we need to convert old
4937 registers to new ones. */
773f551c 4938
bab6aec1 4939 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4940 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4941 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4942 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4943 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4944 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4945 && i.rex != 0))
4946 {
4947 int x;
726c5dcd 4948
29b0f896
AM
4949 i.rex |= REX_OPCODE;
4950 for (x = 0; x < 2; x++)
4951 {
4952 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4953 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4954 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4955 {
3f93af61 4956 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4957 /* In case it is "hi" register, give up. */
4958 if (i.op[x].regs->reg_num > 3)
a540244d 4959 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4960 "instruction requiring REX prefix."),
a540244d 4961 register_prefix, i.op[x].regs->reg_name);
773f551c 4962
29b0f896
AM
4963 /* Otherwise it is equivalent to the extended register.
4964 Since the encoding doesn't change this is merely
4965 cosmetic cleanup for debug output. */
4966
4967 i.op[x].regs = i.op[x].regs + 8;
773f551c 4968 }
29b0f896
AM
4969 }
4970 }
773f551c 4971
6b6b6807
L
4972 if (i.rex == 0 && i.rex_encoding)
4973 {
4974 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4975 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4976 the REX_OPCODE byte. */
4977 int x;
4978 for (x = 0; x < 2; x++)
bab6aec1 4979 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4980 && i.types[x].bitfield.byte
4981 && (i.op[x].regs->reg_flags & RegRex64) == 0
4982 && i.op[x].regs->reg_num > 3)
4983 {
3f93af61 4984 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4985 i.rex_encoding = FALSE;
4986 break;
4987 }
4988
4989 if (i.rex_encoding)
4990 i.rex = REX_OPCODE;
4991 }
4992
7ab9ffdd 4993 if (i.rex != 0)
29b0f896
AM
4994 add_prefix (REX_OPCODE | i.rex);
4995
ae531041
L
4996 insert_lfence_before ();
4997
29b0f896
AM
4998 /* We are ready to output the insn. */
4999 output_insn ();
e379e5f3 5000
ae531041
L
5001 insert_lfence_after ();
5002
e379e5f3
L
5003 last_insn.seg = now_seg;
5004
5005 if (i.tm.opcode_modifier.isprefix)
5006 {
5007 last_insn.kind = last_insn_prefix;
5008 last_insn.name = i.tm.name;
5009 last_insn.file = as_where (&last_insn.line);
5010 }
5011 else
5012 last_insn.kind = last_insn_other;
29b0f896
AM
5013}
5014
5015static char *
e3bb37b5 5016parse_insn (char *line, char *mnemonic)
29b0f896
AM
5017{
5018 char *l = line;
5019 char *token_start = l;
5020 char *mnem_p;
5c6af06e 5021 int supported;
d3ce72d0 5022 const insn_template *t;
b6169b20 5023 char *dot_p = NULL;
29b0f896 5024
29b0f896
AM
5025 while (1)
5026 {
5027 mnem_p = mnemonic;
5028 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5029 {
b6169b20
L
5030 if (*mnem_p == '.')
5031 dot_p = mnem_p;
29b0f896
AM
5032 mnem_p++;
5033 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5034 {
29b0f896
AM
5035 as_bad (_("no such instruction: `%s'"), token_start);
5036 return NULL;
5037 }
5038 l++;
5039 }
5040 if (!is_space_char (*l)
5041 && *l != END_OF_INSN
e44823cf
JB
5042 && (intel_syntax
5043 || (*l != PREFIX_SEPARATOR
5044 && *l != ',')))
29b0f896
AM
5045 {
5046 as_bad (_("invalid character %s in mnemonic"),
5047 output_invalid (*l));
5048 return NULL;
5049 }
5050 if (token_start == l)
5051 {
e44823cf 5052 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5053 as_bad (_("expecting prefix; got nothing"));
5054 else
5055 as_bad (_("expecting mnemonic; got nothing"));
5056 return NULL;
5057 }
45288df1 5058
29b0f896 5059 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 5060 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 5061
29b0f896
AM
5062 if (*l != END_OF_INSN
5063 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5064 && current_templates
40fb9820 5065 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5066 {
c6fb90c8 5067 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5068 {
5069 as_bad ((flag_code != CODE_64BIT
5070 ? _("`%s' is only supported in 64-bit mode")
5071 : _("`%s' is not supported in 64-bit mode")),
5072 current_templates->start->name);
5073 return NULL;
5074 }
29b0f896
AM
5075 /* If we are in 16-bit mode, do not allow addr16 or data16.
5076 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5077 if ((current_templates->start->opcode_modifier.size == SIZE16
5078 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5079 && flag_code != CODE_64BIT
673fe0f0 5080 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5081 ^ (flag_code == CODE_16BIT)))
5082 {
5083 as_bad (_("redundant %s prefix"),
5084 current_templates->start->name);
5085 return NULL;
45288df1 5086 }
86fa6981 5087 if (current_templates->start->opcode_length == 0)
29b0f896 5088 {
86fa6981
L
5089 /* Handle pseudo prefixes. */
5090 switch (current_templates->start->base_opcode)
5091 {
5092 case 0x0:
5093 /* {disp8} */
5094 i.disp_encoding = disp_encoding_8bit;
5095 break;
5096 case 0x1:
5097 /* {disp32} */
5098 i.disp_encoding = disp_encoding_32bit;
5099 break;
5100 case 0x2:
5101 /* {load} */
5102 i.dir_encoding = dir_encoding_load;
5103 break;
5104 case 0x3:
5105 /* {store} */
5106 i.dir_encoding = dir_encoding_store;
5107 break;
5108 case 0x4:
42e04b36
L
5109 /* {vex} */
5110 i.vec_encoding = vex_encoding_vex;
86fa6981
L
5111 break;
5112 case 0x5:
5113 /* {vex3} */
5114 i.vec_encoding = vex_encoding_vex3;
5115 break;
5116 case 0x6:
5117 /* {evex} */
5118 i.vec_encoding = vex_encoding_evex;
5119 break;
6b6b6807
L
5120 case 0x7:
5121 /* {rex} */
5122 i.rex_encoding = TRUE;
5123 break;
b6f8c7c4
L
5124 case 0x8:
5125 /* {nooptimize} */
5126 i.no_optimize = TRUE;
5127 break;
86fa6981
L
5128 default:
5129 abort ();
5130 }
5131 }
5132 else
5133 {
5134 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5135 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5136 {
4e9ac44a
L
5137 case PREFIX_EXIST:
5138 return NULL;
5139 case PREFIX_DS:
d777820b 5140 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5141 i.notrack_prefix = current_templates->start->name;
5142 break;
5143 case PREFIX_REP:
5144 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5145 i.hle_prefix = current_templates->start->name;
5146 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5147 i.bnd_prefix = current_templates->start->name;
5148 else
5149 i.rep_prefix = current_templates->start->name;
5150 break;
5151 default:
5152 break;
86fa6981 5153 }
29b0f896
AM
5154 }
5155 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5156 token_start = ++l;
5157 }
5158 else
5159 break;
5160 }
45288df1 5161
30a55f88 5162 if (!current_templates)
b6169b20 5163 {
07d5e953
JB
5164 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5165 Check if we should swap operand or force 32bit displacement in
f8a5c266 5166 encoding. */
30a55f88 5167 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5168 i.dir_encoding = dir_encoding_swap;
8d63c93e 5169 else if (mnem_p - 3 == dot_p
a501d77e
L
5170 && dot_p[1] == 'd'
5171 && dot_p[2] == '8')
5172 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5173 else if (mnem_p - 4 == dot_p
f8a5c266
L
5174 && dot_p[1] == 'd'
5175 && dot_p[2] == '3'
5176 && dot_p[3] == '2')
a501d77e 5177 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5178 else
5179 goto check_suffix;
5180 mnem_p = dot_p;
5181 *dot_p = '\0';
d3ce72d0 5182 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
5183 }
5184
29b0f896
AM
5185 if (!current_templates)
5186 {
dc1e8a47 5187 check_suffix:
1c529385 5188 if (mnem_p > mnemonic)
29b0f896 5189 {
1c529385
LH
5190 /* See if we can get a match by trimming off a suffix. */
5191 switch (mnem_p[-1])
29b0f896 5192 {
1c529385
LH
5193 case WORD_MNEM_SUFFIX:
5194 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5195 i.suffix = SHORT_MNEM_SUFFIX;
5196 else
1c529385
LH
5197 /* Fall through. */
5198 case BYTE_MNEM_SUFFIX:
5199 case QWORD_MNEM_SUFFIX:
5200 i.suffix = mnem_p[-1];
29b0f896 5201 mnem_p[-1] = '\0';
d3ce72d0 5202 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
5203 mnemonic);
5204 break;
5205 case SHORT_MNEM_SUFFIX:
5206 case LONG_MNEM_SUFFIX:
5207 if (!intel_syntax)
5208 {
5209 i.suffix = mnem_p[-1];
5210 mnem_p[-1] = '\0';
5211 current_templates = (const templates *) hash_find (op_hash,
5212 mnemonic);
5213 }
5214 break;
5215
5216 /* Intel Syntax. */
5217 case 'd':
5218 if (intel_syntax)
5219 {
5220 if (intel_float_operand (mnemonic) == 1)
5221 i.suffix = SHORT_MNEM_SUFFIX;
5222 else
5223 i.suffix = LONG_MNEM_SUFFIX;
5224 mnem_p[-1] = '\0';
5225 current_templates = (const templates *) hash_find (op_hash,
5226 mnemonic);
5227 }
5228 break;
29b0f896 5229 }
29b0f896 5230 }
1c529385 5231
29b0f896
AM
5232 if (!current_templates)
5233 {
5234 as_bad (_("no such instruction: `%s'"), token_start);
5235 return NULL;
5236 }
5237 }
252b5132 5238
0cfa3eb3
JB
5239 if (current_templates->start->opcode_modifier.jump == JUMP
5240 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5241 {
5242 /* Check for a branch hint. We allow ",pt" and ",pn" for
5243 predict taken and predict not taken respectively.
5244 I'm not sure that branch hints actually do anything on loop
5245 and jcxz insns (JumpByte) for current Pentium4 chips. They
5246 may work in the future and it doesn't hurt to accept them
5247 now. */
5248 if (l[0] == ',' && l[1] == 'p')
5249 {
5250 if (l[2] == 't')
5251 {
5252 if (!add_prefix (DS_PREFIX_OPCODE))
5253 return NULL;
5254 l += 3;
5255 }
5256 else if (l[2] == 'n')
5257 {
5258 if (!add_prefix (CS_PREFIX_OPCODE))
5259 return NULL;
5260 l += 3;
5261 }
5262 }
5263 }
5264 /* Any other comma loses. */
5265 if (*l == ',')
5266 {
5267 as_bad (_("invalid character %s in mnemonic"),
5268 output_invalid (*l));
5269 return NULL;
5270 }
252b5132 5271
29b0f896 5272 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5273 supported = 0;
5274 for (t = current_templates->start; t < current_templates->end; ++t)
5275 {
c0f3af97
L
5276 supported |= cpu_flags_match (t);
5277 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5278 {
5279 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5280 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5281
548d0ee6
JB
5282 return l;
5283 }
29b0f896 5284 }
3629bb00 5285
548d0ee6
JB
5286 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5287 as_bad (flag_code == CODE_64BIT
5288 ? _("`%s' is not supported in 64-bit mode")
5289 : _("`%s' is only supported in 64-bit mode"),
5290 current_templates->start->name);
5291 else
5292 as_bad (_("`%s' is not supported on `%s%s'"),
5293 current_templates->start->name,
5294 cpu_arch_name ? cpu_arch_name : default_arch,
5295 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5296
548d0ee6 5297 return NULL;
29b0f896 5298}
252b5132 5299
29b0f896 5300static char *
e3bb37b5 5301parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5302{
5303 char *token_start;
3138f287 5304
29b0f896
AM
5305 /* 1 if operand is pending after ','. */
5306 unsigned int expecting_operand = 0;
252b5132 5307
29b0f896
AM
5308 /* Non-zero if operand parens not balanced. */
5309 unsigned int paren_not_balanced;
5310
5311 while (*l != END_OF_INSN)
5312 {
5313 /* Skip optional white space before operand. */
5314 if (is_space_char (*l))
5315 ++l;
d02603dc 5316 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5317 {
5318 as_bad (_("invalid character %s before operand %d"),
5319 output_invalid (*l),
5320 i.operands + 1);
5321 return NULL;
5322 }
d02603dc 5323 token_start = l; /* After white space. */
29b0f896
AM
5324 paren_not_balanced = 0;
5325 while (paren_not_balanced || *l != ',')
5326 {
5327 if (*l == END_OF_INSN)
5328 {
5329 if (paren_not_balanced)
5330 {
5331 if (!intel_syntax)
5332 as_bad (_("unbalanced parenthesis in operand %d."),
5333 i.operands + 1);
5334 else
5335 as_bad (_("unbalanced brackets in operand %d."),
5336 i.operands + 1);
5337 return NULL;
5338 }
5339 else
5340 break; /* we are done */
5341 }
d02603dc 5342 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5343 {
5344 as_bad (_("invalid character %s in operand %d"),
5345 output_invalid (*l),
5346 i.operands + 1);
5347 return NULL;
5348 }
5349 if (!intel_syntax)
5350 {
5351 if (*l == '(')
5352 ++paren_not_balanced;
5353 if (*l == ')')
5354 --paren_not_balanced;
5355 }
5356 else
5357 {
5358 if (*l == '[')
5359 ++paren_not_balanced;
5360 if (*l == ']')
5361 --paren_not_balanced;
5362 }
5363 l++;
5364 }
5365 if (l != token_start)
5366 { /* Yes, we've read in another operand. */
5367 unsigned int operand_ok;
5368 this_operand = i.operands++;
5369 if (i.operands > MAX_OPERANDS)
5370 {
5371 as_bad (_("spurious operands; (%d operands/instruction max)"),
5372 MAX_OPERANDS);
5373 return NULL;
5374 }
9d46ce34 5375 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5376 /* Now parse operand adding info to 'i' as we go along. */
5377 END_STRING_AND_SAVE (l);
5378
1286ab78
L
5379 if (i.mem_operands > 1)
5380 {
5381 as_bad (_("too many memory references for `%s'"),
5382 mnemonic);
5383 return 0;
5384 }
5385
29b0f896
AM
5386 if (intel_syntax)
5387 operand_ok =
5388 i386_intel_operand (token_start,
5389 intel_float_operand (mnemonic));
5390 else
a7619375 5391 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5392
5393 RESTORE_END_STRING (l);
5394 if (!operand_ok)
5395 return NULL;
5396 }
5397 else
5398 {
5399 if (expecting_operand)
5400 {
5401 expecting_operand_after_comma:
5402 as_bad (_("expecting operand after ','; got nothing"));
5403 return NULL;
5404 }
5405 if (*l == ',')
5406 {
5407 as_bad (_("expecting operand before ','; got nothing"));
5408 return NULL;
5409 }
5410 }
7f3f1ea2 5411
29b0f896
AM
5412 /* Now *l must be either ',' or END_OF_INSN. */
5413 if (*l == ',')
5414 {
5415 if (*++l == END_OF_INSN)
5416 {
5417 /* Just skip it, if it's \n complain. */
5418 goto expecting_operand_after_comma;
5419 }
5420 expecting_operand = 1;
5421 }
5422 }
5423 return l;
5424}
7f3f1ea2 5425
050dfa73 5426static void
4d456e3d 5427swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5428{
5429 union i386_op temp_op;
40fb9820 5430 i386_operand_type temp_type;
c48dadc9 5431 unsigned int temp_flags;
050dfa73 5432 enum bfd_reloc_code_real temp_reloc;
4eed87de 5433
050dfa73
MM
5434 temp_type = i.types[xchg2];
5435 i.types[xchg2] = i.types[xchg1];
5436 i.types[xchg1] = temp_type;
c48dadc9
JB
5437
5438 temp_flags = i.flags[xchg2];
5439 i.flags[xchg2] = i.flags[xchg1];
5440 i.flags[xchg1] = temp_flags;
5441
050dfa73
MM
5442 temp_op = i.op[xchg2];
5443 i.op[xchg2] = i.op[xchg1];
5444 i.op[xchg1] = temp_op;
c48dadc9 5445
050dfa73
MM
5446 temp_reloc = i.reloc[xchg2];
5447 i.reloc[xchg2] = i.reloc[xchg1];
5448 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5449
5450 if (i.mask)
5451 {
5452 if (i.mask->operand == xchg1)
5453 i.mask->operand = xchg2;
5454 else if (i.mask->operand == xchg2)
5455 i.mask->operand = xchg1;
5456 }
5457 if (i.broadcast)
5458 {
5459 if (i.broadcast->operand == xchg1)
5460 i.broadcast->operand = xchg2;
5461 else if (i.broadcast->operand == xchg2)
5462 i.broadcast->operand = xchg1;
5463 }
5464 if (i.rounding)
5465 {
5466 if (i.rounding->operand == xchg1)
5467 i.rounding->operand = xchg2;
5468 else if (i.rounding->operand == xchg2)
5469 i.rounding->operand = xchg1;
5470 }
050dfa73
MM
5471}
5472
29b0f896 5473static void
e3bb37b5 5474swap_operands (void)
29b0f896 5475{
b7c61d9a 5476 switch (i.operands)
050dfa73 5477 {
c0f3af97 5478 case 5:
b7c61d9a 5479 case 4:
4d456e3d 5480 swap_2_operands (1, i.operands - 2);
1a0670f3 5481 /* Fall through. */
b7c61d9a
L
5482 case 3:
5483 case 2:
4d456e3d 5484 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5485 break;
5486 default:
5487 abort ();
29b0f896 5488 }
29b0f896
AM
5489
5490 if (i.mem_operands == 2)
5491 {
5492 const seg_entry *temp_seg;
5493 temp_seg = i.seg[0];
5494 i.seg[0] = i.seg[1];
5495 i.seg[1] = temp_seg;
5496 }
5497}
252b5132 5498
29b0f896
AM
5499/* Try to ensure constant immediates are represented in the smallest
5500 opcode possible. */
5501static void
e3bb37b5 5502optimize_imm (void)
29b0f896
AM
5503{
5504 char guess_suffix = 0;
5505 int op;
252b5132 5506
29b0f896
AM
5507 if (i.suffix)
5508 guess_suffix = i.suffix;
5509 else if (i.reg_operands)
5510 {
5511 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5512 We can't do this properly yet, i.e. excluding special register
5513 instances, but the following works for instructions with
5514 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5515 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5516 if (i.types[op].bitfield.class != Reg)
5517 continue;
5518 else if (i.types[op].bitfield.byte)
7ab9ffdd 5519 {
40fb9820
L
5520 guess_suffix = BYTE_MNEM_SUFFIX;
5521 break;
5522 }
bab6aec1 5523 else if (i.types[op].bitfield.word)
252b5132 5524 {
40fb9820
L
5525 guess_suffix = WORD_MNEM_SUFFIX;
5526 break;
5527 }
bab6aec1 5528 else if (i.types[op].bitfield.dword)
40fb9820
L
5529 {
5530 guess_suffix = LONG_MNEM_SUFFIX;
5531 break;
5532 }
bab6aec1 5533 else if (i.types[op].bitfield.qword)
40fb9820
L
5534 {
5535 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5536 break;
252b5132 5537 }
29b0f896
AM
5538 }
5539 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5540 guess_suffix = WORD_MNEM_SUFFIX;
5541
5542 for (op = i.operands; --op >= 0;)
40fb9820 5543 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5544 {
5545 switch (i.op[op].imms->X_op)
252b5132 5546 {
29b0f896
AM
5547 case O_constant:
5548 /* If a suffix is given, this operand may be shortened. */
5549 switch (guess_suffix)
252b5132 5550 {
29b0f896 5551 case LONG_MNEM_SUFFIX:
40fb9820
L
5552 i.types[op].bitfield.imm32 = 1;
5553 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5554 break;
5555 case WORD_MNEM_SUFFIX:
40fb9820
L
5556 i.types[op].bitfield.imm16 = 1;
5557 i.types[op].bitfield.imm32 = 1;
5558 i.types[op].bitfield.imm32s = 1;
5559 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5560 break;
5561 case BYTE_MNEM_SUFFIX:
40fb9820
L
5562 i.types[op].bitfield.imm8 = 1;
5563 i.types[op].bitfield.imm8s = 1;
5564 i.types[op].bitfield.imm16 = 1;
5565 i.types[op].bitfield.imm32 = 1;
5566 i.types[op].bitfield.imm32s = 1;
5567 i.types[op].bitfield.imm64 = 1;
29b0f896 5568 break;
252b5132 5569 }
252b5132 5570
29b0f896
AM
5571 /* If this operand is at most 16 bits, convert it
5572 to a signed 16 bit number before trying to see
5573 whether it will fit in an even smaller size.
5574 This allows a 16-bit operand such as $0xffe0 to
5575 be recognised as within Imm8S range. */
40fb9820 5576 if ((i.types[op].bitfield.imm16)
29b0f896 5577 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5578 {
29b0f896
AM
5579 i.op[op].imms->X_add_number =
5580 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5581 }
a28def75
L
5582#ifdef BFD64
5583 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5584 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5585 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5586 == 0))
5587 {
5588 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5589 ^ ((offsetT) 1 << 31))
5590 - ((offsetT) 1 << 31));
5591 }
a28def75 5592#endif
40fb9820 5593 i.types[op]
c6fb90c8
L
5594 = operand_type_or (i.types[op],
5595 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5596
29b0f896
AM
5597 /* We must avoid matching of Imm32 templates when 64bit
5598 only immediate is available. */
5599 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5600 i.types[op].bitfield.imm32 = 0;
29b0f896 5601 break;
252b5132 5602
29b0f896
AM
5603 case O_absent:
5604 case O_register:
5605 abort ();
5606
5607 /* Symbols and expressions. */
5608 default:
9cd96992
JB
5609 /* Convert symbolic operand to proper sizes for matching, but don't
5610 prevent matching a set of insns that only supports sizes other
5611 than those matching the insn suffix. */
5612 {
40fb9820 5613 i386_operand_type mask, allowed;
d3ce72d0 5614 const insn_template *t;
9cd96992 5615
0dfbf9d7
L
5616 operand_type_set (&mask, 0);
5617 operand_type_set (&allowed, 0);
40fb9820 5618
4eed87de
AM
5619 for (t = current_templates->start;
5620 t < current_templates->end;
5621 ++t)
bab6aec1
JB
5622 {
5623 allowed = operand_type_or (allowed, t->operand_types[op]);
5624 allowed = operand_type_and (allowed, anyimm);
5625 }
9cd96992
JB
5626 switch (guess_suffix)
5627 {
5628 case QWORD_MNEM_SUFFIX:
40fb9820
L
5629 mask.bitfield.imm64 = 1;
5630 mask.bitfield.imm32s = 1;
9cd96992
JB
5631 break;
5632 case LONG_MNEM_SUFFIX:
40fb9820 5633 mask.bitfield.imm32 = 1;
9cd96992
JB
5634 break;
5635 case WORD_MNEM_SUFFIX:
40fb9820 5636 mask.bitfield.imm16 = 1;
9cd96992
JB
5637 break;
5638 case BYTE_MNEM_SUFFIX:
40fb9820 5639 mask.bitfield.imm8 = 1;
9cd96992
JB
5640 break;
5641 default:
9cd96992
JB
5642 break;
5643 }
c6fb90c8 5644 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5645 if (!operand_type_all_zero (&allowed))
c6fb90c8 5646 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5647 }
29b0f896 5648 break;
252b5132 5649 }
29b0f896
AM
5650 }
5651}
47926f60 5652
29b0f896
AM
5653/* Try to use the smallest displacement type too. */
5654static void
e3bb37b5 5655optimize_disp (void)
29b0f896
AM
5656{
5657 int op;
3e73aa7c 5658
29b0f896 5659 for (op = i.operands; --op >= 0;)
40fb9820 5660 if (operand_type_check (i.types[op], disp))
252b5132 5661 {
b300c311 5662 if (i.op[op].disps->X_op == O_constant)
252b5132 5663 {
91d6fa6a 5664 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5665
40fb9820 5666 if (i.types[op].bitfield.disp16
91d6fa6a 5667 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5668 {
5669 /* If this operand is at most 16 bits, convert
5670 to a signed 16 bit number and don't use 64bit
5671 displacement. */
91d6fa6a 5672 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5673 i.types[op].bitfield.disp64 = 0;
b300c311 5674 }
a28def75
L
5675#ifdef BFD64
5676 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5677 if (i.types[op].bitfield.disp32
91d6fa6a 5678 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5679 {
5680 /* If this operand is at most 32 bits, convert
5681 to a signed 32 bit number and don't use 64bit
5682 displacement. */
91d6fa6a
NC
5683 op_disp &= (((offsetT) 2 << 31) - 1);
5684 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5685 i.types[op].bitfield.disp64 = 0;
b300c311 5686 }
a28def75 5687#endif
91d6fa6a 5688 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5689 {
40fb9820
L
5690 i.types[op].bitfield.disp8 = 0;
5691 i.types[op].bitfield.disp16 = 0;
5692 i.types[op].bitfield.disp32 = 0;
5693 i.types[op].bitfield.disp32s = 0;
5694 i.types[op].bitfield.disp64 = 0;
b300c311
L
5695 i.op[op].disps = 0;
5696 i.disp_operands--;
5697 }
5698 else if (flag_code == CODE_64BIT)
5699 {
91d6fa6a 5700 if (fits_in_signed_long (op_disp))
28a9d8f5 5701 {
40fb9820
L
5702 i.types[op].bitfield.disp64 = 0;
5703 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5704 }
0e1147d9 5705 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5706 && fits_in_unsigned_long (op_disp))
40fb9820 5707 i.types[op].bitfield.disp32 = 1;
b300c311 5708 }
40fb9820
L
5709 if ((i.types[op].bitfield.disp32
5710 || i.types[op].bitfield.disp32s
5711 || i.types[op].bitfield.disp16)
b5014f7a 5712 && fits_in_disp8 (op_disp))
40fb9820 5713 i.types[op].bitfield.disp8 = 1;
252b5132 5714 }
67a4f2b7
AO
5715 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5716 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5717 {
5718 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5719 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5720 i.types[op].bitfield.disp8 = 0;
5721 i.types[op].bitfield.disp16 = 0;
5722 i.types[op].bitfield.disp32 = 0;
5723 i.types[op].bitfield.disp32s = 0;
5724 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5725 }
5726 else
b300c311 5727 /* We only support 64bit displacement on constants. */
40fb9820 5728 i.types[op].bitfield.disp64 = 0;
252b5132 5729 }
29b0f896
AM
5730}
5731
4a1b91ea
L
5732/* Return 1 if there is a match in broadcast bytes between operand
5733 GIVEN and instruction template T. */
5734
5735static INLINE int
5736match_broadcast_size (const insn_template *t, unsigned int given)
5737{
5738 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5739 && i.types[given].bitfield.byte)
5740 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5741 && i.types[given].bitfield.word)
5742 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5743 && i.types[given].bitfield.dword)
5744 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5745 && i.types[given].bitfield.qword));
5746}
5747
6c30d220
L
5748/* Check if operands are valid for the instruction. */
5749
5750static int
5751check_VecOperands (const insn_template *t)
5752{
43234a1e 5753 unsigned int op;
e2195274 5754 i386_cpu_flags cpu;
e2195274
JB
5755
5756 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5757 any one operand are implicity requiring AVX512VL support if the actual
5758 operand size is YMMword or XMMword. Since this function runs after
5759 template matching, there's no need to check for YMMword/XMMword in
5760 the template. */
5761 cpu = cpu_flags_and (t->cpu_flags, avx512);
5762 if (!cpu_flags_all_zero (&cpu)
5763 && !t->cpu_flags.bitfield.cpuavx512vl
5764 && !cpu_arch_flags.bitfield.cpuavx512vl)
5765 {
5766 for (op = 0; op < t->operands; ++op)
5767 {
5768 if (t->operand_types[op].bitfield.zmmword
5769 && (i.types[op].bitfield.ymmword
5770 || i.types[op].bitfield.xmmword))
5771 {
5772 i.error = unsupported;
5773 return 1;
5774 }
5775 }
5776 }
43234a1e 5777
6c30d220
L
5778 /* Without VSIB byte, we can't have a vector register for index. */
5779 if (!t->opcode_modifier.vecsib
5780 && i.index_reg
1b54b8d7
JB
5781 && (i.index_reg->reg_type.bitfield.xmmword
5782 || i.index_reg->reg_type.bitfield.ymmword
5783 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5784 {
5785 i.error = unsupported_vector_index_register;
5786 return 1;
5787 }
5788
ad8ecc81
MZ
5789 /* Check if default mask is allowed. */
5790 if (t->opcode_modifier.nodefmask
5791 && (!i.mask || i.mask->mask->reg_num == 0))
5792 {
5793 i.error = no_default_mask;
5794 return 1;
5795 }
5796
7bab8ab5
JB
5797 /* For VSIB byte, we need a vector register for index, and all vector
5798 registers must be distinct. */
5799 if (t->opcode_modifier.vecsib)
5800 {
5801 if (!i.index_reg
6c30d220 5802 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5803 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5804 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5805 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5806 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5807 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5808 {
5809 i.error = invalid_vsib_address;
5810 return 1;
5811 }
5812
43234a1e
L
5813 gas_assert (i.reg_operands == 2 || i.mask);
5814 if (i.reg_operands == 2 && !i.mask)
5815 {
3528c362 5816 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5817 gas_assert (i.types[0].bitfield.xmmword
5818 || i.types[0].bitfield.ymmword);
3528c362 5819 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5820 gas_assert (i.types[2].bitfield.xmmword
5821 || i.types[2].bitfield.ymmword);
43234a1e
L
5822 if (operand_check == check_none)
5823 return 0;
5824 if (register_number (i.op[0].regs)
5825 != register_number (i.index_reg)
5826 && register_number (i.op[2].regs)
5827 != register_number (i.index_reg)
5828 && register_number (i.op[0].regs)
5829 != register_number (i.op[2].regs))
5830 return 0;
5831 if (operand_check == check_error)
5832 {
5833 i.error = invalid_vector_register_set;
5834 return 1;
5835 }
5836 as_warn (_("mask, index, and destination registers should be distinct"));
5837 }
8444f82a
MZ
5838 else if (i.reg_operands == 1 && i.mask)
5839 {
3528c362 5840 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5841 && (i.types[1].bitfield.xmmword
5842 || i.types[1].bitfield.ymmword
5843 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5844 && (register_number (i.op[1].regs)
5845 == register_number (i.index_reg)))
5846 {
5847 if (operand_check == check_error)
5848 {
5849 i.error = invalid_vector_register_set;
5850 return 1;
5851 }
5852 if (operand_check != check_none)
5853 as_warn (_("index and destination registers should be distinct"));
5854 }
5855 }
43234a1e 5856 }
7bab8ab5 5857
43234a1e
L
5858 /* Check if broadcast is supported by the instruction and is applied
5859 to the memory operand. */
5860 if (i.broadcast)
5861 {
8e6e0792 5862 i386_operand_type type, overlap;
43234a1e
L
5863
5864 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5865 and its broadcast bytes match the memory operand. */
32546502 5866 op = i.broadcast->operand;
8e6e0792 5867 if (!t->opcode_modifier.broadcast
c48dadc9 5868 || !(i.flags[op] & Operand_Mem)
c39e5b26 5869 || (!i.types[op].bitfield.unspecified
4a1b91ea 5870 && !match_broadcast_size (t, op)))
43234a1e
L
5871 {
5872 bad_broadcast:
5873 i.error = unsupported_broadcast;
5874 return 1;
5875 }
8e6e0792 5876
4a1b91ea
L
5877 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5878 * i.broadcast->type);
8e6e0792 5879 operand_type_set (&type, 0);
4a1b91ea 5880 switch (i.broadcast->bytes)
8e6e0792 5881 {
4a1b91ea
L
5882 case 2:
5883 type.bitfield.word = 1;
5884 break;
5885 case 4:
5886 type.bitfield.dword = 1;
5887 break;
8e6e0792
JB
5888 case 8:
5889 type.bitfield.qword = 1;
5890 break;
5891 case 16:
5892 type.bitfield.xmmword = 1;
5893 break;
5894 case 32:
5895 type.bitfield.ymmword = 1;
5896 break;
5897 case 64:
5898 type.bitfield.zmmword = 1;
5899 break;
5900 default:
5901 goto bad_broadcast;
5902 }
5903
5904 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5905 if (t->operand_types[op].bitfield.class == RegSIMD
5906 && t->operand_types[op].bitfield.byte
5907 + t->operand_types[op].bitfield.word
5908 + t->operand_types[op].bitfield.dword
5909 + t->operand_types[op].bitfield.qword > 1)
5910 {
5911 overlap.bitfield.xmmword = 0;
5912 overlap.bitfield.ymmword = 0;
5913 overlap.bitfield.zmmword = 0;
5914 }
8e6e0792
JB
5915 if (operand_type_all_zero (&overlap))
5916 goto bad_broadcast;
5917
5918 if (t->opcode_modifier.checkregsize)
5919 {
5920 unsigned int j;
5921
e2195274 5922 type.bitfield.baseindex = 1;
8e6e0792
JB
5923 for (j = 0; j < i.operands; ++j)
5924 {
5925 if (j != op
5926 && !operand_type_register_match(i.types[j],
5927 t->operand_types[j],
5928 type,
5929 t->operand_types[op]))
5930 goto bad_broadcast;
5931 }
5932 }
43234a1e
L
5933 }
5934 /* If broadcast is supported in this instruction, we need to check if
5935 operand of one-element size isn't specified without broadcast. */
5936 else if (t->opcode_modifier.broadcast && i.mem_operands)
5937 {
5938 /* Find memory operand. */
5939 for (op = 0; op < i.operands; op++)
8dc0818e 5940 if (i.flags[op] & Operand_Mem)
43234a1e
L
5941 break;
5942 gas_assert (op < i.operands);
5943 /* Check size of the memory operand. */
4a1b91ea 5944 if (match_broadcast_size (t, op))
43234a1e
L
5945 {
5946 i.error = broadcast_needed;
5947 return 1;
5948 }
5949 }
c39e5b26
JB
5950 else
5951 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5952
5953 /* Check if requested masking is supported. */
ae2387fe 5954 if (i.mask)
43234a1e 5955 {
ae2387fe
JB
5956 switch (t->opcode_modifier.masking)
5957 {
5958 case BOTH_MASKING:
5959 break;
5960 case MERGING_MASKING:
5961 if (i.mask->zeroing)
5962 {
5963 case 0:
5964 i.error = unsupported_masking;
5965 return 1;
5966 }
5967 break;
5968 case DYNAMIC_MASKING:
5969 /* Memory destinations allow only merging masking. */
5970 if (i.mask->zeroing && i.mem_operands)
5971 {
5972 /* Find memory operand. */
5973 for (op = 0; op < i.operands; op++)
c48dadc9 5974 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5975 break;
5976 gas_assert (op < i.operands);
5977 if (op == i.operands - 1)
5978 {
5979 i.error = unsupported_masking;
5980 return 1;
5981 }
5982 }
5983 break;
5984 default:
5985 abort ();
5986 }
43234a1e
L
5987 }
5988
5989 /* Check if masking is applied to dest operand. */
5990 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5991 {
5992 i.error = mask_not_on_destination;
5993 return 1;
5994 }
5995
43234a1e
L
5996 /* Check RC/SAE. */
5997 if (i.rounding)
5998 {
a80195f1
JB
5999 if (!t->opcode_modifier.sae
6000 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6001 {
6002 i.error = unsupported_rc_sae;
6003 return 1;
6004 }
6005 /* If the instruction has several immediate operands and one of
6006 them is rounding, the rounding operand should be the last
6007 immediate operand. */
6008 if (i.imm_operands > 1
6009 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 6010 {
43234a1e 6011 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6012 return 1;
6013 }
6c30d220
L
6014 }
6015
da4977e0
JB
6016 /* Check the special Imm4 cases; must be the first operand. */
6017 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6018 {
6019 if (i.op[0].imms->X_op != O_constant
6020 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6021 {
6022 i.error = bad_imm4;
6023 return 1;
6024 }
6025
6026 /* Turn off Imm<N> so that update_imm won't complain. */
6027 operand_type_set (&i.types[0], 0);
6028 }
6029
43234a1e 6030 /* Check vector Disp8 operand. */
b5014f7a
JB
6031 if (t->opcode_modifier.disp8memshift
6032 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6033 {
6034 if (i.broadcast)
4a1b91ea 6035 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6036 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6037 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6038 else
6039 {
6040 const i386_operand_type *type = NULL;
6041
6042 i.memshift = 0;
6043 for (op = 0; op < i.operands; op++)
8dc0818e 6044 if (i.flags[op] & Operand_Mem)
7091c612 6045 {
4174bfff
JB
6046 if (t->opcode_modifier.evex == EVEXLIG)
6047 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6048 else if (t->operand_types[op].bitfield.xmmword
6049 + t->operand_types[op].bitfield.ymmword
6050 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6051 type = &t->operand_types[op];
6052 else if (!i.types[op].bitfield.unspecified)
6053 type = &i.types[op];
6054 }
3528c362 6055 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6056 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6057 {
6058 if (i.types[op].bitfield.zmmword)
6059 i.memshift = 6;
6060 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6061 i.memshift = 5;
6062 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6063 i.memshift = 4;
6064 }
6065
6066 if (type)
6067 {
6068 if (type->bitfield.zmmword)
6069 i.memshift = 6;
6070 else if (type->bitfield.ymmword)
6071 i.memshift = 5;
6072 else if (type->bitfield.xmmword)
6073 i.memshift = 4;
6074 }
6075
6076 /* For the check in fits_in_disp8(). */
6077 if (i.memshift == 0)
6078 i.memshift = -1;
6079 }
43234a1e
L
6080
6081 for (op = 0; op < i.operands; op++)
6082 if (operand_type_check (i.types[op], disp)
6083 && i.op[op].disps->X_op == O_constant)
6084 {
b5014f7a 6085 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6086 {
b5014f7a
JB
6087 i.types[op].bitfield.disp8 = 1;
6088 return 0;
43234a1e 6089 }
b5014f7a 6090 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6091 }
6092 }
b5014f7a
JB
6093
6094 i.memshift = 0;
43234a1e 6095
6c30d220
L
6096 return 0;
6097}
6098
da4977e0 6099/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6100
6101static int
da4977e0 6102VEX_check_encoding (const insn_template *t)
a683cc34 6103{
da4977e0
JB
6104 if (i.vec_encoding == vex_encoding_error)
6105 {
6106 i.error = unsupported;
6107 return 1;
6108 }
6109
86fa6981 6110 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6111 {
86fa6981 6112 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6113 if (!is_evex_encoding (t))
86fa6981
L
6114 {
6115 i.error = unsupported;
6116 return 1;
6117 }
6118 return 0;
43234a1e
L
6119 }
6120
a683cc34 6121 if (!t->opcode_modifier.vex)
86fa6981
L
6122 {
6123 /* This instruction template doesn't have VEX prefix. */
6124 if (i.vec_encoding != vex_encoding_default)
6125 {
6126 i.error = unsupported;
6127 return 1;
6128 }
6129 return 0;
6130 }
a683cc34 6131
a683cc34
SP
6132 return 0;
6133}
6134
d3ce72d0 6135static const insn_template *
83b16ac6 6136match_template (char mnem_suffix)
29b0f896
AM
6137{
6138 /* Points to template once we've found it. */
d3ce72d0 6139 const insn_template *t;
40fb9820 6140 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6141 i386_operand_type overlap4;
29b0f896 6142 unsigned int found_reverse_match;
dc2be329 6143 i386_opcode_modifier suffix_check;
40fb9820 6144 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6145 int addr_prefix_disp;
45a4bb20 6146 unsigned int j, size_match, check_register;
5614d22c 6147 enum i386_error specific_error = 0;
29b0f896 6148
c0f3af97
L
6149#if MAX_OPERANDS != 5
6150# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6151#endif
6152
29b0f896 6153 found_reverse_match = 0;
539e75ad 6154 addr_prefix_disp = -1;
40fb9820 6155
dc2be329 6156 /* Prepare for mnemonic suffix check. */
40fb9820 6157 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6158 switch (mnem_suffix)
6159 {
6160 case BYTE_MNEM_SUFFIX:
6161 suffix_check.no_bsuf = 1;
6162 break;
6163 case WORD_MNEM_SUFFIX:
6164 suffix_check.no_wsuf = 1;
6165 break;
6166 case SHORT_MNEM_SUFFIX:
6167 suffix_check.no_ssuf = 1;
6168 break;
6169 case LONG_MNEM_SUFFIX:
6170 suffix_check.no_lsuf = 1;
6171 break;
6172 case QWORD_MNEM_SUFFIX:
6173 suffix_check.no_qsuf = 1;
6174 break;
6175 default:
6176 /* NB: In Intel syntax, normally we can check for memory operand
6177 size when there is no mnemonic suffix. But jmp and call have
6178 2 different encodings with Dword memory operand size, one with
6179 No_ldSuf and the other without. i.suffix is set to
6180 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6181 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6182 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6183 }
6184
01559ecc
L
6185 /* Must have right number of operands. */
6186 i.error = number_of_operands_mismatch;
6187
45aa61fe 6188 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6189 {
539e75ad 6190 addr_prefix_disp = -1;
dbbc8b7e 6191 found_reverse_match = 0;
539e75ad 6192
29b0f896
AM
6193 if (i.operands != t->operands)
6194 continue;
6195
50aecf8c 6196 /* Check processor support. */
a65babc9 6197 i.error = unsupported;
45a4bb20 6198 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6199 continue;
6200
e1d4d893 6201 /* Check AT&T mnemonic. */
a65babc9 6202 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6203 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6204 continue;
6205
4b5aaf5f 6206 /* Check AT&T/Intel syntax. */
a65babc9 6207 i.error = unsupported_syntax;
5c07affc 6208 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6209 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6210 continue;
6211
4b5aaf5f
L
6212 /* Check Intel64/AMD64 ISA. */
6213 switch (isa64)
6214 {
6215 default:
6216 /* Default: Don't accept Intel64. */
6217 if (t->opcode_modifier.isa64 == INTEL64)
6218 continue;
6219 break;
6220 case amd64:
6221 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6222 if (t->opcode_modifier.isa64 >= INTEL64)
6223 continue;
6224 break;
6225 case intel64:
6226 /* -mintel64: Don't accept AMD64. */
5990e377 6227 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6228 continue;
6229 break;
6230 }
6231
dc2be329 6232 /* Check the suffix. */
a65babc9 6233 i.error = invalid_instruction_suffix;
dc2be329
L
6234 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6235 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6236 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6237 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6238 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6239 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6240 continue;
29b0f896 6241
3ac21baa
JB
6242 size_match = operand_size_match (t);
6243 if (!size_match)
7d5e4556 6244 continue;
539e75ad 6245
6f2f06be
JB
6246 /* This is intentionally not
6247
0cfa3eb3 6248 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6249
6250 as the case of a missing * on the operand is accepted (perhaps with
6251 a warning, issued further down). */
0cfa3eb3 6252 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6253 {
6254 i.error = operand_type_mismatch;
6255 continue;
6256 }
6257
5c07affc
L
6258 for (j = 0; j < MAX_OPERANDS; j++)
6259 operand_types[j] = t->operand_types[j];
6260
e365e234
JB
6261 /* In general, don't allow
6262 - 64-bit operands outside of 64-bit mode,
6263 - 32-bit operands on pre-386. */
4873e243 6264 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6265 if (((i.suffix == QWORD_MNEM_SUFFIX
6266 && flag_code != CODE_64BIT
6267 && (t->base_opcode != 0x0fc7
6268 || t->extension_opcode != 1 /* cmpxchg8b */))
6269 || (i.suffix == LONG_MNEM_SUFFIX
6270 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6271 && (intel_syntax
3cd7f3e3 6272 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6273 && !intel_float_operand (t->name))
6274 : intel_float_operand (t->name) != 2)
4873e243
JB
6275 && (t->operands == i.imm_operands
6276 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6277 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6278 && operand_types[i.imm_operands].bitfield.class != RegMask)
6279 || (operand_types[j].bitfield.class != RegMMX
6280 && operand_types[j].bitfield.class != RegSIMD
6281 && operand_types[j].bitfield.class != RegMask))
6282 && !t->opcode_modifier.vecsib)
192dc9c6
JB
6283 continue;
6284
29b0f896 6285 /* Do not verify operands when there are none. */
e365e234 6286 if (!t->operands)
da4977e0
JB
6287 {
6288 if (VEX_check_encoding (t))
6289 {
6290 specific_error = i.error;
6291 continue;
6292 }
6293
6294 /* We've found a match; break out of loop. */
6295 break;
6296 }
252b5132 6297
48bcea9f
JB
6298 if (!t->opcode_modifier.jump
6299 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6300 {
6301 /* There should be only one Disp operand. */
6302 for (j = 0; j < MAX_OPERANDS; j++)
6303 if (operand_type_check (operand_types[j], disp))
539e75ad 6304 break;
48bcea9f
JB
6305 if (j < MAX_OPERANDS)
6306 {
6307 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6308
6309 addr_prefix_disp = j;
6310
6311 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6312 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6313 switch (flag_code)
40fb9820 6314 {
48bcea9f
JB
6315 case CODE_16BIT:
6316 override = !override;
6317 /* Fall through. */
6318 case CODE_32BIT:
6319 if (operand_types[j].bitfield.disp32
6320 && operand_types[j].bitfield.disp16)
40fb9820 6321 {
48bcea9f
JB
6322 operand_types[j].bitfield.disp16 = override;
6323 operand_types[j].bitfield.disp32 = !override;
40fb9820 6324 }
48bcea9f
JB
6325 operand_types[j].bitfield.disp32s = 0;
6326 operand_types[j].bitfield.disp64 = 0;
6327 break;
6328
6329 case CODE_64BIT:
6330 if (operand_types[j].bitfield.disp32s
6331 || operand_types[j].bitfield.disp64)
40fb9820 6332 {
48bcea9f
JB
6333 operand_types[j].bitfield.disp64 &= !override;
6334 operand_types[j].bitfield.disp32s &= !override;
6335 operand_types[j].bitfield.disp32 = override;
40fb9820 6336 }
48bcea9f
JB
6337 operand_types[j].bitfield.disp16 = 0;
6338 break;
40fb9820 6339 }
539e75ad 6340 }
48bcea9f 6341 }
539e75ad 6342
02a86693
L
6343 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6344 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6345 continue;
6346
56ffb741 6347 /* We check register size if needed. */
e2195274
JB
6348 if (t->opcode_modifier.checkregsize)
6349 {
6350 check_register = (1 << t->operands) - 1;
6351 if (i.broadcast)
6352 check_register &= ~(1 << i.broadcast->operand);
6353 }
6354 else
6355 check_register = 0;
6356
c6fb90c8 6357 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6358 switch (t->operands)
6359 {
6360 case 1:
40fb9820 6361 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6362 continue;
6363 break;
6364 case 2:
33eaf5de 6365 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6366 only in 32bit mode and we can use opcode 0x90. In 64bit
6367 mode, we can't use 0x90 for xchg %eax, %eax since it should
6368 zero-extend %eax to %rax. */
6369 if (flag_code == CODE_64BIT
6370 && t->base_opcode == 0x90
75e5731b
JB
6371 && i.types[0].bitfield.instance == Accum
6372 && i.types[0].bitfield.dword
6373 && i.types[1].bitfield.instance == Accum
6374 && i.types[1].bitfield.dword)
8b38ad71 6375 continue;
1212781b
JB
6376 /* xrelease mov %eax, <disp> is another special case. It must not
6377 match the accumulator-only encoding of mov. */
6378 if (flag_code != CODE_64BIT
6379 && i.hle_prefix
6380 && t->base_opcode == 0xa0
75e5731b 6381 && i.types[0].bitfield.instance == Accum
8dc0818e 6382 && (i.flags[1] & Operand_Mem))
1212781b 6383 continue;
f5eb1d70
JB
6384 /* Fall through. */
6385
6386 case 3:
3ac21baa
JB
6387 if (!(size_match & MATCH_STRAIGHT))
6388 goto check_reverse;
64c49ab3
JB
6389 /* Reverse direction of operands if swapping is possible in the first
6390 place (operands need to be symmetric) and
6391 - the load form is requested, and the template is a store form,
6392 - the store form is requested, and the template is a load form,
6393 - the non-default (swapped) form is requested. */
6394 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6395 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6396 && !operand_type_all_zero (&overlap1))
6397 switch (i.dir_encoding)
6398 {
6399 case dir_encoding_load:
6400 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6401 || t->opcode_modifier.regmem)
64c49ab3
JB
6402 goto check_reverse;
6403 break;
6404
6405 case dir_encoding_store:
6406 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6407 && !t->opcode_modifier.regmem)
64c49ab3
JB
6408 goto check_reverse;
6409 break;
6410
6411 case dir_encoding_swap:
6412 goto check_reverse;
6413
6414 case dir_encoding_default:
6415 break;
6416 }
86fa6981 6417 /* If we want store form, we skip the current load. */
64c49ab3
JB
6418 if ((i.dir_encoding == dir_encoding_store
6419 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6420 && i.mem_operands == 0
6421 && t->opcode_modifier.load)
fa99fab2 6422 continue;
1a0670f3 6423 /* Fall through. */
f48ff2ae 6424 case 4:
c0f3af97 6425 case 5:
c6fb90c8 6426 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6427 if (!operand_type_match (overlap0, i.types[0])
6428 || !operand_type_match (overlap1, i.types[1])
e2195274 6429 || ((check_register & 3) == 3
dc821c5f 6430 && !operand_type_register_match (i.types[0],
40fb9820 6431 operand_types[0],
dc821c5f 6432 i.types[1],
40fb9820 6433 operand_types[1])))
29b0f896
AM
6434 {
6435 /* Check if other direction is valid ... */
38e314eb 6436 if (!t->opcode_modifier.d)
29b0f896
AM
6437 continue;
6438
dc1e8a47 6439 check_reverse:
3ac21baa
JB
6440 if (!(size_match & MATCH_REVERSE))
6441 continue;
29b0f896 6442 /* Try reversing direction of operands. */
f5eb1d70
JB
6443 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6444 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6445 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6446 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6447 || (check_register
dc821c5f 6448 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6449 operand_types[i.operands - 1],
6450 i.types[i.operands - 1],
45664ddb 6451 operand_types[0])))
29b0f896
AM
6452 {
6453 /* Does not match either direction. */
6454 continue;
6455 }
38e314eb 6456 /* found_reverse_match holds which of D or FloatR
29b0f896 6457 we've found. */
38e314eb
JB
6458 if (!t->opcode_modifier.d)
6459 found_reverse_match = 0;
6460 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6461 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6462 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6463 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6464 || operand_types[0].bitfield.class == RegMMX
6465 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6466 || is_any_vex_encoding(t))
6467 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6468 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6469 else
38e314eb 6470 found_reverse_match = Opcode_D;
40fb9820 6471 if (t->opcode_modifier.floatr)
8a2ed489 6472 found_reverse_match |= Opcode_FloatR;
29b0f896 6473 }
f48ff2ae 6474 else
29b0f896 6475 {
f48ff2ae 6476 /* Found a forward 2 operand match here. */
d1cbb4db
L
6477 switch (t->operands)
6478 {
c0f3af97
L
6479 case 5:
6480 overlap4 = operand_type_and (i.types[4],
6481 operand_types[4]);
1a0670f3 6482 /* Fall through. */
d1cbb4db 6483 case 4:
c6fb90c8
L
6484 overlap3 = operand_type_and (i.types[3],
6485 operand_types[3]);
1a0670f3 6486 /* Fall through. */
d1cbb4db 6487 case 3:
c6fb90c8
L
6488 overlap2 = operand_type_and (i.types[2],
6489 operand_types[2]);
d1cbb4db
L
6490 break;
6491 }
29b0f896 6492
f48ff2ae
L
6493 switch (t->operands)
6494 {
c0f3af97
L
6495 case 5:
6496 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6497 || !operand_type_register_match (i.types[3],
c0f3af97 6498 operand_types[3],
c0f3af97
L
6499 i.types[4],
6500 operand_types[4]))
6501 continue;
1a0670f3 6502 /* Fall through. */
f48ff2ae 6503 case 4:
40fb9820 6504 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6505 || ((check_register & 0xa) == 0xa
6506 && !operand_type_register_match (i.types[1],
f7768225
JB
6507 operand_types[1],
6508 i.types[3],
e2195274
JB
6509 operand_types[3]))
6510 || ((check_register & 0xc) == 0xc
6511 && !operand_type_register_match (i.types[2],
6512 operand_types[2],
6513 i.types[3],
6514 operand_types[3])))
f48ff2ae 6515 continue;
1a0670f3 6516 /* Fall through. */
f48ff2ae
L
6517 case 3:
6518 /* Here we make use of the fact that there are no
23e42951 6519 reverse match 3 operand instructions. */
40fb9820 6520 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6521 || ((check_register & 5) == 5
6522 && !operand_type_register_match (i.types[0],
23e42951
JB
6523 operand_types[0],
6524 i.types[2],
e2195274
JB
6525 operand_types[2]))
6526 || ((check_register & 6) == 6
6527 && !operand_type_register_match (i.types[1],
6528 operand_types[1],
6529 i.types[2],
6530 operand_types[2])))
f48ff2ae
L
6531 continue;
6532 break;
6533 }
29b0f896 6534 }
f48ff2ae 6535 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6536 slip through to break. */
6537 }
c0f3af97 6538
da4977e0
JB
6539 /* Check if vector operands are valid. */
6540 if (check_VecOperands (t))
6541 {
6542 specific_error = i.error;
6543 continue;
6544 }
6545
6546 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6547 if (VEX_check_encoding (t))
5614d22c
JB
6548 {
6549 specific_error = i.error;
6550 continue;
6551 }
a683cc34 6552
29b0f896
AM
6553 /* We've found a match; break out of loop. */
6554 break;
6555 }
6556
6557 if (t == current_templates->end)
6558 {
6559 /* We found no match. */
a65babc9 6560 const char *err_msg;
5614d22c 6561 switch (specific_error ? specific_error : i.error)
a65babc9
L
6562 {
6563 default:
6564 abort ();
86e026a4 6565 case operand_size_mismatch:
a65babc9
L
6566 err_msg = _("operand size mismatch");
6567 break;
6568 case operand_type_mismatch:
6569 err_msg = _("operand type mismatch");
6570 break;
6571 case register_type_mismatch:
6572 err_msg = _("register type mismatch");
6573 break;
6574 case number_of_operands_mismatch:
6575 err_msg = _("number of operands mismatch");
6576 break;
6577 case invalid_instruction_suffix:
6578 err_msg = _("invalid instruction suffix");
6579 break;
6580 case bad_imm4:
4a2608e3 6581 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6582 break;
a65babc9
L
6583 case unsupported_with_intel_mnemonic:
6584 err_msg = _("unsupported with Intel mnemonic");
6585 break;
6586 case unsupported_syntax:
6587 err_msg = _("unsupported syntax");
6588 break;
6589 case unsupported:
35262a23 6590 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6591 current_templates->start->name);
6592 return NULL;
6c30d220
L
6593 case invalid_vsib_address:
6594 err_msg = _("invalid VSIB address");
6595 break;
7bab8ab5
JB
6596 case invalid_vector_register_set:
6597 err_msg = _("mask, index, and destination registers must be distinct");
6598 break;
6c30d220
L
6599 case unsupported_vector_index_register:
6600 err_msg = _("unsupported vector index register");
6601 break;
43234a1e
L
6602 case unsupported_broadcast:
6603 err_msg = _("unsupported broadcast");
6604 break;
43234a1e
L
6605 case broadcast_needed:
6606 err_msg = _("broadcast is needed for operand of such type");
6607 break;
6608 case unsupported_masking:
6609 err_msg = _("unsupported masking");
6610 break;
6611 case mask_not_on_destination:
6612 err_msg = _("mask not on destination operand");
6613 break;
6614 case no_default_mask:
6615 err_msg = _("default mask isn't allowed");
6616 break;
6617 case unsupported_rc_sae:
6618 err_msg = _("unsupported static rounding/sae");
6619 break;
6620 case rc_sae_operand_not_last_imm:
6621 if (intel_syntax)
6622 err_msg = _("RC/SAE operand must precede immediate operands");
6623 else
6624 err_msg = _("RC/SAE operand must follow immediate operands");
6625 break;
6626 case invalid_register_operand:
6627 err_msg = _("invalid register operand");
6628 break;
a65babc9
L
6629 }
6630 as_bad (_("%s for `%s'"), err_msg,
891edac4 6631 current_templates->start->name);
fa99fab2 6632 return NULL;
29b0f896 6633 }
252b5132 6634
29b0f896
AM
6635 if (!quiet_warnings)
6636 {
6637 if (!intel_syntax
0cfa3eb3 6638 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6639 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6640
40fb9820 6641 if (t->opcode_modifier.isprefix
3cd7f3e3 6642 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6643 {
6644 /* Warn them that a data or address size prefix doesn't
6645 affect assembly of the next line of code. */
6646 as_warn (_("stand-alone `%s' prefix"), t->name);
6647 }
6648 }
6649
6650 /* Copy the template we found. */
6651 i.tm = *t;
539e75ad
L
6652
6653 if (addr_prefix_disp != -1)
6654 i.tm.operand_types[addr_prefix_disp]
6655 = operand_types[addr_prefix_disp];
6656
29b0f896
AM
6657 if (found_reverse_match)
6658 {
dfd69174
JB
6659 /* If we found a reverse match we must alter the opcode direction
6660 bit and clear/flip the regmem modifier one. found_reverse_match
6661 holds bits to change (different for int & float insns). */
29b0f896
AM
6662
6663 i.tm.base_opcode ^= found_reverse_match;
6664
f5eb1d70
JB
6665 i.tm.operand_types[0] = operand_types[i.operands - 1];
6666 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6667
6668 /* Certain SIMD insns have their load forms specified in the opcode
6669 table, and hence we need to _set_ RegMem instead of clearing it.
6670 We need to avoid setting the bit though on insns like KMOVW. */
6671 i.tm.opcode_modifier.regmem
6672 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6673 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6674 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6675 }
6676
fa99fab2 6677 return t;
29b0f896
AM
6678}
6679
6680static int
e3bb37b5 6681check_string (void)
29b0f896 6682{
51c8edf6
JB
6683 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6684 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6685
51c8edf6 6686 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6687 {
51c8edf6
JB
6688 as_bad (_("`%s' operand %u must use `%ses' segment"),
6689 i.tm.name,
6690 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6691 register_prefix);
6692 return 0;
29b0f896 6693 }
51c8edf6
JB
6694
6695 /* There's only ever one segment override allowed per instruction.
6696 This instruction possibly has a legal segment override on the
6697 second operand, so copy the segment to where non-string
6698 instructions store it, allowing common code. */
6699 i.seg[op] = i.seg[1];
6700
29b0f896
AM
6701 return 1;
6702}
6703
6704static int
543613e9 6705process_suffix (void)
29b0f896
AM
6706{
6707 /* If matched instruction specifies an explicit instruction mnemonic
6708 suffix, use it. */
673fe0f0 6709 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6710 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6711 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6712 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6713 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6714 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6715 else if (i.reg_operands
c8f8eebc
JB
6716 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6717 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6718 {
65fca059
JB
6719 unsigned int numop = i.operands;
6720
6721 /* movsx/movzx want only their source operand considered here, for the
6722 ambiguity checking below. The suffix will be replaced afterwards
6723 to represent the destination (register). */
6724 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6725 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6726 --i.operands;
6727
643bb870
JB
6728 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6729 if (i.tm.base_opcode == 0xf20f38f0
6730 && i.tm.operand_types[1].bitfield.qword)
6731 i.rex |= REX_W;
6732
29b0f896 6733 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6734 based on GPR operands. */
29b0f896
AM
6735 if (!i.suffix)
6736 {
6737 /* We take i.suffix from the last register operand specified,
6738 Destination register type is more significant than source
381d071f
L
6739 register type. crc32 in SSE4.2 prefers source register
6740 type. */
1a035124 6741 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6742
1a035124
JB
6743 while (op--)
6744 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6745 || i.tm.operand_types[op].bitfield.instance == Accum)
6746 {
6747 if (i.types[op].bitfield.class != Reg)
6748 continue;
6749 if (i.types[op].bitfield.byte)
6750 i.suffix = BYTE_MNEM_SUFFIX;
6751 else if (i.types[op].bitfield.word)
6752 i.suffix = WORD_MNEM_SUFFIX;
6753 else if (i.types[op].bitfield.dword)
6754 i.suffix = LONG_MNEM_SUFFIX;
6755 else if (i.types[op].bitfield.qword)
6756 i.suffix = QWORD_MNEM_SUFFIX;
6757 else
6758 continue;
6759 break;
6760 }
65fca059
JB
6761
6762 /* As an exception, movsx/movzx silently default to a byte source
6763 in AT&T mode. */
6764 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6765 && !i.suffix && !intel_syntax)
6766 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6767 }
6768 else if (i.suffix == BYTE_MNEM_SUFFIX)
6769 {
2eb952a4 6770 if (intel_syntax
3cd7f3e3 6771 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6772 && i.tm.opcode_modifier.no_bsuf)
6773 i.suffix = 0;
6774 else if (!check_byte_reg ())
29b0f896
AM
6775 return 0;
6776 }
6777 else if (i.suffix == LONG_MNEM_SUFFIX)
6778 {
2eb952a4 6779 if (intel_syntax
3cd7f3e3 6780 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6781 && i.tm.opcode_modifier.no_lsuf
6782 && !i.tm.opcode_modifier.todword
6783 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6784 i.suffix = 0;
6785 else if (!check_long_reg ())
29b0f896
AM
6786 return 0;
6787 }
6788 else if (i.suffix == QWORD_MNEM_SUFFIX)
6789 {
955e1e6a 6790 if (intel_syntax
3cd7f3e3 6791 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6792 && i.tm.opcode_modifier.no_qsuf
6793 && !i.tm.opcode_modifier.todword
6794 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6795 i.suffix = 0;
6796 else if (!check_qword_reg ())
29b0f896
AM
6797 return 0;
6798 }
6799 else if (i.suffix == WORD_MNEM_SUFFIX)
6800 {
2eb952a4 6801 if (intel_syntax
3cd7f3e3 6802 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6803 && i.tm.opcode_modifier.no_wsuf)
6804 i.suffix = 0;
6805 else if (!check_word_reg ())
29b0f896
AM
6806 return 0;
6807 }
3cd7f3e3
L
6808 else if (intel_syntax
6809 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6810 /* Do nothing if the instruction is going to ignore the prefix. */
6811 ;
6812 else
6813 abort ();
65fca059
JB
6814
6815 /* Undo the movsx/movzx change done above. */
6816 i.operands = numop;
29b0f896 6817 }
3cd7f3e3
L
6818 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6819 && !i.suffix)
29b0f896 6820 {
13e600d0
JB
6821 i.suffix = stackop_size;
6822 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6823 {
6824 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6825 .code16gcc directive to support 16-bit mode with
6826 32-bit address. For IRET without a suffix, generate
6827 16-bit IRET (opcode 0xcf) to return from an interrupt
6828 handler. */
13e600d0
JB
6829 if (i.tm.base_opcode == 0xcf)
6830 {
6831 i.suffix = WORD_MNEM_SUFFIX;
6832 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6833 }
6834 /* Warn about changed behavior for segment register push/pop. */
6835 else if ((i.tm.base_opcode | 1) == 0x07)
6836 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6837 i.tm.name);
06f74c5c 6838 }
29b0f896 6839 }
c006a730 6840 else if (!i.suffix
0cfa3eb3
JB
6841 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6842 || i.tm.opcode_modifier.jump == JUMP_BYTE
6843 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6844 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6845 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6846 {
6847 switch (flag_code)
6848 {
6849 case CODE_64BIT:
40fb9820 6850 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6851 {
828c2a25
JB
6852 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6853 || i.tm.opcode_modifier.no_lsuf)
6854 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6855 break;
6856 }
1a0670f3 6857 /* Fall through. */
9306ca4a 6858 case CODE_32BIT:
40fb9820 6859 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6860 i.suffix = LONG_MNEM_SUFFIX;
6861 break;
6862 case CODE_16BIT:
40fb9820 6863 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6864 i.suffix = WORD_MNEM_SUFFIX;
6865 break;
6866 }
6867 }
252b5132 6868
c006a730 6869 if (!i.suffix
3cd7f3e3 6870 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6871 /* Also cover lret/retf/iret in 64-bit mode. */
6872 || (flag_code == CODE_64BIT
6873 && !i.tm.opcode_modifier.no_lsuf
6874 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6875 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
6876 /* Explicit sizing prefixes are assumed to disambiguate insns. */
6877 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
6878 /* Accept FLDENV et al without suffix. */
6879 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6880 {
6c0946d0 6881 unsigned int suffixes, evex = 0;
c006a730
JB
6882
6883 suffixes = !i.tm.opcode_modifier.no_bsuf;
6884 if (!i.tm.opcode_modifier.no_wsuf)
6885 suffixes |= 1 << 1;
6886 if (!i.tm.opcode_modifier.no_lsuf)
6887 suffixes |= 1 << 2;
6888 if (!i.tm.opcode_modifier.no_ldsuf)
6889 suffixes |= 1 << 3;
6890 if (!i.tm.opcode_modifier.no_ssuf)
6891 suffixes |= 1 << 4;
6892 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6893 suffixes |= 1 << 5;
6894
6c0946d0
JB
6895 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6896 also suitable for AT&T syntax mode, it was requested that this be
6897 restricted to just Intel syntax. */
b9915cbc 6898 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6899 {
b9915cbc 6900 unsigned int op;
6c0946d0 6901
b9915cbc 6902 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6903 {
b9915cbc
JB
6904 if (is_evex_encoding (&i.tm)
6905 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6906 {
b9915cbc
JB
6907 if (i.tm.operand_types[op].bitfield.ymmword)
6908 i.tm.operand_types[op].bitfield.xmmword = 0;
6909 if (i.tm.operand_types[op].bitfield.zmmword)
6910 i.tm.operand_types[op].bitfield.ymmword = 0;
6911 if (!i.tm.opcode_modifier.evex
6912 || i.tm.opcode_modifier.evex == EVEXDYN)
6913 i.tm.opcode_modifier.evex = EVEX512;
6914 }
6c0946d0 6915
b9915cbc
JB
6916 if (i.tm.operand_types[op].bitfield.xmmword
6917 + i.tm.operand_types[op].bitfield.ymmword
6918 + i.tm.operand_types[op].bitfield.zmmword < 2)
6919 continue;
6c0946d0 6920
b9915cbc
JB
6921 /* Any properly sized operand disambiguates the insn. */
6922 if (i.types[op].bitfield.xmmword
6923 || i.types[op].bitfield.ymmword
6924 || i.types[op].bitfield.zmmword)
6925 {
6926 suffixes &= ~(7 << 6);
6927 evex = 0;
6928 break;
6929 }
6c0946d0 6930
b9915cbc
JB
6931 if ((i.flags[op] & Operand_Mem)
6932 && i.tm.operand_types[op].bitfield.unspecified)
6933 {
6934 if (i.tm.operand_types[op].bitfield.xmmword)
6935 suffixes |= 1 << 6;
6936 if (i.tm.operand_types[op].bitfield.ymmword)
6937 suffixes |= 1 << 7;
6938 if (i.tm.operand_types[op].bitfield.zmmword)
6939 suffixes |= 1 << 8;
6940 if (is_evex_encoding (&i.tm))
6941 evex = EVEX512;
6c0946d0
JB
6942 }
6943 }
6944 }
6945
6946 /* Are multiple suffixes / operand sizes allowed? */
c006a730 6947 if (suffixes & (suffixes - 1))
9306ca4a 6948 {
873494c8 6949 if (intel_syntax
3cd7f3e3 6950 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 6951 || operand_check == check_error))
9306ca4a 6952 {
c006a730 6953 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
6954 return 0;
6955 }
c006a730 6956 if (operand_check == check_error)
9306ca4a 6957 {
c006a730
JB
6958 as_bad (_("no instruction mnemonic suffix given and "
6959 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
6960 return 0;
6961 }
c006a730 6962 if (operand_check == check_warning)
873494c8
JB
6963 as_warn (_("%s; using default for `%s'"),
6964 intel_syntax
6965 ? _("ambiguous operand size")
6966 : _("no instruction mnemonic suffix given and "
6967 "no register operands"),
6968 i.tm.name);
c006a730
JB
6969
6970 if (i.tm.opcode_modifier.floatmf)
6971 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
6972 else if ((i.tm.base_opcode | 8) == 0xfbe
6973 || (i.tm.base_opcode == 0x63
6974 && i.tm.cpu_flags.bitfield.cpu64))
6975 /* handled below */;
6c0946d0
JB
6976 else if (evex)
6977 i.tm.opcode_modifier.evex = evex;
c006a730
JB
6978 else if (flag_code == CODE_16BIT)
6979 i.suffix = WORD_MNEM_SUFFIX;
1a035124 6980 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 6981 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
6982 else
6983 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 6984 }
29b0f896 6985 }
252b5132 6986
65fca059
JB
6987 if ((i.tm.base_opcode | 8) == 0xfbe
6988 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6989 {
6990 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
6991 In AT&T syntax, if there is no suffix (warned about above), the default
6992 will be byte extension. */
6993 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
6994 i.tm.base_opcode |= 1;
6995
6996 /* For further processing, the suffix should represent the destination
6997 (register). This is already the case when one was used with
6998 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
6999 no suffix to begin with. */
7000 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7001 {
7002 if (i.types[1].bitfield.word)
7003 i.suffix = WORD_MNEM_SUFFIX;
7004 else if (i.types[1].bitfield.qword)
7005 i.suffix = QWORD_MNEM_SUFFIX;
7006 else
7007 i.suffix = LONG_MNEM_SUFFIX;
7008
7009 i.tm.opcode_modifier.w = 0;
7010 }
7011 }
7012
50128d0c
JB
7013 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7014 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7015 != (i.tm.operand_types[1].bitfield.class == Reg);
7016
d2224064
JB
7017 /* Change the opcode based on the operand size given by i.suffix. */
7018 switch (i.suffix)
29b0f896 7019 {
d2224064
JB
7020 /* Size floating point instruction. */
7021 case LONG_MNEM_SUFFIX:
7022 if (i.tm.opcode_modifier.floatmf)
7023 {
7024 i.tm.base_opcode ^= 4;
7025 break;
7026 }
7027 /* fall through */
7028 case WORD_MNEM_SUFFIX:
7029 case QWORD_MNEM_SUFFIX:
29b0f896 7030 /* It's not a byte, select word/dword operation. */
40fb9820 7031 if (i.tm.opcode_modifier.w)
29b0f896 7032 {
50128d0c 7033 if (i.short_form)
29b0f896
AM
7034 i.tm.base_opcode |= 8;
7035 else
7036 i.tm.base_opcode |= 1;
7037 }
d2224064
JB
7038 /* fall through */
7039 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7040 /* Now select between word & dword operations via the operand
7041 size prefix, except for instructions that will ignore this
7042 prefix anyway. */
c8f8eebc 7043 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7044 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7045 && !i.tm.opcode_modifier.floatmf
7046 && !is_any_vex_encoding (&i.tm)
7047 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7048 || (flag_code == CODE_64BIT
7049 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7050 {
7051 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7052
0cfa3eb3 7053 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7054 prefix = ADDR_PREFIX_OPCODE;
252b5132 7055
29b0f896
AM
7056 if (!add_prefix (prefix))
7057 return 0;
24eab124 7058 }
252b5132 7059
29b0f896
AM
7060 /* Set mode64 for an operand. */
7061 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7062 && flag_code == CODE_64BIT
d2224064 7063 && !i.tm.opcode_modifier.norex64
4ed21b58 7064 && !i.tm.opcode_modifier.vexw
46e883c5 7065 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7066 need rex64. */
7067 && ! (i.operands == 2
7068 && i.tm.base_opcode == 0x90
7069 && i.tm.extension_opcode == None
75e5731b
JB
7070 && i.types[0].bitfield.instance == Accum
7071 && i.types[0].bitfield.qword
7072 && i.types[1].bitfield.instance == Accum
7073 && i.types[1].bitfield.qword))
d2224064 7074 i.rex |= REX_W;
3e73aa7c 7075
d2224064 7076 break;
8bbb3ad8
JB
7077
7078 case 0:
7079 /* Select word/dword/qword operation with explict data sizing prefix
7080 when there are no suitable register operands. */
7081 if (i.tm.opcode_modifier.w
7082 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7083 && (!i.reg_operands
7084 || (i.reg_operands == 1
7085 /* ShiftCount */
7086 && (i.tm.operand_types[0].bitfield.instance == RegC
7087 /* InOutPortReg */
7088 || i.tm.operand_types[0].bitfield.instance == RegD
7089 || i.tm.operand_types[1].bitfield.instance == RegD
7090 /* CRC32 */
7091 || i.tm.base_opcode == 0xf20f38f0))))
7092 i.tm.base_opcode |= 1;
7093 break;
29b0f896 7094 }
7ecd2f8b 7095
c8f8eebc 7096 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7097 {
c8f8eebc
JB
7098 gas_assert (!i.suffix);
7099 gas_assert (i.reg_operands);
c0a30a9f 7100
c8f8eebc
JB
7101 if (i.tm.operand_types[0].bitfield.instance == Accum
7102 || i.operands == 1)
7103 {
7104 /* The address size override prefix changes the size of the
7105 first operand. */
7106 if (flag_code == CODE_64BIT
7107 && i.op[0].regs->reg_type.bitfield.word)
7108 {
7109 as_bad (_("16-bit addressing unavailable for `%s'"),
7110 i.tm.name);
7111 return 0;
7112 }
7113
7114 if ((flag_code == CODE_32BIT
7115 ? i.op[0].regs->reg_type.bitfield.word
7116 : i.op[0].regs->reg_type.bitfield.dword)
7117 && !add_prefix (ADDR_PREFIX_OPCODE))
7118 return 0;
7119 }
c0a30a9f
L
7120 else
7121 {
c8f8eebc
JB
7122 /* Check invalid register operand when the address size override
7123 prefix changes the size of register operands. */
7124 unsigned int op;
7125 enum { need_word, need_dword, need_qword } need;
7126
7127 if (flag_code == CODE_32BIT)
7128 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7129 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7130 need = need_dword;
7131 else
7132 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7133
c8f8eebc
JB
7134 for (op = 0; op < i.operands; op++)
7135 {
7136 if (i.types[op].bitfield.class != Reg)
7137 continue;
7138
7139 switch (need)
7140 {
7141 case need_word:
7142 if (i.op[op].regs->reg_type.bitfield.word)
7143 continue;
7144 break;
7145 case need_dword:
7146 if (i.op[op].regs->reg_type.bitfield.dword)
7147 continue;
7148 break;
7149 case need_qword:
7150 if (i.op[op].regs->reg_type.bitfield.qword)
7151 continue;
7152 break;
7153 }
7154
7155 as_bad (_("invalid register operand size for `%s'"),
7156 i.tm.name);
7157 return 0;
7158 }
7159 }
c0a30a9f
L
7160 }
7161
29b0f896
AM
7162 return 1;
7163}
3e73aa7c 7164
29b0f896 7165static int
543613e9 7166check_byte_reg (void)
29b0f896
AM
7167{
7168 int op;
543613e9 7169
29b0f896
AM
7170 for (op = i.operands; --op >= 0;)
7171 {
dc821c5f 7172 /* Skip non-register operands. */
bab6aec1 7173 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7174 continue;
7175
29b0f896
AM
7176 /* If this is an eight bit register, it's OK. If it's the 16 or
7177 32 bit version of an eight bit register, we will just use the
7178 low portion, and that's OK too. */
dc821c5f 7179 if (i.types[op].bitfield.byte)
29b0f896
AM
7180 continue;
7181
5a819eb9 7182 /* I/O port address operands are OK too. */
75e5731b
JB
7183 if (i.tm.operand_types[op].bitfield.instance == RegD
7184 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7185 continue;
7186
9706160a
JB
7187 /* crc32 only wants its source operand checked here. */
7188 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7189 continue;
7190
29b0f896 7191 /* Any other register is bad. */
73c76375
JB
7192 as_bad (_("`%s%s' not allowed with `%s%c'"),
7193 register_prefix, i.op[op].regs->reg_name,
7194 i.tm.name, i.suffix);
7195 return 0;
29b0f896
AM
7196 }
7197 return 1;
7198}
7199
7200static int
e3bb37b5 7201check_long_reg (void)
29b0f896
AM
7202{
7203 int op;
7204
7205 for (op = i.operands; --op >= 0;)
dc821c5f 7206 /* Skip non-register operands. */
bab6aec1 7207 if (i.types[op].bitfield.class != Reg)
dc821c5f 7208 continue;
29b0f896
AM
7209 /* Reject eight bit registers, except where the template requires
7210 them. (eg. movzb) */
dc821c5f 7211 else if (i.types[op].bitfield.byte
bab6aec1 7212 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7213 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7214 && (i.tm.operand_types[op].bitfield.word
7215 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7216 {
a540244d
L
7217 as_bad (_("`%s%s' not allowed with `%s%c'"),
7218 register_prefix,
29b0f896
AM
7219 i.op[op].regs->reg_name,
7220 i.tm.name,
7221 i.suffix);
7222 return 0;
7223 }
be4c5e58
L
7224 /* Error if the e prefix on a general reg is missing. */
7225 else if (i.types[op].bitfield.word
bab6aec1 7226 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7227 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7228 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7229 {
be4c5e58
L
7230 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7231 register_prefix, i.op[op].regs->reg_name,
7232 i.suffix);
7233 return 0;
252b5132 7234 }
e4630f71 7235 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7236 else if (i.types[op].bitfield.qword
bab6aec1 7237 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7238 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7239 && i.tm.operand_types[op].bitfield.dword)
252b5132 7240 {
34828aad 7241 if (intel_syntax
65fca059 7242 && i.tm.opcode_modifier.toqword
3528c362 7243 && i.types[0].bitfield.class != RegSIMD)
34828aad 7244 {
ca61edf2 7245 /* Convert to QWORD. We want REX byte. */
34828aad
L
7246 i.suffix = QWORD_MNEM_SUFFIX;
7247 }
7248 else
7249 {
2b5d6a91 7250 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7251 register_prefix, i.op[op].regs->reg_name,
7252 i.suffix);
7253 return 0;
7254 }
29b0f896
AM
7255 }
7256 return 1;
7257}
252b5132 7258
29b0f896 7259static int
e3bb37b5 7260check_qword_reg (void)
29b0f896
AM
7261{
7262 int op;
252b5132 7263
29b0f896 7264 for (op = i.operands; --op >= 0; )
dc821c5f 7265 /* Skip non-register operands. */
bab6aec1 7266 if (i.types[op].bitfield.class != Reg)
dc821c5f 7267 continue;
29b0f896
AM
7268 /* Reject eight bit registers, except where the template requires
7269 them. (eg. movzb) */
dc821c5f 7270 else if (i.types[op].bitfield.byte
bab6aec1 7271 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7272 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7273 && (i.tm.operand_types[op].bitfield.word
7274 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7275 {
a540244d
L
7276 as_bad (_("`%s%s' not allowed with `%s%c'"),
7277 register_prefix,
29b0f896
AM
7278 i.op[op].regs->reg_name,
7279 i.tm.name,
7280 i.suffix);
7281 return 0;
7282 }
e4630f71 7283 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7284 else if ((i.types[op].bitfield.word
7285 || i.types[op].bitfield.dword)
bab6aec1 7286 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7287 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7288 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7289 {
7290 /* Prohibit these changes in the 64bit mode, since the
7291 lowering is more complicated. */
34828aad 7292 if (intel_syntax
ca61edf2 7293 && i.tm.opcode_modifier.todword
3528c362 7294 && i.types[0].bitfield.class != RegSIMD)
34828aad 7295 {
ca61edf2 7296 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7297 i.suffix = LONG_MNEM_SUFFIX;
7298 }
7299 else
7300 {
2b5d6a91 7301 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7302 register_prefix, i.op[op].regs->reg_name,
7303 i.suffix);
7304 return 0;
7305 }
252b5132 7306 }
29b0f896
AM
7307 return 1;
7308}
252b5132 7309
29b0f896 7310static int
e3bb37b5 7311check_word_reg (void)
29b0f896
AM
7312{
7313 int op;
7314 for (op = i.operands; --op >= 0;)
dc821c5f 7315 /* Skip non-register operands. */
bab6aec1 7316 if (i.types[op].bitfield.class != Reg)
dc821c5f 7317 continue;
29b0f896
AM
7318 /* Reject eight bit registers, except where the template requires
7319 them. (eg. movzb) */
dc821c5f 7320 else if (i.types[op].bitfield.byte
bab6aec1 7321 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7322 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7323 && (i.tm.operand_types[op].bitfield.word
7324 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7325 {
a540244d
L
7326 as_bad (_("`%s%s' not allowed with `%s%c'"),
7327 register_prefix,
29b0f896
AM
7328 i.op[op].regs->reg_name,
7329 i.tm.name,
7330 i.suffix);
7331 return 0;
7332 }
9706160a
JB
7333 /* Error if the e or r prefix on a general reg is present. */
7334 else if ((i.types[op].bitfield.dword
dc821c5f 7335 || i.types[op].bitfield.qword)
bab6aec1 7336 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7337 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7338 && i.tm.operand_types[op].bitfield.word)
252b5132 7339 {
9706160a
JB
7340 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7341 register_prefix, i.op[op].regs->reg_name,
7342 i.suffix);
7343 return 0;
29b0f896
AM
7344 }
7345 return 1;
7346}
252b5132 7347
29b0f896 7348static int
40fb9820 7349update_imm (unsigned int j)
29b0f896 7350{
bc0844ae 7351 i386_operand_type overlap = i.types[j];
40fb9820
L
7352 if ((overlap.bitfield.imm8
7353 || overlap.bitfield.imm8s
7354 || overlap.bitfield.imm16
7355 || overlap.bitfield.imm32
7356 || overlap.bitfield.imm32s
7357 || overlap.bitfield.imm64)
0dfbf9d7
L
7358 && !operand_type_equal (&overlap, &imm8)
7359 && !operand_type_equal (&overlap, &imm8s)
7360 && !operand_type_equal (&overlap, &imm16)
7361 && !operand_type_equal (&overlap, &imm32)
7362 && !operand_type_equal (&overlap, &imm32s)
7363 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7364 {
7365 if (i.suffix)
7366 {
40fb9820
L
7367 i386_operand_type temp;
7368
0dfbf9d7 7369 operand_type_set (&temp, 0);
7ab9ffdd 7370 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7371 {
7372 temp.bitfield.imm8 = overlap.bitfield.imm8;
7373 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7374 }
7375 else if (i.suffix == WORD_MNEM_SUFFIX)
7376 temp.bitfield.imm16 = overlap.bitfield.imm16;
7377 else if (i.suffix == QWORD_MNEM_SUFFIX)
7378 {
7379 temp.bitfield.imm64 = overlap.bitfield.imm64;
7380 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7381 }
7382 else
7383 temp.bitfield.imm32 = overlap.bitfield.imm32;
7384 overlap = temp;
29b0f896 7385 }
0dfbf9d7
L
7386 else if (operand_type_equal (&overlap, &imm16_32_32s)
7387 || operand_type_equal (&overlap, &imm16_32)
7388 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7389 {
40fb9820 7390 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7391 overlap = imm16;
40fb9820 7392 else
65da13b5 7393 overlap = imm32s;
29b0f896 7394 }
8bbb3ad8
JB
7395 else if (i.prefix[REX_PREFIX] & REX_W)
7396 overlap = operand_type_and (overlap, imm32s);
7397 else if (i.prefix[DATA_PREFIX])
7398 overlap = operand_type_and (overlap,
7399 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7400 if (!operand_type_equal (&overlap, &imm8)
7401 && !operand_type_equal (&overlap, &imm8s)
7402 && !operand_type_equal (&overlap, &imm16)
7403 && !operand_type_equal (&overlap, &imm32)
7404 && !operand_type_equal (&overlap, &imm32s)
7405 && !operand_type_equal (&overlap, &imm64))
29b0f896 7406 {
4eed87de
AM
7407 as_bad (_("no instruction mnemonic suffix given; "
7408 "can't determine immediate size"));
29b0f896
AM
7409 return 0;
7410 }
7411 }
40fb9820 7412 i.types[j] = overlap;
29b0f896 7413
40fb9820
L
7414 return 1;
7415}
7416
7417static int
7418finalize_imm (void)
7419{
bc0844ae 7420 unsigned int j, n;
29b0f896 7421
bc0844ae
L
7422 /* Update the first 2 immediate operands. */
7423 n = i.operands > 2 ? 2 : i.operands;
7424 if (n)
7425 {
7426 for (j = 0; j < n; j++)
7427 if (update_imm (j) == 0)
7428 return 0;
40fb9820 7429
bc0844ae
L
7430 /* The 3rd operand can't be immediate operand. */
7431 gas_assert (operand_type_check (i.types[2], imm) == 0);
7432 }
29b0f896
AM
7433
7434 return 1;
7435}
7436
7437static int
e3bb37b5 7438process_operands (void)
29b0f896
AM
7439{
7440 /* Default segment register this instruction will use for memory
7441 accesses. 0 means unknown. This is only for optimizing out
7442 unnecessary segment overrides. */
7443 const seg_entry *default_seg = 0;
7444
a5aeccd9
JB
7445 if (i.tm.opcode_modifier.sse2avx)
7446 {
7447 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7448 need converting. */
7449 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7450 i.prefix[REX_PREFIX] = 0;
7451 i.rex_encoding = 0;
7452 }
7453
2426c15f 7454 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7455 {
91d6fa6a
NC
7456 unsigned int dupl = i.operands;
7457 unsigned int dest = dupl - 1;
9fcfb3d7
L
7458 unsigned int j;
7459
c0f3af97 7460 /* The destination must be an xmm register. */
9c2799c2 7461 gas_assert (i.reg_operands
91d6fa6a 7462 && MAX_OPERANDS > dupl
7ab9ffdd 7463 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7464
75e5731b 7465 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7466 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7467 {
8cd7925b 7468 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7469 {
7470 /* Keep xmm0 for instructions with VEX prefix and 3
7471 sources. */
75e5731b 7472 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7473 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7474 goto duplicate;
7475 }
e2ec9d29 7476 else
c0f3af97
L
7477 {
7478 /* We remove the first xmm0 and keep the number of
7479 operands unchanged, which in fact duplicates the
7480 destination. */
7481 for (j = 1; j < i.operands; j++)
7482 {
7483 i.op[j - 1] = i.op[j];
7484 i.types[j - 1] = i.types[j];
7485 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7486 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7487 }
7488 }
7489 }
7490 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7491 {
91d6fa6a 7492 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7493 && (i.tm.opcode_modifier.vexsources
7494 == VEX3SOURCES));
c0f3af97
L
7495
7496 /* Add the implicit xmm0 for instructions with VEX prefix
7497 and 3 sources. */
7498 for (j = i.operands; j > 0; j--)
7499 {
7500 i.op[j] = i.op[j - 1];
7501 i.types[j] = i.types[j - 1];
7502 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7503 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7504 }
7505 i.op[0].regs
7506 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 7507 i.types[0] = regxmm;
c0f3af97
L
7508 i.tm.operand_types[0] = regxmm;
7509
7510 i.operands += 2;
7511 i.reg_operands += 2;
7512 i.tm.operands += 2;
7513
91d6fa6a 7514 dupl++;
c0f3af97 7515 dest++;
91d6fa6a
NC
7516 i.op[dupl] = i.op[dest];
7517 i.types[dupl] = i.types[dest];
7518 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7519 i.flags[dupl] = i.flags[dest];
e2ec9d29 7520 }
c0f3af97
L
7521 else
7522 {
dc1e8a47 7523 duplicate:
c0f3af97
L
7524 i.operands++;
7525 i.reg_operands++;
7526 i.tm.operands++;
7527
91d6fa6a
NC
7528 i.op[dupl] = i.op[dest];
7529 i.types[dupl] = i.types[dest];
7530 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7531 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7532 }
7533
7534 if (i.tm.opcode_modifier.immext)
7535 process_immext ();
7536 }
75e5731b 7537 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7538 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7539 {
7540 unsigned int j;
7541
9fcfb3d7
L
7542 for (j = 1; j < i.operands; j++)
7543 {
7544 i.op[j - 1] = i.op[j];
7545 i.types[j - 1] = i.types[j];
7546
7547 /* We need to adjust fields in i.tm since they are used by
7548 build_modrm_byte. */
7549 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7550
7551 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7552 }
7553
e2ec9d29
L
7554 i.operands--;
7555 i.reg_operands--;
e2ec9d29
L
7556 i.tm.operands--;
7557 }
920d2ddc
IT
7558 else if (i.tm.opcode_modifier.implicitquadgroup)
7559 {
a477a8c4
JB
7560 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7561
920d2ddc 7562 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7563 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7564 regnum = register_number (i.op[1].regs);
7565 first_reg_in_group = regnum & ~3;
7566 last_reg_in_group = first_reg_in_group + 3;
7567 if (regnum != first_reg_in_group)
7568 as_warn (_("source register `%s%s' implicitly denotes"
7569 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7570 register_prefix, i.op[1].regs->reg_name,
7571 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7572 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7573 i.tm.name);
7574 }
e2ec9d29
L
7575 else if (i.tm.opcode_modifier.regkludge)
7576 {
7577 /* The imul $imm, %reg instruction is converted into
7578 imul $imm, %reg, %reg, and the clr %reg instruction
7579 is converted into xor %reg, %reg. */
7580
7581 unsigned int first_reg_op;
7582
7583 if (operand_type_check (i.types[0], reg))
7584 first_reg_op = 0;
7585 else
7586 first_reg_op = 1;
7587 /* Pretend we saw the extra register operand. */
9c2799c2 7588 gas_assert (i.reg_operands == 1
7ab9ffdd 7589 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7590 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7591 i.types[first_reg_op + 1] = i.types[first_reg_op];
7592 i.operands++;
7593 i.reg_operands++;
29b0f896
AM
7594 }
7595
85b80b0f 7596 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7597 {
7598 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7599 must be put into the modrm byte). Now, we make the modrm and
7600 index base bytes based on all the info we've collected. */
29b0f896
AM
7601
7602 default_seg = build_modrm_byte ();
7603 }
00cee14f 7604 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7605 {
7606 if (flag_code != CODE_64BIT
7607 ? i.tm.base_opcode == POP_SEG_SHORT
7608 && i.op[0].regs->reg_num == 1
7609 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7610 && i.op[0].regs->reg_num < 4)
7611 {
7612 as_bad (_("you can't `%s %s%s'"),
7613 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7614 return 0;
7615 }
7616 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7617 {
7618 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7619 i.tm.opcode_length = 2;
7620 }
7621 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7622 }
8a2ed489 7623 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7624 {
7625 default_seg = &ds;
7626 }
40fb9820 7627 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7628 {
7629 /* For the string instructions that allow a segment override
7630 on one of their operands, the default segment is ds. */
7631 default_seg = &ds;
7632 }
50128d0c 7633 else if (i.short_form)
85b80b0f
JB
7634 {
7635 /* The register or float register operand is in operand
7636 0 or 1. */
bab6aec1 7637 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7638
7639 /* Register goes in low 3 bits of opcode. */
7640 i.tm.base_opcode |= i.op[op].regs->reg_num;
7641 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7642 i.rex |= REX_B;
7643 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7644 {
7645 /* Warn about some common errors, but press on regardless.
7646 The first case can be generated by gcc (<= 2.8.1). */
7647 if (i.operands == 2)
7648 {
7649 /* Reversed arguments on faddp, fsubp, etc. */
7650 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7651 register_prefix, i.op[!intel_syntax].regs->reg_name,
7652 register_prefix, i.op[intel_syntax].regs->reg_name);
7653 }
7654 else
7655 {
7656 /* Extraneous `l' suffix on fp insn. */
7657 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7658 register_prefix, i.op[0].regs->reg_name);
7659 }
7660 }
7661 }
29b0f896 7662
514a8bb0 7663 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7664 && i.tm.base_opcode == 0x8d /* lea */
7665 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7666 {
7667 if (!quiet_warnings)
7668 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7669 if (optimize)
7670 {
7671 i.seg[0] = NULL;
7672 i.prefix[SEG_PREFIX] = 0;
7673 }
7674 }
52271982
AM
7675
7676 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7677 is neither the default nor the one already recorded from a prefix,
7678 use an opcode prefix to select it. If we never figured out what
7679 the default segment is, then default_seg will be zero at this
7680 point, and the specified segment prefix will always be used. */
7681 if (i.seg[0]
7682 && i.seg[0] != default_seg
7683 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7684 {
7685 if (!add_prefix (i.seg[0]->seg_prefix))
7686 return 0;
7687 }
7688 return 1;
7689}
7690
a5aeccd9
JB
7691static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
7692 bfd_boolean do_sse2avx)
7693{
7694 if (r->reg_flags & RegRex)
7695 {
7696 if (i.rex & rex_bit)
7697 as_bad (_("same type of prefix used twice"));
7698 i.rex |= rex_bit;
7699 }
7700 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7701 {
7702 gas_assert (i.vex.register_specifier == r);
7703 i.vex.register_specifier += 8;
7704 }
7705
7706 if (r->reg_flags & RegVRex)
7707 i.vrex |= rex_bit;
7708}
7709
29b0f896 7710static const seg_entry *
e3bb37b5 7711build_modrm_byte (void)
29b0f896
AM
7712{
7713 const seg_entry *default_seg = 0;
c0f3af97 7714 unsigned int source, dest;
8cd7925b 7715 int vex_3_sources;
c0f3af97 7716
8cd7925b 7717 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7718 if (vex_3_sources)
7719 {
91d6fa6a 7720 unsigned int nds, reg_slot;
4c2c6516 7721 expressionS *exp;
c0f3af97 7722
6b8d3588 7723 dest = i.operands - 1;
c0f3af97 7724 nds = dest - 1;
922d8de8 7725
a683cc34 7726 /* There are 2 kinds of instructions:
bed3d976 7727 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7728 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7729 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7730 ZMM register.
bed3d976 7731 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7732 plus 1 memory operand, with VexXDS. */
922d8de8 7733 gas_assert ((i.reg_operands == 4
bed3d976
JB
7734 || (i.reg_operands == 3 && i.mem_operands == 1))
7735 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7736 && i.tm.opcode_modifier.vexw
3528c362 7737 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7738
48db9223
JB
7739 /* If VexW1 is set, the first non-immediate operand is the source and
7740 the second non-immediate one is encoded in the immediate operand. */
7741 if (i.tm.opcode_modifier.vexw == VEXW1)
7742 {
7743 source = i.imm_operands;
7744 reg_slot = i.imm_operands + 1;
7745 }
7746 else
7747 {
7748 source = i.imm_operands + 1;
7749 reg_slot = i.imm_operands;
7750 }
7751
a683cc34 7752 if (i.imm_operands == 0)
bed3d976
JB
7753 {
7754 /* When there is no immediate operand, generate an 8bit
7755 immediate operand to encode the first operand. */
7756 exp = &im_expressions[i.imm_operands++];
7757 i.op[i.operands].imms = exp;
7758 i.types[i.operands] = imm8;
7759 i.operands++;
7760
3528c362 7761 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7762 exp->X_op = O_constant;
7763 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7764 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7765 }
922d8de8 7766 else
bed3d976 7767 {
9d3bf266
JB
7768 gas_assert (i.imm_operands == 1);
7769 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7770 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7771
9d3bf266
JB
7772 /* Turn on Imm8 again so that output_imm will generate it. */
7773 i.types[0].bitfield.imm8 = 1;
bed3d976 7774
3528c362 7775 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7776 i.op[0].imms->X_add_number
bed3d976 7777 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7778 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7779 }
a683cc34 7780
3528c362 7781 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7782 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7783 }
7784 else
7785 source = dest = 0;
29b0f896
AM
7786
7787 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7788 implicit registers do not count. If there are 3 register
7789 operands, it must be a instruction with VexNDS. For a
7790 instruction with VexNDD, the destination register is encoded
7791 in VEX prefix. If there are 4 register operands, it must be
7792 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7793 if (i.mem_operands == 0
7794 && ((i.reg_operands == 2
2426c15f 7795 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7796 || (i.reg_operands == 3
2426c15f 7797 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7798 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7799 {
cab737b9
L
7800 switch (i.operands)
7801 {
7802 case 2:
7803 source = 0;
7804 break;
7805 case 3:
c81128dc
L
7806 /* When there are 3 operands, one of them may be immediate,
7807 which may be the first or the last operand. Otherwise,
c0f3af97
L
7808 the first operand must be shift count register (cl) or it
7809 is an instruction with VexNDS. */
9c2799c2 7810 gas_assert (i.imm_operands == 1
7ab9ffdd 7811 || (i.imm_operands == 0
2426c15f 7812 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7813 || (i.types[0].bitfield.instance == RegC
7814 && i.types[0].bitfield.byte))));
40fb9820 7815 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7816 || (i.types[0].bitfield.instance == RegC
7817 && i.types[0].bitfield.byte))
40fb9820
L
7818 source = 1;
7819 else
7820 source = 0;
cab737b9
L
7821 break;
7822 case 4:
368d64cc
L
7823 /* When there are 4 operands, the first two must be 8bit
7824 immediate operands. The source operand will be the 3rd
c0f3af97
L
7825 one.
7826
7827 For instructions with VexNDS, if the first operand
7828 an imm8, the source operand is the 2nd one. If the last
7829 operand is imm8, the source operand is the first one. */
9c2799c2 7830 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7831 && i.types[0].bitfield.imm8
7832 && i.types[1].bitfield.imm8)
2426c15f 7833 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7834 && i.imm_operands == 1
7835 && (i.types[0].bitfield.imm8
43234a1e
L
7836 || i.types[i.operands - 1].bitfield.imm8
7837 || i.rounding)));
9f2670f2
L
7838 if (i.imm_operands == 2)
7839 source = 2;
7840 else
c0f3af97
L
7841 {
7842 if (i.types[0].bitfield.imm8)
7843 source = 1;
7844 else
7845 source = 0;
7846 }
c0f3af97
L
7847 break;
7848 case 5:
e771e7c9 7849 if (is_evex_encoding (&i.tm))
43234a1e
L
7850 {
7851 /* For EVEX instructions, when there are 5 operands, the
7852 first one must be immediate operand. If the second one
7853 is immediate operand, the source operand is the 3th
7854 one. If the last one is immediate operand, the source
7855 operand is the 2nd one. */
7856 gas_assert (i.imm_operands == 2
7857 && i.tm.opcode_modifier.sae
7858 && operand_type_check (i.types[0], imm));
7859 if (operand_type_check (i.types[1], imm))
7860 source = 2;
7861 else if (operand_type_check (i.types[4], imm))
7862 source = 1;
7863 else
7864 abort ();
7865 }
cab737b9
L
7866 break;
7867 default:
7868 abort ();
7869 }
7870
c0f3af97
L
7871 if (!vex_3_sources)
7872 {
7873 dest = source + 1;
7874
43234a1e
L
7875 /* RC/SAE operand could be between DEST and SRC. That happens
7876 when one operand is GPR and the other one is XMM/YMM/ZMM
7877 register. */
7878 if (i.rounding && i.rounding->operand == (int) dest)
7879 dest++;
7880
2426c15f 7881 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7882 {
43234a1e 7883 /* For instructions with VexNDS, the register-only source
c5d0745b 7884 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7885 register. It is encoded in VEX prefix. */
f12dc422
L
7886
7887 i386_operand_type op;
7888 unsigned int vvvv;
7889
7890 /* Check register-only source operand when two source
7891 operands are swapped. */
7892 if (!i.tm.operand_types[source].bitfield.baseindex
7893 && i.tm.operand_types[dest].bitfield.baseindex)
7894 {
7895 vvvv = source;
7896 source = dest;
7897 }
7898 else
7899 vvvv = dest;
7900
7901 op = i.tm.operand_types[vvvv];
c0f3af97 7902 if ((dest + 1) >= i.operands
bab6aec1 7903 || ((op.bitfield.class != Reg
dc821c5f 7904 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7905 && op.bitfield.class != RegSIMD
43234a1e 7906 && !operand_type_equal (&op, &regmask)))
c0f3af97 7907 abort ();
f12dc422 7908 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7909 dest++;
7910 }
7911 }
29b0f896
AM
7912
7913 i.rm.mode = 3;
dfd69174
JB
7914 /* One of the register operands will be encoded in the i.rm.reg
7915 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7916 fields. If no form of this instruction supports a memory
7917 destination operand, then we assume the source operand may
7918 sometimes be a memory operand and so we need to store the
7919 destination in the i.rm.reg field. */
dfd69174 7920 if (!i.tm.opcode_modifier.regmem
40fb9820 7921 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7922 {
7923 i.rm.reg = i.op[dest].regs->reg_num;
7924 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7925 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7926 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7927 i.has_regmmx = TRUE;
3528c362
JB
7928 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7929 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7930 {
7931 if (i.types[dest].bitfield.zmmword
7932 || i.types[source].bitfield.zmmword)
7933 i.has_regzmm = TRUE;
7934 else if (i.types[dest].bitfield.ymmword
7935 || i.types[source].bitfield.ymmword)
7936 i.has_regymm = TRUE;
7937 else
7938 i.has_regxmm = TRUE;
7939 }
a5aeccd9
JB
7940 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
7941 set_rex_vrex (i.op[source].regs, REX_B, FALSE);
29b0f896
AM
7942 }
7943 else
7944 {
7945 i.rm.reg = i.op[source].regs->reg_num;
7946 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9
JB
7947 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
7948 set_rex_vrex (i.op[source].regs, REX_R, FALSE);
29b0f896 7949 }
e0c7f900 7950 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7951 {
4a5c67ed 7952 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7953 abort ();
e0c7f900 7954 i.rex &= ~REX_R;
c4a530c5
JB
7955 add_prefix (LOCK_PREFIX_OPCODE);
7956 }
29b0f896
AM
7957 }
7958 else
7959 { /* If it's not 2 reg operands... */
c0f3af97
L
7960 unsigned int mem;
7961
29b0f896
AM
7962 if (i.mem_operands)
7963 {
7964 unsigned int fake_zero_displacement = 0;
99018f42 7965 unsigned int op;
4eed87de 7966
7ab9ffdd 7967 for (op = 0; op < i.operands; op++)
8dc0818e 7968 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7969 break;
7ab9ffdd 7970 gas_assert (op < i.operands);
29b0f896 7971
6c30d220
L
7972 if (i.tm.opcode_modifier.vecsib)
7973 {
e968fc9b 7974 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7975 abort ();
7976
7977 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7978 if (!i.base_reg)
7979 {
7980 i.sib.base = NO_BASE_REGISTER;
7981 i.sib.scale = i.log2_scale_factor;
7982 i.types[op].bitfield.disp8 = 0;
7983 i.types[op].bitfield.disp16 = 0;
7984 i.types[op].bitfield.disp64 = 0;
43083a50 7985 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7986 {
7987 /* Must be 32 bit */
7988 i.types[op].bitfield.disp32 = 1;
7989 i.types[op].bitfield.disp32s = 0;
7990 }
7991 else
7992 {
7993 i.types[op].bitfield.disp32 = 0;
7994 i.types[op].bitfield.disp32s = 1;
7995 }
7996 }
7997 i.sib.index = i.index_reg->reg_num;
a5aeccd9 7998 set_rex_vrex (i.index_reg, REX_X, FALSE);
6c30d220
L
7999 }
8000
29b0f896
AM
8001 default_seg = &ds;
8002
8003 if (i.base_reg == 0)
8004 {
8005 i.rm.mode = 0;
8006 if (!i.disp_operands)
9bb129e8 8007 fake_zero_displacement = 1;
29b0f896
AM
8008 if (i.index_reg == 0)
8009 {
73053c1f
JB
8010 i386_operand_type newdisp;
8011
6c30d220 8012 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 8013 /* Operand is just <disp> */
20f0a1fc 8014 if (flag_code == CODE_64BIT)
29b0f896
AM
8015 {
8016 /* 64bit mode overwrites the 32bit absolute
8017 addressing by RIP relative addressing and
8018 absolute addressing is encoded by one of the
8019 redundant SIB forms. */
8020 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8021 i.sib.base = NO_BASE_REGISTER;
8022 i.sib.index = NO_INDEX_REGISTER;
73053c1f 8023 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 8024 }
fc225355
L
8025 else if ((flag_code == CODE_16BIT)
8026 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8027 {
8028 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8029 newdisp = disp16;
20f0a1fc
NC
8030 }
8031 else
8032 {
8033 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8034 newdisp = disp32;
29b0f896 8035 }
73053c1f
JB
8036 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8037 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8038 }
6c30d220 8039 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 8040 {
6c30d220 8041 /* !i.base_reg && i.index_reg */
e968fc9b 8042 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8043 i.sib.index = NO_INDEX_REGISTER;
8044 else
8045 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8046 i.sib.base = NO_BASE_REGISTER;
8047 i.sib.scale = i.log2_scale_factor;
8048 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8049 i.types[op].bitfield.disp8 = 0;
8050 i.types[op].bitfield.disp16 = 0;
8051 i.types[op].bitfield.disp64 = 0;
43083a50 8052 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8053 {
8054 /* Must be 32 bit */
8055 i.types[op].bitfield.disp32 = 1;
8056 i.types[op].bitfield.disp32s = 0;
8057 }
29b0f896 8058 else
40fb9820
L
8059 {
8060 i.types[op].bitfield.disp32 = 0;
8061 i.types[op].bitfield.disp32s = 1;
8062 }
29b0f896 8063 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8064 i.rex |= REX_X;
29b0f896
AM
8065 }
8066 }
8067 /* RIP addressing for 64bit mode. */
e968fc9b 8068 else if (i.base_reg->reg_num == RegIP)
29b0f896 8069 {
6c30d220 8070 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 8071 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8072 i.types[op].bitfield.disp8 = 0;
8073 i.types[op].bitfield.disp16 = 0;
8074 i.types[op].bitfield.disp32 = 0;
8075 i.types[op].bitfield.disp32s = 1;
8076 i.types[op].bitfield.disp64 = 0;
71903a11 8077 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8078 if (! i.disp_operands)
8079 fake_zero_displacement = 1;
29b0f896 8080 }
dc821c5f 8081 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8082 {
6c30d220 8083 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8084 switch (i.base_reg->reg_num)
8085 {
8086 case 3: /* (%bx) */
8087 if (i.index_reg == 0)
8088 i.rm.regmem = 7;
8089 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8090 i.rm.regmem = i.index_reg->reg_num - 6;
8091 break;
8092 case 5: /* (%bp) */
8093 default_seg = &ss;
8094 if (i.index_reg == 0)
8095 {
8096 i.rm.regmem = 6;
40fb9820 8097 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8098 {
8099 /* fake (%bp) into 0(%bp) */
b5014f7a 8100 i.types[op].bitfield.disp8 = 1;
252b5132 8101 fake_zero_displacement = 1;
29b0f896
AM
8102 }
8103 }
8104 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8105 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8106 break;
8107 default: /* (%si) -> 4 or (%di) -> 5 */
8108 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8109 }
8110 i.rm.mode = mode_from_disp_size (i.types[op]);
8111 }
8112 else /* i.base_reg and 32/64 bit mode */
8113 {
8114 if (flag_code == CODE_64BIT
40fb9820
L
8115 && operand_type_check (i.types[op], disp))
8116 {
73053c1f
JB
8117 i.types[op].bitfield.disp16 = 0;
8118 i.types[op].bitfield.disp64 = 0;
40fb9820 8119 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8120 {
8121 i.types[op].bitfield.disp32 = 0;
8122 i.types[op].bitfield.disp32s = 1;
8123 }
40fb9820 8124 else
73053c1f
JB
8125 {
8126 i.types[op].bitfield.disp32 = 1;
8127 i.types[op].bitfield.disp32s = 0;
8128 }
40fb9820 8129 }
20f0a1fc 8130
6c30d220
L
8131 if (!i.tm.opcode_modifier.vecsib)
8132 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8133 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8134 i.rex |= REX_B;
29b0f896
AM
8135 i.sib.base = i.base_reg->reg_num;
8136 /* x86-64 ignores REX prefix bit here to avoid decoder
8137 complications. */
848930b2
JB
8138 if (!(i.base_reg->reg_flags & RegRex)
8139 && (i.base_reg->reg_num == EBP_REG_NUM
8140 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8141 default_seg = &ss;
848930b2 8142 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8143 {
848930b2 8144 fake_zero_displacement = 1;
b5014f7a 8145 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8146 }
8147 i.sib.scale = i.log2_scale_factor;
8148 if (i.index_reg == 0)
8149 {
6c30d220 8150 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8151 /* <disp>(%esp) becomes two byte modrm with no index
8152 register. We've already stored the code for esp
8153 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8154 Any base register besides %esp will not use the
8155 extra modrm byte. */
8156 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8157 }
6c30d220 8158 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 8159 {
e968fc9b 8160 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8161 i.sib.index = NO_INDEX_REGISTER;
8162 else
8163 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8164 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8165 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8166 i.rex |= REX_X;
29b0f896 8167 }
67a4f2b7
AO
8168
8169 if (i.disp_operands
8170 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8171 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8172 i.rm.mode = 0;
8173 else
a501d77e
L
8174 {
8175 if (!fake_zero_displacement
8176 && !i.disp_operands
8177 && i.disp_encoding)
8178 {
8179 fake_zero_displacement = 1;
8180 if (i.disp_encoding == disp_encoding_8bit)
8181 i.types[op].bitfield.disp8 = 1;
8182 else
8183 i.types[op].bitfield.disp32 = 1;
8184 }
8185 i.rm.mode = mode_from_disp_size (i.types[op]);
8186 }
29b0f896 8187 }
252b5132 8188
29b0f896
AM
8189 if (fake_zero_displacement)
8190 {
8191 /* Fakes a zero displacement assuming that i.types[op]
8192 holds the correct displacement size. */
8193 expressionS *exp;
8194
9c2799c2 8195 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8196 exp = &disp_expressions[i.disp_operands++];
8197 i.op[op].disps = exp;
8198 exp->X_op = O_constant;
8199 exp->X_add_number = 0;
8200 exp->X_add_symbol = (symbolS *) 0;
8201 exp->X_op_symbol = (symbolS *) 0;
8202 }
c0f3af97
L
8203
8204 mem = op;
29b0f896 8205 }
c0f3af97
L
8206 else
8207 mem = ~0;
252b5132 8208
8c43a48b 8209 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8210 {
8211 if (operand_type_check (i.types[0], imm))
8212 i.vex.register_specifier = NULL;
8213 else
8214 {
8215 /* VEX.vvvv encodes one of the sources when the first
8216 operand is not an immediate. */
1ef99a7b 8217 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8218 i.vex.register_specifier = i.op[0].regs;
8219 else
8220 i.vex.register_specifier = i.op[1].regs;
8221 }
8222
8223 /* Destination is a XMM register encoded in the ModRM.reg
8224 and VEX.R bit. */
8225 i.rm.reg = i.op[2].regs->reg_num;
8226 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8227 i.rex |= REX_R;
8228
8229 /* ModRM.rm and VEX.B encodes the other source. */
8230 if (!i.mem_operands)
8231 {
8232 i.rm.mode = 3;
8233
1ef99a7b 8234 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8235 i.rm.regmem = i.op[1].regs->reg_num;
8236 else
8237 i.rm.regmem = i.op[0].regs->reg_num;
8238
8239 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8240 i.rex |= REX_B;
8241 }
8242 }
2426c15f 8243 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8244 {
8245 i.vex.register_specifier = i.op[2].regs;
8246 if (!i.mem_operands)
8247 {
8248 i.rm.mode = 3;
8249 i.rm.regmem = i.op[1].regs->reg_num;
8250 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8251 i.rex |= REX_B;
8252 }
8253 }
29b0f896
AM
8254 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8255 (if any) based on i.tm.extension_opcode. Again, we must be
8256 careful to make sure that segment/control/debug/test/MMX
8257 registers are coded into the i.rm.reg field. */
f88c9eb0 8258 else if (i.reg_operands)
29b0f896 8259 {
99018f42 8260 unsigned int op;
7ab9ffdd
L
8261 unsigned int vex_reg = ~0;
8262
8263 for (op = 0; op < i.operands; op++)
b4a3a7b4 8264 {
bab6aec1 8265 if (i.types[op].bitfield.class == Reg
f74a6307
JB
8266 || i.types[op].bitfield.class == RegBND
8267 || i.types[op].bitfield.class == RegMask
00cee14f 8268 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
8269 || i.types[op].bitfield.class == RegCR
8270 || i.types[op].bitfield.class == RegDR
8271 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 8272 break;
3528c362 8273 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
8274 {
8275 if (i.types[op].bitfield.zmmword)
8276 i.has_regzmm = TRUE;
8277 else if (i.types[op].bitfield.ymmword)
8278 i.has_regymm = TRUE;
8279 else
8280 i.has_regxmm = TRUE;
8281 break;
8282 }
3528c362 8283 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
8284 {
8285 i.has_regmmx = TRUE;
8286 break;
8287 }
8288 }
c0209578 8289
7ab9ffdd
L
8290 if (vex_3_sources)
8291 op = dest;
2426c15f 8292 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8293 {
8294 /* For instructions with VexNDS, the register-only
8295 source operand is encoded in VEX prefix. */
8296 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8297
7ab9ffdd 8298 if (op > mem)
c0f3af97 8299 {
7ab9ffdd
L
8300 vex_reg = op++;
8301 gas_assert (op < i.operands);
c0f3af97
L
8302 }
8303 else
c0f3af97 8304 {
f12dc422
L
8305 /* Check register-only source operand when two source
8306 operands are swapped. */
8307 if (!i.tm.operand_types[op].bitfield.baseindex
8308 && i.tm.operand_types[op + 1].bitfield.baseindex)
8309 {
8310 vex_reg = op;
8311 op += 2;
8312 gas_assert (mem == (vex_reg + 1)
8313 && op < i.operands);
8314 }
8315 else
8316 {
8317 vex_reg = op + 1;
8318 gas_assert (vex_reg < i.operands);
8319 }
c0f3af97 8320 }
7ab9ffdd 8321 }
2426c15f 8322 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8323 {
f12dc422 8324 /* For instructions with VexNDD, the register destination
7ab9ffdd 8325 is encoded in VEX prefix. */
f12dc422
L
8326 if (i.mem_operands == 0)
8327 {
8328 /* There is no memory operand. */
8329 gas_assert ((op + 2) == i.operands);
8330 vex_reg = op + 1;
8331 }
8332 else
8d63c93e 8333 {
ed438a93
JB
8334 /* There are only 2 non-immediate operands. */
8335 gas_assert (op < i.imm_operands + 2
8336 && i.operands == i.imm_operands + 2);
8337 vex_reg = i.imm_operands + 1;
f12dc422 8338 }
7ab9ffdd
L
8339 }
8340 else
8341 gas_assert (op < i.operands);
99018f42 8342
7ab9ffdd
L
8343 if (vex_reg != (unsigned int) ~0)
8344 {
f12dc422 8345 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8346
bab6aec1 8347 if ((type->bitfield.class != Reg
dc821c5f 8348 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8349 && type->bitfield.class != RegSIMD
43234a1e 8350 && !operand_type_equal (type, &regmask))
7ab9ffdd 8351 abort ();
f88c9eb0 8352
7ab9ffdd
L
8353 i.vex.register_specifier = i.op[vex_reg].regs;
8354 }
8355
1b9f0c97
L
8356 /* Don't set OP operand twice. */
8357 if (vex_reg != op)
7ab9ffdd 8358 {
1b9f0c97
L
8359 /* If there is an extension opcode to put here, the
8360 register number must be put into the regmem field. */
8361 if (i.tm.extension_opcode != None)
8362 {
8363 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8364 set_rex_vrex (i.op[op].regs, REX_B,
8365 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8366 }
8367 else
8368 {
8369 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8370 set_rex_vrex (i.op[op].regs, REX_R,
8371 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8372 }
7ab9ffdd 8373 }
252b5132 8374
29b0f896
AM
8375 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8376 must set it to 3 to indicate this is a register operand
8377 in the regmem field. */
8378 if (!i.mem_operands)
8379 i.rm.mode = 3;
8380 }
252b5132 8381
29b0f896 8382 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8383 if (i.tm.extension_opcode != None)
29b0f896
AM
8384 i.rm.reg = i.tm.extension_opcode;
8385 }
8386 return default_seg;
8387}
252b5132 8388
376cd056
JB
8389static unsigned int
8390flip_code16 (unsigned int code16)
8391{
8392 gas_assert (i.tm.operands == 1);
8393
8394 return !(i.prefix[REX_PREFIX] & REX_W)
8395 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8396 || i.tm.operand_types[0].bitfield.disp32s
8397 : i.tm.operand_types[0].bitfield.disp16)
8398 ? CODE16 : 0;
8399}
8400
29b0f896 8401static void
e3bb37b5 8402output_branch (void)
29b0f896
AM
8403{
8404 char *p;
f8a5c266 8405 int size;
29b0f896
AM
8406 int code16;
8407 int prefix;
8408 relax_substateT subtype;
8409 symbolS *sym;
8410 offsetT off;
8411
f8a5c266 8412 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8413 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8414
8415 prefix = 0;
8416 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8417 {
29b0f896
AM
8418 prefix = 1;
8419 i.prefixes -= 1;
376cd056 8420 code16 ^= flip_code16(code16);
252b5132 8421 }
29b0f896
AM
8422 /* Pentium4 branch hints. */
8423 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8424 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8425 {
29b0f896
AM
8426 prefix++;
8427 i.prefixes--;
8428 }
8429 if (i.prefix[REX_PREFIX] != 0)
8430 {
8431 prefix++;
8432 i.prefixes--;
2f66722d
AM
8433 }
8434
7e8b059b
L
8435 /* BND prefixed jump. */
8436 if (i.prefix[BND_PREFIX] != 0)
8437 {
6cb0a70e
JB
8438 prefix++;
8439 i.prefixes--;
7e8b059b
L
8440 }
8441
f2810fe0
JB
8442 if (i.prefixes != 0)
8443 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8444
8445 /* It's always a symbol; End frag & setup for relax.
8446 Make sure there is enough room in this frag for the largest
8447 instruction we may generate in md_convert_frag. This is 2
8448 bytes for the opcode and room for the prefix and largest
8449 displacement. */
8450 frag_grow (prefix + 2 + 4);
8451 /* Prefix and 1 opcode byte go in fr_fix. */
8452 p = frag_more (prefix + 1);
8453 if (i.prefix[DATA_PREFIX] != 0)
8454 *p++ = DATA_PREFIX_OPCODE;
8455 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8456 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8457 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8458 if (i.prefix[BND_PREFIX] != 0)
8459 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8460 if (i.prefix[REX_PREFIX] != 0)
8461 *p++ = i.prefix[REX_PREFIX];
8462 *p = i.tm.base_opcode;
8463
8464 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8465 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8466 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8467 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8468 else
f8a5c266 8469 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8470 subtype |= code16;
3e73aa7c 8471
29b0f896
AM
8472 sym = i.op[0].disps->X_add_symbol;
8473 off = i.op[0].disps->X_add_number;
3e73aa7c 8474
29b0f896
AM
8475 if (i.op[0].disps->X_op != O_constant
8476 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8477 {
29b0f896
AM
8478 /* Handle complex expressions. */
8479 sym = make_expr_symbol (i.op[0].disps);
8480 off = 0;
8481 }
3e73aa7c 8482
29b0f896
AM
8483 /* 1 possible extra opcode + 4 byte displacement go in var part.
8484 Pass reloc in fr_var. */
d258b828 8485 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8486}
3e73aa7c 8487
bd7ab16b
L
8488#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8489/* Return TRUE iff PLT32 relocation should be used for branching to
8490 symbol S. */
8491
8492static bfd_boolean
8493need_plt32_p (symbolS *s)
8494{
8495 /* PLT32 relocation is ELF only. */
8496 if (!IS_ELF)
8497 return FALSE;
8498
a5def729
RO
8499#ifdef TE_SOLARIS
8500 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8501 krtld support it. */
8502 return FALSE;
8503#endif
8504
bd7ab16b
L
8505 /* Since there is no need to prepare for PLT branch on x86-64, we
8506 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8507 be used as a marker for 32-bit PC-relative branches. */
8508 if (!object_64bit)
8509 return FALSE;
8510
8511 /* Weak or undefined symbol need PLT32 relocation. */
8512 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8513 return TRUE;
8514
8515 /* Non-global symbol doesn't need PLT32 relocation. */
8516 if (! S_IS_EXTERNAL (s))
8517 return FALSE;
8518
8519 /* Other global symbols need PLT32 relocation. NB: Symbol with
8520 non-default visibilities are treated as normal global symbol
8521 so that PLT32 relocation can be used as a marker for 32-bit
8522 PC-relative branches. It is useful for linker relaxation. */
8523 return TRUE;
8524}
8525#endif
8526
29b0f896 8527static void
e3bb37b5 8528output_jump (void)
29b0f896
AM
8529{
8530 char *p;
8531 int size;
3e02c1cc 8532 fixS *fixP;
bd7ab16b 8533 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8534
0cfa3eb3 8535 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8536 {
8537 /* This is a loop or jecxz type instruction. */
8538 size = 1;
8539 if (i.prefix[ADDR_PREFIX] != 0)
8540 {
8541 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
8542 i.prefixes -= 1;
8543 }
8544 /* Pentium4 branch hints. */
8545 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8546 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8547 {
8548 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
8549 i.prefixes--;
3e73aa7c
JH
8550 }
8551 }
29b0f896
AM
8552 else
8553 {
8554 int code16;
3e73aa7c 8555
29b0f896
AM
8556 code16 = 0;
8557 if (flag_code == CODE_16BIT)
8558 code16 = CODE16;
3e73aa7c 8559
29b0f896
AM
8560 if (i.prefix[DATA_PREFIX] != 0)
8561 {
8562 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
8563 i.prefixes -= 1;
376cd056 8564 code16 ^= flip_code16(code16);
29b0f896 8565 }
252b5132 8566
29b0f896
AM
8567 size = 4;
8568 if (code16)
8569 size = 2;
8570 }
9fcc94b6 8571
6cb0a70e
JB
8572 /* BND prefixed jump. */
8573 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8574 {
6cb0a70e 8575 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
29b0f896
AM
8576 i.prefixes -= 1;
8577 }
252b5132 8578
6cb0a70e 8579 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8580 {
6cb0a70e 8581 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7e8b059b
L
8582 i.prefixes -= 1;
8583 }
8584
f2810fe0
JB
8585 if (i.prefixes != 0)
8586 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8587
42164a71
L
8588 p = frag_more (i.tm.opcode_length + size);
8589 switch (i.tm.opcode_length)
8590 {
8591 case 2:
8592 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8593 /* Fall through. */
42164a71
L
8594 case 1:
8595 *p++ = i.tm.base_opcode;
8596 break;
8597 default:
8598 abort ();
8599 }
e0890092 8600
bd7ab16b
L
8601#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8602 if (size == 4
8603 && jump_reloc == NO_RELOC
8604 && need_plt32_p (i.op[0].disps->X_add_symbol))
8605 jump_reloc = BFD_RELOC_X86_64_PLT32;
8606#endif
8607
8608 jump_reloc = reloc (size, 1, 1, jump_reloc);
8609
3e02c1cc 8610 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8611 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8612
8613 /* All jumps handled here are signed, but don't use a signed limit
8614 check for 32 and 16 bit jumps as we want to allow wrap around at
8615 4G and 64k respectively. */
8616 if (size == 1)
8617 fixP->fx_signed = 1;
29b0f896 8618}
e0890092 8619
29b0f896 8620static void
e3bb37b5 8621output_interseg_jump (void)
29b0f896
AM
8622{
8623 char *p;
8624 int size;
8625 int prefix;
8626 int code16;
252b5132 8627
29b0f896
AM
8628 code16 = 0;
8629 if (flag_code == CODE_16BIT)
8630 code16 = CODE16;
a217f122 8631
29b0f896
AM
8632 prefix = 0;
8633 if (i.prefix[DATA_PREFIX] != 0)
8634 {
8635 prefix = 1;
8636 i.prefixes -= 1;
8637 code16 ^= CODE16;
8638 }
6cb0a70e
JB
8639
8640 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8641
29b0f896
AM
8642 size = 4;
8643 if (code16)
8644 size = 2;
252b5132 8645
f2810fe0
JB
8646 if (i.prefixes != 0)
8647 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8648
29b0f896
AM
8649 /* 1 opcode; 2 segment; offset */
8650 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8651
29b0f896
AM
8652 if (i.prefix[DATA_PREFIX] != 0)
8653 *p++ = DATA_PREFIX_OPCODE;
252b5132 8654
29b0f896
AM
8655 if (i.prefix[REX_PREFIX] != 0)
8656 *p++ = i.prefix[REX_PREFIX];
252b5132 8657
29b0f896
AM
8658 *p++ = i.tm.base_opcode;
8659 if (i.op[1].imms->X_op == O_constant)
8660 {
8661 offsetT n = i.op[1].imms->X_add_number;
252b5132 8662
29b0f896
AM
8663 if (size == 2
8664 && !fits_in_unsigned_word (n)
8665 && !fits_in_signed_word (n))
8666 {
8667 as_bad (_("16-bit jump out of range"));
8668 return;
8669 }
8670 md_number_to_chars (p, n, size);
8671 }
8672 else
8673 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8674 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8675 if (i.op[0].imms->X_op != O_constant)
8676 as_bad (_("can't handle non absolute segment in `%s'"),
8677 i.tm.name);
8678 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8679}
a217f122 8680
b4a3a7b4
L
8681#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8682void
8683x86_cleanup (void)
8684{
8685 char *p;
8686 asection *seg = now_seg;
8687 subsegT subseg = now_subseg;
8688 asection *sec;
8689 unsigned int alignment, align_size_1;
8690 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8691 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8692 unsigned int padding;
8693
8694 if (!IS_ELF || !x86_used_note)
8695 return;
8696
b4a3a7b4
L
8697 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8698
8699 /* The .note.gnu.property section layout:
8700
8701 Field Length Contents
8702 ---- ---- ----
8703 n_namsz 4 4
8704 n_descsz 4 The note descriptor size
8705 n_type 4 NT_GNU_PROPERTY_TYPE_0
8706 n_name 4 "GNU"
8707 n_desc n_descsz The program property array
8708 .... .... ....
8709 */
8710
8711 /* Create the .note.gnu.property section. */
8712 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8713 bfd_set_section_flags (sec,
b4a3a7b4
L
8714 (SEC_ALLOC
8715 | SEC_LOAD
8716 | SEC_DATA
8717 | SEC_HAS_CONTENTS
8718 | SEC_READONLY));
8719
8720 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8721 {
8722 align_size_1 = 7;
8723 alignment = 3;
8724 }
8725 else
8726 {
8727 align_size_1 = 3;
8728 alignment = 2;
8729 }
8730
fd361982 8731 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8732 elf_section_type (sec) = SHT_NOTE;
8733
8734 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8735 + 4-byte data */
8736 isa_1_descsz_raw = 4 + 4 + 4;
8737 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8738 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8739
8740 feature_2_descsz_raw = isa_1_descsz;
8741 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8742 + 4-byte data */
8743 feature_2_descsz_raw += 4 + 4 + 4;
8744 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8745 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8746 & ~align_size_1);
8747
8748 descsz = feature_2_descsz;
8749 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8750 p = frag_more (4 + 4 + 4 + 4 + descsz);
8751
8752 /* Write n_namsz. */
8753 md_number_to_chars (p, (valueT) 4, 4);
8754
8755 /* Write n_descsz. */
8756 md_number_to_chars (p + 4, (valueT) descsz, 4);
8757
8758 /* Write n_type. */
8759 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8760
8761 /* Write n_name. */
8762 memcpy (p + 4 * 3, "GNU", 4);
8763
8764 /* Write 4-byte type. */
8765 md_number_to_chars (p + 4 * 4,
8766 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8767
8768 /* Write 4-byte data size. */
8769 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8770
8771 /* Write 4-byte data. */
8772 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8773
8774 /* Zero out paddings. */
8775 padding = isa_1_descsz - isa_1_descsz_raw;
8776 if (padding)
8777 memset (p + 4 * 7, 0, padding);
8778
8779 /* Write 4-byte type. */
8780 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8781 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8782
8783 /* Write 4-byte data size. */
8784 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8785
8786 /* Write 4-byte data. */
8787 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8788 (valueT) x86_feature_2_used, 4);
8789
8790 /* Zero out paddings. */
8791 padding = feature_2_descsz - feature_2_descsz_raw;
8792 if (padding)
8793 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8794
8795 /* We probably can't restore the current segment, for there likely
8796 isn't one yet... */
8797 if (seg && subseg)
8798 subseg_set (seg, subseg);
8799}
8800#endif
8801
9c33702b
JB
8802static unsigned int
8803encoding_length (const fragS *start_frag, offsetT start_off,
8804 const char *frag_now_ptr)
8805{
8806 unsigned int len = 0;
8807
8808 if (start_frag != frag_now)
8809 {
8810 const fragS *fr = start_frag;
8811
8812 do {
8813 len += fr->fr_fix;
8814 fr = fr->fr_next;
8815 } while (fr && fr != frag_now);
8816 }
8817
8818 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8819}
8820
e379e5f3 8821/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8822 be macro-fused with conditional jumps.
8823 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8824 or is one of the following format:
8825
8826 cmp m, imm
8827 add m, imm
8828 sub m, imm
8829 test m, imm
8830 and m, imm
8831 inc m
8832 dec m
8833
8834 it is unfusible. */
e379e5f3
L
8835
8836static int
79d72f45 8837maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8838{
8839 /* No RIP address. */
8840 if (i.base_reg && i.base_reg->reg_num == RegIP)
8841 return 0;
8842
8843 /* No VEX/EVEX encoding. */
8844 if (is_any_vex_encoding (&i.tm))
8845 return 0;
8846
79d72f45
HL
8847 /* add, sub without add/sub m, imm. */
8848 if (i.tm.base_opcode <= 5
e379e5f3
L
8849 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8850 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8851 && (i.tm.extension_opcode == 0x5
e379e5f3 8852 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8853 {
8854 *mf_cmp_p = mf_cmp_alu_cmp;
8855 return !(i.mem_operands && i.imm_operands);
8856 }
e379e5f3 8857
79d72f45
HL
8858 /* and without and m, imm. */
8859 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8860 || ((i.tm.base_opcode | 3) == 0x83
8861 && i.tm.extension_opcode == 0x4))
8862 {
8863 *mf_cmp_p = mf_cmp_test_and;
8864 return !(i.mem_operands && i.imm_operands);
8865 }
8866
8867 /* test without test m imm. */
e379e5f3
L
8868 if ((i.tm.base_opcode | 1) == 0x85
8869 || (i.tm.base_opcode | 1) == 0xa9
8870 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8871 && i.tm.extension_opcode == 0))
8872 {
8873 *mf_cmp_p = mf_cmp_test_and;
8874 return !(i.mem_operands && i.imm_operands);
8875 }
8876
8877 /* cmp without cmp m, imm. */
8878 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8879 || ((i.tm.base_opcode | 3) == 0x83
8880 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8881 {
8882 *mf_cmp_p = mf_cmp_alu_cmp;
8883 return !(i.mem_operands && i.imm_operands);
8884 }
e379e5f3 8885
79d72f45 8886 /* inc, dec without inc/dec m. */
e379e5f3
L
8887 if ((i.tm.cpu_flags.bitfield.cpuno64
8888 && (i.tm.base_opcode | 0xf) == 0x4f)
8889 || ((i.tm.base_opcode | 1) == 0xff
8890 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8891 {
8892 *mf_cmp_p = mf_cmp_incdec;
8893 return !i.mem_operands;
8894 }
e379e5f3
L
8895
8896 return 0;
8897}
8898
8899/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8900
8901static int
79d72f45 8902add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8903{
8904 /* NB: Don't work with COND_JUMP86 without i386. */
8905 if (!align_branch_power
8906 || now_seg == absolute_section
8907 || !cpu_arch_flags.bitfield.cpui386
8908 || !(align_branch & align_branch_fused_bit))
8909 return 0;
8910
79d72f45 8911 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
8912 {
8913 if (last_insn.kind == last_insn_other
8914 || last_insn.seg != now_seg)
8915 return 1;
8916 if (flag_debug)
8917 as_warn_where (last_insn.file, last_insn.line,
8918 _("`%s` skips -malign-branch-boundary on `%s`"),
8919 last_insn.name, i.tm.name);
8920 }
8921
8922 return 0;
8923}
8924
8925/* Return 1 if a BRANCH_PREFIX frag should be generated. */
8926
8927static int
8928add_branch_prefix_frag_p (void)
8929{
8930 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
8931 to PadLock instructions since they include prefixes in opcode. */
8932 if (!align_branch_power
8933 || !align_branch_prefix_size
8934 || now_seg == absolute_section
8935 || i.tm.cpu_flags.bitfield.cpupadlock
8936 || !cpu_arch_flags.bitfield.cpui386)
8937 return 0;
8938
8939 /* Don't add prefix if it is a prefix or there is no operand in case
8940 that segment prefix is special. */
8941 if (!i.operands || i.tm.opcode_modifier.isprefix)
8942 return 0;
8943
8944 if (last_insn.kind == last_insn_other
8945 || last_insn.seg != now_seg)
8946 return 1;
8947
8948 if (flag_debug)
8949 as_warn_where (last_insn.file, last_insn.line,
8950 _("`%s` skips -malign-branch-boundary on `%s`"),
8951 last_insn.name, i.tm.name);
8952
8953 return 0;
8954}
8955
8956/* Return 1 if a BRANCH_PADDING frag should be generated. */
8957
8958static int
79d72f45
HL
8959add_branch_padding_frag_p (enum align_branch_kind *branch_p,
8960 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
8961{
8962 int add_padding;
8963
8964 /* NB: Don't work with COND_JUMP86 without i386. */
8965 if (!align_branch_power
8966 || now_seg == absolute_section
8967 || !cpu_arch_flags.bitfield.cpui386)
8968 return 0;
8969
8970 add_padding = 0;
8971
8972 /* Check for jcc and direct jmp. */
8973 if (i.tm.opcode_modifier.jump == JUMP)
8974 {
8975 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
8976 {
8977 *branch_p = align_branch_jmp;
8978 add_padding = align_branch & align_branch_jmp_bit;
8979 }
8980 else
8981 {
79d72f45
HL
8982 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
8983 igore the lowest bit. */
8984 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
8985 *branch_p = align_branch_jcc;
8986 if ((align_branch & align_branch_jcc_bit))
8987 add_padding = 1;
8988 }
8989 }
8990 else if (is_any_vex_encoding (&i.tm))
8991 return 0;
8992 else if ((i.tm.base_opcode | 1) == 0xc3)
8993 {
8994 /* Near ret. */
8995 *branch_p = align_branch_ret;
8996 if ((align_branch & align_branch_ret_bit))
8997 add_padding = 1;
8998 }
8999 else
9000 {
9001 /* Check for indirect jmp, direct and indirect calls. */
9002 if (i.tm.base_opcode == 0xe8)
9003 {
9004 /* Direct call. */
9005 *branch_p = align_branch_call;
9006 if ((align_branch & align_branch_call_bit))
9007 add_padding = 1;
9008 }
9009 else if (i.tm.base_opcode == 0xff
9010 && (i.tm.extension_opcode == 2
9011 || i.tm.extension_opcode == 4))
9012 {
9013 /* Indirect call and jmp. */
9014 *branch_p = align_branch_indirect;
9015 if ((align_branch & align_branch_indirect_bit))
9016 add_padding = 1;
9017 }
9018
9019 if (add_padding
9020 && i.disp_operands
9021 && tls_get_addr
9022 && (i.op[0].disps->X_op == O_symbol
9023 || (i.op[0].disps->X_op == O_subtract
9024 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9025 {
9026 symbolS *s = i.op[0].disps->X_add_symbol;
9027 /* No padding to call to global or undefined tls_get_addr. */
9028 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9029 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9030 return 0;
9031 }
9032 }
9033
9034 if (add_padding
9035 && last_insn.kind != last_insn_other
9036 && last_insn.seg == now_seg)
9037 {
9038 if (flag_debug)
9039 as_warn_where (last_insn.file, last_insn.line,
9040 _("`%s` skips -malign-branch-boundary on `%s`"),
9041 last_insn.name, i.tm.name);
9042 return 0;
9043 }
9044
9045 return add_padding;
9046}
9047
29b0f896 9048static void
e3bb37b5 9049output_insn (void)
29b0f896 9050{
2bbd9c25
JJ
9051 fragS *insn_start_frag;
9052 offsetT insn_start_off;
e379e5f3
L
9053 fragS *fragP = NULL;
9054 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9055 /* The initializer is arbitrary just to avoid uninitialized error.
9056 it's actually either assigned in add_branch_padding_frag_p
9057 or never be used. */
9058 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9059
b4a3a7b4
L
9060#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9061 if (IS_ELF && x86_used_note)
9062 {
9063 if (i.tm.cpu_flags.bitfield.cpucmov)
9064 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
9065 if (i.tm.cpu_flags.bitfield.cpusse)
9066 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
9067 if (i.tm.cpu_flags.bitfield.cpusse2)
9068 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
9069 if (i.tm.cpu_flags.bitfield.cpusse3)
9070 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
9071 if (i.tm.cpu_flags.bitfield.cpussse3)
9072 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
9073 if (i.tm.cpu_flags.bitfield.cpusse4_1)
9074 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
9075 if (i.tm.cpu_flags.bitfield.cpusse4_2)
9076 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
9077 if (i.tm.cpu_flags.bitfield.cpuavx)
9078 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
9079 if (i.tm.cpu_flags.bitfield.cpuavx2)
9080 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
9081 if (i.tm.cpu_flags.bitfield.cpufma)
9082 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
9083 if (i.tm.cpu_flags.bitfield.cpuavx512f)
9084 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
9085 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
9086 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
9087 if (i.tm.cpu_flags.bitfield.cpuavx512er)
9088 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
9089 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
9090 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
9091 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
9092 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
9093 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
9094 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
9095 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
9096 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
9097 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
9098 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
9099 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
9100 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
9101 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
9102 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
9103 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
9104 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
9105 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
9106 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
9107 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
9108 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
9109 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
9110 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
9111 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
9112 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
9113
9114 if (i.tm.cpu_flags.bitfield.cpu8087
9115 || i.tm.cpu_flags.bitfield.cpu287
9116 || i.tm.cpu_flags.bitfield.cpu387
9117 || i.tm.cpu_flags.bitfield.cpu687
9118 || i.tm.cpu_flags.bitfield.cpufisttp)
9119 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
319ff62c
JB
9120 if (i.has_regmmx
9121 || i.tm.base_opcode == 0xf77 /* emms */
a7e12755
L
9122 || i.tm.base_opcode == 0xf0e /* femms */
9123 || i.tm.base_opcode == 0xf2a /* cvtpi2ps */
9124 || i.tm.base_opcode == 0x660f2a /* cvtpi2pd */)
b4a3a7b4
L
9125 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
9126 if (i.has_regxmm)
9127 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
9128 if (i.has_regymm)
9129 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
9130 if (i.has_regzmm)
9131 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
9132 if (i.tm.cpu_flags.bitfield.cpufxsr)
9133 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9134 if (i.tm.cpu_flags.bitfield.cpuxsave)
9135 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9136 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9137 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9138 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9139 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
9140 }
9141#endif
9142
29b0f896
AM
9143 /* Tie dwarf2 debug info to the address at the start of the insn.
9144 We can't do this after the insn has been output as the current
9145 frag may have been closed off. eg. by frag_var. */
9146 dwarf2_emit_insn (0);
9147
2bbd9c25
JJ
9148 insn_start_frag = frag_now;
9149 insn_start_off = frag_now_fix ();
9150
79d72f45 9151 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9152 {
9153 char *p;
9154 /* Branch can be 8 bytes. Leave some room for prefixes. */
9155 unsigned int max_branch_padding_size = 14;
9156
9157 /* Align section to boundary. */
9158 record_alignment (now_seg, align_branch_power);
9159
9160 /* Make room for padding. */
9161 frag_grow (max_branch_padding_size);
9162
9163 /* Start of the padding. */
9164 p = frag_more (0);
9165
9166 fragP = frag_now;
9167
9168 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9169 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9170 NULL, 0, p);
9171
79d72f45 9172 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9173 fragP->tc_frag_data.branch_type = branch;
9174 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9175 }
9176
29b0f896 9177 /* Output jumps. */
0cfa3eb3 9178 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9179 output_branch ();
0cfa3eb3
JB
9180 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9181 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9182 output_jump ();
0cfa3eb3 9183 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9184 output_interseg_jump ();
9185 else
9186 {
9187 /* Output normal instructions here. */
9188 char *p;
9189 unsigned char *q;
47465058 9190 unsigned int j;
331d2d0d 9191 unsigned int prefix;
79d72f45 9192 enum mf_cmp_kind mf_cmp;
4dffcebc 9193
e4e00185 9194 if (avoid_fence
c3949f43
JB
9195 && (i.tm.base_opcode == 0xfaee8
9196 || i.tm.base_opcode == 0xfaef0
9197 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
9198 {
9199 /* Encode lfence, mfence, and sfence as
9200 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9201 offsetT val = 0x240483f0ULL;
9202 p = frag_more (5);
9203 md_number_to_chars (p, val, 5);
9204 return;
9205 }
9206
d022bddd
IT
9207 /* Some processors fail on LOCK prefix. This options makes
9208 assembler ignore LOCK prefix and serves as a workaround. */
9209 if (omit_lock_prefix)
9210 {
9211 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9212 return;
9213 i.prefix[LOCK_PREFIX] = 0;
9214 }
9215
e379e5f3
L
9216 if (branch)
9217 /* Skip if this is a branch. */
9218 ;
79d72f45 9219 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9220 {
9221 /* Make room for padding. */
9222 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9223 p = frag_more (0);
9224
9225 fragP = frag_now;
9226
9227 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9228 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9229 NULL, 0, p);
9230
79d72f45 9231 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9232 fragP->tc_frag_data.branch_type = align_branch_fused;
9233 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9234 }
9235 else if (add_branch_prefix_frag_p ())
9236 {
9237 unsigned int max_prefix_size = align_branch_prefix_size;
9238
9239 /* Make room for padding. */
9240 frag_grow (max_prefix_size);
9241 p = frag_more (0);
9242
9243 fragP = frag_now;
9244
9245 frag_var (rs_machine_dependent, max_prefix_size, 0,
9246 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9247 NULL, 0, p);
9248
9249 fragP->tc_frag_data.max_bytes = max_prefix_size;
9250 }
9251
43234a1e
L
9252 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9253 don't need the explicit prefix. */
9254 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9255 {
c0f3af97 9256 switch (i.tm.opcode_length)
bc4bd9ab 9257 {
c0f3af97
L
9258 case 3:
9259 if (i.tm.base_opcode & 0xff000000)
4dffcebc 9260 {
c0f3af97 9261 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
9262 if (!i.tm.cpu_flags.bitfield.cpupadlock
9263 || prefix != REPE_PREFIX_OPCODE
9264 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9265 add_prefix (prefix);
c0f3af97
L
9266 }
9267 break;
9268 case 2:
9269 if ((i.tm.base_opcode & 0xff0000) != 0)
9270 {
9271 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 9272 add_prefix (prefix);
4dffcebc 9273 }
c0f3af97
L
9274 break;
9275 case 1:
9276 break;
390c91cf
L
9277 case 0:
9278 /* Check for pseudo prefixes. */
9279 as_bad_where (insn_start_frag->fr_file,
9280 insn_start_frag->fr_line,
9281 _("pseudo prefix without instruction"));
9282 return;
c0f3af97
L
9283 default:
9284 abort ();
bc4bd9ab 9285 }
c0f3af97 9286
6d19a37a 9287#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9288 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9289 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9290 perform IE->LE optimization. A dummy REX_OPCODE prefix
9291 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9292 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9293 if (x86_elf_abi == X86_64_X32_ABI
9294 && i.operands == 2
14470f07
L
9295 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9296 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9297 && i.prefix[REX_PREFIX] == 0)
9298 add_prefix (REX_OPCODE);
6d19a37a 9299#endif
cf61b747 9300
c0f3af97
L
9301 /* The prefix bytes. */
9302 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9303 if (*q)
9304 FRAG_APPEND_1_CHAR (*q);
0f10071e 9305 }
ae5c1c7b 9306 else
c0f3af97
L
9307 {
9308 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9309 if (*q)
9310 switch (j)
9311 {
c0f3af97
L
9312 case SEG_PREFIX:
9313 case ADDR_PREFIX:
9314 FRAG_APPEND_1_CHAR (*q);
9315 break;
9316 default:
9317 /* There should be no other prefixes for instructions
9318 with VEX prefix. */
9319 abort ();
9320 }
9321
43234a1e
L
9322 /* For EVEX instructions i.vrex should become 0 after
9323 build_evex_prefix. For VEX instructions upper 16 registers
9324 aren't available, so VREX should be 0. */
9325 if (i.vrex)
9326 abort ();
c0f3af97
L
9327 /* Now the VEX prefix. */
9328 p = frag_more (i.vex.length);
9329 for (j = 0; j < i.vex.length; j++)
9330 p[j] = i.vex.bytes[j];
9331 }
252b5132 9332
29b0f896 9333 /* Now the opcode; be careful about word order here! */
4dffcebc 9334 if (i.tm.opcode_length == 1)
29b0f896
AM
9335 {
9336 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9337 }
9338 else
9339 {
4dffcebc 9340 switch (i.tm.opcode_length)
331d2d0d 9341 {
43234a1e
L
9342 case 4:
9343 p = frag_more (4);
9344 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9345 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9346 break;
4dffcebc 9347 case 3:
331d2d0d
L
9348 p = frag_more (3);
9349 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9350 break;
9351 case 2:
9352 p = frag_more (2);
9353 break;
9354 default:
9355 abort ();
9356 break;
331d2d0d 9357 }
0f10071e 9358
29b0f896
AM
9359 /* Put out high byte first: can't use md_number_to_chars! */
9360 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9361 *p = i.tm.base_opcode & 0xff;
9362 }
3e73aa7c 9363
29b0f896 9364 /* Now the modrm byte and sib byte (if present). */
40fb9820 9365 if (i.tm.opcode_modifier.modrm)
29b0f896 9366 {
4a3523fa
L
9367 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
9368 | i.rm.reg << 3
9369 | i.rm.mode << 6));
29b0f896
AM
9370 /* If i.rm.regmem == ESP (4)
9371 && i.rm.mode != (Register mode)
9372 && not 16 bit
9373 ==> need second modrm byte. */
9374 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9375 && i.rm.mode != 3
dc821c5f 9376 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
9377 FRAG_APPEND_1_CHAR ((i.sib.base << 0
9378 | i.sib.index << 3
9379 | i.sib.scale << 6));
29b0f896 9380 }
3e73aa7c 9381
29b0f896 9382 if (i.disp_operands)
2bbd9c25 9383 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9384
29b0f896 9385 if (i.imm_operands)
2bbd9c25 9386 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9387
9388 /*
9389 * frag_now_fix () returning plain abs_section_offset when we're in the
9390 * absolute section, and abs_section_offset not getting updated as data
9391 * gets added to the frag breaks the logic below.
9392 */
9393 if (now_seg != absolute_section)
9394 {
9395 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9396 if (j > 15)
9397 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9398 j);
e379e5f3
L
9399 else if (fragP)
9400 {
9401 /* NB: Don't add prefix with GOTPC relocation since
9402 output_disp() above depends on the fixed encoding
9403 length. Can't add prefix with TLS relocation since
9404 it breaks TLS linker optimization. */
9405 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9406 /* Prefix count on the current instruction. */
9407 unsigned int count = i.vex.length;
9408 unsigned int k;
9409 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9410 /* REX byte is encoded in VEX/EVEX prefix. */
9411 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9412 count++;
9413
9414 /* Count prefixes for extended opcode maps. */
9415 if (!i.vex.length)
9416 switch (i.tm.opcode_length)
9417 {
9418 case 3:
9419 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9420 {
9421 count++;
9422 switch ((i.tm.base_opcode >> 8) & 0xff)
9423 {
9424 case 0x38:
9425 case 0x3a:
9426 count++;
9427 break;
9428 default:
9429 break;
9430 }
9431 }
9432 break;
9433 case 2:
9434 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9435 count++;
9436 break;
9437 case 1:
9438 break;
9439 default:
9440 abort ();
9441 }
9442
9443 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9444 == BRANCH_PREFIX)
9445 {
9446 /* Set the maximum prefix size in BRANCH_PREFIX
9447 frag. */
9448 if (fragP->tc_frag_data.max_bytes > max)
9449 fragP->tc_frag_data.max_bytes = max;
9450 if (fragP->tc_frag_data.max_bytes > count)
9451 fragP->tc_frag_data.max_bytes -= count;
9452 else
9453 fragP->tc_frag_data.max_bytes = 0;
9454 }
9455 else
9456 {
9457 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9458 frag. */
9459 unsigned int max_prefix_size;
9460 if (align_branch_prefix_size > max)
9461 max_prefix_size = max;
9462 else
9463 max_prefix_size = align_branch_prefix_size;
9464 if (max_prefix_size > count)
9465 fragP->tc_frag_data.max_prefix_length
9466 = max_prefix_size - count;
9467 }
9468
9469 /* Use existing segment prefix if possible. Use CS
9470 segment prefix in 64-bit mode. In 32-bit mode, use SS
9471 segment prefix with ESP/EBP base register and use DS
9472 segment prefix without ESP/EBP base register. */
9473 if (i.prefix[SEG_PREFIX])
9474 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9475 else if (flag_code == CODE_64BIT)
9476 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9477 else if (i.base_reg
9478 && (i.base_reg->reg_num == 4
9479 || i.base_reg->reg_num == 5))
9480 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9481 else
9482 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9483 }
9c33702b 9484 }
29b0f896 9485 }
252b5132 9486
e379e5f3
L
9487 /* NB: Don't work with COND_JUMP86 without i386. */
9488 if (align_branch_power
9489 && now_seg != absolute_section
9490 && cpu_arch_flags.bitfield.cpui386)
9491 {
9492 /* Terminate each frag so that we can add prefix and check for
9493 fused jcc. */
9494 frag_wane (frag_now);
9495 frag_new (0);
9496 }
9497
29b0f896
AM
9498#ifdef DEBUG386
9499 if (flag_debug)
9500 {
7b81dfbb 9501 pi ("" /*line*/, &i);
29b0f896
AM
9502 }
9503#endif /* DEBUG386 */
9504}
252b5132 9505
e205caa7
L
9506/* Return the size of the displacement operand N. */
9507
9508static int
9509disp_size (unsigned int n)
9510{
9511 int size = 4;
43234a1e 9512
b5014f7a 9513 if (i.types[n].bitfield.disp64)
40fb9820
L
9514 size = 8;
9515 else if (i.types[n].bitfield.disp8)
9516 size = 1;
9517 else if (i.types[n].bitfield.disp16)
9518 size = 2;
e205caa7
L
9519 return size;
9520}
9521
9522/* Return the size of the immediate operand N. */
9523
9524static int
9525imm_size (unsigned int n)
9526{
9527 int size = 4;
40fb9820
L
9528 if (i.types[n].bitfield.imm64)
9529 size = 8;
9530 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9531 size = 1;
9532 else if (i.types[n].bitfield.imm16)
9533 size = 2;
e205caa7
L
9534 return size;
9535}
9536
29b0f896 9537static void
64e74474 9538output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9539{
9540 char *p;
9541 unsigned int n;
252b5132 9542
29b0f896
AM
9543 for (n = 0; n < i.operands; n++)
9544 {
b5014f7a 9545 if (operand_type_check (i.types[n], disp))
29b0f896
AM
9546 {
9547 if (i.op[n].disps->X_op == O_constant)
9548 {
e205caa7 9549 int size = disp_size (n);
43234a1e 9550 offsetT val = i.op[n].disps->X_add_number;
252b5132 9551
629cfaf1
JB
9552 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9553 size);
29b0f896
AM
9554 p = frag_more (size);
9555 md_number_to_chars (p, val, size);
9556 }
9557 else
9558 {
f86103b7 9559 enum bfd_reloc_code_real reloc_type;
e205caa7 9560 int size = disp_size (n);
40fb9820 9561 int sign = i.types[n].bitfield.disp32s;
29b0f896 9562 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9563 fixS *fixP;
29b0f896 9564
e205caa7 9565 /* We can't have 8 bit displacement here. */
9c2799c2 9566 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9567
29b0f896
AM
9568 /* The PC relative address is computed relative
9569 to the instruction boundary, so in case immediate
9570 fields follows, we need to adjust the value. */
9571 if (pcrel && i.imm_operands)
9572 {
29b0f896 9573 unsigned int n1;
e205caa7 9574 int sz = 0;
252b5132 9575
29b0f896 9576 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9577 if (operand_type_check (i.types[n1], imm))
252b5132 9578 {
e205caa7
L
9579 /* Only one immediate is allowed for PC
9580 relative address. */
9c2799c2 9581 gas_assert (sz == 0);
e205caa7
L
9582 sz = imm_size (n1);
9583 i.op[n].disps->X_add_number -= sz;
252b5132 9584 }
29b0f896 9585 /* We should find the immediate. */
9c2799c2 9586 gas_assert (sz != 0);
29b0f896 9587 }
520dc8e8 9588
29b0f896 9589 p = frag_more (size);
d258b828 9590 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9591 if (GOT_symbol
2bbd9c25 9592 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9593 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9594 || reloc_type == BFD_RELOC_X86_64_32S
9595 || (reloc_type == BFD_RELOC_64
9596 && object_64bit))
d6ab8113
JB
9597 && (i.op[n].disps->X_op == O_symbol
9598 || (i.op[n].disps->X_op == O_add
9599 && ((symbol_get_value_expression
9600 (i.op[n].disps->X_op_symbol)->X_op)
9601 == O_subtract))))
9602 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9603 {
4fa24527 9604 if (!object_64bit)
7b81dfbb
AJ
9605 {
9606 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9607 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9608 i.op[n].imms->X_add_number +=
9609 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9610 }
9611 else if (reloc_type == BFD_RELOC_64)
9612 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9613 else
7b81dfbb
AJ
9614 /* Don't do the adjustment for x86-64, as there
9615 the pcrel addressing is relative to the _next_
9616 insn, and that is taken care of in other code. */
d6ab8113 9617 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9618 }
e379e5f3
L
9619 else if (align_branch_power)
9620 {
9621 switch (reloc_type)
9622 {
9623 case BFD_RELOC_386_TLS_GD:
9624 case BFD_RELOC_386_TLS_LDM:
9625 case BFD_RELOC_386_TLS_IE:
9626 case BFD_RELOC_386_TLS_IE_32:
9627 case BFD_RELOC_386_TLS_GOTIE:
9628 case BFD_RELOC_386_TLS_GOTDESC:
9629 case BFD_RELOC_386_TLS_DESC_CALL:
9630 case BFD_RELOC_X86_64_TLSGD:
9631 case BFD_RELOC_X86_64_TLSLD:
9632 case BFD_RELOC_X86_64_GOTTPOFF:
9633 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9634 case BFD_RELOC_X86_64_TLSDESC_CALL:
9635 i.has_gotpc_tls_reloc = TRUE;
9636 default:
9637 break;
9638 }
9639 }
02a86693
L
9640 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9641 size, i.op[n].disps, pcrel,
9642 reloc_type);
9643 /* Check for "call/jmp *mem", "mov mem, %reg",
9644 "test %reg, mem" and "binop mem, %reg" where binop
9645 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9646 instructions without data prefix. Always generate
9647 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9648 if (i.prefix[DATA_PREFIX] == 0
9649 && (generate_relax_relocations
9650 || (!object_64bit
9651 && i.rm.mode == 0
9652 && i.rm.regmem == 5))
0cb4071e
L
9653 && (i.rm.mode == 2
9654 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9655 && !is_any_vex_encoding(&i.tm)
02a86693
L
9656 && ((i.operands == 1
9657 && i.tm.base_opcode == 0xff
9658 && (i.rm.reg == 2 || i.rm.reg == 4))
9659 || (i.operands == 2
9660 && (i.tm.base_opcode == 0x8b
9661 || i.tm.base_opcode == 0x85
2ae4c703 9662 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9663 {
9664 if (object_64bit)
9665 {
9666 fixP->fx_tcbit = i.rex != 0;
9667 if (i.base_reg
e968fc9b 9668 && (i.base_reg->reg_num == RegIP))
02a86693
L
9669 fixP->fx_tcbit2 = 1;
9670 }
9671 else
9672 fixP->fx_tcbit2 = 1;
9673 }
29b0f896
AM
9674 }
9675 }
9676 }
9677}
252b5132 9678
29b0f896 9679static void
64e74474 9680output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9681{
9682 char *p;
9683 unsigned int n;
252b5132 9684
29b0f896
AM
9685 for (n = 0; n < i.operands; n++)
9686 {
43234a1e
L
9687 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9688 if (i.rounding && (int) n == i.rounding->operand)
9689 continue;
9690
40fb9820 9691 if (operand_type_check (i.types[n], imm))
29b0f896
AM
9692 {
9693 if (i.op[n].imms->X_op == O_constant)
9694 {
e205caa7 9695 int size = imm_size (n);
29b0f896 9696 offsetT val;
b4cac588 9697
29b0f896
AM
9698 val = offset_in_range (i.op[n].imms->X_add_number,
9699 size);
9700 p = frag_more (size);
9701 md_number_to_chars (p, val, size);
9702 }
9703 else
9704 {
9705 /* Not absolute_section.
9706 Need a 32-bit fixup (don't support 8bit
9707 non-absolute imms). Try to support other
9708 sizes ... */
f86103b7 9709 enum bfd_reloc_code_real reloc_type;
e205caa7
L
9710 int size = imm_size (n);
9711 int sign;
29b0f896 9712
40fb9820 9713 if (i.types[n].bitfield.imm32s
a7d61044 9714 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9715 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9716 sign = 1;
e205caa7
L
9717 else
9718 sign = 0;
520dc8e8 9719
29b0f896 9720 p = frag_more (size);
d258b828 9721 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9722
2bbd9c25
JJ
9723 /* This is tough to explain. We end up with this one if we
9724 * have operands that look like
9725 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9726 * obtain the absolute address of the GOT, and it is strongly
9727 * preferable from a performance point of view to avoid using
9728 * a runtime relocation for this. The actual sequence of
9729 * instructions often look something like:
9730 *
9731 * call .L66
9732 * .L66:
9733 * popl %ebx
9734 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9735 *
9736 * The call and pop essentially return the absolute address
9737 * of the label .L66 and store it in %ebx. The linker itself
9738 * will ultimately change the first operand of the addl so
9739 * that %ebx points to the GOT, but to keep things simple, the
9740 * .o file must have this operand set so that it generates not
9741 * the absolute address of .L66, but the absolute address of
9742 * itself. This allows the linker itself simply treat a GOTPC
9743 * relocation as asking for a pcrel offset to the GOT to be
9744 * added in, and the addend of the relocation is stored in the
9745 * operand field for the instruction itself.
9746 *
9747 * Our job here is to fix the operand so that it would add
9748 * the correct offset so that %ebx would point to itself. The
9749 * thing that is tricky is that .-.L66 will point to the
9750 * beginning of the instruction, so we need to further modify
9751 * the operand so that it will point to itself. There are
9752 * other cases where you have something like:
9753 *
9754 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9755 *
9756 * and here no correction would be required. Internally in
9757 * the assembler we treat operands of this form as not being
9758 * pcrel since the '.' is explicitly mentioned, and I wonder
9759 * whether it would simplify matters to do it this way. Who
9760 * knows. In earlier versions of the PIC patches, the
9761 * pcrel_adjust field was used to store the correction, but
9762 * since the expression is not pcrel, I felt it would be
9763 * confusing to do it this way. */
9764
d6ab8113 9765 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9766 || reloc_type == BFD_RELOC_X86_64_32S
9767 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9768 && GOT_symbol
9769 && GOT_symbol == i.op[n].imms->X_add_symbol
9770 && (i.op[n].imms->X_op == O_symbol
9771 || (i.op[n].imms->X_op == O_add
9772 && ((symbol_get_value_expression
9773 (i.op[n].imms->X_op_symbol)->X_op)
9774 == O_subtract))))
9775 {
4fa24527 9776 if (!object_64bit)
d6ab8113 9777 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9778 else if (size == 4)
d6ab8113 9779 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9780 else if (size == 8)
9781 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9782 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9783 i.op[n].imms->X_add_number +=
9784 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9785 }
29b0f896
AM
9786 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9787 i.op[n].imms, 0, reloc_type);
9788 }
9789 }
9790 }
252b5132
RH
9791}
9792\f
d182319b
JB
9793/* x86_cons_fix_new is called via the expression parsing code when a
9794 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9795static int cons_sign = -1;
9796
9797void
e3bb37b5 9798x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9799 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9800{
d258b828 9801 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9802
9803#ifdef TE_PE
9804 if (exp->X_op == O_secrel)
9805 {
9806 exp->X_op = O_symbol;
9807 r = BFD_RELOC_32_SECREL;
9808 }
9809#endif
9810
9811 fix_new_exp (frag, off, len, exp, 0, r);
9812}
9813
357d1bd8
L
9814/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9815 purpose of the `.dc.a' internal pseudo-op. */
9816
9817int
9818x86_address_bytes (void)
9819{
9820 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9821 return 4;
9822 return stdoutput->arch_info->bits_per_address / 8;
9823}
9824
d382c579
TG
9825#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9826 || defined (LEX_AT)
d258b828 9827# define lex_got(reloc, adjust, types) NULL
718ddfc0 9828#else
f3c180ae
AM
9829/* Parse operands of the form
9830 <symbol>@GOTOFF+<nnn>
9831 and similar .plt or .got references.
9832
9833 If we find one, set up the correct relocation in RELOC and copy the
9834 input string, minus the `@GOTOFF' into a malloc'd buffer for
9835 parsing by the calling routine. Return this buffer, and if ADJUST
9836 is non-null set it to the length of the string we removed from the
9837 input line. Otherwise return NULL. */
9838static char *
91d6fa6a 9839lex_got (enum bfd_reloc_code_real *rel,
64e74474 9840 int *adjust,
d258b828 9841 i386_operand_type *types)
f3c180ae 9842{
7b81dfbb
AJ
9843 /* Some of the relocations depend on the size of what field is to
9844 be relocated. But in our callers i386_immediate and i386_displacement
9845 we don't yet know the operand size (this will be set by insn
9846 matching). Hence we record the word32 relocation here,
9847 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9848 static const struct {
9849 const char *str;
cff8d58a 9850 int len;
4fa24527 9851 const enum bfd_reloc_code_real rel[2];
40fb9820 9852 const i386_operand_type types64;
f3c180ae 9853 } gotrel[] = {
8ce3d284 9854#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9855 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9856 BFD_RELOC_SIZE32 },
9857 OPERAND_TYPE_IMM32_64 },
8ce3d284 9858#endif
cff8d58a
L
9859 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9860 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9861 OPERAND_TYPE_IMM64 },
cff8d58a
L
9862 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9863 BFD_RELOC_X86_64_PLT32 },
40fb9820 9864 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9865 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9866 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9867 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9868 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9869 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9870 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9871 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9872 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9873 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9874 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9875 BFD_RELOC_X86_64_TLSGD },
40fb9820 9876 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9877 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9878 _dummy_first_bfd_reloc_code_real },
40fb9820 9879 OPERAND_TYPE_NONE },
cff8d58a
L
9880 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9881 BFD_RELOC_X86_64_TLSLD },
40fb9820 9882 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9883 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9884 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9885 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9886 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9887 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9888 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9889 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9890 _dummy_first_bfd_reloc_code_real },
40fb9820 9891 OPERAND_TYPE_NONE },
cff8d58a
L
9892 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9893 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9894 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9895 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9896 _dummy_first_bfd_reloc_code_real },
40fb9820 9897 OPERAND_TYPE_NONE },
cff8d58a
L
9898 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9899 _dummy_first_bfd_reloc_code_real },
40fb9820 9900 OPERAND_TYPE_NONE },
cff8d58a
L
9901 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9902 BFD_RELOC_X86_64_GOT32 },
40fb9820 9903 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
9904 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
9905 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 9906 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9907 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
9908 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 9909 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
9910 };
9911 char *cp;
9912 unsigned int j;
9913
d382c579 9914#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
9915 if (!IS_ELF)
9916 return NULL;
d382c579 9917#endif
718ddfc0 9918
f3c180ae 9919 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 9920 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
9921 return NULL;
9922
47465058 9923 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 9924 {
cff8d58a 9925 int len = gotrel[j].len;
28f81592 9926 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 9927 {
4fa24527 9928 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 9929 {
28f81592
AM
9930 int first, second;
9931 char *tmpbuf, *past_reloc;
f3c180ae 9932
91d6fa6a 9933 *rel = gotrel[j].rel[object_64bit];
f3c180ae 9934
3956db08
JB
9935 if (types)
9936 {
9937 if (flag_code != CODE_64BIT)
40fb9820
L
9938 {
9939 types->bitfield.imm32 = 1;
9940 types->bitfield.disp32 = 1;
9941 }
3956db08
JB
9942 else
9943 *types = gotrel[j].types64;
9944 }
9945
8fd4256d 9946 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
9947 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
9948
28f81592 9949 /* The length of the first part of our input line. */
f3c180ae 9950 first = cp - input_line_pointer;
28f81592
AM
9951
9952 /* The second part goes from after the reloc token until
67c11a9b 9953 (and including) an end_of_line char or comma. */
28f81592 9954 past_reloc = cp + 1 + len;
67c11a9b
AM
9955 cp = past_reloc;
9956 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9957 ++cp;
9958 second = cp + 1 - past_reloc;
28f81592
AM
9959
9960 /* Allocate and copy string. The trailing NUL shouldn't
9961 be necessary, but be safe. */
add39d23 9962 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 9963 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
9964 if (second != 0 && *past_reloc != ' ')
9965 /* Replace the relocation token with ' ', so that
9966 errors like foo@GOTOFF1 will be detected. */
9967 tmpbuf[first++] = ' ';
af89796a
L
9968 else
9969 /* Increment length by 1 if the relocation token is
9970 removed. */
9971 len++;
9972 if (adjust)
9973 *adjust = len;
0787a12d
AM
9974 memcpy (tmpbuf + first, past_reloc, second);
9975 tmpbuf[first + second] = '\0';
f3c180ae
AM
9976 return tmpbuf;
9977 }
9978
4fa24527
JB
9979 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9980 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
9981 return NULL;
9982 }
9983 }
9984
9985 /* Might be a symbol version string. Don't as_bad here. */
9986 return NULL;
9987}
4e4f7c87 9988#endif
f3c180ae 9989
a988325c
NC
9990#ifdef TE_PE
9991#ifdef lex_got
9992#undef lex_got
9993#endif
9994/* Parse operands of the form
9995 <symbol>@SECREL32+<nnn>
9996
9997 If we find one, set up the correct relocation in RELOC and copy the
9998 input string, minus the `@SECREL32' into a malloc'd buffer for
9999 parsing by the calling routine. Return this buffer, and if ADJUST
10000 is non-null set it to the length of the string we removed from the
34bca508
L
10001 input line. Otherwise return NULL.
10002
a988325c
NC
10003 This function is copied from the ELF version above adjusted for PE targets. */
10004
10005static char *
10006lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10007 int *adjust ATTRIBUTE_UNUSED,
d258b828 10008 i386_operand_type *types)
a988325c
NC
10009{
10010 static const struct
10011 {
10012 const char *str;
10013 int len;
10014 const enum bfd_reloc_code_real rel[2];
10015 const i386_operand_type types64;
10016 }
10017 gotrel[] =
10018 {
10019 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10020 BFD_RELOC_32_SECREL },
10021 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10022 };
10023
10024 char *cp;
10025 unsigned j;
10026
10027 for (cp = input_line_pointer; *cp != '@'; cp++)
10028 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10029 return NULL;
10030
10031 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10032 {
10033 int len = gotrel[j].len;
10034
10035 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10036 {
10037 if (gotrel[j].rel[object_64bit] != 0)
10038 {
10039 int first, second;
10040 char *tmpbuf, *past_reloc;
10041
10042 *rel = gotrel[j].rel[object_64bit];
10043 if (adjust)
10044 *adjust = len;
10045
10046 if (types)
10047 {
10048 if (flag_code != CODE_64BIT)
10049 {
10050 types->bitfield.imm32 = 1;
10051 types->bitfield.disp32 = 1;
10052 }
10053 else
10054 *types = gotrel[j].types64;
10055 }
10056
10057 /* The length of the first part of our input line. */
10058 first = cp - input_line_pointer;
10059
10060 /* The second part goes from after the reloc token until
10061 (and including) an end_of_line char or comma. */
10062 past_reloc = cp + 1 + len;
10063 cp = past_reloc;
10064 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10065 ++cp;
10066 second = cp + 1 - past_reloc;
10067
10068 /* Allocate and copy string. The trailing NUL shouldn't
10069 be necessary, but be safe. */
add39d23 10070 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10071 memcpy (tmpbuf, input_line_pointer, first);
10072 if (second != 0 && *past_reloc != ' ')
10073 /* Replace the relocation token with ' ', so that
10074 errors like foo@SECLREL321 will be detected. */
10075 tmpbuf[first++] = ' ';
10076 memcpy (tmpbuf + first, past_reloc, second);
10077 tmpbuf[first + second] = '\0';
10078 return tmpbuf;
10079 }
10080
10081 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10082 gotrel[j].str, 1 << (5 + object_64bit));
10083 return NULL;
10084 }
10085 }
10086
10087 /* Might be a symbol version string. Don't as_bad here. */
10088 return NULL;
10089}
10090
10091#endif /* TE_PE */
10092
62ebcb5c 10093bfd_reloc_code_real_type
e3bb37b5 10094x86_cons (expressionS *exp, int size)
f3c180ae 10095{
62ebcb5c
AM
10096 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10097
ee86248c
JB
10098 intel_syntax = -intel_syntax;
10099
3c7b9c2c 10100 exp->X_md = 0;
4fa24527 10101 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10102 {
10103 /* Handle @GOTOFF and the like in an expression. */
10104 char *save;
10105 char *gotfree_input_line;
4a57f2cf 10106 int adjust = 0;
f3c180ae
AM
10107
10108 save = input_line_pointer;
d258b828 10109 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10110 if (gotfree_input_line)
10111 input_line_pointer = gotfree_input_line;
10112
10113 expression (exp);
10114
10115 if (gotfree_input_line)
10116 {
10117 /* expression () has merrily parsed up to the end of line,
10118 or a comma - in the wrong buffer. Transfer how far
10119 input_line_pointer has moved to the right buffer. */
10120 input_line_pointer = (save
10121 + (input_line_pointer - gotfree_input_line)
10122 + adjust);
10123 free (gotfree_input_line);
3992d3b7
AM
10124 if (exp->X_op == O_constant
10125 || exp->X_op == O_absent
10126 || exp->X_op == O_illegal
0398aac5 10127 || exp->X_op == O_register
3992d3b7
AM
10128 || exp->X_op == O_big)
10129 {
10130 char c = *input_line_pointer;
10131 *input_line_pointer = 0;
10132 as_bad (_("missing or invalid expression `%s'"), save);
10133 *input_line_pointer = c;
10134 }
b9519cfe
L
10135 else if ((got_reloc == BFD_RELOC_386_PLT32
10136 || got_reloc == BFD_RELOC_X86_64_PLT32)
10137 && exp->X_op != O_symbol)
10138 {
10139 char c = *input_line_pointer;
10140 *input_line_pointer = 0;
10141 as_bad (_("invalid PLT expression `%s'"), save);
10142 *input_line_pointer = c;
10143 }
f3c180ae
AM
10144 }
10145 }
10146 else
10147 expression (exp);
ee86248c
JB
10148
10149 intel_syntax = -intel_syntax;
10150
10151 if (intel_syntax)
10152 i386_intel_simplify (exp);
62ebcb5c
AM
10153
10154 return got_reloc;
f3c180ae 10155}
f3c180ae 10156
9f32dd5b
L
10157static void
10158signed_cons (int size)
6482c264 10159{
d182319b
JB
10160 if (flag_code == CODE_64BIT)
10161 cons_sign = 1;
10162 cons (size);
10163 cons_sign = -1;
6482c264
NC
10164}
10165
d182319b 10166#ifdef TE_PE
6482c264 10167static void
7016a5d5 10168pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10169{
10170 expressionS exp;
10171
10172 do
10173 {
10174 expression (&exp);
10175 if (exp.X_op == O_symbol)
10176 exp.X_op = O_secrel;
10177
10178 emit_expr (&exp, 4);
10179 }
10180 while (*input_line_pointer++ == ',');
10181
10182 input_line_pointer--;
10183 demand_empty_rest_of_line ();
10184}
6482c264
NC
10185#endif
10186
43234a1e
L
10187/* Handle Vector operations. */
10188
10189static char *
10190check_VecOperations (char *op_string, char *op_end)
10191{
10192 const reg_entry *mask;
10193 const char *saved;
10194 char *end_op;
10195
10196 while (*op_string
10197 && (op_end == NULL || op_string < op_end))
10198 {
10199 saved = op_string;
10200 if (*op_string == '{')
10201 {
10202 op_string++;
10203
10204 /* Check broadcasts. */
10205 if (strncmp (op_string, "1to", 3) == 0)
10206 {
10207 int bcst_type;
10208
10209 if (i.broadcast)
10210 goto duplicated_vec_op;
10211
10212 op_string += 3;
10213 if (*op_string == '8')
8e6e0792 10214 bcst_type = 8;
b28d1bda 10215 else if (*op_string == '4')
8e6e0792 10216 bcst_type = 4;
b28d1bda 10217 else if (*op_string == '2')
8e6e0792 10218 bcst_type = 2;
43234a1e
L
10219 else if (*op_string == '1'
10220 && *(op_string+1) == '6')
10221 {
8e6e0792 10222 bcst_type = 16;
43234a1e
L
10223 op_string++;
10224 }
10225 else
10226 {
10227 as_bad (_("Unsupported broadcast: `%s'"), saved);
10228 return NULL;
10229 }
10230 op_string++;
10231
10232 broadcast_op.type = bcst_type;
10233 broadcast_op.operand = this_operand;
1f75763a 10234 broadcast_op.bytes = 0;
43234a1e
L
10235 i.broadcast = &broadcast_op;
10236 }
10237 /* Check masking operation. */
10238 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10239 {
8a6fb3f9
JB
10240 if (mask == &bad_reg)
10241 return NULL;
10242
43234a1e 10243 /* k0 can't be used for write mask. */
f74a6307 10244 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10245 {
6d2cd6b2
JB
10246 as_bad (_("`%s%s' can't be used for write mask"),
10247 register_prefix, mask->reg_name);
43234a1e
L
10248 return NULL;
10249 }
10250
10251 if (!i.mask)
10252 {
10253 mask_op.mask = mask;
10254 mask_op.zeroing = 0;
10255 mask_op.operand = this_operand;
10256 i.mask = &mask_op;
10257 }
10258 else
10259 {
10260 if (i.mask->mask)
10261 goto duplicated_vec_op;
10262
10263 i.mask->mask = mask;
10264
10265 /* Only "{z}" is allowed here. No need to check
10266 zeroing mask explicitly. */
10267 if (i.mask->operand != this_operand)
10268 {
10269 as_bad (_("invalid write mask `%s'"), saved);
10270 return NULL;
10271 }
10272 }
10273
10274 op_string = end_op;
10275 }
10276 /* Check zeroing-flag for masking operation. */
10277 else if (*op_string == 'z')
10278 {
10279 if (!i.mask)
10280 {
10281 mask_op.mask = NULL;
10282 mask_op.zeroing = 1;
10283 mask_op.operand = this_operand;
10284 i.mask = &mask_op;
10285 }
10286 else
10287 {
10288 if (i.mask->zeroing)
10289 {
10290 duplicated_vec_op:
10291 as_bad (_("duplicated `%s'"), saved);
10292 return NULL;
10293 }
10294
10295 i.mask->zeroing = 1;
10296
10297 /* Only "{%k}" is allowed here. No need to check mask
10298 register explicitly. */
10299 if (i.mask->operand != this_operand)
10300 {
10301 as_bad (_("invalid zeroing-masking `%s'"),
10302 saved);
10303 return NULL;
10304 }
10305 }
10306
10307 op_string++;
10308 }
10309 else
10310 goto unknown_vec_op;
10311
10312 if (*op_string != '}')
10313 {
10314 as_bad (_("missing `}' in `%s'"), saved);
10315 return NULL;
10316 }
10317 op_string++;
0ba3a731
L
10318
10319 /* Strip whitespace since the addition of pseudo prefixes
10320 changed how the scrubber treats '{'. */
10321 if (is_space_char (*op_string))
10322 ++op_string;
10323
43234a1e
L
10324 continue;
10325 }
10326 unknown_vec_op:
10327 /* We don't know this one. */
10328 as_bad (_("unknown vector operation: `%s'"), saved);
10329 return NULL;
10330 }
10331
6d2cd6b2
JB
10332 if (i.mask && i.mask->zeroing && !i.mask->mask)
10333 {
10334 as_bad (_("zeroing-masking only allowed with write mask"));
10335 return NULL;
10336 }
10337
43234a1e
L
10338 return op_string;
10339}
10340
252b5132 10341static int
70e41ade 10342i386_immediate (char *imm_start)
252b5132
RH
10343{
10344 char *save_input_line_pointer;
f3c180ae 10345 char *gotfree_input_line;
252b5132 10346 segT exp_seg = 0;
47926f60 10347 expressionS *exp;
40fb9820
L
10348 i386_operand_type types;
10349
0dfbf9d7 10350 operand_type_set (&types, ~0);
252b5132
RH
10351
10352 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10353 {
31b2323c
L
10354 as_bad (_("at most %d immediate operands are allowed"),
10355 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10356 return 0;
10357 }
10358
10359 exp = &im_expressions[i.imm_operands++];
520dc8e8 10360 i.op[this_operand].imms = exp;
252b5132
RH
10361
10362 if (is_space_char (*imm_start))
10363 ++imm_start;
10364
10365 save_input_line_pointer = input_line_pointer;
10366 input_line_pointer = imm_start;
10367
d258b828 10368 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10369 if (gotfree_input_line)
10370 input_line_pointer = gotfree_input_line;
252b5132
RH
10371
10372 exp_seg = expression (exp);
10373
83183c0c 10374 SKIP_WHITESPACE ();
43234a1e
L
10375
10376 /* Handle vector operations. */
10377 if (*input_line_pointer == '{')
10378 {
10379 input_line_pointer = check_VecOperations (input_line_pointer,
10380 NULL);
10381 if (input_line_pointer == NULL)
10382 return 0;
10383 }
10384
252b5132 10385 if (*input_line_pointer)
f3c180ae 10386 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10387
10388 input_line_pointer = save_input_line_pointer;
f3c180ae 10389 if (gotfree_input_line)
ee86248c
JB
10390 {
10391 free (gotfree_input_line);
10392
10393 if (exp->X_op == O_constant || exp->X_op == O_register)
10394 exp->X_op = O_illegal;
10395 }
10396
10397 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10398}
252b5132 10399
ee86248c
JB
10400static int
10401i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10402 i386_operand_type types, const char *imm_start)
10403{
10404 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10405 {
313c53d1
L
10406 if (imm_start)
10407 as_bad (_("missing or invalid immediate expression `%s'"),
10408 imm_start);
3992d3b7 10409 return 0;
252b5132 10410 }
3e73aa7c 10411 else if (exp->X_op == O_constant)
252b5132 10412 {
47926f60 10413 /* Size it properly later. */
40fb9820 10414 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10415 /* If not 64bit, sign extend val. */
10416 if (flag_code != CODE_64BIT
4eed87de
AM
10417 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10418 exp->X_add_number
10419 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10420 }
4c63da97 10421#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10422 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10423 && exp_seg != absolute_section
47926f60 10424 && exp_seg != text_section
24eab124
AM
10425 && exp_seg != data_section
10426 && exp_seg != bss_section
10427 && exp_seg != undefined_section
f86103b7 10428 && !bfd_is_com_section (exp_seg))
252b5132 10429 {
d0b47220 10430 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10431 return 0;
10432 }
10433#endif
a841bdf5 10434 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10435 {
313c53d1
L
10436 if (imm_start)
10437 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10438 return 0;
10439 }
252b5132
RH
10440 else
10441 {
10442 /* This is an address. The size of the address will be
24eab124 10443 determined later, depending on destination register,
3e73aa7c 10444 suffix, or the default for the section. */
40fb9820
L
10445 i.types[this_operand].bitfield.imm8 = 1;
10446 i.types[this_operand].bitfield.imm16 = 1;
10447 i.types[this_operand].bitfield.imm32 = 1;
10448 i.types[this_operand].bitfield.imm32s = 1;
10449 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10450 i.types[this_operand] = operand_type_and (i.types[this_operand],
10451 types);
252b5132
RH
10452 }
10453
10454 return 1;
10455}
10456
551c1ca1 10457static char *
e3bb37b5 10458i386_scale (char *scale)
252b5132 10459{
551c1ca1
AM
10460 offsetT val;
10461 char *save = input_line_pointer;
252b5132 10462
551c1ca1
AM
10463 input_line_pointer = scale;
10464 val = get_absolute_expression ();
10465
10466 switch (val)
252b5132 10467 {
551c1ca1 10468 case 1:
252b5132
RH
10469 i.log2_scale_factor = 0;
10470 break;
551c1ca1 10471 case 2:
252b5132
RH
10472 i.log2_scale_factor = 1;
10473 break;
551c1ca1 10474 case 4:
252b5132
RH
10475 i.log2_scale_factor = 2;
10476 break;
551c1ca1 10477 case 8:
252b5132
RH
10478 i.log2_scale_factor = 3;
10479 break;
10480 default:
a724f0f4
JB
10481 {
10482 char sep = *input_line_pointer;
10483
10484 *input_line_pointer = '\0';
10485 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10486 scale);
10487 *input_line_pointer = sep;
10488 input_line_pointer = save;
10489 return NULL;
10490 }
252b5132 10491 }
29b0f896 10492 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10493 {
10494 as_warn (_("scale factor of %d without an index register"),
24eab124 10495 1 << i.log2_scale_factor);
252b5132 10496 i.log2_scale_factor = 0;
252b5132 10497 }
551c1ca1
AM
10498 scale = input_line_pointer;
10499 input_line_pointer = save;
10500 return scale;
252b5132
RH
10501}
10502
252b5132 10503static int
e3bb37b5 10504i386_displacement (char *disp_start, char *disp_end)
252b5132 10505{
29b0f896 10506 expressionS *exp;
252b5132
RH
10507 segT exp_seg = 0;
10508 char *save_input_line_pointer;
f3c180ae 10509 char *gotfree_input_line;
40fb9820
L
10510 int override;
10511 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10512 int ret;
252b5132 10513
31b2323c
L
10514 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10515 {
10516 as_bad (_("at most %d displacement operands are allowed"),
10517 MAX_MEMORY_OPERANDS);
10518 return 0;
10519 }
10520
0dfbf9d7 10521 operand_type_set (&bigdisp, 0);
6f2f06be 10522 if (i.jumpabsolute
48bcea9f 10523 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10524 || (current_templates->start->opcode_modifier.jump != JUMP
10525 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10526 {
48bcea9f 10527 i386_addressing_mode ();
e05278af 10528 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10529 if (flag_code == CODE_64BIT)
10530 {
10531 if (!override)
10532 {
10533 bigdisp.bitfield.disp32s = 1;
10534 bigdisp.bitfield.disp64 = 1;
10535 }
48bcea9f
JB
10536 else
10537 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10538 }
10539 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10540 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10541 else
10542 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10543 }
10544 else
10545 {
376cd056
JB
10546 /* For PC-relative branches, the width of the displacement may be
10547 dependent upon data size, but is never dependent upon address size.
10548 Also make sure to not unintentionally match against a non-PC-relative
10549 branch template. */
10550 static templates aux_templates;
10551 const insn_template *t = current_templates->start;
10552 bfd_boolean has_intel64 = FALSE;
10553
10554 aux_templates.start = t;
10555 while (++t < current_templates->end)
10556 {
10557 if (t->opcode_modifier.jump
10558 != current_templates->start->opcode_modifier.jump)
10559 break;
4b5aaf5f 10560 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10561 has_intel64 = TRUE;
10562 }
10563 if (t < current_templates->end)
10564 {
10565 aux_templates.end = t;
10566 current_templates = &aux_templates;
10567 }
10568
e05278af 10569 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10570 if (flag_code == CODE_64BIT)
10571 {
376cd056
JB
10572 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10573 && (!intel64 || !has_intel64))
40fb9820
L
10574 bigdisp.bitfield.disp16 = 1;
10575 else
48bcea9f 10576 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10577 }
10578 else
e05278af
JB
10579 {
10580 if (!override)
10581 override = (i.suffix == (flag_code != CODE_16BIT
10582 ? WORD_MNEM_SUFFIX
10583 : LONG_MNEM_SUFFIX));
40fb9820
L
10584 bigdisp.bitfield.disp32 = 1;
10585 if ((flag_code == CODE_16BIT) ^ override)
10586 {
10587 bigdisp.bitfield.disp32 = 0;
10588 bigdisp.bitfield.disp16 = 1;
10589 }
e05278af 10590 }
e05278af 10591 }
c6fb90c8
L
10592 i.types[this_operand] = operand_type_or (i.types[this_operand],
10593 bigdisp);
252b5132
RH
10594
10595 exp = &disp_expressions[i.disp_operands];
520dc8e8 10596 i.op[this_operand].disps = exp;
252b5132
RH
10597 i.disp_operands++;
10598 save_input_line_pointer = input_line_pointer;
10599 input_line_pointer = disp_start;
10600 END_STRING_AND_SAVE (disp_end);
10601
10602#ifndef GCC_ASM_O_HACK
10603#define GCC_ASM_O_HACK 0
10604#endif
10605#if GCC_ASM_O_HACK
10606 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10607 if (i.types[this_operand].bitfield.baseIndex
24eab124 10608 && displacement_string_end[-1] == '+')
252b5132
RH
10609 {
10610 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10611 constraint within gcc asm statements.
10612 For instance:
10613
10614 #define _set_tssldt_desc(n,addr,limit,type) \
10615 __asm__ __volatile__ ( \
10616 "movw %w2,%0\n\t" \
10617 "movw %w1,2+%0\n\t" \
10618 "rorl $16,%1\n\t" \
10619 "movb %b1,4+%0\n\t" \
10620 "movb %4,5+%0\n\t" \
10621 "movb $0,6+%0\n\t" \
10622 "movb %h1,7+%0\n\t" \
10623 "rorl $16,%1" \
10624 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10625
10626 This works great except that the output assembler ends
10627 up looking a bit weird if it turns out that there is
10628 no offset. You end up producing code that looks like:
10629
10630 #APP
10631 movw $235,(%eax)
10632 movw %dx,2+(%eax)
10633 rorl $16,%edx
10634 movb %dl,4+(%eax)
10635 movb $137,5+(%eax)
10636 movb $0,6+(%eax)
10637 movb %dh,7+(%eax)
10638 rorl $16,%edx
10639 #NO_APP
10640
47926f60 10641 So here we provide the missing zero. */
24eab124
AM
10642
10643 *displacement_string_end = '0';
252b5132
RH
10644 }
10645#endif
d258b828 10646 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10647 if (gotfree_input_line)
10648 input_line_pointer = gotfree_input_line;
252b5132 10649
24eab124 10650 exp_seg = expression (exp);
252b5132 10651
636c26b0
AM
10652 SKIP_WHITESPACE ();
10653 if (*input_line_pointer)
10654 as_bad (_("junk `%s' after expression"), input_line_pointer);
10655#if GCC_ASM_O_HACK
10656 RESTORE_END_STRING (disp_end + 1);
10657#endif
636c26b0 10658 input_line_pointer = save_input_line_pointer;
636c26b0 10659 if (gotfree_input_line)
ee86248c
JB
10660 {
10661 free (gotfree_input_line);
10662
10663 if (exp->X_op == O_constant || exp->X_op == O_register)
10664 exp->X_op = O_illegal;
10665 }
10666
10667 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10668
10669 RESTORE_END_STRING (disp_end);
10670
10671 return ret;
10672}
10673
10674static int
10675i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10676 i386_operand_type types, const char *disp_start)
10677{
10678 i386_operand_type bigdisp;
10679 int ret = 1;
636c26b0 10680
24eab124
AM
10681 /* We do this to make sure that the section symbol is in
10682 the symbol table. We will ultimately change the relocation
47926f60 10683 to be relative to the beginning of the section. */
1ae12ab7 10684 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10685 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10686 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10687 {
636c26b0 10688 if (exp->X_op != O_symbol)
3992d3b7 10689 goto inv_disp;
636c26b0 10690
e5cb08ac 10691 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10692 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10693 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10694 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10695 exp->X_op = O_subtract;
10696 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10697 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10698 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10699 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10700 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10701 else
29b0f896 10702 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10703 }
252b5132 10704
3992d3b7
AM
10705 else if (exp->X_op == O_absent
10706 || exp->X_op == O_illegal
ee86248c 10707 || exp->X_op == O_big)
2daf4fd8 10708 {
3992d3b7
AM
10709 inv_disp:
10710 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10711 disp_start);
3992d3b7 10712 ret = 0;
2daf4fd8
AM
10713 }
10714
0e1147d9
L
10715 else if (flag_code == CODE_64BIT
10716 && !i.prefix[ADDR_PREFIX]
10717 && exp->X_op == O_constant)
10718 {
10719 /* Since displacement is signed extended to 64bit, don't allow
10720 disp32 and turn off disp32s if they are out of range. */
10721 i.types[this_operand].bitfield.disp32 = 0;
10722 if (!fits_in_signed_long (exp->X_add_number))
10723 {
10724 i.types[this_operand].bitfield.disp32s = 0;
10725 if (i.types[this_operand].bitfield.baseindex)
10726 {
10727 as_bad (_("0x%lx out range of signed 32bit displacement"),
10728 (long) exp->X_add_number);
10729 ret = 0;
10730 }
10731 }
10732 }
10733
4c63da97 10734#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10735 else if (exp->X_op != O_constant
10736 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10737 && exp_seg != absolute_section
10738 && exp_seg != text_section
10739 && exp_seg != data_section
10740 && exp_seg != bss_section
10741 && exp_seg != undefined_section
10742 && !bfd_is_com_section (exp_seg))
24eab124 10743 {
d0b47220 10744 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10745 ret = 0;
24eab124 10746 }
252b5132 10747#endif
3956db08 10748
48bcea9f
JB
10749 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10750 /* Constants get taken care of by optimize_disp(). */
10751 && exp->X_op != O_constant)
10752 i.types[this_operand].bitfield.disp8 = 1;
10753
40fb9820
L
10754 /* Check if this is a displacement only operand. */
10755 bigdisp = i.types[this_operand];
10756 bigdisp.bitfield.disp8 = 0;
10757 bigdisp.bitfield.disp16 = 0;
10758 bigdisp.bitfield.disp32 = 0;
10759 bigdisp.bitfield.disp32s = 0;
10760 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10761 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10762 i.types[this_operand] = operand_type_and (i.types[this_operand],
10763 types);
3956db08 10764
3992d3b7 10765 return ret;
252b5132
RH
10766}
10767
2abc2bec
JB
10768/* Return the active addressing mode, taking address override and
10769 registers forming the address into consideration. Update the
10770 address override prefix if necessary. */
47926f60 10771
2abc2bec
JB
10772static enum flag_code
10773i386_addressing_mode (void)
252b5132 10774{
be05d201
L
10775 enum flag_code addr_mode;
10776
10777 if (i.prefix[ADDR_PREFIX])
10778 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10779 else if (flag_code == CODE_16BIT
10780 && current_templates->start->cpu_flags.bitfield.cpumpx
10781 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10782 from md_assemble() by "is not a valid base/index expression"
10783 when there is a base and/or index. */
10784 && !i.types[this_operand].bitfield.baseindex)
10785 {
10786 /* MPX insn memory operands with neither base nor index must be forced
10787 to use 32-bit addressing in 16-bit mode. */
10788 addr_mode = CODE_32BIT;
10789 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10790 ++i.prefixes;
10791 gas_assert (!i.types[this_operand].bitfield.disp16);
10792 gas_assert (!i.types[this_operand].bitfield.disp32);
10793 }
be05d201
L
10794 else
10795 {
10796 addr_mode = flag_code;
10797
24eab124 10798#if INFER_ADDR_PREFIX
be05d201
L
10799 if (i.mem_operands == 0)
10800 {
10801 /* Infer address prefix from the first memory operand. */
10802 const reg_entry *addr_reg = i.base_reg;
10803
10804 if (addr_reg == NULL)
10805 addr_reg = i.index_reg;
eecb386c 10806
be05d201
L
10807 if (addr_reg)
10808 {
e968fc9b 10809 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10810 addr_mode = CODE_32BIT;
10811 else if (flag_code != CODE_64BIT
dc821c5f 10812 && addr_reg->reg_type.bitfield.word)
be05d201
L
10813 addr_mode = CODE_16BIT;
10814
10815 if (addr_mode != flag_code)
10816 {
10817 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10818 i.prefixes += 1;
10819 /* Change the size of any displacement too. At most one
10820 of Disp16 or Disp32 is set.
10821 FIXME. There doesn't seem to be any real need for
10822 separate Disp16 and Disp32 flags. The same goes for
10823 Imm16 and Imm32. Removing them would probably clean
10824 up the code quite a lot. */
10825 if (flag_code != CODE_64BIT
10826 && (i.types[this_operand].bitfield.disp16
10827 || i.types[this_operand].bitfield.disp32))
10828 i.types[this_operand]
10829 = operand_type_xor (i.types[this_operand], disp16_32);
10830 }
10831 }
10832 }
24eab124 10833#endif
be05d201
L
10834 }
10835
2abc2bec
JB
10836 return addr_mode;
10837}
10838
10839/* Make sure the memory operand we've been dealt is valid.
10840 Return 1 on success, 0 on a failure. */
10841
10842static int
10843i386_index_check (const char *operand_string)
10844{
10845 const char *kind = "base/index";
10846 enum flag_code addr_mode = i386_addressing_mode ();
10847
fc0763e6 10848 if (current_templates->start->opcode_modifier.isstring
c3949f43 10849 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10850 && (current_templates->end[-1].opcode_modifier.isstring
10851 || i.mem_operands))
10852 {
10853 /* Memory operands of string insns are special in that they only allow
10854 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10855 const reg_entry *expected_reg;
10856 static const char *di_si[][2] =
10857 {
10858 { "esi", "edi" },
10859 { "si", "di" },
10860 { "rsi", "rdi" }
10861 };
10862 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10863
10864 kind = "string address";
10865
8325cc63 10866 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10867 {
51c8edf6
JB
10868 int es_op = current_templates->end[-1].opcode_modifier.isstring
10869 - IS_STRING_ES_OP0;
10870 int op = 0;
fc0763e6 10871
51c8edf6 10872 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10873 || ((!i.mem_operands != !intel_syntax)
10874 && current_templates->end[-1].operand_types[1]
10875 .bitfield.baseindex))
51c8edf6
JB
10876 op = 1;
10877 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10878 }
10879 else
be05d201 10880 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10881
be05d201
L
10882 if (i.base_reg != expected_reg
10883 || i.index_reg
fc0763e6 10884 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10885 {
be05d201
L
10886 /* The second memory operand must have the same size as
10887 the first one. */
10888 if (i.mem_operands
10889 && i.base_reg
10890 && !((addr_mode == CODE_64BIT
dc821c5f 10891 && i.base_reg->reg_type.bitfield.qword)
be05d201 10892 || (addr_mode == CODE_32BIT
dc821c5f
JB
10893 ? i.base_reg->reg_type.bitfield.dword
10894 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10895 goto bad_address;
10896
fc0763e6
JB
10897 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10898 operand_string,
10899 intel_syntax ? '[' : '(',
10900 register_prefix,
be05d201 10901 expected_reg->reg_name,
fc0763e6 10902 intel_syntax ? ']' : ')');
be05d201 10903 return 1;
fc0763e6 10904 }
be05d201
L
10905 else
10906 return 1;
10907
dc1e8a47 10908 bad_address:
be05d201
L
10909 as_bad (_("`%s' is not a valid %s expression"),
10910 operand_string, kind);
10911 return 0;
3e73aa7c
JH
10912 }
10913 else
10914 {
be05d201
L
10915 if (addr_mode != CODE_16BIT)
10916 {
10917 /* 32-bit/64-bit checks. */
10918 if ((i.base_reg
e968fc9b
JB
10919 && ((addr_mode == CODE_64BIT
10920 ? !i.base_reg->reg_type.bitfield.qword
10921 : !i.base_reg->reg_type.bitfield.dword)
10922 || (i.index_reg && i.base_reg->reg_num == RegIP)
10923 || i.base_reg->reg_num == RegIZ))
be05d201 10924 || (i.index_reg
1b54b8d7
JB
10925 && !i.index_reg->reg_type.bitfield.xmmword
10926 && !i.index_reg->reg_type.bitfield.ymmword
10927 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 10928 && ((addr_mode == CODE_64BIT
e968fc9b
JB
10929 ? !i.index_reg->reg_type.bitfield.qword
10930 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
10931 || !i.index_reg->reg_type.bitfield.baseindex)))
10932 goto bad_address;
8178be5b
JB
10933
10934 /* bndmk, bndldx, and bndstx have special restrictions. */
10935 if (current_templates->start->base_opcode == 0xf30f1b
10936 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
10937 {
10938 /* They cannot use RIP-relative addressing. */
e968fc9b 10939 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
10940 {
10941 as_bad (_("`%s' cannot be used here"), operand_string);
10942 return 0;
10943 }
10944
10945 /* bndldx and bndstx ignore their scale factor. */
10946 if (current_templates->start->base_opcode != 0xf30f1b
10947 && i.log2_scale_factor)
10948 as_warn (_("register scaling is being ignored here"));
10949 }
be05d201
L
10950 }
10951 else
3e73aa7c 10952 {
be05d201 10953 /* 16-bit checks. */
3e73aa7c 10954 if ((i.base_reg
dc821c5f 10955 && (!i.base_reg->reg_type.bitfield.word
40fb9820 10956 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 10957 || (i.index_reg
dc821c5f 10958 && (!i.index_reg->reg_type.bitfield.word
40fb9820 10959 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
10960 || !(i.base_reg
10961 && i.base_reg->reg_num < 6
10962 && i.index_reg->reg_num >= 6
10963 && i.log2_scale_factor == 0))))
be05d201 10964 goto bad_address;
3e73aa7c
JH
10965 }
10966 }
be05d201 10967 return 1;
24eab124 10968}
252b5132 10969
43234a1e
L
10970/* Handle vector immediates. */
10971
10972static int
10973RC_SAE_immediate (const char *imm_start)
10974{
10975 unsigned int match_found, j;
10976 const char *pstr = imm_start;
10977 expressionS *exp;
10978
10979 if (*pstr != '{')
10980 return 0;
10981
10982 pstr++;
10983 match_found = 0;
10984 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
10985 {
10986 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
10987 {
10988 if (!i.rounding)
10989 {
10990 rc_op.type = RC_NamesTable[j].type;
10991 rc_op.operand = this_operand;
10992 i.rounding = &rc_op;
10993 }
10994 else
10995 {
10996 as_bad (_("duplicated `%s'"), imm_start);
10997 return 0;
10998 }
10999 pstr += RC_NamesTable[j].len;
11000 match_found = 1;
11001 break;
11002 }
11003 }
11004 if (!match_found)
11005 return 0;
11006
11007 if (*pstr++ != '}')
11008 {
11009 as_bad (_("Missing '}': '%s'"), imm_start);
11010 return 0;
11011 }
11012 /* RC/SAE immediate string should contain nothing more. */;
11013 if (*pstr != 0)
11014 {
11015 as_bad (_("Junk after '}': '%s'"), imm_start);
11016 return 0;
11017 }
11018
11019 exp = &im_expressions[i.imm_operands++];
11020 i.op[this_operand].imms = exp;
11021
11022 exp->X_op = O_constant;
11023 exp->X_add_number = 0;
11024 exp->X_add_symbol = (symbolS *) 0;
11025 exp->X_op_symbol = (symbolS *) 0;
11026
11027 i.types[this_operand].bitfield.imm8 = 1;
11028 return 1;
11029}
11030
8325cc63
JB
11031/* Only string instructions can have a second memory operand, so
11032 reduce current_templates to just those if it contains any. */
11033static int
11034maybe_adjust_templates (void)
11035{
11036 const insn_template *t;
11037
11038 gas_assert (i.mem_operands == 1);
11039
11040 for (t = current_templates->start; t < current_templates->end; ++t)
11041 if (t->opcode_modifier.isstring)
11042 break;
11043
11044 if (t < current_templates->end)
11045 {
11046 static templates aux_templates;
11047 bfd_boolean recheck;
11048
11049 aux_templates.start = t;
11050 for (; t < current_templates->end; ++t)
11051 if (!t->opcode_modifier.isstring)
11052 break;
11053 aux_templates.end = t;
11054
11055 /* Determine whether to re-check the first memory operand. */
11056 recheck = (aux_templates.start != current_templates->start
11057 || t != current_templates->end);
11058
11059 current_templates = &aux_templates;
11060
11061 if (recheck)
11062 {
11063 i.mem_operands = 0;
11064 if (i.memop1_string != NULL
11065 && i386_index_check (i.memop1_string) == 0)
11066 return 0;
11067 i.mem_operands = 1;
11068 }
11069 }
11070
11071 return 1;
11072}
11073
fc0763e6 11074/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11075 on error. */
252b5132 11076
252b5132 11077static int
a7619375 11078i386_att_operand (char *operand_string)
252b5132 11079{
af6bdddf
AM
11080 const reg_entry *r;
11081 char *end_op;
24eab124 11082 char *op_string = operand_string;
252b5132 11083
24eab124 11084 if (is_space_char (*op_string))
252b5132
RH
11085 ++op_string;
11086
24eab124 11087 /* We check for an absolute prefix (differentiating,
47926f60 11088 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11089 if (*op_string == ABSOLUTE_PREFIX)
11090 {
11091 ++op_string;
11092 if (is_space_char (*op_string))
11093 ++op_string;
6f2f06be 11094 i.jumpabsolute = TRUE;
24eab124 11095 }
252b5132 11096
47926f60 11097 /* Check if operand is a register. */
4d1bb795 11098 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11099 {
40fb9820
L
11100 i386_operand_type temp;
11101
8a6fb3f9
JB
11102 if (r == &bad_reg)
11103 return 0;
11104
24eab124
AM
11105 /* Check for a segment override by searching for ':' after a
11106 segment register. */
11107 op_string = end_op;
11108 if (is_space_char (*op_string))
11109 ++op_string;
00cee14f 11110 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11111 {
11112 switch (r->reg_num)
11113 {
11114 case 0:
11115 i.seg[i.mem_operands] = &es;
11116 break;
11117 case 1:
11118 i.seg[i.mem_operands] = &cs;
11119 break;
11120 case 2:
11121 i.seg[i.mem_operands] = &ss;
11122 break;
11123 case 3:
11124 i.seg[i.mem_operands] = &ds;
11125 break;
11126 case 4:
11127 i.seg[i.mem_operands] = &fs;
11128 break;
11129 case 5:
11130 i.seg[i.mem_operands] = &gs;
11131 break;
11132 }
252b5132 11133
24eab124 11134 /* Skip the ':' and whitespace. */
252b5132
RH
11135 ++op_string;
11136 if (is_space_char (*op_string))
24eab124 11137 ++op_string;
252b5132 11138
24eab124
AM
11139 if (!is_digit_char (*op_string)
11140 && !is_identifier_char (*op_string)
11141 && *op_string != '('
11142 && *op_string != ABSOLUTE_PREFIX)
11143 {
11144 as_bad (_("bad memory operand `%s'"), op_string);
11145 return 0;
11146 }
47926f60 11147 /* Handle case of %es:*foo. */
24eab124
AM
11148 if (*op_string == ABSOLUTE_PREFIX)
11149 {
11150 ++op_string;
11151 if (is_space_char (*op_string))
11152 ++op_string;
6f2f06be 11153 i.jumpabsolute = TRUE;
24eab124
AM
11154 }
11155 goto do_memory_reference;
11156 }
43234a1e
L
11157
11158 /* Handle vector operations. */
11159 if (*op_string == '{')
11160 {
11161 op_string = check_VecOperations (op_string, NULL);
11162 if (op_string == NULL)
11163 return 0;
11164 }
11165
24eab124
AM
11166 if (*op_string)
11167 {
d0b47220 11168 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11169 return 0;
11170 }
40fb9820
L
11171 temp = r->reg_type;
11172 temp.bitfield.baseindex = 0;
c6fb90c8
L
11173 i.types[this_operand] = operand_type_or (i.types[this_operand],
11174 temp);
7d5e4556 11175 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11176 i.op[this_operand].regs = r;
24eab124
AM
11177 i.reg_operands++;
11178 }
af6bdddf
AM
11179 else if (*op_string == REGISTER_PREFIX)
11180 {
11181 as_bad (_("bad register name `%s'"), op_string);
11182 return 0;
11183 }
24eab124 11184 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11185 {
24eab124 11186 ++op_string;
6f2f06be 11187 if (i.jumpabsolute)
24eab124 11188 {
d0b47220 11189 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11190 return 0;
11191 }
11192 if (!i386_immediate (op_string))
11193 return 0;
11194 }
43234a1e
L
11195 else if (RC_SAE_immediate (operand_string))
11196 {
11197 /* If it is a RC or SAE immediate, do nothing. */
11198 ;
11199 }
24eab124
AM
11200 else if (is_digit_char (*op_string)
11201 || is_identifier_char (*op_string)
d02603dc 11202 || *op_string == '"'
e5cb08ac 11203 || *op_string == '(')
24eab124 11204 {
47926f60 11205 /* This is a memory reference of some sort. */
af6bdddf 11206 char *base_string;
252b5132 11207
47926f60 11208 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11209 char *displacement_string_start;
11210 char *displacement_string_end;
43234a1e 11211 char *vop_start;
252b5132 11212
24eab124 11213 do_memory_reference:
8325cc63
JB
11214 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11215 return 0;
24eab124 11216 if ((i.mem_operands == 1
40fb9820 11217 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11218 || i.mem_operands == 2)
11219 {
11220 as_bad (_("too many memory references for `%s'"),
11221 current_templates->start->name);
11222 return 0;
11223 }
252b5132 11224
24eab124
AM
11225 /* Check for base index form. We detect the base index form by
11226 looking for an ')' at the end of the operand, searching
11227 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11228 after the '('. */
af6bdddf 11229 base_string = op_string + strlen (op_string);
c3332e24 11230
43234a1e
L
11231 /* Handle vector operations. */
11232 vop_start = strchr (op_string, '{');
11233 if (vop_start && vop_start < base_string)
11234 {
11235 if (check_VecOperations (vop_start, base_string) == NULL)
11236 return 0;
11237 base_string = vop_start;
11238 }
11239
af6bdddf
AM
11240 --base_string;
11241 if (is_space_char (*base_string))
11242 --base_string;
252b5132 11243
47926f60 11244 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11245 displacement_string_start = op_string;
11246 displacement_string_end = base_string + 1;
252b5132 11247
24eab124
AM
11248 if (*base_string == ')')
11249 {
af6bdddf 11250 char *temp_string;
24eab124
AM
11251 unsigned int parens_balanced = 1;
11252 /* We've already checked that the number of left & right ()'s are
47926f60 11253 equal, so this loop will not be infinite. */
24eab124
AM
11254 do
11255 {
11256 base_string--;
11257 if (*base_string == ')')
11258 parens_balanced++;
11259 if (*base_string == '(')
11260 parens_balanced--;
11261 }
11262 while (parens_balanced);
c3332e24 11263
af6bdddf 11264 temp_string = base_string;
c3332e24 11265
24eab124 11266 /* Skip past '(' and whitespace. */
252b5132
RH
11267 ++base_string;
11268 if (is_space_char (*base_string))
24eab124 11269 ++base_string;
252b5132 11270
af6bdddf 11271 if (*base_string == ','
4eed87de
AM
11272 || ((i.base_reg = parse_register (base_string, &end_op))
11273 != NULL))
252b5132 11274 {
af6bdddf 11275 displacement_string_end = temp_string;
252b5132 11276
40fb9820 11277 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11278
af6bdddf 11279 if (i.base_reg)
24eab124 11280 {
8a6fb3f9
JB
11281 if (i.base_reg == &bad_reg)
11282 return 0;
24eab124
AM
11283 base_string = end_op;
11284 if (is_space_char (*base_string))
11285 ++base_string;
af6bdddf
AM
11286 }
11287
11288 /* There may be an index reg or scale factor here. */
11289 if (*base_string == ',')
11290 {
11291 ++base_string;
11292 if (is_space_char (*base_string))
11293 ++base_string;
11294
4eed87de
AM
11295 if ((i.index_reg = parse_register (base_string, &end_op))
11296 != NULL)
24eab124 11297 {
8a6fb3f9
JB
11298 if (i.index_reg == &bad_reg)
11299 return 0;
af6bdddf 11300 base_string = end_op;
24eab124
AM
11301 if (is_space_char (*base_string))
11302 ++base_string;
af6bdddf
AM
11303 if (*base_string == ',')
11304 {
11305 ++base_string;
11306 if (is_space_char (*base_string))
11307 ++base_string;
11308 }
e5cb08ac 11309 else if (*base_string != ')')
af6bdddf 11310 {
4eed87de
AM
11311 as_bad (_("expecting `,' or `)' "
11312 "after index register in `%s'"),
af6bdddf
AM
11313 operand_string);
11314 return 0;
11315 }
24eab124 11316 }
af6bdddf 11317 else if (*base_string == REGISTER_PREFIX)
24eab124 11318 {
f76bf5e0
L
11319 end_op = strchr (base_string, ',');
11320 if (end_op)
11321 *end_op = '\0';
af6bdddf 11322 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11323 return 0;
11324 }
252b5132 11325
47926f60 11326 /* Check for scale factor. */
551c1ca1 11327 if (*base_string != ')')
af6bdddf 11328 {
551c1ca1
AM
11329 char *end_scale = i386_scale (base_string);
11330
11331 if (!end_scale)
af6bdddf 11332 return 0;
24eab124 11333
551c1ca1 11334 base_string = end_scale;
af6bdddf
AM
11335 if (is_space_char (*base_string))
11336 ++base_string;
11337 if (*base_string != ')')
11338 {
4eed87de
AM
11339 as_bad (_("expecting `)' "
11340 "after scale factor in `%s'"),
af6bdddf
AM
11341 operand_string);
11342 return 0;
11343 }
11344 }
11345 else if (!i.index_reg)
24eab124 11346 {
4eed87de
AM
11347 as_bad (_("expecting index register or scale factor "
11348 "after `,'; got '%c'"),
af6bdddf 11349 *base_string);
24eab124
AM
11350 return 0;
11351 }
11352 }
af6bdddf 11353 else if (*base_string != ')')
24eab124 11354 {
4eed87de
AM
11355 as_bad (_("expecting `,' or `)' "
11356 "after base register in `%s'"),
af6bdddf 11357 operand_string);
24eab124
AM
11358 return 0;
11359 }
c3332e24 11360 }
af6bdddf 11361 else if (*base_string == REGISTER_PREFIX)
c3332e24 11362 {
f76bf5e0
L
11363 end_op = strchr (base_string, ',');
11364 if (end_op)
11365 *end_op = '\0';
af6bdddf 11366 as_bad (_("bad register name `%s'"), base_string);
24eab124 11367 return 0;
c3332e24 11368 }
24eab124
AM
11369 }
11370
11371 /* If there's an expression beginning the operand, parse it,
11372 assuming displacement_string_start and
11373 displacement_string_end are meaningful. */
11374 if (displacement_string_start != displacement_string_end)
11375 {
11376 if (!i386_displacement (displacement_string_start,
11377 displacement_string_end))
11378 return 0;
11379 }
11380
11381 /* Special case for (%dx) while doing input/output op. */
11382 if (i.base_reg
75e5731b
JB
11383 && i.base_reg->reg_type.bitfield.instance == RegD
11384 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11385 && i.index_reg == 0
11386 && i.log2_scale_factor == 0
11387 && i.seg[i.mem_operands] == 0
40fb9820 11388 && !operand_type_check (i.types[this_operand], disp))
24eab124 11389 {
2fb5be8d 11390 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11391 return 1;
11392 }
11393
eecb386c
AM
11394 if (i386_index_check (operand_string) == 0)
11395 return 0;
c48dadc9 11396 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11397 if (i.mem_operands == 0)
11398 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11399 i.mem_operands++;
11400 }
11401 else
ce8a8b2f
AM
11402 {
11403 /* It's not a memory operand; argh! */
24eab124
AM
11404 as_bad (_("invalid char %s beginning operand %d `%s'"),
11405 output_invalid (*op_string),
11406 this_operand + 1,
11407 op_string);
11408 return 0;
11409 }
47926f60 11410 return 1; /* Normal return. */
252b5132
RH
11411}
11412\f
fa94de6b
RM
11413/* Calculate the maximum variable size (i.e., excluding fr_fix)
11414 that an rs_machine_dependent frag may reach. */
11415
11416unsigned int
11417i386_frag_max_var (fragS *frag)
11418{
11419 /* The only relaxable frags are for jumps.
11420 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11421 gas_assert (frag->fr_type == rs_machine_dependent);
11422 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11423}
11424
b084df0b
L
11425#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11426static int
8dcea932 11427elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11428{
11429 /* STT_GNU_IFUNC symbol must go through PLT. */
11430 if ((symbol_get_bfdsym (fr_symbol)->flags
11431 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11432 return 0;
11433
11434 if (!S_IS_EXTERNAL (fr_symbol))
11435 /* Symbol may be weak or local. */
11436 return !S_IS_WEAK (fr_symbol);
11437
8dcea932
L
11438 /* Global symbols with non-default visibility can't be preempted. */
11439 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11440 return 1;
11441
11442 if (fr_var != NO_RELOC)
11443 switch ((enum bfd_reloc_code_real) fr_var)
11444 {
11445 case BFD_RELOC_386_PLT32:
11446 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11447 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11448 return 0;
11449 default:
11450 abort ();
11451 }
11452
b084df0b
L
11453 /* Global symbols with default visibility in a shared library may be
11454 preempted by another definition. */
8dcea932 11455 return !shared;
b084df0b
L
11456}
11457#endif
11458
79d72f45
HL
11459/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11460 Note also work for Skylake and Cascadelake.
11461---------------------------------------------------------------------
11462| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11463| ------ | ----------- | ------- | -------- |
11464| Jo | N | N | Y |
11465| Jno | N | N | Y |
11466| Jc/Jb | Y | N | Y |
11467| Jae/Jnb | Y | N | Y |
11468| Je/Jz | Y | Y | Y |
11469| Jne/Jnz | Y | Y | Y |
11470| Jna/Jbe | Y | N | Y |
11471| Ja/Jnbe | Y | N | Y |
11472| Js | N | N | Y |
11473| Jns | N | N | Y |
11474| Jp/Jpe | N | N | Y |
11475| Jnp/Jpo | N | N | Y |
11476| Jl/Jnge | Y | Y | Y |
11477| Jge/Jnl | Y | Y | Y |
11478| Jle/Jng | Y | Y | Y |
11479| Jg/Jnle | Y | Y | Y |
11480--------------------------------------------------------------------- */
11481static int
11482i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11483{
11484 if (mf_cmp == mf_cmp_alu_cmp)
11485 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11486 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11487 if (mf_cmp == mf_cmp_incdec)
11488 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11489 || mf_jcc == mf_jcc_jle);
11490 if (mf_cmp == mf_cmp_test_and)
11491 return 1;
11492 return 0;
11493}
11494
e379e5f3
L
11495/* Return the next non-empty frag. */
11496
11497static fragS *
11498i386_next_non_empty_frag (fragS *fragP)
11499{
11500 /* There may be a frag with a ".fill 0" when there is no room in
11501 the current frag for frag_grow in output_insn. */
11502 for (fragP = fragP->fr_next;
11503 (fragP != NULL
11504 && fragP->fr_type == rs_fill
11505 && fragP->fr_fix == 0);
11506 fragP = fragP->fr_next)
11507 ;
11508 return fragP;
11509}
11510
11511/* Return the next jcc frag after BRANCH_PADDING. */
11512
11513static fragS *
79d72f45 11514i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11515{
79d72f45
HL
11516 fragS *branch_fragP;
11517 if (!pad_fragP)
e379e5f3
L
11518 return NULL;
11519
79d72f45
HL
11520 if (pad_fragP->fr_type == rs_machine_dependent
11521 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11522 == BRANCH_PADDING))
11523 {
79d72f45
HL
11524 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11525 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11526 return NULL;
79d72f45
HL
11527 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11528 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11529 pad_fragP->tc_frag_data.mf_type))
11530 return branch_fragP;
e379e5f3
L
11531 }
11532
11533 return NULL;
11534}
11535
11536/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11537
11538static void
11539i386_classify_machine_dependent_frag (fragS *fragP)
11540{
11541 fragS *cmp_fragP;
11542 fragS *pad_fragP;
11543 fragS *branch_fragP;
11544 fragS *next_fragP;
11545 unsigned int max_prefix_length;
11546
11547 if (fragP->tc_frag_data.classified)
11548 return;
11549
11550 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11551 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11552 for (next_fragP = fragP;
11553 next_fragP != NULL;
11554 next_fragP = next_fragP->fr_next)
11555 {
11556 next_fragP->tc_frag_data.classified = 1;
11557 if (next_fragP->fr_type == rs_machine_dependent)
11558 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11559 {
11560 case BRANCH_PADDING:
11561 /* The BRANCH_PADDING frag must be followed by a branch
11562 frag. */
11563 branch_fragP = i386_next_non_empty_frag (next_fragP);
11564 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11565 break;
11566 case FUSED_JCC_PADDING:
11567 /* Check if this is a fused jcc:
11568 FUSED_JCC_PADDING
11569 CMP like instruction
11570 BRANCH_PADDING
11571 COND_JUMP
11572 */
11573 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11574 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11575 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11576 if (branch_fragP)
11577 {
11578 /* The BRANCH_PADDING frag is merged with the
11579 FUSED_JCC_PADDING frag. */
11580 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11581 /* CMP like instruction size. */
11582 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11583 frag_wane (pad_fragP);
11584 /* Skip to branch_fragP. */
11585 next_fragP = branch_fragP;
11586 }
11587 else if (next_fragP->tc_frag_data.max_prefix_length)
11588 {
11589 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11590 a fused jcc. */
11591 next_fragP->fr_subtype
11592 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11593 next_fragP->tc_frag_data.max_bytes
11594 = next_fragP->tc_frag_data.max_prefix_length;
11595 /* This will be updated in the BRANCH_PREFIX scan. */
11596 next_fragP->tc_frag_data.max_prefix_length = 0;
11597 }
11598 else
11599 frag_wane (next_fragP);
11600 break;
11601 }
11602 }
11603
11604 /* Stop if there is no BRANCH_PREFIX. */
11605 if (!align_branch_prefix_size)
11606 return;
11607
11608 /* Scan for BRANCH_PREFIX. */
11609 for (; fragP != NULL; fragP = fragP->fr_next)
11610 {
11611 if (fragP->fr_type != rs_machine_dependent
11612 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11613 != BRANCH_PREFIX))
11614 continue;
11615
11616 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11617 COND_JUMP_PREFIX. */
11618 max_prefix_length = 0;
11619 for (next_fragP = fragP;
11620 next_fragP != NULL;
11621 next_fragP = next_fragP->fr_next)
11622 {
11623 if (next_fragP->fr_type == rs_fill)
11624 /* Skip rs_fill frags. */
11625 continue;
11626 else if (next_fragP->fr_type != rs_machine_dependent)
11627 /* Stop for all other frags. */
11628 break;
11629
11630 /* rs_machine_dependent frags. */
11631 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11632 == BRANCH_PREFIX)
11633 {
11634 /* Count BRANCH_PREFIX frags. */
11635 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11636 {
11637 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11638 frag_wane (next_fragP);
11639 }
11640 else
11641 max_prefix_length
11642 += next_fragP->tc_frag_data.max_bytes;
11643 }
11644 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11645 == BRANCH_PADDING)
11646 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11647 == FUSED_JCC_PADDING))
11648 {
11649 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11650 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11651 break;
11652 }
11653 else
11654 /* Stop for other rs_machine_dependent frags. */
11655 break;
11656 }
11657
11658 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11659
11660 /* Skip to the next frag. */
11661 fragP = next_fragP;
11662 }
11663}
11664
11665/* Compute padding size for
11666
11667 FUSED_JCC_PADDING
11668 CMP like instruction
11669 BRANCH_PADDING
11670 COND_JUMP/UNCOND_JUMP
11671
11672 or
11673
11674 BRANCH_PADDING
11675 COND_JUMP/UNCOND_JUMP
11676 */
11677
11678static int
11679i386_branch_padding_size (fragS *fragP, offsetT address)
11680{
11681 unsigned int offset, size, padding_size;
11682 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11683
11684 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11685 if (!address)
11686 address = fragP->fr_address;
11687 address += fragP->fr_fix;
11688
11689 /* CMP like instrunction size. */
11690 size = fragP->tc_frag_data.cmp_size;
11691
11692 /* The base size of the branch frag. */
11693 size += branch_fragP->fr_fix;
11694
11695 /* Add opcode and displacement bytes for the rs_machine_dependent
11696 branch frag. */
11697 if (branch_fragP->fr_type == rs_machine_dependent)
11698 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11699
11700 /* Check if branch is within boundary and doesn't end at the last
11701 byte. */
11702 offset = address & ((1U << align_branch_power) - 1);
11703 if ((offset + size) >= (1U << align_branch_power))
11704 /* Padding needed to avoid crossing boundary. */
11705 padding_size = (1U << align_branch_power) - offset;
11706 else
11707 /* No padding needed. */
11708 padding_size = 0;
11709
11710 /* The return value may be saved in tc_frag_data.length which is
11711 unsigned byte. */
11712 if (!fits_in_unsigned_byte (padding_size))
11713 abort ();
11714
11715 return padding_size;
11716}
11717
11718/* i386_generic_table_relax_frag()
11719
11720 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11721 grow/shrink padding to align branch frags. Hand others to
11722 relax_frag(). */
11723
11724long
11725i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11726{
11727 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11728 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11729 {
11730 long padding_size = i386_branch_padding_size (fragP, 0);
11731 long grow = padding_size - fragP->tc_frag_data.length;
11732
11733 /* When the BRANCH_PREFIX frag is used, the computed address
11734 must match the actual address and there should be no padding. */
11735 if (fragP->tc_frag_data.padding_address
11736 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11737 || padding_size))
11738 abort ();
11739
11740 /* Update the padding size. */
11741 if (grow)
11742 fragP->tc_frag_data.length = padding_size;
11743
11744 return grow;
11745 }
11746 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11747 {
11748 fragS *padding_fragP, *next_fragP;
11749 long padding_size, left_size, last_size;
11750
11751 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11752 if (!padding_fragP)
11753 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11754 return (fragP->tc_frag_data.length
11755 - fragP->tc_frag_data.last_length);
11756
11757 /* Compute the relative address of the padding frag in the very
11758 first time where the BRANCH_PREFIX frag sizes are zero. */
11759 if (!fragP->tc_frag_data.padding_address)
11760 fragP->tc_frag_data.padding_address
11761 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11762
11763 /* First update the last length from the previous interation. */
11764 left_size = fragP->tc_frag_data.prefix_length;
11765 for (next_fragP = fragP;
11766 next_fragP != padding_fragP;
11767 next_fragP = next_fragP->fr_next)
11768 if (next_fragP->fr_type == rs_machine_dependent
11769 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11770 == BRANCH_PREFIX))
11771 {
11772 if (left_size)
11773 {
11774 int max = next_fragP->tc_frag_data.max_bytes;
11775 if (max)
11776 {
11777 int size;
11778 if (max > left_size)
11779 size = left_size;
11780 else
11781 size = max;
11782 left_size -= size;
11783 next_fragP->tc_frag_data.last_length = size;
11784 }
11785 }
11786 else
11787 next_fragP->tc_frag_data.last_length = 0;
11788 }
11789
11790 /* Check the padding size for the padding frag. */
11791 padding_size = i386_branch_padding_size
11792 (padding_fragP, (fragP->fr_address
11793 + fragP->tc_frag_data.padding_address));
11794
11795 last_size = fragP->tc_frag_data.prefix_length;
11796 /* Check if there is change from the last interation. */
11797 if (padding_size == last_size)
11798 {
11799 /* Update the expected address of the padding frag. */
11800 padding_fragP->tc_frag_data.padding_address
11801 = (fragP->fr_address + padding_size
11802 + fragP->tc_frag_data.padding_address);
11803 return 0;
11804 }
11805
11806 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11807 {
11808 /* No padding if there is no sufficient room. Clear the
11809 expected address of the padding frag. */
11810 padding_fragP->tc_frag_data.padding_address = 0;
11811 padding_size = 0;
11812 }
11813 else
11814 /* Store the expected address of the padding frag. */
11815 padding_fragP->tc_frag_data.padding_address
11816 = (fragP->fr_address + padding_size
11817 + fragP->tc_frag_data.padding_address);
11818
11819 fragP->tc_frag_data.prefix_length = padding_size;
11820
11821 /* Update the length for the current interation. */
11822 left_size = padding_size;
11823 for (next_fragP = fragP;
11824 next_fragP != padding_fragP;
11825 next_fragP = next_fragP->fr_next)
11826 if (next_fragP->fr_type == rs_machine_dependent
11827 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11828 == BRANCH_PREFIX))
11829 {
11830 if (left_size)
11831 {
11832 int max = next_fragP->tc_frag_data.max_bytes;
11833 if (max)
11834 {
11835 int size;
11836 if (max > left_size)
11837 size = left_size;
11838 else
11839 size = max;
11840 left_size -= size;
11841 next_fragP->tc_frag_data.length = size;
11842 }
11843 }
11844 else
11845 next_fragP->tc_frag_data.length = 0;
11846 }
11847
11848 return (fragP->tc_frag_data.length
11849 - fragP->tc_frag_data.last_length);
11850 }
11851 return relax_frag (segment, fragP, stretch);
11852}
11853
ee7fcc42
AM
11854/* md_estimate_size_before_relax()
11855
11856 Called just before relax() for rs_machine_dependent frags. The x86
11857 assembler uses these frags to handle variable size jump
11858 instructions.
11859
11860 Any symbol that is now undefined will not become defined.
11861 Return the correct fr_subtype in the frag.
11862 Return the initial "guess for variable size of frag" to caller.
11863 The guess is actually the growth beyond the fixed part. Whatever
11864 we do to grow the fixed or variable part contributes to our
11865 returned value. */
11866
252b5132 11867int
7016a5d5 11868md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11869{
e379e5f3
L
11870 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11871 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11872 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11873 {
11874 i386_classify_machine_dependent_frag (fragP);
11875 return fragP->tc_frag_data.length;
11876 }
11877
252b5132 11878 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11879 check for un-relaxable symbols. On an ELF system, we can't relax
11880 an externally visible symbol, because it may be overridden by a
11881 shared library. */
11882 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11883#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11884 || (IS_ELF
8dcea932
L
11885 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11886 fragP->fr_var))
fbeb56a4
DK
11887#endif
11888#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11889 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11890 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11891#endif
11892 )
252b5132 11893 {
b98ef147
AM
11894 /* Symbol is undefined in this segment, or we need to keep a
11895 reloc so that weak symbols can be overridden. */
11896 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11897 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11898 unsigned char *opcode;
11899 int old_fr_fix;
f6af82bd 11900
ee7fcc42 11901 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 11902 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 11903 else if (size == 2)
f6af82bd 11904 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
11905#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11906 else if (need_plt32_p (fragP->fr_symbol))
11907 reloc_type = BFD_RELOC_X86_64_PLT32;
11908#endif
f6af82bd
AM
11909 else
11910 reloc_type = BFD_RELOC_32_PCREL;
252b5132 11911
ee7fcc42
AM
11912 old_fr_fix = fragP->fr_fix;
11913 opcode = (unsigned char *) fragP->fr_opcode;
11914
fddf5b5b 11915 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 11916 {
fddf5b5b
AM
11917 case UNCOND_JUMP:
11918 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 11919 opcode[0] = 0xe9;
252b5132 11920 fragP->fr_fix += size;
062cd5e7
AS
11921 fix_new (fragP, old_fr_fix, size,
11922 fragP->fr_symbol,
11923 fragP->fr_offset, 1,
11924 reloc_type);
252b5132
RH
11925 break;
11926
fddf5b5b 11927 case COND_JUMP86:
412167cb
AM
11928 if (size == 2
11929 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
11930 {
11931 /* Negate the condition, and branch past an
11932 unconditional jump. */
11933 opcode[0] ^= 1;
11934 opcode[1] = 3;
11935 /* Insert an unconditional jump. */
11936 opcode[2] = 0xe9;
11937 /* We added two extra opcode bytes, and have a two byte
11938 offset. */
11939 fragP->fr_fix += 2 + 2;
062cd5e7
AS
11940 fix_new (fragP, old_fr_fix + 2, 2,
11941 fragP->fr_symbol,
11942 fragP->fr_offset, 1,
11943 reloc_type);
fddf5b5b
AM
11944 break;
11945 }
11946 /* Fall through. */
11947
11948 case COND_JUMP:
412167cb
AM
11949 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
11950 {
3e02c1cc
AM
11951 fixS *fixP;
11952
412167cb 11953 fragP->fr_fix += 1;
3e02c1cc
AM
11954 fixP = fix_new (fragP, old_fr_fix, 1,
11955 fragP->fr_symbol,
11956 fragP->fr_offset, 1,
11957 BFD_RELOC_8_PCREL);
11958 fixP->fx_signed = 1;
412167cb
AM
11959 break;
11960 }
93c2a809 11961
24eab124 11962 /* This changes the byte-displacement jump 0x7N
fddf5b5b 11963 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 11964 opcode[1] = opcode[0] + 0x10;
f6af82bd 11965 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
11966 /* We've added an opcode byte. */
11967 fragP->fr_fix += 1 + size;
062cd5e7
AS
11968 fix_new (fragP, old_fr_fix + 1, size,
11969 fragP->fr_symbol,
11970 fragP->fr_offset, 1,
11971 reloc_type);
252b5132 11972 break;
fddf5b5b
AM
11973
11974 default:
11975 BAD_CASE (fragP->fr_subtype);
11976 break;
252b5132
RH
11977 }
11978 frag_wane (fragP);
ee7fcc42 11979 return fragP->fr_fix - old_fr_fix;
252b5132 11980 }
93c2a809 11981
93c2a809
AM
11982 /* Guess size depending on current relax state. Initially the relax
11983 state will correspond to a short jump and we return 1, because
11984 the variable part of the frag (the branch offset) is one byte
11985 long. However, we can relax a section more than once and in that
11986 case we must either set fr_subtype back to the unrelaxed state,
11987 or return the value for the appropriate branch. */
11988 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
11989}
11990
47926f60
KH
11991/* Called after relax() is finished.
11992
11993 In: Address of frag.
11994 fr_type == rs_machine_dependent.
11995 fr_subtype is what the address relaxed to.
11996
11997 Out: Any fixSs and constants are set up.
11998 Caller will turn frag into a ".space 0". */
11999
252b5132 12000void
7016a5d5
TG
12001md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12002 fragS *fragP)
252b5132 12003{
29b0f896 12004 unsigned char *opcode;
252b5132 12005 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12006 offsetT target_address;
12007 offsetT opcode_address;
252b5132 12008 unsigned int extension = 0;
847f7ad4 12009 offsetT displacement_from_opcode_start;
252b5132 12010
e379e5f3
L
12011 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12012 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12013 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12014 {
12015 /* Generate nop padding. */
12016 unsigned int size = fragP->tc_frag_data.length;
12017 if (size)
12018 {
12019 if (size > fragP->tc_frag_data.max_bytes)
12020 abort ();
12021
12022 if (flag_debug)
12023 {
12024 const char *msg;
12025 const char *branch = "branch";
12026 const char *prefix = "";
12027 fragS *padding_fragP;
12028 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12029 == BRANCH_PREFIX)
12030 {
12031 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12032 switch (fragP->tc_frag_data.default_prefix)
12033 {
12034 default:
12035 abort ();
12036 break;
12037 case CS_PREFIX_OPCODE:
12038 prefix = " cs";
12039 break;
12040 case DS_PREFIX_OPCODE:
12041 prefix = " ds";
12042 break;
12043 case ES_PREFIX_OPCODE:
12044 prefix = " es";
12045 break;
12046 case FS_PREFIX_OPCODE:
12047 prefix = " fs";
12048 break;
12049 case GS_PREFIX_OPCODE:
12050 prefix = " gs";
12051 break;
12052 case SS_PREFIX_OPCODE:
12053 prefix = " ss";
12054 break;
12055 }
12056 if (padding_fragP)
12057 msg = _("%s:%u: add %d%s at 0x%llx to align "
12058 "%s within %d-byte boundary\n");
12059 else
12060 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12061 "align %s within %d-byte boundary\n");
12062 }
12063 else
12064 {
12065 padding_fragP = fragP;
12066 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12067 "%s within %d-byte boundary\n");
12068 }
12069
12070 if (padding_fragP)
12071 switch (padding_fragP->tc_frag_data.branch_type)
12072 {
12073 case align_branch_jcc:
12074 branch = "jcc";
12075 break;
12076 case align_branch_fused:
12077 branch = "fused jcc";
12078 break;
12079 case align_branch_jmp:
12080 branch = "jmp";
12081 break;
12082 case align_branch_call:
12083 branch = "call";
12084 break;
12085 case align_branch_indirect:
12086 branch = "indiret branch";
12087 break;
12088 case align_branch_ret:
12089 branch = "ret";
12090 break;
12091 default:
12092 break;
12093 }
12094
12095 fprintf (stdout, msg,
12096 fragP->fr_file, fragP->fr_line, size, prefix,
12097 (long long) fragP->fr_address, branch,
12098 1 << align_branch_power);
12099 }
12100 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12101 memset (fragP->fr_opcode,
12102 fragP->tc_frag_data.default_prefix, size);
12103 else
12104 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12105 size, 0);
12106 fragP->fr_fix += size;
12107 }
12108 return;
12109 }
12110
252b5132
RH
12111 opcode = (unsigned char *) fragP->fr_opcode;
12112
47926f60 12113 /* Address we want to reach in file space. */
252b5132 12114 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12115
47926f60 12116 /* Address opcode resides at in file space. */
252b5132
RH
12117 opcode_address = fragP->fr_address + fragP->fr_fix;
12118
47926f60 12119 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12120 displacement_from_opcode_start = target_address - opcode_address;
12121
fddf5b5b 12122 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12123 {
47926f60
KH
12124 /* Don't have to change opcode. */
12125 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12126 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12127 }
12128 else
12129 {
12130 if (no_cond_jump_promotion
12131 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12132 as_warn_where (fragP->fr_file, fragP->fr_line,
12133 _("long jump required"));
252b5132 12134
fddf5b5b
AM
12135 switch (fragP->fr_subtype)
12136 {
12137 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12138 extension = 4; /* 1 opcode + 4 displacement */
12139 opcode[0] = 0xe9;
12140 where_to_put_displacement = &opcode[1];
12141 break;
252b5132 12142
fddf5b5b
AM
12143 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12144 extension = 2; /* 1 opcode + 2 displacement */
12145 opcode[0] = 0xe9;
12146 where_to_put_displacement = &opcode[1];
12147 break;
252b5132 12148
fddf5b5b
AM
12149 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12150 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12151 extension = 5; /* 2 opcode + 4 displacement */
12152 opcode[1] = opcode[0] + 0x10;
12153 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12154 where_to_put_displacement = &opcode[2];
12155 break;
252b5132 12156
fddf5b5b
AM
12157 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12158 extension = 3; /* 2 opcode + 2 displacement */
12159 opcode[1] = opcode[0] + 0x10;
12160 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12161 where_to_put_displacement = &opcode[2];
12162 break;
252b5132 12163
fddf5b5b
AM
12164 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12165 extension = 4;
12166 opcode[0] ^= 1;
12167 opcode[1] = 3;
12168 opcode[2] = 0xe9;
12169 where_to_put_displacement = &opcode[3];
12170 break;
12171
12172 default:
12173 BAD_CASE (fragP->fr_subtype);
12174 break;
12175 }
252b5132 12176 }
fddf5b5b 12177
7b81dfbb
AJ
12178 /* If size if less then four we are sure that the operand fits,
12179 but if it's 4, then it could be that the displacement is larger
12180 then -/+ 2GB. */
12181 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12182 && object_64bit
12183 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12184 + ((addressT) 1 << 31))
12185 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12186 {
12187 as_bad_where (fragP->fr_file, fragP->fr_line,
12188 _("jump target out of range"));
12189 /* Make us emit 0. */
12190 displacement_from_opcode_start = extension;
12191 }
47926f60 12192 /* Now put displacement after opcode. */
252b5132
RH
12193 md_number_to_chars ((char *) where_to_put_displacement,
12194 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12195 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12196 fragP->fr_fix += extension;
12197}
12198\f
7016a5d5 12199/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12200 by our caller that we have all the info we need to fix it up.
12201
7016a5d5
TG
12202 Parameter valP is the pointer to the value of the bits.
12203
252b5132
RH
12204 On the 386, immediates, displacements, and data pointers are all in
12205 the same (little-endian) format, so we don't need to care about which
12206 we are handling. */
12207
94f592af 12208void
7016a5d5 12209md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12210{
94f592af 12211 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12212 valueT value = *valP;
252b5132 12213
f86103b7 12214#if !defined (TE_Mach)
93382f6d
AM
12215 if (fixP->fx_pcrel)
12216 {
12217 switch (fixP->fx_r_type)
12218 {
5865bb77
ILT
12219 default:
12220 break;
12221
d6ab8113
JB
12222 case BFD_RELOC_64:
12223 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12224 break;
93382f6d 12225 case BFD_RELOC_32:
ae8887b5 12226 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12227 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12228 break;
12229 case BFD_RELOC_16:
12230 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12231 break;
12232 case BFD_RELOC_8:
12233 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12234 break;
12235 }
12236 }
252b5132 12237
a161fe53 12238 if (fixP->fx_addsy != NULL
31312f95 12239 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12240 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12241 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12242 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12243 && !use_rela_relocations)
252b5132 12244 {
31312f95
AM
12245 /* This is a hack. There should be a better way to handle this.
12246 This covers for the fact that bfd_install_relocation will
12247 subtract the current location (for partial_inplace, PC relative
12248 relocations); see more below. */
252b5132 12249#ifndef OBJ_AOUT
718ddfc0 12250 if (IS_ELF
252b5132
RH
12251#ifdef TE_PE
12252 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12253#endif
12254 )
12255 value += fixP->fx_where + fixP->fx_frag->fr_address;
12256#endif
12257#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12258 if (IS_ELF)
252b5132 12259 {
6539b54b 12260 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12261
6539b54b 12262 if ((sym_seg == seg
2f66722d 12263 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12264 && sym_seg != absolute_section))
af65af87 12265 && !generic_force_reloc (fixP))
2f66722d
AM
12266 {
12267 /* Yes, we add the values in twice. This is because
6539b54b
AM
12268 bfd_install_relocation subtracts them out again. I think
12269 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12270 it. FIXME. */
12271 value += fixP->fx_where + fixP->fx_frag->fr_address;
12272 }
252b5132
RH
12273 }
12274#endif
12275#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12276 /* For some reason, the PE format does not store a
12277 section address offset for a PC relative symbol. */
12278 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12279 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12280 value += md_pcrel_from (fixP);
12281#endif
12282 }
fbeb56a4 12283#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12284 if (fixP->fx_addsy != NULL
12285 && S_IS_WEAK (fixP->fx_addsy)
12286 /* PR 16858: Do not modify weak function references. */
12287 && ! fixP->fx_pcrel)
fbeb56a4 12288 {
296a8689
NC
12289#if !defined (TE_PEP)
12290 /* For x86 PE weak function symbols are neither PC-relative
12291 nor do they set S_IS_FUNCTION. So the only reliable way
12292 to detect them is to check the flags of their containing
12293 section. */
12294 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12295 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12296 ;
12297 else
12298#endif
fbeb56a4
DK
12299 value -= S_GET_VALUE (fixP->fx_addsy);
12300 }
12301#endif
252b5132
RH
12302
12303 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12304 and we must not disappoint it. */
252b5132 12305#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12306 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12307 switch (fixP->fx_r_type)
12308 {
12309 case BFD_RELOC_386_PLT32:
3e73aa7c 12310 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12311 /* Make the jump instruction point to the address of the operand.
12312 At runtime we merely add the offset to the actual PLT entry.
12313 NB: Subtract the offset size only for jump instructions. */
12314 if (fixP->fx_pcrel)
12315 value = -4;
47926f60 12316 break;
31312f95 12317
13ae64f3
JJ
12318 case BFD_RELOC_386_TLS_GD:
12319 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12320 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12321 case BFD_RELOC_386_TLS_IE:
12322 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12323 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12324 case BFD_RELOC_X86_64_TLSGD:
12325 case BFD_RELOC_X86_64_TLSLD:
12326 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12327 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12328 value = 0; /* Fully resolved at runtime. No addend. */
12329 /* Fallthrough */
12330 case BFD_RELOC_386_TLS_LE:
12331 case BFD_RELOC_386_TLS_LDO_32:
12332 case BFD_RELOC_386_TLS_LE_32:
12333 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12334 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12335 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12336 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12337 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12338 break;
12339
67a4f2b7
AO
12340 case BFD_RELOC_386_TLS_DESC_CALL:
12341 case BFD_RELOC_X86_64_TLSDESC_CALL:
12342 value = 0; /* Fully resolved at runtime. No addend. */
12343 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12344 fixP->fx_done = 0;
12345 return;
12346
47926f60
KH
12347 case BFD_RELOC_VTABLE_INHERIT:
12348 case BFD_RELOC_VTABLE_ENTRY:
12349 fixP->fx_done = 0;
94f592af 12350 return;
47926f60
KH
12351
12352 default:
12353 break;
12354 }
12355#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12356 *valP = value;
f86103b7 12357#endif /* !defined (TE_Mach) */
3e73aa7c 12358
3e73aa7c 12359 /* Are we finished with this relocation now? */
c6682705 12360 if (fixP->fx_addsy == NULL)
3e73aa7c 12361 fixP->fx_done = 1;
fbeb56a4
DK
12362#if defined (OBJ_COFF) && defined (TE_PE)
12363 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12364 {
12365 fixP->fx_done = 0;
12366 /* Remember value for tc_gen_reloc. */
12367 fixP->fx_addnumber = value;
12368 /* Clear out the frag for now. */
12369 value = 0;
12370 }
12371#endif
3e73aa7c
JH
12372 else if (use_rela_relocations)
12373 {
12374 fixP->fx_no_overflow = 1;
062cd5e7
AS
12375 /* Remember value for tc_gen_reloc. */
12376 fixP->fx_addnumber = value;
3e73aa7c
JH
12377 value = 0;
12378 }
f86103b7 12379
94f592af 12380 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12381}
252b5132 12382\f
6d4af3c2 12383const char *
499ac353 12384md_atof (int type, char *litP, int *sizeP)
252b5132 12385{
499ac353
NC
12386 /* This outputs the LITTLENUMs in REVERSE order;
12387 in accord with the bigendian 386. */
12388 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12389}
12390\f
2d545b82 12391static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12392
252b5132 12393static char *
e3bb37b5 12394output_invalid (int c)
252b5132 12395{
3882b010 12396 if (ISPRINT (c))
f9f21a03
L
12397 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12398 "'%c'", c);
252b5132 12399 else
f9f21a03 12400 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12401 "(0x%x)", (unsigned char) c);
252b5132
RH
12402 return output_invalid_buf;
12403}
12404
8a6fb3f9
JB
12405/* Verify that @r can be used in the current context. */
12406
12407static bfd_boolean check_register (const reg_entry *r)
12408{
12409 if (allow_pseudo_reg)
12410 return TRUE;
12411
12412 if (operand_type_all_zero (&r->reg_type))
12413 return FALSE;
12414
12415 if ((r->reg_type.bitfield.dword
12416 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12417 || r->reg_type.bitfield.class == RegCR
22e00a3f 12418 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9
JB
12419 && !cpu_arch_flags.bitfield.cpui386)
12420 return FALSE;
12421
22e00a3f
JB
12422 if (r->reg_type.bitfield.class == RegTR
12423 && (flag_code == CODE_64BIT
12424 || !cpu_arch_flags.bitfield.cpui386
12425 || cpu_arch_isa_flags.bitfield.cpui586
12426 || cpu_arch_isa_flags.bitfield.cpui686))
12427 return FALSE;
12428
8a6fb3f9
JB
12429 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12430 return FALSE;
12431
12432 if (!cpu_arch_flags.bitfield.cpuavx512f)
12433 {
12434 if (r->reg_type.bitfield.zmmword
12435 || r->reg_type.bitfield.class == RegMask)
12436 return FALSE;
12437
12438 if (!cpu_arch_flags.bitfield.cpuavx)
12439 {
12440 if (r->reg_type.bitfield.ymmword)
12441 return FALSE;
12442
12443 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12444 return FALSE;
12445 }
12446 }
12447
12448 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12449 return FALSE;
12450
12451 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12452 if (!allow_index_reg && r->reg_num == RegIZ)
12453 return FALSE;
12454
12455 /* Upper 16 vector registers are only available with VREX in 64bit
12456 mode, and require EVEX encoding. */
12457 if (r->reg_flags & RegVRex)
12458 {
12459 if (!cpu_arch_flags.bitfield.cpuavx512f
12460 || flag_code != CODE_64BIT)
12461 return FALSE;
12462
da4977e0
JB
12463 if (i.vec_encoding == vex_encoding_default)
12464 i.vec_encoding = vex_encoding_evex;
12465 else if (i.vec_encoding != vex_encoding_evex)
12466 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12467 }
12468
12469 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12470 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12471 && flag_code != CODE_64BIT)
12472 return FALSE;
12473
12474 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12475 && !intel_syntax)
12476 return FALSE;
12477
12478 return TRUE;
12479}
12480
af6bdddf 12481/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12482
12483static const reg_entry *
4d1bb795 12484parse_real_register (char *reg_string, char **end_op)
252b5132 12485{
af6bdddf
AM
12486 char *s = reg_string;
12487 char *p;
252b5132
RH
12488 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12489 const reg_entry *r;
12490
12491 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12492 if (*s == REGISTER_PREFIX)
12493 ++s;
12494
12495 if (is_space_char (*s))
12496 ++s;
12497
12498 p = reg_name_given;
af6bdddf 12499 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12500 {
12501 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12502 return (const reg_entry *) NULL;
12503 s++;
252b5132
RH
12504 }
12505
6588847e
DN
12506 /* For naked regs, make sure that we are not dealing with an identifier.
12507 This prevents confusing an identifier like `eax_var' with register
12508 `eax'. */
12509 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12510 return (const reg_entry *) NULL;
12511
af6bdddf 12512 *end_op = s;
252b5132
RH
12513
12514 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
12515
5f47d35b 12516 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12517 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12518 {
0e0eea78
JB
12519 if (!cpu_arch_flags.bitfield.cpu8087
12520 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12521 && !cpu_arch_flags.bitfield.cpu387
12522 && !allow_pseudo_reg)
0e0eea78
JB
12523 return (const reg_entry *) NULL;
12524
5f47d35b
AM
12525 if (is_space_char (*s))
12526 ++s;
12527 if (*s == '(')
12528 {
af6bdddf 12529 ++s;
5f47d35b
AM
12530 if (is_space_char (*s))
12531 ++s;
12532 if (*s >= '0' && *s <= '7')
12533 {
db557034 12534 int fpr = *s - '0';
af6bdddf 12535 ++s;
5f47d35b
AM
12536 if (is_space_char (*s))
12537 ++s;
12538 if (*s == ')')
12539 {
12540 *end_op = s + 1;
1e9cc1c2 12541 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
12542 know (r);
12543 return r + fpr;
5f47d35b 12544 }
5f47d35b 12545 }
47926f60 12546 /* We have "%st(" then garbage. */
5f47d35b
AM
12547 return (const reg_entry *) NULL;
12548 }
12549 }
12550
8a6fb3f9 12551 return r && check_register (r) ? r : NULL;
252b5132 12552}
4d1bb795
JB
12553
12554/* REG_STRING starts *before* REGISTER_PREFIX. */
12555
12556static const reg_entry *
12557parse_register (char *reg_string, char **end_op)
12558{
12559 const reg_entry *r;
12560
12561 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12562 r = parse_real_register (reg_string, end_op);
12563 else
12564 r = NULL;
12565 if (!r)
12566 {
12567 char *save = input_line_pointer;
12568 char c;
12569 symbolS *symbolP;
12570
12571 input_line_pointer = reg_string;
d02603dc 12572 c = get_symbol_name (&reg_string);
4d1bb795
JB
12573 symbolP = symbol_find (reg_string);
12574 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12575 {
12576 const expressionS *e = symbol_get_value_expression (symbolP);
12577
0398aac5 12578 know (e->X_op == O_register);
4eed87de 12579 know (e->X_add_number >= 0
c3fe08fa 12580 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12581 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12582 if (!check_register (r))
12583 {
12584 as_bad (_("register '%s%s' cannot be used here"),
12585 register_prefix, r->reg_name);
12586 r = &bad_reg;
12587 }
4d1bb795
JB
12588 *end_op = input_line_pointer;
12589 }
12590 *input_line_pointer = c;
12591 input_line_pointer = save;
12592 }
12593 return r;
12594}
12595
12596int
12597i386_parse_name (char *name, expressionS *e, char *nextcharP)
12598{
12599 const reg_entry *r;
12600 char *end = input_line_pointer;
12601
12602 *end = *nextcharP;
12603 r = parse_register (name, &input_line_pointer);
12604 if (r && end <= input_line_pointer)
12605 {
12606 *nextcharP = *input_line_pointer;
12607 *input_line_pointer = 0;
8a6fb3f9
JB
12608 if (r != &bad_reg)
12609 {
12610 e->X_op = O_register;
12611 e->X_add_number = r - i386_regtab;
12612 }
12613 else
12614 e->X_op = O_illegal;
4d1bb795
JB
12615 return 1;
12616 }
12617 input_line_pointer = end;
12618 *end = 0;
ee86248c 12619 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12620}
12621
12622void
12623md_operand (expressionS *e)
12624{
ee86248c
JB
12625 char *end;
12626 const reg_entry *r;
4d1bb795 12627
ee86248c
JB
12628 switch (*input_line_pointer)
12629 {
12630 case REGISTER_PREFIX:
12631 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12632 if (r)
12633 {
12634 e->X_op = O_register;
12635 e->X_add_number = r - i386_regtab;
12636 input_line_pointer = end;
12637 }
ee86248c
JB
12638 break;
12639
12640 case '[':
9c2799c2 12641 gas_assert (intel_syntax);
ee86248c
JB
12642 end = input_line_pointer++;
12643 expression (e);
12644 if (*input_line_pointer == ']')
12645 {
12646 ++input_line_pointer;
12647 e->X_op_symbol = make_expr_symbol (e);
12648 e->X_add_symbol = NULL;
12649 e->X_add_number = 0;
12650 e->X_op = O_index;
12651 }
12652 else
12653 {
12654 e->X_op = O_absent;
12655 input_line_pointer = end;
12656 }
12657 break;
4d1bb795
JB
12658 }
12659}
12660
252b5132 12661\f
4cc782b5 12662#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12663const char *md_shortopts = "kVQ:sqnO::";
252b5132 12664#else
b6f8c7c4 12665const char *md_shortopts = "qnO::";
252b5132 12666#endif
6e0b89ee 12667
3e73aa7c 12668#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12669#define OPTION_64 (OPTION_MD_BASE + 1)
12670#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12671#define OPTION_MARCH (OPTION_MD_BASE + 3)
12672#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12673#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12674#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12675#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12676#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12677#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12678#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12679#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12680#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12681#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12682#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12683#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12684#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12685#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12686#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12687#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12688#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12689#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12690#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12691#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12692#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12693#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12694#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12695#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12696#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12697#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12698#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12699#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12700#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12701#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12702
99ad8390
NC
12703struct option md_longopts[] =
12704{
3e73aa7c 12705 {"32", no_argument, NULL, OPTION_32},
321098a5 12706#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12707 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12708 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12709#endif
12710#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12711 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12712 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12713 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12714#endif
b3b91714 12715 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12716 {"march", required_argument, NULL, OPTION_MARCH},
12717 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12718 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12719 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12720 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12721 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12722 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12723 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12724 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12725 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12726 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12727 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12728 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12729 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12730# if defined (TE_PE) || defined (TE_PEP)
12731 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12732#endif
d1982f93 12733 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12734 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12735 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12736 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12737 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12738 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12739 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12740 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12741 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12742 {"mlfence-before-indirect-branch", required_argument, NULL,
12743 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12744 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12745 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12746 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12747 {NULL, no_argument, NULL, 0}
12748};
12749size_t md_longopts_size = sizeof (md_longopts);
12750
12751int
17b9d67d 12752md_parse_option (int c, const char *arg)
252b5132 12753{
91d6fa6a 12754 unsigned int j;
e379e5f3 12755 char *arch, *next, *saved, *type;
9103f4f4 12756
252b5132
RH
12757 switch (c)
12758 {
12b55ccc
L
12759 case 'n':
12760 optimize_align_code = 0;
12761 break;
12762
a38cf1db
AM
12763 case 'q':
12764 quiet_warnings = 1;
252b5132
RH
12765 break;
12766
12767#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12768 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12769 should be emitted or not. FIXME: Not implemented. */
12770 case 'Q':
d4693039
JB
12771 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12772 return 0;
252b5132
RH
12773 break;
12774
12775 /* -V: SVR4 argument to print version ID. */
12776 case 'V':
12777 print_version_id ();
12778 break;
12779
a38cf1db
AM
12780 /* -k: Ignore for FreeBSD compatibility. */
12781 case 'k':
252b5132 12782 break;
4cc782b5
ILT
12783
12784 case 's':
12785 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12786 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12787 break;
8dcea932
L
12788
12789 case OPTION_MSHARED:
12790 shared = 1;
12791 break;
b4a3a7b4
L
12792
12793 case OPTION_X86_USED_NOTE:
12794 if (strcasecmp (arg, "yes") == 0)
12795 x86_used_note = 1;
12796 else if (strcasecmp (arg, "no") == 0)
12797 x86_used_note = 0;
12798 else
12799 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12800 break;
12801
12802
99ad8390 12803#endif
321098a5 12804#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12805 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12806 case OPTION_64:
12807 {
12808 const char **list, **l;
12809
3e73aa7c
JH
12810 list = bfd_target_list ();
12811 for (l = list; *l != NULL; l++)
8620418b 12812 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12813 || strcmp (*l, "coff-x86-64") == 0
12814 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12815 || strcmp (*l, "pei-x86-64") == 0
12816 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12817 {
12818 default_arch = "x86_64";
12819 break;
12820 }
3e73aa7c 12821 if (*l == NULL)
2b5d6a91 12822 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12823 free (list);
12824 }
12825 break;
12826#endif
252b5132 12827
351f65ca 12828#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12829 case OPTION_X32:
351f65ca
L
12830 if (IS_ELF)
12831 {
12832 const char **list, **l;
12833
12834 list = bfd_target_list ();
12835 for (l = list; *l != NULL; l++)
12836 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12837 {
12838 default_arch = "x86_64:32";
12839 break;
12840 }
12841 if (*l == NULL)
2b5d6a91 12842 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12843 free (list);
12844 }
12845 else
12846 as_fatal (_("32bit x86_64 is only supported for ELF"));
12847 break;
12848#endif
12849
6e0b89ee
AM
12850 case OPTION_32:
12851 default_arch = "i386";
12852 break;
12853
b3b91714
AM
12854 case OPTION_DIVIDE:
12855#ifdef SVR4_COMMENT_CHARS
12856 {
12857 char *n, *t;
12858 const char *s;
12859
add39d23 12860 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12861 t = n;
12862 for (s = i386_comment_chars; *s != '\0'; s++)
12863 if (*s != '/')
12864 *t++ = *s;
12865 *t = '\0';
12866 i386_comment_chars = n;
12867 }
12868#endif
12869 break;
12870
9103f4f4 12871 case OPTION_MARCH:
293f5f65
L
12872 saved = xstrdup (arg);
12873 arch = saved;
12874 /* Allow -march=+nosse. */
12875 if (*arch == '+')
12876 arch++;
6305a203 12877 do
9103f4f4 12878 {
6305a203 12879 if (*arch == '.')
2b5d6a91 12880 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12881 next = strchr (arch, '+');
12882 if (next)
12883 *next++ = '\0';
91d6fa6a 12884 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12885 {
91d6fa6a 12886 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12887 {
6305a203 12888 /* Processor. */
1ded5609
JB
12889 if (! cpu_arch[j].flags.bitfield.cpui386)
12890 continue;
12891
91d6fa6a 12892 cpu_arch_name = cpu_arch[j].name;
6305a203 12893 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12894 cpu_arch_flags = cpu_arch[j].flags;
12895 cpu_arch_isa = cpu_arch[j].type;
12896 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
12897 if (!cpu_arch_tune_set)
12898 {
12899 cpu_arch_tune = cpu_arch_isa;
12900 cpu_arch_tune_flags = cpu_arch_isa_flags;
12901 }
12902 break;
12903 }
91d6fa6a
NC
12904 else if (*cpu_arch [j].name == '.'
12905 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 12906 {
33eaf5de 12907 /* ISA extension. */
6305a203 12908 i386_cpu_flags flags;
309d3373 12909
293f5f65
L
12910 flags = cpu_flags_or (cpu_arch_flags,
12911 cpu_arch[j].flags);
81486035 12912
5b64d091 12913 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
12914 {
12915 if (cpu_sub_arch_name)
12916 {
12917 char *name = cpu_sub_arch_name;
12918 cpu_sub_arch_name = concat (name,
91d6fa6a 12919 cpu_arch[j].name,
1bf57e9f 12920 (const char *) NULL);
6305a203
L
12921 free (name);
12922 }
12923 else
91d6fa6a 12924 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 12925 cpu_arch_flags = flags;
a586129e 12926 cpu_arch_isa_flags = flags;
6305a203 12927 }
0089dace
L
12928 else
12929 cpu_arch_isa_flags
12930 = cpu_flags_or (cpu_arch_isa_flags,
12931 cpu_arch[j].flags);
6305a203 12932 break;
ccc9c027 12933 }
9103f4f4 12934 }
6305a203 12935
293f5f65
L
12936 if (j >= ARRAY_SIZE (cpu_arch))
12937 {
33eaf5de 12938 /* Disable an ISA extension. */
293f5f65
L
12939 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
12940 if (strcmp (arch, cpu_noarch [j].name) == 0)
12941 {
12942 i386_cpu_flags flags;
12943
12944 flags = cpu_flags_and_not (cpu_arch_flags,
12945 cpu_noarch[j].flags);
12946 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
12947 {
12948 if (cpu_sub_arch_name)
12949 {
12950 char *name = cpu_sub_arch_name;
12951 cpu_sub_arch_name = concat (arch,
12952 (const char *) NULL);
12953 free (name);
12954 }
12955 else
12956 cpu_sub_arch_name = xstrdup (arch);
12957 cpu_arch_flags = flags;
12958 cpu_arch_isa_flags = flags;
12959 }
12960 break;
12961 }
12962
12963 if (j >= ARRAY_SIZE (cpu_noarch))
12964 j = ARRAY_SIZE (cpu_arch);
12965 }
12966
91d6fa6a 12967 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12968 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12969
12970 arch = next;
9103f4f4 12971 }
293f5f65
L
12972 while (next != NULL);
12973 free (saved);
9103f4f4
L
12974 break;
12975
12976 case OPTION_MTUNE:
12977 if (*arg == '.')
2b5d6a91 12978 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 12979 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12980 {
91d6fa6a 12981 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 12982 {
ccc9c027 12983 cpu_arch_tune_set = 1;
91d6fa6a
NC
12984 cpu_arch_tune = cpu_arch [j].type;
12985 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
12986 break;
12987 }
12988 }
91d6fa6a 12989 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12990 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
12991 break;
12992
1efbbeb4
L
12993 case OPTION_MMNEMONIC:
12994 if (strcasecmp (arg, "att") == 0)
12995 intel_mnemonic = 0;
12996 else if (strcasecmp (arg, "intel") == 0)
12997 intel_mnemonic = 1;
12998 else
2b5d6a91 12999 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13000 break;
13001
13002 case OPTION_MSYNTAX:
13003 if (strcasecmp (arg, "att") == 0)
13004 intel_syntax = 0;
13005 else if (strcasecmp (arg, "intel") == 0)
13006 intel_syntax = 1;
13007 else
2b5d6a91 13008 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13009 break;
13010
13011 case OPTION_MINDEX_REG:
13012 allow_index_reg = 1;
13013 break;
13014
13015 case OPTION_MNAKED_REG:
13016 allow_naked_reg = 1;
13017 break;
13018
c0f3af97
L
13019 case OPTION_MSSE2AVX:
13020 sse2avx = 1;
13021 break;
13022
daf50ae7
L
13023 case OPTION_MSSE_CHECK:
13024 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13025 sse_check = check_error;
daf50ae7 13026 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13027 sse_check = check_warning;
daf50ae7 13028 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13029 sse_check = check_none;
daf50ae7 13030 else
2b5d6a91 13031 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13032 break;
13033
7bab8ab5
JB
13034 case OPTION_MOPERAND_CHECK:
13035 if (strcasecmp (arg, "error") == 0)
13036 operand_check = check_error;
13037 else if (strcasecmp (arg, "warning") == 0)
13038 operand_check = check_warning;
13039 else if (strcasecmp (arg, "none") == 0)
13040 operand_check = check_none;
13041 else
13042 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13043 break;
13044
539f890d
L
13045 case OPTION_MAVXSCALAR:
13046 if (strcasecmp (arg, "128") == 0)
13047 avxscalar = vex128;
13048 else if (strcasecmp (arg, "256") == 0)
13049 avxscalar = vex256;
13050 else
2b5d6a91 13051 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13052 break;
13053
03751133
L
13054 case OPTION_MVEXWIG:
13055 if (strcmp (arg, "0") == 0)
40c9c8de 13056 vexwig = vexw0;
03751133 13057 else if (strcmp (arg, "1") == 0)
40c9c8de 13058 vexwig = vexw1;
03751133
L
13059 else
13060 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13061 break;
13062
7e8b059b
L
13063 case OPTION_MADD_BND_PREFIX:
13064 add_bnd_prefix = 1;
13065 break;
13066
43234a1e
L
13067 case OPTION_MEVEXLIG:
13068 if (strcmp (arg, "128") == 0)
13069 evexlig = evexl128;
13070 else if (strcmp (arg, "256") == 0)
13071 evexlig = evexl256;
13072 else if (strcmp (arg, "512") == 0)
13073 evexlig = evexl512;
13074 else
13075 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13076 break;
13077
d3d3c6db
IT
13078 case OPTION_MEVEXRCIG:
13079 if (strcmp (arg, "rne") == 0)
13080 evexrcig = rne;
13081 else if (strcmp (arg, "rd") == 0)
13082 evexrcig = rd;
13083 else if (strcmp (arg, "ru") == 0)
13084 evexrcig = ru;
13085 else if (strcmp (arg, "rz") == 0)
13086 evexrcig = rz;
13087 else
13088 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13089 break;
13090
43234a1e
L
13091 case OPTION_MEVEXWIG:
13092 if (strcmp (arg, "0") == 0)
13093 evexwig = evexw0;
13094 else if (strcmp (arg, "1") == 0)
13095 evexwig = evexw1;
13096 else
13097 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13098 break;
13099
167ad85b
TG
13100# if defined (TE_PE) || defined (TE_PEP)
13101 case OPTION_MBIG_OBJ:
13102 use_big_obj = 1;
13103 break;
13104#endif
13105
d1982f93 13106 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13107 if (strcasecmp (arg, "yes") == 0)
13108 omit_lock_prefix = 1;
13109 else if (strcasecmp (arg, "no") == 0)
13110 omit_lock_prefix = 0;
13111 else
13112 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13113 break;
13114
e4e00185
AS
13115 case OPTION_MFENCE_AS_LOCK_ADD:
13116 if (strcasecmp (arg, "yes") == 0)
13117 avoid_fence = 1;
13118 else if (strcasecmp (arg, "no") == 0)
13119 avoid_fence = 0;
13120 else
13121 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13122 break;
13123
ae531041
L
13124 case OPTION_MLFENCE_AFTER_LOAD:
13125 if (strcasecmp (arg, "yes") == 0)
13126 lfence_after_load = 1;
13127 else if (strcasecmp (arg, "no") == 0)
13128 lfence_after_load = 0;
13129 else
13130 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13131 break;
13132
13133 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13134 if (strcasecmp (arg, "all") == 0)
a09f656b 13135 {
13136 lfence_before_indirect_branch = lfence_branch_all;
13137 if (lfence_before_ret == lfence_before_ret_none)
13138 lfence_before_ret = lfence_before_ret_shl;
13139 }
ae531041
L
13140 else if (strcasecmp (arg, "memory") == 0)
13141 lfence_before_indirect_branch = lfence_branch_memory;
13142 else if (strcasecmp (arg, "register") == 0)
13143 lfence_before_indirect_branch = lfence_branch_register;
13144 else if (strcasecmp (arg, "none") == 0)
13145 lfence_before_indirect_branch = lfence_branch_none;
13146 else
13147 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13148 arg);
13149 break;
13150
13151 case OPTION_MLFENCE_BEFORE_RET:
13152 if (strcasecmp (arg, "or") == 0)
13153 lfence_before_ret = lfence_before_ret_or;
13154 else if (strcasecmp (arg, "not") == 0)
13155 lfence_before_ret = lfence_before_ret_not;
a09f656b 13156 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13157 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13158 else if (strcasecmp (arg, "none") == 0)
13159 lfence_before_ret = lfence_before_ret_none;
13160 else
13161 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13162 arg);
13163 break;
13164
0cb4071e
L
13165 case OPTION_MRELAX_RELOCATIONS:
13166 if (strcasecmp (arg, "yes") == 0)
13167 generate_relax_relocations = 1;
13168 else if (strcasecmp (arg, "no") == 0)
13169 generate_relax_relocations = 0;
13170 else
13171 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13172 break;
13173
e379e5f3
L
13174 case OPTION_MALIGN_BRANCH_BOUNDARY:
13175 {
13176 char *end;
13177 long int align = strtoul (arg, &end, 0);
13178 if (*end == '\0')
13179 {
13180 if (align == 0)
13181 {
13182 align_branch_power = 0;
13183 break;
13184 }
13185 else if (align >= 16)
13186 {
13187 int align_power;
13188 for (align_power = 0;
13189 (align & 1) == 0;
13190 align >>= 1, align_power++)
13191 continue;
13192 /* Limit alignment power to 31. */
13193 if (align == 1 && align_power < 32)
13194 {
13195 align_branch_power = align_power;
13196 break;
13197 }
13198 }
13199 }
13200 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13201 }
13202 break;
13203
13204 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13205 {
13206 char *end;
13207 int align = strtoul (arg, &end, 0);
13208 /* Some processors only support 5 prefixes. */
13209 if (*end == '\0' && align >= 0 && align < 6)
13210 {
13211 align_branch_prefix_size = align;
13212 break;
13213 }
13214 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13215 arg);
13216 }
13217 break;
13218
13219 case OPTION_MALIGN_BRANCH:
13220 align_branch = 0;
13221 saved = xstrdup (arg);
13222 type = saved;
13223 do
13224 {
13225 next = strchr (type, '+');
13226 if (next)
13227 *next++ = '\0';
13228 if (strcasecmp (type, "jcc") == 0)
13229 align_branch |= align_branch_jcc_bit;
13230 else if (strcasecmp (type, "fused") == 0)
13231 align_branch |= align_branch_fused_bit;
13232 else if (strcasecmp (type, "jmp") == 0)
13233 align_branch |= align_branch_jmp_bit;
13234 else if (strcasecmp (type, "call") == 0)
13235 align_branch |= align_branch_call_bit;
13236 else if (strcasecmp (type, "ret") == 0)
13237 align_branch |= align_branch_ret_bit;
13238 else if (strcasecmp (type, "indirect") == 0)
13239 align_branch |= align_branch_indirect_bit;
13240 else
13241 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13242 type = next;
13243 }
13244 while (next != NULL);
13245 free (saved);
13246 break;
13247
76cf450b
L
13248 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13249 align_branch_power = 5;
13250 align_branch_prefix_size = 5;
13251 align_branch = (align_branch_jcc_bit
13252 | align_branch_fused_bit
13253 | align_branch_jmp_bit);
13254 break;
13255
5db04b09 13256 case OPTION_MAMD64:
4b5aaf5f 13257 isa64 = amd64;
5db04b09
L
13258 break;
13259
13260 case OPTION_MINTEL64:
4b5aaf5f 13261 isa64 = intel64;
5db04b09
L
13262 break;
13263
b6f8c7c4
L
13264 case 'O':
13265 if (arg == NULL)
13266 {
13267 optimize = 1;
13268 /* Turn off -Os. */
13269 optimize_for_space = 0;
13270 }
13271 else if (*arg == 's')
13272 {
13273 optimize_for_space = 1;
13274 /* Turn on all encoding optimizations. */
41fd2579 13275 optimize = INT_MAX;
b6f8c7c4
L
13276 }
13277 else
13278 {
13279 optimize = atoi (arg);
13280 /* Turn off -Os. */
13281 optimize_for_space = 0;
13282 }
13283 break;
13284
252b5132
RH
13285 default:
13286 return 0;
13287 }
13288 return 1;
13289}
13290
8a2c8fef
L
13291#define MESSAGE_TEMPLATE \
13292" "
13293
293f5f65
L
13294static char *
13295output_message (FILE *stream, char *p, char *message, char *start,
13296 int *left_p, const char *name, int len)
13297{
13298 int size = sizeof (MESSAGE_TEMPLATE);
13299 int left = *left_p;
13300
13301 /* Reserve 2 spaces for ", " or ",\0" */
13302 left -= len + 2;
13303
13304 /* Check if there is any room. */
13305 if (left >= 0)
13306 {
13307 if (p != start)
13308 {
13309 *p++ = ',';
13310 *p++ = ' ';
13311 }
13312 p = mempcpy (p, name, len);
13313 }
13314 else
13315 {
13316 /* Output the current message now and start a new one. */
13317 *p++ = ',';
13318 *p = '\0';
13319 fprintf (stream, "%s\n", message);
13320 p = start;
13321 left = size - (start - message) - len - 2;
13322
13323 gas_assert (left >= 0);
13324
13325 p = mempcpy (p, name, len);
13326 }
13327
13328 *left_p = left;
13329 return p;
13330}
13331
8a2c8fef 13332static void
1ded5609 13333show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13334{
13335 static char message[] = MESSAGE_TEMPLATE;
13336 char *start = message + 27;
13337 char *p;
13338 int size = sizeof (MESSAGE_TEMPLATE);
13339 int left;
13340 const char *name;
13341 int len;
13342 unsigned int j;
13343
13344 p = start;
13345 left = size - (start - message);
13346 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13347 {
13348 /* Should it be skipped? */
13349 if (cpu_arch [j].skip)
13350 continue;
13351
13352 name = cpu_arch [j].name;
13353 len = cpu_arch [j].len;
13354 if (*name == '.')
13355 {
13356 /* It is an extension. Skip if we aren't asked to show it. */
13357 if (ext)
13358 {
13359 name++;
13360 len--;
13361 }
13362 else
13363 continue;
13364 }
13365 else if (ext)
13366 {
13367 /* It is an processor. Skip if we show only extension. */
13368 continue;
13369 }
1ded5609
JB
13370 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13371 {
13372 /* It is an impossible processor - skip. */
13373 continue;
13374 }
8a2c8fef 13375
293f5f65 13376 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13377 }
13378
293f5f65
L
13379 /* Display disabled extensions. */
13380 if (ext)
13381 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13382 {
13383 name = cpu_noarch [j].name;
13384 len = cpu_noarch [j].len;
13385 p = output_message (stream, p, message, start, &left, name,
13386 len);
13387 }
13388
8a2c8fef
L
13389 *p = '\0';
13390 fprintf (stream, "%s\n", message);
13391}
13392
252b5132 13393void
8a2c8fef 13394md_show_usage (FILE *stream)
252b5132 13395{
4cc782b5
ILT
13396#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13397 fprintf (stream, _("\
d4693039 13398 -Qy, -Qn ignored\n\
a38cf1db 13399 -V print assembler version number\n\
b3b91714
AM
13400 -k ignored\n"));
13401#endif
13402 fprintf (stream, _("\
12b55ccc 13403 -n Do not optimize code alignment\n\
b3b91714
AM
13404 -q quieten some warnings\n"));
13405#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13406 fprintf (stream, _("\
a38cf1db 13407 -s ignored\n"));
b3b91714 13408#endif
d7f449c0
L
13409#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13410 || defined (TE_PE) || defined (TE_PEP))
751d281c 13411 fprintf (stream, _("\
570561f7 13412 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13413#endif
b3b91714
AM
13414#ifdef SVR4_COMMENT_CHARS
13415 fprintf (stream, _("\
13416 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13417#else
13418 fprintf (stream, _("\
b3b91714 13419 --divide ignored\n"));
4cc782b5 13420#endif
9103f4f4 13421 fprintf (stream, _("\
6305a203 13422 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13423 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13424 show_arch (stream, 0, 1);
8a2c8fef
L
13425 fprintf (stream, _("\
13426 EXTENSION is combination of:\n"));
1ded5609 13427 show_arch (stream, 1, 0);
6305a203 13428 fprintf (stream, _("\
8a2c8fef 13429 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13430 show_arch (stream, 0, 0);
ba104c83 13431 fprintf (stream, _("\
c0f3af97
L
13432 -msse2avx encode SSE instructions with VEX prefix\n"));
13433 fprintf (stream, _("\
7c5c05ef 13434 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13435 check SSE instructions\n"));
13436 fprintf (stream, _("\
7c5c05ef 13437 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13438 check operand combinations for validity\n"));
13439 fprintf (stream, _("\
7c5c05ef
L
13440 -mavxscalar=[128|256] (default: 128)\n\
13441 encode scalar AVX instructions with specific vector\n\
539f890d
L
13442 length\n"));
13443 fprintf (stream, _("\
03751133
L
13444 -mvexwig=[0|1] (default: 0)\n\
13445 encode VEX instructions with specific VEX.W value\n\
13446 for VEX.W bit ignored instructions\n"));
13447 fprintf (stream, _("\
7c5c05ef
L
13448 -mevexlig=[128|256|512] (default: 128)\n\
13449 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13450 length\n"));
13451 fprintf (stream, _("\
7c5c05ef
L
13452 -mevexwig=[0|1] (default: 0)\n\
13453 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13454 for EVEX.W bit ignored instructions\n"));
13455 fprintf (stream, _("\
7c5c05ef 13456 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13457 encode EVEX instructions with specific EVEX.RC value\n\
13458 for SAE-only ignored instructions\n"));
13459 fprintf (stream, _("\
7c5c05ef
L
13460 -mmnemonic=[att|intel] "));
13461 if (SYSV386_COMPAT)
13462 fprintf (stream, _("(default: att)\n"));
13463 else
13464 fprintf (stream, _("(default: intel)\n"));
13465 fprintf (stream, _("\
13466 use AT&T/Intel mnemonic\n"));
ba104c83 13467 fprintf (stream, _("\
7c5c05ef
L
13468 -msyntax=[att|intel] (default: att)\n\
13469 use AT&T/Intel syntax\n"));
ba104c83
L
13470 fprintf (stream, _("\
13471 -mindex-reg support pseudo index registers\n"));
13472 fprintf (stream, _("\
13473 -mnaked-reg don't require `%%' prefix for registers\n"));
13474 fprintf (stream, _("\
7e8b059b 13475 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13476#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13477 fprintf (stream, _("\
13478 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13479 fprintf (stream, _("\
13480 -mx86-used-note=[no|yes] "));
13481 if (DEFAULT_X86_USED_NOTE)
13482 fprintf (stream, _("(default: yes)\n"));
13483 else
13484 fprintf (stream, _("(default: no)\n"));
13485 fprintf (stream, _("\
13486 generate x86 used ISA and feature properties\n"));
13487#endif
13488#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13489 fprintf (stream, _("\
13490 -mbig-obj generate big object files\n"));
13491#endif
d022bddd 13492 fprintf (stream, _("\
7c5c05ef 13493 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13494 strip all lock prefixes\n"));
5db04b09 13495 fprintf (stream, _("\
7c5c05ef 13496 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13497 encode lfence, mfence and sfence as\n\
13498 lock addl $0x0, (%%{re}sp)\n"));
13499 fprintf (stream, _("\
7c5c05ef
L
13500 -mrelax-relocations=[no|yes] "));
13501 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13502 fprintf (stream, _("(default: yes)\n"));
13503 else
13504 fprintf (stream, _("(default: no)\n"));
13505 fprintf (stream, _("\
0cb4071e
L
13506 generate relax relocations\n"));
13507 fprintf (stream, _("\
e379e5f3
L
13508 -malign-branch-boundary=NUM (default: 0)\n\
13509 align branches within NUM byte boundary\n"));
13510 fprintf (stream, _("\
13511 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13512 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13513 indirect\n\
13514 specify types of branches to align\n"));
13515 fprintf (stream, _("\
13516 -malign-branch-prefix-size=NUM (default: 5)\n\
13517 align branches with NUM prefixes per instruction\n"));
13518 fprintf (stream, _("\
76cf450b
L
13519 -mbranches-within-32B-boundaries\n\
13520 align branches within 32 byte boundary\n"));
13521 fprintf (stream, _("\
ae531041
L
13522 -mlfence-after-load=[no|yes] (default: no)\n\
13523 generate lfence after load\n"));
13524 fprintf (stream, _("\
13525 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13526 generate lfence before indirect near branch\n"));
13527 fprintf (stream, _("\
a09f656b 13528 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13529 generate lfence before ret\n"));
13530 fprintf (stream, _("\
7c5c05ef 13531 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13532 fprintf (stream, _("\
13533 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13534}
13535
3e73aa7c 13536#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13537 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13538 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13539
13540/* Pick the target format to use. */
13541
47926f60 13542const char *
e3bb37b5 13543i386_target_format (void)
252b5132 13544{
351f65ca
L
13545 if (!strncmp (default_arch, "x86_64", 6))
13546 {
13547 update_code_flag (CODE_64BIT, 1);
13548 if (default_arch[6] == '\0')
7f56bc95 13549 x86_elf_abi = X86_64_ABI;
351f65ca 13550 else
7f56bc95 13551 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13552 }
3e73aa7c 13553 else if (!strcmp (default_arch, "i386"))
78f12dd3 13554 update_code_flag (CODE_32BIT, 1);
5197d474
L
13555 else if (!strcmp (default_arch, "iamcu"))
13556 {
13557 update_code_flag (CODE_32BIT, 1);
13558 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13559 {
13560 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13561 cpu_arch_name = "iamcu";
13562 cpu_sub_arch_name = NULL;
13563 cpu_arch_flags = iamcu_flags;
13564 cpu_arch_isa = PROCESSOR_IAMCU;
13565 cpu_arch_isa_flags = iamcu_flags;
13566 if (!cpu_arch_tune_set)
13567 {
13568 cpu_arch_tune = cpu_arch_isa;
13569 cpu_arch_tune_flags = cpu_arch_isa_flags;
13570 }
13571 }
8d471ec1 13572 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13573 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13574 cpu_arch_name);
13575 }
3e73aa7c 13576 else
2b5d6a91 13577 as_fatal (_("unknown architecture"));
89507696
JB
13578
13579 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13580 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13581 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13582 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13583
252b5132
RH
13584 switch (OUTPUT_FLAVOR)
13585 {
9384f2ff 13586#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13587 case bfd_target_aout_flavour:
47926f60 13588 return AOUT_TARGET_FORMAT;
4c63da97 13589#endif
9384f2ff
AM
13590#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13591# if defined (TE_PE) || defined (TE_PEP)
13592 case bfd_target_coff_flavour:
167ad85b
TG
13593 if (flag_code == CODE_64BIT)
13594 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13595 else
251dae91 13596 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13597# elif defined (TE_GO32)
0561d57c
JK
13598 case bfd_target_coff_flavour:
13599 return "coff-go32";
9384f2ff 13600# else
252b5132
RH
13601 case bfd_target_coff_flavour:
13602 return "coff-i386";
9384f2ff 13603# endif
4c63da97 13604#endif
3e73aa7c 13605#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13606 case bfd_target_elf_flavour:
3e73aa7c 13607 {
351f65ca
L
13608 const char *format;
13609
13610 switch (x86_elf_abi)
4fa24527 13611 {
351f65ca
L
13612 default:
13613 format = ELF_TARGET_FORMAT;
e379e5f3
L
13614#ifndef TE_SOLARIS
13615 tls_get_addr = "___tls_get_addr";
13616#endif
351f65ca 13617 break;
7f56bc95 13618 case X86_64_ABI:
351f65ca 13619 use_rela_relocations = 1;
4fa24527 13620 object_64bit = 1;
e379e5f3
L
13621#ifndef TE_SOLARIS
13622 tls_get_addr = "__tls_get_addr";
13623#endif
351f65ca
L
13624 format = ELF_TARGET_FORMAT64;
13625 break;
7f56bc95 13626 case X86_64_X32_ABI:
4fa24527 13627 use_rela_relocations = 1;
351f65ca 13628 object_64bit = 1;
e379e5f3
L
13629#ifndef TE_SOLARIS
13630 tls_get_addr = "__tls_get_addr";
13631#endif
862be3fb 13632 disallow_64bit_reloc = 1;
351f65ca
L
13633 format = ELF_TARGET_FORMAT32;
13634 break;
4fa24527 13635 }
3632d14b 13636 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13637 {
7f56bc95 13638 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13639 as_fatal (_("Intel L1OM is 64bit only"));
13640 return ELF_TARGET_L1OM_FORMAT;
13641 }
b49f93f6 13642 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13643 {
13644 if (x86_elf_abi != X86_64_ABI)
13645 as_fatal (_("Intel K1OM is 64bit only"));
13646 return ELF_TARGET_K1OM_FORMAT;
13647 }
81486035
L
13648 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13649 {
13650 if (x86_elf_abi != I386_ABI)
13651 as_fatal (_("Intel MCU is 32bit only"));
13652 return ELF_TARGET_IAMCU_FORMAT;
13653 }
8a9036a4 13654 else
351f65ca 13655 return format;
3e73aa7c 13656 }
e57f8c65
TG
13657#endif
13658#if defined (OBJ_MACH_O)
13659 case bfd_target_mach_o_flavour:
d382c579
TG
13660 if (flag_code == CODE_64BIT)
13661 {
13662 use_rela_relocations = 1;
13663 object_64bit = 1;
13664 return "mach-o-x86-64";
13665 }
13666 else
13667 return "mach-o-i386";
4c63da97 13668#endif
252b5132
RH
13669 default:
13670 abort ();
13671 return NULL;
13672 }
13673}
13674
47926f60 13675#endif /* OBJ_MAYBE_ more than one */
252b5132 13676\f
252b5132 13677symbolS *
7016a5d5 13678md_undefined_symbol (char *name)
252b5132 13679{
18dc2407
ILT
13680 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13681 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13682 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13683 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13684 {
13685 if (!GOT_symbol)
13686 {
13687 if (symbol_find (name))
13688 as_bad (_("GOT already in symbol table"));
13689 GOT_symbol = symbol_new (name, undefined_section,
13690 (valueT) 0, &zero_address_frag);
13691 };
13692 return GOT_symbol;
13693 }
252b5132
RH
13694 return 0;
13695}
13696
13697/* Round up a section size to the appropriate boundary. */
47926f60 13698
252b5132 13699valueT
7016a5d5 13700md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13701{
4c63da97
AM
13702#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13703 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13704 {
13705 /* For a.out, force the section size to be aligned. If we don't do
13706 this, BFD will align it for us, but it will not write out the
13707 final bytes of the section. This may be a bug in BFD, but it is
13708 easier to fix it here since that is how the other a.out targets
13709 work. */
13710 int align;
13711
fd361982 13712 align = bfd_section_alignment (segment);
8d3842cd 13713 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13714 }
252b5132
RH
13715#endif
13716
13717 return size;
13718}
13719
13720/* On the i386, PC-relative offsets are relative to the start of the
13721 next instruction. That is, the address of the offset, plus its
13722 size, since the offset is always the last part of the insn. */
13723
13724long
e3bb37b5 13725md_pcrel_from (fixS *fixP)
252b5132
RH
13726{
13727 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13728}
13729
13730#ifndef I386COFF
13731
13732static void
e3bb37b5 13733s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13734{
29b0f896 13735 int temp;
252b5132 13736
8a75718c
JB
13737#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13738 if (IS_ELF)
13739 obj_elf_section_change_hook ();
13740#endif
252b5132
RH
13741 temp = get_absolute_expression ();
13742 subseg_set (bss_section, (subsegT) temp);
13743 demand_empty_rest_of_line ();
13744}
13745
13746#endif
13747
e379e5f3
L
13748/* Remember constant directive. */
13749
13750void
13751i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13752{
13753 if (last_insn.kind != last_insn_directive
13754 && (bfd_section_flags (now_seg) & SEC_CODE))
13755 {
13756 last_insn.seg = now_seg;
13757 last_insn.kind = last_insn_directive;
13758 last_insn.name = "constant directive";
13759 last_insn.file = as_where (&last_insn.line);
ae531041
L
13760 if (lfence_before_ret != lfence_before_ret_none)
13761 {
13762 if (lfence_before_indirect_branch != lfence_branch_none)
13763 as_warn (_("constant directive skips -mlfence-before-ret "
13764 "and -mlfence-before-indirect-branch"));
13765 else
13766 as_warn (_("constant directive skips -mlfence-before-ret"));
13767 }
13768 else if (lfence_before_indirect_branch != lfence_branch_none)
13769 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13770 }
13771}
13772
252b5132 13773void
e3bb37b5 13774i386_validate_fix (fixS *fixp)
252b5132 13775{
02a86693 13776 if (fixp->fx_subsy)
252b5132 13777 {
02a86693 13778 if (fixp->fx_subsy == GOT_symbol)
23df1078 13779 {
02a86693
L
13780 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13781 {
13782 if (!object_64bit)
13783 abort ();
13784#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13785 if (fixp->fx_tcbit2)
56ceb5b5
L
13786 fixp->fx_r_type = (fixp->fx_tcbit
13787 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13788 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13789 else
13790#endif
13791 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13792 }
d6ab8113 13793 else
02a86693
L
13794 {
13795 if (!object_64bit)
13796 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13797 else
13798 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13799 }
13800 fixp->fx_subsy = 0;
23df1078 13801 }
252b5132 13802 }
02a86693
L
13803#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13804 else if (!object_64bit)
13805 {
13806 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13807 && fixp->fx_tcbit2)
13808 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13809 }
13810#endif
252b5132
RH
13811}
13812
252b5132 13813arelent *
7016a5d5 13814tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13815{
13816 arelent *rel;
13817 bfd_reloc_code_real_type code;
13818
13819 switch (fixp->fx_r_type)
13820 {
8ce3d284 13821#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13822 case BFD_RELOC_SIZE32:
13823 case BFD_RELOC_SIZE64:
13824 if (S_IS_DEFINED (fixp->fx_addsy)
13825 && !S_IS_EXTERNAL (fixp->fx_addsy))
13826 {
13827 /* Resolve size relocation against local symbol to size of
13828 the symbol plus addend. */
13829 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13830 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13831 && !fits_in_unsigned_long (value))
13832 as_bad_where (fixp->fx_file, fixp->fx_line,
13833 _("symbol size computation overflow"));
13834 fixp->fx_addsy = NULL;
13835 fixp->fx_subsy = NULL;
13836 md_apply_fix (fixp, (valueT *) &value, NULL);
13837 return NULL;
13838 }
8ce3d284 13839#endif
1a0670f3 13840 /* Fall through. */
8fd4256d 13841
3e73aa7c
JH
13842 case BFD_RELOC_X86_64_PLT32:
13843 case BFD_RELOC_X86_64_GOT32:
13844 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13845 case BFD_RELOC_X86_64_GOTPCRELX:
13846 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13847 case BFD_RELOC_386_PLT32:
13848 case BFD_RELOC_386_GOT32:
02a86693 13849 case BFD_RELOC_386_GOT32X:
252b5132
RH
13850 case BFD_RELOC_386_GOTOFF:
13851 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13852 case BFD_RELOC_386_TLS_GD:
13853 case BFD_RELOC_386_TLS_LDM:
13854 case BFD_RELOC_386_TLS_LDO_32:
13855 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13856 case BFD_RELOC_386_TLS_IE:
13857 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13858 case BFD_RELOC_386_TLS_LE_32:
13859 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13860 case BFD_RELOC_386_TLS_GOTDESC:
13861 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13862 case BFD_RELOC_X86_64_TLSGD:
13863 case BFD_RELOC_X86_64_TLSLD:
13864 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13865 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13866 case BFD_RELOC_X86_64_GOTTPOFF:
13867 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13868 case BFD_RELOC_X86_64_TPOFF64:
13869 case BFD_RELOC_X86_64_GOTOFF64:
13870 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13871 case BFD_RELOC_X86_64_GOT64:
13872 case BFD_RELOC_X86_64_GOTPCREL64:
13873 case BFD_RELOC_X86_64_GOTPC64:
13874 case BFD_RELOC_X86_64_GOTPLT64:
13875 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13876 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13877 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13878 case BFD_RELOC_RVA:
13879 case BFD_RELOC_VTABLE_ENTRY:
13880 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13881#ifdef TE_PE
13882 case BFD_RELOC_32_SECREL:
13883#endif
252b5132
RH
13884 code = fixp->fx_r_type;
13885 break;
dbbaec26
L
13886 case BFD_RELOC_X86_64_32S:
13887 if (!fixp->fx_pcrel)
13888 {
13889 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
13890 code = fixp->fx_r_type;
13891 break;
13892 }
1a0670f3 13893 /* Fall through. */
252b5132 13894 default:
93382f6d 13895 if (fixp->fx_pcrel)
252b5132 13896 {
93382f6d
AM
13897 switch (fixp->fx_size)
13898 {
13899 default:
b091f402
AM
13900 as_bad_where (fixp->fx_file, fixp->fx_line,
13901 _("can not do %d byte pc-relative relocation"),
13902 fixp->fx_size);
93382f6d
AM
13903 code = BFD_RELOC_32_PCREL;
13904 break;
13905 case 1: code = BFD_RELOC_8_PCREL; break;
13906 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 13907 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
13908#ifdef BFD64
13909 case 8: code = BFD_RELOC_64_PCREL; break;
13910#endif
93382f6d
AM
13911 }
13912 }
13913 else
13914 {
13915 switch (fixp->fx_size)
13916 {
13917 default:
b091f402
AM
13918 as_bad_where (fixp->fx_file, fixp->fx_line,
13919 _("can not do %d byte relocation"),
13920 fixp->fx_size);
93382f6d
AM
13921 code = BFD_RELOC_32;
13922 break;
13923 case 1: code = BFD_RELOC_8; break;
13924 case 2: code = BFD_RELOC_16; break;
13925 case 4: code = BFD_RELOC_32; break;
937149dd 13926#ifdef BFD64
3e73aa7c 13927 case 8: code = BFD_RELOC_64; break;
937149dd 13928#endif
93382f6d 13929 }
252b5132
RH
13930 }
13931 break;
13932 }
252b5132 13933
d182319b
JB
13934 if ((code == BFD_RELOC_32
13935 || code == BFD_RELOC_32_PCREL
13936 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
13937 && GOT_symbol
13938 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 13939 {
4fa24527 13940 if (!object_64bit)
d6ab8113
JB
13941 code = BFD_RELOC_386_GOTPC;
13942 else
13943 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 13944 }
7b81dfbb
AJ
13945 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
13946 && GOT_symbol
13947 && fixp->fx_addsy == GOT_symbol)
13948 {
13949 code = BFD_RELOC_X86_64_GOTPC64;
13950 }
252b5132 13951
add39d23
TS
13952 rel = XNEW (arelent);
13953 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 13954 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13955
13956 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 13957
3e73aa7c
JH
13958 if (!use_rela_relocations)
13959 {
13960 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
13961 vtable entry to be used in the relocation's section offset. */
13962 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13963 rel->address = fixp->fx_offset;
fbeb56a4
DK
13964#if defined (OBJ_COFF) && defined (TE_PE)
13965 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
13966 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
13967 else
13968#endif
c6682705 13969 rel->addend = 0;
3e73aa7c
JH
13970 }
13971 /* Use the rela in 64bit mode. */
252b5132 13972 else
3e73aa7c 13973 {
862be3fb
L
13974 if (disallow_64bit_reloc)
13975 switch (code)
13976 {
862be3fb
L
13977 case BFD_RELOC_X86_64_DTPOFF64:
13978 case BFD_RELOC_X86_64_TPOFF64:
13979 case BFD_RELOC_64_PCREL:
13980 case BFD_RELOC_X86_64_GOTOFF64:
13981 case BFD_RELOC_X86_64_GOT64:
13982 case BFD_RELOC_X86_64_GOTPCREL64:
13983 case BFD_RELOC_X86_64_GOTPC64:
13984 case BFD_RELOC_X86_64_GOTPLT64:
13985 case BFD_RELOC_X86_64_PLTOFF64:
13986 as_bad_where (fixp->fx_file, fixp->fx_line,
13987 _("cannot represent relocation type %s in x32 mode"),
13988 bfd_get_reloc_code_name (code));
13989 break;
13990 default:
13991 break;
13992 }
13993
062cd5e7
AS
13994 if (!fixp->fx_pcrel)
13995 rel->addend = fixp->fx_offset;
13996 else
13997 switch (code)
13998 {
13999 case BFD_RELOC_X86_64_PLT32:
14000 case BFD_RELOC_X86_64_GOT32:
14001 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14002 case BFD_RELOC_X86_64_GOTPCRELX:
14003 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14004 case BFD_RELOC_X86_64_TLSGD:
14005 case BFD_RELOC_X86_64_TLSLD:
14006 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14007 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14008 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14009 rel->addend = fixp->fx_offset - fixp->fx_size;
14010 break;
14011 default:
14012 rel->addend = (section->vma
14013 - fixp->fx_size
14014 + fixp->fx_addnumber
14015 + md_pcrel_from (fixp));
14016 break;
14017 }
3e73aa7c
JH
14018 }
14019
252b5132
RH
14020 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14021 if (rel->howto == NULL)
14022 {
14023 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14024 _("cannot represent relocation type %s"),
252b5132
RH
14025 bfd_get_reloc_code_name (code));
14026 /* Set howto to a garbage value so that we can keep going. */
14027 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14028 gas_assert (rel->howto != NULL);
252b5132
RH
14029 }
14030
14031 return rel;
14032}
14033
ee86248c 14034#include "tc-i386-intel.c"
54cfded0 14035
a60de03c
JB
14036void
14037tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14038{
a60de03c
JB
14039 int saved_naked_reg;
14040 char saved_register_dot;
54cfded0 14041
a60de03c
JB
14042 saved_naked_reg = allow_naked_reg;
14043 allow_naked_reg = 1;
14044 saved_register_dot = register_chars['.'];
14045 register_chars['.'] = '.';
14046 allow_pseudo_reg = 1;
14047 expression_and_evaluate (exp);
14048 allow_pseudo_reg = 0;
14049 register_chars['.'] = saved_register_dot;
14050 allow_naked_reg = saved_naked_reg;
14051
e96d56a1 14052 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14053 {
a60de03c
JB
14054 if ((addressT) exp->X_add_number < i386_regtab_size)
14055 {
14056 exp->X_op = O_constant;
14057 exp->X_add_number = i386_regtab[exp->X_add_number]
14058 .dw2_regnum[flag_code >> 1];
14059 }
14060 else
14061 exp->X_op = O_illegal;
54cfded0 14062 }
54cfded0
AM
14063}
14064
14065void
14066tc_x86_frame_initial_instructions (void)
14067{
a60de03c
JB
14068 static unsigned int sp_regno[2];
14069
14070 if (!sp_regno[flag_code >> 1])
14071 {
14072 char *saved_input = input_line_pointer;
14073 char sp[][4] = {"esp", "rsp"};
14074 expressionS exp;
a4447b93 14075
a60de03c
JB
14076 input_line_pointer = sp[flag_code >> 1];
14077 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14078 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14079 sp_regno[flag_code >> 1] = exp.X_add_number;
14080 input_line_pointer = saved_input;
14081 }
a4447b93 14082
61ff971f
L
14083 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14084 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14085}
d2b2c203 14086
d7921315
L
14087int
14088x86_dwarf2_addr_size (void)
14089{
14090#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14091 if (x86_elf_abi == X86_64_X32_ABI)
14092 return 4;
14093#endif
14094 return bfd_arch_bits_per_address (stdoutput) / 8;
14095}
14096
d2b2c203
DJ
14097int
14098i386_elf_section_type (const char *str, size_t len)
14099{
14100 if (flag_code == CODE_64BIT
14101 && len == sizeof ("unwind") - 1
14102 && strncmp (str, "unwind", 6) == 0)
14103 return SHT_X86_64_UNWIND;
14104
14105 return -1;
14106}
bb41ade5 14107
ad5fec3b
EB
14108#ifdef TE_SOLARIS
14109void
14110i386_solaris_fix_up_eh_frame (segT sec)
14111{
14112 if (flag_code == CODE_64BIT)
14113 elf_section_type (sec) = SHT_X86_64_UNWIND;
14114}
14115#endif
14116
bb41ade5
AM
14117#ifdef TE_PE
14118void
14119tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14120{
91d6fa6a 14121 expressionS exp;
bb41ade5 14122
91d6fa6a
NC
14123 exp.X_op = O_secrel;
14124 exp.X_add_symbol = symbol;
14125 exp.X_add_number = 0;
14126 emit_expr (&exp, size);
bb41ade5
AM
14127}
14128#endif
3b22753a
L
14129
14130#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14131/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14132
01e1a5bc 14133bfd_vma
6d4af3c2 14134x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14135{
14136 if (flag_code == CODE_64BIT)
14137 {
14138 if (letter == 'l')
14139 return SHF_X86_64_LARGE;
14140
8f3bae45 14141 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14142 }
3b22753a 14143 else
8f3bae45 14144 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14145 return -1;
14146}
14147
01e1a5bc 14148bfd_vma
3b22753a
L
14149x86_64_section_word (char *str, size_t len)
14150{
8620418b 14151 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14152 return SHF_X86_64_LARGE;
14153
14154 return -1;
14155}
14156
14157static void
14158handle_large_common (int small ATTRIBUTE_UNUSED)
14159{
14160 if (flag_code != CODE_64BIT)
14161 {
14162 s_comm_internal (0, elf_common_parse);
14163 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14164 }
14165 else
14166 {
14167 static segT lbss_section;
14168 asection *saved_com_section_ptr = elf_com_section_ptr;
14169 asection *saved_bss_section = bss_section;
14170
14171 if (lbss_section == NULL)
14172 {
14173 flagword applicable;
14174 segT seg = now_seg;
14175 subsegT subseg = now_subseg;
14176
14177 /* The .lbss section is for local .largecomm symbols. */
14178 lbss_section = subseg_new (".lbss", 0);
14179 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14180 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14181 seg_info (lbss_section)->bss = 1;
14182
14183 subseg_set (seg, subseg);
14184 }
14185
14186 elf_com_section_ptr = &_bfd_elf_large_com_section;
14187 bss_section = lbss_section;
14188
14189 s_comm_internal (0, elf_common_parse);
14190
14191 elf_com_section_ptr = saved_com_section_ptr;
14192 bss_section = saved_bss_section;
14193 }
14194}
14195#endif /* OBJ_ELF || OBJ_MAYBE_ELF */